From 1631c6ac8d7a7089c9aea08e83529cb2506f7545 Mon Sep 17 00:00:00 2001 From: Aayush Date: Thu, 2 Mar 2023 11:30:27 -0500 Subject: [PATCH 001/129] fix: EthAPI: Make newEthBlockFromFilecoinTipSet faster and correct --- node/impl/full/eth.go | 73 +++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index b1d03db4b..0bdf8c140 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -1776,6 +1776,8 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx return ethtypes.EthBlock{}, err } + bn := ethtypes.EthUint64(ts.Height()) + blkCid, err := ts.Key().Cid() if err != nil { return ethtypes.EthBlock{}, err @@ -1792,20 +1794,35 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx block := ethtypes.NewEthBlock(len(msgs) > 0) - // this seems to be a very expensive way to get gasUsed of the block. may need to find an efficient way to do it gasUsed := int64(0) - for txIdx, msg := range msgs { - msgLookup, err := sa.StateSearchMsg(ctx, types.EmptyTSK, msg.Cid(), api.LookbackNoLimit, false) - if err != nil || msgLookup == nil { - return ethtypes.EthBlock{}, nil - } - gasUsed += msgLookup.Receipt.GasUsed + compOutput, err := sa.StateCompute(ctx, ts.Height(), nil, ts.Key()) + if err != nil { + return ethtypes.EthBlock{}, xerrors.Errorf("failed to compute state: %w", err) + } - tx, err := newEthTxFromMessageLookup(ctx, msgLookup, txIdx, cs, sa) - if err != nil { - return ethtypes.EthBlock{}, nil + for txIdx, msg := range compOutput.Trace { + // skip system messages like reward application and cron + if msg.Msg.From == builtintypes.SystemActorAddr { + continue } + gasUsed += msg.MsgRct.GasUsed + smsgCid, err := getSignedMessage(ctx, cs, msg.MsgCid) + if err != nil { + return ethtypes.EthBlock{}, xerrors.Errorf("failed to get signed msg %s: %w", msg.MsgCid, err) + } + tx, err := newEthTxFromSignedMessage(ctx, smsgCid, sa) + if err != nil { + return ethtypes.EthBlock{}, xerrors.Errorf("failed to convert msg to ethTx: %w", err) + } + + ti := ethtypes.EthUint64(txIdx) + + tx.ChainID = ethtypes.EthUint64(build.Eip155ChainId) + tx.BlockHash = &blkHash + tx.BlockNumber = &bn + tx.TransactionIndex = &ti + if fullTxInfo { block.Transactions = append(block.Transactions, tx) } else { @@ -1814,7 +1831,7 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx } block.Hash = blkHash - block.Number = ethtypes.EthUint64(ts.Height()) + block.Number = bn block.ParentHash = parentBlkHash block.Timestamp = ethtypes.EthUint64(ts.Blocks()[0].Timestamp) block.BaseFeePerGas = ethtypes.EthBigInt{Int: ts.Blocks()[0].ParentBaseFee.Int} @@ -1995,20 +2012,9 @@ func newEthTxFromMessageLookup(ctx context.Context, msgLookup *api.MsgLookup, tx return ethtypes.EthTx{}, err } - smsg, err := cs.GetSignedMessage(ctx, msgLookup.Message) + smsg, err := getSignedMessage(ctx, cs, msgLookup.Message) if err != nil { - // We couldn't find the signed message, it might be a BLS message, so search for a regular message. - msg, err := cs.GetMessage(ctx, msgLookup.Message) - if err != nil { - return ethtypes.EthTx{}, err - } - smsg = &types.SignedMessage{ - Message: *msg, - Signature: crypto.Signature{ - Type: crypto.SigTypeBLS, - Data: nil, - }, - } + return ethtypes.EthTx{}, xerrors.Errorf("failed to get signed msg: %w", err) } tx, err := newEthTxFromSignedMessage(ctx, smsg, sa) @@ -2364,6 +2370,25 @@ func calculateRewardsAndGasUsed(rewardPercentiles []float64, txGasRewards gasRew return rewards, totalGasUsed } +func getSignedMessage(ctx context.Context, cs *store.ChainStore, msgCid cid.Cid) (*types.SignedMessage, error) { + smsg, err := cs.GetSignedMessage(ctx, msgCid) + if err != nil { + // We couldn't find the signed message, it might be a BLS message, so search for a regular message. + msg, err := cs.GetMessage(ctx, msgCid) + if err != nil { + return nil, xerrors.Errorf("failed to find msg %s: %w", msgCid, err) + } + smsg = &types.SignedMessage{ + Message: *msg, + Signature: crypto.Signature{ + Type: crypto.SigTypeBLS, + }, + } + } + + return smsg, nil +} + type gasRewardTuple struct { gas uint64 reward ethtypes.EthBigInt From a59e1d5220898eaff8ccf17137f7ea77525ce689 Mon Sep 17 00:00:00 2001 From: Aayush Date: Fri, 3 Mar 2023 16:42:57 -0500 Subject: [PATCH 002/129] fix: EthAPI: Correctly get parent hash --- itests/eth_api_test.go | 22 ++++++++++++++++++++++ node/impl/full/eth.go | 6 +----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/itests/eth_api_test.go b/itests/eth_api_test.go index 32949cc71..c24b32416 100644 --- a/itests/eth_api_test.go +++ b/itests/eth_api_test.go @@ -87,3 +87,25 @@ func TestFilecoinAddressToEthAddress(t *testing.T) { require.ErrorContains(t, err, ethtypes.ErrInvalidAddress.Error()) } + +func TestEthGetGenesis(t *testing.T) { + blockTime := 100 * time.Millisecond + client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) + ens.InterconnectAll().BeginMining(blockTime) + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + ethBlk, err := client.EVM().EthGetBlockByNumber(ctx, "0x0", true) + require.NoError(t, err) + + genesis, err := client.ChainGetGenesis(ctx) + require.NoError(t, err) + + genesisCid, err := genesis.Key().Cid() + require.NoError(t, err) + + genesisHash, err := ethtypes.EthHashFromCid(genesisCid) + require.NoError(t, err) + require.Equal(t, ethBlk.Hash, genesisHash) +} diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 0bdf8c140..907adf8cd 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -1763,11 +1763,7 @@ func (e *ethSubscription) stop() { } func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTxInfo bool, cs *store.ChainStore, sa StateAPI) (ethtypes.EthBlock, error) { - parent, err := cs.LoadTipSet(ctx, ts.Parents()) - if err != nil { - return ethtypes.EthBlock{}, err - } - parentKeyCid, err := parent.Key().Cid() + parentKeyCid, err := ts.Parents().Cid() if err != nil { return ethtypes.EthBlock{}, err } From c3e1d26ddfdae763690392af3050cf2c92b89ec0 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 6 Mar 2023 15:29:03 -0500 Subject: [PATCH 003/129] v1.20.1 prep --- CHANGELOG.md | 8 ++++++++ build/openrpc/full.json.gz | Bin 33286 -> 33286 bytes build/openrpc/gateway.json.gz | Bin 8479 -> 8480 bytes build/openrpc/miner.json.gz | Bin 16039 -> 16039 bytes build/openrpc/worker.json.gz | Bin 5220 -> 5220 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 9 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af84828d7..8fb999fb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Lotus changelog +# v1.20.1 / 2023-03-06 + +This an optional patch releases for node operators/API service providers that run ETH RPC service. + +## Bug fixes +- fix: EthAPI: Correctly get parent hash #10389 +- fix: EthAPI: Make newEthBlockFromFilecoinTipSet faster and correct #10380 + # 1.20.0 / 2023-02-28 This is a MANDATORY release of Lotus that delivers the [Hygge network upgrade](https://github.com/filecoin-project/community/discussions/74?sort=top#discussioncomment-4313888), introducing Filecoin network version 18. The centerpiece of the upgrade is the introduction of the [Filecoin Virtual Machine (FVM)’s Milestone 2.1](https://fvm.filecoin.io/), which will allow for EVM-compatible contracts to be deployed on the Filecoin network. This upgrade delivers user-programmablity to the Filecoin network for the first time! diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 2bdf6336a97539097065e1123a90bc7ede83b53e..16fe7b83776c9d828aa2ede1cf17758a94cc5897 100644 GIT binary patch literal 33286 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 a&x4cRKmYvr=l=o#0RR6BJLa-^uLc0Td?!W# literal 33286 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 a=fO$upMQS*^M3&V0RR7ufBYkPuLb}f>{tE( diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 4f93653ad67196c59614d05703739534c737f553..60bf3dd77bde07d331b381e82d05337fa280d76c 100644 GIT binary patch delta 6367 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 3106db222eb6b23d759a7ee11706e5a889c72a2f..b3f1e3c25f2b1e6b352f3e15e086937d8fd5f649 100644 GIT binary patch delta 21 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 diff --git a/build/version.go b/build/version.go index e5a1435f1..4541c99e7 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.20.0" +const BuildVersion = "1.20.1" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index d302a309a..82c9ba147 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.20.0 + 1.20.1 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 69d68dae5..1673ba528 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.20.0 + 1.20.1 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 65a9a31b1..e581d13cc 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.20.0 + 1.20.1 COMMANDS: daemon Start a lotus daemon process From 54e7fa8f705cdd08fcaa8fa5f565529e889fb839 Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 6 Mar 2023 15:38:46 -0500 Subject: [PATCH 004/129] fix: state: short-circuit genesis state computation --- chain/consensus/filcns/compute_state.go | 8 ++++++++ chain/stmgr/execute.go | 8 -------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 13dbc2069..ca03ee678 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -331,6 +331,14 @@ func (t *TipSetExecutor) ExecuteTipSet(ctx context.Context, } } + if ts.Height() == 0 { + // NB: This is here because the process that executes blocks requires that the + // block miner reference a valid miner in the state tree. Unless we create some + // magical genesis miner, this won't work properly, so we short circuit here + // This avoids the question of 'who gets paid the genesis block reward' + return blks[0].ParentStateRoot, blks[0].ParentMessageReceipts, nil + } + var parentEpoch abi.ChainEpoch pstate := blks[0].ParentStateRoot if blks[0].Height > 0 { diff --git a/chain/stmgr/execute.go b/chain/stmgr/execute.go index 60ee069d0..e67398299 100644 --- a/chain/stmgr/execute.go +++ b/chain/stmgr/execute.go @@ -52,14 +52,6 @@ func (sm *StateManager) TipSetState(ctx context.Context, ts *types.TipSet) (st c sm.stlk.Unlock() - if ts.Height() == 0 { - // NB: This is here because the process that executes blocks requires that the - // block miner reference a valid miner in the state tree. Unless we create some - // magical genesis miner, this won't work properly, so we short circuit here - // This avoids the question of 'who gets paid the genesis block reward' - return ts.Blocks()[0].ParentStateRoot, ts.Blocks()[0].ParentMessageReceipts, nil - } - st, rec, err = sm.tsExec.ExecuteTipSet(ctx, sm, ts, sm.tsExecMonitor, false) if err != nil { return cid.Undef, cid.Undef, err From 202cd41eeee753af67aae46eb8cadc72e34db236 Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 6 Mar 2023 16:02:23 -0500 Subject: [PATCH 005/129] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fb999fb0..5b13ba3f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ This an optional patch releases for node operators/API service providers that ru ## Bug fixes - fix: EthAPI: Correctly get parent hash #10389 - fix: EthAPI: Make newEthBlockFromFilecoinTipSet faster and correct #10380 +- fix: state: short-circuit genesis state computation # 1.20.0 / 2023-02-28 From 8b5bc45fcf0d932de39a40e13ff5c06b9f39f684 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 7 Mar 2023 12:49:07 -0500 Subject: [PATCH 006/129] fix: eth API: correct gateway restrictions, drop unimplemented methods --- api/api_gateway.go | 2 -- api/proxy_gen.go | 26 ------------------ build/openrpc/full.json.gz | Bin 33611 -> 33613 bytes build/openrpc/gateway.json.gz | Bin 8480 -> 8290 bytes build/openrpc/miner.json.gz | Bin 16043 -> 16043 bytes build/openrpc/worker.json.gz | Bin 5225 -> 5224 bytes gateway/proxy_eth.go | 48 ++++++---------------------------- node/impl/full/eth.go | 10 +++---- 8 files changed, 12 insertions(+), 74 deletions(-) diff --git a/api/api_gateway.go b/api/api_gateway.go index 2e877fb1a..f04a86a63 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -83,8 +83,6 @@ type Gateway interface { EthGetMessageCidByTransactionHash(ctx context.Context, txHash *ethtypes.EthHash) (*cid.Cid, error) EthGetTransactionCount(ctx context.Context, sender ethtypes.EthAddress, blkOpt string) (ethtypes.EthUint64, error) EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.EthHash) (*EthTxReceipt, error) - EthGetTransactionByBlockHashAndIndex(ctx context.Context, blkHash ethtypes.EthHash, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) - EthGetTransactionByBlockNumberAndIndex(ctx context.Context, blkNum ethtypes.EthUint64, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) EthGetCode(ctx context.Context, address ethtypes.EthAddress, blkOpt string) (ethtypes.EthBytes, error) EthGetStorageAt(ctx context.Context, address ethtypes.EthAddress, position ethtypes.EthBytes, blkParam string) (ethtypes.EthBytes, error) EthGetBalance(ctx context.Context, address ethtypes.EthAddress, blkParam string) (ethtypes.EthBigInt, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 17be4088d..9aa9a9c7b 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -692,10 +692,6 @@ type GatewayMethods struct { EthGetStorageAt func(p0 context.Context, p1 ethtypes.EthAddress, p2 ethtypes.EthBytes, p3 string) (ethtypes.EthBytes, error) `` - EthGetTransactionByBlockHashAndIndex func(p0 context.Context, p1 ethtypes.EthHash, p2 ethtypes.EthUint64) (ethtypes.EthTx, error) `` - - EthGetTransactionByBlockNumberAndIndex func(p0 context.Context, p1 ethtypes.EthUint64, p2 ethtypes.EthUint64) (ethtypes.EthTx, error) `` - EthGetTransactionByHash func(p0 context.Context, p1 *ethtypes.EthHash) (*ethtypes.EthTx, error) `` EthGetTransactionCount func(p0 context.Context, p1 ethtypes.EthAddress, p2 string) (ethtypes.EthUint64, error) `` @@ -4413,28 +4409,6 @@ func (s *GatewayStub) EthGetStorageAt(p0 context.Context, p1 ethtypes.EthAddress return *new(ethtypes.EthBytes), ErrNotSupported } -func (s *GatewayStruct) EthGetTransactionByBlockHashAndIndex(p0 context.Context, p1 ethtypes.EthHash, p2 ethtypes.EthUint64) (ethtypes.EthTx, error) { - if s.Internal.EthGetTransactionByBlockHashAndIndex == nil { - return *new(ethtypes.EthTx), ErrNotSupported - } - return s.Internal.EthGetTransactionByBlockHashAndIndex(p0, p1, p2) -} - -func (s *GatewayStub) EthGetTransactionByBlockHashAndIndex(p0 context.Context, p1 ethtypes.EthHash, p2 ethtypes.EthUint64) (ethtypes.EthTx, error) { - return *new(ethtypes.EthTx), ErrNotSupported -} - -func (s *GatewayStruct) EthGetTransactionByBlockNumberAndIndex(p0 context.Context, p1 ethtypes.EthUint64, p2 ethtypes.EthUint64) (ethtypes.EthTx, error) { - if s.Internal.EthGetTransactionByBlockNumberAndIndex == nil { - return *new(ethtypes.EthTx), ErrNotSupported - } - return s.Internal.EthGetTransactionByBlockNumberAndIndex(p0, p1, p2) -} - -func (s *GatewayStub) EthGetTransactionByBlockNumberAndIndex(p0 context.Context, p1 ethtypes.EthUint64, p2 ethtypes.EthUint64) (ethtypes.EthTx, error) { - return *new(ethtypes.EthTx), ErrNotSupported -} - func (s *GatewayStruct) EthGetTransactionByHash(p0 context.Context, p1 *ethtypes.EthHash) (*ethtypes.EthTx, error) { if s.Internal.EthGetTransactionByHash == nil { return nil, ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index bb1567be5e8c8f42cc72492e907c0c0c2cae9b06..718eed997827647ab6840d9f599a1d4f3ba04ae1 100644 GIT binary patch delta 32106 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 delta 32190 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 aX8iQfcznEh{C@!e0RR6S0Hvq(8v_93HY#2K delta 11512 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 eF0$O!n(;?t>9P<5ZT;e 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 BQ-J^g delta 3268 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 Cyj6n$ diff --git a/gateway/proxy_eth.go b/gateway/proxy_eth.go index 838a9ba3f..e1a261a7e 100644 --- a/gateway/proxy_eth.go +++ b/gateway/proxy_eth.go @@ -21,7 +21,7 @@ import ( ) func (gw *Node) Web3ClientVersion(ctx context.Context) (string, error) { - if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + if err := gw.limit(ctx, basicRateLimitTokens); err != nil { return "", err } @@ -34,7 +34,7 @@ func (gw *Node) EthAccounts(ctx context.Context) ([]ethtypes.EthAddress, error) } func (gw *Node) EthBlockNumber(ctx context.Context) (ethtypes.EthUint64, error) { - if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + if err := gw.limit(ctx, chainRateLimitTokens); err != nil { return 0, err } @@ -109,11 +109,7 @@ func (gw *Node) checkBlkParam(ctx context.Context, blkParam string) error { } func (gw *Node) EthGetBlockTransactionCountByHash(ctx context.Context, blkHash ethtypes.EthHash) (ethtypes.EthUint64, error) { - if err := gw.limit(ctx, stateRateLimitTokens); err != nil { - return 0, err - } - - if err := gw.checkBlkHash(ctx, blkHash); err != nil { + if err := gw.limit(ctx, chainRateLimitTokens); err != nil { return 0, err } @@ -161,7 +157,7 @@ func (gw *Node) EthGetTransactionHashByCid(ctx context.Context, cid cid.Cid) (*e } func (gw *Node) EthGetMessageCidByTransactionHash(ctx context.Context, txHash *ethtypes.EthHash) (*cid.Cid, error) { - if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + if err := gw.limit(ctx, chainRateLimitTokens); err != nil { return nil, err } @@ -188,34 +184,6 @@ func (gw *Node) EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.Et return gw.target.EthGetTransactionReceipt(ctx, txHash) } -func (gw *Node) EthGetTransactionByBlockHashAndIndex(ctx context.Context, blkHash ethtypes.EthHash, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) { - if err := gw.limit(ctx, stateRateLimitTokens); err != nil { - return ethtypes.EthTx{}, err - } - - if err := gw.checkBlkHash(ctx, blkHash); err != nil { - return ethtypes.EthTx{}, err - } - - return gw.target.EthGetTransactionByBlockHashAndIndex(ctx, blkHash, txIndex) -} - -func (gw *Node) EthGetTransactionByBlockNumberAndIndex(ctx context.Context, blkNum ethtypes.EthUint64, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) { - if err := gw.limit(ctx, stateRateLimitTokens); err != nil { - return ethtypes.EthTx{}, err - } - - head, err := gw.target.ChainHead(ctx) - if err != nil { - return ethtypes.EthTx{}, err - } - if err := gw.checkTipsetHeight(head, abi.ChainEpoch(blkNum)); err != nil { - return ethtypes.EthTx{}, err - } - - return gw.target.EthGetTransactionByBlockNumberAndIndex(ctx, blkNum, txIndex) -} - func (gw *Node) EthGetCode(ctx context.Context, address ethtypes.EthAddress, blkOpt string) (ethtypes.EthBytes, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return nil, err @@ -253,7 +221,7 @@ func (gw *Node) EthGetBalance(ctx context.Context, address ethtypes.EthAddress, } func (gw *Node) EthChainId(ctx context.Context) (ethtypes.EthUint64, error) { - if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + if err := gw.limit(ctx, basicRateLimitTokens); err != nil { return 0, err } @@ -269,7 +237,7 @@ func (gw *Node) NetVersion(ctx context.Context) (string, error) { } func (gw *Node) NetListening(ctx context.Context) (bool, error) { - if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + if err := gw.limit(ctx, basicRateLimitTokens); err != nil { return false, err } @@ -285,7 +253,7 @@ func (gw *Node) EthProtocolVersion(ctx context.Context) (ethtypes.EthUint64, err } func (gw *Node) EthGasPrice(ctx context.Context) (ethtypes.EthBigInt, error) { - if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + if err := gw.limit(ctx, chainRateLimitTokens); err != nil { return ethtypes.EthBigInt(big.Zero()), err } @@ -316,7 +284,7 @@ func (gw *Node) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (ethtype } func (gw *Node) EthMaxPriorityFeePerGas(ctx context.Context) (ethtypes.EthBigInt, error) { - if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + if err := gw.limit(ctx, chainRateLimitTokens); err != nil { return ethtypes.EthBigInt(big.Zero()), err } diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 907adf8cd..fb4cfe6cb 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -54,8 +54,6 @@ type EthModuleAPI interface { EthGetTransactionHashByCid(ctx context.Context, cid cid.Cid) (*ethtypes.EthHash, error) EthGetTransactionCount(ctx context.Context, sender ethtypes.EthAddress, blkOpt string) (ethtypes.EthUint64, error) EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.EthHash) (*api.EthTxReceipt, error) - EthGetTransactionByBlockHashAndIndex(ctx context.Context, blkHash ethtypes.EthHash, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) - EthGetTransactionByBlockNumberAndIndex(ctx context.Context, blkNum ethtypes.EthUint64, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) EthGetCode(ctx context.Context, address ethtypes.EthAddress, blkOpt string) (ethtypes.EthBytes, error) EthGetStorageAt(ctx context.Context, address ethtypes.EthAddress, position ethtypes.EthBytes, blkParam string) (ethtypes.EthBytes, error) EthGetBalance(ctx context.Context, address ethtypes.EthAddress, blkParam string) (ethtypes.EthBigInt, error) @@ -335,13 +333,13 @@ func (a *EthModule) EthGetMessageCidByTransactionHash(ctx context.Context, txHas c = txHash.ToCid() } - _, err = a.StateAPI.Chain.GetSignedMessage(ctx, c) + _, err = a.Chain.GetSignedMessage(ctx, c) if err == nil { // This is an Eth Tx, Secp message, Or BLS message in the mpool return &c, nil } - _, err = a.StateAPI.Chain.GetMessage(ctx, c) + _, err = a.Chain.GetMessage(ctx, c) if err == nil { // This is a BLS message return &c, nil @@ -441,11 +439,11 @@ func (a *EthModule) EthGetTransactionReceipt(ctx context.Context, txHash ethtype return &receipt, nil } -func (a *EthModule) EthGetTransactionByBlockHashAndIndex(ctx context.Context, blkHash ethtypes.EthHash, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) { +func (a *EthAPI) EthGetTransactionByBlockHashAndIndex(ctx context.Context, blkHash ethtypes.EthHash, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) { return ethtypes.EthTx{}, nil } -func (a *EthModule) EthGetTransactionByBlockNumberAndIndex(ctx context.Context, blkNum ethtypes.EthUint64, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) { +func (a *EthAPI) EthGetTransactionByBlockNumberAndIndex(ctx context.Context, blkNum ethtypes.EthUint64, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) { return ethtypes.EthTx{}, nil } From 16dad6342c32431543840ab24b5672f3f95fc553 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 2 Mar 2023 18:37:13 -0800 Subject: [PATCH 007/129] feat(deps): update to go-data-transfer v2, still wip --- api/api_full.go | 2 +- api/api_storage.go | 2 +- api/docgen/docgen.go | 2 +- api/mocks/mock_full.go | 2 +- api/proxy_gen.go | 2 +- api/types.go | 18 +- api/v0api/full.go | 2 +- api/v0api/proxy_gen.go | 2 +- api/v0api/v0mocks/mock_full.go | 2 +- cli/client.go | 2 +- cmd/lotus-miner/market.go | 2 +- cmd/lotus-miner/retrieval-deals.go | 5 +- extern/filecoin-ffi | 2 +- go.mod | 90 +++++----- go.sum | 274 +++++++++++++---------------- itests/deals_concurrent_test.go | 2 +- markets/loggers/loggers.go | 2 +- node/impl/client/client.go | 6 +- node/impl/net/net.go | 8 +- node/impl/storminer.go | 4 +- node/modules/client.go | 18 +- node/modules/dtypes/storage.go | 4 +- node/modules/lp2p/rcmgr.go | 56 +++--- node/modules/services.go | 3 +- node/modules/storageminer.go | 6 +- 25 files changed, 239 insertions(+), 279 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index f0009e4a1..37e197ab3 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-jsonrpc" diff --git a/api/api_storage.go b/api/api_storage.go index 0c00b9b93..fab047a14 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/piecestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 3793f2fc2..8e958aed9 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -27,7 +27,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/filestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-jsonrpc/auth" diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 7567c7171..fc7ff5588 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -21,7 +21,7 @@ import ( address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket" jsonrpc "github.com/filecoin-project/go-jsonrpc" auth "github.com/filecoin-project/go-jsonrpc/auth" diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 17be4088d..9b0c8c80c 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -18,7 +18,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/piecestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" diff --git a/api/types.go b/api/types.go index 63ec2b29b..a8cd2bfa7 100644 --- a/api/types.go +++ b/api/types.go @@ -8,13 +8,15 @@ import ( "github.com/google/uuid" "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" + "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/codec/dagjson" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin/v9/miner" @@ -110,16 +112,12 @@ func NewDataTransferChannel(hostID peer.ID, channelState datatransfer.ChannelSta IsSender: channelState.Sender() == hostID, Message: channelState.Message(), } - stringer, ok := channelState.Voucher().(fmt.Stringer) - if ok { - channel.Voucher = stringer.String() + voucher := channelState.Voucher() + voucherJSON, err := ipld.Encode(voucher.Voucher, dagjson.Encode) + if err != nil { + channel.Voucher = fmt.Errorf("Voucher Serialization: %w", err).Error() } else { - voucherJSON, err := json.Marshal(channelState.Voucher()) - if err != nil { - channel.Voucher = fmt.Errorf("Voucher Serialization: %w", err).Error() - } else { - channel.Voucher = string(voucherJSON) - } + channel.Voucher = string(voucherJSON) } if channel.IsSender { channel.IsInitiator = !channelState.IsPull() diff --git a/api/v0api/full.go b/api/v0api/full.go index 490cd73c8..86a4ce47a 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -10,7 +10,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/abi" diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 5fa0d949c..bdd7af6cb 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/abi" diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index 619f19d35..a4adfc944 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -20,7 +20,7 @@ import ( address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket" storagemarket "github.com/filecoin-project/go-fil-markets/storagemarket" auth "github.com/filecoin-project/go-jsonrpc/auth" diff --git a/cli/client.go b/cli/client.go index 3e917e8de..88f7ed208 100644 --- a/cli/client.go +++ b/cli/client.go @@ -31,7 +31,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/abi" diff --git a/cmd/lotus-miner/market.go b/cmd/lotus-miner/market.go index ce0d6890c..29eb662a7 100644 --- a/cmd/lotus-miner/market.go +++ b/cmd/lotus-miner/market.go @@ -24,7 +24,7 @@ import ( "golang.org/x/xerrors" cborutil "github.com/filecoin-project/go-cbor-util" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/abi" diff --git a/cmd/lotus-miner/retrieval-deals.go b/cmd/lotus-miner/retrieval-deals.go index 9fa943f4f..abf2b37d3 100644 --- a/cmd/lotus-miner/retrieval-deals.go +++ b/cmd/lotus-miner/retrieval-deals.go @@ -145,19 +145,18 @@ var retrievalDealsListCmd = &cli.Command{ w := tabwriter.NewWriter(os.Stdout, 2, 4, 2, ' ', 0) - _, _ = fmt.Fprintf(w, "Receiver\tDealID\tPayload\tState\tPricePerByte\tBytesSent\tMessage\n") + _, _ = fmt.Fprintf(w, "Receiver\tDealID\tPayload\tState\tPricePerByte\tMessage\n") for _, deal := range deals { payloadCid := deal.PayloadCID.String() _, _ = fmt.Fprintf(w, - "%s\t%d\t%s\t%s\t%s\t%d\t%s\n", + "%s\t%d\t%s\t%s\t%s\t%s\n", deal.Receiver.String(), deal.ID, "..."+payloadCid[len(payloadCid)-8:], retrievalmarket.DealStatuses[deal.Status], deal.PricePerByte.String(), - deal.TotalSent, deal.Message, ) } diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 88dc4c4ce..7efaa7b47 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 88dc4c4ceb322337818b6508c8e9c23948f36cb1 +Subproject commit 7efaa7b47fe9d4bdb4ba0b2a0fafa4e573864ee5 diff --git a/go.mod b/go.mod index ac5d5ccdd..1c85bb8d5 100644 --- a/go.mod +++ b/go.mod @@ -14,9 +14,9 @@ require ( github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d 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/chzyer/readline v1.5.0 github.com/containerd/cgroups v1.0.4 - github.com/coreos/go-systemd/v22 v22.4.0 + github.com/coreos/go-systemd/v22 v22.5.0 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e github.com/dgraph-io/badger/v2 v2.2007.3 github.com/docker/go-units v0.5.0 @@ -36,16 +36,16 @@ 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.15.2 + github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc4 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.26.0 + github.com/filecoin-project/go-fil-markets v1.27.0-rc1 github.com/filecoin-project/go-jsonrpc v0.2.2 github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 github.com/filecoin-project/go-state-types v0.10.0 - github.com/filecoin-project/go-statemachine v1.0.2 + github.com/filecoin-project/go-statemachine v1.0.3 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 github.com/filecoin-project/pubsub v1.0.0 @@ -84,7 +84,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.7 - github.com/ipfs/go-graphsync v0.13.2 + github.com/ipfs/go-graphsync v0.14.0 github.com/ipfs/go-ipfs-blockstore v1.2.0 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 @@ -102,8 +102,8 @@ require ( github.com/ipfs/go-merkledag v0.8.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 - github.com/ipfs/go-unixfs v0.4.0 - github.com/ipfs/go-unixfsnode v1.4.0 + github.com/ipfs/go-unixfs v0.4.3 + github.com/ipfs/go-unixfsnode v1.5.2 github.com/ipfs/interface-go-ipfs-core v0.7.0 github.com/ipld/go-car v0.4.0 github.com/ipld/go-car/v2 v2.5.0 @@ -114,7 +114,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/libp2p/go-libp2p v0.23.4 + github.com/libp2p/go-libp2p v0.25.0 github.com/libp2p/go-libp2p-consensus v0.0.1 github.com/libp2p/go-libp2p-gorpc v0.4.0 github.com/libp2p/go-libp2p-kad-dht v0.18.0 @@ -123,7 +123,7 @@ require ( github.com/libp2p/go-libp2p-record v0.2.0 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-maddr-filter v0.1.0 - github.com/libp2p/go-msgio v0.2.0 + github.com/libp2p/go-msgio v0.3.0 github.com/mattn/go-isatty v0.0.16 github.com/mattn/go-sqlite3 v1.14.16 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 @@ -133,10 +133,10 @@ require ( github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.1.1 github.com/multiformats/go-multihash v0.2.1 - github.com/multiformats/go-varint v0.0.6 + github.com/multiformats/go-varint v0.0.7 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e - github.com/prometheus/client_golang v1.13.0 + github.com/prometheus/client_golang v1.14.0 github.com/raulk/clock v1.1.0 github.com/raulk/go-watchdog v1.3.0 github.com/stretchr/testify v1.8.1 @@ -154,16 +154,16 @@ require ( go.opentelemetry.io/otel/exporters/jaeger v1.2.0 go.opentelemetry.io/otel/sdk v1.11.1 go.uber.org/atomic v1.10.0 - go.uber.org/fx v1.15.0 + go.uber.org/fx v1.18.2 go.uber.org/multierr v1.8.0 - go.uber.org/zap v1.23.0 - golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 - golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b - golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5 - golang.org/x/sync v0.0.0-20220907140024-f12130a52804 - golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 + go.uber.org/zap v1.24.0 + golang.org/x/crypto v0.4.0 + golang.org/x/exp v0.0.0-20221205204356-47842c84f3db + golang.org/x/net v0.4.0 + golang.org/x/sync v0.1.0 + golang.org/x/sys v0.3.0 golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 - golang.org/x/tools v0.1.12 + golang.org/x/tools v0.3.0 golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 gopkg.in/cheggaaa/pb.v1 v1.0.28 gotest.tools v2.2.0+incompatible @@ -174,7 +174,6 @@ require ( github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/StackExchange/wmi v1.2.1 // indirect - github.com/Stebalien/go-bitfield v0.0.1 // indirect github.com/akavel/rsrc v0.8.0 // indirect github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a // indirect github.com/armon/go-metrics v0.3.9 // indirect @@ -183,7 +182,7 @@ require ( github.com/bep/debounce v1.2.1 // indirect github.com/boltdb/bolt v1.3.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cilium/ebpf v0.4.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect @@ -200,13 +199,13 @@ require ( github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 // indirect github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 // indirect github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837 // indirect + github.com/filecoin-project/go-data-transfer v1.15.2 // indirect github.com/filecoin-project/go-ds-versioning v0.1.2 // indirect github.com/filecoin-project/go-hamt-ipld v0.1.5 // indirect github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 // indirect github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 // indirect github.com/flynn/noise v1.0.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/gdamore/encoding v1.0.0 // indirect github.com/go-kit/log v0.2.0 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect @@ -225,14 +224,16 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gopacket v1.1.19 // indirect - github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 // indirect + github.com/google/pprof v0.0.0-20221203041831-ce31453925ec // indirect + github.com/hannahhoward/cbor-gen-for v0.0.0-20230214144701-5d17c9d5243c // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-hclog v0.16.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.1 // indirect github.com/huin/goupnp v1.0.3 // indirect github.com/iancoleman/orderedmap v0.1.0 // indirect - github.com/ipfs/go-bitfield v1.0.0 // indirect + github.com/ipfs/go-bitfield v1.1.0 // indirect github.com/ipfs/go-block-format v0.1.1 // indirect github.com/ipfs/go-filestore v1.2.0 // indirect github.com/ipfs/go-ipfs-cmds v0.7.0 // indirect @@ -259,8 +260,8 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 // indirect - github.com/klauspost/compress v1.15.10 // indirect - github.com/klauspost/cpuid/v2 v2.1.1 // indirect + github.com/klauspost/compress v1.15.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.1 // indirect github.com/koron/go-ssdp v0.0.3 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect @@ -273,50 +274,49 @@ require ( github.com/libp2p/go-libp2p-peerstore v0.8.0 // indirect github.com/libp2p/go-libp2p-tls v0.5.0 // indirect github.com/libp2p/go-nat v0.1.0 // indirect - github.com/libp2p/go-netroute v0.2.0 // indirect - github.com/libp2p/go-openssl v0.1.0 // indirect + github.com/libp2p/go-netroute v0.2.1 // indirect github.com/libp2p/go-reuseport v0.2.0 // indirect github.com/libp2p/go-yamux/v4 v4.0.0 // indirect - github.com/lucas-clemente/quic-go v0.29.1 // indirect github.com/lucasb-eyer/go-colorful v1.0.3 // indirect github.com/magefile/mage v1.9.0 // indirect github.com/mailru/easyjson v0.7.6 // indirect - github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect - github.com/marten-seemann/qtls-go1-19 v0.1.0 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.9 // indirect - github.com/mattn/go-pointer v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.10 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/miekg/dns v1.1.50 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect - github.com/multiformats/go-base36 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.2.0 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multicodec v0.8.0 // indirect - github.com/multiformats/go-multistream v0.3.3 // indirect + github.com/multiformats/go-multistream v0.4.0 // indirect github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c // indirect github.com/nkovacs/streamquote v1.0.0 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/ginkgo/v2 v2.5.1 // indirect github.com/opencontainers/runtime-spec v1.0.2 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect github.com/prometheus/statsd_exporter v0.21.0 // indirect + github.com/quic-go/qpack v0.4.0 // indirect + github.com/quic-go/qtls-go1-18 v0.2.0 // indirect + github.com/quic-go/qtls-go1-19 v0.2.0 // indirect + github.com/quic-go/qtls-go1-20 v0.1.0 // indirect + github.com/quic-go/quic-go v0.32.0 // indirect + github.com/quic-go/webtransport-go v0.5.1 // indirect github.com/rivo/uniseg v0.1.0 // indirect github.com/rs/cors v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v2.18.12+incompatible // indirect github.com/sirupsen/logrus v1.8.1 // indirect - github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/twmb/murmur3 v1.1.6 // indirect github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect @@ -335,19 +335,19 @@ require ( go.opentelemetry.io/otel/metric v0.33.0 // indirect go.opentelemetry.io/otel/sdk/metric v0.33.0 // indirect go.opentelemetry.io/otel/trace v1.11.1 // indirect - go.uber.org/dig v1.12.0 // indirect + go.uber.org/dig v1.15.0 // indirect go4.org v0.0.0-20200411211856-f5505b9728dd // indirect - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/mod v0.7.0 // indirect + golang.org/x/term v0.3.0 // indirect + golang.org/x/text v0.5.0 // indirect google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 // indirect google.golang.org/grpc v1.45.0 // indirect google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect lukechampine.com/blake3 v1.1.7 // indirect + nhooyr.io/websocket v1.8.7 // indirect ) replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi diff --git a/go.sum b/go.sum index 474b45ab5..a6dd0e654 100644 --- a/go.sum +++ b/go.sum @@ -77,7 +77,6 @@ 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 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= 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= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= @@ -158,15 +157,19 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA 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= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= +github.com/chzyer/logex v1.2.0 h1:+eqR0HfOetur4tgnC8ftU5imRnhi4te+BadWS95c5AM= +github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= 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/readline v1.5.0 h1:lSwwFrbNviGePhkewF1az4oLmcwqCZijQ2/Wi3BGHAI= +github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v0.0.0-20210722231415-061457976a23 h1:dZ0/VyGgQdVGAss6Ju0dt5P0QltE0SFY5Woh6hbIfiQ= +github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0 h1:QlHdikaxALkqWasW8hAC1mfR0jdmvbfaBdBPFmRSglA= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= @@ -185,7 +188,6 @@ github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:z github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -198,9 +200,8 @@ 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/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 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/go-systemd/v22 v22.4.0 h1:y9YHcjnjynCd/DVbg5j9L/33jQM3MxJlbj/zWskzfGU= -github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/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/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= @@ -324,6 +325,8 @@ github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2 github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.15.2 h1:PzqsFr2Q/onMGKrGh7TtRT0dKsJcVJrioJJnjnKmxlk= github.com/filecoin-project/go-data-transfer v1.15.2/go.mod h1:qXOJ3IF5dEJQHykXXTwcaRxu17bXAxr+LglXzkL6bZQ= +github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc4 h1:Y5RMvFT4OthsAhDx7xKfkJ5QdiWq9Ox7N46Mi0PF0PE= +github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc4/go.mod h1:1WDoUgWYB2KvogfPTdDmoyBTa9cb9+oGwqKCCipnJeY= github.com/filecoin-project/go-ds-versioning v0.1.2 h1:to4pTadv3IeV1wvgbCbN6Vqd+fu+7tveXgv/rCEZy6w= github.com/filecoin-project/go-ds-versioning v0.1.2/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -331,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.26.0 h1:uNtt1UAxX2C/Q8tlWD00oF2Zma3CVGxhZmBc2ljYhkk= -github.com/filecoin-project/go-fil-markets v1.26.0/go.mod h1:eOIYHfPwyqc64O1HiapvcelfnrTfU7gLQgBf55IYleQ= +github.com/filecoin-project/go-fil-markets v1.27.0-rc1 h1:SYXKFONg6IaQlmXEqAEaPtb/xX57dZYMkx3LwjsLr7w= +github.com/filecoin-project/go-fil-markets v1.27.0-rc1/go.mod h1:JkW4rU0+LqfO/DLi/wyR58AqxaUdnlSofWeu8un2XLU= 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= @@ -359,8 +362,8 @@ github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd github.com/filecoin-project/go-state-types v0.10.0 h1:vsSThZIaPmOxNGG59+8D/HnlWRtlbdOjduH6ye+v8f0= github.com/filecoin-project/go-state-types v0.10.0/go.mod h1:aLIas+W8BWAfpLWEPUOGMPBdhcVwoCG4pIQSQk26024= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= -github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= -github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= +github.com/filecoin-project/go-statemachine v1.0.3 h1:N07o6alys+V1tNoSTi4WuuoeNC4erS/6jE74+NsgQuk= +github.com/filecoin-project/go-statemachine v1.0.3/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.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= @@ -398,14 +401,10 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= -github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/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= @@ -413,6 +412,10 @@ 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/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= 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= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= @@ -456,6 +459,13 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/swag v0.19.11 h1:RFTu/dlFySpyVvJDfp/7674JY4SDglYWKztbiIGFpmc= github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-sql-driver/mysql v1.4.0/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= @@ -465,6 +475,12 @@ github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSC github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= github.com/gobuffalo/packr/v2 v2.6.0/go.mod h1:sgEE1xNZ6G0FNN5xn9pevVu4nywaxHvgup67xisti08= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -540,8 +556,6 @@ 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/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-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= @@ -559,6 +573,8 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20221203041831-ce31453925ec h1:fR20TYVVwhK4O7r7y+McjRYyaTH6/vjwJOajE+XhlzM= +github.com/google/pprof v0.0.0-20221203041831-ce31453925ec/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -605,8 +621,8 @@ github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfm 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/cbor-gen-for v0.0.0-20230214144701-5d17c9d5243c h1:iiD+p+U0M6n/FsO6XIZuOgobnNa48FxtyYFfWwLttUQ= +github.com/hannahhoward/cbor-gen-for v0.0.0-20230214144701-5d17c9d5243c/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= @@ -642,6 +658,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 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/golang-lru/v2 v2.0.1 h1:5pv5N1lT1fjLg2VQ5KWc7kmucp2x/kvFOnxuVTqZ6x4= +github.com/hashicorp/golang-lru/v2 v2.0.1/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= @@ -676,8 +694,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-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= +github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= 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= @@ -746,8 +764,8 @@ github.com/ipfs/go-filestore v1.2.0/go.mod h1:HLJrCxRXquTeEEpde4lTLMaE/MYJZD7WHL github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= -github.com/ipfs/go-graphsync v0.13.2 h1:+7IjTrdg3+3iwtPXSkLoxvhaByS3+3b9NStMAowFqkw= -github.com/ipfs/go-graphsync v0.13.2/go.mod h1:TO1Y65spARny/t37hkid5xCpQJ6vR7A7VFTEUb0Z6eA= +github.com/ipfs/go-graphsync v0.14.0 h1:f5KYkc8GpwwE1BrjBOWxIkRivXIw7fVqGZlnILpvbSc= +github.com/ipfs/go-graphsync v0.14.0/go.mod h1:1LDVVnNHjit8ddJOtw3Jq9epP792xWFXXL3dJWIBIkM= 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= @@ -838,7 +856,6 @@ github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= -github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= @@ -859,17 +876,15 @@ github.com/ipfs/go-path v0.3.0/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1X 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/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= 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.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= -github.com/ipfs/go-unixfs v0.4.0 h1:qSyyxfB/OiDdWHYiSbyaqKC7zfSE/TFL0QdwkRjBm20= -github.com/ipfs/go-unixfs v0.4.0/go.mod h1:I7Nqtm06HgOOd+setAoCU6rf/HgVFHE+peeNuOv/5+g= +github.com/ipfs/go-unixfs v0.4.3 h1:EdDc1sNZNFDUlo4UrVAvvAofVI5EwTnKu8Nv8mgXkWQ= +github.com/ipfs/go-unixfs v0.4.3/go.mod h1:TSG7G1UuT+l4pNj91raXAPkX0BhJi3jST1FDTfQ5QyM= github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= -github.com/ipfs/go-unixfsnode v1.4.0 h1:9BUxHBXrbNi8mWHc6j+5C580WJqtVw9uoeEKn4tMhwA= -github.com/ipfs/go-unixfsnode v1.4.0/go.mod h1:qc7YFFZ8tABc58p62HnIYbUMwj9chhUuFWmxSokfePo= +github.com/ipfs/go-unixfsnode v1.5.2 h1:CvsiTt58W2uR5dD8bqQv+aAY0c1qolmXmSyNbPHYiew= +github.com/ipfs/go-unixfsnode v1.5.2/go.mod h1:NlOebRwYx8lMCNMdhAhEspYPBD3obp7TE0LvBqHY+ks= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= github.com/ipfs/go-verifcid v0.0.2 h1:XPnUv0XmdH+ZIhLGKg6U2vaPaRDXb9urMyNVCE7uvTs= github.com/ipfs/go-verifcid v0.0.2/go.mod h1:40cD9x1y4OWnFXbLNJYRe7MpNvWlMn3LZAG5Wb4xnPU= @@ -886,7 +901,6 @@ github.com/ipld/go-car/v2 v2.5.0 h1:S9h7A6qBAJ+B1M1jIKtau+HPDe30UbM71vsyBzwvRIE= github.com/ipld/go-car/v2 v2.5.0/go.mod h1:jKjGOqoCj5zn6KjnabD6JbnCsMntqU2hLiU6baZVO3E= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= -github.com/ipld/go-codec-dagpb v1.3.1/go.mod h1:ErNNglIi5KMur/MfFE/svtgQthzVvf+43MrzLbpcIZY= github.com/ipld/go-codec-dagpb v1.5.0 h1:RspDRdsJpLfgCI0ONhTAnbHdySGD4t+LHSPK4X1+R0k= github.com/ipld/go-codec-dagpb v1.5.0/go.mod h1:0yRIutEFD8o1DGVqw4RSHh+BUTlJA9XWldxaaWR/o4g= github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0 h1:QAI/Ridj0+foHD6epbxmB4ugxz9B4vmNdYSmQLGa05E= @@ -897,8 +911,6 @@ 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.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= -github.com/ipld/go-ipld-prime v0.16.0/go.mod h1:axSCuOCBPqrH+gvXr2w9uAOulJqBPhHPT2PjoiiU1qA= -github.com/ipld/go-ipld-prime v0.17.0/go.mod h1:aYcKm5TIvGfY8P3QBKz/2gKcLxzJ1zDaD+o0bOowhgs= github.com/ipld/go-ipld-prime v0.20.0 h1:Ud3VwE9ClxpO2LkCYP7vWPc0Fo+dYdYzgxUJZ3uRG4g= github.com/ipld/go-ipld-prime v0.20.0/go.mod h1:PzqZ/ZR981eKbgdr3y2DJYeD/8bgMawdGVlJDE8kK+M= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= @@ -954,6 +966,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 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 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= @@ -976,17 +989,15 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.10 h1:Ai8UzuomSCDw90e1qNMtb15msBXsNpH6gzkkENQNcJo= -github.com/klauspost/compress v1.15.10/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM= +github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/klauspost/cpuid/v2 v2.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0= -github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.1 h1:U33DW0aiEj633gHYw3LoDNfkDiYnE5Q8M/TKJn2f2jI= +github.com/klauspost/cpuid/v2 v2.2.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/koalacxr/quantile v0.0.1 h1:wAW+SQ286Erny9wOjVww96t8ws+x5Zj6AKHDULUK+o0= github.com/koalacxr/quantile v0.0.1/go.mod h1:bGN/mCZLZ4lrSDHRQ6Lglj9chowGux8sGUIND+DQeD0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1009,6 +1020,8 @@ 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/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= 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/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= @@ -1042,9 +1055,8 @@ 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.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= -github.com/libp2p/go-libp2p v0.19.4/go.mod h1:MIt8y481VDhUe4ErWi1a4bvt/CjjFfOq6kZTothWIXY= -github.com/libp2p/go-libp2p v0.23.4 h1:hWi9XHSOVFR1oDWRk7rigfyA4XNMuYL20INNybP9LP8= -github.com/libp2p/go-libp2p v0.23.4/go.mod h1:s9DEa5NLR4g+LZS+md5uGU4emjMWFiqkZr6hBTY8UxI= +github.com/libp2p/go-libp2p v0.25.0 h1:ND6Hc6ZYCzC8S++C4mOD7LdPnLXRkNbr12/8FXgUfIo= +github.com/libp2p/go-libp2p v0.25.0/go.mod h1:vXHmFpcfl+xIGN4qW58Bw3a0/SKGAesr5/T4IuJHE3o= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= @@ -1067,7 +1079,6 @@ github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFk github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-connmgr v0.4.0 h1:q/KZUS1iMDIQckMZarMYwhQisJqiFPHAVC1c4DR3hDE= @@ -1105,8 +1116,6 @@ github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQR github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= -github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs= github.com/libp2p/go-libp2p-core v0.20.1 h1:fQz4BJyIFmSZAiTbKV8qoYhEH5Dtv/cVhZbG3Ib/+Cw= github.com/libp2p/go-libp2p-core v0.20.1/go.mod h1:6zR8H7CvQWgYLsbG4on6oLNSGcyKaYFSEYyDt51+bIY= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= @@ -1143,7 +1152,6 @@ github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= -github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= github.com/libp2p/go-libp2p-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= @@ -1155,7 +1163,6 @@ 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.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= -github.com/libp2p/go-libp2p-noise v0.4.0/go.mod h1:BzzY5pyzCYSyJbQy9oD8z5oP2idsafjt4/X42h9DjZU= github.com/libp2p/go-libp2p-noise v0.5.0 h1:gwJZ/3iH3MRnBrLIyr/YLdCOnmqfJMptlsFFUIc3j0Y= github.com/libp2p/go-libp2p-noise v0.5.0/go.mod h1:CYYpJ+T4pox1d1J/hhUVxuMf6b2s3c41hFUgS8/yFQw= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= @@ -1183,8 +1190,6 @@ github.com/libp2p/go-libp2p-pubsub v0.8.2/go.mod h1:e4kT+DYjzPUYGZeWk4I+oxCSYTXi github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= github.com/libp2p/go-libp2p-quic-transport v0.15.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.17.0/go.mod h1:x4pw61P3/GRCcSLypcQJE/Q2+E9f4X+5aRcZLXf20LM= github.com/libp2p/go-libp2p-raft v0.1.8 h1:Fq0aWHbbhi6WJXf+yaOQeMzV+9UgkbHIIGyaJbH3vpo= github.com/libp2p/go-libp2p-raft v0.1.8/go.mod h1:+YDisn3uszb7vxshLgKoDdRGs79WSbHRgrOdrYqDPk4= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= @@ -1192,7 +1197,6 @@ github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7 github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= -github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= @@ -1211,8 +1215,6 @@ github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6syd github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= -github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= -github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= github.com/libp2p/go-libp2p-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,14 +1227,10 @@ github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotl github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= -github.com/libp2p/go-libp2p-testing v0.9.0/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= -github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= -github.com/libp2p/go-libp2p-tls v0.4.1/go.mod h1:EKCixHEysLNDlLUoKxv+3f/Lp90O2EXNjTr0UQDnrIw= github.com/libp2p/go-libp2p-tls v0.5.0 h1:aRNTeOI8Ljm1r4L2uMGxkMsVnyZoPwaqQqMw23qAsQs= github.com/libp2p/go-libp2p-tls v0.5.0/go.mod h1:1a4tq0xQSZ0kAkDkZVAppuP3SAIUHcnzi2djJ/2EN4I= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= @@ -1246,8 +1244,6 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIW github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= -github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= -github.com/libp2p/go-libp2p-transport-upgrader v0.7.1/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= @@ -1261,9 +1257,6 @@ github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLw 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.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.9.1/go.mod h1:wRc6wvyxQINFcKe7daL4BeQ02Iyp+wxyC8WCNfngBrA= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= @@ -1276,14 +1269,13 @@ github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3 github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= github.com/libp2p/go-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/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= -github.com/libp2p/go-msgio v0.2.0 h1:W6shmB+FeynDrUVl2dgFQvzfBZcXiyqY4VmpQLu9FqU= -github.com/libp2p/go-msgio v0.2.0/go.mod h1:dBVM1gW3Jk9XqHkU4eKdGvVHdLa51hoGfll6jMJMSlY= +github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= +github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= 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= @@ -1293,15 +1285,13 @@ github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdm 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/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-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= +github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= 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/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo= -github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= @@ -1319,7 +1309,6 @@ github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqX github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= -github.com/libp2p/go-stream-muxer-multistream v0.4.0/go.mod h1:nb+dGViZleRP4XcyHuZSVrJCBl55nRBOMmiSL/dyziw= github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= @@ -1328,8 +1317,6 @@ 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.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= -github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= -github.com/libp2p/go-tcp-transport v0.5.1/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= @@ -1338,7 +1325,6 @@ github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzl github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= -github.com/libp2p/go-ws-transport v0.6.0/go.mod h1:dXqtI9e2JV9FtF1NOtWVZSKXh5zXvnuwPXfj8GPBbYU= github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -1351,10 +1337,6 @@ github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h 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/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/go-yamux/v3 v3.1.1/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= -github.com/libp2p/go-yamux/v3 v3.1.2/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ= github.com/libp2p/go-yamux/v4 v4.0.0/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= @@ -1363,11 +1345,6 @@ github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0U github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= -github.com/lucas-clemente/quic-go v0.27.0/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= -github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= -github.com/lucas-clemente/quic-go v0.29.1 h1:Z+WMJ++qMLhvpFkRZA+jl3BTxUjm415YBmWanXB8zP0= -github.com/lucas-clemente/quic-go v0.29.1/go.mod h1:CTcNfLYJS2UuRNB+zcNlgvkjBhxX6Hm3WUxxAQx2mgE= 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= @@ -1383,24 +1360,14 @@ 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.2.1 h1:jvTsT/HpCn2UZJdP+UUB53FfUUgeOyG5K1ns0OJOGVs= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= 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-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/marten-seemann/qtls-go1-17 v0.1.1/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= -github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= -github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= -github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM= -github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= -github.com/marten-seemann/qtls-go1-19 v0.1.0 h1:rLFKD/9mp/uq1SYGYuVZhm83wkmU95pK5df3GufyYYU= -github.com/marten-seemann/qtls-go1-19 v0.1.0/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= -github.com/marten-seemann/webtransport-go v0.1.1 h1:TnyKp3pEXcDooTaNn4s9dYpMJ7kMnTp7k5h+SgYP/mc= 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= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -1417,8 +1384,6 @@ github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= -github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= @@ -1426,8 +1391,9 @@ github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRC github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= 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/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= github.com/mdlayher/netlink v0.0.0-20190828143259-340058475d09/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= @@ -1442,7 +1408,6 @@ github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7 github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= @@ -1470,9 +1435,11 @@ 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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 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 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 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= @@ -1484,8 +1451,9 @@ github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= -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-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= +github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= 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= github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= @@ -1498,8 +1466,6 @@ github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4 github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= -github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= -github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= github.com/multiformats/go-multiaddr v0.8.0 h1:aqjksEcqK+iD/Foe1RRFsGZh8+XFiGo7FgUCZlpv3LU= github.com/multiformats/go-multiaddr v0.8.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -1524,9 +1490,6 @@ github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyD github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -github.com/multiformats/go-multicodec v0.5.0/go.mod h1:DiY2HFaEp5EhEXb/iYzVAunmyX/aSFMxq2KMKfWEues= github.com/multiformats/go-multicodec v0.8.0 h1:evBmgkbSQux+Ds2IgfhkO38Dl2GDtRW8/Rp6YiSHX/Q= github.com/multiformats/go-multicodec v0.8.0/go.mod h1:GUC8upxSBE4oG+q3kWZRw/+6yC1BqO550bjhWsJbZlw= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= @@ -1547,14 +1510,14 @@ github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9 github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= -github.com/multiformats/go-multistream v0.3.0/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= -github.com/multiformats/go-multistream v0.3.3 h1:d5PZpjwRgVlbwfdTDjife7XszfZd8KYWfROYFlGcR8o= -github.com/multiformats/go-multistream v0.3.3/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= +github.com/multiformats/go-multistream v0.4.0 h1:5i4JbawClkbuaX+mIVXiHQYVPxUW+zjv6w7jtSRukxc= +github.com/multiformats/go-multistream v0.4.0/go.mod h1:BS6ZSYcA4NwYEaIMeCtpJydp2Dc+fNRA6uJMSu/m8+4= 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/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= +github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= 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= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= @@ -1586,7 +1549,8 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.5.1 h1:auzK7OI497k6x4OvWq+TKAcpcSAlod0doAH72oIN0Jw= +github.com/onsi/ginkgo/v2 v2.5.1/go.mod h1:63DOGlLAH8+REH8jUGdL3YpCpu7JODesutUjdENfUAc= 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= @@ -1594,7 +1558,7 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J 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/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.24.0 h1:+0glovB9Jd6z3VR+ScSwQqXVTIfJcGA9UBM8yzQxhqg= 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= @@ -1657,15 +1621,16 @@ github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66Id github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU= -github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= 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/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= 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= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -1679,7 +1644,6 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9 github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= @@ -1699,6 +1663,18 @@ github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5 github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= +github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= +github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= +github.com/quic-go/qtls-go1-18 v0.2.0 h1:5ViXqBZ90wpUcZS0ge79rf029yx0dYB0McyPJwqqj7U= +github.com/quic-go/qtls-go1-18 v0.2.0/go.mod h1:moGulGHK7o6O8lSPSZNoOwcLvJKJ85vVNc7oJFD65bc= +github.com/quic-go/qtls-go1-19 v0.2.0 h1:Cvn2WdhyViFUHoOqK52i51k4nDX8EwIh5VJiVM4nttk= +github.com/quic-go/qtls-go1-19 v0.2.0/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= +github.com/quic-go/qtls-go1-20 v0.1.0 h1:d1PK3ErFy9t7zxKsG3NXBJXZjp/kMLoIb3y/kV54oAI= +github.com/quic-go/qtls-go1-20 v0.1.0/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= +github.com/quic-go/quic-go v0.32.0 h1:lY02md31s1JgPiiyfqJijpu/UX/Iun304FI3yUqX7tA= +github.com/quic-go/quic-go v0.32.0/go.mod h1:/fCsKANhQIeD5l76c2JFU+07gVE3KaA0FP+0zMWwfwo= +github.com/quic-go/webtransport-go v0.5.1 h1:1eVb7WDWCRoaeTtFHpFBJ6WDN1bSrPrRoW6tZgSw0Ow= +github.com/quic-go/webtransport-go v0.5.1/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= 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/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= @@ -1777,7 +1753,6 @@ 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= @@ -1835,9 +1810,11 @@ github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW 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 v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go v1.1.13/go.mod h1:jxau1n+/wyTGLQoCkjok9r5zFa/FxT6eI5HiHKQszjc= github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.1.13/go.mod h1:oNVt3Dq+FO91WNQ/9JnHKQP2QJxTzoN7wCBFCq1OeuU= github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= @@ -1855,7 +1832,6 @@ github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPU 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/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= -github.com/warpfork/go-testmark v0.10.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-testmark v0.11.0 h1:J6LnV8KpceDvo7spaNU4+DauH2n1x+6RaO2rJrmpQ9U= 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= @@ -1920,7 +1896,6 @@ 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.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= @@ -1981,16 +1956,14 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.12.0 h1:l1GQeZpEbss0/M4l/ZotuBndCrkMdjnygzgcuOjAdaY= -go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= -go.uber.org/fx v1.15.0 h1:kcfBpAm98n0ksanyyZLFE/Q3T7yPi13Ge2liu3TxR+A= -go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8= +go.uber.org/dig v1.15.0 h1:vq3YWr8zRj1eFGC7Gvf907hE0eRjPTZ1d3xHadD6liE= +go.uber.org/dig v1.15.0/go.mod h1:pKHs0wMynzL6brANhB2hLMro+zalv1osARTviTcqHLM= +go.uber.org/fx v1.18.2 h1:bUNI6oShr+OVFQeU8cDNbnN7VFsu+SsjHzUF51V/GAU= +go.uber.org/fx v1.18.2/go.mod h1:g0V1KMQ66zIRk8bLu3Ea5Jt2w/cHlOIp4wdRsgh0JaY= 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/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/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= @@ -2007,9 +1980,8 @@ 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.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= 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= @@ -2053,11 +2025,9 @@ golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= 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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= +golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -2071,8 +2041,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= -golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b h1:SCE/18RnFsLrjydh/R/s5EVvHoZprqEQUuoxK8q2Pc4= -golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20221205204356-47842c84f3db h1:D/cFflL63o2KSLJIwjlcIt8PR064j/xsmdEJL/YvY/o= +golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -2086,7 +2056,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= @@ -2099,9 +2068,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.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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= @@ -2163,13 +2131,11 @@ 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-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5 h1:KafLifaRFIuSJ5C+7CyFJOF9haxKNC1CEIDk8GX6X0k= -golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= 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= @@ -2192,8 +2158,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220907140024-f12130a52804 h1:0SH2R3f1b1VmIMG7BXbEZCBUu2dKmHschSmjqGUrW8A= -golang.org/x/sync v0.0.0-20220907140024-f12130a52804/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2293,21 +2259,20 @@ 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-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc= -golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= 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= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2315,8 +2280,9 @@ 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/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 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= @@ -2348,7 +2314,6 @@ golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtn 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= -golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2386,14 +2351,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.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= @@ -2503,7 +2466,6 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -2556,6 +2518,8 @@ howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCU lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/itests/deals_concurrent_test.go b/itests/deals_concurrent_test.go index 0fee8da01..a106836bd 100644 --- a/itests/deals_concurrent_test.go +++ b/itests/deals_concurrent_test.go @@ -11,7 +11,7 @@ import ( provider "github.com/ipni/index-provider" "github.com/stretchr/testify/require" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/shared_testutil" "github.com/filecoin-project/go-state-types/abi" diff --git a/markets/loggers/loggers.go b/markets/loggers/loggers.go index f522fb6ab..e066c9843 100644 --- a/markets/loggers/loggers.go +++ b/markets/loggers/loggers.go @@ -3,7 +3,7 @@ package marketevents import ( logging "github.com/ipfs/go-log/v2" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/abi" diff --git a/node/impl/client/client.go b/node/impl/client/client.go index fef4d91e3..106b095b1 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -44,7 +44,7 @@ import ( "github.com/filecoin-project/go-address" cborutil "github.com/filecoin-project/go-cbor-util" "github.com/filecoin-project/go-commp-utils/writer" - datatransfer "github.com/filecoin-project/go-data-transfer" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" "github.com/filecoin-project/go-fil-markets/discovery" rm "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" @@ -1302,8 +1302,8 @@ func (a *API) ClientQueryAsk(ctx context.Context, p peer.ID, miner address.Addre return nil, err } for _, s := range ps { - if strings.HasPrefix(s, dealProtoPrefix) { - res.DealProtocols = append(res.DealProtocols, s) + if strings.HasPrefix(string(s), dealProtoPrefix) { + res.DealProtocols = append(res.DealProtocols, string(s)) } } sort.Strings(res.DealProtocols) diff --git a/node/impl/net/net.go b/node/impl/net/net.go index c2ccbac0a..271c56ea5 100644 --- a/node/impl/net/net.go +++ b/node/impl/net/net.go @@ -91,8 +91,12 @@ func (a *NetAPI) NetPeerInfo(_ context.Context, p peer.ID) (*api.ExtendedPeerInf protocols, err := a.Host.Peerstore().GetProtocols(p) if err == nil { - sort.Strings(protocols) - info.Protocols = protocols + protocolStrings := make([]string, 0, len(protocols)) + for _, protocol := range protocols { + protocolStrings = append(protocolStrings, string(protocol)) + } + sort.Strings(protocolStrings) + info.Protocols = protocolStrings } if cm := a.Host.ConnManager().GetTagInfo(p); cm != nil { diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 56aa7afde..18a5e179a 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -25,8 +25,8 @@ import ( "github.com/filecoin-project/dagstore/shard" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer" - gst "github.com/filecoin-project/go-data-transfer/transport/graphsync" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" + gst "github.com/filecoin-project/go-data-transfer/v2/transport/graphsync" "github.com/filecoin-project/go-fil-markets/piecestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" diff --git a/node/modules/client.go b/node/modules/client.go index 69f8db559..9d8eef421 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -13,10 +13,10 @@ import ( "go.uber.org/fx" "golang.org/x/xerrors" - "github.com/filecoin-project/go-data-transfer/channelmonitor" - dtimpl "github.com/filecoin-project/go-data-transfer/impl" - dtnet "github.com/filecoin-project/go-data-transfer/network" - dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" + "github.com/filecoin-project/go-data-transfer/v2/channelmonitor" + dtimpl "github.com/filecoin-project/go-data-transfer/v2/impl" + dtnet "github.com/filecoin-project/go-data-transfer/v2/network" + dtgstransport "github.com/filecoin-project/go-data-transfer/v2/transport/graphsync" "github.com/filecoin-project/go-fil-markets/discovery" discoveryimpl "github.com/filecoin-project/go-fil-markets/discovery/impl" "github.com/filecoin-project/go-fil-markets/retrievalmarket" @@ -24,7 +24,6 @@ import ( rmnet "github.com/filecoin-project/go-fil-markets/retrievalmarket/network" "github.com/filecoin-project/go-fil-markets/storagemarket" storageimpl "github.com/filecoin-project/go-fil-markets/storagemarket/impl" - "github.com/filecoin-project/go-fil-markets/storagemarket/impl/requestvalidation" smnet "github.com/filecoin-project/go-fil-markets/storagemarket/network" "github.com/filecoin-project/go-state-types/abi" @@ -95,15 +94,6 @@ func ClientBlockstore() dtypes.ClientBlockstore { return blockstore.WrapIDStore(blockstore.FromDatastore(datastore.NewMapDatastore())) } -// RegisterClientValidator is an initialization hook that registers the client -// request validator with the data transfer module as the validator for -// StorageDataTransferVoucher types -func RegisterClientValidator(crv dtypes.ClientRequestValidator, dtm dtypes.ClientDataTransfer) { - if err := dtm.RegisterVoucherType(&requestvalidation.StorageDataTransferVoucher{}, (*requestvalidation.UnifiedRequestValidator)(crv)); err != nil { - panic(err) - } -} - // NewClientGraphsyncDataTransfer returns a data transfer manager that just // uses the clients's Client DAG service for transfers func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Graphsync, ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ClientDataTransfer, error) { diff --git a/node/modules/dtypes/storage.go b/node/modules/dtypes/storage.go index 993ede55f..182d9db5e 100644 --- a/node/modules/dtypes/storage.go +++ b/node/modules/dtypes/storage.go @@ -6,8 +6,8 @@ import ( "github.com/ipfs/go-graphsync" exchange "github.com/ipfs/go-ipfs-exchange-interface" - datatransfer "github.com/filecoin-project/go-data-transfer" - dtnet "github.com/filecoin-project/go-data-transfer/network" + datatransfer "github.com/filecoin-project/go-data-transfer/v2" + dtnet "github.com/filecoin-project/go-data-transfer/v2/network" "github.com/filecoin-project/go-fil-markets/piecestore" "github.com/filecoin-project/go-fil-markets/storagemarket/impl/requestvalidation" "github.com/filecoin-project/go-statestore" diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index fd904ad5e..6abfb1dd7 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -14,10 +14,8 @@ import ( "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/protocol" rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager" - "github.com/libp2p/go-libp2p/p2p/host/resource-manager/obs" rcmgrObs "github.com/libp2p/go-libp2p/p2p/host/resource-manager/obs" "go.opencensus.io/stats" - "go.opencensus.io/stats/view" "go.opencensus.io/tag" "go.uber.org/fx" @@ -32,7 +30,7 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) if (isFullNode && envvar == "0") || // only set NullResourceManager if envvar is explicitly "0" (!isFullNode && envvar != "1") { // set NullResourceManager *unless* envvar is explicitly "1" log.Info("libp2p resource manager is disabled") - return network.NullResourceManager, nil + return &network.NullResourceManager{}, nil } log.Info("libp2p resource manager is enabled") @@ -52,37 +50,41 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) // For every extra 1GB of memory we have available, increase our limit by 1GiB defaultLimits.SystemLimitIncrease.Memory = 1 << 30 defaultLimitConfig := defaultLimits.AutoScale() - if defaultLimitConfig.System.Memory > 4<<30 { + + changes := rcmgr.PartialLimitConfig{} + + if defaultLimitConfig.ToPartialLimitConfig().System.Memory > 4<<30 { // Cap our memory limit - defaultLimitConfig.System.Memory = 4 << 30 + changes.System.Memory = 4 << 30 } maxconns := int(connMgrHi) - if 2*maxconns > defaultLimitConfig.System.ConnsInbound { + if rcmgr.LimitVal(2*maxconns) > defaultLimitConfig.ToPartialLimitConfig().System.ConnsInbound { // adjust conns to 2x to allow for two conns per peer (TCP+QUIC) - defaultLimitConfig.System.ConnsInbound = logScale(2 * maxconns) - defaultLimitConfig.System.ConnsOutbound = logScale(2 * maxconns) - defaultLimitConfig.System.Conns = logScale(4 * maxconns) + changes.System.ConnsInbound = rcmgr.LimitVal(logScale(2 * maxconns)) + changes.System.ConnsOutbound = rcmgr.LimitVal(logScale(2 * maxconns)) + changes.System.Conns = rcmgr.LimitVal(logScale(4 * maxconns)) - defaultLimitConfig.System.StreamsInbound = logScale(16 * maxconns) - defaultLimitConfig.System.StreamsOutbound = logScale(64 * maxconns) - defaultLimitConfig.System.Streams = logScale(64 * maxconns) + changes.System.StreamsInbound = rcmgr.LimitVal(logScale(16 * maxconns)) + changes.System.StreamsOutbound = rcmgr.LimitVal(logScale(64 * maxconns)) + changes.System.Streams = rcmgr.LimitVal(logScale(64 * maxconns)) - if 2*maxconns > defaultLimitConfig.System.FD { - defaultLimitConfig.System.FD = logScale(2 * maxconns) + if rcmgr.LimitVal(2*maxconns) > defaultLimitConfig.ToPartialLimitConfig().System.FD { + changes.System.FD = rcmgr.LimitVal(logScale(2 * maxconns)) } - defaultLimitConfig.ServiceDefault.StreamsInbound = logScale(8 * maxconns) - defaultLimitConfig.ServiceDefault.StreamsOutbound = logScale(32 * maxconns) - defaultLimitConfig.ServiceDefault.Streams = logScale(32 * maxconns) + changes.ServiceDefault.StreamsInbound = rcmgr.LimitVal(logScale(8 * maxconns)) + changes.ServiceDefault.StreamsOutbound = rcmgr.LimitVal(logScale(32 * maxconns)) + changes.ServiceDefault.Streams = rcmgr.LimitVal(logScale(32 * maxconns)) - defaultLimitConfig.ProtocolDefault.StreamsInbound = logScale(8 * maxconns) - defaultLimitConfig.ProtocolDefault.StreamsOutbound = logScale(32 * maxconns) - defaultLimitConfig.ProtocolDefault.Streams = logScale(32 * maxconns) + changes.ProtocolDefault.StreamsInbound = rcmgr.LimitVal(logScale(8 * maxconns)) + changes.ProtocolDefault.StreamsOutbound = rcmgr.LimitVal(logScale(32 * maxconns)) + changes.ProtocolDefault.Streams = rcmgr.LimitVal(logScale(32 * maxconns)) log.Info("adjusted default resource manager limits") } + changedLimitConfig := changes.Build(defaultLimitConfig) // initialize var limiter rcmgr.Limiter var opts []rcmgr.Option @@ -95,13 +97,13 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) switch { case err == nil: defer limitsIn.Close() //nolint:errcheck - limiter, err = rcmgr.NewLimiterFromJSON(limitsIn, defaultLimitConfig) + limiter, err = rcmgr.NewLimiterFromJSON(limitsIn, changedLimitConfig) if err != nil { return nil, fmt.Errorf("error parsing limit file: %w", err) } case errors.Is(err, os.ErrNotExist): - limiter = rcmgr.NewFixedLimiter(defaultLimitConfig) + limiter = rcmgr.NewFixedLimiter(changedLimitConfig) default: return nil, err @@ -111,10 +113,12 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) if err != nil { return nil, fmt.Errorf("error creating resource manager stats reporter: %w", err) } - err = view.Register(obs.DefaultViews...) - if err != nil { - return nil, fmt.Errorf("error registering rcmgr metrics: %w", err) - } + + // TODO: Libp2p converted to native prometheus metrics -- how do we register them + //err = view.Register(obs.DefaultViews...) + //if err != nil { + // return nil, fmt.Errorf("error registering rcmgr metrics: %w", err) + //} // Metrics opts = append(opts, rcmgr.WithMetrics(rcmgrMetrics{}), rcmgr.WithTraceReporter(str)) diff --git a/node/modules/services.go b/node/modules/services.go index 18c0116aa..9acebd071 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -12,6 +12,7 @@ import ( "github.com/libp2p/go-libp2p/core/event" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" "github.com/libp2p/go-libp2p/p2p/host/eventbus" "go.uber.org/fx" "golang.org/x/xerrors" @@ -84,7 +85,7 @@ func RunHello(mctx helpers.MetricsCtx, lc fx.Lifecycle, h host.Host, svc *hello. return nil } -func protosContains(protos []string, search string) bool { +func protosContains(protos []protocol.ID, search protocol.ID) bool { for _, p := range protos { if p == search { return true diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 7f6ccf60a..4e4e2dde1 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -25,9 +25,9 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - dtimpl "github.com/filecoin-project/go-data-transfer/impl" - dtnet "github.com/filecoin-project/go-data-transfer/network" - dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" + dtimpl "github.com/filecoin-project/go-data-transfer/v2/impl" + dtnet "github.com/filecoin-project/go-data-transfer/v2/network" + dtgstransport "github.com/filecoin-project/go-data-transfer/v2/transport/graphsync" piecefilestore "github.com/filecoin-project/go-fil-markets/filestore" piecestoreimpl "github.com/filecoin-project/go-fil-markets/piecestore/impl" "github.com/filecoin-project/go-fil-markets/retrievalmarket" From c3198d7446d4c9311a86e96490d7a21fe3e1448e Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 2 Mar 2023 18:48:25 -0800 Subject: [PATCH 008/129] chore(deps): update go-libipfs --- go.mod | 24 ++++++++++++------------ go.sum | 53 +++++++++++++++++++++++++---------------------------- 2 files changed, 37 insertions(+), 40 deletions(-) diff --git a/go.mod b/go.mod index 1c85bb8d5..4ea90861c 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab github.com/ipfs/bbloom v0.0.4 - github.com/ipfs/go-blockservice v0.4.0 + github.com/ipfs/go-blockservice v0.5.0 github.com/ipfs/go-cid v0.3.2 github.com/ipfs/go-cidutil v0.1.0 github.com/ipfs/go-datastore v0.6.0 @@ -97,15 +97,15 @@ require ( github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.4.0 - github.com/ipfs/go-libipfs v0.4.1 + github.com/ipfs/go-libipfs v0.5.0 github.com/ipfs/go-log/v2 v2.5.1 - github.com/ipfs/go-merkledag v0.8.1 + github.com/ipfs/go-merkledag v0.9.0 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 github.com/ipfs/go-unixfs v0.4.3 github.com/ipfs/go-unixfsnode v1.5.2 - github.com/ipfs/interface-go-ipfs-core v0.7.0 - github.com/ipld/go-car v0.4.0 + github.com/ipfs/interface-go-ipfs-core v0.10.0 + github.com/ipld/go-car v0.5.0 github.com/ipld/go-car/v2 v2.5.0 github.com/ipld/go-codec-dagpb v1.5.0 github.com/ipld/go-ipld-prime v0.20.0 @@ -114,17 +114,17 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/libp2p/go-libp2p v0.25.0 + github.com/libp2p/go-libp2p v0.25.1 github.com/libp2p/go-libp2p-consensus v0.0.1 github.com/libp2p/go-libp2p-gorpc v0.4.0 - github.com/libp2p/go-libp2p-kad-dht v0.18.0 + github.com/libp2p/go-libp2p-kad-dht v0.21.0 github.com/libp2p/go-libp2p-pubsub v0.8.2 github.com/libp2p/go-libp2p-raft v0.1.8 github.com/libp2p/go-libp2p-record v0.2.0 - github.com/libp2p/go-libp2p-routing-helpers v0.2.3 + github.com/libp2p/go-libp2p-routing-helpers v0.4.0 github.com/libp2p/go-maddr-filter v0.1.0 github.com/libp2p/go-msgio v0.3.0 - github.com/mattn/go-isatty v0.0.16 + github.com/mattn/go-isatty v0.0.17 github.com/mattn/go-sqlite3 v1.14.16 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 @@ -143,12 +143,12 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/urfave/cli/v2 v2.16.3 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba - github.com/whyrusleeping/cbor-gen v0.0.0-20221021053955-c138aae13722 + github.com/whyrusleeping/cbor-gen v0.0.0-20221220214510-0333c149dec0 github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 github.com/xeipuuv/gojsonschema v1.2.0 github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 - go.opencensus.io v0.23.0 + go.opencensus.io v0.24.0 go.opentelemetry.io/otel v1.11.1 go.opentelemetry.io/otel/bridge/opencensus v0.33.0 go.opentelemetry.io/otel/exporters/jaeger v1.2.0 @@ -292,7 +292,7 @@ require ( github.com/multiformats/go-base36 v0.2.0 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multicodec v0.8.0 // indirect - github.com/multiformats/go-multistream v0.4.0 // indirect + github.com/multiformats/go-multistream v0.4.1 // indirect github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c // indirect github.com/nkovacs/streamquote v1.0.0 // indirect github.com/onsi/ginkgo/v2 v2.5.1 // indirect diff --git a/go.sum b/go.sum index a6dd0e654..bcc7a0e47 100644 --- a/go.sum +++ b/go.sum @@ -701,7 +701,7 @@ github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSA github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA= -github.com/ipfs/go-bitswap v0.10.2 h1:B81RIwkTnIvSYT1ZCzxjYTeF0Ek88xa9r1AMpTfk+9Q= +github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= 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/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= @@ -711,8 +711,8 @@ github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbR github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-blockservice v0.3.0/go.mod h1:P5ppi8IHDC7O+pA0AlGTF09jruB2h+oP3wVVaZl8sfk= -github.com/ipfs/go-blockservice v0.4.0 h1:7MUijAW5SqdsqEW/EhnNFRJXVF8mGU5aGhZ3CQaCWbY= -github.com/ipfs/go-blockservice v0.4.0/go.mod h1:kRjO3wlGW9mS1aKuiCeGhx9K1DagQ10ACpVO59qgAx4= +github.com/ipfs/go-blockservice v0.5.0 h1:B2mwhhhVQl2ntW2EIpaWPwSCxSuqr5fFA93Ms4bYLEY= +github.com/ipfs/go-blockservice v0.5.0/go.mod h1:W6brZ5k20AehbmERplmERn8o2Ni3ZZubvAxaIUeaT6w= 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= @@ -836,8 +836,8 @@ github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2 github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= github.com/ipfs/go-ipns v0.3.0 h1:ai791nTgVo+zTuq2bLvEGmWP1M0A6kGTXUsgv/Yq67A= github.com/ipfs/go-ipns v0.3.0/go.mod h1:3cLT2rbvgPZGkHJoPO1YMJeh6LtkxopCkKFcio/wE24= -github.com/ipfs/go-libipfs v0.4.1 h1:tyu3RRMKFQUyUQt5jyt5SmDnls93H4Tr3HifL50zihg= -github.com/ipfs/go-libipfs v0.4.1/go.mod h1:Ad8ybPqwCkl2cNiNUMvM/iaVc/5bwNpHu8RPZ5te1hw= +github.com/ipfs/go-libipfs v0.5.0 h1:gtvzeoTdUHPUN4B5izzyBS3Cxtpvi+l7hd2mmjN+teM= +github.com/ipfs/go-libipfs v0.5.0/go.mod h1:iZ9QyhzNr3AkxRXrbQYb//rv7iLyvZJX0GNuc3lJDiQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I= @@ -864,8 +864,8 @@ github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-merkledag v0.6.0/go.mod h1:9HSEwRd5sV+lbykiYP+2NC/3o6MZbKNaa4hfNcH5iH0= -github.com/ipfs/go-merkledag v0.8.1 h1:N3yrqSre/ffvdwtHL4MXy0n7XH+VzN8DlzDrJySPa94= -github.com/ipfs/go-merkledag v0.8.1/go.mod h1:uYUlWE34GhbcTjGuUDEcdPzsEtOdnOupL64NgSRjmWI= +github.com/ipfs/go-merkledag v0.9.0 h1:DFC8qZ96Dz1hMT7dtIpcY524eFFDiEWAF8hNJHWW2pk= +github.com/ipfs/go-merkledag v0.9.0/go.mod h1:bPHqkHt5OZ0p1n3iqPeDiw2jIBkjAytRjS3WSBwjq90= 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= @@ -889,13 +889,13 @@ github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZ github.com/ipfs/go-verifcid v0.0.2 h1:XPnUv0XmdH+ZIhLGKg6U2vaPaRDXb9urMyNVCE7uvTs= github.com/ipfs/go-verifcid v0.0.2/go.mod h1:40cD9x1y4OWnFXbLNJYRe7MpNvWlMn3LZAG5Wb4xnPU= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= -github.com/ipfs/interface-go-ipfs-core v0.7.0 h1:7tb+2upz8oCcjIyjo1atdMk+P+u7wPmI+GksBlLE8js= -github.com/ipfs/interface-go-ipfs-core v0.7.0/go.mod h1:lF27E/nnSPbylPqKVXGZghal2hzifs3MmjyiEjnc9FY= +github.com/ipfs/interface-go-ipfs-core v0.10.0 h1:b/psL1oqJcySdQAsIBfW5ZJJkOAsYlhWtC0/Qvr4WiM= +github.com/ipfs/interface-go-ipfs-core v0.10.0/go.mod h1:F3EcmDy53GFkF0H3iEJpfJC320fZ/4G60eftnItrrJ0= github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.4.0 h1:U6W7F1aKF/OJMHovnOVdst2cpQE5GhmHibQkAixgNcQ= -github.com/ipld/go-car v0.4.0/go.mod h1:Uslcn4O9cBKK9wqHm/cLTFacg6RAPv6LZx2mxd2Ypl4= +github.com/ipld/go-car v0.5.0 h1:kcCEa3CvYMs0iE5BzD5sV7O2EwMiCIp3uF8tA6APQT8= +github.com/ipld/go-car v0.5.0/go.mod h1:ppiN5GWpjOZU9PgpAZ9HbZd9ZgSpwPMr48fGRJOWmvE= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-car/v2 v2.5.0 h1:S9h7A6qBAJ+B1M1jIKtau+HPDe30UbM71vsyBzwvRIE= github.com/ipld/go-car/v2 v2.5.0/go.mod h1:jKjGOqoCj5zn6KjnabD6JbnCsMntqU2hLiU6baZVO3E= @@ -1040,7 +1040,6 @@ github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVm github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= @@ -1055,8 +1054,8 @@ 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.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= -github.com/libp2p/go-libp2p v0.25.0 h1:ND6Hc6ZYCzC8S++C4mOD7LdPnLXRkNbr12/8FXgUfIo= -github.com/libp2p/go-libp2p v0.25.0/go.mod h1:vXHmFpcfl+xIGN4qW58Bw3a0/SKGAesr5/T4IuJHE3o= +github.com/libp2p/go-libp2p v0.25.1 h1:YK+YDCHpYyTvitKWVxa5PfElgIpOONU01X5UcLEwJGA= +github.com/libp2p/go-libp2p v0.25.1/go.mod h1:xnK9/1d9+jeQCVvi/f1g12KqtVi/jP/SijtKV1hML3g= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= @@ -1092,13 +1091,11 @@ github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7O 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.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= -github.com/libp2p/go-libp2p-core v0.2.5/go.mod h1:6+5zJmKhsf7yHn1RbmYDu08qDUpIUxGdqHuEZckmZOA= github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUhgJJLAa6almrII= github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.3/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= @@ -1138,8 +1135,8 @@ 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.18.0 h1:akqO3gPMwixR7qFSFq70ezRun97g5hrA/lBW9jrjUYM= -github.com/libp2p/go-libp2p-kad-dht v0.18.0/go.mod h1:Gb92MYIPm3K2pJLGn8wl0m8wiKDvHrYpg+rOd0GzzPA= +github.com/libp2p/go-libp2p-kad-dht v0.21.0 h1:J0Yd22VA+sk0CJRGMgtfHvLVIkZDyJ3AJGiljywIw5U= +github.com/libp2p/go-libp2p-kad-dht v0.21.0/go.mod h1:Bhm9diAFmc6qcWAr084bHNL159srVZRKADdp96Qqd1I= github.com/libp2p/go-libp2p-kbucket v0.5.0 h1:g/7tVm8ACHDxH29BGrpsQlnNeu+6OF1A9bno/4/U1oA= github.com/libp2p/go-libp2p-kbucket v0.5.0/go.mod h1:zGzGCpQd78b5BNTDGHNDLaTt9aDK/A02xeZp9QeFC4U= github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= @@ -1194,12 +1191,11 @@ github.com/libp2p/go-libp2p-raft v0.1.8 h1:Fq0aWHbbhi6WJXf+yaOQeMzV+9UgkbHIIGyaJ github.com/libp2p/go-libp2p-raft v0.1.8/go.mod h1:+YDisn3uszb7vxshLgKoDdRGs79WSbHRgrOdrYqDPk4= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= -github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= -github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= +github.com/libp2p/go-libp2p-routing-helpers v0.4.0 h1:b7y4aixQ7AwbqYfcOQ6wTw8DQvuRZeTAA0Od3YYN5yc= +github.com/libp2p/go-libp2p-routing-helpers v0.4.0/go.mod h1:dYEAgkVhqho3/YKxfOEGdFMIcWfAFNlZX8iAIihYA2E= 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.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= @@ -1382,8 +1378,8 @@ github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcME 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/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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= @@ -1510,8 +1506,8 @@ github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9 github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= -github.com/multiformats/go-multistream v0.4.0 h1:5i4JbawClkbuaX+mIVXiHQYVPxUW+zjv6w7jtSRukxc= -github.com/multiformats/go-multistream v0.4.0/go.mod h1:BS6ZSYcA4NwYEaIMeCtpJydp2Dc+fNRA6uJMSu/m8+4= +github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= +github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= 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= @@ -1859,8 +1855,8 @@ 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-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20221021053955-c138aae13722 h1:0HEhvpGQJ2Gd0ngPW83aduQQuF/V9v13+3zpSrR3lrA= -github.com/whyrusleeping/cbor-gen v0.0.0-20221021053955-c138aae13722/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20221220214510-0333c149dec0 h1:obKzQ1ey5AJg5NKjgtTo/CKwLImVP4ETLRcsmzFJ4Qw= +github.com/whyrusleeping/cbor-gen v0.0.0-20221220214510-0333c149dec0/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= @@ -1922,8 +1918,9 @@ 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.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= 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.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4= From 7bc618507703af4a1343d261c4044b5c57edb401 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Tue, 7 Mar 2023 11:43:23 -0800 Subject: [PATCH 009/129] chore(deps): update to get to compile --- chain/beacon/drand/drand.go | 23 +- chain/sub/incoming.go | 4 +- chain/sub/incoming_test.go | 4 +- go.mod | 96 +++--- go.sum | 451 +++++++-------------------- lib/consensus/raft/raft.go | 3 +- node/modules/storageminer_idxprov.go | 7 +- 7 files changed, 189 insertions(+), 399 deletions(-) diff --git a/chain/beacon/drand/drand.go b/chain/beacon/drand/drand.go index 181fa3046..a8ce9f4b7 100644 --- a/chain/beacon/drand/drand.go +++ b/chain/beacon/drand/drand.go @@ -8,14 +8,14 @@ import ( dchain "github.com/drand/drand/chain" dclient "github.com/drand/drand/client" hclient "github.com/drand/drand/client/http" + "github.com/drand/drand/common/scheme" dlog "github.com/drand/drand/log" gclient "github.com/drand/drand/lp2p/client" "github.com/drand/kyber" - kzap "github.com/go-kit/kit/log/zap" lru "github.com/hashicorp/golang-lru" logging "github.com/ipfs/go-log/v2" pubsub "github.com/libp2p/go-libp2p-pubsub" - "go.uber.org/zap/zapcore" + "go.uber.org/zap" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" @@ -69,6 +69,18 @@ type DrandHTTPClient interface { SetUserAgent(string) } +type logger struct { + *zap.SugaredLogger +} + +func (l *logger) With(args ...interface{}) dlog.Logger { + return &logger{l.SugaredLogger.With(args...)} +} + +func (l *logger) Named(s string) dlog.Logger { + return &logger{l.SugaredLogger.Named(s)} +} + func NewDrandBeacon(genesisTs, interval uint64, ps *pubsub.PubSub, config dtypes.DrandConfig) (*DrandBeacon, error) { if genesisTs == 0 { panic("what are you doing this cant be zero") @@ -79,9 +91,6 @@ func NewDrandBeacon(genesisTs, interval uint64, ps *pubsub.PubSub, config dtypes return nil, xerrors.Errorf("unable to unmarshal drand chain info: %w", err) } - dlogger := dlog.NewKitLoggerFrom(kzap.NewZapSugarLogger( - log.SugaredLogger.Desugar(), zapcore.InfoLevel)) - var clients []dclient.Client for _, url := range config.Servers { hc, err := hclient.NewWithInfo(url, drandChain, nil) @@ -96,7 +105,7 @@ func NewDrandBeacon(genesisTs, interval uint64, ps *pubsub.PubSub, config dtypes opts := []dclient.Option{ dclient.WithChainInfo(drandChain), dclient.WithCacheSize(1024), - dclient.WithLogger(dlogger), + dclient.WithLogger(&logger{&log.SugaredLogger}), } if ps != nil { @@ -194,7 +203,7 @@ func (db *DrandBeacon) VerifyEntry(curr types.BeaconEntry, prev types.BeaconEntr Round: curr.Round, Signature: curr.Data, } - err := dchain.VerifyBeacon(db.pubkey, b) + err := dchain.NewVerifier(scheme.GetSchemeFromEnv()).VerifyBeacon(*b, db.pubkey) if err == nil { db.cacheValue(curr) } diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index cbda39d8c..814482b47 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -20,7 +20,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-legs/dtsync" + "github.com/ipni/storetheindex/announce/message" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" @@ -497,7 +497,7 @@ func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg return pubsub.ValidationIgnore } - idxrMsg := dtsync.Message{} + idxrMsg := message.Message{} err := idxrMsg.UnmarshalCBOR(bytes.NewBuffer(msg.Data)) if err != nil { log.Errorw("Could not decode indexer pubsub message", "err", err) diff --git a/chain/sub/incoming_test.go b/chain/sub/incoming_test.go index d17b08825..b44b78e61 100644 --- a/chain/sub/incoming_test.go +++ b/chain/sub/incoming_test.go @@ -14,7 +14,7 @@ import ( "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-legs/dtsync" + "github.com/ipni/storetheindex/announce/message" "github.com/filecoin-project/lotus/api/mocks" "github.com/filecoin-project/lotus/chain/types" @@ -105,7 +105,7 @@ func TestIndexerMessageValidator_Validate(t *testing.T) { mc := gomock.NewController(t) node := mocks.NewMockFullNode(mc) subject := NewIndexerMessageValidator(peer.ID(tc.selfPID), node, node) - message := dtsync.Message{ + message := message.Message{ Cid: validCid, Addrs: nil, ExtraData: tc.extraData, diff --git a/go.mod b/go.mod index 4ea90861c..d077853a9 100644 --- a/go.mod +++ b/go.mod @@ -18,10 +18,10 @@ require ( github.com/containerd/cgroups v1.0.4 github.com/coreos/go-systemd/v22 v22.5.0 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e - github.com/dgraph-io/badger/v2 v2.2007.3 + github.com/dgraph-io/badger/v2 v2.2007.4 github.com/docker/go-units v0.5.0 - github.com/drand/drand v1.3.0 - github.com/drand/kyber v1.1.7 + github.com/drand/drand v1.4.9 + github.com/drand/kyber v1.1.15 github.com/dustin/go-humanize v1.0.0 github.com/elastic/go-elasticsearch/v7 v7.14.0 github.com/elastic/go-sysinfo v1.7.0 @@ -41,7 +41,6 @@ require ( github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.27.0-rc1 github.com/filecoin-project/go-jsonrpc v0.2.2 - github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 github.com/filecoin-project/go-state-types v0.10.0 @@ -60,7 +59,6 @@ require ( 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 - github.com/go-kit/kit v0.12.0 github.com/go-openapi/spec v0.19.11 github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 @@ -69,9 +67,10 @@ require ( github.com/gregdhill/go-openrpc v0.0.0-20220114144539-ae6f44720487 github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e + github.com/hashicorp/go-hclog v1.3.0 github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/golang-lru v0.5.4 - github.com/hashicorp/raft v1.1.1 + github.com/hashicorp/raft v1.3.10 github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab @@ -80,19 +79,19 @@ require ( github.com/ipfs/go-cid v0.3.2 github.com/ipfs/go-cidutil v0.1.0 github.com/ipfs/go-datastore v0.6.0 - github.com/ipfs/go-ds-badger2 v0.1.2 + github.com/ipfs/go-ds-badger2 v0.1.3 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.7 - github.com/ipfs/go-graphsync v0.14.0 + github.com/ipfs/go-graphsync v0.14.3 github.com/ipfs/go-ipfs-blockstore v1.2.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.1.0 github.com/ipfs/go-ipfs-exchange-interface v0.2.0 github.com/ipfs/go-ipfs-exchange-offline v0.3.0 - github.com/ipfs/go-ipfs-files v0.1.1 - github.com/ipfs/go-ipfs-http-client v0.4.0 + github.com/ipfs/go-ipfs-files v0.3.0 + github.com/ipfs/go-ipfs-http-client v0.5.0 github.com/ipfs/go-ipfs-routing v0.3.0 github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.6 @@ -104,22 +103,23 @@ require ( github.com/ipfs/go-metrics-prometheus v0.0.2 github.com/ipfs/go-unixfs v0.4.3 github.com/ipfs/go-unixfsnode v1.5.2 - github.com/ipfs/interface-go-ipfs-core v0.10.0 + github.com/ipfs/interface-go-ipfs-core v0.11.1 github.com/ipld/go-car v0.5.0 - github.com/ipld/go-car/v2 v2.5.0 + github.com/ipld/go-car/v2 v2.7.0 github.com/ipld/go-codec-dagpb v1.5.0 github.com/ipld/go-ipld-prime v0.20.0 github.com/ipld/go-ipld-selector-text-lite v0.0.1 - github.com/ipni/index-provider v0.10.0 + github.com/ipni/index-provider v0.11.0 + github.com/ipni/storetheindex v0.5.10 github.com/kelseyhightower/envconfig v1.4.0 github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/libp2p/go-libp2p v0.25.1 + github.com/libp2p/go-libp2p v0.26.0 github.com/libp2p/go-libp2p-consensus v0.0.1 - github.com/libp2p/go-libp2p-gorpc v0.4.0 + github.com/libp2p/go-libp2p-gorpc v0.5.0 github.com/libp2p/go-libp2p-kad-dht v0.21.0 - github.com/libp2p/go-libp2p-pubsub v0.8.2 - github.com/libp2p/go-libp2p-raft v0.1.8 + github.com/libp2p/go-libp2p-pubsub v0.9.0 + github.com/libp2p/go-libp2p-raft v0.4.0 github.com/libp2p/go-libp2p-record v0.2.0 github.com/libp2p/go-libp2p-routing-helpers v0.4.0 github.com/libp2p/go-maddr-filter v0.1.0 @@ -135,7 +135,7 @@ require ( github.com/multiformats/go-multihash v0.2.1 github.com/multiformats/go-varint v0.0.7 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 - github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e + github.com/polydawn/refmt v0.89.0 github.com/prometheus/client_golang v1.14.0 github.com/raulk/clock v1.1.0 github.com/raulk/go-watchdog v1.3.0 @@ -143,25 +143,25 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/urfave/cli/v2 v2.16.3 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba - github.com/whyrusleeping/cbor-gen v0.0.0-20221220214510-0333c149dec0 + github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 github.com/xeipuuv/gojsonschema v1.2.0 github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 go.opencensus.io v0.24.0 - go.opentelemetry.io/otel v1.11.1 + go.opentelemetry.io/otel v1.12.0 go.opentelemetry.io/otel/bridge/opencensus v0.33.0 go.opentelemetry.io/otel/exporters/jaeger v1.2.0 go.opentelemetry.io/otel/sdk v1.11.1 go.uber.org/atomic v1.10.0 go.uber.org/fx v1.18.2 - go.uber.org/multierr v1.8.0 + go.uber.org/multierr v1.9.0 go.uber.org/zap v1.24.0 - golang.org/x/crypto v0.4.0 - golang.org/x/exp v0.0.0-20221205204356-47842c84f3db - golang.org/x/net v0.4.0 + golang.org/x/crypto v0.5.0 + golang.org/x/exp v0.0.0-20230129154200-a960b3787bd2 + golang.org/x/net v0.7.0 golang.org/x/sync v0.1.0 - golang.org/x/sys v0.3.0 + golang.org/x/sys v0.5.0 golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 golang.org/x/tools v0.3.0 golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 @@ -192,14 +192,14 @@ require ( github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect - github.com/drand/kyber-bls12381 v0.2.1 // indirect + github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/drand/kyber-bls12381 v0.2.3 // indirect github.com/elastic/go-windows v1.0.0 // indirect + github.com/emirpasic/gods v1.18.1 // indirect github.com/etclabscore/go-jsonschema-walk v0.0.6 // indirect github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 // indirect github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 // indirect github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837 // indirect - github.com/filecoin-project/go-data-transfer v1.15.2 // indirect github.com/filecoin-project/go-ds-versioning v0.1.2 // indirect github.com/filecoin-project/go-hamt-ipld v0.1.5 // indirect github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 // indirect @@ -207,7 +207,7 @@ require ( github.com/flynn/noise v1.0.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/gdamore/encoding v1.0.0 // indirect - github.com/go-kit/log v0.2.0 // indirect + github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -227,7 +227,6 @@ require ( github.com/google/pprof v0.0.0-20221203041831-ce31453925ec // indirect github.com/hannahhoward/cbor-gen-for v0.0.0-20230214144701-5d17c9d5243c // indirect github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-hclog v0.16.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect github.com/hashicorp/golang-lru/v2 v2.0.1 // indirect @@ -236,8 +235,7 @@ require ( github.com/ipfs/go-bitfield v1.1.0 // indirect github.com/ipfs/go-block-format v0.1.1 // indirect github.com/ipfs/go-filestore v1.2.0 // indirect - github.com/ipfs/go-ipfs-cmds v0.7.0 // indirect - github.com/ipfs/go-ipfs-config v0.18.0 // indirect + github.com/ipfs/go-ipfs-cmds v0.8.2 // indirect github.com/ipfs/go-ipfs-delay v0.0.1 // indirect github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect github.com/ipfs/go-ipfs-pq v0.0.3 // indirect @@ -248,7 +246,6 @@ require ( github.com/ipfs/go-peertaskqueue v0.8.1 // indirect github.com/ipfs/go-verifcid v0.0.2 // indirect github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0 // indirect - github.com/ipni/storetheindex v0.5.3-0.20221203123030-16745cb63f15 // indirect github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c // indirect @@ -256,23 +253,17 @@ require ( github.com/jbenet/goprocess v0.1.4 // indirect github.com/jessevdk/go-flags v1.4.0 // indirect github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect - github.com/jonboulle/clockwork v0.2.2 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect - github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 // indirect + github.com/kilic/bls12-381 v0.1.0 // indirect github.com/klauspost/compress v1.15.12 // indirect - github.com/klauspost/cpuid/v2 v2.2.1 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect github.com/koron/go-ssdp v0.0.3 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect - github.com/libp2p/go-libp2p-connmgr v0.4.0 // indirect - github.com/libp2p/go-libp2p-core v0.20.1 // indirect - github.com/libp2p/go-libp2p-gostream v0.5.0 // indirect + github.com/libp2p/go-libp2p-gostream v0.6.0 // indirect github.com/libp2p/go-libp2p-kbucket v0.5.0 // indirect - github.com/libp2p/go-libp2p-noise v0.5.0 // indirect - github.com/libp2p/go-libp2p-peerstore v0.8.0 // indirect - github.com/libp2p/go-libp2p-tls v0.5.0 // indirect github.com/libp2p/go-nat v0.1.0 // indirect github.com/libp2p/go-netroute v0.2.1 // indirect github.com/libp2p/go-reuseport v0.2.0 // indirect @@ -281,7 +272,7 @@ require ( github.com/magefile/mage v1.9.0 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect - github.com/mattn/go-colorable v0.1.9 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-runewidth v0.0.10 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/miekg/dns v1.1.50 // indirect @@ -293,7 +284,7 @@ require ( github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multicodec v0.8.0 // indirect github.com/multiformats/go-multistream v0.4.1 // indirect - github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c // indirect + github.com/nikkolasg/hexjson v0.1.0 // indirect github.com/nkovacs/streamquote v1.0.0 // indirect github.com/onsi/ginkgo/v2 v2.5.1 // indirect github.com/opencontainers/runtime-spec v1.0.2 // indirect @@ -307,26 +298,23 @@ require ( github.com/prometheus/procfs v0.8.0 // indirect github.com/prometheus/statsd_exporter v0.21.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-18 v0.2.0 // indirect - github.com/quic-go/qtls-go1-19 v0.2.0 // indirect - github.com/quic-go/qtls-go1-20 v0.1.0 // indirect - github.com/quic-go/quic-go v0.32.0 // indirect + github.com/quic-go/qtls-go1-19 v0.2.1 // indirect + github.com/quic-go/qtls-go1-20 v0.1.1 // indirect + github.com/quic-go/quic-go v0.33.0 // indirect github.com/quic-go/webtransport-go v0.5.1 // indirect github.com/rivo/uniseg v0.1.0 // indirect github.com/rs/cors v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v2.18.12+incompatible // indirect - github.com/sirupsen/logrus v1.8.1 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/twmb/murmur3 v1.1.6 // indirect - github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect github.com/ugorji/go/codec v1.2.6 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.0.1 // indirect github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect - github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect @@ -334,12 +322,12 @@ require ( github.com/zondax/ledger-go v0.12.1 // indirect go.opentelemetry.io/otel/metric v0.33.0 // indirect go.opentelemetry.io/otel/sdk/metric v0.33.0 // indirect - go.opentelemetry.io/otel/trace v1.11.1 // indirect + go.opentelemetry.io/otel/trace v1.12.0 // indirect go.uber.org/dig v1.15.0 // indirect go4.org v0.0.0-20200411211856-f5505b9728dd // indirect golang.org/x/mod v0.7.0 // indirect - golang.org/x/term v0.3.0 // indirect - golang.org/x/text v0.5.0 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 // indirect google.golang.org/grpc v1.45.0 // indirect google.golang.org/protobuf v1.28.1 // indirect diff --git a/go.sum b/go.sum index bcc7a0e47..f39f2a96b 100644 --- a/go.sum +++ b/go.sum @@ -44,7 +44,6 @@ git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGy github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= -github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= @@ -105,15 +104,10 @@ github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQh github.com/armon/go-metrics v0.3.9 h1:O2sNqxBdvq8Eq5xmzljcYzAORli6RWCvEym4cJf9m18= 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-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.32.11/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= -github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -127,20 +121,17 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= 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-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= -github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= @@ -193,12 +184,10 @@ github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 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/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -235,31 +224,34 @@ github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhY github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= 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.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/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= 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/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= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -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/drand v1.4.9 h1:WE8Jf/l+7B/rheCMCLZTp5xk0/a05t+ciwBvORq9jXM= +github.com/drand/drand v1.4.9/go.mod h1:vsmJ/kDoVLv1NC0nFihzBPmIFvMGmYtgJewzRBBRVSc= 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= -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 v1.1.10/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo= +github.com/drand/kyber v1.1.15 h1:YNL02FPOA98GmlIhh5FuEJWhz1ZCp6tOUVFN7ujBJPE= +github.com/drand/kyber v1.1.15/go.mod h1:tw0l70U6aWCkc4vDr8u/canpOOOiUNJlzsmeElhBfe0= 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= +github.com/drand/kyber-bls12381 v0.2.3 h1:wueWtqjj71wnwm6fYR8MAQk4q8bKVK9WukrGGcaVxzk= +github.com/drand/kyber-bls12381 v0.2.3/go.mod h1:FsudUZf6Xu61u/gYrDHEHf6lKIKluJdnX7WJe4hkMh4= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -276,7 +268,8 @@ github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6 github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -290,11 +283,11 @@ github.com/etclabscore/go-jsonschema-walk v0.0.6/go.mod h1:VdfDY72AFAiUhy0ZXEaWS github.com/etclabscore/go-openrpc-reflect v0.0.36 h1:kSqNB2U8RVoW4si+4fsv13NGNkRAQ5j78zTUx1qiehk= github.com/etclabscore/go-openrpc-reflect v0.0.36/go.mod h1:0404Ky3igAasAOpyj1eESjstTyneBAIk5PgJFbK4s5E= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= -github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/filecoin-project/dagstore v0.5.2 h1:Nd6oXdnolbbVhpMpkYT5PJHOjQp4OBSntHpMV5pxj3c= github.com/filecoin-project/dagstore v0.5.2/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37oOw0Tkx7+TxPt240M0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= @@ -323,8 +316,6 @@ github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082 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.15.2 h1:PzqsFr2Q/onMGKrGh7TtRT0dKsJcVJrioJJnjnKmxlk= -github.com/filecoin-project/go-data-transfer v1.15.2/go.mod h1:qXOJ3IF5dEJQHykXXTwcaRxu17bXAxr+LglXzkL6bZQ= github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc4 h1:Y5RMvFT4OthsAhDx7xKfkJ5QdiWq9Ox7N46Mi0PF0PE= github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc4/go.mod h1:1WDoUgWYB2KvogfPTdDmoyBTa9cb9+oGwqKCCipnJeY= github.com/filecoin-project/go-ds-versioning v0.1.2 h1:to4pTadv3IeV1wvgbCbN6Vqd+fu+7tveXgv/rCEZy6w= @@ -345,13 +336,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.2.2 h1:yo7Ga5qaSFfAukjyI6pdFBxzUVbQoHjKdYMpf2vMvh4= github.com/filecoin-project/go-jsonrpc v0.2.2/go.mod h1:jBSvPTl8V1N7gSTuCR4bis8wnQnIjHbRPpROol6iQKM= -github.com/filecoin-project/go-legs v0.4.4 h1:mpMmAOOnamaz0CV9rgeKhEWA8j9kMC+f+UGCGrxKaZo= -github.com/filecoin-project/go-legs v0.4.4/go.mod h1:JQ3hA6xpJdbR8euZ2rO0jkxaMxeidXf0LDnVuqPAe9s= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= 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.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-retrieval-types v1.2.0 h1:fz6DauLVP3GRg7UuW7HZ6sE+GTmaUW70DTXBF1r9cK0= 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= @@ -392,7 +382,6 @@ github.com/filecoin-project/specs-actors/v8 v8.0.1/go.mod h1:UYIPg65iPWoFw5NEftR 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/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= @@ -418,6 +407,7 @@ github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= 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= +github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -425,11 +415,10 @@ 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-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/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= @@ -467,10 +456,10 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-sql-driver/mysql v1.4.0/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-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= @@ -481,15 +470,12 @@ github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -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/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= 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= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -497,9 +483,7 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP 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/gogo/status v1.1.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg= 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= @@ -540,6 +524,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.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -591,10 +576,8 @@ github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORR github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= 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= @@ -607,16 +590,13 @@ github.com/gregdhill/go-openrpc v0.0.0-20220114144539-ae6f44720487 h1:NyaWOSkqFK github.com/gregdhill/go-openrpc v0.0.0-20220114144539-ae6f44720487/go.mod h1:a1eRkbhd3DYpRH2lnuUsVG+QMTI+v0hGnsis8C9hMrA= 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-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= 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.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/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= @@ -633,8 +613,8 @@ github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv 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-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.16.2 h1:K4ev2ib4LdQETX5cSZBG0DVLk1jwGqSPXBjdah3veNs= -github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.3.0 h1:G0ACM8Z2WilWgPv3Vdzwm3V0BQu/kSmrkVtpe1fy9do= +github.com/hashicorp/go-hclog v1.3.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -642,7 +622,6 @@ github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iP github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/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= @@ -664,16 +643,14 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/raft v1.1.1 h1:HJr7UE1x/JrJSc9Oy6aDBHtNHUUBHjcQjTgvUVihoZs= -github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft v1.3.10 h1:LR5QZX1VQd0DFWZfeCwWawyeKfpS/Tm1yjnJIY5X4Tw= +github.com/hashicorp/raft v1.3.10/go.mod h1:J8naEwc6XaaCfts7+28whSeRvCqTd6e20BlCU3LtEO4= github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea h1:xykPFhrBAS2J0VBzVa5e80b5ZtYuNQtgXjN40qBZlD4= github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= -github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= @@ -696,7 +673,6 @@ 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.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= -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/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= @@ -707,7 +683,6 @@ github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJ github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-block-format v0.1.1 h1:129vSO3zwbsYADcyQWcOYiuCpAqt462SFfqFHdFJhhI= github.com/ipfs/go-block-format v0.1.1/go.mod h1:+McEIT+g52p+zz5xGAABGSOKrzmrdX97bc0USBdWPUs= -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/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-blockservice v0.3.0/go.mod h1:P5ppi8IHDC7O+pA0AlGTF09jruB2h+oP3wVVaZl8sfk= @@ -748,9 +723,8 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH 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.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-badger2 v0.1.3 h1:Zo9JicXJ1DmXTN4KOw7oPXkspZ0AWHcAFCP1tQKnegg= +github.com/ipfs/go-ds-badger2 v0.1.3/go.mod h1:TPhhljfrgewjbtuL/tczP8dNrBYwwk+SdPYbms/NO9w= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= 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= @@ -764,8 +738,8 @@ github.com/ipfs/go-filestore v1.2.0/go.mod h1:HLJrCxRXquTeEEpde4lTLMaE/MYJZD7WHL github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= -github.com/ipfs/go-graphsync v0.14.0 h1:f5KYkc8GpwwE1BrjBOWxIkRivXIw7fVqGZlnILpvbSc= -github.com/ipfs/go-graphsync v0.14.0/go.mod h1:1LDVVnNHjit8ddJOtw3Jq9epP792xWFXXL3dJWIBIkM= +github.com/ipfs/go-graphsync v0.14.3 h1:IXH9S7AraMQ0J6Fzcl8rqSPqLn+es33bD8OW2KNyU/o= +github.com/ipfs/go-graphsync v0.14.3/go.mod h1:yT0AfjFgicOoWdAlUJ96tQ5AkuGI4r1taIQX/aHbBQo= 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= @@ -777,10 +751,8 @@ github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtL github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= -github.com/ipfs/go-ipfs-cmds v0.7.0 h1:0lEldmB7C83RxIOer38Sv1ob6wIoCAIEOaxiYgcv7wA= -github.com/ipfs/go-ipfs-cmds v0.7.0/go.mod h1:y0bflH6m4g6ary4HniYt98UqbrVnRxmRarzeMdLIUn0= -github.com/ipfs/go-ipfs-config v0.18.0 h1:Ta1aNGNEq6RIvzbw7dqzCVZJKb7j+Dd35JFnAOCpT8g= -github.com/ipfs/go-ipfs-config v0.18.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= +github.com/ipfs/go-ipfs-cmds v0.8.2 h1:WmehvYWkxch8dTw0bdF51R8lqbyl+3H8e6pIACzT/ds= +github.com/ipfs/go-ipfs-cmds v0.8.2/go.mod h1:/b17Davff0E0Wh/hhXsN1Pgxxbkm26k3PV+G4EDiC/s= 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= @@ -799,18 +771,16 @@ github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uY github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= -github.com/ipfs/go-ipfs-files v0.1.1 h1:/MbEowmpLo9PJTEQk16m9rKzUHjeP4KRU9nWJyJO324= -github.com/ipfs/go-ipfs-files v0.1.1/go.mod h1:8xkIrMWH+Y5P7HvJ4Yc5XWwIW2e52dyXUiC0tZyjDbM= -github.com/ipfs/go-ipfs-http-client v0.4.0 h1:LNuVbFoKfCohCmcNImml3byM3PpTxTT7RPrv/UoDFkI= -github.com/ipfs/go-ipfs-http-client v0.4.0/go.mod h1:NXzPUKt/QVCuR74a8angJCGOSLPImNi5LqaTxIep/70= +github.com/ipfs/go-ipfs-files v0.3.0 h1:fallckyc5PYjuMEitPNrjRfpwl7YFt69heCOUhsbGxQ= +github.com/ipfs/go-ipfs-files v0.3.0/go.mod h1:xAUtYMwB+iu/dtf6+muHNSFQCJG2dSiStR2P6sn9tIM= +github.com/ipfs/go-ipfs-http-client v0.5.0 h1:Nisy9655Ru4PQn4+wM+rhzyTBg4ATvqgTq2jPNKrCzE= +github.com/ipfs/go-ipfs-http-client v0.5.0/go.mod h1:RUXNIL5dbEIngUWPXpNQjeFkBuqwwc5NZVD3bdgg5L4= 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/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE= github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4= -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/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc= @@ -855,10 +825,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/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= +github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= 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= @@ -870,10 +839,8 @@ github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fG github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= -github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-path v0.3.0 h1:tkjga3MtpXyM5v+3EbRvOHEoo+frwi4oumw5K+KYWyA= github.com/ipfs/go-path v0.3.0/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= -github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= @@ -888,17 +855,17 @@ github.com/ipfs/go-unixfsnode v1.5.2/go.mod h1:NlOebRwYx8lMCNMdhAhEspYPBD3obp7TE github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= github.com/ipfs/go-verifcid v0.0.2 h1:XPnUv0XmdH+ZIhLGKg6U2vaPaRDXb9urMyNVCE7uvTs= github.com/ipfs/go-verifcid v0.0.2/go.mod h1:40cD9x1y4OWnFXbLNJYRe7MpNvWlMn3LZAG5Wb4xnPU= -github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= -github.com/ipfs/interface-go-ipfs-core v0.10.0 h1:b/psL1oqJcySdQAsIBfW5ZJJkOAsYlhWtC0/Qvr4WiM= -github.com/ipfs/interface-go-ipfs-core v0.10.0/go.mod h1:F3EcmDy53GFkF0H3iEJpfJC320fZ/4G60eftnItrrJ0= +github.com/ipfs/interface-go-ipfs-core v0.11.1 h1:xVW8DKzd230h8bPv+oC2fBjW4PtDGqGtvpX64/aBe48= +github.com/ipfs/interface-go-ipfs-core v0.11.1/go.mod h1:xmnoccUXY7N/Q8AIx0vFqgW926/FAZ8+do/1NTEHKsU= github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= -github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= +github.com/ipfs/iptb-plugins v0.5.0 h1:zEMLlWAb531mLpD36KFy/yc0egT6FkBEHQtdERexNao= +github.com/ipfs/kubo v0.18.1 h1:mF8n2toZkWRc1JXs4pGknqoDGJ9NfP+upy/a8OS3oNg= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.5.0 h1:kcCEa3CvYMs0iE5BzD5sV7O2EwMiCIp3uF8tA6APQT8= github.com/ipld/go-car v0.5.0/go.mod h1:ppiN5GWpjOZU9PgpAZ9HbZd9ZgSpwPMr48fGRJOWmvE= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= -github.com/ipld/go-car/v2 v2.5.0 h1:S9h7A6qBAJ+B1M1jIKtau+HPDe30UbM71vsyBzwvRIE= -github.com/ipld/go-car/v2 v2.5.0/go.mod h1:jKjGOqoCj5zn6KjnabD6JbnCsMntqU2hLiU6baZVO3E= +github.com/ipld/go-car/v2 v2.7.0 h1:OFxJl6X6Ii7y7wYX4R+P8q9+vuz4vaY2Y9u1GHzfxbE= +github.com/ipld/go-car/v2 v2.7.0/go.mod h1:qoqfgPnQYcaAYcfphctffdaNWJIWBR2QN4pjuKUtgao= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-codec-dagpb v1.5.0 h1:RspDRdsJpLfgCI0ONhTAnbHdySGD4t+LHSPK4X1+R0k= @@ -914,14 +881,14 @@ github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD github.com/ipld/go-ipld-prime v0.20.0 h1:Ud3VwE9ClxpO2LkCYP7vWPc0Fo+dYdYzgxUJZ3uRG4g= github.com/ipld/go-ipld-prime v0.20.0/go.mod h1:PzqZ/ZR981eKbgdr3y2DJYeD/8bgMawdGVlJDE8kK+M= 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-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo= 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/ipni/index-provider v0.10.0 h1:nu8YBxzRopdjwZHsgCUuC4AHpq88VVHJYrbkqUDx7eg= -github.com/ipni/index-provider v0.10.0/go.mod h1:InSXbZp2p/ZhAwiDElG/wzjnA1ea1iJ3hhyiAHrD+Vo= -github.com/ipni/storetheindex v0.5.3-0.20221203123030-16745cb63f15 h1:qJq6QtLk+9nQi3CDBhNfJ1cjZ4pghjCHcQUZ1mWbF0k= -github.com/ipni/storetheindex v0.5.3-0.20221203123030-16745cb63f15/go.mod h1:c/NS640Iu2NrCCIErnUhsUM5KVEyeXymgtNnx6eDwMU= +github.com/ipni/index-provider v0.11.0 h1:q2PdK6JpYB9bzlntfkRYNBjhg4Qtko5+iXRonO88TAg= +github.com/ipni/index-provider v0.11.0/go.mod h1:gB/wN4Mdz4MzikQubjyRRV97iS5BkD4FKB0U/bF/dY4= +github.com/ipni/storetheindex v0.5.10 h1:r97jIZsXPuwQvePJQuStu2a/kn+Zn8X4MAdA0rU2Pu4= +github.com/ipni/storetheindex v0.5.10/go.mod h1:SJKFCnSx4X/4ekQuZvq8pVU/7tmxkEv632Qmgu3m2bQ= 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= @@ -944,22 +911,16 @@ github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M 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/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/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg= 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= -github.com/jsimonetti/rtnetlink v0.0.0-20190830100107-3784a6c7c552/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= -github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -975,29 +936,29 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/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.10.12/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/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= +github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= 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= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM= github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.1 h1:U33DW0aiEj633gHYw3LoDNfkDiYnE5Q8M/TKJn2f2jI= -github.com/klauspost/cpuid/v2 v2.2.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/koalacxr/quantile v0.0.1 h1:wAW+SQ286Erny9wOjVww96t8ws+x5Zj6AKHDULUK+o0= github.com/koalacxr/quantile v0.0.1/go.mod h1:bGN/mCZLZ4lrSDHRQ6Lglj9chowGux8sGUIND+DQeD0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1005,7 +966,6 @@ 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/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs= github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -1024,64 +984,45 @@ github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= 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/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/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -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/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= 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.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= 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.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= -github.com/libp2p/go-libp2p v0.25.1 h1:YK+YDCHpYyTvitKWVxa5PfElgIpOONU01X5UcLEwJGA= -github.com/libp2p/go-libp2p v0.25.1/go.mod h1:xnK9/1d9+jeQCVvi/f1g12KqtVi/jP/SijtKV1hML3g= -github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= +github.com/libp2p/go-libp2p v0.26.0 h1:0FE0bP9/G9YADjruqoFvf1snBBFvrdh1MmTuEeUkl2E= +github.com/libp2p/go-libp2p v0.26.0/go.mod h1:R8N+XhwPDPLNb4TKboKJKnDeg9vPw8+zlC6g793dTGw= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= -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= github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= -github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg= -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.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= -github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= -github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= -github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= -github.com/libp2p/go-libp2p-connmgr v0.4.0 h1:q/KZUS1iMDIQckMZarMYwhQisJqiFPHAVC1c4DR3hDE= -github.com/libp2p/go-libp2p-connmgr v0.4.0/go.mod h1:exFQQm19PFAx+QuJmBPw4MM58QejzPJRFFFYnNmgi2w= github.com/libp2p/go-libp2p-consensus v0.0.1 h1:jcVbHRZLwTXU9iT/mPi+Lx4/OrIzq3bU1TbZNhYFCV8= github.com/libp2p/go-libp2p-consensus v0.0.1/go.mod h1:+9Wrfhc5QOqWB0gXI0m6ARlkHfdJpcFXmRU0WoHz4Mo= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= @@ -1101,48 +1042,26 @@ github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqe github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.6.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= 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/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/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.20.1 h1:fQz4BJyIFmSZAiTbKV8qoYhEH5Dtv/cVhZbG3Ib/+Cw= -github.com/libp2p/go-libp2p-core v0.20.1/go.mod h1:6zR8H7CvQWgYLsbG4on6oLNSGcyKaYFSEYyDt51+bIY= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= -github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2TUSBHFlOCetzYdbZL5I= github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= -github.com/libp2p/go-libp2p-gorpc v0.4.0 h1:kxHg5C3IuXeOq5FHPGbMHwQzKDlTVeB/NDr0ndc8J/g= -github.com/libp2p/go-libp2p-gorpc v0.4.0/go.mod h1:jux2Mb6BfUE1n58KbVCmWtqvpiZo0DDaKobKInf4s5o= -github.com/libp2p/go-libp2p-gostream v0.3.1/go.mod h1:1V3b+u4Zhaq407UUY9JLCpboaeufAeVQbnvAt12LRsI= -github.com/libp2p/go-libp2p-gostream v0.5.0 h1:niNGTUrFoUDP/8jxMgu97zngMO+UGYBpVpbCKwIJBls= -github.com/libp2p/go-libp2p-gostream v0.5.0/go.mod h1:rXrb0CqfcRRxa7m3RSKORQiKiWgk3IPeXWda66ZXKsA= -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= -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-gorpc v0.5.0 h1:mmxxAPdP3JzpYH4KcDf4csXnqtd1HazLPfdyB2MBRb8= +github.com/libp2p/go-libp2p-gorpc v0.5.0/go.mod h1:GpHuvY3m0YFkd0+inOGo4HDtc4up9OS/mBPXvEpNuRY= +github.com/libp2p/go-libp2p-gostream v0.6.0 h1:QfAiWeQRce6pqnYfmIVWJFXNdDyfiR/qkCnjyaZUPYU= +github.com/libp2p/go-libp2p-gostream v0.6.0/go.mod h1:Nywu0gYZwfj7Jc91PQvbGU8dIpqbQQkjWgDuOrFaRdA= github.com/libp2p/go-libp2p-kad-dht v0.21.0 h1:J0Yd22VA+sk0CJRGMgtfHvLVIkZDyJ3AJGiljywIw5U= github.com/libp2p/go-libp2p-kad-dht v0.21.0/go.mod h1:Bhm9diAFmc6qcWAr084bHNL159srVZRKADdp96Qqd1I= github.com/libp2p/go-libp2p-kbucket v0.5.0 h1:g/7tVm8ACHDxH29BGrpsQlnNeu+6OF1A9bno/4/U1oA= github.com/libp2p/go-libp2p-kbucket v0.5.0/go.mod h1:zGzGCpQd78b5BNTDGHNDLaTt9aDK/A02xeZp9QeFC4U= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= github.com/libp2p/go-libp2p-loggables v0.1.0/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= github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= @@ -1152,21 +1071,9 @@ 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= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= -github.com/libp2p/go-libp2p-noise v0.5.0 h1:gwJZ/3iH3MRnBrLIyr/YLdCOnmqfJMptlsFFUIc3j0Y= -github.com/libp2p/go-libp2p-noise v0.5.0/go.mod h1:CYYpJ+T4pox1d1J/hhUVxuMf6b2s3c41hFUgS8/yFQw= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -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= -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.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= @@ -1174,44 +1081,27 @@ github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRj github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= 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.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= -github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= -github.com/libp2p/go-libp2p-peerstore v0.8.0 h1:bzTG693TA1Ju/zKmUCQzDLSqiJnyRFVwPpuloZ/OZtI= -github.com/libp2p/go-libp2p-peerstore v0.8.0/go.mod h1:9geHWmNA3YDlQBjL/uPEJD6vpDK12aDNlUNHJ6kio/s= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= -github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= -github.com/libp2p/go-libp2p-pubsub v0.8.2 h1:QLGUmkgKmwEVxVDYGsqc5t9CykOMY2Y21cXQHjR462I= -github.com/libp2p/go-libp2p-pubsub v0.8.2/go.mod h1:e4kT+DYjzPUYGZeWk4I+oxCSYTXizzXii5LDRRhjKSw= +github.com/libp2p/go-libp2p-pubsub v0.9.0 h1:mcLb4WzwhUG4OKb0rp1/bYMd/DYhvMyzJheQH3LMd1s= +github.com/libp2p/go-libp2p-pubsub v0.9.0/go.mod h1:OEsj0Cc/BpkqikXRTrVspWU/Hx7bMZwHP+6vNMd+c7I= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= -github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= -github.com/libp2p/go-libp2p-raft v0.1.8 h1:Fq0aWHbbhi6WJXf+yaOQeMzV+9UgkbHIIGyaJbH3vpo= -github.com/libp2p/go-libp2p-raft v0.1.8/go.mod h1:+YDisn3uszb7vxshLgKoDdRGs79WSbHRgrOdrYqDPk4= -github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= +github.com/libp2p/go-libp2p-raft v0.4.0 h1:2atEs7/FWH35bRiLh8gTejGh5NA9u4eG7BXjpf/B+Z4= +github.com/libp2p/go-libp2p-raft v0.4.0/go.mod h1:qJCYtFBTbip2wngLxFeAb9o52XmAPi2vSIQ4hV7IpSA= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing-helpers v0.4.0 h1:b7y4aixQ7AwbqYfcOQ6wTw8DQvuRZeTAA0Od3YYN5yc= github.com/libp2p/go-libp2p-routing-helpers v0.4.0/go.mod h1:dYEAgkVhqho3/YKxfOEGdFMIcWfAFNlZX8iAIihYA2E= -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.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.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.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.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-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= github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1220,28 +1110,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/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= -github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= -github.com/libp2p/go-libp2p-tls v0.5.0 h1:aRNTeOI8Ljm1r4L2uMGxkMsVnyZoPwaqQqMw23qAsQs= -github.com/libp2p/go-libp2p-tls v0.5.0/go.mod h1:1a4tq0xQSZ0kAkDkZVAppuP3SAIUHcnzi2djJ/2EN4I= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -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.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-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= -github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= @@ -1250,16 +1124,12 @@ github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhL github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= -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= github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= 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= @@ -1269,7 +1139,6 @@ 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-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= @@ -1290,38 +1159,26 @@ github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO 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 v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k= 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.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= 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/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.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= github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= 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/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= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -1330,20 +1187,14 @@ github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ 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/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/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ= github.com/libp2p/go-yamux/v4 v4.0.0/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= -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.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/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= @@ -1359,25 +1210,24 @@ github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= 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-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/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= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.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/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -1386,24 +1236,15 @@ github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRR github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= -github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= -github.com/mdlayher/netlink v0.0.0-20190828143259-340058475d09/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= -github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= -github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY= -github.com/mdlayher/wifi v0.0.0-20190303161829-b1436901ddee/go.mod h1:Evt/EIne46u9PtQbeTx2NTcqURpr5K4SvKtGmBuDPN8= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= @@ -1461,7 +1302,6 @@ github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= 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.8.0 h1:aqjksEcqK+iD/Foe1RRFsGZh8+XFiGo7FgUCZlpv3LU= github.com/multiformats/go-multiaddr v0.8.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -1499,11 +1339,8 @@ github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJ github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= @@ -1526,13 +1363,12 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= -github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy8ALwOebjekYExl9HTT9urdawqC95tA= -github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= +github.com/nikkolasg/hexjson v0.1.0 h1:Cgi1MSZVQFoJKYeRpBNEcdF3LB+Zo4fYKsDz7h8uJYQ= +github.com/nikkolasg/hexjson v0.1.0/go.mod h1:fbGbWFZ0FmJMFbpCMtJpwb0tudVxSSZ+Es2TsCg57cA= 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= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -1542,8 +1378,6 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W 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/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo/v2 v2.5.1 h1:auzK7OI497k6x4OvWq+TKAcpcSAlod0doAH72oIN0Jw= github.com/onsi/ginkgo/v2 v2.5.1/go.mod h1:63DOGlLAH8+REH8jUGdL3YpCpu7JODesutUjdENfUAc= @@ -1553,20 +1387,15 @@ github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= 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/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/onsi/gomega v1.24.0 h1:+0glovB9Jd6z3VR+ScSwQqXVTIfJcGA9UBM8yzQxhqg= 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-grpc v0.0.0-20210225150812-73cb765af46e h1:4cPxUYdgaGzZIT5/j0IfqOrrXmq6bG8AwvwisMXpdrg= 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= @@ -1601,8 +1430,9 @@ 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/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4= +github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= 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= @@ -1611,9 +1441,7 @@ github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= @@ -1634,15 +1462,12 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -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/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1650,9 +1475,7 @@ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -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/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= @@ -1661,19 +1484,16 @@ 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/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-18 v0.2.0 h1:5ViXqBZ90wpUcZS0ge79rf029yx0dYB0McyPJwqqj7U= -github.com/quic-go/qtls-go1-18 v0.2.0/go.mod h1:moGulGHK7o6O8lSPSZNoOwcLvJKJ85vVNc7oJFD65bc= -github.com/quic-go/qtls-go1-19 v0.2.0 h1:Cvn2WdhyViFUHoOqK52i51k4nDX8EwIh5VJiVM4nttk= -github.com/quic-go/qtls-go1-19 v0.2.0/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.1.0 h1:d1PK3ErFy9t7zxKsG3NXBJXZjp/kMLoIb3y/kV54oAI= -github.com/quic-go/qtls-go1-20 v0.1.0/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= -github.com/quic-go/quic-go v0.32.0 h1:lY02md31s1JgPiiyfqJijpu/UX/Iun304FI3yUqX7tA= -github.com/quic-go/quic-go v0.32.0/go.mod h1:/fCsKANhQIeD5l76c2JFU+07gVE3KaA0FP+0zMWwfwo= +github.com/quic-go/qtls-go1-19 v0.2.1 h1:aJcKNMkH5ASEJB9FXNeZCyTEIHU1J7MmHyz1Q1TSG1A= +github.com/quic-go/qtls-go1-19 v0.2.1/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= +github.com/quic-go/qtls-go1-20 v0.1.1 h1:KbChDlg82d3IHqaj2bn6GfKRj84Per2VGf5XV3wSwQk= +github.com/quic-go/qtls-go1-20 v0.1.1/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= +github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0= +github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA= github.com/quic-go/webtransport-go v0.5.1 h1:1eVb7WDWCRoaeTtFHpFBJ6WDN1bSrPrRoW6tZgSw0Ow= github.com/quic-go/webtransport-go v0.5.1/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= 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/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -1697,9 +1517,7 @@ github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0 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= @@ -1726,26 +1544,27 @@ github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go. 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= -github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745/go.mod h1:G81aIFAMS9ECrwBYR9YxhlPjWgrItd+Kje78O6+uqm8= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 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/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 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/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/assertions v1.13.0 h1:Dx1kYM01xsSqKPno3aqLnrwac2LetPvN23diwyr69Qs= 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/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= +github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFCbQYJ3KJlPs/FvPz2dy1tkpxyeNESVyCNNzRXFR0= 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= @@ -1779,6 +1598,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= @@ -1788,7 +1608,6 @@ github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45 github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= -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= @@ -1799,26 +1618,19 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1 github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twmb/murmur3 v1.1.6 h1:mqrRot1BRxm+Yct+vavLMou2/iJt0tNVTTC0QoIjaZg= github.com/twmb/murmur3 v1.1.6/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= -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/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.1.13/go.mod h1:jxau1n+/wyTGLQoCkjok9r5zFa/FxT6eI5HiHKQszjc= github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.1.13/go.mod h1:oNVt3Dq+FO91WNQ/9JnHKQP2QJxTzoN7wCBFCq1OeuU= github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= 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/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/cli/v2 v2.16.3 h1:gHoFIwpPjoyIMbJp/VFd+/vuD0dAgFK4B6DpEMFJfQk= github.com/urfave/cli/v2 v2.16.3/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -1831,12 +1643,11 @@ github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2r github.com/warpfork/go-testmark v0.11.0 h1:J6LnV8KpceDvo7spaNU4+DauH2n1x+6RaO2rJrmpQ9U= 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/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= +github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/weaveworks/common v0.0.0-20220810113439-c65105d60b18 h1:JN4YR/TNWiZEAHHImrVA2u4DPI+aqPOar23ICUnYZTQ= 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/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= @@ -1855,8 +1666,8 @@ 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-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20221220214510-0333c149dec0 h1:obKzQ1ey5AJg5NKjgtTo/CKwLImVP4ETLRcsmzFJ4Qw= -github.com/whyrusleeping/cbor-gen v0.0.0-20221220214510-0333c149dec0/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa h1:EyA027ZAkuaCLoxVX4r1TZMPy1d31fM6hbfQ4OU4I5o= +github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= @@ -1871,8 +1682,6 @@ github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84 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/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= -github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -1906,8 +1715,7 @@ go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI 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/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1923,8 +1731,8 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= 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.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4= -go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE= +go.opentelemetry.io/otel v1.12.0 h1:IgfC7kqQrRccIKuB7Cl+SRUmsKbEwSGPr0Eu+/ht1SQ= +go.opentelemetry.io/otel v1.12.0/go.mod h1:geaoz0L0r1BEOR81k7/n9W4TCXYCJ7bPO7K374jQHG0= go.opentelemetry.io/otel/bridge/opencensus v0.33.0 h1:DnSFYr/VxUVwkHL0UoaMcxx74Jugb1HO0B08cYBmi0c= go.opentelemetry.io/otel/bridge/opencensus v0.33.0/go.mod h1:gylOY4P2e7kPYc6T9M8XfQ5+RK4+evGorTOOy+gO4Nc= go.opentelemetry.io/otel/exporters/jaeger v1.2.0 h1:C/5Egj3MJBXRJi22cSl07suqPqtZLnLFmH//OxETUEc= @@ -1941,16 +1749,14 @@ go.opentelemetry.io/otel/sdk/metric v0.33.0 h1:oTqyWfksgKoJmbrs2q7O7ahkJzt+Ipeki go.opentelemetry.io/otel/sdk/metric v0.33.0/go.mod h1:xdypMeA21JBOvjjzDUtD0kzIcHO/SPez+a8HOzJPGp0= 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.11.1 h1:ofxdnzsNrGBYXbP7t7zpUK281+go5rF7dvdIZXF8gdQ= -go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk= +go.opentelemetry.io/otel/trace v1.12.0 h1:p28in++7Kd0r2d8gSt931O57fdjUyWxkVbESuILAeUc= +go.opentelemetry.io/otel/trace v1.12.0/go.mod h1:pHlgBynn6s25qJ2szD+Bv+iwKJttjHSI3lUAyf0GNuQ= 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= 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/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/dig v1.15.0 h1:vq3YWr8zRj1eFGC7Gvf907hE0eRjPTZ1d3xHadD6liE= @@ -1958,7 +1764,6 @@ go.uber.org/dig v1.15.0/go.mod h1:pKHs0wMynzL6brANhB2hLMro+zalv1osARTviTcqHLM= go.uber.org/fx v1.18.2 h1:bUNI6oShr+OVFQeU8cDNbnN7VFsu+SsjHzUF51V/GAU= go.uber.org/fx v1.18.2/go.mod h1:g0V1KMQ66zIRk8bLu3Ea5Jt2w/cHlOIp4wdRsgh0JaY= 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/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -1967,15 +1772,14 @@ go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+ 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/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= 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= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= @@ -1991,7 +1795,6 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -2009,7 +1812,6 @@ golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-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= @@ -2021,10 +1823,10 @@ 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-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= 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-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= +golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -2038,8 +1840,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= -golang.org/x/exp v0.0.0-20221205204356-47842c84f3db h1:D/cFflL63o2KSLJIwjlcIt8PR064j/xsmdEJL/YvY/o= -golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230129154200-a960b3787bd2 h1:5sPMf9HJXrvBWIamTw+rTST0bZ3Mho2n1p58M0+W99c= +golang.org/x/exp v0.0.0-20230129154200-a960b3787bd2/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -2096,9 +1898,7 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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-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= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2115,7 +1915,6 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201022231255-08b38378de70/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -2124,15 +1923,13 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 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= @@ -2178,15 +1975,12 @@ golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2195,19 +1989,16 @@ 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-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-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-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= @@ -2217,7 +2008,6 @@ golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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= @@ -2235,9 +2025,8 @@ golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2250,26 +2039,28 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w 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= 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-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 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= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2278,8 +2069,8 @@ 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/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 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= @@ -2328,7 +2119,6 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200216192241-b320d3a0f5a2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= @@ -2342,7 +2132,6 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY 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-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/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -2384,7 +2173,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -2422,7 +2210,6 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 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= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= diff --git a/lib/consensus/raft/raft.go b/lib/consensus/raft/raft.go index 9cfd41a4a..8ff93caf2 100644 --- a/lib/consensus/raft/raft.go +++ b/lib/consensus/raft/raft.go @@ -8,6 +8,7 @@ import ( "path/filepath" "time" + "github.com/hashicorp/go-hclog" hraft "github.com/hashicorp/raft" raftboltdb "github.com/hashicorp/raft-boltdb" "github.com/ipfs/go-log/v2" @@ -156,7 +157,7 @@ func (rw *raftWrapper) makeStores() error { snapstore, err := hraft.NewFileSnapshotStoreWithLogger( df, RaftMaxSnapshots, - zap.NewStdLog(log.Logger("raft-snapshot").SugaredLogger.Desugar()), + hclog.FromStandardLogger(zap.NewStdLog(log.Logger("raft-snapshot").SugaredLogger.Desugar()), hclog.DefaultOptions), ) if err != nil { return err diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index dc4e60878..3f9a6a989 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -41,10 +41,15 @@ func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHo } ipds := namespace.Wrap(args.Datastore, datastore.NewKey("/index-provider")) + addrs := marketHost.Addrs() + addrsString := make([]string, 0, len(addrs)) + for _, addr := range addrs { + addrsString = append(addrsString, addr.String()) + } var opts = []engine.Option{ engine.WithDatastore(ipds), engine.WithHost(marketHost), - engine.WithRetrievalAddrs(marketHost.Addrs()...), + engine.WithRetrievalAddrs(addrsString...), engine.WithEntriesCacheCapacity(cfg.EntriesCacheCapacity), engine.WithChainedEntries(cfg.EntriesChunkSize), engine.WithTopicName(topicName), From b77f2f09abec812055b7ca3e9cb48014085fe00d Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 8 Mar 2023 14:29:08 +1300 Subject: [PATCH 010/129] update minimum Go version to 1.19.7 --- .circleci/config.yml | 4 ++-- GO_VERSION_MIN | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 93019df5c..655b8c92e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,12 +7,12 @@ executors: golang: docker: # Must match GO_VERSION_MIN in project root - - image: cimg/go:1.18.8 + - image: cimg/go:1.19.7 resource_class: medium+ golang-2xl: docker: # Must match GO_VERSION_MIN in project root - - image: cimg/go:1.18.8 + - image: cimg/go:1.19.7 resource_class: 2xlarge ubuntu: docker: diff --git a/GO_VERSION_MIN b/GO_VERSION_MIN index 1a31d398c..98adfe8e1 100644 --- a/GO_VERSION_MIN +++ b/GO_VERSION_MIN @@ -1 +1 @@ -1.18.8 +1.19.7 From db6efe65127c05b016fb9550b6a3dee2d4c953f0 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 8 Mar 2023 17:17:56 +1300 Subject: [PATCH 011/129] use go-libipfs/files instead of ipfs/go-ipfs-files --- go.mod | 2 +- itests/kit/deals.go | 2 +- itests/kit/files.go | 2 +- lib/unixfs/filestore.go | 2 +- lib/unixfs/filestore_test.go | 6 +++--- node/impl/client/client.go | 2 +- node/impl/client/client_test.go | 8 ++++---- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index d077853a9..d446a892e 100644 --- a/go.mod +++ b/go.mod @@ -90,7 +90,6 @@ require ( github.com/ipfs/go-ipfs-ds-help v1.1.0 github.com/ipfs/go-ipfs-exchange-interface v0.2.0 github.com/ipfs/go-ipfs-exchange-offline v0.3.0 - github.com/ipfs/go-ipfs-files v0.3.0 github.com/ipfs/go-ipfs-http-client v0.5.0 github.com/ipfs/go-ipfs-routing v0.3.0 github.com/ipfs/go-ipfs-util v0.0.2 @@ -237,6 +236,7 @@ require ( github.com/ipfs/go-filestore v1.2.0 // indirect github.com/ipfs/go-ipfs-cmds v0.8.2 // indirect github.com/ipfs/go-ipfs-delay v0.0.1 // indirect + github.com/ipfs/go-ipfs-files v0.3.0 // indirect github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect github.com/ipfs/go-ipfs-pq v0.0.3 // indirect github.com/ipfs/go-ipld-legacy v0.1.1 // indirect diff --git a/itests/kit/deals.go b/itests/kit/deals.go index 1f3a7dfb5..39b7857d7 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -10,8 +10,8 @@ import ( "time" "github.com/ipfs/go-cid" - files "github.com/ipfs/go-ipfs-files" ipld "github.com/ipfs/go-ipld-format" + "github.com/ipfs/go-libipfs/files" dag "github.com/ipfs/go-merkledag" dstest "github.com/ipfs/go-merkledag/test" unixfile "github.com/ipfs/go-unixfs/file" diff --git a/itests/kit/files.go b/itests/kit/files.go index 3fa8a5f4d..dbf7d2cd7 100644 --- a/itests/kit/files.go +++ b/itests/kit/files.go @@ -17,8 +17,8 @@ import ( bstore "github.com/ipfs/go-ipfs-blockstore" chunk "github.com/ipfs/go-ipfs-chunker" offline "github.com/ipfs/go-ipfs-exchange-offline" - files "github.com/ipfs/go-ipfs-files" ipldformat "github.com/ipfs/go-ipld-format" + "github.com/ipfs/go-libipfs/files" "github.com/ipfs/go-merkledag" "github.com/ipfs/go-unixfs/importer/balanced" ihelper "github.com/ipfs/go-unixfs/importer/helpers" diff --git a/lib/unixfs/filestore.go b/lib/unixfs/filestore.go index 3a3da418d..acd0a62ac 100644 --- a/lib/unixfs/filestore.go +++ b/lib/unixfs/filestore.go @@ -13,8 +13,8 @@ import ( bstore "github.com/ipfs/go-ipfs-blockstore" chunker "github.com/ipfs/go-ipfs-chunker" offline "github.com/ipfs/go-ipfs-exchange-offline" - files "github.com/ipfs/go-ipfs-files" ipld "github.com/ipfs/go-ipld-format" + "github.com/ipfs/go-libipfs/files" "github.com/ipfs/go-merkledag" "github.com/ipfs/go-unixfs/importer/balanced" ihelper "github.com/ipfs/go-unixfs/importer/helpers" diff --git a/lib/unixfs/filestore_test.go b/lib/unixfs/filestore_test.go index 9fe6c228a..f9d5ed656 100644 --- a/lib/unixfs/filestore_test.go +++ b/lib/unixfs/filestore_test.go @@ -13,7 +13,7 @@ import ( "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" offline "github.com/ipfs/go-ipfs-exchange-offline" - files "github.com/ipfs/go-ipfs-files" + "github.com/ipfs/go-libipfs/files" "github.com/ipfs/go-merkledag" unixfile "github.com/ipfs/go-unixfs/file" carv2 "github.com/ipld/go-car/v2" @@ -25,7 +25,7 @@ import ( // This test uses a full "dense" CARv2, and not a filestore (positional mapping). func TestRoundtripUnixFS_Dense(t *testing.T) { - //stm: @CLIENT_DATA_IMPORT_002 + // stm: @CLIENT_DATA_IMPORT_002 ctx := context.Background() inputPath, inputContents := genInputFile(t) @@ -74,7 +74,7 @@ func TestRoundtripUnixFS_Dense(t *testing.T) { } func TestRoundtripUnixFS_Filestore(t *testing.T) { - //stm: @CLIENT_DATA_IMPORT_001 + // stm: @CLIENT_DATA_IMPORT_001 ctx := context.Background() inputPath, inputContents := genInputFile(t) diff --git a/node/impl/client/client.go b/node/impl/client/client.go index 106b095b1..e45d537e2 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -17,8 +17,8 @@ import ( "github.com/ipfs/go-cid" bstore "github.com/ipfs/go-ipfs-blockstore" offline "github.com/ipfs/go-ipfs-exchange-offline" - files "github.com/ipfs/go-ipfs-files" format "github.com/ipfs/go-ipld-format" + "github.com/ipfs/go-libipfs/files" logging "github.com/ipfs/go-log/v2" "github.com/ipfs/go-merkledag" unixfile "github.com/ipfs/go-unixfs/file" diff --git a/node/impl/client/client_test.go b/node/impl/client/client_test.go index 7c96897c5..98092bc93 100644 --- a/node/impl/client/client_test.go +++ b/node/impl/client/client_test.go @@ -16,7 +16,7 @@ import ( dssync "github.com/ipfs/go-datastore/sync" blockstore "github.com/ipfs/go-ipfs-blockstore" offline "github.com/ipfs/go-ipfs-exchange-offline" - files "github.com/ipfs/go-ipfs-files" + "github.com/ipfs/go-libipfs/files" "github.com/ipfs/go-merkledag" unixfile "github.com/ipfs/go-unixfs/file" "github.com/ipld/go-car" @@ -32,7 +32,7 @@ import ( var testdata embed.FS func TestImportLocal(t *testing.T) { - //stm: @CLIENT_STORAGE_DEALS_IMPORT_LOCAL_001, @CLIENT_RETRIEVAL_FIND_001 + // stm: @CLIENT_STORAGE_DEALS_IMPORT_LOCAL_001, @CLIENT_RETRIEVAL_FIND_001 ds := dssync.MutexWrap(datastore.NewMapDatastore()) dir := t.TempDir() im := imports.NewManager(ds, dir) @@ -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 5b5ea083ce421a411f7779053ce01c60a1bdf02b Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 8 Mar 2023 17:24:48 +1300 Subject: [PATCH 012/129] fix drand test --- chain/beacon/drand/drand_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/beacon/drand/drand_test.go b/chain/beacon/drand/drand_test.go index e2819f4e9..a65f4399b 100644 --- a/chain/beacon/drand/drand_test.go +++ b/chain/beacon/drand/drand_test.go @@ -24,7 +24,7 @@ func TestPrintGroupInfo(t *testing.T) { }) chain, err := cg.FetchChainInfo(nil) assert.NoError(t, err) - err = chain.ToJSON(os.Stdout) + err = chain.ToJSON(os.Stdout, nil) assert.NoError(t, err) } From 2c6d025ab3ea0835828ee03921741db2a50c8a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 8 Mar 2023 15:47:09 +0100 Subject: [PATCH 013/129] un-un-update filecoin-ffi --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 7efaa7b47..88dc4c4ce 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 7efaa7b47fe9d4bdb4ba0b2a0fafa4e573864ee5 +Subproject commit 88dc4c4ceb322337818b6508c8e9c23948f36cb1 From d114d8fe7e5a8208bf540a66454ddd6f9e5b1589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 8 Mar 2023 16:49:18 +0100 Subject: [PATCH 014/129] deprecate MarketListRetrievalDeals, make gen --- .circleci/template.yml | 4 +- api/api_storage.go | 8 +- api/cbor_gen.go | 456 +++--- api/proxy_gen.go | 10 +- build/openrpc/miner.json.gz | Bin 16043 -> 15861 bytes chain/sub/incoming.go | 2 +- chain/sub/incoming_test.go | 2 +- chain/types/cbor_gen.go | 18 +- cmd/lotus-miner/info_all.go | 5 - cmd/lotus-miner/retrieval-deals.go | 44 - conformance/chaos/cbor_gen.go | 10 +- documentation/en/api-v0-methods-miner.md | 44 +- documentation/en/cli-lotus-miner.md | 14 - node/hello/cbor_gen.go | 6 +- node/impl/storminer.go | 16 +- paychmgr/cbor_gen.go | 506 +++---- storage/pipeline/cbor_gen.go | 1740 +++++++++++----------- storage/sealer/cbor_gen.go | 192 +-- storage/sealer/storiface/cbor_gen.go | 110 +- 19 files changed, 1539 insertions(+), 1648 deletions(-) diff --git a/.circleci/template.yml b/.circleci/template.yml index 133984c39..32f50c161 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -7,12 +7,12 @@ executors: golang: docker: # Must match GO_VERSION_MIN in project root - - image: cimg/go:1.18.8 + - image: cimg/go:1.19.7 resource_class: medium+ golang-2xl: docker: # Must match GO_VERSION_MIN in project root - - image: cimg/go:1.18.8 + - image: cimg/go:1.19.7 resource_class: 2xlarge ubuntu: docker: diff --git a/api/api_storage.go b/api/api_storage.go index fab047a14..9e65c1ced 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -212,9 +212,11 @@ type StorageMiner interface { StorageDetachLocal(ctx context.Context, path string) error //perm:admin StorageRedeclareLocal(ctx context.Context, id *storiface.ID, dropMissing bool) error //perm:admin - MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error //perm:write - MarketListDeals(ctx context.Context) ([]*MarketDeal, error) //perm:read - MarketListRetrievalDeals(ctx context.Context) ([]retrievalmarket.ProviderDealState, error) //perm:read + MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error //perm:write + MarketListDeals(ctx context.Context) ([]*MarketDeal, error) //perm:read + + // MarketListRetrievalDeals is deprecated, returns empty list + MarketListRetrievalDeals(ctx context.Context) ([]struct{}, error) //perm:read MarketGetDealUpdates(ctx context.Context) (<-chan storagemarket.MinerDeal, error) //perm:read MarketListIncompleteDeals(ctx context.Context) ([]storagemarket.MinerDeal, error) //perm:read MarketSetAsk(ctx context.Context, price types.BigInt, verifiedPrice types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error //perm:admin diff --git a/api/cbor_gen.go b/api/cbor_gen.go index efa1cd1a1..80392b212 100644 --- a/api/cbor_gen.go +++ b/api/cbor_gen.go @@ -50,22 +50,6 @@ func (t *PaymentInfo) MarshalCBOR(w io.Writer) error { return err } - // t.WaitSentinel (cid.Cid) (struct) - if len("WaitSentinel") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"WaitSentinel\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("WaitSentinel"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("WaitSentinel")); err != nil { - return err - } - - if err := cbg.WriteCid(cw, t.WaitSentinel); err != nil { - return xerrors.Errorf("failed to write cid field t.WaitSentinel: %w", err) - } - // t.Vouchers ([]*paych.SignedVoucher) (slice) if len("Vouchers") > cbg.MaxLength { return xerrors.Errorf("Value in field \"Vouchers\" was too long") @@ -90,6 +74,23 @@ func (t *PaymentInfo) MarshalCBOR(w io.Writer) error { return err } } + + // t.WaitSentinel (cid.Cid) (struct) + if len("WaitSentinel") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"WaitSentinel\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("WaitSentinel"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("WaitSentinel")); err != nil { + return err + } + + if err := cbg.WriteCid(cw, t.WaitSentinel); err != nil { + return xerrors.Errorf("failed to write cid field t.WaitSentinel: %w", err) + } + return nil } @@ -140,19 +141,6 @@ func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) (err error) { return xerrors.Errorf("unmarshaling t.Channel: %w", err) } - } - // t.WaitSentinel (cid.Cid) (struct) - case "WaitSentinel": - - { - - c, err := cbg.ReadCid(cr) - if err != nil { - return xerrors.Errorf("failed to read cid field t.WaitSentinel: %w", err) - } - - t.WaitSentinel = c - } // t.Vouchers ([]*paych.SignedVoucher) (slice) case "Vouchers": @@ -184,6 +172,20 @@ func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) (err error) { t.Vouchers[i] = &v } + // t.WaitSentinel (cid.Cid) (struct) + case "WaitSentinel": + + { + + c, err := cbg.ReadCid(cr) + if err != nil { + return xerrors.Errorf("failed to read cid field t.WaitSentinel: %w", err) + } + + t.WaitSentinel = c + + } + default: // Field doesn't exist on this type, so ignore it cbg.ScanForLinks(r, func(cid.Cid) {}) @@ -204,19 +206,19 @@ func (t *SealedRef) MarshalCBOR(w io.Writer) error { return err } - // t.SectorID (abi.SectorNumber) (uint64) - if len("SectorID") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"SectorID\" was too long") + // t.Size (abi.UnpaddedPieceSize) (uint64) + if len("Size") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Size\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("SectorID"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Size"))); err != nil { return err } - if _, err := io.WriteString(w, string("SectorID")); err != nil { + if _, err := io.WriteString(w, string("Size")); err != nil { return err } - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.SectorID)); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Size)); err != nil { return err } @@ -236,19 +238,19 @@ func (t *SealedRef) MarshalCBOR(w io.Writer) error { return err } - // t.Size (abi.UnpaddedPieceSize) (uint64) - if len("Size") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Size\" was too long") + // t.SectorID (abi.SectorNumber) (uint64) + if len("SectorID") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"SectorID\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Size"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("SectorID"))); err != nil { return err } - if _, err := io.WriteString(w, string("Size")); err != nil { + if _, err := io.WriteString(w, string("SectorID")); err != nil { return err } - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Size)); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.SectorID)); err != nil { return err } @@ -293,8 +295,8 @@ func (t *SealedRef) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.SectorID (abi.SectorNumber) (uint64) - case "SectorID": + // t.Size (abi.UnpaddedPieceSize) (uint64) + case "Size": { @@ -305,7 +307,7 @@ func (t *SealedRef) UnmarshalCBOR(r io.Reader) (err error) { if maj != cbg.MajUnsignedInt { return fmt.Errorf("wrong type for uint64 field") } - t.SectorID = abi.SectorNumber(extra) + t.Size = abi.UnpaddedPieceSize(extra) } // t.Offset (abi.PaddedPieceSize) (uint64) @@ -323,8 +325,8 @@ func (t *SealedRef) UnmarshalCBOR(r io.Reader) (err error) { t.Offset = abi.PaddedPieceSize(extra) } - // t.Size (abi.UnpaddedPieceSize) (uint64) - case "Size": + // t.SectorID (abi.SectorNumber) (uint64) + case "SectorID": { @@ -335,7 +337,7 @@ func (t *SealedRef) UnmarshalCBOR(r io.Reader) (err error) { if maj != cbg.MajUnsignedInt { return fmt.Errorf("wrong type for uint64 field") } - t.Size = abi.UnpaddedPieceSize(extra) + t.SectorID = abi.SectorNumber(extra) } @@ -474,6 +476,28 @@ func (t *SealTicket) MarshalCBOR(w io.Writer) error { return err } + // t.Epoch (abi.ChainEpoch) (int64) + if len("Epoch") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Epoch\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Epoch"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Epoch")); err != nil { + return err + } + + if t.Epoch >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Epoch)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.Epoch-1)); err != nil { + return err + } + } + // t.Value (abi.SealRandomness) (slice) if len("Value") > cbg.MaxLength { return xerrors.Errorf("Value in field \"Value\" was too long") @@ -497,28 +521,6 @@ func (t *SealTicket) MarshalCBOR(w io.Writer) error { if _, err := cw.Write(t.Value[:]); err != nil { return err } - - // t.Epoch (abi.ChainEpoch) (int64) - if len("Epoch") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Epoch\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Epoch"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Epoch")); err != nil { - return err - } - - if t.Epoch >= 0 { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Epoch)); err != nil { - return err - } - } else { - if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.Epoch-1)); err != nil { - return err - } - } return nil } @@ -560,7 +562,33 @@ func (t *SealTicket) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.Value (abi.SealRandomness) (slice) + // t.Epoch (abi.ChainEpoch) (int64) + case "Epoch": + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative overflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.Epoch = abi.ChainEpoch(extraI) + } + // t.Value (abi.SealRandomness) (slice) case "Value": maj, extra, err = cr.ReadHeader() @@ -582,32 +610,6 @@ func (t *SealTicket) UnmarshalCBOR(r io.Reader) (err error) { if _, err := io.ReadFull(cr, t.Value[:]); err != nil { return err } - // t.Epoch (abi.ChainEpoch) (int64) - case "Epoch": - { - maj, extra, err := cr.ReadHeader() - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.Epoch = abi.ChainEpoch(extraI) - } default: // Field doesn't exist on this type, so ignore it @@ -629,6 +631,28 @@ func (t *SealSeed) MarshalCBOR(w io.Writer) error { return err } + // t.Epoch (abi.ChainEpoch) (int64) + if len("Epoch") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Epoch\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Epoch"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Epoch")); err != nil { + return err + } + + if t.Epoch >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Epoch)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.Epoch-1)); err != nil { + return err + } + } + // t.Value (abi.InteractiveSealRandomness) (slice) if len("Value") > cbg.MaxLength { return xerrors.Errorf("Value in field \"Value\" was too long") @@ -652,28 +676,6 @@ func (t *SealSeed) MarshalCBOR(w io.Writer) error { if _, err := cw.Write(t.Value[:]); err != nil { return err } - - // t.Epoch (abi.ChainEpoch) (int64) - if len("Epoch") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Epoch\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Epoch"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Epoch")); err != nil { - return err - } - - if t.Epoch >= 0 { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Epoch)); err != nil { - return err - } - } else { - if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.Epoch-1)); err != nil { - return err - } - } return nil } @@ -715,7 +717,33 @@ func (t *SealSeed) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.Value (abi.InteractiveSealRandomness) (slice) + // t.Epoch (abi.ChainEpoch) (int64) + case "Epoch": + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative overflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.Epoch = abi.ChainEpoch(extraI) + } + // t.Value (abi.InteractiveSealRandomness) (slice) case "Value": maj, extra, err = cr.ReadHeader() @@ -737,32 +765,6 @@ func (t *SealSeed) UnmarshalCBOR(r io.Reader) (err error) { if _, err := io.ReadFull(cr, t.Value[:]); err != nil { return err } - // t.Epoch (abi.ChainEpoch) (int64) - case "Epoch": - { - maj, extra, err := cr.ReadHeader() - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.Epoch = abi.ChainEpoch(extraI) - } default: // Field doesn't exist on this type, so ignore it @@ -784,6 +786,22 @@ func (t *PieceDealInfo) MarshalCBOR(w io.Writer) error { return err } + // t.DealID (abi.DealID) (uint64) + if len("DealID") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"DealID\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("DealID"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("DealID")); err != nil { + return err + } + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.DealID)); err != nil { + return err + } + // t.PublishCid (cid.Cid) (struct) if len("PublishCid") > cbg.MaxLength { return xerrors.Errorf("Value in field \"PublishCid\" was too long") @@ -806,22 +824,6 @@ func (t *PieceDealInfo) MarshalCBOR(w io.Writer) error { } } - // t.DealID (abi.DealID) (uint64) - if len("DealID") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"DealID\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("DealID"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("DealID")); err != nil { - return err - } - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.DealID)); err != nil { - return err - } - // t.DealProposal (market.DealProposal) (struct) if len("DealProposal") > cbg.MaxLength { return xerrors.Errorf("Value in field \"DealProposal\" was too long") @@ -910,7 +912,22 @@ func (t *PieceDealInfo) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.PublishCid (cid.Cid) (struct) + // t.DealID (abi.DealID) (uint64) + case "DealID": + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.DealID = abi.DealID(extra) + + } + // t.PublishCid (cid.Cid) (struct) case "PublishCid": { @@ -932,21 +949,6 @@ func (t *PieceDealInfo) UnmarshalCBOR(r io.Reader) (err error) { t.PublishCid = &c } - } - // t.DealID (abi.DealID) (uint64) - case "DealID": - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.DealID = abi.DealID(extra) - } // t.DealProposal (market.DealProposal) (struct) case "DealProposal": @@ -1140,28 +1142,6 @@ func (t *DealSchedule) MarshalCBOR(w io.Writer) error { return err } - // t.StartEpoch (abi.ChainEpoch) (int64) - if len("StartEpoch") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"StartEpoch\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("StartEpoch"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("StartEpoch")); err != nil { - return err - } - - if t.StartEpoch >= 0 { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.StartEpoch)); err != nil { - return err - } - } else { - if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.StartEpoch-1)); err != nil { - return err - } - } - // t.EndEpoch (abi.ChainEpoch) (int64) if len("EndEpoch") > cbg.MaxLength { return xerrors.Errorf("Value in field \"EndEpoch\" was too long") @@ -1183,6 +1163,28 @@ func (t *DealSchedule) MarshalCBOR(w io.Writer) error { return err } } + + // t.StartEpoch (abi.ChainEpoch) (int64) + if len("StartEpoch") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"StartEpoch\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("StartEpoch"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("StartEpoch")); err != nil { + return err + } + + if t.StartEpoch >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.StartEpoch)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.StartEpoch-1)); err != nil { + return err + } + } return nil } @@ -1224,33 +1226,7 @@ func (t *DealSchedule) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.StartEpoch (abi.ChainEpoch) (int64) - case "StartEpoch": - { - maj, extra, err := cr.ReadHeader() - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.StartEpoch = abi.ChainEpoch(extraI) - } - // t.EndEpoch (abi.ChainEpoch) (int64) + // t.EndEpoch (abi.ChainEpoch) (int64) case "EndEpoch": { maj, extra, err := cr.ReadHeader() @@ -1267,7 +1243,7 @@ func (t *DealSchedule) UnmarshalCBOR(r io.Reader) (err error) { case cbg.MajNegativeInt: extraI = int64(extra) if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") + return fmt.Errorf("int64 negative overflow") } extraI = -1 - extraI default: @@ -1276,6 +1252,32 @@ func (t *DealSchedule) UnmarshalCBOR(r io.Reader) (err error) { t.EndEpoch = abi.ChainEpoch(extraI) } + // t.StartEpoch (abi.ChainEpoch) (int64) + case "StartEpoch": + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative overflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.StartEpoch = abi.ChainEpoch(extraI) + } default: // Field doesn't exist on this type, so ignore it diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 9b0c8c80c..aa423c574 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -947,7 +947,7 @@ type StorageMinerMethods struct { MarketListIncompleteDeals func(p0 context.Context) ([]storagemarket.MinerDeal, error) `perm:"read"` - MarketListRetrievalDeals func(p0 context.Context) ([]retrievalmarket.ProviderDealState, error) `perm:"read"` + MarketListRetrievalDeals func(p0 context.Context) ([]struct{}, error) `perm:"read"` MarketPendingDeals func(p0 context.Context) (PendingDealInfo, error) `perm:"write"` @@ -5645,15 +5645,15 @@ func (s *StorageMinerStub) MarketListIncompleteDeals(p0 context.Context) ([]stor return *new([]storagemarket.MinerDeal), ErrNotSupported } -func (s *StorageMinerStruct) MarketListRetrievalDeals(p0 context.Context) ([]retrievalmarket.ProviderDealState, error) { +func (s *StorageMinerStruct) MarketListRetrievalDeals(p0 context.Context) ([]struct{}, error) { if s.Internal.MarketListRetrievalDeals == nil { - return *new([]retrievalmarket.ProviderDealState), ErrNotSupported + return *new([]struct{}), ErrNotSupported } return s.Internal.MarketListRetrievalDeals(p0) } -func (s *StorageMinerStub) MarketListRetrievalDeals(p0 context.Context) ([]retrievalmarket.ProviderDealState, error) { - return *new([]retrievalmarket.ProviderDealState), ErrNotSupported +func (s *StorageMinerStub) MarketListRetrievalDeals(p0 context.Context) ([]struct{}, error) { + return *new([]struct{}), ErrNotSupported } func (s *StorageMinerStruct) MarketPendingDeals(p0 context.Context) (PendingDealInfo, error) { diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index b23389baf8463fb0ea80a77447532bf57c5aa4d4..9d872fbdea03954eb3a1cb20cfca7520712aee14 100644 GIT binary patch delta 15645 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 DLj!&r delta 15835 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 cbg.MaxLength { - return xerrors.Errorf("Value in field \"Voucher\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Voucher"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Voucher")); err != nil { - return err - } - - if err := t.Voucher.MarshalCBOR(cw); err != nil { - return err - } - // t.Proof ([]uint8) (slice) if len("Proof") > cbg.MaxLength { return xerrors.Errorf("Value in field \"Proof\" was too long") @@ -73,6 +57,22 @@ func (t *VoucherInfo) MarshalCBOR(w io.Writer) error { return err } + // t.Voucher (paych.SignedVoucher) (struct) + if len("Voucher") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Voucher\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Voucher"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Voucher")); err != nil { + return err + } + + if err := t.Voucher.MarshalCBOR(cw); err != nil { + return err + } + // t.Submitted (bool) (bool) if len("Submitted") > cbg.MaxLength { return xerrors.Errorf("Value in field \"Submitted\" was too long") @@ -129,27 +129,7 @@ func (t *VoucherInfo) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.Voucher (paych.SignedVoucher) (struct) - case "Voucher": - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - t.Voucher = new(paych.SignedVoucher) - if err := t.Voucher.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.Voucher pointer: %w", err) - } - } - - } - // t.Proof ([]uint8) (slice) + // t.Proof ([]uint8) (slice) case "Proof": maj, extra, err = cr.ReadHeader() @@ -171,6 +151,26 @@ func (t *VoucherInfo) UnmarshalCBOR(r io.Reader) (err error) { if _, err := io.ReadFull(cr, t.Proof[:]); err != nil { return err } + // t.Voucher (paych.SignedVoucher) (struct) + case "Voucher": + + { + + b, err := cr.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := cr.UnreadByte(); err != nil { + return err + } + t.Voucher = new(paych.SignedVoucher) + if err := t.Voucher.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.Voucher pointer: %w", err) + } + } + + } // t.Submitted (bool) (bool) case "Submitted": @@ -210,26 +210,35 @@ func (t *ChannelInfo) MarshalCBOR(w io.Writer) error { return err } - // t.ChannelID (string) (string) - if len("ChannelID") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"ChannelID\" was too long") + // t.Amount (big.Int) (struct) + if len("Amount") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Amount\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("ChannelID"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Amount"))); err != nil { return err } - if _, err := io.WriteString(w, string("ChannelID")); err != nil { + if _, err := io.WriteString(w, string("Amount")); err != nil { return err } - if len(t.ChannelID) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.ChannelID was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.ChannelID))); err != nil { + if err := t.Amount.MarshalCBOR(cw); err != nil { return err } - if _, err := io.WriteString(w, string(t.ChannelID)); err != nil { + + // t.Target (address.Address) (struct) + if len("Target") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Target\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Target"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Target")); err != nil { + return err + } + + if err := t.Target.MarshalCBOR(cw); err != nil { return err } @@ -265,35 +274,35 @@ func (t *ChannelInfo) MarshalCBOR(w io.Writer) error { return err } - // t.Target (address.Address) (struct) - if len("Target") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Target\" was too long") + // t.NextLane (uint64) (uint64) + if len("NextLane") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"NextLane\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Target"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("NextLane"))); err != nil { return err } - if _, err := io.WriteString(w, string("Target")); err != nil { + if _, err := io.WriteString(w, string("NextLane")); err != nil { return err } - if err := t.Target.MarshalCBOR(cw); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.NextLane)); err != nil { return err } - // t.Direction (uint64) (uint64) - if len("Direction") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Direction\" was too long") + // t.Settling (bool) (bool) + if len("Settling") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Settling\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Direction"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Settling"))); err != nil { return err } - if _, err := io.WriteString(w, string("Direction")); err != nil { + if _, err := io.WriteString(w, string("Settling")); err != nil { return err } - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Direction)); err != nil { + if err := cbg.WriteBool(w, t.Settling); err != nil { return err } @@ -322,35 +331,102 @@ func (t *ChannelInfo) MarshalCBOR(w io.Writer) error { } } - // t.NextLane (uint64) (uint64) - if len("NextLane") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"NextLane\" was too long") + // t.ChannelID (string) (string) + if len("ChannelID") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"ChannelID\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("NextLane"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("ChannelID"))); err != nil { return err } - if _, err := io.WriteString(w, string("NextLane")); err != nil { + if _, err := io.WriteString(w, string("ChannelID")); err != nil { return err } - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.NextLane)); err != nil { + if len(t.ChannelID) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.ChannelID was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.ChannelID))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.ChannelID)); err != nil { return err } - // t.Amount (big.Int) (struct) - if len("Amount") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Amount\" was too long") + // t.CreateMsg (cid.Cid) (struct) + if len("CreateMsg") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"CreateMsg\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Amount"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("CreateMsg"))); err != nil { return err } - if _, err := io.WriteString(w, string("Amount")); err != nil { + if _, err := io.WriteString(w, string("CreateMsg")); err != nil { return err } - if err := t.Amount.MarshalCBOR(cw); err != nil { + if t.CreateMsg == nil { + if _, err := cw.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCid(cw, *t.CreateMsg); err != nil { + return xerrors.Errorf("failed to write cid field t.CreateMsg: %w", err) + } + } + + // t.Direction (uint64) (uint64) + if len("Direction") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Direction\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Direction"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Direction")); err != nil { + return err + } + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Direction)); err != nil { + return err + } + + // t.AddFundsMsg (cid.Cid) (struct) + if len("AddFundsMsg") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"AddFundsMsg\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("AddFundsMsg"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("AddFundsMsg")); err != nil { + return err + } + + if t.AddFundsMsg == nil { + if _, err := cw.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCid(cw, *t.AddFundsMsg); err != nil { + return xerrors.Errorf("failed to write cid field t.AddFundsMsg: %w", err) + } + } + + // t.PendingAmount (big.Int) (struct) + if len("PendingAmount") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"PendingAmount\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PendingAmount"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("PendingAmount")); err != nil { + return err + } + + if err := t.PendingAmount.MarshalCBOR(cw); err != nil { return err } @@ -385,82 +461,6 @@ func (t *ChannelInfo) MarshalCBOR(w io.Writer) error { if err := t.PendingAvailableAmount.MarshalCBOR(cw); err != nil { return err } - - // t.PendingAmount (big.Int) (struct) - if len("PendingAmount") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"PendingAmount\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PendingAmount"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("PendingAmount")); err != nil { - return err - } - - if err := t.PendingAmount.MarshalCBOR(cw); err != nil { - return err - } - - // t.CreateMsg (cid.Cid) (struct) - if len("CreateMsg") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"CreateMsg\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("CreateMsg"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("CreateMsg")); err != nil { - return err - } - - if t.CreateMsg == nil { - if _, err := cw.Write(cbg.CborNull); err != nil { - return err - } - } else { - if err := cbg.WriteCid(cw, *t.CreateMsg); err != nil { - return xerrors.Errorf("failed to write cid field t.CreateMsg: %w", err) - } - } - - // t.AddFundsMsg (cid.Cid) (struct) - if len("AddFundsMsg") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"AddFundsMsg\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("AddFundsMsg"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("AddFundsMsg")); err != nil { - return err - } - - if t.AddFundsMsg == nil { - if _, err := cw.Write(cbg.CborNull); err != nil { - return err - } - } else { - if err := cbg.WriteCid(cw, *t.AddFundsMsg); err != nil { - return xerrors.Errorf("failed to write cid field t.AddFundsMsg: %w", err) - } - } - - // t.Settling (bool) (bool) - if len("Settling") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Settling\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Settling"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Settling")); err != nil { - return err - } - - if err := cbg.WriteBool(w, t.Settling); err != nil { - return err - } return nil } @@ -502,16 +502,25 @@ func (t *ChannelInfo) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.ChannelID (string) (string) - case "ChannelID": + // t.Amount (big.Int) (struct) + case "Amount": { - sval, err := cbg.ReadString(cr) - if err != nil { - return err + + if err := t.Amount.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.Amount: %w", err) + } + + } + // t.Target (address.Address) (struct) + case "Target": + + { + + if err := t.Target.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.Target: %w", err) } - t.ChannelID = string(sval) } // t.Channel (address.Address) (struct) case "Channel": @@ -543,18 +552,8 @@ func (t *ChannelInfo) UnmarshalCBOR(r io.Reader) (err error) { } } - // t.Target (address.Address) (struct) - case "Target": - - { - - if err := t.Target.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.Target: %w", err) - } - - } - // t.Direction (uint64) (uint64) - case "Direction": + // t.NextLane (uint64) (uint64) + case "NextLane": { @@ -565,9 +564,27 @@ func (t *ChannelInfo) UnmarshalCBOR(r io.Reader) (err error) { if maj != cbg.MajUnsignedInt { return fmt.Errorf("wrong type for uint64 field") } - t.Direction = uint64(extra) + t.NextLane = uint64(extra) } + // t.Settling (bool) (bool) + case "Settling": + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.Settling = false + case 21: + t.Settling = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } // t.Vouchers ([]*paychmgr.VoucherInfo) (slice) case "Vouchers": @@ -598,60 +615,16 @@ func (t *ChannelInfo) UnmarshalCBOR(r io.Reader) (err error) { t.Vouchers[i] = &v } - // t.NextLane (uint64) (uint64) - case "NextLane": + // t.ChannelID (string) (string) + case "ChannelID": { - - maj, extra, err = cr.ReadHeader() + sval, err := cbg.ReadString(cr) if err != nil { return err } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.NextLane = uint64(extra) - - } - // t.Amount (big.Int) (struct) - case "Amount": - - { - - if err := t.Amount.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.Amount: %w", err) - } - - } - // t.AvailableAmount (big.Int) (struct) - case "AvailableAmount": - - { - - if err := t.AvailableAmount.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.AvailableAmount: %w", err) - } - - } - // t.PendingAvailableAmount (big.Int) (struct) - case "PendingAvailableAmount": - - { - - if err := t.PendingAvailableAmount.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PendingAvailableAmount: %w", err) - } - - } - // t.PendingAmount (big.Int) (struct) - case "PendingAmount": - - { - - if err := t.PendingAmount.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PendingAmount: %w", err) - } + t.ChannelID = string(sval) } // t.CreateMsg (cid.Cid) (struct) case "CreateMsg": @@ -675,6 +648,21 @@ func (t *ChannelInfo) UnmarshalCBOR(r io.Reader) (err error) { t.CreateMsg = &c } + } + // t.Direction (uint64) (uint64) + case "Direction": + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Direction = uint64(extra) + } // t.AddFundsMsg (cid.Cid) (struct) case "AddFundsMsg": @@ -699,23 +687,35 @@ func (t *ChannelInfo) UnmarshalCBOR(r io.Reader) (err error) { } } - // t.Settling (bool) (bool) - case "Settling": + // t.PendingAmount (big.Int) (struct) + case "PendingAmount": + + { + + if err := t.PendingAmount.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.PendingAmount: %w", err) + } - maj, extra, err = cr.ReadHeader() - if err != nil { - return err } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") + // t.AvailableAmount (big.Int) (struct) + case "AvailableAmount": + + { + + if err := t.AvailableAmount.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.AvailableAmount: %w", err) + } + } - switch extra { - case 20: - t.Settling = false - case 21: - t.Settling = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + // t.PendingAvailableAmount (big.Int) (struct) + case "PendingAvailableAmount": + + { + + if err := t.PendingAvailableAmount.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.PendingAvailableAmount: %w", err) + } + } default: @@ -738,26 +738,26 @@ func (t *MsgInfo) MarshalCBOR(w io.Writer) error { return err } - // t.ChannelID (string) (string) - if len("ChannelID") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"ChannelID\" was too long") + // t.Err (string) (string) + if len("Err") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Err\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("ChannelID"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Err"))); err != nil { return err } - if _, err := io.WriteString(w, string("ChannelID")); err != nil { + if _, err := io.WriteString(w, string("Err")); err != nil { return err } - if len(t.ChannelID) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.ChannelID was too long") + if len(t.Err) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Err was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.ChannelID))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Err))); err != nil { return err } - if _, err := io.WriteString(w, string(t.ChannelID)); err != nil { + if _, err := io.WriteString(w, string(t.Err)); err != nil { return err } @@ -793,26 +793,26 @@ func (t *MsgInfo) MarshalCBOR(w io.Writer) error { return err } - // t.Err (string) (string) - if len("Err") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Err\" was too long") + // t.ChannelID (string) (string) + if len("ChannelID") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"ChannelID\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Err"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("ChannelID"))); err != nil { return err } - if _, err := io.WriteString(w, string("Err")); err != nil { + if _, err := io.WriteString(w, string("ChannelID")); err != nil { return err } - if len(t.Err) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.Err was too long") + if len(t.ChannelID) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.ChannelID was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Err))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.ChannelID))); err != nil { return err } - if _, err := io.WriteString(w, string(t.Err)); err != nil { + if _, err := io.WriteString(w, string(t.ChannelID)); err != nil { return err } return nil @@ -856,8 +856,8 @@ func (t *MsgInfo) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.ChannelID (string) (string) - case "ChannelID": + // t.Err (string) (string) + case "Err": { sval, err := cbg.ReadString(cr) @@ -865,7 +865,7 @@ func (t *MsgInfo) UnmarshalCBOR(r io.Reader) (err error) { return err } - t.ChannelID = string(sval) + t.Err = string(sval) } // t.MsgCid (cid.Cid) (struct) case "MsgCid": @@ -898,8 +898,8 @@ func (t *MsgInfo) UnmarshalCBOR(r io.Reader) (err error) { default: return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) } - // t.Err (string) (string) - case "Err": + // t.ChannelID (string) (string) + case "ChannelID": { sval, err := cbg.ReadString(cr) @@ -907,7 +907,7 @@ func (t *MsgInfo) UnmarshalCBOR(r io.Reader) (err error) { return err } - t.Err = string(sval) + t.ChannelID = string(sval) } default: diff --git a/storage/pipeline/cbor_gen.go b/storage/pipeline/cbor_gen.go index 88dac5d64..d14611c6a 100644 --- a/storage/pipeline/cbor_gen.go +++ b/storage/pipeline/cbor_gen.go @@ -35,184 +35,31 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { return err } - // t.State (sealing.SectorState) (string) - if len("State") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"State\" was too long") + // t.Log ([]sealing.Log) (slice) + if len("Log") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Log\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("State"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Log"))); err != nil { return err } - if _, err := io.WriteString(w, string("State")); err != nil { + if _, err := io.WriteString(w, string("Log")); err != nil { return err } - if len(t.State) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.State was too long") + if len(t.Log) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Log was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.State))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Log))); err != nil { return err } - if _, err := io.WriteString(w, string(t.State)); err != nil { - return err - } - - // t.SectorNumber (abi.SectorNumber) (uint64) - if len("SectorNumber") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"SectorNumber\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("SectorNumber"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("SectorNumber")); err != nil { - return err - } - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.SectorNumber)); err != nil { - return err - } - - // t.SectorType (abi.RegisteredSealProof) (int64) - if len("SectorType") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"SectorType\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("SectorType"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("SectorType")); err != nil { - return err - } - - if t.SectorType >= 0 { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.SectorType)); err != nil { - return err - } - } else { - if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.SectorType-1)); err != nil { - return err - } - } - - // t.CreationTime (int64) (int64) - if len("CreationTime") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"CreationTime\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("CreationTime"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("CreationTime")); err != nil { - return err - } - - if t.CreationTime >= 0 { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.CreationTime)); err != nil { - return err - } - } else { - if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.CreationTime-1)); err != nil { - return err - } - } - - // t.Pieces ([]api.SectorPiece) (slice) - if len("Pieces") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Pieces\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Pieces"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Pieces")); err != nil { - return err - } - - if len(t.Pieces) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.Pieces was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Pieces))); err != nil { - return err - } - for _, v := range t.Pieces { + for _, v := range t.Log { if err := v.MarshalCBOR(cw); err != nil { return err } } - // t.TicketValue (abi.SealRandomness) (slice) - if len("TicketValue") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"TicketValue\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("TicketValue"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("TicketValue")); err != nil { - return err - } - - if len(t.TicketValue) > cbg.ByteArrayMaxLen { - return xerrors.Errorf("Byte array in field t.TicketValue was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajByteString, uint64(len(t.TicketValue))); err != nil { - return err - } - - if _, err := cw.Write(t.TicketValue[:]); err != nil { - return err - } - - // t.TicketEpoch (abi.ChainEpoch) (int64) - if len("TicketEpoch") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"TicketEpoch\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("TicketEpoch"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("TicketEpoch")); err != nil { - return err - } - - if t.TicketEpoch >= 0 { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.TicketEpoch)); err != nil { - return err - } - } else { - if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.TicketEpoch-1)); err != nil { - return err - } - } - - // t.PreCommit1Out (storiface.PreCommit1Out) (slice) - if len("PreCommit1Out") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"PreCommit1Out\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PreCommit1Out"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("PreCommit1Out")); err != nil { - return err - } - - if len(t.PreCommit1Out) > cbg.ByteArrayMaxLen { - return xerrors.Errorf("Byte array in field t.PreCommit1Out was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajByteString, uint64(len(t.PreCommit1Out))); err != nil { - return err - } - - if _, err := cw.Write(t.PreCommit1Out[:]); err != nil { - return err - } - // t.CommD (cid.Cid) (struct) if len("CommD") > cbg.MaxLength { return xerrors.Errorf("Value in field \"CommD\" was too long") @@ -281,76 +128,163 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { return err } - // t.PreCommitDeposit (big.Int) (struct) - if len("PreCommitDeposit") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"PreCommitDeposit\" was too long") + // t.State (sealing.SectorState) (string) + if len("State") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"State\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PreCommitDeposit"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("State"))); err != nil { return err } - if _, err := io.WriteString(w, string("PreCommitDeposit")); err != nil { + if _, err := io.WriteString(w, string("State")); err != nil { return err } - if err := t.PreCommitDeposit.MarshalCBOR(cw); err != nil { + if len(t.State) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.State was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.State))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.State)); err != nil { return err } - // t.PreCommitMessage (cid.Cid) (struct) - if len("PreCommitMessage") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"PreCommitMessage\" was too long") + // t.Pieces ([]api.SectorPiece) (slice) + if len("Pieces") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Pieces\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PreCommitMessage"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Pieces"))); err != nil { return err } - if _, err := io.WriteString(w, string("PreCommitMessage")); err != nil { + if _, err := io.WriteString(w, string("Pieces")); err != nil { return err } - if t.PreCommitMessage == nil { - if _, err := cw.Write(cbg.CborNull); err != nil { + if len(t.Pieces) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Pieces was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Pieces))); err != nil { + return err + } + for _, v := range t.Pieces { + if err := v.MarshalCBOR(cw); err != nil { + return err + } + } + + // t.Return (sealing.ReturnState) (string) + if len("Return") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Return\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Return"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Return")); err != nil { + return err + } + + if len(t.Return) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Return was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Return))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Return)); err != nil { + return err + } + + // t.LastErr (string) (string) + if len("LastErr") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"LastErr\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("LastErr"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("LastErr")); err != nil { + return err + } + + if len(t.LastErr) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.LastErr was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.LastErr))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.LastErr)); err != nil { + return err + } + + // t.CCPieces ([]api.SectorPiece) (slice) + if len("CCPieces") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"CCPieces\" was too long") + } + + if err := cw.WriteMajorTypeHeader(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 := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.CCPieces))); err != nil { + return err + } + for _, v := range t.CCPieces { + if err := v.MarshalCBOR(cw); err != nil { + return err + } + } + + // t.CCUpdate (bool) (bool) + if len("CCUpdate") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"CCUpdate\" was too long") + } + + if err := cw.WriteMajorTypeHeader(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.SeedEpoch (abi.ChainEpoch) (int64) + if len("SeedEpoch") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"SeedEpoch\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("SeedEpoch"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("SeedEpoch")); err != nil { + return err + } + + if t.SeedEpoch >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.SeedEpoch)); err != nil { return err } } else { - if err := cbg.WriteCid(cw, *t.PreCommitMessage); err != nil { - return xerrors.Errorf("failed to write cid field t.PreCommitMessage: %w", err) + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.SeedEpoch-1)); err != nil { + return err } } - // t.PreCommitTipSet (types.TipSetKey) (struct) - if len("PreCommitTipSet") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"PreCommitTipSet\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PreCommitTipSet"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("PreCommitTipSet")); err != nil { - return err - } - - if err := t.PreCommitTipSet.MarshalCBOR(cw); err != nil { - return err - } - - // t.PreCommit2Fails (uint64) (uint64) - if len("PreCommit2Fails") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"PreCommit2Fails\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PreCommit2Fails"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("PreCommit2Fails")); err != nil { - return err - } - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.PreCommit2Fails)); err != nil { - return err - } - // t.SeedValue (abi.InteractiveSealRandomness) (slice) if len("SeedValue") > cbg.MaxLength { return xerrors.Errorf("Value in field \"SeedValue\" was too long") @@ -375,28 +309,156 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { return err } - // t.SeedEpoch (abi.ChainEpoch) (int64) - if len("SeedEpoch") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"SeedEpoch\" was too long") + // t.SectorType (abi.RegisteredSealProof) (int64) + if len("SectorType") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"SectorType\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("SeedEpoch"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("SectorType"))); err != nil { return err } - if _, err := io.WriteString(w, string("SeedEpoch")); err != nil { + if _, err := io.WriteString(w, string("SectorType")); err != nil { return err } - if t.SeedEpoch >= 0 { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.SeedEpoch)); err != nil { + if t.SectorType >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.SectorType)); err != nil { return err } } else { - if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.SeedEpoch-1)); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.SectorType-1)); err != nil { return err } } + // t.TicketEpoch (abi.ChainEpoch) (int64) + if len("TicketEpoch") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"TicketEpoch\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("TicketEpoch"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("TicketEpoch")); err != nil { + return err + } + + if t.TicketEpoch >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.TicketEpoch)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.TicketEpoch-1)); err != nil { + return err + } + } + + // t.TicketValue (abi.SealRandomness) (slice) + if len("TicketValue") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"TicketValue\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("TicketValue"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("TicketValue")); err != nil { + return err + } + + if len(t.TicketValue) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.TicketValue was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajByteString, uint64(len(t.TicketValue))); err != nil { + return err + } + + if _, err := cw.Write(t.TicketValue[:]); err != nil { + return err + } + + // t.CreationTime (int64) (int64) + if len("CreationTime") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"CreationTime\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("CreationTime"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("CreationTime")); err != nil { + return err + } + + if t.CreationTime >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.CreationTime)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.CreationTime-1)); err != nil { + return err + } + } + + // t.SectorNumber (abi.SectorNumber) (uint64) + if len("SectorNumber") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"SectorNumber\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("SectorNumber"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("SectorNumber")); err != nil { + return err + } + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.SectorNumber)); err != nil { + return err + } + + // t.TerminatedAt (abi.ChainEpoch) (int64) + if len("TerminatedAt") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"TerminatedAt\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("TerminatedAt"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("TerminatedAt")); err != nil { + return err + } + + if t.TerminatedAt >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.TerminatedAt)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.TerminatedAt-1)); 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 := cw.WriteMajorTypeHeader(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 := cw.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCid(cw, *t.UpdateSealed); err != nil { + return xerrors.Errorf("failed to write cid field t.UpdateSealed: %w", err) + } + } + // t.CommitMessage (cid.Cid) (struct) if len("CommitMessage") > cbg.MaxLength { return xerrors.Errorf("Value in field \"CommitMessage\" was too long") @@ -435,66 +497,49 @@ 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") + // t.PreCommit1Out (storiface.PreCommit1Out) (slice) + if len("PreCommit1Out") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"PreCommit1Out\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("CCUpdate"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PreCommit1Out"))); err != nil { return err } - if _, err := io.WriteString(w, string("CCUpdate")); err != nil { + if _, err := io.WriteString(w, string("PreCommit1Out")); err != nil { return err } - if err := cbg.WriteBool(w, t.CCUpdate); err != nil { + if len(t.PreCommit1Out) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.PreCommit1Out was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajByteString, uint64(len(t.PreCommit1Out))); err != nil { return err } - // t.CCPieces ([]api.SectorPiece) (slice) - if len("CCPieces") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"CCPieces\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("CCPieces"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("CCPieces")); err != nil { + if _, err := cw.Write(t.PreCommit1Out[:]); err != nil { return err } - if len(t.CCPieces) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.CCPieces was too long") + // t.FaultReportMsg (cid.Cid) (struct) + if len("FaultReportMsg") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"FaultReportMsg\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.CCPieces))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("FaultReportMsg"))); err != nil { return err } - for _, v := range t.CCPieces { - if err := v.MarshalCBOR(cw); 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 := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("UpdateSealed"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("UpdateSealed")); err != nil { + if _, err := io.WriteString(w, string("FaultReportMsg")); err != nil { return err } - if t.UpdateSealed == nil { + if t.FaultReportMsg == nil { if _, err := cw.Write(cbg.CborNull); err != nil { return err } } else { - if err := cbg.WriteCid(cw, *t.UpdateSealed); err != nil { - return xerrors.Errorf("failed to write cid field t.UpdateSealed: %w", err) + if err := cbg.WriteCid(cw, *t.FaultReportMsg); err != nil { + return xerrors.Errorf("failed to write cid field t.FaultReportMsg: %w", err) } } @@ -520,6 +565,146 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { } } + // t.PreCommit2Fails (uint64) (uint64) + if len("PreCommit2Fails") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"PreCommit2Fails\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PreCommit2Fails"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("PreCommit2Fails")); err != nil { + return err + } + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.PreCommit2Fails)); err != nil { + return err + } + + // t.PreCommitTipSet (types.TipSetKey) (struct) + if len("PreCommitTipSet") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"PreCommitTipSet\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PreCommitTipSet"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("PreCommitTipSet")); err != nil { + return err + } + + if err := t.PreCommitTipSet.MarshalCBOR(cw); err != nil { + return err + } + + // t.RemoteDataCache (storiface.SectorLocation) (struct) + if len("RemoteDataCache") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"RemoteDataCache\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataCache"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("RemoteDataCache")); err != nil { + return err + } + + if err := t.RemoteDataCache.MarshalCBOR(cw); err != nil { + return err + } + + // t.PreCommitDeposit (big.Int) (struct) + if len("PreCommitDeposit") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"PreCommitDeposit\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PreCommitDeposit"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("PreCommitDeposit")); err != nil { + return err + } + + if err := t.PreCommitDeposit.MarshalCBOR(cw); err != nil { + return err + } + + // t.PreCommitMessage (cid.Cid) (struct) + if len("PreCommitMessage") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"PreCommitMessage\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PreCommitMessage"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("PreCommitMessage")); err != nil { + return err + } + + if t.PreCommitMessage == nil { + if _, err := cw.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCid(cw, *t.PreCommitMessage); err != nil { + return xerrors.Errorf("failed to write cid field t.PreCommitMessage: %w", err) + } + } + + // t.RemoteDataSealed (storiface.SectorLocation) (struct) + if len("RemoteDataSealed") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"RemoteDataSealed\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataSealed"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("RemoteDataSealed")); err != nil { + return err + } + + if err := t.RemoteDataSealed.MarshalCBOR(cw); err != nil { + return err + } + + // t.TerminateMessage (cid.Cid) (struct) + if len("TerminateMessage") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"TerminateMessage\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("TerminateMessage"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("TerminateMessage")); err != nil { + return err + } + + if t.TerminateMessage == nil { + if _, err := cw.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCid(cw, *t.TerminateMessage); err != nil { + return xerrors.Errorf("failed to write cid field t.TerminateMessage: %w", err) + } + } + + // t.RemoteDataUnsealed (storiface.SectorLocation) (struct) + if len("RemoteDataUnsealed") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"RemoteDataUnsealed\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataUnsealed"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("RemoteDataUnsealed")); err != nil { + return err + } + + if err := t.RemoteDataUnsealed.MarshalCBOR(cw); err != nil { + return err + } + // t.ReplicaUpdateProof (storiface.ReplicaUpdateProof) (slice) if len("ReplicaUpdateProof") > cbg.MaxLength { return xerrors.Errorf("Value in field \"ReplicaUpdateProof\" was too long") @@ -544,6 +729,22 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { return err } + // t.RemoteDataFinalized (bool) (bool) + if len("RemoteDataFinalized") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"RemoteDataFinalized\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataFinalized"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("RemoteDataFinalized")); err != nil { + return err + } + + if err := cbg.WriteBool(w, t.RemoteDataFinalized); err != nil { + return err + } + // t.ReplicaUpdateMessage (cid.Cid) (struct) if len("ReplicaUpdateMessage") > cbg.MaxLength { return xerrors.Errorf("Value in field \"ReplicaUpdateMessage\" was too long") @@ -566,143 +767,6 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { } } - // t.FaultReportMsg (cid.Cid) (struct) - if len("FaultReportMsg") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"FaultReportMsg\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("FaultReportMsg"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("FaultReportMsg")); err != nil { - return err - } - - if t.FaultReportMsg == nil { - if _, err := cw.Write(cbg.CborNull); err != nil { - return err - } - } else { - if err := cbg.WriteCid(cw, *t.FaultReportMsg); err != nil { - return xerrors.Errorf("failed to write cid field t.FaultReportMsg: %w", err) - } - } - - // t.Return (sealing.ReturnState) (string) - if len("Return") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Return\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Return"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Return")); err != nil { - return err - } - - if len(t.Return) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.Return was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Return))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.Return)); err != nil { - return err - } - - // t.TerminateMessage (cid.Cid) (struct) - if len("TerminateMessage") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"TerminateMessage\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("TerminateMessage"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("TerminateMessage")); err != nil { - return err - } - - if t.TerminateMessage == nil { - if _, err := cw.Write(cbg.CborNull); err != nil { - return err - } - } else { - if err := cbg.WriteCid(cw, *t.TerminateMessage); err != nil { - return xerrors.Errorf("failed to write cid field t.TerminateMessage: %w", err) - } - } - - // t.TerminatedAt (abi.ChainEpoch) (int64) - if len("TerminatedAt") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"TerminatedAt\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("TerminatedAt"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("TerminatedAt")); err != nil { - return err - } - - if t.TerminatedAt >= 0 { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.TerminatedAt)); err != nil { - return err - } - } else { - if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.TerminatedAt-1)); err != nil { - return err - } - } - - // t.RemoteDataUnsealed (storiface.SectorLocation) (struct) - if len("RemoteDataUnsealed") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"RemoteDataUnsealed\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataUnsealed"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("RemoteDataUnsealed")); err != nil { - return err - } - - if err := t.RemoteDataUnsealed.MarshalCBOR(cw); err != nil { - return err - } - - // t.RemoteDataSealed (storiface.SectorLocation) (struct) - if len("RemoteDataSealed") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"RemoteDataSealed\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataSealed"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("RemoteDataSealed")); err != nil { - return err - } - - if err := t.RemoteDataSealed.MarshalCBOR(cw); err != nil { - return err - } - - // t.RemoteDataCache (storiface.SectorLocation) (struct) - if len("RemoteDataCache") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"RemoteDataCache\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataCache"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("RemoteDataCache")); err != nil { - return err - } - - if err := t.RemoteDataCache.MarshalCBOR(cw); err != nil { - return err - } - // t.RemoteCommit1Endpoint (string) (string) if len("RemoteCommit1Endpoint") > cbg.MaxLength { return xerrors.Errorf("Value in field \"RemoteCommit1Endpoint\" was too long") @@ -771,70 +835,6 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { if _, err := io.WriteString(w, string(t.RemoteSealingDoneEndpoint)); err != nil { return err } - - // t.RemoteDataFinalized (bool) (bool) - if len("RemoteDataFinalized") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"RemoteDataFinalized\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataFinalized"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("RemoteDataFinalized")); err != nil { - return err - } - - if err := cbg.WriteBool(w, t.RemoteDataFinalized); err != nil { - return err - } - - // t.LastErr (string) (string) - if len("LastErr") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"LastErr\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("LastErr"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("LastErr")); err != nil { - return err - } - - if len(t.LastErr) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.LastErr was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.LastErr))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.LastErr)); err != nil { - return err - } - - // t.Log ([]sealing.Log) (slice) - if len("Log") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Log\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Log"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Log")); err != nil { - return err - } - - if len(t.Log) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.Log was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Log))); err != nil { - return err - } - for _, v := range t.Log { - if err := v.MarshalCBOR(cw); err != nil { - return err - } - } return nil } @@ -876,86 +876,8 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.State (sealing.SectorState) (string) - case "State": - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.State = SectorState(sval) - } - // t.SectorNumber (abi.SectorNumber) (uint64) - case "SectorNumber": - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.SectorNumber = abi.SectorNumber(extra) - - } - // t.SectorType (abi.RegisteredSealProof) (int64) - case "SectorType": - { - maj, extra, err := cr.ReadHeader() - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.SectorType = abi.RegisteredSealProof(extraI) - } - // t.CreationTime (int64) (int64) - case "CreationTime": - { - maj, extra, err := cr.ReadHeader() - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.CreationTime = int64(extraI) - } - // t.Pieces ([]api.SectorPiece) (slice) - case "Pieces": + // t.Log ([]sealing.Log) (slice) + case "Log": maj, extra, err = cr.ReadHeader() if err != nil { @@ -963,7 +885,7 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { } if extra > cbg.MaxLength { - return fmt.Errorf("t.Pieces: array too large (%d)", extra) + return fmt.Errorf("t.Log: array too large (%d)", extra) } if maj != cbg.MajArray { @@ -971,89 +893,19 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { } if extra > 0 { - t.Pieces = make([]api.SectorPiece, extra) + t.Log = make([]Log, extra) } for i := 0; i < int(extra); i++ { - var v api.SectorPiece + var v Log if err := v.UnmarshalCBOR(cr); err != nil { return err } - t.Pieces[i] = v + t.Log[i] = v } - // t.TicketValue (abi.SealRandomness) (slice) - case "TicketValue": - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - - if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.TicketValue: byte array too large (%d)", extra) - } - if maj != cbg.MajByteString { - return fmt.Errorf("expected byte array") - } - - if extra > 0 { - t.TicketValue = make([]uint8, extra) - } - - if _, err := io.ReadFull(cr, t.TicketValue[:]); err != nil { - return err - } - // t.TicketEpoch (abi.ChainEpoch) (int64) - case "TicketEpoch": - { - maj, extra, err := cr.ReadHeader() - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.TicketEpoch = abi.ChainEpoch(extraI) - } - // t.PreCommit1Out (storiface.PreCommit1Out) (slice) - case "PreCommit1Out": - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - - if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.PreCommit1Out: byte array too large (%d)", extra) - } - if maj != cbg.MajByteString { - return fmt.Errorf("expected byte array") - } - - if extra > 0 { - t.PreCommit1Out = make([]uint8, extra) - } - - if _, err := io.ReadFull(cr, t.PreCommit1Out[:]); err != nil { - return err - } // t.CommD (cid.Cid) (struct) case "CommD": @@ -1122,63 +974,142 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { if _, err := io.ReadFull(cr, t.Proof[:]); err != nil { return err } - // t.PreCommitDeposit (big.Int) (struct) - case "PreCommitDeposit": + // t.State (sealing.SectorState) (string) + case "State": { - - if err := t.PreCommitDeposit.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PreCommitDeposit: %w", err) - } - - } - // t.PreCommitMessage (cid.Cid) (struct) - case "PreCommitMessage": - - { - - b, err := cr.ReadByte() + sval, err := cbg.ReadString(cr) if err != nil { return err } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - c, err := cbg.ReadCid(cr) - if err != nil { - return xerrors.Errorf("failed to read cid field t.PreCommitMessage: %w", err) - } + t.State = SectorState(sval) + } + // t.Pieces ([]api.SectorPiece) (slice) + case "Pieces": - t.PreCommitMessage = &c + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Pieces: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Pieces = make([]api.SectorPiece, extra) + } + + for i := 0; i < int(extra); i++ { + + var v api.SectorPiece + if err := v.UnmarshalCBOR(cr); err != nil { + return err } + t.Pieces[i] = v } - // t.PreCommitTipSet (types.TipSetKey) (struct) - case "PreCommitTipSet": + + // t.Return (sealing.ReturnState) (string) + case "Return": { - - if err := t.PreCommitTipSet.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PreCommitTipSet: %w", err) - } - - } - // t.PreCommit2Fails (uint64) (uint64) - case "PreCommit2Fails": - - { - - maj, extra, err = cr.ReadHeader() + sval, err := cbg.ReadString(cr) if err != nil { return err } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.PreCommit2Fails = uint64(extra) + t.Return = ReturnState(sval) + } + // t.LastErr (string) (string) + case "LastErr": + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.LastErr = string(sval) + } + // t.CCPieces ([]api.SectorPiece) (slice) + case "CCPieces": + + maj, extra, err = cr.ReadHeader() + 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([]api.SectorPiece, extra) + } + + for i := 0; i < int(extra); i++ { + + var v api.SectorPiece + if err := v.UnmarshalCBOR(cr); err != nil { + return err + } + + t.CCPieces[i] = v + } + + // t.CCUpdate (bool) (bool) + case "CCUpdate": + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.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.SeedEpoch (abi.ChainEpoch) (int64) + case "SeedEpoch": + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative overflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.SeedEpoch = abi.ChainEpoch(extraI) } // t.SeedValue (abi.InteractiveSealRandomness) (slice) case "SeedValue": @@ -1202,8 +1133,8 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { if _, err := io.ReadFull(cr, t.SeedValue[:]); err != nil { return err } - // t.SeedEpoch (abi.ChainEpoch) (int64) - case "SeedEpoch": + // t.SectorType (abi.RegisteredSealProof) (int64) + case "SectorType": { maj, extra, err := cr.ReadHeader() var extraI int64 @@ -1219,14 +1150,152 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { case cbg.MajNegativeInt: extraI = int64(extra) if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") + return fmt.Errorf("int64 negative overflow") } extraI = -1 - extraI default: return fmt.Errorf("wrong type for int64 field: %d", maj) } - t.SeedEpoch = abi.ChainEpoch(extraI) + t.SectorType = abi.RegisteredSealProof(extraI) + } + // t.TicketEpoch (abi.ChainEpoch) (int64) + case "TicketEpoch": + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative overflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.TicketEpoch = abi.ChainEpoch(extraI) + } + // t.TicketValue (abi.SealRandomness) (slice) + case "TicketValue": + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.TicketValue: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.TicketValue = make([]uint8, extra) + } + + if _, err := io.ReadFull(cr, t.TicketValue[:]); err != nil { + return err + } + // t.CreationTime (int64) (int64) + case "CreationTime": + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative overflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.CreationTime = int64(extraI) + } + // t.SectorNumber (abi.SectorNumber) (uint64) + case "SectorNumber": + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.SectorNumber = abi.SectorNumber(extra) + + } + // t.TerminatedAt (abi.ChainEpoch) (int64) + case "TerminatedAt": + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative overflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.TerminatedAt = abi.ChainEpoch(extraI) + } + // t.UpdateSealed (cid.Cid) (struct) + case "UpdateSealed": + + { + + b, err := cr.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := cr.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(cr) + if err != nil { + return xerrors.Errorf("failed to read cid field t.UpdateSealed: %w", err) + } + + t.UpdateSealed = &c + } + } // t.CommitMessage (cid.Cid) (struct) case "CommitMessage": @@ -1266,56 +1335,30 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { t.InvalidProofs = uint64(extra) } - // t.CCUpdate (bool) (bool) - case "CCUpdate": - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.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 ([]api.SectorPiece) (slice) - case "CCPieces": + // t.PreCommit1Out (storiface.PreCommit1Out) (slice) + case "PreCommit1Out": maj, extra, err = cr.ReadHeader() if err != nil { return err } - if extra > cbg.MaxLength { - return fmt.Errorf("t.CCPieces: array too large (%d)", extra) + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.PreCommit1Out: byte array too large (%d)", extra) } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") } if extra > 0 { - t.CCPieces = make([]api.SectorPiece, extra) + t.PreCommit1Out = make([]uint8, extra) } - for i := 0; i < int(extra); i++ { - - var v api.SectorPiece - if err := v.UnmarshalCBOR(cr); err != nil { - return err - } - - t.CCPieces[i] = v + if _, err := io.ReadFull(cr, t.PreCommit1Out[:]); err != nil { + return err } - - // t.UpdateSealed (cid.Cid) (struct) - case "UpdateSealed": + // t.FaultReportMsg (cid.Cid) (struct) + case "FaultReportMsg": { @@ -1330,10 +1373,10 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { c, err := cbg.ReadCid(cr) if err != nil { - return xerrors.Errorf("failed to read cid field t.UpdateSealed: %w", err) + return xerrors.Errorf("failed to read cid field t.FaultReportMsg: %w", err) } - t.UpdateSealed = &c + t.FaultReportMsg = &c } } @@ -1360,30 +1403,63 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { } } - // t.ReplicaUpdateProof (storiface.ReplicaUpdateProof) (slice) - case "ReplicaUpdateProof": + // t.PreCommit2Fails (uint64) (uint64) + case "PreCommit2Fails": - maj, extra, err = cr.ReadHeader() - 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") - } + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.PreCommit2Fails = uint64(extra) - if extra > 0 { - t.ReplicaUpdateProof = make([]uint8, extra) } + // t.PreCommitTipSet (types.TipSetKey) (struct) + case "PreCommitTipSet": + + { + + if err := t.PreCommitTipSet.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.PreCommitTipSet: %w", err) + } - if _, err := io.ReadFull(cr, t.ReplicaUpdateProof[:]); err != nil { - return err } - // t.ReplicaUpdateMessage (cid.Cid) (struct) - case "ReplicaUpdateMessage": + // t.RemoteDataCache (storiface.SectorLocation) (struct) + case "RemoteDataCache": + + { + + b, err := cr.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := cr.UnreadByte(); err != nil { + return err + } + t.RemoteDataCache = new(storiface.SectorLocation) + if err := t.RemoteDataCache.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.RemoteDataCache pointer: %w", err) + } + } + + } + // t.PreCommitDeposit (big.Int) (struct) + case "PreCommitDeposit": + + { + + if err := t.PreCommitDeposit.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.PreCommitDeposit: %w", err) + } + + } + // t.PreCommitMessage (cid.Cid) (struct) + case "PreCommitMessage": { @@ -1398,15 +1474,15 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { c, err := cbg.ReadCid(cr) if err != nil { - return xerrors.Errorf("failed to read cid field t.ReplicaUpdateMessage: %w", err) + return xerrors.Errorf("failed to read cid field t.PreCommitMessage: %w", err) } - t.ReplicaUpdateMessage = &c + t.PreCommitMessage = &c } } - // t.FaultReportMsg (cid.Cid) (struct) - case "FaultReportMsg": + // t.RemoteDataSealed (storiface.SectorLocation) (struct) + case "RemoteDataSealed": { @@ -1418,27 +1494,13 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { if err := cr.UnreadByte(); err != nil { return err } - - c, err := cbg.ReadCid(cr) - if err != nil { - return xerrors.Errorf("failed to read cid field t.FaultReportMsg: %w", err) + t.RemoteDataSealed = new(storiface.SectorLocation) + if err := t.RemoteDataSealed.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.RemoteDataSealed pointer: %w", err) } - - t.FaultReportMsg = &c } } - // t.Return (sealing.ReturnState) (string) - case "Return": - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.Return = ReturnState(sval) - } // t.TerminateMessage (cid.Cid) (struct) case "TerminateMessage": @@ -1462,32 +1524,6 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { } } - // t.TerminatedAt (abi.ChainEpoch) (int64) - case "TerminatedAt": - { - maj, extra, err := cr.ReadHeader() - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.TerminatedAt = abi.ChainEpoch(extraI) - } // t.RemoteDataUnsealed (storiface.SectorLocation) (struct) case "RemoteDataUnsealed": @@ -1508,28 +1544,48 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { } } - // t.RemoteDataSealed (storiface.SectorLocation) (struct) - case "RemoteDataSealed": - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - t.RemoteDataSealed = new(storiface.SectorLocation) - if err := t.RemoteDataSealed.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.RemoteDataSealed pointer: %w", err) - } - } + // t.ReplicaUpdateProof (storiface.ReplicaUpdateProof) (slice) + case "ReplicaUpdateProof": + maj, extra, err = cr.ReadHeader() + if err != nil { + return err } - // t.RemoteDataCache (storiface.SectorLocation) (struct) - case "RemoteDataCache": + + 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(cr, t.ReplicaUpdateProof[:]); err != nil { + return err + } + // t.RemoteDataFinalized (bool) (bool) + case "RemoteDataFinalized": + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.RemoteDataFinalized = false + case 21: + t.RemoteDataFinalized = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } + // t.ReplicaUpdateMessage (cid.Cid) (struct) + case "ReplicaUpdateMessage": { @@ -1541,10 +1597,13 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { if err := cr.UnreadByte(); err != nil { return err } - t.RemoteDataCache = new(storiface.SectorLocation) - if err := t.RemoteDataCache.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.RemoteDataCache pointer: %w", err) + + c, err := cbg.ReadCid(cr) + if err != nil { + return xerrors.Errorf("failed to read cid field t.ReplicaUpdateMessage: %w", err) } + + t.ReplicaUpdateMessage = &c } } @@ -1581,64 +1640,6 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { t.RemoteSealingDoneEndpoint = string(sval) } - // t.RemoteDataFinalized (bool) (bool) - case "RemoteDataFinalized": - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.RemoteDataFinalized = false - case 21: - t.RemoteDataFinalized = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.LastErr (string) (string) - case "LastErr": - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.LastErr = string(sval) - } - // t.Log ([]sealing.Log) (slice) - case "Log": - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.Log: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.Log = make([]Log, extra) - } - - for i := 0; i < int(extra); i++ { - - var v Log - if err := v.UnmarshalCBOR(cr); err != nil { - return err - } - - t.Log[i] = v - } default: // Field doesn't exist on this type, so ignore it @@ -1660,19 +1661,26 @@ func (t *Log) MarshalCBOR(w io.Writer) error { return err } - // t.Timestamp (uint64) (uint64) - if len("Timestamp") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Timestamp\" was too long") + // t.Kind (string) (string) + if len("Kind") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Kind\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Timestamp"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Kind"))); err != nil { return err } - if _, err := io.WriteString(w, string("Timestamp")); err != nil { + if _, err := io.WriteString(w, string("Kind")); err != nil { return err } - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Timestamp)); err != nil { + if len(t.Kind) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Kind was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Kind))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Kind)); err != nil { return err } @@ -1722,28 +1730,22 @@ func (t *Log) MarshalCBOR(w io.Writer) error { return err } - // t.Kind (string) (string) - if len("Kind") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Kind\" was too long") + // t.Timestamp (uint64) (uint64) + if len("Timestamp") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Timestamp\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Kind"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Timestamp"))); err != nil { return err } - if _, err := io.WriteString(w, string("Kind")); err != nil { + if _, err := io.WriteString(w, string("Timestamp")); err != nil { return err } - if len(t.Kind) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.Kind was too long") + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Timestamp)); err != nil { + return err } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Kind))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.Kind)); err != nil { - return err - } return nil } @@ -1785,20 +1787,16 @@ func (t *Log) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.Timestamp (uint64) (uint64) - case "Timestamp": + // t.Kind (string) (string) + case "Kind": { - - maj, extra, err = cr.ReadHeader() + sval, err := cbg.ReadString(cr) if err != nil { return err } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Timestamp = uint64(extra) + t.Kind = string(sval) } // t.Trace (string) (string) case "Trace": @@ -1822,16 +1820,20 @@ func (t *Log) UnmarshalCBOR(r io.Reader) (err error) { t.Message = string(sval) } - // t.Kind (string) (string) - case "Kind": + // t.Timestamp (uint64) (uint64) + case "Timestamp": { - sval, err := cbg.ReadString(cr) + + maj, extra, err = cr.ReadHeader() if err != nil { return err } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Timestamp = uint64(extra) - t.Kind = string(sval) } default: diff --git a/storage/sealer/cbor_gen.go b/storage/sealer/cbor_gen.go index 48bf0146a..4fa7fd980 100644 --- a/storage/sealer/cbor_gen.go +++ b/storage/sealer/cbor_gen.go @@ -48,29 +48,6 @@ func (t *Call) MarshalCBOR(w io.Writer) error { return err } - // t.RetType (sealer.ReturnType) (string) - if len("RetType") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"RetType\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RetType"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("RetType")); err != nil { - return err - } - - if len(t.RetType) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.RetType was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.RetType))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.RetType)); err != nil { - return err - } - // t.State (sealer.CallState) (uint64) if len("State") > cbg.MaxLength { return xerrors.Errorf("Value in field \"State\" was too long") @@ -102,6 +79,29 @@ func (t *Call) MarshalCBOR(w io.Writer) error { if err := t.Result.MarshalCBOR(cw); err != nil { return err } + + // t.RetType (sealer.ReturnType) (string) + if len("RetType") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"RetType\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RetType"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("RetType")); err != nil { + return err + } + + if len(t.RetType) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.RetType was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.RetType))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.RetType)); err != nil { + return err + } return nil } @@ -153,17 +153,6 @@ func (t *Call) UnmarshalCBOR(r io.Reader) (err error) { } } - // t.RetType (sealer.ReturnType) (string) - case "RetType": - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.RetType = ReturnType(sval) - } // t.State (sealer.CallState) (uint64) case "State": @@ -199,6 +188,17 @@ func (t *Call) UnmarshalCBOR(r io.Reader) (err error) { } } + // t.RetType (sealer.ReturnType) (string) + case "RetType": + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.RetType = ReturnType(sval) + } default: // Field doesn't exist on this type, so ignore it @@ -259,20 +259,26 @@ func (t *WorkState) MarshalCBOR(w io.Writer) error { return err } - // t.WorkerCall (storiface.CallID) (struct) - if len("WorkerCall") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"WorkerCall\" was too long") + // t.StartTime (int64) (int64) + if len("StartTime") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"StartTime\" was too long") } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("WorkerCall"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("StartTime"))); err != nil { return err } - if _, err := io.WriteString(w, string("WorkerCall")); err != nil { + if _, err := io.WriteString(w, string("StartTime")); err != nil { return err } - if err := t.WorkerCall.MarshalCBOR(cw); err != nil { - return err + if t.StartTime >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.StartTime)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.StartTime-1)); err != nil { + return err + } } // t.WorkError (string) (string) @@ -298,6 +304,22 @@ func (t *WorkState) MarshalCBOR(w io.Writer) error { return err } + // t.WorkerCall (storiface.CallID) (struct) + if len("WorkerCall") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"WorkerCall\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("WorkerCall"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("WorkerCall")); err != nil { + return err + } + + if err := t.WorkerCall.MarshalCBOR(cw); err != nil { + return err + } + // t.WorkerHostname (string) (string) if len("WorkerHostname") > cbg.MaxLength { return xerrors.Errorf("Value in field \"WorkerHostname\" was too long") @@ -320,28 +342,6 @@ func (t *WorkState) MarshalCBOR(w io.Writer) error { if _, err := io.WriteString(w, string(t.WorkerHostname)); err != nil { return err } - - // t.StartTime (int64) (int64) - if len("StartTime") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"StartTime\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("StartTime"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("StartTime")); err != nil { - return err - } - - if t.StartTime >= 0 { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.StartTime)); err != nil { - return err - } - } else { - if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.StartTime-1)); err != nil { - return err - } - } return nil } @@ -404,38 +404,6 @@ func (t *WorkState) UnmarshalCBOR(r io.Reader) (err error) { t.Status = WorkStatus(sval) } - // t.WorkerCall (storiface.CallID) (struct) - case "WorkerCall": - - { - - if err := t.WorkerCall.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.WorkerCall: %w", err) - } - - } - // t.WorkError (string) (string) - case "WorkError": - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.WorkError = string(sval) - } - // t.WorkerHostname (string) (string) - case "WorkerHostname": - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.WorkerHostname = string(sval) - } // t.StartTime (int64) (int64) case "StartTime": { @@ -453,7 +421,7 @@ func (t *WorkState) UnmarshalCBOR(r io.Reader) (err error) { case cbg.MajNegativeInt: extraI = int64(extra) if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") + return fmt.Errorf("int64 negative overflow") } extraI = -1 - extraI default: @@ -462,6 +430,38 @@ func (t *WorkState) UnmarshalCBOR(r io.Reader) (err error) { t.StartTime = int64(extraI) } + // t.WorkError (string) (string) + case "WorkError": + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.WorkError = string(sval) + } + // t.WorkerCall (storiface.CallID) (struct) + case "WorkerCall": + + { + + if err := t.WorkerCall.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.WorkerCall: %w", err) + } + + } + // t.WorkerHostname (string) (string) + case "WorkerHostname": + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.WorkerHostname = string(sval) + } default: // Field doesn't exist on this type, so ignore it diff --git a/storage/sealer/storiface/cbor_gen.go b/storage/sealer/storiface/cbor_gen.go index 73a299dec..2f82da3e6 100644 --- a/storage/sealer/storiface/cbor_gen.go +++ b/storage/sealer/storiface/cbor_gen.go @@ -30,22 +30,6 @@ func (t *CallID) MarshalCBOR(w io.Writer) error { return err } - // t.Sector (abi.SectorID) (struct) - if len("Sector") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Sector\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Sector"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Sector")); err != nil { - return err - } - - if err := t.Sector.MarshalCBOR(cw); err != nil { - return err - } - // t.ID (uuid.UUID) (array) if len("ID") > cbg.MaxLength { return xerrors.Errorf("Value in field \"ID\" was too long") @@ -69,6 +53,22 @@ func (t *CallID) MarshalCBOR(w io.Writer) error { if _, err := cw.Write(t.ID[:]); err != nil { return err } + + // t.Sector (abi.SectorID) (struct) + if len("Sector") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Sector\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Sector"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Sector")); err != nil { + return err + } + + if err := t.Sector.MarshalCBOR(cw); err != nil { + return err + } return nil } @@ -110,17 +110,7 @@ func (t *CallID) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.Sector (abi.SectorID) (struct) - case "Sector": - - { - - if err := t.Sector.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.Sector: %w", err) - } - - } - // t.ID (uuid.UUID) (array) + // t.ID (uuid.UUID) (array) case "ID": maj, extra, err = cr.ReadHeader() @@ -144,6 +134,16 @@ func (t *CallID) UnmarshalCBOR(r io.Reader) (err error) { if _, err := io.ReadFull(cr, t.ID[:]); err != nil { return err } + // t.Sector (abi.SectorID) (struct) + case "Sector": + + { + + if err := t.Sector.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.Sector: %w", err) + } + + } default: // Field doesn't exist on this type, so ignore it @@ -294,22 +294,6 @@ func (t *SectorLocation) MarshalCBOR(w io.Writer) error { return err } - // t.Local (bool) (bool) - if len("Local") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Local\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Local"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Local")); err != nil { - return err - } - - if err := cbg.WriteBool(w, t.Local); err != nil { - return err - } - // t.URL (string) (string) if len("URL") > cbg.MaxLength { return xerrors.Errorf("Value in field \"URL\" was too long") @@ -333,6 +317,22 @@ func (t *SectorLocation) MarshalCBOR(w io.Writer) error { return err } + // t.Local (bool) (bool) + if len("Local") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Local\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Local"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Local")); err != nil { + return err + } + + if err := cbg.WriteBool(w, t.Local); err != nil { + return err + } + // t.Headers ([]storiface.SecDataHttpHeader) (slice) if len("Headers") > cbg.MaxLength { return xerrors.Errorf("Value in field \"Headers\" was too long") @@ -398,7 +398,18 @@ func (t *SectorLocation) UnmarshalCBOR(r io.Reader) (err error) { } switch name { - // t.Local (bool) (bool) + // t.URL (string) (string) + case "URL": + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.URL = string(sval) + } + // t.Local (bool) (bool) case "Local": maj, extra, err = cr.ReadHeader() @@ -416,17 +427,6 @@ func (t *SectorLocation) UnmarshalCBOR(r io.Reader) (err error) { default: return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) } - // t.URL (string) (string) - case "URL": - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - t.URL = string(sval) - } // t.Headers ([]storiface.SecDataHttpHeader) (slice) case "Headers": From dcfbf7d0a689dd7667601c06d18123ad3c726b17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 8 Mar 2023 18:13:58 +0100 Subject: [PATCH 015/129] fix TestPrintGroupInfo --- chain/beacon/drand/drand_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/chain/beacon/drand/drand_test.go b/chain/beacon/drand/drand_test.go index a65f4399b..7269139ca 100644 --- a/chain/beacon/drand/drand_test.go +++ b/chain/beacon/drand/drand_test.go @@ -3,6 +3,7 @@ package drand import ( + "context" "os" "testing" @@ -20,9 +21,9 @@ func TestPrintGroupInfo(t *testing.T) { c, err := hclient.New(server, nil, nil) assert.NoError(t, err) cg := c.(interface { - FetchChainInfo(groupHash []byte) (*dchain.Info, error) + FetchChainInfo(ctx context.Context, groupHash []byte) (*dchain.Info, error) }) - chain, err := cg.FetchChainInfo(nil) + chain, err := cg.FetchChainInfo(context.Background(), nil) assert.NoError(t, err) err = chain.ToJSON(os.Stdout, nil) assert.NoError(t, err) From 0f5f91c09471d5dae0956d52676590d3220a26a4 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 9 Mar 2023 10:36:13 +1300 Subject: [PATCH 016/129] register rcmgr metrics --- node/modules/lp2p/rcmgr.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index 6abfb1dd7..4fe8ec64b 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -15,6 +15,7 @@ import ( "github.com/libp2p/go-libp2p/core/protocol" rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager" rcmgrObs "github.com/libp2p/go-libp2p/p2p/host/resource-manager/obs" + "github.com/prometheus/client_golang/prometheus" "go.opencensus.io/stats" "go.opencensus.io/tag" "go.uber.org/fx" @@ -114,11 +115,8 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) return nil, fmt.Errorf("error creating resource manager stats reporter: %w", err) } - // TODO: Libp2p converted to native prometheus metrics -- how do we register them - //err = view.Register(obs.DefaultViews...) - //if err != nil { - // return nil, fmt.Errorf("error registering rcmgr metrics: %w", err) - //} + fmt.Println("registering prometheus metrics") + rcmgrObs.MustRegisterWith(prometheus.DefaultRegisterer) // Metrics opts = append(opts, rcmgr.WithMetrics(rcmgrMetrics{}), rcmgr.WithTraceReporter(str)) From 4f060b87bb2016acb265b6bc1d11a2e29e73db62 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 9 Mar 2023 16:44:37 +1300 Subject: [PATCH 017/129] only register metrics once --- node/modules/lp2p/rcmgr.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index 4fe8ec64b..0035ed05b 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -7,6 +7,7 @@ import ( "math/bits" "os" "path/filepath" + "sync" logging "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p" @@ -24,6 +25,8 @@ import ( "github.com/filecoin-project/lotus/node/repo" ) +var rcmgrMetricsOnce sync.Once + func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) (network.ResourceManager, error) { return func(lc fx.Lifecycle, repo repo.LockedRepo) (network.ResourceManager, error) { isFullNode := repo.RepoType().Type() == "FullNode" @@ -115,8 +118,9 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) return nil, fmt.Errorf("error creating resource manager stats reporter: %w", err) } - fmt.Println("registering prometheus metrics") - rcmgrObs.MustRegisterWith(prometheus.DefaultRegisterer) + rcmgrMetricsOnce.Do(func() { + rcmgrObs.MustRegisterWith(prometheus.DefaultRegisterer) + }) // Metrics opts = append(opts, rcmgr.WithMetrics(rcmgrMetrics{}), rcmgr.WithTraceReporter(str)) From b5c88d57146fc6b2e503b453046e8814d54d8fc1 Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Tue, 7 Mar 2023 19:36:11 +0200 Subject: [PATCH 018/129] try to add statenetworkname method --- api/api_gateway.go | 2 ++ api/proxy_gen.go | 31 +++++++++++++++++++++---------- api/v0api/gateway.go | 2 ++ api/v0api/proxy_gen.go | 23 +++++++++++++++++------ gateway/node.go | 2 ++ 5 files changed, 44 insertions(+), 16 deletions(-) diff --git a/api/api_gateway.go b/api/api_gateway.go index 2e877fb1a..62f4be87f 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/dline" + "github.com/filecoin-project/lotus/node/modules/dtypes" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" @@ -63,6 +64,7 @@ type Gateway interface { StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (MinerInfo, error) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) StateMinerPower(context.Context, address.Address, types.TipSetKey) (*MinerPower, error) + StateNetworkName(context.Context) (dtypes.NetworkName, error) StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, 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/proxy_gen.go b/api/proxy_gen.go index ef257e69b..661e50976 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -7,15 +7,6 @@ import ( "encoding/json" "time" - "github.com/google/uuid" - "github.com/ipfs/go-cid" - blocks "github.com/ipfs/go-libipfs/blocks" - "github.com/libp2p/go-libp2p/core/metrics" - "github.com/libp2p/go-libp2p/core/network" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/core/protocol" - "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -32,7 +23,6 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/proof" - apitypes "github.com/filecoin-project/lotus/api/types" builtinactors "github.com/filecoin-project/lotus/chain/actors/builtin" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -45,6 +35,14 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/sealtasks" "github.com/filecoin-project/lotus/storage/sealer/storiface" + "github.com/google/uuid" + "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" + "github.com/libp2p/go-libp2p/core/metrics" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" + "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") @@ -754,6 +752,8 @@ type GatewayMethods struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `` StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*ActorState, error) `perm:"read"` @@ -4750,6 +4750,17 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A return nil, ErrNotSupported } +func (s *GatewayStruct) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + if s.Internal.StateNetworkName == nil { + return *new(dtypes.NetworkName), ErrNotSupported + } + return s.Internal.StateNetworkName(p0) +} + +func (s *GatewayStub) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + return *new(dtypes.NetworkName), ErrNotSupported +} + func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) { if s.Internal.StateNetworkVersion == nil { return *new(apitypes.NetworkVersion), ErrNotSupported diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index 674371c14..fcbc714b3 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" ) @@ -59,6 +60,7 @@ type Gateway interface { StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (api.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) + StateNetworkName(context.Context) (dtypes.NetworkName, 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) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 5fa0d949c..b8359fb42 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -5,11 +5,6 @@ package v0api import ( "context" - "github.com/ipfs/go-cid" - blocks "github.com/ipfs/go-libipfs/blocks" - "github.com/libp2p/go-libp2p/core/peer" - "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -22,7 +17,6 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -30,6 +24,10 @@ import ( marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/imports" + "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" + "github.com/libp2p/go-libp2p/core/peer" + "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") @@ -481,6 +479,8 @@ type GatewayMethods struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) `` StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `` @@ -2842,6 +2842,17 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A return nil, ErrNotSupported } +func (s *GatewayStruct) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + if s.Internal.StateNetworkName == nil { + return *new(dtypes.NetworkName), ErrNotSupported + } + return s.Internal.StateNetworkName(p0) +} + +func (s *GatewayStub) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + return *new(dtypes.NetworkName), ErrNotSupported +} + func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) { if s.Internal.StateNetworkVersion == nil { return *new(abinetwork.Version), ErrNotSupported diff --git a/gateway/node.go b/gateway/node.go index 90a6812b5..ac83f12bc 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -25,6 +25,7 @@ import ( _ "github.com/filecoin-project/lotus/lib/sigs/bls" _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" + "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/impl/full" ) @@ -71,6 +72,7 @@ type TargetAPI interface { StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MarketBalance, error) StateMarketStorageDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*api.MarketDeal, error) + StateNetworkName(context.Context) (dtypes.NetworkName, error) StateNetworkVersion(context.Context, types.TipSetKey) (network.Version, error) StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*api.MsgLookup, error) StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*api.MsgLookup, error) From 857b0205a8c478b38fc948a05d502ea057711c08 Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Tue, 7 Mar 2023 21:29:49 +0200 Subject: [PATCH 019/129] add method implementation --- gateway/proxy_fil.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gateway/proxy_fil.go b/gateway/proxy_fil.go index 1f6ee2ccc..ba0c98579 100644 --- a/gateway/proxy_fil.go +++ b/gateway/proxy_fil.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" + "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" @@ -308,6 +309,13 @@ func (gw *Node) StateMarketStorageDeal(ctx context.Context, dealId abi.DealID, t return gw.target.StateMarketStorageDeal(ctx, dealId, tsk) } +func (gw *Node) StateNetworkName(ctx context.Context) (dtypes.NetworkName, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return *new(dtypes.NetworkName), err + } + return gw.target.StateNetworkName(ctx) +} + func (gw *Node) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return network.VersionMax, err From 3aac4b45ab9b47c53c0ab40b3cb20be0aa5243a8 Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Tue, 7 Mar 2023 22:19:20 +0200 Subject: [PATCH 020/129] add MPoolGetNonce --- api/api_gateway.go | 1 + api/proxy_gen.go | 13 +++++++++++++ api/v0api/gateway.go | 1 + api/v0api/proxy_gen.go | 13 +++++++++++++ gateway/node.go | 1 + gateway/proxy_fil.go | 7 +++++++ 6 files changed, 36 insertions(+) diff --git a/api/api_gateway.go b/api/api_gateway.go index 62f4be87f..8de636516 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -48,6 +48,7 @@ type Gateway interface { ChainReadObj(context.Context, cid.Cid) ([]byte, error) ChainGetGenesis(context.Context) (*types.TipSet, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 661e50976..9fc69dde5 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -718,6 +718,8 @@ type GatewayMethods struct { GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `` MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `` @@ -4563,6 +4565,17 @@ func (s *GatewayStub) GasEstimateMessageGas(p0 context.Context, p1 *types.Messag return nil, ErrNotSupported } +func (s *GatewayStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + if s.Internal.MpoolGetNonce == nil { + return 0, ErrNotSupported + } + return s.Internal.MpoolGetNonce(p0, p1) +} + +func (s *GatewayStub) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + return 0, ErrNotSupported +} + func (s *GatewayStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { if s.Internal.MpoolPush == nil { return *new(cid.Cid), ErrNotSupported diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index fcbc714b3..f157617d9 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -45,6 +45,7 @@ type Gateway interface { ChainNotify(context.Context) (<-chan []*api.HeadChange, error) ChainReadObj(context.Context, cid.Cid) ([]byte, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index b8359fb42..88d3def63 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -449,6 +449,8 @@ type GatewayMethods struct { GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `` MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `` @@ -2677,6 +2679,17 @@ func (s *GatewayStub) GasEstimateMessageGas(p0 context.Context, p1 *types.Messag return nil, ErrNotSupported } +func (s *GatewayStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + if s.Internal.MpoolGetNonce == nil { + return 0, ErrNotSupported + } + return s.Internal.MpoolGetNonce(p0, p1) +} + +func (s *GatewayStub) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + return 0, ErrNotSupported +} + func (s *GatewayStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { if s.Internal.MpoolPush == nil { return *new(cid.Cid), ErrNotSupported diff --git a/gateway/node.go b/gateway/node.go index ac83f12bc..5a51fe62c 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -60,6 +60,7 @@ type TargetAPI interface { ChainPutObj(context.Context, blocks.Block) error ChainGetGenesis(context.Context) (*types.TipSet, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) MpoolPushUntrusted(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) diff --git a/gateway/proxy_fil.go b/gateway/proxy_fil.go index ba0c98579..50da42cba 100644 --- a/gateway/proxy_fil.go +++ b/gateway/proxy_fil.go @@ -188,6 +188,13 @@ func (gw *Node) GasEstimateMessageGas(ctx context.Context, msg *types.Message, s return gw.target.GasEstimateMessageGas(ctx, msg, spec, tsk) } +func (gw *Node) MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return 0, err + } + return gw.target.MpoolGetNonce(ctx, addr) +} + func (gw *Node) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return cid.Cid{}, err From fb569d4c2c4371960f4f4d9cd509ad098469eb7a Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Wed, 8 Mar 2023 03:15:52 +0200 Subject: [PATCH 021/129] add two more methods: StateCall and StateDecodeParams --- api/api_gateway.go | 4 +++- api/proxy_gen.go | 26 ++++++++++++++++++++++++++ api/v0api/gateway.go | 4 +++- api/v0api/proxy_gen.go | 30 +++++++++++++++++++++++++++++- gateway/node.go | 4 +++- gateway/proxy_fil.go | 20 ++++++++++++++++++++ 6 files changed, 84 insertions(+), 4 deletions(-) diff --git a/api/api_gateway.go b/api/api_gateway.go index 8de636516..575050623 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -55,9 +55,11 @@ type Gateway interface { MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) MsigGetVestingSchedule(ctx context.Context, addr address.Address, tsk types.TipSetKey) (MsigVesting, error) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*InvocResult, error) StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (DealCollateralBounds, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) - StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*ActorState, error) //perm:read + StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*ActorState, error) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (MarketBalance, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 9fc69dde5..8ea8c7d45 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -736,8 +736,12 @@ type GatewayMethods struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) `` + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) `` + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` + StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `` @@ -4664,6 +4668,17 @@ func (s *GatewayStub) StateAccountKey(p0 context.Context, p1 address.Address, p2 return *new(address.Address), ErrNotSupported } +func (s *GatewayStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) { + if s.Internal.StateCall == nil { + return nil, ErrNotSupported + } + return s.Internal.StateCall(p0, p1, p2) +} + +func (s *GatewayStub) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) { if s.Internal.StateDealProviderCollateralBounds == nil { return *new(DealCollateralBounds), ErrNotSupported @@ -4675,6 +4690,17 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a return *new(DealCollateralBounds), ErrNotSupported } +func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + if s.Internal.StateDecodeParams == nil { + return nil, ErrNotSupported + } + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) +} + +func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { if s.Internal.StateGetActor == nil { return nil, ErrNotSupported diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index f157617d9..b83dd0539 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -51,7 +51,9 @@ type Gateway interface { MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 88d3def63..fc321f594 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -461,7 +461,11 @@ type GatewayMethods struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `` + + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` + + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` @@ -2734,6 +2738,8 @@ func (s *GatewayStub) MsigGetVested(p0 context.Context, p1 address.Address, p2 t return *new(types.BigInt), ErrNotSupported } + + func (s *GatewayStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { if s.Internal.StateAccountKey == nil { return *new(address.Address), ErrNotSupported @@ -2745,6 +2751,17 @@ func (s *GatewayStub) StateAccountKey(p0 context.Context, p1 address.Address, p2 return *new(address.Address), ErrNotSupported } +func (s *GatewayStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { + if s.Internal.StateCall == nil { + return nil, ErrNotSupported + } + return s.Internal.StateCall(p0, p1, p2) +} + +func (s *GatewayStub) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) { if s.Internal.StateDealProviderCollateralBounds == nil { return *new(api.DealCollateralBounds), ErrNotSupported @@ -2756,6 +2773,17 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a return *new(api.DealCollateralBounds), ErrNotSupported } +func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + if s.Internal.StateDecodeParams == nil { + return nil, ErrNotSupported + } + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) +} + +func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { if s.Internal.StateGetActor == nil { return nil, ErrNotSupported diff --git a/gateway/node.go b/gateway/node.go index 5a51fe62c..babf844a2 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -67,7 +67,9 @@ type TargetAPI interface { MsigGetVestingSchedule(context.Context, address.Address, types.TipSetKey) (api.MsigVesting, error) MsigGetPending(ctx context.Context, addr address.Address, ts types.TipSetKey) ([]*api.MsigTransaction, error) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) diff --git a/gateway/proxy_fil.go b/gateway/proxy_fil.go index 50da42cba..e3e8d5312 100644 --- a/gateway/proxy_fil.go +++ b/gateway/proxy_fil.go @@ -256,6 +256,16 @@ func (gw *Node) StateAccountKey(ctx context.Context, addr address.Address, tsk t return gw.target.StateAccountKey(ctx, addr, tsk) } +func (gw *Node) StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return nil, err + } + if err := gw.checkTipsetKey(ctx, tsk); err != nil { + return nil, err + } + return gw.target.StateCall(ctx, msg, tsk) +} + func (gw *Node) StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return api.DealCollateralBounds{}, err @@ -266,6 +276,16 @@ func (gw *Node) StateDealProviderCollateralBounds(ctx context.Context, size abi. return gw.target.StateDealProviderCollateralBounds(ctx, size, verified, tsk) } +func (gw *Node) StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return nil, err + } + if err := gw.checkTipsetKey(ctx, tsk); err != nil { + return nil, err + } + return gw.target.StateDecodeParams(ctx, toAddr, method, params, tsk) +} + func (gw *Node) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return nil, err From 649b0769ba679ededa0e621c7e6a82949eb13aa9 Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Wed, 8 Mar 2023 18:53:19 +0200 Subject: [PATCH 022/129] run make gen --- api/api_gateway.go | 4 +-- api/proxy_gen.go | 38 +++++++++++---------- api/v0api/gateway.go | 8 ++--- api/v0api/proxy_gen.go | 60 +++++++++++++++++----------------- build/openrpc/full.json.gz | Bin 33286 -> 33287 bytes build/openrpc/gateway.json.gz | Bin 8480 -> 9295 bytes build/openrpc/miner.json.gz | Bin 16039 -> 16043 bytes build/openrpc/worker.json.gz | Bin 5220 -> 5221 bytes gateway/node.go | 12 +++---- gateway/proxy_fil.go | 24 +++++++------- 10 files changed, 74 insertions(+), 72 deletions(-) diff --git a/api/api_gateway.go b/api/api_gateway.go index 575050623..9bc69cc0f 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -12,10 +12,10 @@ import ( "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/lotus/node/modules/dtypes" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) // MODIFYING THE API INTERFACE @@ -48,7 +48,7 @@ type Gateway interface { ChainReadObj(context.Context, cid.Cid) ([]byte, error) ChainGetGenesis(context.Context) (*types.TipSet, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) - MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 8ea8c7d45..70579af1a 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -7,6 +7,15 @@ import ( "encoding/json" "time" + "github.com/google/uuid" + "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" + "github.com/libp2p/go-libp2p/core/metrics" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -23,6 +32,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/proof" + apitypes "github.com/filecoin-project/lotus/api/types" builtinactors "github.com/filecoin-project/lotus/chain/actors/builtin" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -35,14 +45,6 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/sealtasks" "github.com/filecoin-project/lotus/storage/sealer/storiface" - "github.com/google/uuid" - "github.com/ipfs/go-cid" - blocks "github.com/ipfs/go-libipfs/blocks" - "github.com/libp2p/go-libp2p/core/metrics" - "github.com/libp2p/go-libp2p/core/network" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/core/protocol" - "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") @@ -718,7 +720,7 @@ type GatewayMethods struct { GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `` - MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `` MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `` @@ -736,11 +738,11 @@ type GatewayMethods struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) `` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) `` StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) `` - StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` @@ -758,11 +760,11 @@ type GatewayMethods struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` - StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `` - StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*ActorState, error) `perm:"read"` + StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*ActorState, error) `` StateSearchMsg func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*MsgLookup, error) `` @@ -4691,14 +4693,14 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a } func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { - if s.Internal.StateDecodeParams == nil { - return nil, ErrNotSupported - } - return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) + if s.Internal.StateDecodeParams == nil { + return nil, ErrNotSupported + } + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) } func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { - return nil, ErrNotSupported + return nil, ErrNotSupported } func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index b83dd0539..2a0bfb2f7 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -12,9 +12,9 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) // MODIFYING THE API INTERFACE @@ -51,9 +51,9 @@ type Gateway interface { MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) - StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index fc321f594..17a1ae84a 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -5,6 +5,11 @@ package v0api import ( "context" + "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" + "github.com/libp2p/go-libp2p/core/peer" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -17,6 +22,7 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -24,10 +30,6 @@ import ( marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/imports" - "github.com/ipfs/go-cid" - blocks "github.com/ipfs/go-libipfs/blocks" - "github.com/libp2p/go-libp2p/core/peer" - "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") @@ -461,11 +463,11 @@ type GatewayMethods struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` - StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` @@ -485,7 +487,7 @@ type GatewayMethods struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` - StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) `` @@ -2684,14 +2686,14 @@ func (s *GatewayStub) GasEstimateMessageGas(p0 context.Context, p1 *types.Messag } func (s *GatewayStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { - if s.Internal.MpoolGetNonce == nil { - return 0, ErrNotSupported - } - return s.Internal.MpoolGetNonce(p0, p1) + if s.Internal.MpoolGetNonce == nil { + return 0, ErrNotSupported + } + return s.Internal.MpoolGetNonce(p0, p1) } func (s *GatewayStub) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { - return 0, ErrNotSupported + return 0, ErrNotSupported } func (s *GatewayStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { @@ -2738,8 +2740,6 @@ func (s *GatewayStub) MsigGetVested(p0 context.Context, p1 address.Address, p2 t return *new(types.BigInt), ErrNotSupported } - - func (s *GatewayStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { if s.Internal.StateAccountKey == nil { return *new(address.Address), ErrNotSupported @@ -2752,14 +2752,14 @@ func (s *GatewayStub) StateAccountKey(p0 context.Context, p1 address.Address, p2 } func (s *GatewayStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { - if s.Internal.StateCall == nil { - return nil, ErrNotSupported - } - return s.Internal.StateCall(p0, p1, p2) + if s.Internal.StateCall == nil { + return nil, ErrNotSupported + } + return s.Internal.StateCall(p0, p1, p2) } func (s *GatewayStub) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { - return nil, ErrNotSupported + return nil, ErrNotSupported } func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) { @@ -2774,14 +2774,14 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a } func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { - if s.Internal.StateDecodeParams == nil { - return nil, ErrNotSupported - } - return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) + if s.Internal.StateDecodeParams == nil { + return nil, ErrNotSupported + } + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) } func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { - return nil, ErrNotSupported + return nil, ErrNotSupported } func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { @@ -2884,14 +2884,14 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A } func (s *GatewayStruct) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { - if s.Internal.StateNetworkName == nil { - return *new(dtypes.NetworkName), ErrNotSupported - } - return s.Internal.StateNetworkName(p0) + if s.Internal.StateNetworkName == nil { + return *new(dtypes.NetworkName), ErrNotSupported + } + return s.Internal.StateNetworkName(p0) } func (s *GatewayStub) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { - return *new(dtypes.NetworkName), ErrNotSupported + return *new(dtypes.NetworkName), ErrNotSupported } func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) { diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 16fe7b83776c9d828aa2ede1cf17758a94cc5897..bd8810929825a503b8986d7178ffbda8f4354c82 100644 GIT binary patch delta 29893 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 z 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 ImU*uR07|*-J^%m! delta 29882 zcmV)!K#;$OgaU?y0+1a7II*!GG6H`Gd+$V_N>

1UWbHRB5)vGDHg3m|RMwD=9;v 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 60bf3dd77bde07d331b381e82d05337fa280d76c..b25ce7cbe1ab3cfd377be9c3d92391adffab78bd 100644 GIT binary patch delta 9070 zcmV-!Baz&oLeEHlABzY8000000RQa0dvlvO_c;Dm7=Hh>9XGX&bMs99$gOFfZL`@V z-F}{@?fg~-*;a#r1=+FN$$S3}NPxIY7&|1O)7JK|Hk$PaS^y zty*B_cl&@$sN2ZeIhg`vokM(V+WOsR=y_lQJ+-46(9>PyU;^u(fBu=+->vc7(v?@9 z^5z_1cn?-L*q!V6wUP_umD5#p+rn^(cTULP9mVM>Ix==nknvi1^(N82qd?cS-Pg+R z@78yW#)`Lpb75iVTENVorSks0Vj+{X|BhXV=dR^H=_qHeduijFx#QR_hKAqZ!T%p^ zQw8~z)AgtN`n&b;-TLRBf7FiZ&1W;xs}1z0OZw`VhGVNV&` zu7an?Q^>CGs2$Y-E|`(Mn!En)k5+FT+e5+T($|T9ujBMGUx4mfVkZ6%eF|rQMTlUl zEv#G^(86eppqqhpf(*rljtjkD#z66)IetspjF2@UpUuJwFbo%Z9yAmbLEBL-u!4eh z&Y+=;Rtix5CP>#&fO29RP*+~vPmw-VkYykpVCauAo0}Nv{@b?>(C?rTje=JWe60Y> zP=NA(*>5!k-qhbWxCArDgk)>p`TGXOtN!R0&>_(7J!87J(tx&yN1AsBXUB!M7?>XP`?=7Yo7mrI`iB5q8Lu^;jRIy%ThreUNhA{;Da1#faVP=s zG!1e4w>pCc3OLaSS-@SLS-NfboY6-F5AF^8*0ek2nGb{zMOQ*;Qn*{l0IHYukkg$$ z0ImyG0p$d!&Y;=T6pf|QKJ&TKn~>tT^@xsP(vnmqsjg3|2`MOmQbbPH-JaktL7fR# zbDM`)-K0(U)Xkh{zA{WKmQ!2L;alejPv;}Wg)zvkgiFTfQbW;sh;TI$m7^HVc-_sfOu6>y=2 z*FCF9La7$P-+l;4-z4ySA^gUI_c7Ghbp&!|4N@*kxm+rjBYewjFZ-ri8WUq7EBETH zu=Bz^{trKXbV8roHz8jK-E=YcUp-IVnnRU&Oc+7MAUE-vJZ;&vcfccmyRM-Qk%QNi zT_F@6*_BkdX-|Gh77kS^$#Tb7L#{FFlX6YUwF~_@a z0DtqP#X0c4c>a_RJL=iO|FGA#jhm8}_2ox$E@HerUOcDuM|Oaxak!PW?6MaiR`w68 z#0s9)7bbXGBtlpp@*i-2)lr;&`WX=~A0aSKroiGgkMOiyl*I6A3Xot;{u=x_w@GxQ zwvU(dG@@o_)K^FIrr5Ox+TH#{n_Dh4e(jH!)?o5;SJMp59%%SqtMBxYvs_Nyg+5(C zHDEp)I0A?_tuHriJy94_Po4lwyye=*TbAJ}i@?+hOfG6CR2~|C)fZUN`D|Jm(a}Y` zYA--g9CphEMZsYqr>G#kIfX@?LtE0a(L<|f&TX?HBu^7QPLfC68{-_kZjXm^9E~w_ z=?<;ML>NFt`~-{;8U4($^=X0bS(C*u!*77wBp264Ei}2e)qae~bW4J{3?3`UQ-BgR zVd$*a?R9&Mh^1|Rq(&&Y=kwy8y*>~3JYF@yIzuRr!8gOPH^4NRWl4@HIi}>8&zocR zwGxi`5qN)&e%4}>q-*t=*vPicO1?*ci`JC&xD_|#(J_T8W$pCdO`ru`AB*4jyZ!FlUhi$cf7?A6_WQ#@|7~|~ z*zG2ZY5nMA>T~(j>HzF-{8b{1VdqV8umYhhj#!0%r%a9q1rcm#czUGk_S_PWhGx3v z6Xmxb5KjpT`E7|nDWgaRVyS@70V_n2$(gr-D0A18BVh7daX6CI?s8WjL8y-p4-IW> zjI?oo7i!%@UGMJ=#{EHeH0ti{4Z2!SO$H0a|El9!&-l@QbkrGGUJ#)DZbzLVi}{rf z26|ou@j?A=lhOz`e`}vewUiEe1<@{NczObIZ0~9U@VgaRne5l{+XZK`M9WT5#_C2c%}O>ZQpDmW&2g90L`qhedM#{_t!3;Fkzi}WBPaoP2?%`iVP z_+^mNe%)nvUlmOHH)yq^f&ymwLa;IcBV8eEOiK$iJ4&_Se~o7l>?Tj{NW9geIri9o z+$ApRlm@767?i~ZP>Y|-bC8GvZ_=xgVO*u;AGY9_aX@AXow6xS@;Rx7{eloCpVdwQ zvMz*A*W#WHse}~TM%BT1#!?l05vrh85QuVyr)M5UGl1basNFp?88#LGDdo<_<<6iWnCT2pKS1~qdDwPWHN;Nbxk&2#^lZy@^qp&P zPb%J|#7+#MLiEH9IVDfrK~(xAR@FA)li5%{yX5$uoV&KeE~#PzB}iG=j7J39rU5;2 z|4JkzN5F$0AiRREuX+&^&flpCDJpRdFtXL*w_blo1Pi8p50i@uCx3N+w;zfEMBspayL-egwGG8zNDzq{$4@(YX7T4 zd<;xr)kE{BGml{#9lRGFdT`M~H0EZhfn8eLk3d9D;Drw0H=&b=oVq_lhqh#8Yq7HZ zf&gJkvcAG}y!r?{;eRq%82~&i&2Ja*vypA5opu2z4rUgQ$ji`zF#Q_*EU~t>^ECPm zxoAM!-#hH;W2o=xz0r7}Yoo*d!GXRHc8&c54IUosYdv__9d*G#@9ppFeW2|R^nGwR z=gobY%z!&7gCV+DAr>oro}w z)~5&u1xbbp!@G7)MH)nrXM#AYn(;>nC0wlOk%(5+MxVsiJ&2R>3=@CS%$H`qH1nmI zFU|Z%H}emRi}`x2C-&UJYX>9b1LO@(sFO%kKJrF$iz*l0wuo;Tu^=-_+Qz1| zUU6}kVgg&+J6QyhhgDH-(I~UpLdh78rMH=3wVAdg>v$B_(J!uta}LR^ueCUY-?Nz* zagM?`bi7U0#)+5I#xs8l85{mIW5Z>!lWp@mt+?39Im923iJ?pGNUc-(Aq|3u1CkCG zr>~V)Z?ey?1N^Dxe~Domxr`uxIc-*N!kv^hS>-iHMTnNY`pKTG#k>6e+h$z;n2mESx)8~-B+HU4>(K*P)^3ye4IzK%Yu#SI z-&F%*3QSUAgA>~h(&-gZg7GNPm|Hj|s}4L!{|+u3di+y$=5s|gN~nb!oWPd7BVQ(O zciVCr*%W7$;^-NPqrH;)FA#r*o(CrI1R2LG#>rp*NVfzam++!zx^L)JOx04VWWWZ6 zSNXD9Ez{(wEf;@_@BT{drM!O>>=7>oYb#gXFD*E9gKZZ~;F0kC_o?op2TD2TNRGDF zF;g^^4WBi!OAZg5{K>b8tI9(songy{|`#5G%*_D@#;7N)<({}Bn%zm`pLTa;`FKrcRt4Lc# z+A7jkk+zDoRiv#VZI!2Ks|>oO#V!(Bbp3d!3>cv(sI|U`PpPtk)OJ!hZ zj@qAnFZF(@_e;HB>itshmwLa{`=#Fh)b##-Y4xadsiU>k{s2lNrD1sMMWqMdbcv{( z#kT!`LB{VsnW8bW5Y|SxpjKK4E0yDPyvj?B5#@vtq#|xeQ*F|o4-&X4!1bbmHsk(a z*U>f)h|E@c#B6`1O8-i(A5l83o+JYulvdVa*u^y|<-Ruiq;Lc(Bfkk;cC?=m2c>;B z!$0GNw2ga8N)%>qEQ)1WTk0*3>lmlf(3`&wDCxr8iUWB&eqy)5D~UV|@H}=V`y9sw zIt~pd!I|mv+1vyeE#P_TGNSb5L~uNYI&FC6B0ctd=Uji1t+5fhYYPm-8dh>{y3fh}NqtU5(MMebC3s{ZpdaXhBmF^AN+E||*Fov3%Q6(wWY1E_NkJKv6XAgVs^`QBoXrJsPvJCa}@U-t2m$1Bq_v?^jAthE+ zRjx;++al0tRc&*x%Ua7DQNi2k7Lc`;n}~jq;_TUpvxDN=p_lOf3R(uTCd_f^Is&c; zT9e9W(HNT-bS0~kYN@2-4b$;qaSg~T*T%MPn>6652JNOGRMRV0aBvFhMgxPhD`*={ z%E*7xP0+<|x3~t-4YZ7FaL+L88l;g0!V?ljDpMzEh9j^vI~XU?1R+?0B$KK&YjOu-y-Jo)3Ytt(RZ%F{Z&9$Dds}~1S3|e z+0kg6+$RZKm=7^)Ya9E?Y%3oX9^b!z|8x)7PxAAXGNMdV$&y;nlC+Z^6Fz@1D9*n7 zVtH$*B}{J~%1`MDob>ONYa{h&-)phbAqB3a{syUkw;*-w9C&9QMl*mRy>PHb+*K}+ z!Xs{i*0f_WFO?K<%g>NLEqw`;wGk@f-dfmW)z6>N)T}p&7#J@G$uC z0m2jD#4oR0I79OpeegM0vO4T_RBB)i)&E*%_kTCXQ{DQ{6#n)8z1mSvE>8WaCev+4 zBgcS~g{z@~ZhP<^PgmY#cX_vT{vBKW`?3COZ?@=9XZ9Vw9~sL#upEDQ>Vx3v`v;n4 zAeNlKth+{6x_><3r0j-@juh@a&p4O-^>)JV_* z1CIpElo%RsiM@=4luo%Owtuw=DPoyE6>~Gs{Hhs!-cs4N*DXk>q`doY==l?_C)!Bo zH6&X>7?hx*Po}X!^*&l>TVtT4jC&3;PKIPiYp4YhqgRk>%rHY_O>XolH0EYq&rk}= zde)H-lLF)v7tGKla)W_ee^+cI*C_2HDLb~u1{w6t>|^pB&nfDKg)jnU=ny7G&#4$-R>k<78n;9b zP6vyMV0m_RQVEty@b;A8?3Zo(mv1Te+bhVg4G8=Mm{}Euhwu3v1@dTfQf4o#g{@x) zpS_aX`J*+GB+Jgde~tW1W*y0_BN=D<*jYzXhBuUA$?*6rt4qG*N(k^KCnRgPk?r*1 zy_n>J&)(!(4?fP>65$iufajPS(va4Mmo znQzNnt*Um^W8lFL5FV4Y`cM8`K$q6bK(@ua_>3&*UO@|(e|W_{x<%m!y@unt6+*tX zF)+z0)UH49*%In=ALgwK2>X?2_PA(v<|~(xyrNEyjvBj-_qx%41SzM$olu^0$@*BL zzNW1QZ+&e#`}PyEpgQdJwT}8>Zs`es3~dyIt4xA5>*Ozw{I#G@7xeLhKF2sU&)`P4 zKr_0Tk91&~e-V$A$R?3(3&=+9iVhK2rBIl1JU@bRk#UCaOzVbk_Y;Gk18F^!gM`cuOOly-}vfpN7b*_3{ zt$wAevg4mEh4;yfl4eez@(3=op#_b&PNYzDYyg(z1VFfgZ7tQew)*%?MA1P(**D4{ zb=!c^jYxGwPYggLuFq$2L=U~3&jNY#?Z;?^e|;G=$PqorXX|62!`}}a5+|NgbD=P) zg|ec6E-L28jx{W0Yh+>Z-X;OEVYA&;~8bEVoH(6FY*|slG(@P zI}QO?EX~-{f@dOA4hw2)1)TC6;v*f~!k3UGI1tk~UVj-nc`b@v&aUGm_x@+H4ll+sd-_Z;sK?^(tBWg#7ea(la0fbhP|%V49Q-@vA5)JGZ6X+K1vaka>vniqw z;%~zfNJ_u6=pZcaig~>m9Oa5?j&M_WiaB_<=`xS`WKbhMnxWb#@hptYf6Gtc2#H1j zN3&$awZ;rpa`j>;lc#-(Y`1y!SzEQq-GY*ZL~TMAbT6#2T~CV)d#`EPhhVA|$gpLZ zMIW}QVa+q^X{GWgE%|4vE*8@v`-VqV{PW&Qs$^en_b&P565eMY`ef_cCPl3@>X7y) zQ(#SCQc=2s(7iC!q1x-8e`$^Z|;2na}%GLzzGs)=z@-+1;RMkb{o+A`{e8A{P_ojrzg59~R5_3?;eEldm++nidkOC|kmI|2lX@E`e{lWO z#R44TnSPcM8@p49B{l|Vt<1kPY=)}{C#({lC9JAb){|3Xp_tTaTxyjftE^_7OJsS? z(sVAm;uQIFrGiEbWPPM&IWEuGWsF#`f6V#0I@UzQ95MIu;;i<{%1M))cKbfZFUf5& z1l`vR6^;S%84W?x2HnlGy$#avB z`(*{k3HrJA0$Gz&2n-WhH6v$o0IexA0~kB}j<(e3O-s+r+N2zna&(Jwe>5hCtQ<|e z~!JswBT zz6PdIFi1#7)W!9c8cjZhkp{_55qx4|6}whz;Go2Jq5yc2zw~xKl8BQ(e?V;_h*v1H|DLXf zT7VT<8>O(_hN`k0)DACgC*wKjmQ}{MhQJ_kQgwJv)O$_i{fLH7;cA&14cVN<&aOh5 z>C#N!qM05ee%4G+yyG#`lQk!rEtC<)QVK^_Y`5w}MaXCFEeX%ej5_F*m6EuDz}2Up zJ>h%Blf60B%YfhOf5_N5K}Jwf4~)>x$rKOQfg7~K?@TNOSjkcN3-#}@=Y_Y;5JJ?`B;a<0iYKz(0hTEwqoPSat^2?lqa^@A+ zIeF9f_gzCBBBy1Sdy&CUp-%4cAWXC|`e=$hcGQm$O{TcsxkK2O$LU=A>JR4Y%3A}n z@dXT;iCxwee`4f|P7punmz63a5tio=*G}t6KoBhtO*#{CQ*a}}n;Ej8OI!YF1=5Wx zDj_kkCN{)vq>*7`s>|Uz zi9QjN(89q$IPStsCAhHPPB^VjZUn=j!!;tjmb zBjzFKe^E_QQk~u*Q{$RylE(6)p!4|6%hs8-vO;%p*#HDB>_3{YoRLvPyGb0m5}p!D!zi))$|5 z^_4lY@ZO-gqc1via~v;TOPi0qN3B+s4XxsyD1 zlIKpv>f&BODY=?4`NeVgua#FvR~H;%_SK>FF&v?2`gm?_$Rvpuk=f(KD;|jwU87G) zMOg&b@po8A!=BbV7<4=8v1#jfr_cl|bvWpYdU6?nJoL^E##!t!0$xD;&xG*y3rezl ze+8yl`+|l#?Uq}*uS4xFxK>3vTUHz^K(O%B{+8`*Y07&n4^q2#M g6H@V+Wmp~@YU;zokB9#k00960YR delta 8246 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index b3f1e3c25f2b1e6b352f3e15e086937d8fd5f649..1bbcff07417c74e3b4f49e6af62f4194f3a6f970 100644 GIT binary patch delta 14255 zcmV;gH&Do@eXD)24FZ1-j*Q30UNP04P%_7h#jElHw5v_SA>Lb| z0|S49w6N`(-Wm?nqB7B@XZoJOQ0WLnDjjA7f8=5B>s)RqWYpUf}xO`J>U#L zT2q5paEAAz?@EPf)U?PRNWiQvN)zMYcsG`%;iNl*-Pis~6DBdG*)gPF=L{h*Q^|TY zLv9AlZ{jh)9)N!!Y!VyxXgr!69gGe~)5Du+aDL10nmLF4K>>6AiP_R};r&}^Lt-}I z&=jCtHl5-9PxKa%H!Hd(+~hH_wSR)GQvOVJP{5=<#OmCc9Ya2grqO}6P47LxD7g3E zfSLbl?$Q-l@fib|hB3lF@69&#KL>Qi9g`7FTd^sE!d5AE+A|A5md$P?8lZ9jozQl6rkp*xF zZ6BO5E~0<5kYfoV(4z#ke&J9 zT9u&r-Lx!63&)c$O$+b~1nUxkS=0*9IVXG}RCQ!-Ct^Dh+lkoS60yUPTEw0#k$HRJ z(mOb_>q*rFgd#zDi58gShpY>F#V%Y*=RM#I!IvA4Q5VmliTvHiC7S;PUag?>CEAh5 zO~rqWT#O>|o4}_);ue6fB!$!C=i}w$+U{;sJ)c|Kven zALtB0#OfS`?=uul&d8h=O7uj}B_6{NVl^S29^8{j@yujxO@szZhWPeG>V!6o%!=nw@$L(4_>_?A`GcsZC%$KK zIGz-W!@y>$Eer*KJW=@NX12yQ!$fR~z5RC&3=s=iQu9fn=M06!ehmr7L8u0WpV!mcA*gSiSMD<35v z)>b8K`5Ne&n^#D1D4iR}hdm>1y%@(w!GmAXrY+gf6FnlURdG|-42}(6$FfaeUQtrT z=dsSGHLU99MscBf%rdy1E9ve1KmTbYR;-QzkWu%|hd5FWF%ni=v|tAPK?{E-%vd#m zlxW@FAZqWWRR&M4h%Oa{8cu_x1dKl55>Wj0cEk8v8e;V~g zO{^CkQ4>ewo3TO`7MRa4f$ruVF{#C+1DBm1nvP@9Aw@gDx-7DzR?uWxXa)U=iAC@E zyf-n0A}D$G&>9mq9SfU>&#phW{|P%+i2aH-!i*6I2>Vy-*$OiW%y(=FJ+EQSL>LsB zG{ybYv1}4Uf0B)(oXV|&l&0tf`aKDJ_4Hlxk0NxKl=_3h`e0f!1uF zB52u|Amez^OW3UnaeQ5Sc<0`{AIKR7KAawu6i;lorIX zQ1yuy+QrBzg4y<~gR(J~n{VzG%jHdtu~iqKGh6||IKY?XAQCR2WHxv*NseX#J= z!ZKAp?DT)A0}84)hG(-JDutfDFxz5!kYii82r~2*nzw7Go>>tCkY`c&r*+aaP+A5t zAZnwag0fE{lpkM_=+qQHJV2<0z)U`)#6qqJvhYNl1V$F%(+~J0?t@QDbWOrg2tgPg zU`xovCt_LlWV8kLfV(CHlZ6PY;P0==`R|`TU;TgQ?VFQdKVSUk?VGE2|G9Yc=@)>= z9d;>M@qP3ibg?)c^$-J$0*|f`a3EXu#MwIU>zeS+__G+2_e(^832mGAm>4GZ1O}MM z*b(T-Z(EDSsBl2!w*`05UL&LKIlf9K|F*Vmg)Jo>#%!<9ZnEv~oVgDU)y#bg7apT7 z`fz_zi?yTA)rmP@Zh{t9OXymcVjYS$01?1K%U=PtlDVJ2Th041Ox!i`zyi86xIn<9 zwv9|aM}SHmIeqg%9EqX*N=%}*6%`{>7>MdtT2`TO$Qd)ZfKvp=9)f=(bH%D`R;_2`J&c2TEcsiX}^YvGE^!MBw&sI9nnpzJdj2G75M$fofncCRKrY@AdQUjB z3mFkvtKfHHZvec5*cMwzO2pna+KF<0UP1R3F)z|WtsA+@_#SneCpK`ouriK~NQAu! z=E~R^b64W16%Bv+vTWVaFelY0WD`nn*N%v^YA9Y}fby)|AnB*Ru!(i@6yhd1rgD=w zfnUDZ@kNgCaq)SAz8`6U?-1eUTze|LOOAQQMpEfu+2B`%WjzMdWhm$DkFmW7>tgCDV z$r{@BM*6EP|10@RnpuvYUC{B-cg;tWoRo)C1a0qx5)WI*{e3>SF+rDsYfrqa$5f?Y z)!vmErFMVe4yP2Zn%Cq)RAD)t0c@oTAD@EEocj;US%%YPj8TH~s_&b4r#X?Tszvgt zv0c)Q18t9R<50IqwkhO0qJ0{oJ;(`xN-h!EiojJsZG&tTV7EfIYViW!c_y_2Jz+&p(EfY zA>i>Kr*>~*mHyZY`Kq9{K)foj+aTQ>^gF_R8p0js#boexI9u_x^lN|AB-02+$ziEq zOQy^_mxS5aFPA~_Nz(kf!^-EZ`|Mbp8B>2~*w9-h9|cozVne(#j{6O2zQh-=N`kFF z;Z-l~$j(ny2+=a>q<{KLUbU0@HMnBrs+peZlWAoX6(m>{Mw|?_l7f{SQMK130~h4t zBr%ozQ-Maa9Hm#)D9xZ+U&WYIr+tcp>l6ol`Qbj}abCC&*OHP)vGvxb=B?exEXaR= z%CiwP>cXo578(n6s>0{uy(Oz5uMBzo&6CynxKY;2dO_Qx%;w>RG4>=c42V&=Q5;d65?YPQC;{9SgJ^#TXEfjtHToTkyc`xeEQ(snkV5+kL?;BKK6`9c zeW+0HSmWie#!*pRRE!YXjx;F+-4csb2{@_GCb>iCSmnjA%A{Wukrg9`c4Jyf0Jp>@ z`k^iLnIs4OjzwM$iwuimzOE2!(Oa#8mVY}*Sbdd>Ux%qs2&gnk zp`scN1O(j+;sp2511>TVzC(Xj@0xg`GS>!}kN}I`6PrQ{VCDs79J>(I?>_{!lQ8F# z$s{M#Lxv-sKw={M6f*e9g~XdH$WBMhCW`<>@c8dF@|XzSe(VK5gR*{!B%Pjd z=AFnDJXu0QknOh)vkK%>83ry3xHD1zuh!&pWIRXQ3R52h$7O%?7@`)2MaQ(`@koYC zuRY^<&@DmPF}UzAw)Ow|^3C{7QfI3BQ$^ZW_)=bhV|~Kn%YMH<*c1PJ>i3VuKmRs*h978N z+~}MxBo^m%k?ns+1H|LaH#*+vcq7dl6>sBLshN5g*CjZn z%B6j$dMPC_%2O1Ljqz80;n;YhR*H!#ARObWYPnMh?#bo_#d%5fHe?{h@MAoruBhvC zLzUao!;flFL!5D{W>6(qQZXLMOZ5;F?5BX4;K24Tg_M7?=c)V6OEp`2dOR0bEmhjP z@@7qqJh4DqXfbU<^u?AxGpXs>&sFv+K8u?X6$v+Ka%hbyjcV4i>BMm-jyrMOiQ`Tj zKe;$o-DlBcU<2B?hMb!&zBEMuu5S$r*_7Rgz-I0&*A^VK4alFI`mx~^Q zD<>)|^59^OR8Y+W{rwx|dvGq=@Pa@&bKi_lf{%thLsZyO-JoA_=jso&%2gyjsydP| zIU8DEB<57}i+YtY#6ngsh9Or*OK(K0T&37UEyRD6Ix$W-6&6^MR;_FBdp?1-RjJ~8 z))GfKNmZfP3{&bFtBW|K9K8|V-04e3U1bpm-LBS1A-x^-p%`{nXQ&(LD2kxQ&D#wN zl)`7?AKh9uhLYngq{)*QzL#*S%gjqWGw*O3=gv z)s%m7FGEC32RRutl1Ka+lL*?i%W0|rwNg`41-P9+r3|uNb$jV~VwQj$;Z&!vfzaXj>`soyE8-_T3fx z?uvbu|vOMJTig5+KaB5Gm)!vN0v8?xNVtK6sy;#p|>@9y= zg&72K)bt{SL{am5U)zbJLr#Pjkn#237gBS@aeF=Y*vc6UN5UV*pamH$Zly3I-$O4t zm< zHL*_KT&5Sf{{AB+5~>;7Ijf@b9!49M3>1Zg-2DKWG@VuVF+y9{t(B4!s_9J$hpO1b zDNC_JMXukZ^iwqmLdMj4wcPKzopHA_{tkA=DMPK|nj~zeYTx?0zlyIZrn-N(N;^pf zuJwg)qf|pHY4>Oa%O{oUHe3r)=)U%OMZyT#@x-Se!0j5-0` z45TdoNRXVK`$OmY3g7!t+G9;WNM^iSa)XrOuW*Rye52^@j>NH21UYDxDKS@zn(XfAf`grm14 zRPj(q&aM|PRK-sa$OE0Wfh5sClGDRNCm5;j5~#OdP0}MGDX9uui|N@aF?ZwZqT081sX^7hxJwPME%BDYa_d)6 zcBLn}TeY572n=%WIF~$e)wG`BRbD+q!SH+@z5Ta%aYmRhc2W;U0M79K$r55B_If?w zjK!l1Xj#Y#_qu;Q;7nA{OC`xwK}E!>@*^B-+#=!_bL_S%MdGujr|P$hA+LIVJC9VCkNxa5@ku4V6u42SHG5=2|v%Nq$+Kg zPuRIatnfHH1k_I5)Hq(-DV7=^Syrl~-s*^x6Kr|LF{ibjA)@cYU%w!{STf_d{CM;w zopBsYlMxzl0W_0>8a978$jMWcvh^H$>;zk!Rq91=Wx?d-riQl}l&O(8u)^HaKw(u^ zDJgunlv^4pl5_@XsftPFiMAq;6FGD*P=#gG&C5z3IXKKoABiYh{?(9;uGgJI}yJIpNe7HnJ8-+CTM}HwHk>xNwH|0|Tp&cVmB$3ivh-t{UqmF;%ne zC$w?^bTFqmz>voGB= zVKs$v97LX2_84{X9GYnV1lqQrlOw{@B5$=b0zW6)y_3Q^H|QwYchhL2%t*>}a$1sQ z>DkdVX|BRT7CFX^tQKSR59I&%6#okTZ&b8|q@OPIUFyioQj=)~AI>De!L(L-vqPh5=gA@K>Nq1)k4y0pGNAQc(yR>**IpEK+-)jrxp@L zyK?GjRXu$c;IwXY&#mgz1(2<; zKdF1mHxC>_YkP!FuXcL1)2p3c?eyvn>(x`^C%M?a)1sXgEz_c%Jn!VWFV82FUL7L?Nmfsjg&i(`Kgda2OG>iFewHMlr<3k& z`dKn#=;V1P&pUbE$@5*3=Z86YVp4>CKm@sv`6BFBw0ZB+mAIauzG%;dxqT_0+jTnv zzi4Eg?C)fMC;L0uze}?JC?~a0O0$pj4*62NfwYf7*}i;_b=HnVPh#K6@J@zzGQ5-F zJ0!!8`Z?KurBZ%fxb!aRR?Z3>eOa!6R!OEu4}BniK!R->UbvLbz50Qt3cT78|LOsE z2_2m(*cnw&%u{;lec5XlQ>l7w<+XLOoSjb7&}oC*)Ni#=&T>T)oi=Qy($IL-j@BC%X4hXL*f_mDgi%Su%_z0& zYqGGYfz zDV6jnx|5zxt?Yza>128*(|wsfE|U!(M+I{YeLgLdS|2Zec2Jo69|`IvF&Z%_HMLm7 zaEurNZ7Z-Y{GwA}JF39Ch>K2ly=dKaSXj$|%jgRiwX+F}0M*uDsI9G71gbq{mKa~B z&pLg!lllyGd$LZiy?niPR9Mp?A+DQl%OXHE^_rANC)jF`|CK~!3relqq;*PdN0nN{ zKbmyX_E{c(pZ#Y%8?1XU*qsV?x_kF@_q5+HtjQs%wrL(f49fN+He;Q&qnVS~cafT% zO5O>T+{y4xhWj#nkXMsqO&DIGtM$y=c!G6m$?!B3_1*9Co3K&goz-cG1s7MRz*f7y zT7h}a{nZ(a;+IK#(POrR3_uqFMBvQky<-B{5_-X#$p7HVTp~+;C6?(<+_&%gNX=ck0-kIM9PA() z6V%#WuHjtio&RVFrLAb^axqg)b9ZceKJAZl(qiL;d5Ynp3Co5+^4N7osr?gpg*h8> zb^7hG$bU9ZLsc^^!FClxT!E?{*9r`*^~&M)wFDOODyJB0Z6g5E-dGlJ#5oA( zNq+*Ug93)$2WN9YXvp68m@NS!biG&t&w(Zqyv{%9T@!@a61kjX(7pc!xW~3FB!!DO z74`sir5lWk4*#u9&0DZ04BKEuU35)?-U2BjzpdslD-#o$McCAZ+U`SJo^_YoPQd}lksRMfAO(W58AvBf#r$x!nD(0L`KJh zKJW4m<)~DmE$LW_DeoWxuaB*RTV-sXF5al*S~5fahk3cauTCm9sDAi zt&F0A9;?ELlcWx|YWAqwYm%G8Q^{Z}r*LCtnW+M)RwI~dQ=&pO$->#;^-?nWDFTyJ zmU7%Q%BY^y%PMC8M?J&;PDt;H@(wHbRBNq5&%5?Iy^yW!dSaba+Q zh$Z7Unu${%PM$!Gd~Ro_xNh^(-s4T z0JqCEalA`dCBi7=55X4ltPc=$Z*TT|C%w-l*W?~z<_XSOOi>pB3qjihGc@NvxDI8| zWnOSb-!ao}Gt)39a9oneN9f+Zr*89u^CTeMqx0}GkkT{sB>Z+x(K9$dN#f7$A9U}) zr4-#+`}uS*%99QzEPsP>Zltm=)!uj>UJ&GdMB;3_E*+*IsjakBqjEbf^+AEDmTFnU zSj&!}$X-ih7I-uK-HVjr0Qyb93NdIw2EiV1k%!znWW9#AO$EI)Hp|MEG5cQU)aKGh z)Hwb!=?!jr#+v})@W~nZ?4j`2Z|H#u-$tclofy=r$Ay0PRewK|c#|t}D z8ccEnr+r>{@1iCasShDP!^*{EQL4CnDD5by2&J-!&7fP$rH&UlFeIOgy-;frRlbj3 zD|aDr)Dbi8!dsj>+fI}Er-jkXzpYo7(NZ_De(2td5yJc(a1BaThdrZ&kFrH>J57X;dC!J zF#M5K(358;r+;`<80i)9_X%B-x>?8yNE)(njR~8Me*&+XSSYf$0t=;8vm_i_v0qt@ zqox2A((5mifAUwd6_<6h4Y1H0u5AXy`pc}1z)1jXdXGG|2k#)Z;mk%U079HDQ9@o{ zllO8T!dz@hLy8jc7pE8AKgz7{3l*S}9Jl7X9}nBiQVc6MId@JU?52Di_6w7kC`tiP zljA5Vf5XD)x=Umt+{okQL&)3GU5df^2lj};QqPtTuN}8mgxuC^+ocDpo7cu5;}Au{ zWvqmwQB>{jlc3K-KOfXj%@!4%kG~o5)aJIcr-O8DGN&RryGsXuVd>yp`hCLYEn z93h!W}T!R^8{ZMjp;%~-6o7cMVOcZ3hTbV9e<-hM)=X0Oez8S(V z#Q&IK0^Q9!Vp6d$!w8Nnwn!0>PhA5%e^xqp}lmr`o4CnH9x`Tsov<~`=G9Ze^OUL zsjHyWRZvp)7dmDt%t?Lv)+OzNYW_tcGr8m6?x~AvV_KaHQ@j1jqI&CxOUaGCUS+D# zW1-tT=5EmaBy@VzIg-RF|{=QQ`Fd?}nGXyM3{6HVs&!^y{eR0Bghsgp!VgW)Ufc%+_?@+8Hwrv9wf37_QBB=-* zM4-(@V7pbTcRT05Sa#s5ow86@#bu%D@nK0_s2a={$5DghA_Tl$C>u|4`*qR2LPVkCv z3(113J4OMFc9N9%A=h*4dhDkj|C(GAxMp+(8RmSv2{*l%B{sVqe{=p=%z0E;Wgw)* zra5CtK0gnzs5Jd6#=TFJ02a)5W?5q|N?2BT zLXiY^f-T^3(&sqKYC-mVPqvu}>%xZtEz3oohb(|YXu|b|g`K}b7MN`S1b-mc6E$xk zIH49Y!7J%}!^Fa-f1j1STH6ep{Oz6t&0A!Jy>Qn3NjTpi_{du=p|{*mN|bgYA8Tj! z?xv&|^$WA_LuP26bCm|wPR>;t>Naz(6eG|QB;`3*fv+hN7G2g=mvz;YwFiZXe`;QcD~oy|qm>!fab^n= zuD5b`|4ZV9VPR^qpo=pi4&IwozDvN#+qHhV37s(vHQ|<^qbK2-*r@Wix`KmZZX^e~ z44Z2kx}p21rG02(67_f`Om9qaOWK;NN%8akqp}<7yHATK+RKry3kD zyD7copF^v|=iw-di^6?COnRgxHgpakSm3+xc7HJ2e}J>oAIO!wqnDCI#E^5TafQqD zBT01BQ`CXj^)&k2tY>j%8KtpzH7dFq6Gi z<_eofWcJhG9xtB)E|Ftn6Ml9q$WZ%L2cXB^xtUsUTQ5hDtk3brWcV&w6hl!bgOl2y z2rrgFe=UnR!z5mu5zH{OFKlFq?)kId2}e4D4_$i`5KG02Nn+UQn48a%l3%CrUVI*_ zX2+a#&PiE3Z)Ltm0K zniM9*c~`z;tBGS*g2+F)i5)NAV8V2qxDsT^$xRAwEq88+d%hpn{{=9a)99YDb}ki5 z4MBOPlWn8pjSL)*$Ae+Nen< z&9Q7QV+5Tcn0sr6?fv&6UQdJYMK^7ceSmYZPI4eydO<=M-@CMU)v97zD(q;DgXw&5 zba*)1L-SF8Z)_c)z1awvdq;3OJeZGXZ~_kvQFUC&Pl4lgJnR`C;e(Ha{Cxt+RXoTE z68<_2dHLYdwW9?3#v5n!!|r4UJ-)(O0IJ`iKkX&B9be-{0CdM&$h zsST9XXXdMUex_!VDpu7X~NXXDcmKZVLEO_9biC`u8Qq~I1l zxL+bSs+x>#B+`LIa*%^e5v?G6uR#$x$YF6}>;dXp$d%q*$3=7GB4VQbYjPn0W44sF z9q)xPBz(8x_y5m(n7fE~0Zjy;i+lhsvi7gZZ+dBc-igzu^4O>HgG#*Wk4n~Kg>ETumqp}>Vsa5iybV-XCwzTeo&hxBY!7+us*vDUI?9lE^hUMWzj1|0?e$)=~mcxy5vLnzE9_ zgHe%9HTF}U%lwrIe@t3(Tc$^s4#Rn(5FE|gSbFlhc7-`TMX!l#ei^Syo}4GE-PNKE z@f}%o*?^YkOH2RZd`siJ$})j$YI=|)A!rM2-4jy@wlxW?b#U|pirk%WZ~bsgIms&t z6DQZk!3!}kP2(40pju_gE{fqr)A=+nMaHKAmpUzM9zrPXfA1VLI3w)6Eyjosr`%Wi z1L~}9oA7eB37wccpNhB@d<&$5!Y8du;!jT$8i8IHtOPkC?gS{N^FnOMzq5 zzwF$)RtIr`C$v3Lo?Rj(&ZqW(f5IicU&6c8`I$}S4K1%MO8&us&r%Ys zFcbyg84?&FOWyKQ0j~I*P$qB{Ct}EoPQ%KM#ge_GkqdFl0#?EUXLFgf;n?V!0D-AE zFZ9H*Ubs{}fcQ>SoFoQan3Q-}9wB04;X7=t`S^N%f0oCZU`j-7Lfe*$#ybcvY6Z|V z>1stqxV``$_8s;RTeQ|=>^rqtmj1TuYO^%!?YlcK-6bbsp>8QYBUQA1vXj!c&_g<> zs3oVS7cQ3g%Ae169$NjNF`9tgJ`l}0+zcmP)m3+r*~r8`%uDW*toi}5b86n!EW@0H zp)S{vf0hxVsfIBeKrJwZm7wdGz_Af*rQEs_(NZlOw9+wHWZS4_u#s0pU@#nU77@{p z$6xxres9q0_xd+I;}Sv3IQ}y1jrfCJ|K_o3HiM5uy^4IY`?kyftl-0$1UTs#D@>vv zX{iy-+s>GHu@VXXf<4#t{BXtV$4A9EmP&)De}c^9-|Kj7lLEAoH-R_P6Q0fd2mVl= z;3Q+GJhdfqzJN@+WV$Yyu8Ssop>@6{gW?3{`uF-p-xu9z6v@b&`2PG9nYM<`D7ogZ zw2M0Wqwvhi<4n-Dr4iA zf0n#x78T=5v8==H`Ef03e)q#>>TtP_|I@H}81+)Z+!dl@bXnSXZ9xWKJCH4n5_U~# z(U-;&qvCYKb86l;V^ z$dXw#jV+2Kq&!Lbb0&sRFP|t0y(Jl$e?j?4!rFhX?s*!Fj*cMgkN1Yt;bd<-o(=Y9 z&>HW}tp34lax@zb&GB|(1iK8AC*#yfafZny;$-~`f;MZEXA*}~A=@N)AU~8qbl5iP ztTm=h;NNAUc>lW|2;Of1gh$ z)8bqtzYJS#vCY5NJmE`}e$#N<@MZ;Gn`EWR8onAI_3lJ3Ta~Y?+4qtJ=?ihR9TaDq zeR4NVeQiF7ZM)lE@m+|90QAvO%Rsp<)umoE#?A-V`QSPqT%-hjpTcuE8g^CW9_D1O z{Yl+h zi<1`X{&mUjPtOZSIU(kf82&|P^`gt8&-0JH*K2I;fBu{b(+IyTG9@DLB?sUoeN@_D zCC0S1qwo@pmB-@c-{@E;XntrN9l_z=^l&=a8xIbT_73NBxOX&1^Zxv>e?LVC#jd$4 zi&gLU{TMdmVA?+%%wT_SI+$5|;|ZMX&CLGc9-Q|l^MN^>qKTD^;x2&r33|6&S|Dh@ zzU#l{JSDD0e$DNV%Qg8EVrCro{p+fYV`JDK_V)&Zy}|HP|LAx)JnkR-+vpj;P>=c3 zzN8*Awi2Hcb)s;oRld_te}1s7Ao9U99!1W7eNR#Ls-UHi8uV|F-p#><#Qe>eQ+EY9 zSzC~yJ%(3Eb=9_HlKdc*A0@JD+Rw=Zkh1ZLLDodSiSKn3Tv{lL56cytXr`^UrL-?XRVz8NB@KOw)RlIR&{3qoCVi9EV?&6r$>e?9qTd_=2@<;KG% zw2kB8!T9jt;HW=68jpMYmGpEC2jheB;b=NO6c4ZNp<^5mhKGmaqyFIV@UR~~&bB|f z`0N?S({a!EApZJdzz-Ln!C*8xFm6(~IMicYQQl)>(R(MjQorwuua9U&`J@f|0ulI- zeDLAo^Jj)_{1wWze;9~17tn>ajcn|#6pub!d=?7$E%cD8hZ9Q7wd*3n_4H%U7^F}+ z9337``$=rVXDuQW?ZR5u{H_}C%eM{(;Z}hgPmr8!<}bGt_XgoO@CKojJ`00?VDfzcS^^GL| zmZ)BL3-BydpH>1pMfGVFutQWIQvm+C$)H^Yka_gn3P2a3r&j>Fm{n8&JB3^e#{c$^ zYfk|*ruw!OKpRxQ9R<+R+O@C?*dB5%>;blgTvh=Le>3z_35= z5Bf*r>15iS2ka69ypZ#NXJY`}^ML1KfS6jaAcH2hR9a!Dc3EjXu~W#U6~;~>_g%S+ zb_%()me?ue(t2a3kV`9&okH%r@+R#NaxtwTE;Lc;j6r{VI60W6Ha`Bd7I!^r%OI^J zo)??!e>UPdvB^4)o)ep_r|3DcNelYt#U?G;pBJ0#Uf?;g$vT3b6Pv8(=lQUSN#`g{ zqGfmg4{_dm*q@C0(_m{?(|f0{a3hK-li1V#V0bhc4+rDqHaxM{YacgF0Y2;xCrACm z@$fJ;aifFr=PIdciLOY!Lu_of1j4`J4N#ualcD6uay5yy!{F^bKFnQ zr~tGv+OogD32IeOd?UAJ4tg#75-YlJ^4zhB=TC@Vd#a#0`M0eLS|R@yy!~4w|BS`I zW8|M!3cE%A39Ufykc%7}n{e$|kfAObs72+_MFVxwK)az7x@e&1MDF{D22v=4E;8sz ze|8F8WY7)=Ms$%uU1U%f86;JNix!A@qEOB)+H?mA&$Ltc5u<>1D21jwO6U^Do+#93 zhp0ZG24b6pP78Eepwj}K7U;CV52gjy#Pjb^@5Fx>P1Hpbb;7@kCVJ7)M30YtWns@a zCTrX78Se<3*-=?wzqaW|?Bn47gb(89e+OqRE1C9t#)N_UA0PadVYTrLqUq}3 ziK4e!7fA(GZ!0v`y(KDEXjk*9s#wL`eBx_|E>k?Gxf}@=R}f-~VKuMvs)9sXMW|H& zMo1m4&#Fw1PBr*?Pm)5c0@(=}sM9_!{tD@0eW!h}4FZ3L2gc)Lub662D4F9$W7?Hq)D)a(qD#NBbpaJ8+SR7v5bv!} za`7Ce-&Kj8Csi?IdXzy!wRP6(*1&<=ayP?Thuy#@9(!4{P`%`S6m_+|;ACD4yAOnQzE3#8{2692|uQGL-F!BEJ}9&iRA zt*OB)IK%tVccsEKYFcCuBw$t-rHOHHyc^5XaMGQ@?rVRg36q%8>=@FobA}L@sbsyH zAvXi&H}M!?4?uqqHi->;G#*Wk4n~Kg>ETT@IKSoh&79+-0_OY^v!&(2`?t`B#B9K! zDL}bwI>Y;)=q(~|R&-6c$zx(`{{&m5{F&;YfJuFb)wwe}hI|%HqXTW5-g|&iaPPkX zGym1xr7N)FGX@~|Jq1^o3CvrR2_zP)JWSbc#3&|9GiRIEG3*Zpi zJ~(4sM9qJxyFwP2Z2$y+$Zd8HKyX4WWP(@sOKdIyCKl!+7OTFt88-RbJqMb%$O?Pm zbN3VAgaE-u-f9WG<$hB1eKTJ3^@j7!aP}3N2#)SOYdPJF;AqNbBkvZiod42?zn%4l zuAKkQR&%tOkH&L6T5qQ7H5w1^#>QhzYI@AYWbuEUOU-FtEj8aFg67!7(A~5lJM+P{ zDnawRX<3dIjwfH57T^~M)+GY7s1=}dPWVEo>d4$q#C9UK6S2D`Vh;vt5qq*k=Iw<` z@8Ha?Csh*=iUjE;T40VJvM%TqyKpI;_kc45Uv4}`T|9>-@^>GXX#Nv;wSvxDe3x?omBY1$44>YzE{fs{TN|e z-u6-9iLI#gl-1Wn1+0`=^WuNDI=<$?aKyD7B>!LlngUh;Y%Y9}&dvse8NcZ=-*H0xCRo&buE>w?M2G?^Xy}keEKaIqS)iD4v>c069N6H~a!fJ~a%%DGL!GwPqs|Jt~ zt=k(!?Y*?h;K>!yrJ_*7X^@nF(Fa@tiof1&7=LU0AF=!YzIwYf$-kE9fByMTqrRw# z^`awc;%Iy`R>;Bv^BE@4-Mk|vwYYTPveQG;aV$EdXa`uAMRwB)8urJ9R?wfASoEIH zdlOSAf|6$stubNKv9Njg?0SFupRjX<*so|K%ouTiuz$6ltuT|oe8-m1^BUGngh8Q6 zQ`}D-%O)}OC)qg4soa`~8V|R!PfV@4uH0$Gno5J2IU{e$TrwWr9xO&{;v(zo!Tf=Y z7yq4%M%IXqN9=DhbcWb@cv!l3=JF0nsrEF7J7sjL5bvcQXwCL1f|h@c2{Mkye8&r2 zCPphM@{CyMLB6@V#g421S3ye&##Tu;YBJ^LmJ6$8+y@I^Ei6;z!%mMnprCqV zcs9$SQt0Umvn>Xb9NT}wMUbJl(7atc^~{PGfIN%BKdqCdfzmRF0Z|(T6_kAvq5SxY zM5m_s;Q>M|1ZMIXB^Gi;kcB7WBrvi7pMJn6aUXnIqH7X{LI}d}09!&PJ`u~ZC!;N} z2i!Fwm@GtC1%H1{&VT>(`RYG!-<&&8WhzW{$k?yyVAitnTEpo_)n zsD~I}6nJ!nfCJgGC(hP+U)O|p#-GKIyk8;$OlaG@$HXwPCosT7#*RQwe%o3sMuh_+ zzb&|f_8J*=&+%0{`M0%gD{Lw8FlKv&c9U&?=gd8vs+s!~E<8qE^x>oyYe%1}6LY@Y z1TC(X(6uhbIuw6x03v{emcIgOC38Q4x0?53n7C`=fdzDDaDjkHZ5x?i7vb?#s#M9vcoP8bR z@pL+|=IgKS=sylRhdKF80pVOCline>xdS5(sIm7V4y-NLMGC=k zA)P=1GKN+T6Up_id;y@?tR6 zg?dM@PeZWdyg-%s3VkMb$Q6I_itQ4u8g2`Os|LIc;>{gGN5D@*z>}QXy@^%&V=LsV zg4zP{s=#i8baT+}2={3ScbXTI!Pntz#n;lW{ZW%lBN!!zrG71$GVfdxW@Eox2E`{y z^Xm>PpR zgAv1WD_Spsn&JpP`BtxDfJ+_fK|5W%sGa&KQN=93JX2sJ2o!zdKCv+(%s388?Tfs> zJ8n_LpPj=QvgKH=7<5xfsPBlCeBe{jg^Nvefn5Kk(T_ntp|%K}=9q{V5|Py7_?f+5 zct6|yIrP|P$KuSGLc@QC-ZJ?pn1T}<;+1jSZ&33kzIas?eyT!kNbIHK%A-)iaZy}U zj1bz6G${q$5{py`IH}JjxkKn!<>j!-q$naQMhxx7w3GmDiB0rFTk11O4*DI7yc`yp z7R7vBA=aX|S_Litc9O9AKq*IPI<2d-fePEL(|+fe-erHsbSE>;C*y;ha63_^8M$u= zp=)BIH+BP;MGh?G0avbs$N|z+KIG%3mJE4l$WkL-tWKHhS1S^QN1$!Xl5PlCynXX3 zML!&+9_55&rB*~4Q&fXWIh@jJI=a-#fwfGjK7RQ+Ooc)~rAZ1E)o>sn=w1*fxQ8Ba zk%{mfvU-2l#1oadHo$}gSoEIQ6j}f?FDT>Kg`j@_A*h{%IiF1WIiVgh9PtDa6WOPb z!A~wE-dsU;I$|adSe~r0AcM?rvmZ1*I~Bp{4npp}_##&@cbXoDb7Cp8NSymqvC z;bm`~@8HQ~-ykO%#t+4gG3P0U3qn1H&3e0mLWp@%&?n%Zz^k7XUlql|6?UhVegxZ9 z!r*_(29$5272_7vKK6ixX6wa56j{zxG&I+)%WaH=p!9$!r?qgQv-CE^Y)u^Qt{_oy zv5HnQL&|BSb7S+RFp@D@1R#RPf3K0pMCkToFZdah^-Cn_^o%p_M6Te;5)y)Jzjc^Z zAfL)Ga9O~eiTZ!FCYK}QIpS8B`XD$iqsM;`wJ zv8j*~b>>|mIWGD854tv&VwkB3|A;&fE)*;AJGUM#P?M<%ra(}txVwzOg@3WF|JRpq z#&423Q{A5`(!Ro%@(LX56Bb|g`~AV5_~%olIH!wjKN^1^ z9&a9R9v^!~oLw@xXPh1RdUU+e@kYlRY2K)K8^21;)VsJY!7)`X?K{;=DTz^@qG)W4 zzw!&m#uK$tOjH5k7*|!xol0;|HZLg7ORBda11W|d;~{lLU7s7O+?F1GRErwoj8ip( zD#4P9@km~(hnQeL1-EUs1+1k_NxwvYn(%zLfYii_)1=>Q3X%nI^ zw)~k%P0xO=vRCn0+>EG5xJi>kYfNcWvzARKjyrMOiQ`TjcjEZT#jz>}`Fr-n4s#N& zq_gk?VsE_L298$=K%HFtvwx?byi{rb3NJ_)F!;v1EqAj@;4OMpLu|K_Qe1yB-mI&z zw7rhkkhc_7FR+RHk{v;CX8hSlOfq#xKEj9WGrq?05+htLdJL|dsI16?gE>+`H4pUn zZAE8ukoPVM}#`e#M=uKh!E$k@%?UNW$c7Xnm2GQ_U~xRmKnt zS-BX7Tp2CB5v_8SVh^>fsqNT?9QOWPUXXo&m2_Q7Er_y>dkHQCF3qi3zGHpF0+lkzcGWdsdT3);U32Fo(?L$6lH}2I>?LAinuHl;VCCPy z95wPi9_1EH271ZOsF^M*mD|c6(U$6MDG*j(n5k-|mG0D?ivK{T;A632uCMUD zAEiCk^n+x^yCpYBDgFwFh|V{9t`WGgDYV)R+TeQ}F2Zaf#5mwfc%SD$Xx|@`jlZoL zZL5md<;;J9IG+6V4%e^{6M9DGbUWTIDM|S5ExDbQ3XA_f>KVV!=N@8#KkOWl1zXBr zk2kTi^?uJUlF%p=hcaki30s=4jK9N>WiW%BoIGEJpDUN7i*vMq=H|ksjGENnyw~5j zerL(T=?T%=_a&#i@}^F6r0I338vK(KbrlWEr;mT9Z?=I71V9xJh2-pd@j_Mn1c5xz zX&Xoq{UbR&EOdgA>MntL`_&{pB9fA-u(g<;tx}$btK?e#sHWjkp(fSZdqm=0r+LeX zBrj~oFf1$=c_Hg#G~Fx2!Kil$u@+oTmG21RAPe>aDY!N4{uJ(8vG`M1W@bA3UMK4; zvde$E)6OlOc5-Rpd%`Y|i>W2B&Of_Jv^9>W{qTPkv-uin=I`{_qI0WvZuOmat7}=2 zNhzQ;`3fQP&5$L8WpQ(~$M6ajn4T{q8Fo44q>VXqR;TYhS!#O%V4?nD=53t6Wy&^&npC`Id_~( zp15jS&+sa*o}plPK9Ao1Tf8_UOc*<<2O|Jyc>iPxF%f&c9&pCu(FL?DWQBX(9&mpq zs^_JWu!TWPzS}``D&%}JJt(YXcGX(3!>iI_heD~SO8V(2g7RvIH8esB z;jJ5#T|L8>UeB--Ip>qgHvoj~tA0(nlhSmVY&5WBFGrOf3J}A`6GOb`0Dx@Xj;vI47L? z!ba8tN&BZB^Tq(E85hp*eqdk~@@@=&QUTw_!Bu13B&KS%{e)HyfDYy~2N?1gCW}g8 zq$*~PqpUpGj=j{`G57_m2K|1&XN2X~DjMxk)vHqTSicy}OEX|6Inm*l$fS43eGmCU z*I}DDfIOebmz#(-q7S zIO+|CW3_Uw68n;gbg8NRI!mU1vt+g{lBYQ_>X(Ai-&is}tfo+ogUA!h9-}UvLlf0nazuDqZJv*8v%~e>)BFDIq)nbhP zf&BlT;$Ol4jf$3#^wWjDOC5PxYBH_h!Z{by)A|Bg+HQ$=wv04=O zn_w1Q0*MtKX#e=MT1Z;$(@5PD&lYAq8^^2?NV-Sn)Iy?YS57^xs;AEaoYrmbxmBII zV7Uf5^dKk2L#mBa$e_wz(^sKBgy+zpe%I|N&}bax`ZGfIPwL+C%>#$f+8&|PtDRo$ z^lGP9JH5KYdi5|T@5R?ECiI@z6j}|u?J7W(v}`?{n&_`3)tVl|lU(fIY0*xLmTA#W zo_F%xm*+>5V;v&|NLC;AlZhQJe;?+gttBN{V?Rq0(9=oxHvKG_F?900ljog0@8tO| z$@5W8o|qJ29}qzZ+TbS17Qs4v=cVQyc_=XTwWz%LqEC;L0u-^uuIja>~u+|OLTO}VPTf}C9)Cpki0JkHOV$lLE8QaPpZSVluCLO-APZUR(3+IbTYk@ z>Ap-qDw7f)M+Wn9eSXw0lU^S$e>N!0{f`87lNgN{l$u(sVK_z%fwmP`7k<$xupL!k zUBpGFyI!>J8Wq+u;4=EcMeS_DB0#k@7;0-P7J+I{nI*>8>9bCs?W8_K-JYz|YcF4~ zjSFi!B*b;oZCM1Ure2fs=mc90^1qUZY(c4Yo3u`;?Wj_V_(zjY+CIzUf3yFLXM=SQ z2D?+iPIvF3?w%CZNLcHi>p&$t6g8Mz&z*v>I_El%cQ;NFc(NsMu!C$&P-}O&hI6HN{-Y(7wxXTO z#Y{EL-LdWY_loTS3412fVQ?;D~b&f6kKxPzMDJy${ajfY6Y= z?=f2fMCf|41fBy;BzT>F(7PrGvn6sl$Dn)v3viEZTSy8QaVqQq>Pj~l7ajgvo0_*^ zO&GSpin{2U1ib}PMt)n(VOAz4GK;=7SuyAj$92Vp=3%>k^GRcE-~7Zl!6KTTn2Yty z#@_M-w|Mq1e^59zjwj>MQ2yd$r5?0-9|Fr0>4j;hzle;E2YuebmMxNzwmwvZctb`EFAmJ@cxpv&Gl)Le3~gZ`jrydzfffiD0rTx_BX zh zwbvv!ho_RkR!-r@%ra92QmsZX)uu#+YLbPs!|SDF^iu>TsVwEVX_Qetsh3sG0FHWw z|DBND5EbQD@Tt~Xg`Riqb$TIN@00B#+J8}T1=IdGCqpnU3@#9{Wc)@maq7d#6R45T z?d()ni25K4#b_LEZP6LwUM@TXq=JYZ2yE;zK3B#PIhuWfNyWs&Zmz5_uNl|h=KOpw*!9gbDvK!i`YZv+yQ-7DK zb0DhOo8cAO51N#7cMj|VK2LN|gU$0tQ^fFjcrFl=k$lL13pjqlDuRJWlTmT9*qEsk zBhRd7`t5dHlhc0qzuF$k9c8O&PQF4&0Ak^h4VxS>#KE-1Kq0{Ga!nlX5>|;Y3i(5@ zg*@v61l`-4J>N<1bICQihnRVSb4^y%MZiMP_P`9y`46r`8FZN!oY8m8wA;*dkP|pA zN#rARZ{Jh5`N4S-knYiWco|6P8F~_aJE!OwoS!7|XZH`fci>Wr?yUWM+CR*b5hg5u z{iEDSWnZej@jSdB$o+`K*>+tzOhHmxX{ko#c3SF#0#hy3vWBsi9YK-3mc}gbX85}o zDZ>Hun}8K!(1HwtJ>Vh_xp&BV4Q-nWdTDHyl`UiTz0Rr4rH`m_{AJP`-1Lk$0m9*v zGxFI(;jiD&0~5ZDO2;}es8x>({qC!OekSqM@t{OgP_2&_cBnMy=LSyuyzt&dO)OF$ zLVkvoi^-x?arsc%QBV;|Wf7Y}x0XvCFLGc=J{NnT)*`BWAHP=aLgJ_+X559hICr+4 zCiM>rqnUqOuP&pdZeq)&AgOie3OZlp65h-(n`2~K`)@IO&;QU;sPQfe6lzf~KlQY0 zYHTGel|VClR*=-QF<$c;Yty2UXI8hQv5uY<`g7D9_6EY~UT|ReBdeg3YA2_EI4X?v ziun74u1Vc2WCbJ**|^4pO~*fhS4}Jw*;|2y(yCb!j;+|Qtj1AOfC}mLm&rf*E7^+6 zy4eO;Xb#sl17iJU)<)nY05-ix9@~R=5ZiEOqZ9xkPM0Vludm5_xesA3Hl-m&3HXcC z3-2Fg*7t=9P)Uwk^WBe!ZDy$pm7AP9rw?{iK28dgoG3~GT9fA}Dt`xs(RG)|M7WX1 z%ZHG+rMnb^^AGG1gQcD=A6`3dtq8fT*S1R!R5!1ULB=79gv(e7N293P-6uhxhkib& zpPDTyIv;;C;;GGTXHN&|+GI{ea(0&v{=(A1x%B&l&0EC&5SHGtyuT)Rn1qm48+5J<7Sri0SC;HX5X-tkdzH9@N+$3b4gG&xAZ=giDW|E6cWdvLHH z2phBsR;xvhi%-cZ5>hWDLjQ5B#&gSS@CiFthza@C3gnZ)2Q7bOt?Vm=tP}_EN68iQ z%{oat#{Ut!|L?1}OOyO-iT)?#ge^?pIbDb;`xO%_y*1;UxEx$sV-;#r!aSNwt%@UmAgPi>s`J!B;iWY zqsGt~vu%G?^xg4F!!+gq)iO=vZq#k#El&itSE{aymOP&h4hwVZ<#i;DPSQAl*2>WP z*Q2y_j^?9QmdKR4lSN#$CW8#+r7Uvr`{0ZLiy{$v!;rhe1Ts-KL5P>!q zf$dhU-tCWRLIpsjiNpp zi?)9@PsYHsW(~)Iw#1f6G)vhsjzI3EOqhUoD~D|Wb-|wyvs1x^;x;tznuvTyyjUPN zyfO_z*WPr7>yO2T!@_C;;ohhL4~8&WW55t%JKPsXu#EMhuEV`%Vrv>~I>9TxEhG!B z?id9y+DTI4hg{FG>#?7D{A+Se;F{4DWSD>R@h05#VwTwKcFg%>G3ThT%0NhqO>@SQ zfYezOKbzRvKfxL)vq@+z-4LooQ;Sja)4w8bQEB>DjC-Fb0W6sB%(BK_l(4Mwgdz#- z1Y5x6q|b4d)q?E#o@_G{)`brPT9%7E4_N?*(1hy^3p;;>EHK*u2>w8>Cu-h8a6*4A zWP(@H`G$#wO+PDnwYC{H`P)4QnzzUbd*Q76lW@L4@R7G#LT|aBlql^)KGx3c-BC#~ zF3i3UnW1^kRT@+~Iag_@+swIAj6h3}l;>OpzNSc6bXiwj)>Tv1o)#vKd*`_JrT*df z?(tuJy}J=!{{g3AY3tJqg#uMwP$S6&w_EBRSAz*j(Gt z4c$jA?L!ljsK+Z|dSi-P($-u}%I`RTH#z^XF!$KIMDs=*&%ZCNaLK6^+Q@&pL~{+^ z<{oVA}763CZI3 zV_AX9I?v@a0TrJ{X%YR1ZRDH>S zb7*z=JRC)FQMeC?NsqL|hR%Nh1Pgo@-tG@(8*p~|1G$oS^iq*WZN^*P>{4BsV-Vkm#=WN=dZ6XC@& zsAUmnn8b@Sf*FSPg^euHJ%9E);YdgDp=)mfVySpBNeo*ZbMskJ^6M1di_c@#>=<7^ zY(1+=E}PD@S53f55lz(z2sufSX7Ymbtpm2w%De4yv%B2vE;qZ&&F*ruE9Yj{Qs~Vp z>*QIU)o=){+pQ!)S8{**p~?kdD)7mZyi*`Z$exR%k?8qn z;y}wn*4qt3XT(Ae;?^-Z!{M9I4(|bH?4PvA5+Za(kmvP)GXX(JYiZzr9P4&s|5Ni2 zzpjj9%+cFwsb|F;YciR%KXU6j3wy>d?p)E+Bq8riWM6W#6%1;7^(hLEiwbCeYX@J0 z{)EY@3tr5!{43Qn`nrWF7AJ);{LmIr1R-$ zSeUZw$t`;$qeMWc6sM60!Ynl(1pKxvhXC2)aEva@g2WS-HN!lkD9?^z>oe>qFS%E; z;2X=5g?($WY!XKO%kqo%Z-2a34k$Z)=Y|xL(te9%jPmh z&>4ccw`SPhe=p+oGzedG(-zqWI2Y?A2ePFXB!uz3ON&>nDyF5vj@CGs&Id<_hqFC2 zANBXf)&bg^jgYx_1gFD;`FI8=@X!!d$CdmPI9|uYp79Yr_(;g#Cy-plgPb7Yufvd+ z4=!ChN}zvlY@6PHqWP~jj+(nq5!vLttQ!3hpb&F=XFTueW1Kj0RlW-+O6BH`rcL!W zHsUHh26JEK8~*?%6QK}Wb*+-If|9Cq969%&#RZX&FPf}%0v%{#wh{56Z-Psk#jp2Q z$>09v%a-`@5k83je)hzJsze(B){0mPk<@9Oz*~Rk12GnzhS3aY(T}IsvMZO`K-o|7 z(%XHtw`NOm{8sZYDGjB}n0@u-2Cmt1{{p!y>`BK*!NF1*d~v2<5^%MXCB;B~4D&ZL zZ>kKvObeZK!+RGqw54RjU1hg}yp(fEUvH7exNTuJ;kFQn?(q}Hf}0k?$d240{^8On z*8YD2vgIe?QhfF0CdW`OW!DhD;tS4I(ChGQd^+N%P&uV3(l`c1DZ-Kz+`>Xa*!#a6@>3KC?W?rEKZC)KwS&D(!1-pXpUS&OtgPZE+k;gma?|vy)cG^ z?^gW&|9KB{7x6Bji2!tw55Ps%{x$iHGIW0oJ}t2aR){UB6&7!vW1At@$9x7oSt#t|hr)Ysinrqsh_1=x{VW+{$58mV-65ieD$PU4@djmCane zUwg~@JtR(SZRAhfs zjs2A8GJjCvUbaGodxN3%ATp1iJIVNOrcYvP(;#;cMi=gDe!wP-_pM;2W+ zpym0}(tkML(otSznLsu*JxG!ew1u|riKztJngrH5IQjua?oPP3el(^W_w!1^#L2aB z@Inks)A)rLs8(6Bi(+`ubUw&Sk@0_Nz@<(Ln}-le`#T2>&Io&Ni!tKEDfgBBfI6$& zCcK<&LMJBAr{iH>PLz}g?=i8Oi^&K|c?5E3tLOStM%go}z{Qe0H}WH6tDH?mnCc!* zr8}u}M3tByJr_+D-=c%6L4!ggtjNjvrDAJ`P3fpPq@VQOL&($KeMU4q2-lD$v+tISxSNxhN1vG zLjogY$y;73z!jep$^@?BL=0KcX;|5@ShANiav^S6z)E=FY%Y^F92;E|ATSl@g`POp z3zw<~5Z{T4lf9#0c2fEldPwIKwdBz_%B?FAE!Dz7D;w2Z@c`@3O<}kfRmoF!X)~UmKxE# z?Tm>RE0N$Y*mF(K4_AM@empMDu~ZsF6=Wv=UdL;j6rh#73A~w}@NDKk@Q3mQCmB2C zsV$N71!U4C({;&oT{Phft@AaW6elp(zt=DNzUW4yNJieo_vfd`v^8`_$u)naUDVMZ zg}45-a?eo#!Z}wS6@Q^4sI_EtuB%bpla%ts9S^s1Gt!fpurGhxUYr)EGB%EB$%|%D zF}@VbI_#bw*P`ZkKWwHBm;3lX4V#BiFD1-fAv#8vrH$7XWbm~E+0rOs*OV50X)JMA zoNjnd&D(|?aof&`Zv7w_jzde~FaB_zEbyf}75hO>#lD|mbTKjK)A3Pp>d_^#WL8aM ziy{drPm=zei6MW~%O^@gZ%IaGP=1oI_MfYJo(7|%BMAHBz2S5?*&B~%gS{EF#(OiX ze=wUI&4xpByqy@qF2m%hICau5&M>(|oUDIA&}NPDOyY1VWSayJt&N=<*EW~HVY-z?IJ@AK(oP@Ie8 zmtm_dw)yv(Cwz(0ZyIhJ-mJiDldM!(!&l>@-ks=WtMYX<`(BbDeHo6n$*?%v?324` z>TB~sY}?)Titj=+1fY+OS_aB>sV?=RF?K$<&Ii}|;36gH`xKtT(Xgu`ca)R4_9u03 zk$XZ3;S7IJN8%PotD?7$&=A$hJL^tVO7W0Hb^?@(l&|qNxWiFHTyl z``0DAKRqvub3)7|G5m|p>P44FpXVQYuh-bx|NJ=>rV)NwWJ*NfOAf$G`lz(QN{nf1 zN8u$HE04v?ztOQy(EQLkI)cN!>EU#;Hy#`w?Hzy4=Wy?6j^_ROVSkDcid}P87OURx z`!Q_B!L)xkn8E(ubTG5_#uGT%o0VzmuvDT#LPJE``1+)$HuTf?C%W*dxPPp{?YMpc-%kux6w0xp&s+6eMvoL zY$bm_C+bAuQmcHYpZs83LF9vJJc^wE`ktcfRY6N3HR#_Uy_Y zdkn9T>Z)zYB>6!qKT2fRWRjB!AZ6nfgRF^u6W{A7xU^6fAC@aP(M(&zDLbj5;et^; zfr?Y2T%zLgzG+XzeKSN*e?opsCDAj^7KDGg=n{E!?V2&U5PR~?_=r{)%Z-OkXdB1F zgYn_P!BKyDG#>Z(E9vPP4#o%L!_jnnC>~zjL&rEC3=a>-NBzO!;bA{~oNa${@!2zu zr{kXSLHzZ_fFCYCgTZKYVBDl|aj3_*qP)k%qW4a4rGDQRUmwwm@<|)^1tRbv`QU%U z#pllq+xRP#YcUXQE}#o-8`;=fDIR^e_$(CgTj(KG4=0qEYu81D>*>dyF-W0uI66F> z_LJCz&ssz%-cK5*VG5@~|6p`59vlwG3A6^&L4P_J9*m}~Vixt*S7J9xVK*8M2gBiH zd@$@M(d&=;2S>xfWY8aLA-Jc;aGHO?FqTHI#BiL#a5^3j$CLiic$~s8LGW#2I6XWV z9E}gAVr>){PIiX@raQ<02RqFGhda*zM?1~{kG;5NAebyV)lg40Y=3&Hs)IaUjXi!& zUGT){b&8->MezLOo)-Q)M(%0JzfT+_jgU?H$bS3-9UfAk~Y9B z)mxeL9}kblN7IAh(KLZv{PEKvmzMp9lf$E<(Rgw+OfG2b@zWt!Q}SKjS^Em6Jh z7T{T^KCJ|Hit5uUV27warU3kNlR>)*AoJ+C6@V^6Pp<%UF{`Kmb_%%`jQ{N+*Pa4s zO!aLmfHtUpI|`tswQFG)uswg|TG#_@3%RTU7Kj&&B|{=K;^f05P>-K?Y51skFjQ?XuE(VyBQxD~z2&?z?gs?G$op zEwNL`rS-;6A(vJlJB8eL5J-=D44pQ2}UU zv}J#P6V$4n_(pEc9Q0cDC02CdA|V{uzsZ$H+ge z6n2aJ6Iy}ZAs0C|HsRW_AVXa=P>af;iw5eVfp$YFbkRW1iQIqp5e=kJ23=&(lk60_ z$eBSr!3Pzp_Vl+Y!PJyEF74pDtV z4a7DHofhb{K&J&dEzoI!A506ZiRa&;-iiM%ny8B=>V$t6P4uFpi5?&Q%EF#;OxCvD zGu{z6v!k-Wer%)Xp=-i?sE;LOxGPj=4tmik z&m0aVESenLb@3QO{ag0Kpj2#YRl(B*W>p9!URRkBQ7%?zK0f#@!)oIhMAOy56Gd;e zE|LnW-d1R=drMTT(5~iHRk4b>`NY=_U8Z1+o(|P^W!d{1wty3)TKr#$|jGrDFkB>Kx|1SUl N|Nq7QtK0D#0{~kb*e(D7 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index ff47f7b11157d68f004b7198bf8eef7bfb9f7381..8aa648469a10cdd793a646a4af4076708f2a6b81 100644 GIT binary patch delta 2801 zcmV4YN8Y`(sieiR=95Ax`pem#dY__Ij-A&B$f@$U@Ss2TW^2Eq>>pysR3f8N5Gcl zLy*)l->YPPC6!8LPgovnJJi>gUn3qaOzpck4?zo)nTOm5Y@n{^SLk)Ulc~~EwUeHz z>3vC-{)wQ8Tu(YBOUqg_U34I2#&;1@qRuazTDL7Xf{h&6|Akh*76nSDlwp6*ZS!tMeI0gVi9)Mttsp~!481loq$$~C=vM+K7UG@9hPg6m&wKDL zAUFAZB+Q&mLV_OS;2b+q4ki~_b{~S&QIM;ps-*X_Rp}py8gouX^7HVr=RCyr8TIbv z1*G%vadaEzqv3b_H`_#@Z)BFi zK_PfSKdZXNNI*{8SX%@UXo;~t6A=)&AaLQe;le;G#)WV!ssTcfxp^cA@;40u+tvu* z-y(w)zF&X%e&PEo`Tn7v?fbtVf?P;LhxaeE`iE;TD(uSVmczTeXkfE*hD}a%$gRF9 zpeSl@aUhn!jn|4Bg^P!wUhiKk^o@j2aBd<(@f2sQ8=hekxU6~)5y~92hpg#IkY<9( zEHF4i0W?h)c^)zW-j>z@=ajkisqHS12_`E5!JmJ@w;wWq;LJ9W0p2~%u`vgjn3y$@ z)v;Jw6dUaAi35#$WNvF=o%J3-Vgd-hu~c*D%{%d>%qOYK^c+rC>f|Rh5Y!$$b3RyU zP#e&R=G~)(^SAxuKhAPxFPy(8iz!-7HGPV;U9lO-|5MQ%-bqh)yONGET;Dpbn?{1oq)b zlBK^8p3P}+v%^>0fRUxPYNUr>Kw?LcOPinh|-+QzvHftKTt0e1fcq37A-V|v= z#@kJ6s{z|9yZuF1atz(I4di)O$nyf7=Cb%$=4{hnF0t9UzAmPs@q&K}tbSV>pPeV= z%r^KSBSSXVzYz+sihw-@kAACx7vz`0EWFpw3=>)_@Hj^#Om|D1pg!PH=u+>N9Oy~5 zjZO_u^i7G2t4gtjMlQD6kN>a3%=*1tGkZXn!KQX_@mYH2ve(v1e1vcAb3Hf^RI< z9D4Ike3Dzw6_^nY6w<01t^*Y#(~glz--jti=7=LBR+q%;(ra5?8mML2a2mjQ*|1tO z82bY@E+*o3#K=eb4fhzb!2*BmBdE7@6yCLq9C*g&Wtn zpOZ=tOn)d$kCj0-OkW{ro%z=h@CI5&a`HlSz#gG>=|=?<@5{^{|GFKW}$81&{>N75_zRSJb`$x4e`{RbE24A zzi?6Y6{%h3nii!F+fIs$)Fc?j8XjF=5}4Q$8*T$8zJYZmvC<;;%>+>qM5P|0qU9X? z6@P==Dzo!l=IRsl9p+b?qwi#R7G@%5>Mb{hTxLsvU-R z_$hcz9e=m)+`F&%9wpB5lfh(3!S+Br5{7(7PPt=NU}6tWELOKT;qHx`a5o<0oN#xA z=&!`r25!6AWXvOs6Wg{5K04SHaOj5zF@I4CK0er0xPb1x2k0DatO9xf1@F2W>*#>r zYzpWcvVX7#JVYrbvsSIGYNAYY$Utdv(4iV7Y@&6 z$OT@Q@L+U!bNVvMlb;bZf8(6b6+;F1j3_kbA2T|olv;1Ib9%)@?wYhYDorD&%fB)0 z87fN7_js`mKfou8 zR=7+NDYRg%BBx}&m5aFijd;==Ia58IpRUZBW~m!GPNl91DeO9sf6o1d%YsYtY6?4U zt1+l~p`(FDTp|-07IY7>ig+1$PXCwanEU%w`<5fJO0NkAQX)Ugwo|MN%ArC}8;>DW z^b>WU_D^(u(mR=E2Bl>o{L!4cs3i=a)RCdfZqM*VDXF7G9x*2 zNf?3_h2FjAR})-&f0%2Fk@60;z_@75Q?OJsOVY9M>U6{3ZS1Ook{zPqdQOxC8%=|drvE}XC;N{%gjzTe|E*RbYohlPwPEXkirOs zR~+<0(u%HVBfaV^(|gaBNEvd2Em7-e zM*7f*SNF9>MEU>*aV>zjOG^Z+ieS~+2J;nd3bp8JU00960oq2scsV)Hk DTA*Q8 delta 2796 zcmV>9P<5ZT;e zS4q$*tSax8)I=#>r0Y&2t#IAKbqm*Bi|ZZ?b6mImNGuzg!B~W5#^uFR1@KNKC$??* z^Tq{qZjyhrel9X zYl$-6Wa(oPDZ_uB+veSj`a0~!5`|XPT0w>c8G3DGXgJCyL%$L@u@LV(Hq4bld)|Y0 z0lCTNBVp!j5)$+n2j|#{axl5bvilIEj)Gh*Ri)85Tb2HSs4?eMBtH)?d(J~_pHc5# zUO+kzA4j)gJ{o?<3g?D8V)b+k9ngbEqge6af=x;h*RdITkkHwPQlc8@`cQ z1_y=U1^uk*8Y2NYZDVZ_M4%pg;CqbGC zCbPic2nEnIUF3Pl1bACo2b@#p)~B|+Kqi>100ahq2H$?j0F&trAXRnNdjN?EAo#{o z&7n8%#FsLkq%PBQI9;iepU^;1d-TltV5LEAKqs1aj~33~_K*KK%ay%w{+=wRXf@UJ zDb|*&!E%Xo^+A``VwF!Ix*(KW5J{RLnFRCRqX5hj?-4r9Wb5}u0+XHwvsJBJn8 zi4eZAB%<+d}7GM%E78FF#M$~JN| z8drnLwUiI_`?InKa0Gu>a+%0rkbQXeH~RryQQL+7JqA2yXh(AL-i4cd&ZPOnzigB1 za@>dnOYw{=$l9sdH{JY{a~o|CGVoQT_E#ci>#4cCUlY+Sp5bnbB?nx7~8 zT8QWsKp`Hm)J5pzmsWT)Rc4V~@U)S*k?SFH1T4HBDW0y>eJp>z8yF6zz42%?IYCoR zInm7_I+m|-0x$@WD0&QkLsqG$q z@6o2%tZCS;lB~DkjYP?LQ=|tZSzFQ|XO>bIrw*?CgVY=aLnGGuf88=(NJ2-s8b=(iepL4Fy`!h7w^Frl>q zk8?!AbhpF_>H{8yF7A!~XPq?s_{WQ1iv({z#NArs(jX&rD*nS-3#?gE)$vH}qN ziQE84AULy4WPo>%b8O53CMIT0WOXc-7R3g8d*VRj9+}%(sK3+$i3uS1#!}6pH}AwJ zx%FIu8R36GA+4(6I#4k(?HHN#eVAfojyN)6bxEu)y|UG%QBNt$hSLDf%ZAmO*{}?p zek5;L*PoDJ%Yr_?@eU@;>hlq1HG?p-CJNHr65AJ~`Hd3*L7HE{$OzKh){*HKpidTf zm)l=S-)SG;{zyq(<0bxr{R{U0lG(r7%Vz(V$U=Y6L)U(AKQcL)eyPfXUP3bC z4Vp?+-xPsQw^9U8wai@GK-g2-TsCUp_vzF_l#P_C%hDD8iGshY@9u9(EYs~leb2ft zF922m>}vy9P0a(?h5f)Aj~rymgHt%cAtaoCejmVNHafCGvO$pt{6bM!)!BHriCgZ1 z-{~$Kxm+O@MF1FWXGv?%v2i}LZPo%f^*zg1{(M6DRLC#+?IUn@*k#pX- z&q&Vdr)GqF_4g&M%%>ZR+>AF+ETFZ_LfgQhvlRIy@=Aet0`XoO;tg}oiDGX3!bR0r zq;{EWT9i6$J1H(wlVBKYcyxV9U}8&bxDA;22G*6tN{iSx6GTN2m3oNEDCgj>7=Pqe znVs)4SD&EoFu&RyeJ8`SFcUFTZ=u1qftBQF^h=~B0s{pGzBUXT=bVXG?J&Hl`yRnjU!rc|3zY<>? zxb0?>F^@1#Y}+dM=wMgCp&uT^M1Lvx_+VGz0=oAepmVgb3g`h8yz6ePqXT}kDWG%6 z{=pvb5T%&RZpi|!0EPDmKrls*z(a;jOb<{SF!v5;kRtYjLhl|hbvKt*jh{NOUM*!* zOhY5AVRJ02_?Dow&8Ru&;9Sj@)U+SDktWQR2{rj<66QMCNOrYno5vq6o(;{A3%oGl z!RYYj^hL{)pb<2Gdd}yHp#pqH6dLo78J$u}t+&}Zy<#GFP1+olrjgU--<HKtM)-+4q&~YktO-NzafpqSFFI*N}l2=pMaa)aHm=`)4 zXv8Hlkzqmi5UYrnk>~V(iH^CyPqlA3BCGV8a3Ce}vur!Xx}Y2?^tAC9LPbAO2WtOB z*C)M`2{iSSiKz@H{qaOq4ZSj26z;i*WsPUE(NRvY+aJ)o{~RoSaav|1XD$gt(4x@0 z_xx&tYY%gOZ81{bp%xeyt$7NTYGz3~7G9lh_`8i=RZy}+G<=*BCBeodSOTt~;6cXP z^gAf74)xv&CbatvX!lT2a`rzrW5Rm@;5J{uR3kO;j7BdF`m`>Za%@Z9H{ZxFo@?F_ zZAs1|cbEd4+%6SGLm;?q?%=iVJ*~)|l@z8gGdtOT*cH>#jcJ`et@lhp3L_L=b?m@U z>E&#L2A_@k;jNt36UkXUa_*Wq&@_?xX+_aFG0~6h0Ti1zeg#+fC-M)T$ox2ZyNh>{IBr4&;FS!(OBu%g1KW8bLZbIeE4reM^s2W^?>$>0WylS-M6IJ4=|dx4 z-PamK=>r(VwE*HSEfK6Lf>moHoLWu{QE1DYWHZc_JyF}bhkU9RCMlqKVG1sGx09-o you0g|+C6UwN44HaS1KcEOBGVjlN1y?7N=BwRa&p_*8d*>0RR6g Date: Wed, 8 Mar 2023 20:38:09 +0000 Subject: [PATCH 023/129] Eth API: make block parameter parsing sounder. --- node/impl/full/eth.go | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 907adf8cd..7af9e7000 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -153,6 +153,8 @@ type EthAPI struct { EthEventAPI } +var ErrNullRound = errors.New("requested epoch was a null round") + func (a *EthModule) StateNetworkName(ctx context.Context) (dtypes.NetworkName, error) { return stmgr.GetNetworkName(ctx, a.StateManager, a.Chain.GetHeaviestTipSet().ParentState()) } @@ -231,7 +233,7 @@ func (a *EthModule) EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthH return newEthBlockFromFilecoinTipSet(ctx, ts, fullTxInfo, a.Chain, a.StateAPI) } -func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string) (tipset *types.TipSet, err error) { +func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict bool) (tipset *types.TipSet, err error) { if blkParam == "earliest" { return nil, fmt.Errorf("block param \"earliest\" is not supported") } @@ -252,16 +254,19 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string) (tipset if err != nil { return nil, fmt.Errorf("cannot parse block number: %v", err) } - ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, false) + ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) } + if strict && ts.Height() != abi.ChainEpoch(num) { + return nil, ErrNullRound + } return ts, nil } } func (a *EthModule) EthGetBlockByNumber(ctx context.Context, blkParam string, fullTxInfo bool) (ethtypes.EthBlock, error) { - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, true) if err != nil { return ethtypes.EthBlock{}, err } @@ -367,7 +372,7 @@ func (a *EthModule) EthGetTransactionCount(ctx context.Context, sender ethtypes. return ethtypes.EthUint64(0), nil } - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return ethtypes.EthUint64(0), xerrors.Errorf("cannot parse block param: %s", blkParam) } @@ -456,7 +461,7 @@ func (a *EthModule) EthGetCode(ctx context.Context, ethAddr ethtypes.EthAddress, return nil, xerrors.Errorf("cannot get Filecoin address: %w", err) } - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return nil, xerrors.Errorf("cannot parse block param: %s", blkParam) } @@ -535,7 +540,7 @@ func (a *EthModule) EthGetCode(ctx context.Context, ethAddr ethtypes.EthAddress, } func (a *EthModule) EthGetStorageAt(ctx context.Context, ethAddr ethtypes.EthAddress, position ethtypes.EthBytes, blkParam string) (ethtypes.EthBytes, error) { - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return nil, xerrors.Errorf("cannot parse block param: %s", blkParam) } @@ -631,7 +636,7 @@ func (a *EthModule) EthGetBalance(ctx context.Context, address ethtypes.EthAddre return ethtypes.EthBigInt{}, err } - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return ethtypes.EthBigInt{}, xerrors.Errorf("cannot parse block param: %s", blkParam) } @@ -676,7 +681,7 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth } } - ts, err := a.parseBlkParam(ctx, params.NewestBlkNum) + ts, err := a.parseBlkParam(ctx, params.NewestBlkNum, false) if err != nil { return ethtypes.EthFeeHistory{}, fmt.Errorf("bad block parameter %s: %s", params.NewestBlkNum, err) } @@ -1066,7 +1071,7 @@ func (a *EthModule) EthCall(ctx context.Context, tx ethtypes.EthCall, blkParam s return nil, xerrors.Errorf("failed to convert ethcall to filecoin message: %w", err) } - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return nil, xerrors.Errorf("cannot parse block param: %s", blkParam) } From a0821506bc5aacf7740dfd7c405e3308c56a6fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Wed, 8 Mar 2023 20:49:28 +0000 Subject: [PATCH 024/129] Eth API: fail when requesting future epochs. --- node/impl/full/eth.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 7af9e7000..919380ad1 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -254,6 +254,9 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict b if err != nil { return nil, fmt.Errorf("cannot parse block number: %v", err) } + if abi.ChainEpoch(num) > head.Height()-1 { + return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") + } ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) From e73ec088d563de385f05e9217c32dcc2b2e264d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Wed, 8 Mar 2023 21:15:04 +0000 Subject: [PATCH 025/129] add a test to verify block parameter soundness. --- itests/eth_transactions_test.go | 71 +++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/itests/eth_transactions_test.go b/itests/eth_transactions_test.go index 9afeb7bd5..82de0c6c0 100644 --- a/itests/eth_transactions_test.go +++ b/itests/eth_transactions_test.go @@ -7,6 +7,7 @@ import ( "testing" "time" + "github.com/filecoin-project/lotus/chain/store" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/big" @@ -270,6 +271,76 @@ func TestContractInvocation(t *testing.T) { require.EqualValues(t, ethtypes.EthUint64(0x1), receipt.Status) } +func TestGetBlockByNumber(t *testing.T) { + blockTime := 100 * time.Millisecond + client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) + + bms := ens.InterconnectAll().BeginMining(blockTime) + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + // install contract + contractHex, err := os.ReadFile("./contracts/SimpleCoin.hex") + require.NoError(t, err) + + contract, err := hex.DecodeString(string(contractHex)) + require.NoError(t, err) + + // create a new Ethereum account + key, ethAddr, deployer := client.EVM().NewAccount() + // send some funds to the f410 address + kit.SendFunds(ctx, t, client, deployer, types.FromFil(10)) + + // DEPLOY CONTRACT + tx, err := deployContractTx(ctx, client, ethAddr, contract) + require.NoError(t, err) + + client.EVM().SignTransaction(tx, key.PrivateKey) + hash := client.EVM().SubmitTransaction(ctx, tx) + + receipt, err := waitForEthTxReceipt(ctx, client, hash) + require.NoError(t, err) + require.NotNil(t, receipt) + require.EqualValues(t, ethtypes.EthUint64(0x1), receipt.Status) + + latest, err := client.EthBlockNumber(ctx) + require.NoError(t, err) + + // can get the latest block + _, err = client.EthGetBlockByNumber(ctx, latest.Hex(), true) + require.NoError(t, err) + + // fail to get a future block + _, err = client.EthGetBlockByNumber(ctx, (latest + 10000).Hex(), true) + require.Error(t, err) + + // inject 10 null rounds + bms[0].InjectNulls(10) + + // wait until we produce blocks again + tctx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + ch, err := client.ChainNotify(tctx) + require.NoError(t, err) + hc := <-ch // current + hc = <-ch // wait for next block + require.Equal(t, store.HCApply, hc[0].Type) + + afterNullHeight := hc[0].Val.Height() + + // Fail when trying to fetch a null round. + _, err = client.EthGetBlockByNumber(ctx, (ethtypes.EthUint64(afterNullHeight - 1)).Hex(), true) + require.Error(t, err) + + // Fetch balance on a null round; should not fail and should return previous balance. + // Should be lower than original balance. + bal, err := client.EthGetBalance(ctx, ethAddr, (ethtypes.EthUint64(afterNullHeight - 1)).Hex()) + require.NoError(t, err) + require.NotEqual(t, big.Zero(), bal) + require.Equal(t, -1, bal.Cmp(types.FromFil(10).Int)) +} + func deployContractTx(ctx context.Context, client *kit.TestFullNode, ethAddr ethtypes.EthAddress, contract []byte) (*ethtypes.EthTxArgs, error) { gaslimit, err := client.EthEstimateGas(ctx, ethtypes.EthCall{ From: ðAddr, From 6a7895bf49ce9de264cb46315b7497dd178a11dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 12:15:35 +0000 Subject: [PATCH 026/129] fmt. --- itests/eth_transactions_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itests/eth_transactions_test.go b/itests/eth_transactions_test.go index 82de0c6c0..5cc829907 100644 --- a/itests/eth_transactions_test.go +++ b/itests/eth_transactions_test.go @@ -7,7 +7,6 @@ import ( "testing" "time" - "github.com/filecoin-project/lotus/chain/store" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/big" @@ -15,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" "github.com/filecoin-project/lotus/itests/kit" From 558eaf8b61b57e8157201aff49cf10a322f75896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 14:59:56 +0000 Subject: [PATCH 027/129] fix lint. --- itests/eth_transactions_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/itests/eth_transactions_test.go b/itests/eth_transactions_test.go index 5cc829907..9d6c742dc 100644 --- a/itests/eth_transactions_test.go +++ b/itests/eth_transactions_test.go @@ -323,8 +323,8 @@ func TestGetBlockByNumber(t *testing.T) { defer cancel() ch, err := client.ChainNotify(tctx) require.NoError(t, err) - hc := <-ch // current - hc = <-ch // wait for next block + <-ch // current + hc := <-ch // wait for next block require.Equal(t, store.HCApply, hc[0].Type) afterNullHeight := hc[0].Val.Height() From 2909a31e8f104803ee5dacabc67b6d3d30610a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 17:14:23 +0000 Subject: [PATCH 028/129] fix TestEthBlockHashesCorrect_MultiBlockTipset: skip null rounds. --- itests/eth_block_hash_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/itests/eth_block_hash_test.go b/itests/eth_block_hash_test.go index ac6506bb2..7cc766ebc 100644 --- a/itests/eth_block_hash_test.go +++ b/itests/eth_block_hash_test.go @@ -3,6 +3,7 @@ package itests import ( "context" "fmt" + "strings" "testing" "time" @@ -55,6 +56,10 @@ func TestEthBlockHashesCorrect_MultiBlockTipset(t *testing.T) { hex := fmt.Sprintf("0x%x", i) ethBlockA, err := n2.EthGetBlockByNumber(ctx, hex, true) + // Cannot use static ErrFullRound error for comparison since it gets reserialized as a JSON RPC error. + if err != nil && strings.Contains(err.Error(), "null round") { + continue + } require.NoError(t, err) ethBlockB, err := n2.EthGetBlockByHash(ctx, ethBlockA.Hash, true) From a72879b2b257a6b98054f0f30ec38c0ec1668c94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 18:51:38 +0000 Subject: [PATCH 029/129] switch to ChainAPI#ChainGetTipSetByHeight. --- node/impl/full/eth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 919380ad1..203d9475b 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -257,7 +257,7 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict b if abi.ChainEpoch(num) > head.Height()-1 { return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") } - ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) + ts, err := a.ChainAPI.ChainGetTipSetByHeight(ctx, abi.ChainEpoch(num), head.Key()) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) } From 1da2d59066d73125ffe29686fe5e6b595a2bd1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 19:05:31 +0000 Subject: [PATCH 030/129] simplify test. --- itests/eth_transactions_test.go | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/itests/eth_transactions_test.go b/itests/eth_transactions_test.go index 9d6c742dc..8d0df0433 100644 --- a/itests/eth_transactions_test.go +++ b/itests/eth_transactions_test.go @@ -280,29 +280,10 @@ func TestGetBlockByNumber(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - // install contract - contractHex, err := os.ReadFile("./contracts/SimpleCoin.hex") - require.NoError(t, err) - - contract, err := hex.DecodeString(string(contractHex)) - require.NoError(t, err) - // create a new Ethereum account - key, ethAddr, deployer := client.EVM().NewAccount() + _, ethAddr, filAddr := client.EVM().NewAccount() // send some funds to the f410 address - kit.SendFunds(ctx, t, client, deployer, types.FromFil(10)) - - // DEPLOY CONTRACT - tx, err := deployContractTx(ctx, client, ethAddr, contract) - require.NoError(t, err) - - client.EVM().SignTransaction(tx, key.PrivateKey) - hash := client.EVM().SubmitTransaction(ctx, tx) - - receipt, err := waitForEthTxReceipt(ctx, client, hash) - require.NoError(t, err) - require.NotNil(t, receipt) - require.EqualValues(t, ethtypes.EthUint64(0x1), receipt.Status) + kit.SendFunds(ctx, t, client, filAddr, types.FromFil(10)) latest, err := client.EthBlockNumber(ctx) require.NoError(t, err) @@ -338,7 +319,7 @@ func TestGetBlockByNumber(t *testing.T) { bal, err := client.EthGetBalance(ctx, ethAddr, (ethtypes.EthUint64(afterNullHeight - 1)).Hex()) require.NoError(t, err) require.NotEqual(t, big.Zero(), bal) - require.Equal(t, -1, bal.Cmp(types.FromFil(10).Int)) + require.Equal(t, types.FromFil(10).Int, bal.Int) } func deployContractTx(ctx context.Context, client *kit.TestFullNode, ethAddr ethtypes.EthAddress, contract []byte) (*ethtypes.EthTxArgs, error) { From 0e58b3fbbc14826c5b271592b4930da513de809a Mon Sep 17 00:00:00 2001 From: ychiao Date: Wed, 8 Mar 2023 19:28:17 -0500 Subject: [PATCH 031/129] fix: EthAPI: use StateCompute for feeHistory; apply minimum gas premium (#10413) --- itests/eth_fee_history_test.go | 135 ++++++++++++++++++++++++++++----- node/impl/full/eth.go | 40 +++++----- node/impl/full/eth_test.go | 2 +- 3 files changed, 135 insertions(+), 42 deletions(-) diff --git a/itests/eth_fee_history_test.go b/itests/eth_fee_history_test.go index 72302f298..a792c7f0e 100644 --- a/itests/eth_fee_history_test.go +++ b/itests/eth_fee_history_test.go @@ -3,18 +3,42 @@ package itests import ( "context" "encoding/json" + "sort" "testing" "time" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-jsonrpc" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" "github.com/filecoin-project/lotus/itests/kit" "github.com/filecoin-project/lotus/lib/result" + "github.com/filecoin-project/lotus/node/impl/full" ) +// calculateExpectations calculates the expected number of items to be included in the response +// of eth_feeHistory. It takes care of null rounds by finding the closet tipset with height +// smaller than startHeight, and then looks back at requestAmount of items. It also considers +// scenarios where there are not enough items to look back. +func calculateExpectations(tsHeights []int, requestAmount, startHeight int) (count, oldestHeight int) { + latestIdx := sort.SearchInts(tsHeights, startHeight) + // SearchInts returns the index of the number that's larger than the target if the target + // doesn't exist. However, we're looking for the closet number that's smaller that the target + for tsHeights[latestIdx] > startHeight { + latestIdx-- + } + cnt := requestAmount + oldestIdx := latestIdx - requestAmount + 1 + if oldestIdx < 0 { + cnt = latestIdx + 1 + oldestIdx = 0 + } + return cnt, tsHeights[oldestIdx] +} + func TestEthFeeHistory(t *testing.T) { require := require.New(t) @@ -22,70 +46,136 @@ func TestEthFeeHistory(t *testing.T) { blockTime := 100 * time.Millisecond client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) - ens.InterconnectAll().BeginMining(blockTime) ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - // Wait for the network to create 20 blocks + heads, err := client.ChainNotify(ctx) + require.NoError(err) + + // Save the full view of the tipsets to calculate the answer when there are null rounds + tsHeights := []int{1} + go func() { + for chg := range heads { + for _, c := range chg { + tsHeights = append(tsHeights, int(c.Val.Height())) + } + } + }() + + miner := ens.InterconnectAll().BeginMining(blockTime) + + client.WaitTillChain(ctx, kit.HeightAtLeast(7)) + miner[0].InjectNulls(abi.ChainEpoch(5)) + + // Wait for the network to create at least 20 tipsets client.WaitTillChain(ctx, kit.HeightAtLeast(20)) + for _, m := range miner { + m.Pause() + } + + ch, err := client.ChainNotify(ctx) + require.NoError(err) + + // Wait for 5 seconds of inactivity + func() { + for { + select { + case <-ch: + continue + case <-time.After(5 * time.Second): + return + } + } + }() + + sort.Ints(tsHeights) + + // because of the deferred execution, the last tipset is not executed yet, + // and the one before the last one is the last executed tipset, + // which corresponds to the "latest" tag in EthGetBlockByNumber + latestBlk := ethtypes.EthUint64(tsHeights[len(tsHeights)-2]) + blk, err := client.EthGetBlockByNumber(ctx, "latest", false) + require.NoError(err) + require.Equal(blk.Number, latestBlk) + + assertHistory := func(history *ethtypes.EthFeeHistory, requestAmount, startHeight int) { + amount, oldest := calculateExpectations(tsHeights, requestAmount, startHeight) + require.Equal(amount+1, len(history.BaseFeePerGas)) + require.Equal(amount, len(history.GasUsedRatio)) + require.Equal(ethtypes.EthUint64(oldest), history.OldestBlock) + } history, err := client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "0x10"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(16-5+1), history.OldestBlock) + assertHistory(&history, 5, 16) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{"5", "0x10"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(16-5+1), history.OldestBlock) + assertHistory(&history, 5, 16) + require.Nil(history.Reward) + + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( + json.Marshal([]interface{}{5, "latest"}), + ).Assert(require.NoError)) + require.NoError(err) + assertHistory(&history, 5, int(latestBlk)) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{"0x10", "0x12"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(17, len(history.BaseFeePerGas)) - require.Equal(16, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(18-16+1), history.OldestBlock) + assertHistory(&history, 16, 18) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "0x10"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(16-5+1), history.OldestBlock) + assertHistory(&history, 5, 16) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "10"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(10-5+1), history.OldestBlock) + assertHistory(&history, 5, 10) + require.Nil(history.Reward) + + // test when the requested number of blocks is longer than chain length + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( + json.Marshal([]interface{}{"0x30", "latest"}), + ).Assert(require.NoError)) + require.NoError(err) + assertHistory(&history, 48, int(latestBlk)) + require.Nil(history.Reward) + + // test when the requested number of blocks is longer than chain length + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( + json.Marshal([]interface{}{"0x30", "10"}), + ).Assert(require.NoError)) + require.NoError(err) + assertHistory(&history, 48, 10) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "10", &[]float64{25, 50, 75}}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(10-5+1), history.OldestBlock) + assertHistory(&history, 5, 10) require.NotNil(history.Reward) require.Equal(5, len(*history.Reward)) for _, arr := range *history.Reward { require.Equal(3, len(arr)) + for _, item := range arr { + require.Equal(ethtypes.EthBigInt(types.NewInt(full.MinGasPremium)), item) + } } history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( @@ -93,6 +183,11 @@ func TestEthFeeHistory(t *testing.T) { ).Assert(require.NoError)) require.Error(err) + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( + json.Marshal([]interface{}{5, "10", &[]float64{75, 50}}), + ).Assert(require.NoError)) + require.Error(err) + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "10", &[]float64{}}), ).Assert(require.NoError)) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 203d9475b..c5809d250 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -254,10 +254,7 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict b if err != nil { return nil, fmt.Errorf("cannot parse block number: %v", err) } - if abi.ChainEpoch(num) > head.Height()-1 { - return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") - } - ts, err := a.ChainAPI.ChainGetTipSetByHeight(ctx, abi.ChainEpoch(num), head.Key()) + ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) } @@ -689,11 +686,7 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth return ethtypes.EthFeeHistory{}, fmt.Errorf("bad block parameter %s: %s", params.NewestBlkNum, err) } - // Deal with the case that the chain is shorter than the number of requested blocks. oldestBlkHeight := uint64(1) - if abi.ChainEpoch(params.BlkCount) <= ts.Height() { - oldestBlkHeight = uint64(ts.Height()) - uint64(params.BlkCount) + 1 - } // NOTE: baseFeePerGas should include the next block after the newest of the returned range, // because the next base fee can be inferred from the messages in the newest block. @@ -703,29 +696,32 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth gasUsedRatioArray := []float64{} rewardsArray := make([][]ethtypes.EthBigInt, 0) - for ts.Height() >= abi.ChainEpoch(oldestBlkHeight) { - // Unfortunately we need to rebuild the full message view so we can - // totalize gas used in the tipset. - msgs, err := a.Chain.MessagesForTipset(ctx, ts) + blocksIncluded := 0 + for blocksIncluded < int(params.BlkCount) && ts.Height() > 0 { + compOutput, err := a.StateCompute(ctx, ts.Height(), nil, ts.Key()) if err != nil { - return ethtypes.EthFeeHistory{}, xerrors.Errorf("error loading messages for tipset: %v: %w", ts, err) + return ethtypes.EthFeeHistory{}, xerrors.Errorf("cannot lookup the status of tipset: %v: %w", ts, err) } txGasRewards := gasRewardSorter{} - for txIdx, msg := range msgs { - msgLookup, err := a.StateAPI.StateSearchMsg(ctx, types.EmptyTSK, msg.Cid(), api.LookbackNoLimit, false) - if err != nil || msgLookup == nil { - return ethtypes.EthFeeHistory{}, nil + for _, msg := range compOutput.Trace { + if msg.Msg.From == builtintypes.SystemActorAddr { + continue } - tx, err := newEthTxFromMessageLookup(ctx, msgLookup, txIdx, a.Chain, a.StateAPI) + smsgCid, err := getSignedMessage(ctx, a.Chain, msg.MsgCid) if err != nil { - return ethtypes.EthFeeHistory{}, nil + return ethtypes.EthFeeHistory{}, xerrors.Errorf("failed to get signed msg %s: %w", msg.MsgCid, err) + } + + tx, err := newEthTxFromSignedMessage(ctx, smsgCid, a.StateAPI) + if err != nil { + return ethtypes.EthFeeHistory{}, err } txGasRewards = append(txGasRewards, gasRewardTuple{ reward: tx.Reward(ts.Blocks()[0].ParentBaseFee), - gas: uint64(msgLookup.Receipt.GasUsed), + gas: uint64(msg.MsgRct.GasUsed), }) } @@ -735,6 +731,8 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth baseFeeArray = append(baseFeeArray, ethtypes.EthBigInt(ts.Blocks()[0].ParentBaseFee)) gasUsedRatioArray = append(gasUsedRatioArray, float64(totalGasUsed)/float64(build.BlockGasLimit)) rewardsArray = append(rewardsArray, rewards) + oldestBlkHeight = uint64(ts.Height()) + blocksIncluded++ parentTsKey := ts.Parents() ts, err = a.Chain.LoadTipSet(ctx, parentTsKey) @@ -2351,7 +2349,7 @@ func calculateRewardsAndGasUsed(rewardPercentiles []float64, txGasRewards gasRew rewards := make([]ethtypes.EthBigInt, len(rewardPercentiles)) for i := range rewards { - rewards[i] = ethtypes.EthBigIntZero + rewards[i] = ethtypes.EthBigInt(types.NewInt(MinGasPremium)) } if len(txGasRewards) == 0 { diff --git a/node/impl/full/eth_test.go b/node/impl/full/eth_test.go index 67a8b0500..4cf3b5c76 100644 --- a/node/impl/full/eth_test.go +++ b/node/impl/full/eth_test.go @@ -135,7 +135,7 @@ func TestRewardPercentiles(t *testing.T) { { percentiles: []float64{25, 50, 75}, txGasRewards: []gasRewardTuple{}, - answer: []int64{0, 0, 0}, + answer: []int64{MinGasPremium, MinGasPremium, MinGasPremium}, }, { percentiles: []float64{25, 50, 75, 100}, From 36ffa09b054f3366d4ba50d8b09347c0399db591 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 9 Mar 2023 07:14:57 -0500 Subject: [PATCH 032/129] fix: eth API: return correct txIdx around null blocks (#10419) --- node/impl/full/eth.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index c5809d250..9b6794339 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -1802,12 +1802,16 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx return ethtypes.EthBlock{}, xerrors.Errorf("failed to compute state: %w", err) } - for txIdx, msg := range compOutput.Trace { + txIdx := 0 + for _, msg := range compOutput.Trace { // skip system messages like reward application and cron if msg.Msg.From == builtintypes.SystemActorAddr { continue } + ti := ethtypes.EthUint64(txIdx) + txIdx++ + gasUsed += msg.MsgRct.GasUsed smsgCid, err := getSignedMessage(ctx, cs, msg.MsgCid) if err != nil { @@ -1818,8 +1822,6 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx return ethtypes.EthBlock{}, xerrors.Errorf("failed to convert msg to ethTx: %w", err) } - ti := ethtypes.EthUint64(txIdx) - tx.ChainID = ethtypes.EthUint64(build.Eip155ChainId) tx.BlockHash = &blkHash tx.BlockNumber = &bn From b7db4cb280cc07f35804bb8d90f61a249db300b3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 9 Mar 2023 13:17:17 -0800 Subject: [PATCH 033/129] feat: mempool: Reduce minimum replace fee from 1.25x to 1.1x (#10416) However, we're leaving the default at 1.25x for backwards compatibility, for now. Also: 1. Actually use the configured replace fee ratio. 2. Store said ratios as percentages instead of floats. 1.25, or 1+1/(2^2), can be represented as a float. 1.1, or 1 + 1/(2 * 5), cannot. fixes #10415 --- api/docgen/docgen.go | 4 ++ build/openrpc/full.json.gz | Bin 33287 -> 33289 bytes build/version.go | 2 +- chain/messagepool/config.go | 14 ++++--- chain/messagepool/messagepool.go | 14 ++++--- chain/types/mpool.go | 2 +- chain/types/percent.go | 39 ++++++++++++++++++++ chain/types/percent_test.go | 34 +++++++++++++++++ cli/mpool.go | 9 ++++- cli/mpool_test.go | 7 +++- documentation/en/api-v0-methods.md | 4 +- documentation/en/api-v1-unstable-methods.md | 4 +- 12 files changed, 113 insertions(+), 20 deletions(-) create mode 100644 chain/types/percent.go create mode 100644 chain/types/percent_test.go diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 65d71d208..0e97997a6 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -401,6 +401,10 @@ func init() { FromBlock: pstring("2301220"), Address: []ethtypes.EthAddress{ethaddr}, }) + + percent := types.Percent(123) + addExample(percent) + addExample(&percent) } func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) { diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index bd8810929825a503b8986d7178ffbda8f4354c82..dfa68e4f37c5b836f2e599d091be8266a7ef01ed 100644 GIT binary patch delta 8498 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 1.00). +type Percent int64 + +func (p Percent) String() string { + abs := p + sign := "" + if abs < 0 { + abs = -abs + sign = "-" + } + return fmt.Sprintf(`%s%d.%d`, sign, abs/100, abs%100) +} + +func (p Percent) MarshalJSON() ([]byte, error) { + return []byte(p.String()), nil +} + +func (p *Percent) UnmarshalJSON(b []byte) error { + flt, err := strconv.ParseFloat(string(b)+"e2", 64) + if err != nil { + return xerrors.Errorf("unable to parse ratio %s: %w", string(b), err) + } + if math.Trunc(flt) != flt { + return xerrors.Errorf("ratio may only have two decimals: %s", string(b)) + } + *p = Percent(flt) + return nil +} diff --git a/chain/types/percent_test.go b/chain/types/percent_test.go new file mode 100644 index 000000000..7364c2447 --- /dev/null +++ b/chain/types/percent_test.go @@ -0,0 +1,34 @@ +package types + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPercent(t *testing.T) { + for _, tc := range []struct { + p Percent + s string + }{ + {100, "1.0"}, + {111, "1.11"}, + {12, "0.12"}, + {-12, "-0.12"}, + {1012, "10.12"}, + {-1012, "-10.12"}, + {0, "0.0"}, + } { + tc := tc + t.Run(fmt.Sprintf("%d <> %s", tc.p, tc.s), func(t *testing.T) { + m, err := tc.p.MarshalJSON() + require.NoError(t, err) + require.Equal(t, tc.s, string(m)) + var p Percent + require.NoError(t, p.UnmarshalJSON([]byte(tc.s))) + require.Equal(t, tc.p, p) + }) + } + +} diff --git a/cli/mpool.go b/cli/mpool.go index e098806cb..c83fb4b61 100644 --- a/cli/mpool.go +++ b/cli/mpool.go @@ -461,7 +461,12 @@ var MpoolReplaceCmd = &cli.Command{ msg := found.Message if cctx.Bool("auto") { - minRBF := messagepool.ComputeMinRBF(msg.GasPremium) + cfg, err := api.MpoolGetConfig(ctx) + if err != nil { + return xerrors.Errorf("failed to lookup the message pool config: %w", err) + } + + defaultRBF := messagepool.ComputeRBF(msg.GasPremium, cfg.ReplaceByFeeRatio) var mss *lapi.MessageSendSpec if cctx.IsSet("fee-limit") { @@ -482,7 +487,7 @@ var MpoolReplaceCmd = &cli.Command{ return xerrors.Errorf("failed to estimate gas values: %w", err) } - msg.GasPremium = big.Max(retm.GasPremium, minRBF) + msg.GasPremium = big.Max(retm.GasPremium, defaultRBF) msg.GasFeeCap = big.Max(retm.GasFeeCap, msg.GasPremium) mff := func() (abi.TokenAmount, error) { diff --git a/cli/mpool_test.go b/cli/mpool_test.go index 01b49d4b3..0aa055ba3 100644 --- a/cli/mpool_test.go +++ b/cli/mpool_test.go @@ -15,6 +15,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/messagepool" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/mock" "github.com/filecoin-project/lotus/chain/wallet" @@ -298,6 +299,7 @@ func TestReplace(t *testing.T) { mockApi.EXPECT().ChainGetMessage(ctx, sm.Cid()).Return(&sm.Message, nil), mockApi.EXPECT().ChainHead(ctx).Return(nil, nil), mockApi.EXPECT().MpoolPending(ctx, types.EmptyTSK).Return([]*types.SignedMessage{sm}, nil), + mockApi.EXPECT().MpoolGetConfig(ctx).Return(messagepool.DefaultConfig(), nil), // use gomock.any to match the message in expected api calls // since the replace function modifies the message between calls, it would be pointless to try to match the exact argument mockApi.EXPECT().GasEstimateMessageGas(ctx, gomock.Any(), &mss, types.EmptyTSK).Return(&sm.Message, nil), @@ -342,6 +344,7 @@ func TestReplace(t *testing.T) { gomock.InOrder( mockApi.EXPECT().ChainHead(ctx).Return(nil, nil), mockApi.EXPECT().MpoolPending(ctx, types.EmptyTSK).Return([]*types.SignedMessage{sm}, nil), + mockApi.EXPECT().MpoolGetConfig(ctx).Return(messagepool.DefaultConfig(), nil), // use gomock.any to match the message in expected api calls // since the replace function modifies the message between calls, it would be pointless to try to match the exact argument mockApi.EXPECT().GasEstimateMessageGas(ctx, gomock.Any(), &mss, types.EmptyTSK).Return(&sm.Message, nil), @@ -538,7 +541,7 @@ func TestConfig(t *testing.T) { t.Fatal(err) } - mpoolCfg := &types.MpoolConfig{PriorityAddrs: []address.Address{senderAddr}, SizeLimitHigh: 1234567, SizeLimitLow: 6, ReplaceByFeeRatio: 0.25} + mpoolCfg := &types.MpoolConfig{PriorityAddrs: []address.Address{senderAddr}, SizeLimitHigh: 1234567, SizeLimitLow: 6, ReplaceByFeeRatio: types.Percent(25)} gomock.InOrder( mockApi.EXPECT().MpoolGetConfig(ctx).Return(mpoolCfg, nil), ) @@ -566,7 +569,7 @@ func TestConfig(t *testing.T) { t.Fatal(err) } - mpoolCfg := &types.MpoolConfig{PriorityAddrs: []address.Address{senderAddr}, SizeLimitHigh: 234567, SizeLimitLow: 3, ReplaceByFeeRatio: 0.33} + mpoolCfg := &types.MpoolConfig{PriorityAddrs: []address.Address{senderAddr}, SizeLimitHigh: 234567, SizeLimitLow: 3, ReplaceByFeeRatio: types.Percent(33)} gomock.InOrder( mockApi.EXPECT().MpoolSetConfig(ctx, mpoolCfg).Return(nil), ) diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index fe639b2f3..e47b90904 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -2879,7 +2879,7 @@ Response: ], "SizeLimitHigh": 123, "SizeLimitLow": 123, - "ReplaceByFeeRatio": 12.3, + "ReplaceByFeeRatio": 1.23, "PruneCooldown": 60000000000, "GasLimitOverestimation": 12.3 } @@ -3167,7 +3167,7 @@ Inputs: ], "SizeLimitHigh": 123, "SizeLimitLow": 123, - "ReplaceByFeeRatio": 12.3, + "ReplaceByFeeRatio": 1.23, "PruneCooldown": 60000000000, "GasLimitOverestimation": 12.3 } diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 8e8176c23..5c3ac336d 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -3816,7 +3816,7 @@ Response: ], "SizeLimitHigh": 123, "SizeLimitLow": 123, - "ReplaceByFeeRatio": 12.3, + "ReplaceByFeeRatio": 1.23, "PruneCooldown": 60000000000, "GasLimitOverestimation": 12.3 } @@ -4104,7 +4104,7 @@ Inputs: ], "SizeLimitHigh": 123, "SizeLimitLow": 123, - "ReplaceByFeeRatio": 12.3, + "ReplaceByFeeRatio": 1.23, "PruneCooldown": 60000000000, "GasLimitOverestimation": 12.3 } From 51d0d5e5490cd4e96901979dd82d6cb9ff7c6727 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 19:24:18 -0500 Subject: [PATCH 034/129] make gen --- build/openrpc/full.json.gz | Bin 33289 -> 33289 bytes build/openrpc/gateway.json.gz | Bin 9295 -> 9295 bytes build/openrpc/miner.json.gz | Bin 16043 -> 16043 bytes build/openrpc/worker.json.gz | Bin 5221 -> 5221 bytes documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 7 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index dfa68e4f37c5b836f2e599d091be8266a7ef01ed..acf4fb80f258800544f3a0b31b0fd6b00ecce16d 100644 GIT binary patch literal 33289 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 literal 33289 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 ZhsV8t{`vmT{|5j7|NjBLDEphQ1^|phe82zz diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index b25ce7cbe1ab3cfd377be9c3d92391adffab78bd..bae9a6a79b0245962fcf82e4f79d013a96bf1865 100644 GIT binary patch delta 21 dcmX@_ao%G>6XUOq%}10u?k!!a-tw1`0RVW|3NQcw delta 21 dcmX@_ao%G>6JyoJ<|E1+Ih7L)TmCXK003;x2?ziH diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 1bbcff07417c74e3b4f49e6af62f4194f3a6f970..be588eccd3e652a06e6545ca11925ca275713d2a 100644 GIT binary patch delta 21 dcmZ2oySjElE91hAZL)S8-=~Bye3WKp003<#2#^2( delta 21 dcmZ2oySjElD`VrvHd#B4Gu!We{3y-L0046D3E}_% diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 8aa648469a10cdd793a646a4af4076708f2a6b81..1f10d091011e00ff878bf3e9976e387f7945eb3f 100644 GIT binary patch delta 5137 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 diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 82c9ba147..782441813 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.20.1 + 1.20.2 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 1673ba528..bf1fa68b0 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.20.1 + 1.20.2 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index e581d13cc..e9ff4a6ee 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.20.1 + 1.20.2 COMMANDS: daemon Start a lotus daemon process From 4def0a53e0f5838050636fc46bb59390ed5a2905 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 19:39:07 -0500 Subject: [PATCH 035/129] change log --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b13ba3f6..84b67b84d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Lotus changelog +# v1.20.2 / 2023-03-09 + +This is a HIGHLY RECOMMENDED patch release for node operators/API service providers that run ETH RPC service and an optional release for Storage Providers. + +## Bug fixes +- fix: EthAPI: use StateCompute for feeHistory; apply minimum gas premium #10413 +- fix: eth API: return correct txIdx around null blocks #10419 +- fix: Eth API: make block parameter parsing sounder. #10427 + +## Improvement +- feat: Lotus Gateway: Add missing methods - master #10420 +- feat: mempool: Reduce minimum replace fee from 1.25x to 1.1x #10416 + - We recommend storage providers to update your nodes to this patch, that will help improve developers who use Ethereum tooling's experience. + # v1.20.1 / 2023-03-06 This an optional patch releases for node operators/API service providers that run ETH RPC service. From 80cba5f176f8d1001bf1c085dec5afaea4541d57 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 21:09:04 -0500 Subject: [PATCH 036/129] fiix bakcport error #10427 --- node/impl/full/eth.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 9b6794339..c7de18900 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -254,7 +254,10 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict b if err != nil { return nil, fmt.Errorf("cannot parse block number: %v", err) } - ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) + if abi.ChainEpoch(num) > head.Height()-1 { + return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") + } + ts, err := a.ChainAPI.ChainGetTipSetByHeight(ctx, abi.ChainEpoch(num), head.Key()) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) } From 8c6ffcf4d4509738608f5e21bc11a1a89f2e2e21 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 21:10:30 -0500 Subject: [PATCH 037/129] retract v1.20.2 --- go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/go.mod b/go.mod index 55ee0d510..208e59361 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/filecoin-project/lotus go 1.18 retract v1.14.0 // Accidentally force-pushed tag, use v1.14.1+ instead. +retract v1.20.2 // Wrongfully cherry picked PR, use v1.20.2+ instead. require ( contrib.go.opencensus.io/exporter/prometheus v0.4.0 From c8b4f5f0a3403ed5c31661f5017beaedd6cc40a9 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 22:03:27 -0500 Subject: [PATCH 038/129] go mod tidy --- go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/go.mod b/go.mod index 208e59361..dbb9328f9 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/filecoin-project/lotus go 1.18 retract v1.14.0 // Accidentally force-pushed tag, use v1.14.1+ instead. + retract v1.20.2 // Wrongfully cherry picked PR, use v1.20.2+ instead. require ( From e3b3b0ca6cb59cbafb67dab70b5a0e3bf5589e94 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 22:11:11 -0500 Subject: [PATCH 039/129] make gen --- build/openrpc/full.json.gz | Bin 33289 -> 33289 bytes build/openrpc/gateway.json.gz | Bin 9295 -> 9295 bytes build/openrpc/miner.json.gz | Bin 16043 -> 16043 bytes build/openrpc/worker.json.gz | Bin 5221 -> 5221 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 8 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index acf4fb80f258800544f3a0b31b0fd6b00ecce16d..8956d2d32c811736a98d66b056e9b44941abfb4e 100644 GIT binary patch delta 24 gcmeBdVd`vQn$XUaePLr~MI#6A!(T^cuV-Tb0D>+GssI20 delta 24 gcmeBdVd`vQn$XU)`u@hwibjs^bHcZ0uV-Tb0EILPlmGw# diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index bae9a6a79b0245962fcf82e4f79d013a96bf1865..ff28b65dd16932a4e62e26e5de7c091a58a9595b 100644 GIT binary patch delta 9219 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 Z4-Pf;;o--_{|f*B|NoB@nVf|E0RSdS9m@a! delta 9203 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 Jr6+{_0RZ8i_zM64 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index be588eccd3e652a06e6545ca11925ca275713d2a..85314e30bad4580888ef93f6e4cd00f10a638421 100644 GIT binary patch delta 21 dcmZ2oySjElE91nCZL)S8a$T1LK1wq)003#j2y6fV delta 21 dcmZ2oySjElE91hAZL)S8-=~Bye3WKp003<#2#^2( diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 1f10d091011e00ff878bf3e9976e387f7945eb3f..ed5b806127ca03c71764a9d182922130aa81c381 100644 GIT binary patch delta 21 dcmaE=@l<0%3!~@8)*HecN9`WTt<+;=003$o2z>wm delta 21 dcmaE=@l<0%3!~S@)*HecnRD0juhe5?003xP2t5D* diff --git a/build/version.go b/build/version.go index fcf02d27b..e36a2798a 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.20.2" +const BuildVersion = "1.20.3" 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 782441813..80fca3ce3 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.20.2 + 1.20.3 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index bf1fa68b0..a792a213d 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.20.2 + 1.20.3 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index e9ff4a6ee..e3d7f19d7 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.20.2 + 1.20.3 COMMANDS: daemon Start a lotus daemon process From 7a2eb86dd5724a7fd8835824415529442faba854 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 10 Mar 2023 10:46:30 -0800 Subject: [PATCH 040/129] feat: cli: Add an EVM command to fetch a contract's bytecode --- cli/evm.go | 49 +++++++++++++++++++++++++++++++++++ documentation/en/cli-lotus.md | 14 ++++++++++ 2 files changed, 63 insertions(+) diff --git a/cli/evm.go b/cli/evm.go index d153e7212..84cbf8c61 100644 --- a/cli/evm.go +++ b/cli/evm.go @@ -35,6 +35,7 @@ var EvmCmd = &cli.Command{ EvmGetInfoCmd, EvmCallSimulateCmd, EvmGetContractAddress, + EvmGetBytecode, }, } @@ -486,3 +487,51 @@ func ethAddrFromFilecoinAddress(ctx context.Context, addr address.Address, fnapi return ethAddr, faddr, nil } + +var EvmGetBytecode = &cli.Command{ + Name: "bytecode", + Usage: "Write the bytecode of a smart contract to a file", + ArgsUsage: "[contract-address] [file-name]", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "bin", + Usage: "write the bytecode as raw binary and don't hex-encode", + }, + }, + Action: func(cctx *cli.Context) error { + + if cctx.NArg() != 2 { + return IncorrectNumArgs(cctx) + } + + contractAddr, err := ethtypes.ParseEthAddress(cctx.Args().Get(0)) + if err != nil { + return err + } + + fileName := cctx.Args().Get(1) + + api, closer, err := GetFullNodeAPIV1(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + code, err := api.EthGetCode(ctx, contractAddr, "latest") + if err != nil { + return err + } + if !cctx.Bool("bin") { + newCode := make([]byte, hex.EncodedLen(len(code))) + hex.Encode(newCode, code) + code = newCode + } + if err := os.WriteFile(fileName, code, 0o666); err != nil { + return xerrors.Errorf("failed to write bytecode to file %s: %w", fileName, err) + } + + fmt.Printf("Code for %s written to %s\n", contractAddr, fileName) + return nil + }, +} diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 4458599ab..325b2738d 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -2647,6 +2647,7 @@ COMMANDS: stat Print eth/filecoin addrs and code cid call Simulate an eth contract call contract-address Generate contract address from smart contract code + bytecode Write the bytecode of a smart contract to a file help, h Shows a list of commands or help for one command OPTIONS: @@ -2721,6 +2722,19 @@ OPTIONS: ``` +### lotus evm bytecode +``` +NAME: + lotus evm bytecode - Write the bytecode of a smart contract to a file + +USAGE: + lotus evm bytecode [command options] [contract-address] [file-name] + +OPTIONS: + --bin write the bytecode as raw binary and don't hex-encode (default: false) + +``` + ## lotus net ``` NAME: From f7603f6c134df680b1aa6aeace0f696847f6ee21 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 9 Mar 2023 18:35:04 -0800 Subject: [PATCH 041/129] feat: eth API: reject masked ID addresses embedded in f410f payloads We'll never get an actor/account deployed to one of these addresses (although we might get a placeholder). However, converting such an address to an f4 address is definitely wrong. --- chain/types/ethtypes/eth_types.go | 23 +++++++++++++++++------ chain/types/ethtypes/eth_types_test.go | 15 +++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/chain/types/ethtypes/eth_types.go b/chain/types/ethtypes/eth_types.go index ddda91ea0..f157c7f94 100644 --- a/chain/types/ethtypes/eth_types.go +++ b/chain/types/ethtypes/eth_types.go @@ -295,17 +295,21 @@ func EthAddressFromPubKey(pubk []byte) ([]byte, error) { return ethAddr, nil } +var maskedIDPrefix = [20 - 8]byte{0xff} + func IsEthAddress(addr address.Address) bool { if addr.Protocol() != address.Delegated { return false } payload := addr.Payload() - namespace, _, err := varint.FromUvarint(payload) + namespace, offset, err := varint.FromUvarint(payload) if err != nil { return false } - return namespace == builtintypes.EthereumAddressManagerActorID + payload = payload[offset:] + + return namespace == builtintypes.EthereumAddressManagerActorID && len(payload) == 20 && !bytes.HasPrefix(payload, maskedIDPrefix[:]) } func EthAddressFromFilecoinAddress(addr address.Address) (EthAddress, error) { @@ -326,9 +330,17 @@ func EthAddressFromFilecoinAddress(addr address.Address) (EthAddress, error) { return EthAddress{}, xerrors.Errorf("invalid delegated address namespace in: %s", addr) } payload = payload[n:] - if namespace == builtintypes.EthereumAddressManagerActorID { - return CastEthAddress(payload) + if namespace != builtintypes.EthereumAddressManagerActorID { + return EthAddress{}, ErrInvalidAddress } + ethAddr, err := CastEthAddress(payload) + if err != nil { + return EthAddress{}, err + } + if ethAddr.IsMaskedID() { + return EthAddress{}, xerrors.Errorf("f410f addresses cannot embed masked-ID payloads: %s", ethAddr) + } + return ethAddr, nil } return EthAddress{}, ErrInvalidAddress } @@ -376,8 +388,7 @@ func (ea *EthAddress) UnmarshalJSON(b []byte) error { } func (ea EthAddress) IsMaskedID() bool { - idmask := [12]byte{0xff} - return bytes.Equal(ea[:12], idmask[:]) + return bytes.HasPrefix(ea[:], maskedIDPrefix[:]) } func (ea EthAddress) ToFilecoinAddress() (address.Address, error) { diff --git a/chain/types/ethtypes/eth_types_test.go b/chain/types/ethtypes/eth_types_test.go index 118fbc901..4a73184c2 100644 --- a/chain/types/ethtypes/eth_types_test.go +++ b/chain/types/ethtypes/eth_types_test.go @@ -9,6 +9,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/builtin" ) type TestCase struct { @@ -178,6 +179,20 @@ func TestParseEthAddr(t *testing.T) { } } +func TestMaskedIDInF4(t *testing.T) { + addr, err := address.NewIDAddress(100) + require.NoError(t, err) + + eaddr, err := EthAddressFromFilecoinAddress(addr) + require.NoError(t, err) + + badaddr, err := address.NewDelegatedAddress(builtin.EthereumAddressManagerActorID, eaddr[:]) + require.NoError(t, err) + + _, err = EthAddressFromFilecoinAddress(badaddr) + require.Error(t, err) +} + func TestUnmarshalEthCall(t *testing.T) { data := `{"from":"0x4D6D86b31a112a05A473c4aE84afaF873f632325","to":"0xFe01CC39f5Ae8553D6914DBb9dC27D219fa22D7f","gas":"0x5","gasPrice":"0x6","value":"0x123","data":""}` From d2c1962e34e37cc49852d50ae2a8e4bd6ca66843 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 10 Mar 2023 20:13:03 +0000 Subject: [PATCH 042/129] chore: update the FFI for release (#10435) Specifically, this updates the proofs libraries and enables CUDA by default. --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 88dc4c4ce..8baa0faaa 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 88dc4c4ceb322337818b6508c8e9c23948f36cb1 +Subproject commit 8baa0faaa0794c9d50808c72db154e307a77e94c From 92bca485b62df90396f359da001403e16c2c584f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 10 Mar 2023 12:59:23 -0800 Subject: [PATCH 043/129] feat: stmgr: skip tipset execution when possible --- chain/stmgr/execute.go | 52 ++++++++++++++++++++++++++++++++++++++++++ chain/types/tipset.go | 4 ++++ 2 files changed, 56 insertions(+) diff --git a/chain/stmgr/execute.go b/chain/stmgr/execute.go index e67398299..57ff205b9 100644 --- a/chain/stmgr/execute.go +++ b/chain/stmgr/execute.go @@ -8,6 +8,7 @@ import ( "go.opencensus.io/trace" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" ) @@ -52,6 +53,12 @@ func (sm *StateManager) TipSetState(ctx context.Context, ts *types.TipSet) (st c sm.stlk.Unlock() + // First, try to find the tipset in the current chain. If found, we can avoid re-executing + // it. + if st, rec, found := tryLookupTipsetState(ctx, sm.cs, ts); found { + return st, rec, nil + } + st, rec, err = sm.tsExec.ExecuteTipSet(ctx, sm, ts, sm.tsExecMonitor, false) if err != nil { return cid.Undef, cid.Undef, err @@ -60,6 +67,51 @@ func (sm *StateManager) TipSetState(ctx context.Context, ts *types.TipSet) (st c return st, rec, nil } +// Try to lookup a state & receipt CID for a given tipset by walking the chain instead of executing +// it. This will only successfully return the state/receipt CIDs if they're found in the state +// store. +// +// NOTE: This _won't_ recursively walk the receipt/state trees. It assumes that having the root +// implies having the rest of the tree. However, lotus generally makes that assumption anyways. +func tryLookupTipsetState(ctx context.Context, cs *store.ChainStore, ts *types.TipSet) (cid.Cid, cid.Cid, bool) { + nextTs, err := cs.GetTipsetByHeight(ctx, ts.Height()+1, nil, false) + if err != nil { + // Nothing to see here. The requested height may be beyond the current head. + return cid.Undef, cid.Undef, false + } + + // Make sure we're on the correct fork. + if nextTs.Parents() != ts.Key() { + // Also nothing to see here. This just means that the requested tipset is on a + // different fork. + return cid.Undef, cid.Undef, false + } + + stateCid := nextTs.ParentState() + receiptCid := nextTs.ParentMessageReceipts() + + // Make sure we have the parent state. + if hasState, err := cs.StateBlockstore().Has(ctx, stateCid); err != nil { + log.Errorw("failed to lookup state-root in blockstore", "cid", stateCid, "error", err) + return cid.Undef, cid.Undef, false + } else if !hasState { + // We have the chain but don't have the state. It looks like we need to try + // executing? + return cid.Undef, cid.Undef, false + } + + // Make sure we have the receipts. + if hasReceipts, err := cs.ChainBlockstore().Has(ctx, receiptCid); err != nil { + log.Errorw("failed to lookup receipts in blockstore", "cid", receiptCid, "error", err) + return cid.Undef, cid.Undef, false + } else if !hasReceipts { + // If we don't have the receipts, re-execute and try again. + return cid.Undef, cid.Undef, false + } + + return stateCid, receiptCid, true +} + func (sm *StateManager) ExecutionTraceWithMonitor(ctx context.Context, ts *types.TipSet, em ExecMonitor) (cid.Cid, error) { st, _, err := sm.tsExec.ExecuteTipSet(ctx, sm, ts, em, true) return st, err diff --git a/chain/types/tipset.go b/chain/types/tipset.go index c1aa90fc9..047a1c00e 100644 --- a/chain/types/tipset.go +++ b/chain/types/tipset.go @@ -234,6 +234,10 @@ func (ts *TipSet) MinTicketBlock() *BlockHeader { return min } +func (ts *TipSet) ParentMessageReceipts() cid.Cid { + return ts.blks[0].ParentMessageReceipts +} + func (ts *TipSet) ParentState() cid.Cid { return ts.blks[0].ParentStateRoot } From 1cf57ffe2d083432a52e4572346243d121c3a06f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 10 Mar 2023 15:33:45 -0800 Subject: [PATCH 044/129] feat: eth: optimize receipt reading This optimizes the eth APIs (except the fee history one) to lookup the tipset state/receipts instead of computing the state. --- chain/store/messages.go | 20 ++++++++++++++++++ node/impl/full/eth.go | 46 ++++++++++++++++++++++++++--------------- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/chain/store/messages.go b/chain/store/messages.go index 5ac62d394..33d0c579a 100644 --- a/chain/store/messages.go +++ b/chain/store/messages.go @@ -237,6 +237,26 @@ func (cs *ChainStore) ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.C return blscids, secpkcids, nil } +func (cs *ChainStore) ReadReceipts(ctx context.Context, root cid.Cid) ([]types.MessageReceipt, error) { + a, err := blockadt.AsArray(cs.ActorStore(ctx), root) + if err != nil { + return nil, err + } + + receipts := make([]types.MessageReceipt, 0, a.Length()) + var rcpt types.MessageReceipt + if err := a.ForEach(&rcpt, func(i int64) error { + if int64(len(receipts)) != i { + return xerrors.Errorf("missing receipt %d", i) + } + receipts = append(receipts, rcpt) + return nil + }); err != nil { + return nil, err + } + return receipts, nil +} + 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 { diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index d8271fcdb..d08b17e41 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -1797,30 +1797,42 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx return ethtypes.EthBlock{}, xerrors.Errorf("error loading messages for tipset: %v: %w", ts, err) } - block := ethtypes.NewEthBlock(len(msgs) > 0) - - gasUsed := int64(0) - compOutput, err := sa.StateCompute(ctx, ts.Height(), nil, ts.Key()) + _, rcptRoot, err := sa.StateManager.TipSetState(ctx, ts) if err != nil { return ethtypes.EthBlock{}, xerrors.Errorf("failed to compute state: %w", err) } - txIdx := 0 - for _, msg := range compOutput.Trace { - // skip system messages like reward application and cron - if msg.Msg.From == builtintypes.SystemActorAddr { - continue - } + rcpts, err := cs.ReadReceipts(ctx, rcptRoot) + if err != nil { + return ethtypes.EthBlock{}, xerrors.Errorf("error loading receipts for tipset: %v: %w", ts, err) + } - ti := ethtypes.EthUint64(txIdx) - txIdx++ + if len(msgs) != len(rcpts) { + return ethtypes.EthBlock{}, xerrors.Errorf("receipts and message array lengths didn't match for tipset: %v: %w", ts, err) + } - gasUsed += msg.MsgRct.GasUsed - smsgCid, err := getSignedMessage(ctx, cs, msg.MsgCid) - if err != nil { - return ethtypes.EthBlock{}, xerrors.Errorf("failed to get signed msg %s: %w", msg.MsgCid, err) + block := ethtypes.NewEthBlock(len(msgs) > 0) + + gasUsed := int64(0) + for i, msg := range msgs { + rcpt := rcpts[i] + ti := ethtypes.EthUint64(i) + gasUsed += rcpt.GasUsed + var smsg *types.SignedMessage + switch msg := msg.(type) { + case *types.SignedMessage: + smsg = msg + case *types.Message: + smsg = &types.SignedMessage{ + Message: *msg, + Signature: crypto.Signature{ + Type: crypto.SigTypeBLS, + }, + } + default: + return ethtypes.EthBlock{}, xerrors.Errorf("failed to get signed msg %s: %w", msg.Cid(), err) } - tx, err := newEthTxFromSignedMessage(ctx, smsgCid, sa) + tx, err := newEthTxFromSignedMessage(ctx, smsg, sa) if err != nil { return ethtypes.EthBlock{}, xerrors.Errorf("failed to convert msg to ethTx: %w", err) } From eba270d1e2f2bb6282498cd6578c911aef8b569d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 10 Mar 2023 16:01:34 -0800 Subject: [PATCH 045/129] feat: api: optimize ChainGetParentReceipts Read the receipts all at once instead of fetching them one-by-one. --- node/impl/full/chain.go | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index 465b680ef..d0f36ce48 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -193,25 +193,14 @@ func (a *ChainAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([] return nil, nil } - // TODO: need to get the number of messages better than this - pts, err := a.Chain.LoadTipSet(ctx, types.NewTipSetKey(b.Parents...)) + receipts, err := a.Chain.ReadReceipts(ctx, b.ParentMessageReceipts) if err != nil { return nil, err } - 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(ctx, b, i) - if err != nil { - return nil, err - } - - out = append(out, r) + out := make([]*types.MessageReceipt, len(receipts)) + for i := range receipts { + out[i] = &receipts[i] } return out, nil From 59bebf8a350ca50d1438514eabe25167407fbf5a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 10 Mar 2023 16:29:43 -0800 Subject: [PATCH 046/129] test: eth: reduce chances of chain-reorgs affecting the test Now that this API is _much_ faster, we're more likely to "catch up" to the head faster than it can stabilize. I'm pretty sure the test was intended to be written this way anyways. --- itests/eth_block_hash_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/itests/eth_block_hash_test.go b/itests/eth_block_hash_test.go index 7cc766ebc..db21375c5 100644 --- a/itests/eth_block_hash_test.go +++ b/itests/eth_block_hash_test.go @@ -49,9 +49,6 @@ func TestEthBlockHashesCorrect_MultiBlockTipset(t *testing.T) { // let the chain run a little bit longer to minimise the chance of reorgs n2.WaitTillChain(ctx, kit.HeightAtLeast(head.Height()+50)) - head, err = n2.ChainHead(context.Background()) - require.NoError(t, err) - for i := 1; i <= int(head.Height()); i++ { hex := fmt.Sprintf("0x%x", i) From 82e2c3538c3386bb920cf01f967291fa96c2d675 Mon Sep 17 00:00:00 2001 From: Aayush Date: Sat, 11 Mar 2023 09:35:51 -0500 Subject: [PATCH 047/129] gateway: fix: drop overzealous guard on MsigGetVested --- gateway/proxy_fil.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/gateway/proxy_fil.go b/gateway/proxy_fil.go index bf6c2dff8..7641f569e 100644 --- a/gateway/proxy_fil.go +++ b/gateway/proxy_fil.go @@ -217,9 +217,6 @@ func (gw *Node) MsigGetVested(ctx context.Context, addr address.Address, start t if err := gw.limit(ctx, walletRateLimitTokens); err != nil { return types.BigInt{}, err } - if err := gw.checkTipsetKey(ctx, start); err != nil { - return types.NewInt(0), err - } if err := gw.checkTipsetKey(ctx, end); err != nil { return types.NewInt(0), err } From a0e95ebe972af766a7f6069576b0a077fbbd51d7 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 11 Mar 2023 16:49:07 +0200 Subject: [PATCH 048/129] scaffolding --- chain/index/interface.go | 31 +++++++++ chain/index/msgindex.go | 141 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 chain/index/interface.go create mode 100644 chain/index/msgindex.go diff --git a/chain/index/interface.go b/chain/index/interface.go new file mode 100644 index 000000000..ea701e811 --- /dev/null +++ b/chain/index/interface.go @@ -0,0 +1,31 @@ +package index + +import ( + "context" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/types" + "github.com/ipfs/go-cid" +) + +// MsgInfo is the Message metadata the index tracks. +type MsgInfo struct { + // the message this record refers to + Message cid.Cid + // the epoch whre this message was executed + Epoch abi.ChainEpoch + // the tipset where this messages executed + Tipset types.TipSetKey + // the first block in the tipset where the message was executed + Block cid.Cid + // the index of the message in the block + Index int +} + +// MsgIndex is the interface to the message index +type MsgIndex interface { + // GetMsgInfo retrieves the message metadata through the index. + GetMsgInfo(ctx context.Context, m cid.Cid) (MsgInfo, error) + // Close closes the index + Close() error +} diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go new file mode 100644 index 000000000..c5bce4915 --- /dev/null +++ b/chain/index/msgindex.go @@ -0,0 +1,141 @@ +package index + +import ( + "context" + "database/sql" + "errors" + "io/fs" + "os" + "path" + "time" + + "github.com/ipfs/go-cid" + logging "github.com/ipfs/go-log/v2" + _ "github.com/mattn/go-sqlite3" + "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/chain/types" +) + +type msgIndex struct { + cs *store.ChainStore + + db *sql.DB +} + +var _ MsgIndex = (*msgIndex)(nil) + +var log = logging.Logger("chain/index") + +var ( + dbName = "msgindex.db" + + coalesceMinDelay = 100 * time.Millisecond + coalesceMaxDelay = time.Second + coalesceMergeInterval = 100 * time.Millisecond +) + +func NewMsgIndex(basePath string, cs *store.ChainStore) (MsgIndex, error) { + var ( + mkdb bool + dbPath string + err error + ) + + if basePath == ":memory:" { + // for testing + mkdb = true + dbPath = basePath + goto opendb + } + + err = os.MkdirAll(basePath, 0755) + if err != nil { + return nil, xerrors.Errorf("error creating msgindex base directory: %w", err) + } + + dbPath = path.Join(basePath, dbName) + _, err = os.Stat(dbPath) + switch { + case errors.Is(err, fs.ErrNotExist): + mkdb = true + + case err != nil: + return nil, xerrors.Errorf("error stating msgindex database: %w", err) + } + +opendb: + db, err := sql.Open("sqlite3", dbPath) + if err != nil { + // TODO [nice to have]: automaticaly delete corrupt databases + // but for now we can just error and let the operator delete. + return nil, xerrors.Errorf("error opening msgindex database: %w", err) + } + + if mkdb { + err = createTables(db) + if err != nil { + return nil, xerrors.Errorf("error creating msgindex database: %w", err) + } + } else { + err = reconcileIndex(db, cs) + if err != nil { + return nil, xerrors.Errorf("error reconciling msgindex database: %w", err) + } + } + + msgIndex := &msgIndex{db: db, cs: cs} + err = msgIndex.prepareStatements() + if err != nil { + err2 := db.Close() + if err2 != nil { + log.Errorf("error closing msgindex database: %s", err2) + } + + return nil, xerrors.Errorf("error preparing msgindex database statements: %w", err) + } + + rnf := store.WrapHeadChangeCoalescer( + msgIndex.onHeadChange, + coalesceMinDelay, + coalesceMaxDelay, + coalesceMergeInterval, + ) + cs.SubscribeHeadChanges(rnf) + + return msgIndex, nil +} + +// init utilities +func createTables(db *sql.DB) error { + // TODO + return errors.New("TODO: index.createTables") +} + +func reconcileIndex(db *sql.DB, cs *store.ChainStore) error { + // TODO + return errors.New("TODO: index.reconcileIndex") +} + +func (x *msgIndex) prepareStatements() error { + // TODO + return errors.New("TODO: msgIndex.prepareStatements") +} + +// head change notifee +func (x *msgIndex) onHeadChange(rev, app []*types.TipSet) error { + // TODO + return errors.New("TODO: msgIndex.onHeadChange") +} + +// interface +func (x *msgIndex) GetMsgInfo(ctx context.Context, m cid.Cid) (MsgInfo, error) { + // TODO + return MsgInfo{}, errors.New("TODO: msgIndex.GetMsgInfo") +} + +func (x *msgIndex) Close() error { + // TODO + return errors.New("TODO: msgIndex.Close") +} From cc83a7cd350a0124c9e0f6826ad9770798297e89 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 11 Mar 2023 17:12:28 +0200 Subject: [PATCH 049/129] use tipset cid instead of key for posterity. --- chain/index/interface.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/chain/index/interface.go b/chain/index/interface.go index ea701e811..dcf8ff6fa 100644 --- a/chain/index/interface.go +++ b/chain/index/interface.go @@ -4,7 +4,6 @@ import ( "context" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/lotus/chain/types" "github.com/ipfs/go-cid" ) @@ -15,7 +14,7 @@ type MsgInfo struct { // the epoch whre this message was executed Epoch abi.ChainEpoch // the tipset where this messages executed - Tipset types.TipSetKey + Tipset cid.Cid // the first block in the tipset where the message was executed Block cid.Cid // the index of the message in the block From eab728c4e71d2936c6a6a2df2b0071f245bb1d06 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 11 Mar 2023 17:25:57 +0200 Subject: [PATCH 050/129] we don't need the block --- chain/index/interface.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/chain/index/interface.go b/chain/index/interface.go index dcf8ff6fa..3cb6794b9 100644 --- a/chain/index/interface.go +++ b/chain/index/interface.go @@ -15,9 +15,7 @@ type MsgInfo struct { Epoch abi.ChainEpoch // the tipset where this messages executed Tipset cid.Cid - // the first block in the tipset where the message was executed - Block cid.Cid - // the index of the message in the block + // the canonical execution order of the message in the tipset Index int } From 9144f9cea794c0936eb6bcf17f88d2c8e90c29fa Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 11 Mar 2023 17:55:48 +0200 Subject: [PATCH 051/129] abstract ChainStore interface --- chain/index/msgindex.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index c5bce4915..a48d6deef 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -18,8 +18,16 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) +// chain store interface; we could use store.ChainStore directly, +// but this simplifies unit testing. +type ChainStore interface { + SubscribeHeadChanges(f store.ReorgNotifee) +} + +var _ ChainStore = (*store.ChainStore)(nil) + type msgIndex struct { - cs *store.ChainStore + cs ChainStore db *sql.DB } @@ -36,7 +44,7 @@ var ( coalesceMergeInterval = 100 * time.Millisecond ) -func NewMsgIndex(basePath string, cs *store.ChainStore) (MsgIndex, error) { +func NewMsgIndex(basePath string, cs ChainStore) (MsgIndex, error) { var ( mkdb bool dbPath string @@ -113,7 +121,7 @@ func createTables(db *sql.DB) error { return errors.New("TODO: index.createTables") } -func reconcileIndex(db *sql.DB, cs *store.ChainStore) error { +func reconcileIndex(db *sql.DB, cs ChainStore) error { // TODO return errors.New("TODO: index.reconcileIndex") } From 3649ae373b18ebe294ee6b5642f5bdc305393207 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 11 Mar 2023 18:21:16 +0200 Subject: [PATCH 052/129] implementation details --- chain/index/interface.go | 7 +++-- chain/index/msgindex.go | 62 ++++++++++++++++++++++++++++++++++------ 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/chain/index/interface.go b/chain/index/interface.go index 3cb6794b9..a6c07d4be 100644 --- a/chain/index/interface.go +++ b/chain/index/interface.go @@ -2,19 +2,22 @@ package index import ( "context" + "errors" "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" ) +var ErrNotFound = errors.New("message not found") + // MsgInfo is the Message metadata the index tracks. type MsgInfo struct { // the message this record refers to Message cid.Cid + // the tipset where this messages was executed + Tipset cid.Cid // the epoch whre this message was executed Epoch abi.ChainEpoch - // the tipset where this messages executed - Tipset cid.Cid // the canonical execution order of the message in the tipset Index int } diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index a48d6deef..07ff75869 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -9,13 +9,14 @@ import ( "path" "time" - "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" _ "github.com/mattn/go-sqlite3" "golang.org/x/xerrors" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" + "github.com/ipfs/go-cid" ) // chain store interface; we could use store.ChainStore directly, @@ -29,7 +30,9 @@ var _ ChainStore = (*store.ChainStore)(nil) type msgIndex struct { cs ChainStore - db *sql.DB + db *sql.DB + selectMsgStmt *sql.Stmt + deleteTipSetStmt *sql.Stmt } var _ MsgIndex = (*msgIndex)(nil) @@ -117,8 +120,13 @@ opendb: // init utilities func createTables(db *sql.DB) error { - // TODO - return errors.New("TODO: index.createTables") + // Just a single table for now; ghetto, but this an index so we denormalize to avoid joins. + if _, err := db.Exec("CREATE TABLE Messages (cid VARCHAR(80) PRIMARY KEY, tipset VARCHAR(80), xepoch INTEGER, xindex INTEGER)"); err != nil { + return err + } + + // TODO Should we add an index for tipset to speed up deletion on revert? + return nil } func reconcileIndex(db *sql.DB, cs ChainStore) error { @@ -127,8 +135,20 @@ func reconcileIndex(db *sql.DB, cs ChainStore) error { } func (x *msgIndex) prepareStatements() error { - // TODO - return errors.New("TODO: msgIndex.prepareStatements") + stmt, err := x.db.Prepare("SELECT (tipset, xepoch, xindex) FROM Messages WHERE cid = ?") + if err != nil { + return err + } + x.selectMsgStmt = stmt + + stmt, err = x.db.Prepare("DELETE FROM Messages WHERE tipset = ?") + if err != nil { + return err + } + x.deleteTipSetStmt = stmt + + // TODO reconciliation stmts + return nil } // head change notifee @@ -139,8 +159,34 @@ func (x *msgIndex) onHeadChange(rev, app []*types.TipSet) error { // interface func (x *msgIndex) GetMsgInfo(ctx context.Context, m cid.Cid) (MsgInfo, error) { - // TODO - return MsgInfo{}, errors.New("TODO: msgIndex.GetMsgInfo") + var ( + tipset string + epoch int64 + index int64 + ) + + key := m.String() + row := x.selectMsgStmt.QueryRow(key) + err := row.Scan(&tipset, &epoch, &index) + switch { + case err == sql.ErrNoRows: + return MsgInfo{}, ErrNotFound + + case err != nil: + return MsgInfo{}, xerrors.Errorf("error querying msgindex database: %w", err) + } + + tipsetCid, err := cid.Decode(tipset) + if err != nil { + return MsgInfo{}, xerrors.Errorf("error decoding tipset cid: %w", err) + } + + return MsgInfo{ + Message: m, + Tipset: tipsetCid, + Epoch: abi.ChainEpoch(epoch), + Index: int(index), + }, nil } func (x *msgIndex) Close() error { From 7fcf228bc48dac33d1391002017f502cfe760274 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 11 Mar 2023 18:23:05 +0200 Subject: [PATCH 053/129] better logger name --- chain/index/msgindex.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index 07ff75869..accaf5fc9 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -37,7 +37,7 @@ type msgIndex struct { var _ MsgIndex = (*msgIndex)(nil) -var log = logging.Logger("chain/index") +var log = logging.Logger("msgindex") var ( dbName = "msgindex.db" From d97c6b2f69fbe65f1d570d2f8bd50d047d5f9f76 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 11 Mar 2023 19:11:08 +0200 Subject: [PATCH 054/129] more implementation --- chain/index/msgindex.go | 188 +++++++++++++++++++++++++++++++++++----- 1 file changed, 167 insertions(+), 21 deletions(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index accaf5fc9..ff5ddbdd9 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -7,6 +7,7 @@ import ( "io/fs" "os" "path" + "sync" "time" logging "github.com/ipfs/go-log/v2" @@ -19,24 +20,6 @@ import ( "github.com/ipfs/go-cid" ) -// chain store interface; we could use store.ChainStore directly, -// but this simplifies unit testing. -type ChainStore interface { - SubscribeHeadChanges(f store.ReorgNotifee) -} - -var _ ChainStore = (*store.ChainStore)(nil) - -type msgIndex struct { - cs ChainStore - - db *sql.DB - selectMsgStmt *sql.Stmt - deleteTipSetStmt *sql.Stmt -} - -var _ MsgIndex = (*msgIndex)(nil) - var log = logging.Logger("msgindex") var ( @@ -47,6 +30,37 @@ var ( coalesceMergeInterval = 100 * time.Millisecond ) +// chain store interface; we could use store.ChainStore directly, +// but this simplifies unit testing. +type ChainStore interface { + SubscribeHeadChanges(f store.ReorgNotifee) + MessagesForBlock(ctx context.Context, b *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) +} + +var _ ChainStore = (*store.ChainStore)(nil) + +type msgIndex struct { + cs ChainStore + + db *sql.DB + selectMsgStmt *sql.Stmt + insertMsgStmt *sql.Stmt + deleteTipSetStmt *sql.Stmt + + sema chan struct{} + mx sync.Mutex + pend []headChange + + cancel func() +} + +var _ MsgIndex = (*msgIndex)(nil) + +type headChange struct { + rev []*types.TipSet + app []*types.TipSet +} + func NewMsgIndex(basePath string, cs ChainStore) (MsgIndex, error) { var ( mkdb bool @@ -96,7 +110,15 @@ opendb: } } - msgIndex := &msgIndex{db: db, cs: cs} + ctx, cancel := context.WithCancel(context.Background()) + + msgIndex := &msgIndex{ + db: db, + cs: cs, + sema: make(chan struct{}, 1), + cancel: cancel, + } + err = msgIndex.prepareStatements() if err != nil { err2 := db.Close() @@ -115,6 +137,8 @@ opendb: ) cs.SubscribeHeadChanges(rnf) + go msgIndex.background(ctx) + return msgIndex, nil } @@ -141,6 +165,12 @@ func (x *msgIndex) prepareStatements() error { } x.selectMsgStmt = stmt + stmt, err = x.db.Prepare("INSERT INTO Messages VALUES (?, ?, ?, ?)") + if err != nil { + return err + } + x.insertMsgStmt = stmt + stmt, err = x.db.Prepare("DELETE FROM Messages WHERE tipset = ?") if err != nil { return err @@ -153,8 +183,124 @@ func (x *msgIndex) prepareStatements() error { // head change notifee func (x *msgIndex) onHeadChange(rev, app []*types.TipSet) error { - // TODO - return errors.New("TODO: msgIndex.onHeadChange") + // do it in the background to avoid blocking head change processing + x.mx.Lock() + x.pend = append(x.pend, headChange{rev: rev, app: app}) + // TODO log loudly if this is building backlog (it shouldn't but better be safe on this) + x.mx.Unlock() + + select { + case x.sema <- struct{}{}: + default: + } + + return nil +} + +func (x *msgIndex) background(ctx context.Context) { + for { + select { + case <-x.sema: + err := x.processHeadChanges(ctx) + if err != nil { + // TODO should we shut down the index altogether? we just log for now. + log.Errorf("error processing head change notifications: %s", err) + } + + case <-ctx.Done(): + return + } + } +} + +func (x *msgIndex) processHeadChanges(ctx context.Context) error { + x.mx.Lock() + pend := x.pend + x.pend = nil + x.mx.Unlock() + + txn, err := x.db.Begin() + if err != nil { + return xerrors.Errorf("error creating transaction: %w", err) + } + + for _, hc := range pend { + for _, ts := range hc.rev { + if err := x.doRevert(ctx, ts); err != nil { + txn.Rollback() + return xerrors.Errorf("error reverting %s: %w", ts, err) + } + } + + for _, ts := range hc.app { + if err := x.doApply(ctx, ts); err != nil { + txn.Rollback() + return xerrors.Errorf("error applying %s: %w", ts, err) + } + } + } + + return txn.Commit() +} + +func (x *msgIndex) doRevert(ctx context.Context, ts *types.TipSet) error { + tskey, err := ts.Key().Cid() + if err != nil { + return xerrors.Errorf("error computing tipset cid: %w", err) + } + + key := tskey.String() + _, err = x.deleteTipSetStmt.Exec(key) + return err +} + +func (x *msgIndex) doApply(ctx context.Context, ts *types.TipSet) error { + tscid, err := ts.Key().Cid() + if err != nil { + return xerrors.Errorf("error computing tipset cid: %w", err) + } + + tskey := tscid.String() + xepoch := int64(ts.Height()) + var xindex int64 + + seen := make(map[string]struct{}) + insert := func(key string) error { + if _, ok := seen[key]; ok { + return nil + } + + if _, err := x.insertMsgStmt.Exec(key, tskey, xepoch, xindex); err != nil { + return err + } + seen[key] = struct{}{} + xindex++ + + return nil + } + + for _, blk := range ts.Blocks() { + bmsgs, smsgs, err := x.cs.MessagesForBlock(ctx, blk) + if err != nil { + return xerrors.Errorf("error retrieving messages for block %s in %s: %w", blk, ts, err) + } + + for _, m := range bmsgs { + key := m.Cid().String() + if err := insert(key); err != nil { + return err + } + } + + for _, m := range smsgs { + key := m.Cid().String() + if err := insert(key); err != nil { + return err + } + } + } + + return nil } // interface From f7a979d825eccdee3ab849412ccb7c27459a383a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Sat, 11 Mar 2023 17:24:56 +0000 Subject: [PATCH 055/129] eth_feeHistory: migrate to using TipSetState. --- chain/types/ethtypes/eth_transactions.go | 8 -- chain/types/message.go | 13 +++ node/impl/full/eth.go | 111 ++++++++++++----------- node/impl/full/eth_test.go | 21 ++--- 4 files changed, 79 insertions(+), 74 deletions(-) diff --git a/chain/types/ethtypes/eth_transactions.go b/chain/types/ethtypes/eth_transactions.go index 7afde4bd2..6c13c5bf6 100644 --- a/chain/types/ethtypes/eth_transactions.go +++ b/chain/types/ethtypes/eth_transactions.go @@ -44,14 +44,6 @@ type EthTx struct { S EthBigInt `json:"s"` } -func (tx *EthTx) Reward(blkBaseFee big.Int) EthBigInt { - availablePriorityFee := big.Sub(big.Int(tx.MaxFeePerGas), blkBaseFee) - if big.Cmp(big.Int(tx.MaxPriorityFeePerGas), availablePriorityFee) <= 0 { - return tx.MaxPriorityFeePerGas - } - return EthBigInt(availablePriorityFee) -} - type EthTxArgs struct { ChainID int `json:"chainId"` Nonce int `json:"nonce"` diff --git a/chain/types/message.go b/chain/types/message.go index becd2c010..4304ba659 100644 --- a/chain/types/message.go +++ b/chain/types/message.go @@ -219,4 +219,17 @@ func (m *Message) ValidForBlockInclusion(minGas int64, version network.Version) return nil } +// EffectiveGasPremium returns the effective gas premium claimable by the miner +// given the supplied base fee. +// +// Filecoin clamps the gas premium at GasFeeCap - BaseFee, if lower than the +// specified premium. +func (m *Message) EffectiveGasPremium(baseFee abi.TokenAmount) abi.TokenAmount { + available := big.Sub(m.GasFeeCap, baseFee) + if big.Cmp(m.GasPremium, available) <= 0 { + return m.GasPremium + } + return available +} + const TestGasLimit = 100e6 diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index d08b17e41..12e761fa8 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -689,49 +689,43 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth return ethtypes.EthFeeHistory{}, fmt.Errorf("bad block parameter %s: %s", params.NewestBlkNum, err) } - oldestBlkHeight := uint64(1) + var ( + basefee = ts.Blocks()[0].ParentBaseFee + oldestBlkHeight = uint64(1) - // NOTE: baseFeePerGas should include the next block after the newest of the returned range, - // because the next base fee can be inferred from the messages in the newest block. - // However, this is NOT the case in Filecoin due to deferred execution, so the best - // we can do is duplicate the last value. - baseFeeArray := []ethtypes.EthBigInt{ethtypes.EthBigInt(ts.Blocks()[0].ParentBaseFee)} - gasUsedRatioArray := []float64{} - rewardsArray := make([][]ethtypes.EthBigInt, 0) + // NOTE: baseFeePerGas should include the next block after the newest of the returned range, + // because the next base fee can be inferred from the messages in the newest block. + // However, this is NOT the case in Filecoin due to deferred execution, so the best + // we can do is duplicate the last value. + baseFeeArray = []ethtypes.EthBigInt{ethtypes.EthBigInt(basefee)} + rewardsArray = make([][]ethtypes.EthBigInt, 0) + gasUsedRatioArray = []float64{} + blocksIncluded int + ) - blocksIncluded := 0 for blocksIncluded < int(params.BlkCount) && ts.Height() > 0 { - compOutput, err := a.StateCompute(ctx, ts.Height(), nil, ts.Key()) + msgs, rcpts, err := messagesAndReceipts(ctx, ts, a.Chain, a.StateAPI) if err != nil { - return ethtypes.EthFeeHistory{}, xerrors.Errorf("cannot lookup the status of tipset: %v: %w", ts, err) + return ethtypes.EthFeeHistory{}, xerrors.Errorf("failed to retrieve messages and receipts for height %d: %w", ts.Height(), err) } txGasRewards := gasRewardSorter{} - for _, msg := range compOutput.Trace { - if msg.Msg.From == builtintypes.SystemActorAddr { + for i, msg := range msgs { + if msg.VMMessage().From == builtintypes.SystemActorAddr { continue } - smsgCid, err := getSignedMessage(ctx, a.Chain, msg.MsgCid) - if err != nil { - return ethtypes.EthFeeHistory{}, xerrors.Errorf("failed to get signed msg %s: %w", msg.MsgCid, err) - } - - tx, err := newEthTxFromSignedMessage(ctx, smsgCid, a.StateAPI) - if err != nil { - return ethtypes.EthFeeHistory{}, err - } - + effectivePremium := msg.VMMessage().EffectiveGasPremium(basefee) txGasRewards = append(txGasRewards, gasRewardTuple{ - reward: tx.Reward(ts.Blocks()[0].ParentBaseFee), - gas: uint64(msg.MsgRct.GasUsed), + premium: effectivePremium, + gasUsed: rcpts[i].GasUsed, }) } rewards, totalGasUsed := calculateRewardsAndGasUsed(rewardPercentiles, txGasRewards) // arrays should be reversed at the end - baseFeeArray = append(baseFeeArray, ethtypes.EthBigInt(ts.Blocks()[0].ParentBaseFee)) + baseFeeArray = append(baseFeeArray, ethtypes.EthBigInt(basefee)) gasUsedRatioArray = append(gasUsedRatioArray, float64(totalGasUsed)/float64(build.BlockGasLimit)) rewardsArray = append(rewardsArray, rewards) oldestBlkHeight = uint64(ts.Height()) @@ -1792,23 +1786,9 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx return ethtypes.EthBlock{}, err } - msgs, err := cs.MessagesForTipset(ctx, ts) + msgs, rcpts, err := messagesAndReceipts(ctx, ts, cs, sa) if err != nil { - return ethtypes.EthBlock{}, xerrors.Errorf("error loading messages for tipset: %v: %w", ts, err) - } - - _, rcptRoot, err := sa.StateManager.TipSetState(ctx, ts) - if err != nil { - return ethtypes.EthBlock{}, xerrors.Errorf("failed to compute state: %w", err) - } - - rcpts, err := cs.ReadReceipts(ctx, rcptRoot) - if err != nil { - return ethtypes.EthBlock{}, xerrors.Errorf("error loading receipts for tipset: %v: %w", ts, err) - } - - if len(msgs) != len(rcpts) { - return ethtypes.EthBlock{}, xerrors.Errorf("receipts and message array lengths didn't match for tipset: %v: %w", ts, err) + return ethtypes.EthBlock{}, xerrors.Errorf("failed to retrieve messages and receipts: %w", err) } block := ethtypes.NewEthBlock(len(msgs) > 0) @@ -1858,6 +1838,29 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx return block, nil } +func messagesAndReceipts(ctx context.Context, ts *types.TipSet, cs *store.ChainStore, sa StateAPI) ([]types.ChainMsg, []types.MessageReceipt, error) { + msgs, err := cs.MessagesForTipset(ctx, ts) + if err != nil { + return nil, nil, xerrors.Errorf("error loading messages for tipset: %v: %w", ts, err) + } + + _, rcptRoot, err := sa.StateManager.TipSetState(ctx, ts) + if err != nil { + return nil, nil, xerrors.Errorf("failed to compute state: %w", err) + } + + rcpts, err := cs.ReadReceipts(ctx, rcptRoot) + if err != nil { + return nil, nil, xerrors.Errorf("error loading receipts for tipset: %v: %w", ts, err) + } + + if len(msgs) != len(rcpts) { + return nil, nil, xerrors.Errorf("receipts and message array lengths didn't match for tipset: %v: %w", ts, err) + } + + return msgs, rcpts, nil +} + // lookupEthAddress makes its best effort at finding the Ethereum address for a // Filecoin address. It does the following: // @@ -2358,10 +2361,10 @@ func parseEthRevert(ret []byte) string { return ethtypes.EthBytes(cbytes).String() } -func calculateRewardsAndGasUsed(rewardPercentiles []float64, txGasRewards gasRewardSorter) ([]ethtypes.EthBigInt, uint64) { - var totalGasUsed uint64 +func calculateRewardsAndGasUsed(rewardPercentiles []float64, txGasRewards gasRewardSorter) ([]ethtypes.EthBigInt, int64) { + var gasUsedTotal int64 for _, tx := range txGasRewards { - totalGasUsed += tx.gas + gasUsedTotal += tx.gasUsed } rewards := make([]ethtypes.EthBigInt, len(rewardPercentiles)) @@ -2370,23 +2373,23 @@ func calculateRewardsAndGasUsed(rewardPercentiles []float64, txGasRewards gasRew } if len(txGasRewards) == 0 { - return rewards, totalGasUsed + return rewards, gasUsedTotal } sort.Stable(txGasRewards) var idx int - var sum uint64 + var sum int64 for i, percentile := range rewardPercentiles { - threshold := uint64(float64(totalGasUsed) * percentile / 100) + threshold := int64(float64(gasUsedTotal) * percentile / 100) for sum < threshold && idx < len(txGasRewards)-1 { - sum += txGasRewards[idx].gas + sum += txGasRewards[idx].gasUsed idx++ } - rewards[i] = txGasRewards[idx].reward + rewards[i] = ethtypes.EthBigInt(txGasRewards[idx].premium) } - return rewards, totalGasUsed + return rewards, gasUsedTotal } func getSignedMessage(ctx context.Context, cs *store.ChainStore, msgCid cid.Cid) (*types.SignedMessage, error) { @@ -2409,8 +2412,8 @@ func getSignedMessage(ctx context.Context, cs *store.ChainStore, msgCid cid.Cid) } type gasRewardTuple struct { - gas uint64 - reward ethtypes.EthBigInt + gasUsed int64 + premium abi.TokenAmount } // sorted in ascending order @@ -2421,5 +2424,5 @@ func (g gasRewardSorter) Swap(i, j int) { g[i], g[j] = g[j], g[i] } func (g gasRewardSorter) Less(i, j int) bool { - return g[i].reward.Int.Cmp(g[j].reward.Int) == -1 + return g[i].premium.Int.Cmp(g[j].premium.Int) == -1 } diff --git a/node/impl/full/eth_test.go b/node/impl/full/eth_test.go index 4cf3b5c76..87c0852fb 100644 --- a/node/impl/full/eth_test.go +++ b/node/impl/full/eth_test.go @@ -117,11 +117,8 @@ func TestReward(t *testing.T) { {maxFeePerGas: big.NewInt(50), maxPriorityFeePerGas: big.NewInt(200), answer: big.NewInt(-50)}, } for _, tc := range testcases { - tx := ethtypes.EthTx{ - MaxFeePerGas: ethtypes.EthBigInt(tc.maxFeePerGas), - MaxPriorityFeePerGas: ethtypes.EthBigInt(tc.maxPriorityFeePerGas), - } - reward := tx.Reward(baseFee) + msg := &types.Message{GasFeeCap: tc.maxFeePerGas, GasPremium: tc.maxPriorityFeePerGas} + reward := msg.EffectiveGasPremium(baseFee) require.Equal(t, 0, reward.Int.Cmp(tc.answer.Int), reward, tc.answer) } } @@ -140,20 +137,20 @@ func TestRewardPercentiles(t *testing.T) { { percentiles: []float64{25, 50, 75, 100}, txGasRewards: []gasRewardTuple{ - {gas: uint64(0), reward: ethtypes.EthBigInt(big.NewInt(300))}, - {gas: uint64(100), reward: ethtypes.EthBigInt(big.NewInt(200))}, - {gas: uint64(350), reward: ethtypes.EthBigInt(big.NewInt(100))}, - {gas: uint64(500), reward: ethtypes.EthBigInt(big.NewInt(600))}, - {gas: uint64(300), reward: ethtypes.EthBigInt(big.NewInt(700))}, + {gasUsed: int64(0), premium: big.NewInt(300)}, + {gasUsed: int64(100), premium: big.NewInt(200)}, + {gasUsed: int64(350), premium: big.NewInt(100)}, + {gasUsed: int64(500), premium: big.NewInt(600)}, + {gasUsed: int64(300), premium: big.NewInt(700)}, }, answer: []int64{200, 700, 700, 700}, }, } for _, tc := range testcases { rewards, totalGasUsed := calculateRewardsAndGasUsed(tc.percentiles, tc.txGasRewards) - gasUsed := uint64(0) + var gasUsed int64 for _, tx := range tc.txGasRewards { - gasUsed += tx.gas + gasUsed += tx.gasUsed } ans := []ethtypes.EthBigInt{} for _, bi := range tc.answer { From b5dd4e31acfd2b2202882d896d7a96d34745effd Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 11 Mar 2023 21:26:11 +0200 Subject: [PATCH 056/129] implement reconciliation --- chain/index/msgindex.go | 74 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index ff5ddbdd9..704145b89 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -35,6 +35,8 @@ var ( type ChainStore interface { SubscribeHeadChanges(f store.ReorgNotifee) MessagesForBlock(ctx context.Context, b *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) + GetHeaviestTipSet() *types.TipSet + GetTipSetFromKey(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) } var _ ChainStore = (*store.ChainStore)(nil) @@ -103,6 +105,8 @@ opendb: if err != nil { return nil, xerrors.Errorf("error creating msgindex database: %w", err) } + + // TODO we may consider populating the index in this case. } else { err = reconcileIndex(db, cs) if err != nil { @@ -154,8 +158,73 @@ func createTables(db *sql.DB) error { } func reconcileIndex(db *sql.DB, cs ChainStore) error { - // TODO - return errors.New("TODO: index.reconcileIndex") + // Invariant: after reconciliation, every tipset in the index is in the current chain; ie either + // the chain head or reachable by walking the chain. + // Algorithm: + // 1. Count mesages in index; if none, trivially reconciled. + // TODO we may consider populating the index in that case + // 2. Find the minimum tipset in the index; this will mark the end of the reconciliation walk + // 3. Walk from current tipset until we find a tipset in the index. + // 4. Delete (revert!) all tipsets above the found tipset. + // 5. If the walk ends in the boundary epoch, then delete everything. + // + + row := db.QueryRow("SELECT COUNT(*) FROM Messages") + + var result int64 + if err := row.Scan(&result); err != nil { + return xerrors.Errorf("error counting messages: %w", err) + } + + if result == 0 { + return nil + } + + row = db.QueryRow("SELECT MIN(xepoch) FROM Messages") + if err := row.Scan(&result); err != nil { + return xerrors.Errorf("error finding boundary epoch: %w", err) + } + + boundaryEpoch := abi.ChainEpoch(result) + + countMsgsStmt, err := db.Prepare("SELECT COUNT(*) FROM Messages WHERE tipset = ?") + if err != nil { + return xerrors.Errorf("error preparing statement: %w", err) + } + + curTs := cs.GetHeaviestTipSet() + for curTs != nil && curTs.Height() >= boundaryEpoch { + tsCid, err := curTs.Key().Cid() + if err != nil { + return xerrors.Errorf("error computing tipset cid: %w", err) + } + + key := tsCid.String() + row = countMsgsStmt.QueryRow(key) + if err := row.Scan(&result); err != nil { + return xerrors.Errorf("error counting messages: %w", err) + } + + if result > 0 { + // found it! + boundaryEpoch = curTs.Height() + 1 + break + } + + // walk up + parents := curTs.Parents() + curTs, err = cs.GetTipSetFromKey(context.TODO(), parents) + if err != nil { + return xerrors.Errorf("error walking chain: %w", err) + } + } + + // delete everything above the minEpoch + if _, err = db.Exec("DELETE FROM Messages WHERE xepoch >= ?", int64(boundaryEpoch)); err != nil { + return xerrors.Errorf("error deleting stale reorged out message: %w", err) + } + + return nil } func (x *msgIndex) prepareStatements() error { @@ -177,7 +246,6 @@ func (x *msgIndex) prepareStatements() error { } x.deleteTipSetStmt = stmt - // TODO reconciliation stmts return nil } From bf9ae23c988d17c029c023f1fcebf285ca9580b5 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 11 Mar 2023 22:09:31 +0200 Subject: [PATCH 057/129] implement Close --- chain/index/interface.go | 1 + chain/index/msgindex.go | 37 ++++++++++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/chain/index/interface.go b/chain/index/interface.go index a6c07d4be..f15774196 100644 --- a/chain/index/interface.go +++ b/chain/index/interface.go @@ -9,6 +9,7 @@ import ( ) var ErrNotFound = errors.New("message not found") +var ErrClosed = errors.New("index closed") // MsgInfo is the Message metadata the index tracks. type MsgInfo struct { diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index 704145b89..79f85af33 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -53,7 +53,10 @@ type msgIndex struct { mx sync.Mutex pend []headChange - cancel func() + cancel func() + workers sync.WaitGroup + closeLk sync.RWMutex + closed bool } var _ MsgIndex = (*msgIndex)(nil) @@ -141,6 +144,7 @@ opendb: ) cs.SubscribeHeadChanges(rnf) + msgIndex.workers.Add(1) go msgIndex.background(ctx) return msgIndex, nil @@ -251,6 +255,13 @@ func (x *msgIndex) prepareStatements() error { // head change notifee func (x *msgIndex) onHeadChange(rev, app []*types.TipSet) error { + x.closeLk.RLock() + defer x.closeLk.RUnlock() + + if x.closed { + return nil + } + // do it in the background to avoid blocking head change processing x.mx.Lock() x.pend = append(x.pend, headChange{rev: rev, app: app}) @@ -266,6 +277,8 @@ func (x *msgIndex) onHeadChange(rev, app []*types.TipSet) error { } func (x *msgIndex) background(ctx context.Context) { + defer x.workers.Done() + for { select { case <-x.sema: @@ -373,6 +386,13 @@ func (x *msgIndex) doApply(ctx context.Context, ts *types.TipSet) error { // interface func (x *msgIndex) GetMsgInfo(ctx context.Context, m cid.Cid) (MsgInfo, error) { + x.closeLk.RLock() + defer x.closeLk.RUnlock() + + if x.closed { + return MsgInfo{}, ErrClosed + } + var ( tipset string epoch int64 @@ -404,6 +424,17 @@ func (x *msgIndex) GetMsgInfo(ctx context.Context, m cid.Cid) (MsgInfo, error) { } func (x *msgIndex) Close() error { - // TODO - return errors.New("TODO: msgIndex.Close") + x.closeLk.Lock() + defer x.closeLk.Unlock() + + if x.closed { + return nil + } + + x.closed = true + + x.cancel() + x.workers.Wait() + + return x.db.Close() } From 9412753ba33c4bba7dd5df34a1cd5f9a34464e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Sat, 11 Mar 2023 23:03:17 +0000 Subject: [PATCH 058/129] Eth API: drop support for 'pending' block parameter. After transitioning from using StateCompute to loading receipts, we can no longer handle the 'pending' block without forcing computation. Eth Core Devs are evaluating a proposal to remove support on their end too. --- node/impl/full/eth.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 12e761fa8..0528c2176 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -234,14 +234,13 @@ func (a *EthModule) EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthH } func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict bool) (tipset *types.TipSet, err error) { - if blkParam == "earliest" { - return nil, fmt.Errorf("block param \"earliest\" is not supported") + switch blkParam { + case "earliest", "pending": + return nil, fmt.Errorf("block param %q is not supported", blkParam) } head := a.Chain.GetHeaviestTipSet() switch blkParam { - case "pending": - return head, nil case "latest": parent, err := a.Chain.GetTipSetFromKey(ctx, head.Parents()) if err != nil { From 7ce92f1422d9b28b4454631e36725f0e81356d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Sat, 11 Mar 2023 23:26:26 +0000 Subject: [PATCH 059/129] Eth API: make net_version return the chain ID. --- itests/eth_api_test.go | 15 +++++++++++++++ node/impl/full/eth.go | 9 ++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/itests/eth_api_test.go b/itests/eth_api_test.go index c24b32416..6506b01b1 100644 --- a/itests/eth_api_test.go +++ b/itests/eth_api_test.go @@ -2,9 +2,11 @@ package itests import ( "context" + "strconv" "testing" "time" + "github.com/filecoin-project/lotus/build" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/builtin" @@ -109,3 +111,16 @@ func TestEthGetGenesis(t *testing.T) { require.NoError(t, err) require.Equal(t, ethBlk.Hash, genesisHash) } + +func TestNetVersion(t *testing.T) { + blockTime := 100 * time.Millisecond + client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) + ens.InterconnectAll().BeginMining(blockTime) + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + version, err := client.NetVersion(ctx) + require.NoError(t, err) + require.Equal(t, strconv.Itoa(build.Eip155ChainId), version) +} diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index d8271fcdb..662531b7c 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -766,13 +766,8 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth return ret, nil } -func (a *EthModule) NetVersion(ctx context.Context) (string, error) { - // Note that networkId is not encoded in hex - nv, err := a.StateNetworkVersion(ctx, types.EmptyTSK) - if err != nil { - return "", err - } - return strconv.FormatUint(uint64(nv), 10), nil +func (a *EthModule) NetVersion(_ context.Context) (string, error) { + return strconv.FormatInt(build.Eip155ChainId, 10), nil } func (a *EthModule) NetListening(ctx context.Context) (bool, error) { From 4763104b99fc2f518ac6d6cd8ef6d00af5a89758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Sun, 12 Mar 2023 00:42:56 +0000 Subject: [PATCH 060/129] fix imports. --- itests/eth_api_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itests/eth_api_test.go b/itests/eth_api_test.go index 6506b01b1..43b4b5266 100644 --- a/itests/eth_api_test.go +++ b/itests/eth_api_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" - "github.com/filecoin-project/lotus/build" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" "github.com/filecoin-project/lotus/chain/wallet/key" From 5a4b5ff97e60e1f654839a39dad2697cab3b9a11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Sun, 12 Mar 2023 00:44:49 +0000 Subject: [PATCH 061/129] remove superfluous filter. --- node/impl/full/eth.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 0528c2176..c71711fb0 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -710,10 +710,6 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth txGasRewards := gasRewardSorter{} for i, msg := range msgs { - if msg.VMMessage().From == builtintypes.SystemActorAddr { - continue - } - effectivePremium := msg.VMMessage().EffectiveGasPremium(basefee) txGasRewards = append(txGasRewards, gasRewardTuple{ premium: effectivePremium, From 571a84b39075947aeebc2d377c2576a9240fc8cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Sun, 12 Mar 2023 00:45:02 +0000 Subject: [PATCH 062/129] drop irrelevant test. --- itests/eth_conformance_test.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/itests/eth_conformance_test.go b/itests/eth_conformance_test.go index 8a367d6b1..4d8f5c3dd 100644 --- a/itests/eth_conformance_test.go +++ b/itests/eth_conformance_test.go @@ -236,14 +236,6 @@ func TestEthOpenRPCConformance(t *testing.T) { skipReason: "earliest block is not supported", }, - { - method: "eth_getBlockByNumber", - variant: "pending", - call: func(a *ethAPIRaw) (json.RawMessage, error) { - return ethapi.EthGetBlockByNumber(context.Background(), "pending", true) - }, - }, - { method: "eth_getBlockByNumber", call: func(a *ethAPIRaw) (json.RawMessage, error) { From d9ca214309b96fef92f00a5e823ce3e5806e2c2a Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 12 Mar 2023 13:21:03 +0200 Subject: [PATCH 063/129] test test test --- chain/index/interface.go | 2 +- chain/index/msgindex.go | 18 +-- chain/index/msgindex_test.go | 293 +++++++++++++++++++++++++++++++++++ 3 files changed, 299 insertions(+), 14 deletions(-) create mode 100644 chain/index/msgindex_test.go diff --git a/chain/index/interface.go b/chain/index/interface.go index f15774196..8056cd662 100644 --- a/chain/index/interface.go +++ b/chain/index/interface.go @@ -16,7 +16,7 @@ type MsgInfo struct { // the message this record refers to Message cid.Cid // the tipset where this messages was executed - Tipset cid.Cid + TipSet cid.Cid // the epoch whre this message was executed Epoch abi.ChainEpoch // the canonical execution order of the message in the tipset diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index 79f85af33..b87484aa6 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -73,13 +73,6 @@ func NewMsgIndex(basePath string, cs ChainStore) (MsgIndex, error) { err error ) - if basePath == ":memory:" { - // for testing - mkdb = true - dbPath = basePath - goto opendb - } - err = os.MkdirAll(basePath, 0755) if err != nil { return nil, xerrors.Errorf("error creating msgindex base directory: %w", err) @@ -95,7 +88,6 @@ func NewMsgIndex(basePath string, cs ChainStore) (MsgIndex, error) { return nil, xerrors.Errorf("error stating msgindex database: %w", err) } -opendb: db, err := sql.Open("sqlite3", dbPath) if err != nil { // TODO [nice to have]: automaticaly delete corrupt databases @@ -232,21 +224,21 @@ func reconcileIndex(db *sql.DB, cs ChainStore) error { } func (x *msgIndex) prepareStatements() error { - stmt, err := x.db.Prepare("SELECT (tipset, xepoch, xindex) FROM Messages WHERE cid = ?") + stmt, err := x.db.Prepare("SELECT tipset, xepoch, xindex FROM Messages WHERE cid = ?") if err != nil { - return err + return xerrors.Errorf("prepare selectMsgStmt: %w", err) } x.selectMsgStmt = stmt stmt, err = x.db.Prepare("INSERT INTO Messages VALUES (?, ?, ?, ?)") if err != nil { - return err + return xerrors.Errorf("prepare insertMsgStmt: %w", err) } x.insertMsgStmt = stmt stmt, err = x.db.Prepare("DELETE FROM Messages WHERE tipset = ?") if err != nil { - return err + return xerrors.Errorf("prepare deleteTipSetStmt: %w", err) } x.deleteTipSetStmt = stmt @@ -417,7 +409,7 @@ func (x *msgIndex) GetMsgInfo(ctx context.Context, m cid.Cid) (MsgInfo, error) { return MsgInfo{ Message: m, - Tipset: tipsetCid, + TipSet: tipsetCid, Epoch: abi.ChainEpoch(epoch), Index: int(index), }, nil diff --git a/chain/index/msgindex_test.go b/chain/index/msgindex_test.go new file mode 100644 index 000000000..f6b0a1c90 --- /dev/null +++ b/chain/index/msgindex_test.go @@ -0,0 +1,293 @@ +package index + +import ( + "context" + "errors" + "math/rand" + "os" + "testing" + "time" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/chain/types/mock" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-libipfs/blocks" + + "github.com/stretchr/testify/require" +) + +func TestBasicMsgIndex(t *testing.T) { + // the most basic of tests: + // 1. Create an index with mock chain store + // 2. Advance the chain for a few tipsets + // 3. Verify that the index contains all messages with the correct tipset/epoch + cs := newMockChainStore() + cs.genesis() + + tmp := t.TempDir() + t.Cleanup(func() { _ = os.RemoveAll(tmp) }) + + msgIndex, err := NewMsgIndex(tmp, cs) + require.NoError(t, err) + + defer msgIndex.Close() //nolint + + for i := 0; i < 10; i++ { + t.Logf("advance to epoch %d", i+1) + err := cs.advance() + require.NoError(t, err) + // wait for the coalescer to notify + time.Sleep(coalesceMinDelay + 10*time.Millisecond) + } + + t.Log("verifying index") + verifyIndex(t, cs, msgIndex) +} + +func TestReorgMsgIndex(t *testing.T) { + // slightly more nuanced test that includes reorgs + // 1. Create an index with mock chain store + // 2. Advance/Reorg the chain for a few tipsets + // 3. Verify that the index contains all messages with the correct tipst/epoch + cs := newMockChainStore() + cs.genesis() + + tmp := t.TempDir() + t.Cleanup(func() { _ = os.RemoveAll(tmp) }) + + msgIndex, err := NewMsgIndex(tmp, cs) + require.NoError(t, err) + + defer msgIndex.Close() //nolint + + for i := 0; i < 10; i++ { + t.Logf("advance to epoch %d", i+1) + err := cs.advance() + require.NoError(t, err) + // wait for the coalescer to notify + time.Sleep(coalesceMinDelay + 10*time.Millisecond) + } + + // a simple reorg + t.Log("doing reorg") + reorgme := cs.curTs + reorgmeParent, err := cs.GetTipSetFromKey(context.Background(), reorgme.Parents()) + require.NoError(t, err) + cs.setHead(reorgmeParent) + reorgmeChild := cs.makeBlk() + cs.reorg([]*types.TipSet{reorgme}, []*types.TipSet{reorgmeChild}) + time.Sleep(coalesceMinDelay + 10*time.Millisecond) + + t.Log("verifying index") + verifyIndex(t, cs, msgIndex) + + t.Log("verifying that reorged messages are not present") + verifyMissing(t, cs, msgIndex, reorgme) +} + +func TestReconcileMsgIndex(t *testing.T) { + // test that exercises the reconciliation code paths + // 1. Create and populate a basic msgindex, similar to TestBasicMsgIndex. + // 2. Close it + // 3. Reorg the mock chain store + // 4. Reopen the index to trigger reconciliation + // 5. Enxure that only the stable messages remain. + cs := newMockChainStore() + cs.genesis() + + tmp := t.TempDir() + t.Cleanup(func() { _ = os.RemoveAll(tmp) }) + + msgIndex, err := NewMsgIndex(tmp, cs) + require.NoError(t, err) + + for i := 0; i < 10; i++ { + t.Logf("advance to epoch %d", i+1) + err := cs.advance() + require.NoError(t, err) + // wait for the coalescer to notify + time.Sleep(coalesceMinDelay + 10*time.Millisecond) + } + + // Close it and reorg + err = msgIndex.Close() + require.NoError(t, err) + cs.notify = nil + + // a simple reorg + t.Log("doing reorg") + reorgme := cs.curTs + reorgmeParent, err := cs.GetTipSetFromKey(context.Background(), reorgme.Parents()) + require.NoError(t, err) + cs.setHead(reorgmeParent) + reorgmeChild := cs.makeBlk() + cs.reorg([]*types.TipSet{reorgme}, []*types.TipSet{reorgmeChild}) + + // reopen to reconcile + msgIndex, err = NewMsgIndex(tmp, cs) + require.NoError(t, err) + + defer msgIndex.Close() //nolint + + t.Log("verifying index") + // need to step one up because the last tipset is not known by the index + cs.setHead(reorgmeParent) + verifyIndex(t, cs, msgIndex) + + t.Log("verifying that reorged and unknown messages are not present") + verifyMissing(t, cs, msgIndex, reorgme, reorgmeChild) +} + +func verifyIndex(t *testing.T, cs *mockChainStore, msgIndex MsgIndex) { + for ts := cs.curTs; ts.Height() > 0; { + t.Logf("verify at height %d", ts.Height()) + blks := ts.Blocks() + if len(blks) == 0 { + break + } + + tsCid, err := ts.Key().Cid() + require.NoError(t, err) + + xindex := 0 + for _, blk := range blks { + msgs, _, _ := cs.MessagesForBlock(context.Background(), blk) + for _, m := range msgs { + minfo, err := msgIndex.GetMsgInfo(context.Background(), m.Cid()) + require.NoError(t, err) + require.Equal(t, tsCid, minfo.TipSet) + require.Equal(t, ts.Height(), minfo.Epoch) + require.Equal(t, xindex, minfo.Index) + xindex++ + } + } + + parents := ts.Parents() + ts, err = cs.GetTipSetFromKey(context.Background(), parents) + require.NoError(t, err) + } +} + +func verifyMissing(t *testing.T, cs *mockChainStore, msgIndex MsgIndex, missing ...*types.TipSet) { + for _, ts := range missing { + for _, blk := range ts.Blocks() { + msgs, _, _ := cs.MessagesForBlock(context.Background(), blk) + for _, m := range msgs { + _, err := msgIndex.GetMsgInfo(context.Background(), m.Cid()) + require.Equal(t, ErrNotFound, err) + } + } + } +} + +type mockChainStore struct { + notify store.ReorgNotifee + + curTs *types.TipSet + tipsets map[types.TipSetKey]*types.TipSet + blockMsgs map[cid.Cid][]*types.Message + + nonce uint64 +} + +var _ ChainStore = (*mockChainStore)(nil) + +var systemAddr address.Address +var rng *rand.Rand + +func init() { + systemAddr, _ = address.NewIDAddress(0) + rng = rand.New(rand.NewSource(314159)) +} + +func newMockChainStore() *mockChainStore { + return &mockChainStore{ + tipsets: make(map[types.TipSetKey]*types.TipSet), + blockMsgs: make(map[cid.Cid][]*types.Message), + } +} + +func (cs *mockChainStore) genesis() { + genBlock := mock.MkBlock(nil, 0, 0) + cs.blockMsgs[genBlock.Cid()] = nil + genTs := mock.TipSet(genBlock) + cs.setHead(genTs) +} + +func (cs *mockChainStore) setHead(ts *types.TipSet) { + cs.curTs = ts + cs.tipsets[ts.Key()] = ts +} + +func (cs *mockChainStore) advance() error { + ts := cs.makeBlk() + return cs.reorg(nil, []*types.TipSet{ts}) +} + +func (cs *mockChainStore) reorg(rev, app []*types.TipSet) error { + for _, ts := range rev { + parents := ts.Parents() + cs.curTs = cs.tipsets[parents] + } + + for _, ts := range app { + cs.tipsets[ts.Key()] = ts + cs.curTs = ts + } + + if cs.notify != nil { + return cs.notify(rev, app) + } + + return nil +} + +func (cs *mockChainStore) makeBlk() *types.TipSet { + height := cs.curTs.Height() + 1 + + blk := mock.MkBlock(cs.curTs, uint64(height), uint64(height)) + blk.Messages = cs.makeGarbageCid() + msg1 := cs.makeMsg() + msg2 := cs.makeMsg() + cs.blockMsgs[blk.Cid()] = []*types.Message{msg1, msg2} + + return mock.TipSet(blk) +} + +func (cs *mockChainStore) makeMsg() *types.Message { + nonce := cs.nonce + cs.nonce++ + return &types.Message{To: systemAddr, From: systemAddr, Nonce: nonce} +} + +func (cs *mockChainStore) makeGarbageCid() cid.Cid { + garbage := blocks.NewBlock([]byte{byte(rng.Intn(256)), byte(rng.Intn(256)), byte(rng.Intn(256))}) + return garbage.Cid() +} + +func (cs *mockChainStore) SubscribeHeadChanges(f store.ReorgNotifee) { + cs.notify = f +} + +func (cs *mockChainStore) MessagesForBlock(ctx context.Context, b *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { + msgs, ok := cs.blockMsgs[b.Cid()] + if !ok { + return nil, nil, errors.New("unknown block") + } + + return msgs, nil, nil +} + +func (cs *mockChainStore) GetHeaviestTipSet() *types.TipSet { + return cs.curTs +} + +func (cs *mockChainStore) GetTipSetFromKey(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { + ts, ok := cs.tipsets[tsk] + if !ok { + return nil, errors.New("unknown tipset") + } + return ts, nil +} From 0d274df977a8178225be2d4bbeefecee425495eb Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 12 Mar 2023 13:35:50 +0200 Subject: [PATCH 064/129] use the transaction Luke! --- chain/index/msgindex.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index b87484aa6..425d149cc 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -292,42 +292,42 @@ func (x *msgIndex) processHeadChanges(ctx context.Context) error { x.pend = nil x.mx.Unlock() - txn, err := x.db.Begin() + tx, err := x.db.Begin() if err != nil { return xerrors.Errorf("error creating transaction: %w", err) } for _, hc := range pend { for _, ts := range hc.rev { - if err := x.doRevert(ctx, ts); err != nil { - txn.Rollback() + if err := x.doRevert(ctx, tx, ts); err != nil { + tx.Rollback() return xerrors.Errorf("error reverting %s: %w", ts, err) } } for _, ts := range hc.app { - if err := x.doApply(ctx, ts); err != nil { - txn.Rollback() + if err := x.doApply(ctx, tx, ts); err != nil { + tx.Rollback() return xerrors.Errorf("error applying %s: %w", ts, err) } } } - return txn.Commit() + return tx.Commit() } -func (x *msgIndex) doRevert(ctx context.Context, ts *types.TipSet) error { +func (x *msgIndex) doRevert(ctx context.Context, tx *sql.Tx, ts *types.TipSet) error { tskey, err := ts.Key().Cid() if err != nil { return xerrors.Errorf("error computing tipset cid: %w", err) } key := tskey.String() - _, err = x.deleteTipSetStmt.Exec(key) + _, err = tx.Stmt(x.deleteTipSetStmt).Exec(key) return err } -func (x *msgIndex) doApply(ctx context.Context, ts *types.TipSet) error { +func (x *msgIndex) doApply(ctx context.Context, tx *sql.Tx, ts *types.TipSet) error { tscid, err := ts.Key().Cid() if err != nil { return xerrors.Errorf("error computing tipset cid: %w", err) @@ -343,7 +343,7 @@ func (x *msgIndex) doApply(ctx context.Context, ts *types.TipSet) error { return nil } - if _, err := x.insertMsgStmt.Exec(key, tskey, xepoch, xindex); err != nil { + if _, err := tx.Stmt(x.insertMsgStmt).Exec(key, tskey, xepoch, xindex); err != nil { return err } seen[key] = struct{}{} From 171734ea31d317c2ca73e9df607ec18109f201c1 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 12 Mar 2023 15:25:07 +0200 Subject: [PATCH 065/129] hook the index into the rest of lotus --- chain/gen/gen.go | 3 ++- chain/index/interface.go | 12 ++++++++++++ chain/stmgr/searchwait.go | 31 ++++++++++++++++++++++++++++++- chain/stmgr/stmgr.go | 10 +++++++--- cmd/lotus/daemon.go | 3 ++- node/builder_chain.go | 2 ++ node/modules/chain.go | 3 ++- node/modules/msgindex.go | 31 +++++++++++++++++++++++++++++++ node/modules/stmgr.go | 5 +++-- 9 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 node/modules/msgindex.go diff --git a/chain/gen/gen.go b/chain/gen/gen.go index de2df97c2..0da8e8318 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -34,6 +34,7 @@ import ( "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" genesis2 "github.com/filecoin-project/lotus/chain/gen/genesis" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/rand" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" @@ -256,7 +257,7 @@ func NewGeneratorWithSectorsAndUpgradeSchedule(numSectors int, us stmgr.UpgradeS //return nil, xerrors.Errorf("creating drand beacon: %w", err) //} - sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), sys, us, beac, ds) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), sys, us, beac, ds, index.DummyMsgIndex) if err != nil { return nil, xerrors.Errorf("initing stmgr: %w", err) } diff --git a/chain/index/interface.go b/chain/index/interface.go index 8056cd662..c45a69361 100644 --- a/chain/index/interface.go +++ b/chain/index/interface.go @@ -30,3 +30,15 @@ type MsgIndex interface { // Close closes the index Close() error } + +type dummyMsgIndex struct{} + +func (_ dummyMsgIndex) GetMsgInfo(ctx context.Context, m cid.Cid) (MsgInfo, error) { + return MsgInfo{}, ErrNotFound +} + +func (_ dummyMsgIndex) Close() error { + return nil +} + +var DummyMsgIndex MsgIndex = dummyMsgIndex{} diff --git a/chain/stmgr/searchwait.go b/chain/stmgr/searchwait.go index 468f33db7..27a304611 100644 --- a/chain/stmgr/searchwait.go +++ b/chain/stmgr/searchwait.go @@ -10,6 +10,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" ) @@ -145,7 +146,20 @@ func (sm *StateManager) SearchForMessage(ctx context.Context, head *types.TipSet return head, r, foundMsg, nil } - fts, r, foundMsg, err := sm.searchBackForMsg(ctx, head, msg, lookbackLimit, allowReplaced) + fts, r, foundMsg, err := sm.searchForIndexedMsg(ctx, mcid, msg) + + switch { + case err == nil: + return fts, r, foundMsg, nil + + case errors.Is(err, index.ErrNotFound): + // ok for the index to have incomplete data + + default: + log.Warnf("error searching message index: %s", err) + } + + fts, r, foundMsg, err = sm.searchBackForMsg(ctx, head, msg, lookbackLimit, allowReplaced) if err != nil { log.Warnf("failed to look back through chain for message %s", mcid) @@ -159,6 +173,21 @@ func (sm *StateManager) SearchForMessage(ctx context.Context, head *types.TipSet return fts, r, foundMsg, nil } +func (sm *StateManager) searchForIndexedMsg(ctx context.Context, mcid cid.Cid, m types.ChainMsg) (*types.TipSet, *types.MessageReceipt, cid.Cid, error) { + minfo, err := sm.msgIndex.GetMsgInfo(ctx, mcid) + if err != nil { + return nil, nil, cid.Undef, err + } + + ts, err := sm.cs.GetTipSetByCid(ctx, minfo.TipSet) + if err != nil { + return nil, nil, cid.Undef, err + } + + r, foundMsg, err := sm.tipsetExecutedMessage(ctx, ts, mcid, m.VMMessage(), false) + return ts, r, foundMsg, err +} + // searchBackForMsg searches up to limit tipsets backwards from the given // tipset for a message receipt. // If limit is diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index b9f8d81bf..827aeeee5 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -25,6 +25,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin/paych" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/beacon" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/rand" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/store" @@ -136,6 +137,8 @@ type StateManager struct { tsExec Executor tsExecMonitor ExecMonitor beacon beacon.Schedule + + msgIndex index.MsgIndex } // Caches a single state tree @@ -144,7 +147,7 @@ type treeCache struct { tree *state.StateTree } -func NewStateManager(cs *store.ChainStore, exec Executor, sys vm.SyscallBuilder, us UpgradeSchedule, beacon beacon.Schedule, metadataDs dstore.Batching) (*StateManager, error) { +func NewStateManager(cs *store.ChainStore, exec Executor, sys vm.SyscallBuilder, us UpgradeSchedule, beacon beacon.Schedule, metadataDs dstore.Batching, msgIndex index.MsgIndex) (*StateManager, error) { // If we have upgrades, make sure they're in-order and make sense. if err := us.Validate(); err != nil { return nil, err @@ -199,11 +202,12 @@ func NewStateManager(cs *store.ChainStore, exec Executor, sys vm.SyscallBuilder, tree: nil, }, compWait: make(map[string]chan struct{}), + msgIndex: msgIndex, }, nil } -func NewStateManagerWithUpgradeScheduleAndMonitor(cs *store.ChainStore, exec Executor, sys vm.SyscallBuilder, us UpgradeSchedule, b beacon.Schedule, em ExecMonitor, metadataDs dstore.Batching) (*StateManager, error) { - sm, err := NewStateManager(cs, exec, sys, us, b, metadataDs) +func NewStateManagerWithUpgradeScheduleAndMonitor(cs *store.ChainStore, exec Executor, sys vm.SyscallBuilder, us UpgradeSchedule, b beacon.Schedule, em ExecMonitor, metadataDs dstore.Batching, msgIndex index.MsgIndex) (*StateManager, error) { + sm, err := NewStateManager(cs, exec, sys, us, b, metadataDs, msgIndex) if err != nil { return nil, err } diff --git a/cmd/lotus/daemon.go b/cmd/lotus/daemon.go index b3341bd79..585d4b2ce 100644 --- a/cmd/lotus/daemon.go +++ b/cmd/lotus/daemon.go @@ -35,6 +35,7 @@ import ( "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" @@ -540,7 +541,7 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) } // TODO: We need to supply the actual beacon after v14 - stm, err := stmgr.NewStateManager(cst, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil, mds) + stm, err := stmgr.NewStateManager(cst, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil, mds, index.DummyMsgIndex) if err != nil { return err } diff --git a/node/builder_chain.go b/node/builder_chain.go index d334d782e..20817acff 100644 --- a/node/builder_chain.go +++ b/node/builder_chain.go @@ -20,6 +20,7 @@ import ( "github.com/filecoin-project/lotus/chain/events" "github.com/filecoin-project/lotus/chain/exchange" "github.com/filecoin-project/lotus/chain/gen/slashfilter" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/market" "github.com/filecoin-project/lotus/chain/messagepool" "github.com/filecoin-project/lotus/chain/messagesigner" @@ -79,6 +80,7 @@ var ChainNode = Options( Override(new(stmgr.Executor), consensus.NewTipSetExecutor(filcns.RewardFunc)), Override(new(consensus.Consensus), filcns.NewFilecoinExpectedConsensus), Override(new(*store.ChainStore), modules.ChainStore), + Override(new(index.MsgIndex), modules.MsgIndex), Override(new(*stmgr.StateManager), modules.StateManager), Override(new(dtypes.ChainBitswap), modules.ChainBitswap), Override(new(dtypes.ChainBlockService), modules.ChainBlockService), // todo: unused diff --git a/node/modules/chain.go b/node/modules/chain.go index 0c3bad2c7..762c77e4b 100644 --- a/node/modules/chain.go +++ b/node/modules/chain.go @@ -21,6 +21,7 @@ import ( "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/exchange" "github.com/filecoin-project/lotus/chain/gen/slashfilter" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/messagepool" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" @@ -123,7 +124,7 @@ func NetworkName(mctx helpers.MetricsCtx, ctx := helpers.LifecycleCtx(mctx, lc) - sm, err := stmgr.NewStateManager(cs, tsexec, syscalls, us, nil, nil) + sm, err := stmgr.NewStateManager(cs, tsexec, syscalls, us, nil, nil, index.DummyMsgIndex) if err != nil { return "", err } diff --git a/node/modules/msgindex.go b/node/modules/msgindex.go new file mode 100644 index 000000000..296ecde49 --- /dev/null +++ b/node/modules/msgindex.go @@ -0,0 +1,31 @@ +package modules + +import ( + "context" + + "go.uber.org/fx" + + "github.com/filecoin-project/lotus/chain/index" + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/node/repo" +) + +func MsgIndex(lc fx.Lifecycle, cs *store.ChainStore, r repo.LockedRepo) (index.MsgIndex, error) { + basePath, err := r.SqlitePath() + if err != nil { + return nil, err + } + + msgIndex, err := index.NewMsgIndex(basePath, cs) + if err != nil { + return nil, err + } + + lc.Append(fx.Hook{ + OnStop: func(_ context.Context) error { + return msgIndex.Close() + }, + }) + + return msgIndex, nil +} diff --git a/node/modules/stmgr.go b/node/modules/stmgr.go index b8f6f4776..f3eaee219 100644 --- a/node/modules/stmgr.go +++ b/node/modules/stmgr.go @@ -4,14 +4,15 @@ import ( "go.uber.org/fx" "github.com/filecoin-project/lotus/chain/beacon" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/node/modules/dtypes" ) -func StateManager(lc fx.Lifecycle, cs *store.ChainStore, exec stmgr.Executor, sys vm.SyscallBuilder, us stmgr.UpgradeSchedule, b beacon.Schedule, metadataDs dtypes.MetadataDS) (*stmgr.StateManager, error) { - sm, err := stmgr.NewStateManager(cs, exec, sys, us, b, metadataDs) +func StateManager(lc fx.Lifecycle, cs *store.ChainStore, exec stmgr.Executor, sys vm.SyscallBuilder, us stmgr.UpgradeSchedule, b beacon.Schedule, metadataDs dtypes.MetadataDS, msgIndex index.MsgIndex) (*stmgr.StateManager, error) { + sm, err := stmgr.NewStateManager(cs, exec, sys, us, b, metadataDs, msgIndex) if err != nil { return nil, err } From 0077fa2a98bf3104525de5c3e55e9b84397a2229 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 12 Mar 2023 15:30:05 +0200 Subject: [PATCH 066/129] make gen --- chain/index/interface.go | 3 ++- chain/index/msgindex.go | 3 ++- chain/index/msgindex_test.go | 9 +++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/chain/index/interface.go b/chain/index/interface.go index c45a69361..bdc8d5e92 100644 --- a/chain/index/interface.go +++ b/chain/index/interface.go @@ -4,8 +4,9 @@ import ( "context" "errors" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-state-types/abi" ) var ErrNotFound = errors.New("message not found") diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index 425d149cc..b89d605c9 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -10,14 +10,15 @@ import ( "sync" "time" + "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" _ "github.com/mattn/go-sqlite3" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" - "github.com/ipfs/go-cid" ) var log = logging.Logger("msgindex") diff --git a/chain/index/msgindex_test.go b/chain/index/msgindex_test.go index f6b0a1c90..7ed58d82d 100644 --- a/chain/index/msgindex_test.go +++ b/chain/index/msgindex_test.go @@ -8,14 +8,15 @@ import ( "testing" "time" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-libipfs/blocks" + "github.com/stretchr/testify/require" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/mock" - "github.com/ipfs/go-cid" - "github.com/ipfs/go-libipfs/blocks" - - "github.com/stretchr/testify/require" ) func TestBasicMsgIndex(t *testing.T) { From 14153919889d6aa00de391464ed36b788763681b Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 12 Mar 2023 15:33:36 +0200 Subject: [PATCH 067/129] lint lint lint --- chain/index/interface.go | 4 ++-- chain/index/msgindex.go | 4 ++-- chain/index/msgindex_test.go | 6 ++++-- chain/stmgr/forks_test.go | 10 +++++++--- chain/store/store_test.go | 3 ++- cmd/lotus-bench/import.go | 3 ++- cmd/lotus-shed/balances.go | 5 +++-- cmd/lotus-shed/gas-estimation.go | 5 +++-- cmd/lotus-shed/invariants.go | 3 ++- cmd/lotus-shed/migrations.go | 3 ++- cmd/lotus-shed/state-stats.go | 3 ++- cmd/lotus-sim/simulation/node.go | 3 ++- cmd/lotus-sim/simulation/simulation.go | 3 ++- conformance/driver.go | 3 ++- 14 files changed, 37 insertions(+), 21 deletions(-) diff --git a/chain/index/interface.go b/chain/index/interface.go index bdc8d5e92..d212eba88 100644 --- a/chain/index/interface.go +++ b/chain/index/interface.go @@ -34,11 +34,11 @@ type MsgIndex interface { type dummyMsgIndex struct{} -func (_ dummyMsgIndex) GetMsgInfo(ctx context.Context, m cid.Cid) (MsgInfo, error) { +func (dummyMsgIndex) GetMsgInfo(ctx context.Context, m cid.Cid) (MsgInfo, error) { return MsgInfo{}, ErrNotFound } -func (_ dummyMsgIndex) Close() error { +func (dummyMsgIndex) Close() error { return nil } diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index b89d605c9..2a28fd32b 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -301,14 +301,14 @@ func (x *msgIndex) processHeadChanges(ctx context.Context) error { for _, hc := range pend { for _, ts := range hc.rev { if err := x.doRevert(ctx, tx, ts); err != nil { - tx.Rollback() + tx.Rollback() //nolint return xerrors.Errorf("error reverting %s: %w", ts, err) } } for _, ts := range hc.app { if err := x.doApply(ctx, tx, ts); err != nil { - tx.Rollback() + tx.Rollback() //nolint return xerrors.Errorf("error applying %s: %w", ts, err) } } diff --git a/chain/index/msgindex_test.go b/chain/index/msgindex_test.go index 7ed58d82d..0bb767ab0 100644 --- a/chain/index/msgindex_test.go +++ b/chain/index/msgindex_test.go @@ -78,7 +78,8 @@ func TestReorgMsgIndex(t *testing.T) { require.NoError(t, err) cs.setHead(reorgmeParent) reorgmeChild := cs.makeBlk() - cs.reorg([]*types.TipSet{reorgme}, []*types.TipSet{reorgmeChild}) + err = cs.reorg([]*types.TipSet{reorgme}, []*types.TipSet{reorgmeChild}) + require.NoError(t, err) time.Sleep(coalesceMinDelay + 10*time.Millisecond) t.Log("verifying index") @@ -124,7 +125,8 @@ func TestReconcileMsgIndex(t *testing.T) { require.NoError(t, err) cs.setHead(reorgmeParent) reorgmeChild := cs.makeBlk() - cs.reorg([]*types.TipSet{reorgme}, []*types.TipSet{reorgmeChild}) + err = cs.reorg([]*types.TipSet{reorgme}, []*types.TipSet{reorgmeChild}) + require.NoError(t, err) // reopen to reconcile msgIndex, err = NewMsgIndex(tmp, cs) diff --git a/chain/stmgr/forks_test.go b/chain/stmgr/forks_test.go index a904172cd..f91d8997d 100644 --- a/chain/stmgr/forks_test.go +++ b/chain/stmgr/forks_test.go @@ -36,6 +36,7 @@ import ( "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/gen" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/stmgr" . "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" @@ -168,7 +169,7 @@ func TestForkHeightTriggers(t *testing.T) { } return st.Flush(ctx) - }}}, cg.BeaconSchedule(), datastore.NewMapDatastore()) + }}}, cg.BeaconSchedule(), datastore.NewMapDatastore(), index.DummyMsgIndex) if err != nil { t.Fatal(err) } @@ -286,7 +287,7 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) { root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { migrationCount++ return root, nil - }}}, cg.BeaconSchedule(), datastore.NewMapDatastore()) + }}}, cg.BeaconSchedule(), datastore.NewMapDatastore(), index.DummyMsgIndex) if err != nil { t.Fatal(err) } @@ -504,7 +505,7 @@ func TestForkPreMigration(t *testing.T) { return nil }, }}}, - }, cg.BeaconSchedule(), datastore.NewMapDatastore()) + }, cg.BeaconSchedule(), datastore.NewMapDatastore(), index.DummyMsgIndex) if err != nil { t.Fatal(err) } @@ -579,6 +580,7 @@ func TestDisablePreMigration(t *testing.T) { }, cg.BeaconSchedule(), datastore.NewMapDatastore(), + index.DummyMsgIndex, ) require.NoError(t, err) require.NoError(t, sm.Start(context.Background())) @@ -633,6 +635,7 @@ func TestMigrtionCache(t *testing.T) { }, cg.BeaconSchedule(), metadataDs, + index.DummyMsgIndex, ) require.NoError(t, err) require.NoError(t, sm.Start(context.Background())) @@ -685,6 +688,7 @@ func TestMigrtionCache(t *testing.T) { }, cg.BeaconSchedule(), metadataDs, + index.DummyMsgIndex, ) require.NoError(t, err) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { diff --git a/chain/store/store_test.go b/chain/store/store_test.go index cc72acc95..cea0fdc2a 100644 --- a/chain/store/store_test.go +++ b/chain/store/store_test.go @@ -18,6 +18,7 @@ import ( "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/gen" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" @@ -214,7 +215,7 @@ func TestChainExportImportFull(t *testing.T) { t.Fatal("imported chain differed from exported chain") } - sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), nil, filcns.DefaultUpgradeSchedule(), cg.BeaconSchedule(), ds) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), nil, filcns.DefaultUpgradeSchedule(), cg.BeaconSchedule(), ds, index.DummyMsgIndex) if err != nil { t.Fatal(err) } diff --git a/cmd/lotus-bench/import.go b/cmd/lotus-bench/import.go index 51c567d90..44c152d0c 100644 --- a/cmd/lotus-bench/import.go +++ b/cmd/lotus-bench/import.go @@ -36,6 +36,7 @@ import ( badgerbs "github.com/filecoin-project/lotus/blockstore/badger" "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" @@ -229,7 +230,7 @@ var importBenchCmd = &cli.Command{ defer cs.Close() //nolint:errcheck // TODO: We need to supply the actual beacon after v14 - stm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(verifier), filcns.DefaultUpgradeSchedule(), nil, metadataDs) + stm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(verifier), filcns.DefaultUpgradeSchedule(), nil, metadataDs, index.DummyMsgIndex) if err != nil { return err } diff --git a/cmd/lotus-shed/balances.go b/cmd/lotus-shed/balances.go index bae281583..28569cd12 100644 --- a/cmd/lotus-shed/balances.go +++ b/cmd/lotus-shed/balances.go @@ -35,6 +35,7 @@ import ( "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/gen/genesis" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" @@ -513,7 +514,7 @@ var chainBalanceStateCmd = &cli.Command{ cst := cbor.NewCborStore(bs) store := adt.WrapStore(ctx, cst) - sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil, mds) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil, mds, index.DummyMsgIndex) if err != nil { return err } @@ -737,7 +738,7 @@ var chainPledgeCmd = &cli.Command{ cst := cbor.NewCborStore(bs) store := adt.WrapStore(ctx, cst) - sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil, mds) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil, mds, index.DummyMsgIndex) if err != nil { return err } diff --git a/cmd/lotus-shed/gas-estimation.go b/cmd/lotus-shed/gas-estimation.go index fe8428d1e..7a5c35267 100644 --- a/cmd/lotus-shed/gas-estimation.go +++ b/cmd/lotus-shed/gas-estimation.go @@ -20,6 +20,7 @@ import ( "github.com/filecoin-project/lotus/chain/beacon/drand" "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" @@ -111,7 +112,7 @@ var gasTraceCmd = &cli.Command{ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) defer cs.Close() //nolint:errcheck - sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), shd, mds) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), shd, mds, index.DummyMsgIndex) if err != nil { return err } @@ -212,7 +213,7 @@ var replayOfflineCmd = &cli.Command{ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) defer cs.Close() //nolint:errcheck - sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), shd, mds) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), shd, mds, index.DummyMsgIndex) if err != nil { return err } diff --git a/cmd/lotus-shed/invariants.go b/cmd/lotus-shed/invariants.go index b759e2c2c..45ad43170 100644 --- a/cmd/lotus-shed/invariants.go +++ b/cmd/lotus-shed/invariants.go @@ -21,6 +21,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" @@ -90,7 +91,7 @@ var invariantsCmd = &cli.Command{ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) defer cs.Close() //nolint:errcheck - sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil, mds) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil, mds, index.DummyMsgIndex) if err != nil { return err } diff --git a/cmd/lotus-shed/migrations.go b/cmd/lotus-shed/migrations.go index b3d5da387..e2a66f067 100644 --- a/cmd/lotus-shed/migrations.go +++ b/cmd/lotus-shed/migrations.go @@ -41,6 +41,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin/verifreg" "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" @@ -123,7 +124,7 @@ var migrationsCmd = &cli.Command{ defer cs.Close() //nolint:errcheck // Note: we use a map datastore for the metadata to avoid writing / using cached migration results in the metadata store - sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil, datastore.NewMapDatastore()) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil, datastore.NewMapDatastore(), index.DummyMsgIndex) if err != nil { return err } diff --git a/cmd/lotus-shed/state-stats.go b/cmd/lotus-shed/state-stats.go index 521e32c79..f6fb4166d 100644 --- a/cmd/lotus-shed/state-stats.go +++ b/cmd/lotus-shed/state-stats.go @@ -26,6 +26,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" @@ -308,7 +309,7 @@ to reduce the number of decode operations performed by caching the decoded objec } tsExec := consensus.NewTipSetExecutor(filcns.RewardFunc) - sm, err := stmgr.NewStateManager(cs, tsExec, vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil, mds) + sm, err := stmgr.NewStateManager(cs, tsExec, vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil, mds, index.DummyMsgIndex) if err != nil { return err } diff --git a/cmd/lotus-sim/simulation/node.go b/cmd/lotus-sim/simulation/node.go index 9b37da6c8..1d7786010 100644 --- a/cmd/lotus-sim/simulation/node.go +++ b/cmd/lotus-sim/simulation/node.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" @@ -106,7 +107,7 @@ func (nd *Node) LoadSim(ctx context.Context, name string) (*Simulation, error) { if err != nil { return nil, xerrors.Errorf("failed to create upgrade schedule for simulation %s: %w", name, err) } - sim.StateManager, err = stmgr.NewStateManager(nd.Chainstore, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(mock.Verifier), us, nil, nd.MetadataDS) + sim.StateManager, err = stmgr.NewStateManager(nd.Chainstore, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(mock.Verifier), us, nil, nd.MetadataDS, index.DummyMsgIndex) if err != nil { return nil, xerrors.Errorf("failed to create state manager for simulation %s: %w", name, err) } diff --git a/cmd/lotus-sim/simulation/simulation.go b/cmd/lotus-sim/simulation/simulation.go index 294f4cfbc..47d06aeda 100644 --- a/cmd/lotus-sim/simulation/simulation.go +++ b/cmd/lotus-sim/simulation/simulation.go @@ -17,6 +17,7 @@ import ( "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" @@ -201,7 +202,7 @@ func (sim *Simulation) SetUpgradeHeight(nv network.Version, epoch abi.ChainEpoch if err != nil { return err } - sm, err := stmgr.NewStateManager(sim.Node.Chainstore, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(mock.Verifier), newUpgradeSchedule, nil, sim.Node.MetadataDS) + sm, err := stmgr.NewStateManager(sim.Node.Chainstore, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(mock.Verifier), newUpgradeSchedule, nil, sim.Node.MetadataDS, index.DummyMsgIndex) if err != nil { return err } diff --git a/conformance/driver.go b/conformance/driver.go index 2680a7154..e0d56d074 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -22,6 +22,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" @@ -108,7 +109,7 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, ds ds.Batching, params cs = store.NewChainStore(bs, bs, ds, filcns.Weight, nil) tse = consensus.NewTipSetExecutor(filcns.RewardFunc) - sm, err = stmgr.NewStateManager(cs, tse, syscalls, filcns.DefaultUpgradeSchedule(), nil, ds) + sm, err = stmgr.NewStateManager(cs, tse, syscalls, filcns.DefaultUpgradeSchedule(), nil, ds, index.DummyMsgIndex) ) if err != nil { return nil, err From 3b765a30d32d686fb23e74e833b339ea75ce354d Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 12 Mar 2023 16:02:51 +0200 Subject: [PATCH 068/129] dummy index for itests --- node/builder.go | 2 ++ node/modules/msgindex.go | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/node/builder.go b/node/builder.go index 76c93cbc6..75162f5ea 100644 --- a/node/builder.go +++ b/node/builder.go @@ -24,6 +24,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/beacon" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/journal" "github.com/filecoin-project/lotus/journal/alerting" @@ -390,6 +391,7 @@ func Test() Option { Unset(new(*peermgr.PeerMgr)), Override(new(beacon.Schedule), testing.RandomBeacon), Override(new(*storageadapter.DealPublisher), storageadapter.NewDealPublisher(nil, storageadapter.PublishMsgConfig{})), + Override(new(index.MsgIndex), modules.DummyMsgIndex), ) } diff --git a/node/modules/msgindex.go b/node/modules/msgindex.go index 296ecde49..23072ade1 100644 --- a/node/modules/msgindex.go +++ b/node/modules/msgindex.go @@ -29,3 +29,7 @@ func MsgIndex(lc fx.Lifecycle, cs *store.ChainStore, r repo.LockedRepo) (index.M return msgIndex, nil } + +func DummyMsgIndex() (index.MsgIndex, error) { + return index.DummyMsgIndex, nil +} From 88d7a4e610d957ba01c55d44320baced8ad5639e Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 12 Mar 2023 16:12:14 +0200 Subject: [PATCH 069/129] more lint --- chain/index/msgindex.go | 2 +- cmd/lotus-sim/simulation/node.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index 2a28fd32b..78add0f79 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -356,7 +356,7 @@ func (x *msgIndex) doApply(ctx context.Context, tx *sql.Tx, ts *types.TipSet) er for _, blk := range ts.Blocks() { bmsgs, smsgs, err := x.cs.MessagesForBlock(ctx, blk) if err != nil { - return xerrors.Errorf("error retrieving messages for block %s in %s: %w", blk, ts, err) + return xerrors.Errorf("error retrieving messages for block %s in %s: %w", blk.Cid(), ts, err) } for _, m := range bmsgs { diff --git a/cmd/lotus-sim/simulation/node.go b/cmd/lotus-sim/simulation/node.go index 1d7786010..f232e0d21 100644 --- a/cmd/lotus-sim/simulation/node.go +++ b/cmd/lotus-sim/simulation/node.go @@ -126,7 +126,7 @@ func (nd *Node) CreateSim(ctx context.Context, name string, head *types.TipSet) if err != nil { return nil, err } - sm, err := stmgr.NewStateManager(nd.Chainstore, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(mock.Verifier), filcns.DefaultUpgradeSchedule(), nil, nd.MetadataDS) + sm, err := stmgr.NewStateManager(nd.Chainstore, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(mock.Verifier), filcns.DefaultUpgradeSchedule(), nil, nd.MetadataDS, index.DummyMsgIndex) if err != nil { return nil, xerrors.Errorf("creating state manager: %w", err) } From e65a5988e1a54422c60309a324b6661eee11aa9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Sun, 12 Mar 2023 15:53:56 +0000 Subject: [PATCH 070/129] Eth API: make eth_getTransactionByBlock* ops return ErrUnsupported. --- node/impl/full/eth.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index fb4cfe6cb..721439502 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -42,6 +42,8 @@ import ( "github.com/filecoin-project/lotus/node/modules/dtypes" ) +var ErrUnsupported = errors.New("unsupported method") + type EthModuleAPI interface { EthBlockNumber(ctx context.Context) (ethtypes.EthUint64, error) EthAccounts(ctx context.Context) ([]ethtypes.EthAddress, error) @@ -439,12 +441,12 @@ func (a *EthModule) EthGetTransactionReceipt(ctx context.Context, txHash ethtype return &receipt, nil } -func (a *EthAPI) EthGetTransactionByBlockHashAndIndex(ctx context.Context, blkHash ethtypes.EthHash, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) { - return ethtypes.EthTx{}, nil +func (a *EthAPI) EthGetTransactionByBlockHashAndIndex(context.Context, ethtypes.EthHash, ethtypes.EthUint64) (ethtypes.EthTx, error) { + return ethtypes.EthTx{}, ErrUnsupported } -func (a *EthAPI) EthGetTransactionByBlockNumberAndIndex(ctx context.Context, blkNum ethtypes.EthUint64, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) { - return ethtypes.EthTx{}, nil +func (a *EthAPI) EthGetTransactionByBlockNumberAndIndex(context.Context, ethtypes.EthUint64, ethtypes.EthUint64) (ethtypes.EthTx, error) { + return ethtypes.EthTx{}, ErrUnsupported } // EthGetCode returns string value of the compiled bytecode From df6dfdf8a984bf0ad8a65927f54c5107af4b2e1b Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 05:51:24 +0200 Subject: [PATCH 071/129] refactor database - drop the execution index; we don't need it - it is inclusion tipset - use MessagesForTipset - hoist db sql stuffs on top for clarity - add index for tipset on messages --- chain/index/interface.go | 6 +- chain/index/msgindex.go | 130 ++++++++++++++++++++------------------- 2 files changed, 70 insertions(+), 66 deletions(-) diff --git a/chain/index/interface.go b/chain/index/interface.go index d212eba88..ff46ecad7 100644 --- a/chain/index/interface.go +++ b/chain/index/interface.go @@ -16,12 +16,10 @@ var ErrClosed = errors.New("index closed") type MsgInfo struct { // the message this record refers to Message cid.Cid - // the tipset where this messages was executed + // the tipset where this messages was included TipSet cid.Cid - // the epoch whre this message was executed + // the epoch whre this message was included Epoch abi.ChainEpoch - // the canonical execution order of the message in the tipset - Index int } // MsgIndex is the interface to the message index diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index 78add0f79..d2686133c 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -23,9 +23,36 @@ import ( var log = logging.Logger("msgindex") -var ( - dbName = "msgindex.db" +var dbName = "msgindex.db" +var dbDefs = []string{ + `CREATE TABLE IF NOT EXISTS messages ( + cid VARCHAR(80) PRIMARY KEY, + tipset_cid VARCHAR(80) NOT NULL, + epoch INTEGER NOT NULL + )`, + `CREATE INDEX IF NOT EXISTS tipset_cids ON messages (tipset_cid) + `, + `CREATE TABLE IF NOT EXISTS _meta ( + version UINT64 NOT NULL UNIQUE + )`, + `INSERT OR IGNORE INTO _meta (version) VALUES (1)`, +} +var dbPragmas = []string{} +const ( + // prepared stmts + dbqGetMessageInfo = "SELECT tipset_cid, epoch FROM messages WHERE cid = ?" + dbqInsertMessage = "INSERT INTO messages VALUES (?, ?, ?)" + dbqDeleteTipsetMessages = "DELETE FROM messages WHERE tipset_cid = ?" + // reconciliation + dbqCountMessages = "SELECT COUNT(*) FROM messages" + dbqMinEpoch = "SELECT MIN(epoch) FROM messages" + dbqCountTipsetMessages = "SELECT COUNT(*) FROM messages WHERE tipset_cid = ?" + dbqDeleteMessagesByEpoch = "DELETE FROM messages WHERE epoch >= ?" +) + +// coalescer configuration (TODO: use observer instead) +var ( coalesceMinDelay = 100 * time.Millisecond coalesceMaxDelay = time.Second coalesceMergeInterval = 100 * time.Millisecond @@ -35,7 +62,7 @@ var ( // but this simplifies unit testing. type ChainStore interface { SubscribeHeadChanges(f store.ReorgNotifee) - MessagesForBlock(ctx context.Context, b *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) + MessagesForTipset(ctx context.Context, ts *types.TipSet) ([]types.ChainMsg, error) GetHeaviestTipSet() *types.TipSet GetTipSetFromKey(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) } @@ -69,8 +96,8 @@ type headChange struct { func NewMsgIndex(basePath string, cs ChainStore) (MsgIndex, error) { var ( - mkdb bool dbPath string + exists bool err error ) @@ -82,8 +109,10 @@ func NewMsgIndex(basePath string, cs ChainStore) (MsgIndex, error) { dbPath = path.Join(basePath, dbName) _, err = os.Stat(dbPath) switch { + case err == nil: + exists = true + case errors.Is(err, fs.ErrNotExist): - mkdb = true case err != nil: return nil, xerrors.Errorf("error stating msgindex database: %w", err) @@ -96,16 +125,13 @@ func NewMsgIndex(basePath string, cs ChainStore) (MsgIndex, error) { return nil, xerrors.Errorf("error opening msgindex database: %w", err) } - if mkdb { - err = createTables(db) - if err != nil { - return nil, xerrors.Errorf("error creating msgindex database: %w", err) - } + if err := prepareDB(db); err != nil { + return nil, xerrors.Errorf("error creating msgindex database: %w", err) + } - // TODO we may consider populating the index in this case. - } else { - err = reconcileIndex(db, cs) - if err != nil { + // TODO we may consider populating the index when first creating the db + if exists { + if err := reconcileIndex(db, cs); err != nil { return nil, xerrors.Errorf("error reconciling msgindex database: %w", err) } } @@ -144,13 +170,19 @@ func NewMsgIndex(basePath string, cs ChainStore) (MsgIndex, error) { } // init utilities -func createTables(db *sql.DB) error { - // Just a single table for now; ghetto, but this an index so we denormalize to avoid joins. - if _, err := db.Exec("CREATE TABLE Messages (cid VARCHAR(80) PRIMARY KEY, tipset VARCHAR(80), xepoch INTEGER, xindex INTEGER)"); err != nil { - return err +func prepareDB(db *sql.DB) error { + for _, stmt := range dbDefs { + if _, err := db.Exec(stmt); err != nil { + return xerrors.Errorf("error executing sql statement '%s': %w", stmt, err) + } + } + + for _, stmt := range dbPragmas { + if _, err := db.Exec(stmt); err != nil { + return xerrors.Errorf("error executing sql statement '%s': %w", stmt, err) + } } - // TODO Should we add an index for tipset to speed up deletion on revert? return nil } @@ -166,7 +198,7 @@ func reconcileIndex(db *sql.DB, cs ChainStore) error { // 5. If the walk ends in the boundary epoch, then delete everything. // - row := db.QueryRow("SELECT COUNT(*) FROM Messages") + row := db.QueryRow(dbqCountMessages) var result int64 if err := row.Scan(&result); err != nil { @@ -177,14 +209,14 @@ func reconcileIndex(db *sql.DB, cs ChainStore) error { return nil } - row = db.QueryRow("SELECT MIN(xepoch) FROM Messages") + row = db.QueryRow(dbqMinEpoch) if err := row.Scan(&result); err != nil { return xerrors.Errorf("error finding boundary epoch: %w", err) } boundaryEpoch := abi.ChainEpoch(result) - countMsgsStmt, err := db.Prepare("SELECT COUNT(*) FROM Messages WHERE tipset = ?") + countMsgsStmt, err := db.Prepare(dbqCountTipsetMessages) if err != nil { return xerrors.Errorf("error preparing statement: %w", err) } @@ -217,7 +249,7 @@ func reconcileIndex(db *sql.DB, cs ChainStore) error { } // delete everything above the minEpoch - if _, err = db.Exec("DELETE FROM Messages WHERE xepoch >= ?", int64(boundaryEpoch)); err != nil { + if _, err = db.Exec(dbqDeleteMessagesByEpoch, int64(boundaryEpoch)); err != nil { return xerrors.Errorf("error deleting stale reorged out message: %w", err) } @@ -225,19 +257,19 @@ func reconcileIndex(db *sql.DB, cs ChainStore) error { } func (x *msgIndex) prepareStatements() error { - stmt, err := x.db.Prepare("SELECT tipset, xepoch, xindex FROM Messages WHERE cid = ?") + stmt, err := x.db.Prepare(dbqGetMessageInfo) if err != nil { return xerrors.Errorf("prepare selectMsgStmt: %w", err) } x.selectMsgStmt = stmt - stmt, err = x.db.Prepare("INSERT INTO Messages VALUES (?, ?, ?, ?)") + stmt, err = x.db.Prepare(dbqInsertMessage) if err != nil { return xerrors.Errorf("prepare insertMsgStmt: %w", err) } x.insertMsgStmt = stmt - stmt, err = x.db.Prepare("DELETE FROM Messages WHERE tipset = ?") + stmt, err = x.db.Prepare(dbqDeleteTipsetMessages) if err != nil { return xerrors.Errorf("prepare deleteTipSetStmt: %w", err) } @@ -335,42 +367,18 @@ func (x *msgIndex) doApply(ctx context.Context, tx *sql.Tx, ts *types.TipSet) er } tskey := tscid.String() - xepoch := int64(ts.Height()) - var xindex int64 + epoch := int64(ts.Height()) - seen := make(map[string]struct{}) - insert := func(key string) error { - if _, ok := seen[key]; ok { - return nil - } - - if _, err := tx.Stmt(x.insertMsgStmt).Exec(key, tskey, xepoch, xindex); err != nil { - return err - } - seen[key] = struct{}{} - xindex++ - - return nil + msgs, err := x.cs.MessagesForTipset(ctx, ts) + if err != nil { + return xerrors.Errorf("error retrieving messages for tipset %s: %w", ts, err) } - for _, blk := range ts.Blocks() { - bmsgs, smsgs, err := x.cs.MessagesForBlock(ctx, blk) - if err != nil { - return xerrors.Errorf("error retrieving messages for block %s in %s: %w", blk.Cid(), ts, err) - } - - for _, m := range bmsgs { - key := m.Cid().String() - if err := insert(key); err != nil { - return err - } - } - - for _, m := range smsgs { - key := m.Cid().String() - if err := insert(key); err != nil { - return err - } + insertStmt := tx.Stmt(x.insertMsgStmt) + for _, msg := range msgs { + key := msg.Cid().String() + if _, err := insertStmt.Exec(key, tskey, epoch); err != nil { + return xerrors.Errorf("error inserting message: %w", err) } } @@ -389,12 +397,11 @@ func (x *msgIndex) GetMsgInfo(ctx context.Context, m cid.Cid) (MsgInfo, error) { var ( tipset string epoch int64 - index int64 ) key := m.String() row := x.selectMsgStmt.QueryRow(key) - err := row.Scan(&tipset, &epoch, &index) + err := row.Scan(&tipset, &epoch) switch { case err == sql.ErrNoRows: return MsgInfo{}, ErrNotFound @@ -412,7 +419,6 @@ func (x *msgIndex) GetMsgInfo(ctx context.Context, m cid.Cid) (MsgInfo, error) { Message: m, TipSet: tipsetCid, Epoch: abi.ChainEpoch(epoch), - Index: int(index), }, nil } From e7448b1bb53ac36a1285cb493af922e4754dc092 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 05:51:33 +0200 Subject: [PATCH 072/129] fix tests --- chain/index/msgindex_test.go | 55 +++++++++++++++++------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/chain/index/msgindex_test.go b/chain/index/msgindex_test.go index 0bb767ab0..43b262ce2 100644 --- a/chain/index/msgindex_test.go +++ b/chain/index/msgindex_test.go @@ -154,17 +154,13 @@ func verifyIndex(t *testing.T, cs *mockChainStore, msgIndex MsgIndex) { tsCid, err := ts.Key().Cid() require.NoError(t, err) - xindex := 0 - for _, blk := range blks { - msgs, _, _ := cs.MessagesForBlock(context.Background(), blk) - for _, m := range msgs { - minfo, err := msgIndex.GetMsgInfo(context.Background(), m.Cid()) - require.NoError(t, err) - require.Equal(t, tsCid, minfo.TipSet) - require.Equal(t, ts.Height(), minfo.Epoch) - require.Equal(t, xindex, minfo.Index) - xindex++ - } + msgs, err := cs.MessagesForTipset(context.Background(), ts) + require.NoError(t, err) + for _, m := range msgs { + minfo, err := msgIndex.GetMsgInfo(context.Background(), m.Cid()) + require.NoError(t, err) + require.Equal(t, tsCid, minfo.TipSet) + require.Equal(t, ts.Height(), minfo.Epoch) } parents := ts.Parents() @@ -175,12 +171,11 @@ func verifyIndex(t *testing.T, cs *mockChainStore, msgIndex MsgIndex) { func verifyMissing(t *testing.T, cs *mockChainStore, msgIndex MsgIndex, missing ...*types.TipSet) { for _, ts := range missing { - for _, blk := range ts.Blocks() { - msgs, _, _ := cs.MessagesForBlock(context.Background(), blk) - for _, m := range msgs { - _, err := msgIndex.GetMsgInfo(context.Background(), m.Cid()) - require.Equal(t, ErrNotFound, err) - } + msgs, err := cs.MessagesForTipset(context.Background(), ts) + require.NoError(t, err) + for _, m := range msgs { + _, err := msgIndex.GetMsgInfo(context.Background(), m.Cid()) + require.Equal(t, ErrNotFound, err) } } } @@ -188,9 +183,9 @@ func verifyMissing(t *testing.T, cs *mockChainStore, msgIndex MsgIndex, missing type mockChainStore struct { notify store.ReorgNotifee - curTs *types.TipSet - tipsets map[types.TipSetKey]*types.TipSet - blockMsgs map[cid.Cid][]*types.Message + curTs *types.TipSet + tipsets map[types.TipSetKey]*types.TipSet + msgs map[types.TipSetKey][]types.ChainMsg nonce uint64 } @@ -207,15 +202,15 @@ func init() { func newMockChainStore() *mockChainStore { return &mockChainStore{ - tipsets: make(map[types.TipSetKey]*types.TipSet), - blockMsgs: make(map[cid.Cid][]*types.Message), + tipsets: make(map[types.TipSetKey]*types.TipSet), + msgs: make(map[types.TipSetKey][]types.ChainMsg), } } func (cs *mockChainStore) genesis() { genBlock := mock.MkBlock(nil, 0, 0) - cs.blockMsgs[genBlock.Cid()] = nil genTs := mock.TipSet(genBlock) + cs.msgs[genTs.Key()] = nil cs.setHead(genTs) } @@ -252,11 +247,13 @@ func (cs *mockChainStore) makeBlk() *types.TipSet { blk := mock.MkBlock(cs.curTs, uint64(height), uint64(height)) blk.Messages = cs.makeGarbageCid() + + ts := mock.TipSet(blk) msg1 := cs.makeMsg() msg2 := cs.makeMsg() - cs.blockMsgs[blk.Cid()] = []*types.Message{msg1, msg2} + cs.msgs[ts.Key()] = []types.ChainMsg{msg1, msg2} - return mock.TipSet(blk) + return ts } func (cs *mockChainStore) makeMsg() *types.Message { @@ -274,13 +271,13 @@ func (cs *mockChainStore) SubscribeHeadChanges(f store.ReorgNotifee) { cs.notify = f } -func (cs *mockChainStore) MessagesForBlock(ctx context.Context, b *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { - msgs, ok := cs.blockMsgs[b.Cid()] +func (cs *mockChainStore) MessagesForTipset(ctx context.Context, ts *types.TipSet) ([]types.ChainMsg, error) { + msgs, ok := cs.msgs[ts.Key()] if !ok { - return nil, nil, errors.New("unknown block") + return nil, errors.New("unknown tipset") } - return msgs, nil, nil + return msgs, nil } func (cs *mockChainStore) GetHeaviestTipSet() *types.TipSet { From 4a20c9b60fb3c19ce21cf1b5eb11bbb2022296b6 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 05:54:32 +0200 Subject: [PATCH 073/129] cosmetics --- chain/index/msgindex.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index d2686133c..cb18eee3b 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -147,9 +147,8 @@ func NewMsgIndex(basePath string, cs ChainStore) (MsgIndex, error) { err = msgIndex.prepareStatements() if err != nil { - err2 := db.Close() - if err2 != nil { - log.Errorf("error closing msgindex database: %s", err2) + if err := db.Close(); err != nil { + log.Errorf("error closing msgindex database: %s", err) } return nil, xerrors.Errorf("error preparing msgindex database statements: %w", err) From 5461548b7e5b97c06f533354dd8f4ea78d139ffd Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 05:57:26 +0200 Subject: [PATCH 074/129] fix comment typo --- chain/index/msgindex.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index cb18eee3b..e3a731989 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -189,7 +189,7 @@ func reconcileIndex(db *sql.DB, cs ChainStore) error { // Invariant: after reconciliation, every tipset in the index is in the current chain; ie either // the chain head or reachable by walking the chain. // Algorithm: - // 1. Count mesages in index; if none, trivially reconciled. + // 1. Count messages in index; if none, trivially reconciled. // TODO we may consider populating the index in that case // 2. Find the minimum tipset in the index; this will mark the end of the reconciliation walk // 3. Walk from current tipset until we find a tipset in the index. From b90cfff0aad9bf73225e89c5447c8701b4f45449 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 10:42:48 +0200 Subject: [PATCH 075/129] wire in lifecycle context --- chain/index/msgindex.go | 4 ++-- chain/index/msgindex_test.go | 8 ++++---- node/modules/msgindex.go | 5 +++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index e3a731989..1c77612d7 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -94,7 +94,7 @@ type headChange struct { app []*types.TipSet } -func NewMsgIndex(basePath string, cs ChainStore) (MsgIndex, error) { +func NewMsgIndex(lctx context.Context, basePath string, cs ChainStore) (MsgIndex, error) { var ( dbPath string exists bool @@ -136,7 +136,7 @@ func NewMsgIndex(basePath string, cs ChainStore) (MsgIndex, error) { } } - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(lctx) msgIndex := &msgIndex{ db: db, diff --git a/chain/index/msgindex_test.go b/chain/index/msgindex_test.go index 43b262ce2..bcca8ce1f 100644 --- a/chain/index/msgindex_test.go +++ b/chain/index/msgindex_test.go @@ -30,7 +30,7 @@ func TestBasicMsgIndex(t *testing.T) { tmp := t.TempDir() t.Cleanup(func() { _ = os.RemoveAll(tmp) }) - msgIndex, err := NewMsgIndex(tmp, cs) + msgIndex, err := NewMsgIndex(context.Background(), tmp, cs) require.NoError(t, err) defer msgIndex.Close() //nolint @@ -58,7 +58,7 @@ func TestReorgMsgIndex(t *testing.T) { tmp := t.TempDir() t.Cleanup(func() { _ = os.RemoveAll(tmp) }) - msgIndex, err := NewMsgIndex(tmp, cs) + msgIndex, err := NewMsgIndex(context.Background(), tmp, cs) require.NoError(t, err) defer msgIndex.Close() //nolint @@ -102,7 +102,7 @@ func TestReconcileMsgIndex(t *testing.T) { tmp := t.TempDir() t.Cleanup(func() { _ = os.RemoveAll(tmp) }) - msgIndex, err := NewMsgIndex(tmp, cs) + msgIndex, err := NewMsgIndex(context.Background(), tmp, cs) require.NoError(t, err) for i := 0; i < 10; i++ { @@ -129,7 +129,7 @@ func TestReconcileMsgIndex(t *testing.T) { require.NoError(t, err) // reopen to reconcile - msgIndex, err = NewMsgIndex(tmp, cs) + msgIndex, err = NewMsgIndex(context.Background(), tmp, cs) require.NoError(t, err) defer msgIndex.Close() //nolint diff --git a/node/modules/msgindex.go b/node/modules/msgindex.go index 23072ade1..a758f22cf 100644 --- a/node/modules/msgindex.go +++ b/node/modules/msgindex.go @@ -7,16 +7,17 @@ import ( "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/node/modules/helpers" "github.com/filecoin-project/lotus/node/repo" ) -func MsgIndex(lc fx.Lifecycle, cs *store.ChainStore, r repo.LockedRepo) (index.MsgIndex, error) { +func MsgIndex(lc fx.Lifecycle, mctx helpers.MetricsCtx, cs *store.ChainStore, r repo.LockedRepo) (index.MsgIndex, error) { basePath, err := r.SqlitePath() if err != nil { return nil, err } - msgIndex, err := index.NewMsgIndex(basePath, cs) + msgIndex, err := index.NewMsgIndex(helpers.LifecycleCtx(mctx, lc), basePath, cs) if err != nil { return nil, err } From bda7ef52da2fcd91bb748a6877fdc8335c2e75a7 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 11:41:46 +0200 Subject: [PATCH 076/129] log rollback errors --- chain/index/msgindex.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index 1c77612d7..64dfcac67 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -332,14 +332,18 @@ func (x *msgIndex) processHeadChanges(ctx context.Context) error { for _, hc := range pend { for _, ts := range hc.rev { if err := x.doRevert(ctx, tx, ts); err != nil { - tx.Rollback() //nolint + if err := tx.Rollback(); err != nil { + log.Errorf("error rolling back transaction: %s", err) + } return xerrors.Errorf("error reverting %s: %w", ts, err) } } for _, ts := range hc.app { if err := x.doApply(ctx, tx, ts); err != nil { - tx.Rollback() //nolint + if err := tx.Rollback(); err != nil { + log.Errorf("error rolling back transaction: %s", err) + } return xerrors.Errorf("error applying %s: %w", ts, err) } } From a11032b10a0e428e37801539c26a23fdb0ebdaf1 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 11:44:10 +0200 Subject: [PATCH 077/129] adjust coalescer delays --- chain/index/msgindex.go | 6 +++--- chain/index/msgindex_test.go | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index 64dfcac67..4b484ca50 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -53,9 +53,9 @@ const ( // coalescer configuration (TODO: use observer instead) var ( - coalesceMinDelay = 100 * time.Millisecond - coalesceMaxDelay = time.Second - coalesceMergeInterval = 100 * time.Millisecond + coalesceMinDelay = time.Second + coalesceMaxDelay = 15 * time.Second + coalesceMergeInterval = time.Second ) // chain store interface; we could use store.ChainStore directly, diff --git a/chain/index/msgindex_test.go b/chain/index/msgindex_test.go index bcca8ce1f..07fdbdc8e 100644 --- a/chain/index/msgindex_test.go +++ b/chain/index/msgindex_test.go @@ -198,6 +198,12 @@ var rng *rand.Rand func init() { systemAddr, _ = address.NewIDAddress(0) rng = rand.New(rand.NewSource(314159)) + + // adjust those to make tests snappy + coalesceMinDelay = time.Millisecond + coalesceMaxDelay = 10 * time.Millisecond + coalesceMergeInterval = time.Millisecond + } func newMockChainStore() *mockChainStore { From 3c945e9e3ceba6c5d939cd468c3fa4e86c156383 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 12:00:48 +0200 Subject: [PATCH 078/129] no need to return error from DummyMsgIndex DI constructor --- node/modules/msgindex.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node/modules/msgindex.go b/node/modules/msgindex.go index a758f22cf..72e9840ba 100644 --- a/node/modules/msgindex.go +++ b/node/modules/msgindex.go @@ -31,6 +31,6 @@ func MsgIndex(lc fx.Lifecycle, mctx helpers.MetricsCtx, cs *store.ChainStore, r return msgIndex, nil } -func DummyMsgIndex() (index.MsgIndex, error) { - return index.DummyMsgIndex, nil +func DummyMsgIndex() index.MsgIndex { + return index.DummyMsgIndex } From db8b593c9bb751128893fa2809ea2c0720bbba64 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 12:01:04 +0200 Subject: [PATCH 079/129] make MsgIndex configurable, disabled by default. --- node/builder_chain.go | 5 ++++- node/config/types.go | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/node/builder_chain.go b/node/builder_chain.go index 20817acff..fcdb26162 100644 --- a/node/builder_chain.go +++ b/node/builder_chain.go @@ -80,7 +80,6 @@ var ChainNode = Options( Override(new(stmgr.Executor), consensus.NewTipSetExecutor(filcns.RewardFunc)), Override(new(consensus.Consensus), filcns.NewFilecoinExpectedConsensus), Override(new(*store.ChainStore), modules.ChainStore), - Override(new(index.MsgIndex), modules.MsgIndex), Override(new(*stmgr.StateManager), modules.StateManager), Override(new(dtypes.ChainBitswap), modules.ChainBitswap), Override(new(dtypes.ChainBlockService), modules.ChainBlockService), // todo: unused @@ -277,6 +276,10 @@ func ConfigFullNode(c interface{}) Option { Override(new(full.EthEventAPI), &full.EthModuleDummy{}), ), ), + + // enable message index for full node when configured by the user, otherwise use dummy. + If(cfg.Index.EnableMsgIndex, Override(new(index.MsgIndex), modules.MsgIndex)), + If(!cfg.Index.EnableMsgIndex, Override(new(index.MsgIndex), modules.DummyMsgIndex)), ) } diff --git a/node/config/types.go b/node/config/types.go index 5b952d35e..51ef327d4 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -28,6 +28,7 @@ type FullNode struct { Chainstore Chainstore Cluster UserRaftConfig Fevm FevmConfig + Index IndexConfig } // // Common @@ -726,3 +727,8 @@ type Events struct { // Set a timeout for subscription clients // Set upper bound on index size } + +type IndexConfig struct { + // EnableMsgIndex enables indexing of messages on chain. + EnableMsgIndex bool +} From 0a5618d4066f936e41ab7ab8d051e453a95d4ee8 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 12:10:36 +0200 Subject: [PATCH 080/129] make gen --- node/config/doc_gen.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index c62084708..bc7b8a270 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -461,6 +461,20 @@ Set to 0 to keep all mappings`, Comment: ``, }, + { + Name: "Index", + Type: "IndexConfig", + + Comment: ``, + }, + }, + "IndexConfig": []DocField{ + { + Name: "EnableMsgIndex", + Type: "bool", + + Comment: `EnableMsgIndex enables indexing of messages on chain.`, + }, }, "IndexProviderConfig": []DocField{ { From 5e011d536b0ff2af2cc2958b9643dc420876e118 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 12:14:30 +0200 Subject: [PATCH 081/129] enhance comment about lookup cid semantics --- chain/index/interface.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chain/index/interface.go b/chain/index/interface.go index ff46ecad7..8907dc09d 100644 --- a/chain/index/interface.go +++ b/chain/index/interface.go @@ -25,6 +25,8 @@ type MsgInfo struct { // MsgIndex is the interface to the message index type MsgIndex interface { // GetMsgInfo retrieves the message metadata through the index. + // The lookup is done using the onchain message Cid; that is the signed message Cid + // for SECP messages and unsigned message Cid for BLS messages. GetMsgInfo(ctx context.Context, m cid.Cid) (MsgInfo, error) // Close closes the index Close() error From 0bf6a333b919c100135c72f7a445267a2ee73010 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 12:24:35 +0200 Subject: [PATCH 082/129] more gen --- documentation/en/default-lotus-config.toml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/documentation/en/default-lotus-config.toml b/documentation/en/default-lotus-config.toml index c51321714..c1b40cd59 100644 --- a/documentation/en/default-lotus-config.toml +++ b/documentation/en/default-lotus-config.toml @@ -390,3 +390,11 @@ #DatabasePath = "" +[Index] + # EnableMsgIndex enables indexing of messages on chain. + # + # type: bool + # env var: LOTUS_INDEX_ENABLEMSGINDEX + #EnableMsgIndex = false + + From 05cb2428c15addceb96c56d379a20b376338920c Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 12:33:19 +0200 Subject: [PATCH 083/129] add confidence check for indexed message epoch --- chain/stmgr/searchwait.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/chain/stmgr/searchwait.go b/chain/stmgr/searchwait.go index 27a304611..ded55466a 100644 --- a/chain/stmgr/searchwait.go +++ b/chain/stmgr/searchwait.go @@ -179,6 +179,13 @@ func (sm *StateManager) searchForIndexedMsg(ctx context.Context, mcid cid.Cid, m return nil, nil, cid.Undef, err } + // check the height against the current tipset; minimum confidence requires that the inclusion + // tipset height is lower than the current head + curTs := sm.cs.GetHeaviestTipSet() + if curTs.Height() <= minfo.Epoch { + return nil, nil, cid.Undef, xerrors.Errorf("indexed message does not appear before the current tipset; index epoch: %d, current epoch: %d", minfo.Epoch, curTs.Height()) + } + ts, err := sm.cs.GetTipSetByCid(ctx, minfo.TipSet) if err != nil { return nil, nil, cid.Undef, err From 4b1a40500242f828570af419b60207ef1787a6e3 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 14:55:26 +0200 Subject: [PATCH 084/129] basic msgindex itest --- chain/index/msgindex.go | 28 ++++++++--- chain/index/msgindex_test.go | 15 +++--- itests/msgindex_test.go | 90 ++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 14 deletions(-) create mode 100644 itests/msgindex_test.go diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index 4b484ca50..0140b3e74 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -52,10 +52,11 @@ const ( ) // coalescer configuration (TODO: use observer instead) +// these are exposed to make tests snappy var ( - coalesceMinDelay = time.Second - coalesceMaxDelay = 15 * time.Second - coalesceMergeInterval = time.Second + CoalesceMinDelay = time.Second + CoalesceMaxDelay = 15 * time.Second + CoalesceMergeInterval = time.Second ) // chain store interface; we could use store.ChainStore directly, @@ -156,9 +157,9 @@ func NewMsgIndex(lctx context.Context, basePath string, cs ChainStore) (MsgIndex rnf := store.WrapHeadChangeCoalescer( msgIndex.onHeadChange, - coalesceMinDelay, - coalesceMaxDelay, - coalesceMergeInterval, + CoalesceMinDelay, + CoalesceMaxDelay, + CoalesceMergeInterval, ) cs.SubscribeHeadChanges(rnf) @@ -440,3 +441,18 @@ func (x *msgIndex) Close() error { return x.db.Close() } + +// informal apis for itests; not exposed in the main interface +func (x *msgIndex) CountMessages() (int64, error) { + x.closeLk.RLock() + defer x.closeLk.RUnlock() + + if x.closed { + return 0, ErrClosed + } + + var result int64 + row := x.db.QueryRow(dbqCountMessages) + err := row.Scan(&result) + return result, err +} diff --git a/chain/index/msgindex_test.go b/chain/index/msgindex_test.go index 07fdbdc8e..9861a5e7c 100644 --- a/chain/index/msgindex_test.go +++ b/chain/index/msgindex_test.go @@ -40,7 +40,7 @@ func TestBasicMsgIndex(t *testing.T) { err := cs.advance() require.NoError(t, err) // wait for the coalescer to notify - time.Sleep(coalesceMinDelay + 10*time.Millisecond) + time.Sleep(CoalesceMinDelay + 10*time.Millisecond) } t.Log("verifying index") @@ -68,7 +68,7 @@ func TestReorgMsgIndex(t *testing.T) { err := cs.advance() require.NoError(t, err) // wait for the coalescer to notify - time.Sleep(coalesceMinDelay + 10*time.Millisecond) + time.Sleep(CoalesceMinDelay + 10*time.Millisecond) } // a simple reorg @@ -80,7 +80,7 @@ func TestReorgMsgIndex(t *testing.T) { reorgmeChild := cs.makeBlk() err = cs.reorg([]*types.TipSet{reorgme}, []*types.TipSet{reorgmeChild}) require.NoError(t, err) - time.Sleep(coalesceMinDelay + 10*time.Millisecond) + time.Sleep(CoalesceMinDelay + 10*time.Millisecond) t.Log("verifying index") verifyIndex(t, cs, msgIndex) @@ -110,7 +110,7 @@ func TestReconcileMsgIndex(t *testing.T) { err := cs.advance() require.NoError(t, err) // wait for the coalescer to notify - time.Sleep(coalesceMinDelay + 10*time.Millisecond) + time.Sleep(CoalesceMinDelay + 10*time.Millisecond) } // Close it and reorg @@ -200,10 +200,9 @@ func init() { rng = rand.New(rand.NewSource(314159)) // adjust those to make tests snappy - coalesceMinDelay = time.Millisecond - coalesceMaxDelay = 10 * time.Millisecond - coalesceMergeInterval = time.Millisecond - + CoalesceMinDelay = time.Millisecond + CoalesceMaxDelay = 10 * time.Millisecond + CoalesceMergeInterval = time.Millisecond } func newMockChainStore() *mockChainStore { diff --git a/itests/msgindex_test.go b/itests/msgindex_test.go new file mode 100644 index 000000000..6b3834cd8 --- /dev/null +++ b/itests/msgindex_test.go @@ -0,0 +1,90 @@ +package itests + +import ( + "context" + "os" + "sync" + "testing" + "time" + + "github.com/filecoin-project/lotus/chain/index" + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/itests/kit" + "github.com/filecoin-project/lotus/node" + + "github.com/stretchr/testify/require" +) + +func init() { + // adjust those to make tests snappy + index.CoalesceMinDelay = time.Millisecond + index.CoalesceMaxDelay = 10 * time.Millisecond + index.CoalesceMergeInterval = time.Millisecond +} + +func testMsgIndex( + t *testing.T, + name string, + run func(t *testing.T, makeMsgIndex func(cs *store.ChainStore) (index.MsgIndex, error)), + check func(t *testing.T, i int, msgIndex index.MsgIndex), +) { + + // create the message indices in the test context + var mx sync.Mutex + var tmpDirs []string + var msgIndices []index.MsgIndex + + t.Cleanup(func() { + for _, msgIndex := range msgIndices { + _ = msgIndex.Close() + } + + for _, tmp := range tmpDirs { + _ = os.RemoveAll(tmp) + } + }) + + makeMsgIndex := func(cs *store.ChainStore) (index.MsgIndex, error) { + var err error + tmp := t.TempDir() + msgIndex, err := index.NewMsgIndex(context.Background(), tmp, cs) + if err == nil { + mx.Lock() + tmpDirs = append(tmpDirs, tmp) + msgIndices = append(msgIndices, msgIndex) + mx.Unlock() + } + return msgIndex, err + } + + t.Run(name, func(t *testing.T) { + run(t, makeMsgIndex) + }) + + if len(msgIndices) == 0 { + t.Fatal("no message indices") + } + + for i, msgIndex := range msgIndices { + check(t, i, msgIndex) + } +} + +func checkNonEmptyMsgIndex(t *testing.T, _ int, msgIndex index.MsgIndex) { + mi, ok := msgIndex.(interface{ CountMessages() (int64, error) }) + if !ok { + t.Fatal("index does not allow counting") + } + count, err := mi.CountMessages() + require.NoError(t, err) + require.NotEqual(t, count, 0) +} + +func TestMsgIndex(t *testing.T) { + testMsgIndex(t, "testSearchMsg", testSearchMsgWithIndex, checkNonEmptyMsgIndex) +} + +func testSearchMsgWithIndex(t *testing.T, makeMsgIndex func(cs *store.ChainStore) (index.MsgIndex, error)) { + suite := apiSuite{opts: []interface{}{kit.ConstructorOpts(node.Override(new(index.MsgIndex), makeMsgIndex))}} + suite.testSearchMsg(t) +} From 19707924456efa9921c6d813b7b836958d889e36 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 14:56:00 +0200 Subject: [PATCH 085/129] fix bug in searchForIndexedMsg Need to use and return the execution tipset --- chain/stmgr/searchwait.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/chain/stmgr/searchwait.go b/chain/stmgr/searchwait.go index ded55466a..754f0e7a4 100644 --- a/chain/stmgr/searchwait.go +++ b/chain/stmgr/searchwait.go @@ -179,20 +179,32 @@ func (sm *StateManager) searchForIndexedMsg(ctx context.Context, mcid cid.Cid, m return nil, nil, cid.Undef, err } - // check the height against the current tipset; minimum confidence requires that the inclusion - // tipset height is lower than the current head + // check the height against the current tipset; minimum execution confidence requires that the + // inclusion tipset height is lower than the current head + 1 curTs := sm.cs.GetHeaviestTipSet() - if curTs.Height() <= minfo.Epoch { + if curTs.Height() <= minfo.Epoch+1 { return nil, nil, cid.Undef, xerrors.Errorf("indexed message does not appear before the current tipset; index epoch: %d, current epoch: %d", minfo.Epoch, curTs.Height()) } - ts, err := sm.cs.GetTipSetByCid(ctx, minfo.TipSet) + // now get the execution tipset + xts, err := sm.cs.GetTipsetByHeight(ctx, minfo.Epoch+1, curTs, false) if err != nil { return nil, nil, cid.Undef, err } - r, foundMsg, err := sm.tipsetExecutedMessage(ctx, ts, mcid, m.VMMessage(), false) - return ts, r, foundMsg, err + // check that it is indeed the parent of the inclusion tipset + parent := xts.Parents() + parentCid, err := parent.Cid() + if err != nil { + return nil, nil, cid.Undef, xerrors.Errorf("error computing tipset cid: %w", err) + } + + if !parentCid.Equals(minfo.TipSet) { + return nil, nil, cid.Undef, xerrors.Errorf("inclusion tipset mismatch: have %s, expected %s", parentCid, minfo.TipSet) + } + + r, foundMsg, err := sm.tipsetExecutedMessage(ctx, xts, mcid, m.VMMessage(), false) + return xts, r, foundMsg, err } // searchBackForMsg searches up to limit tipsets backwards from the given From 5113c72b3a97c632aaef365a7d0975ab13482a76 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 15:09:11 +0200 Subject: [PATCH 086/129] make gen --- .circleci/config.yml | 6 ++++++ itests/msgindex_test.go | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 93019df5c..bea04cd86 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -818,6 +818,12 @@ workflows: - build suite: itest-mpool_push_with_uuid target: "./itests/mpool_push_with_uuid_test.go" + - test: + name: test-itest-msgindex + requires: + - build + suite: itest-msgindex + target: "./itests/msgindex_test.go" - test: name: test-itest-multisig requires: diff --git a/itests/msgindex_test.go b/itests/msgindex_test.go index 6b3834cd8..59fda75b9 100644 --- a/itests/msgindex_test.go +++ b/itests/msgindex_test.go @@ -7,12 +7,12 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/itests/kit" "github.com/filecoin-project/lotus/node" - - "github.com/stretchr/testify/require" ) func init() { From 47646cbd6966ee440da5ffe7933e73ec67853f39 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 15:19:07 +0200 Subject: [PATCH 087/129] add optimization TODO comment --- chain/stmgr/searchwait.go | 1 + 1 file changed, 1 insertion(+) diff --git a/chain/stmgr/searchwait.go b/chain/stmgr/searchwait.go index 754f0e7a4..e9feeec12 100644 --- a/chain/stmgr/searchwait.go +++ b/chain/stmgr/searchwait.go @@ -187,6 +187,7 @@ func (sm *StateManager) searchForIndexedMsg(ctx context.Context, mcid cid.Cid, m } // now get the execution tipset + // TODO optimization: the index should have it implicitly so we can return it in the msginfo. xts, err := sm.cs.GetTipsetByHeight(ctx, minfo.Epoch+1, curTs, false) if err != nil { return nil, nil, cid.Undef, err From 27dc4951eb0c6900017ca9b878b75ca1f29fcdb5 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 16:51:21 +0200 Subject: [PATCH 088/129] lotus-shed tools for msgindex --- cmd/lotus-shed/main.go | 1 + cmd/lotus-shed/msgindex.go | 205 +++++++++++++++++++++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 cmd/lotus-shed/msgindex.go diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index 19072dd71..736d874e3 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -83,6 +83,7 @@ func main() { invariantsCmd, gasTraceCmd, replayOfflineCmd, + msgindexCmd, } app := &cli.App{ diff --git a/cmd/lotus-shed/msgindex.go b/cmd/lotus-shed/msgindex.go new file mode 100644 index 000000000..c3f288422 --- /dev/null +++ b/cmd/lotus-shed/msgindex.go @@ -0,0 +1,205 @@ +package main + +import ( + "database/sql" + "fmt" + "path" + + _ "github.com/mattn/go-sqlite3" + "github.com/urfave/cli/v2" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-state-types/abi" + lcli "github.com/filecoin-project/lotus/cli" + "github.com/ipfs/go-cid" +) + +var msgindexCmd = &cli.Command{ + Name: "msgindex", + Usage: "Tools for managing the message index", + Subcommands: []*cli.Command{ + msgindexBackfillCmd, + msgindexPruneCmd, + }, +} + +var msgindexBackfillCmd = &cli.Command{ + Name: "backfill", + Usage: "Backfill the message index for a number of epochs starting from a specified height", + Flags: []cli.Flag{ + &cli.IntFlag{ + Name: "from", + Value: 0, + Usage: "height to start the backfill; uses the current head if omitted", + }, + &cli.IntFlag{ + Name: "epochs", + Value: 1800, + Usage: "number of epochs to backfill; defaults to 1800 (2 finalities)", + }, + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + Usage: "path to the repo", + }, + }, + Action: func(cctx *cli.Context) error { + api, closer, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return err + } + + defer closer() + ctx := lcli.ReqContext(cctx) + + curTs, err := api.ChainHead(ctx) + if err != nil { + return err + } + + startHeight := int64(cctx.Int("from")) + if startHeight == 0 { + startHeight = int64(curTs.Height()) - 1 + } + epochs := cctx.Int("epochs") + + dbPath := path.Join(cctx.String("repo"), "sqlite", "msgindex.db") + db, err := sql.Open("sqlite3", dbPath) + if err != nil { + return err + } + + defer func() { + err := db.Close() + if err != nil { + fmt.Printf("ERROR: closing db: %s", err) + } + }() + + tx, err := db.Begin() + if err != nil { + return err + } + + insertStmt, err := tx.Prepare("INSERT INTO messages VALUES (?, ?, ?)") + insertMsg := func(cid, tsCid cid.Cid, epoch abi.ChainEpoch) error { + key := cid.String() + tskey := tsCid.String() + if _, err := insertStmt.Exec(key, tskey, int64(epoch)); err != nil { + return err + } + + return nil + } + rollback := func() { + if err := tx.Rollback(); err != nil { + fmt.Printf("ERROR: rollback: %s", err) + } + } + + for i := 0; i < epochs; i++ { + epoch := abi.ChainEpoch(startHeight - int64(i)) + + ts, err := api.ChainGetTipSetByHeight(ctx, epoch, curTs.Key()) + if err != nil { + rollback() + return err + } + + tsCid, err := ts.Key().Cid() + if err != nil { + rollback() + return err + } + + msgs, err := api.ChainGetMessagesInTipset(ctx, ts.Key()) + if err != nil { + rollback() + return err + } + + for _, msg := range msgs { + if err := insertMsg(msg.Cid, tsCid, epoch); err != nil { + rollback() + return err + } + } + } + + if err := tx.Commit(); err != nil { + return err + } + + return nil + }, +} + +var msgindexPruneCmd = &cli.Command{ + Name: "prune", + Usage: "Prune the message index for messages included before a given epoch", + Flags: []cli.Flag{ + &cli.IntFlag{ + Name: "from", + Usage: "height to start the prune; if negative it indicates epochs from current head", + }, + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + Usage: "path to the repo", + }, + }, + Action: func(cctx *cli.Context) error { + api, closer, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return err + } + + defer closer() + ctx := lcli.ReqContext(cctx) + + startHeight := int64(cctx.Int("from")) + if startHeight < 0 { + curTs, err := api.ChainHead(ctx) + if err != nil { + return err + } + + startHeight += int64(curTs.Height()) + + if startHeight < 0 { + return xerrors.Errorf("bogus start height %d", startHeight) + } + } + + dbPath := path.Join(cctx.String("repo"), "sqlite", "msgindex.db") + db, err := sql.Open("sqlite3", dbPath) + if err != nil { + return err + } + + defer func() { + err := db.Close() + if err != nil { + fmt.Printf("ERROR: closing db: %s", err) + } + }() + + tx, err := db.Begin() + if err != nil { + return err + } + + if _, err := tx.Exec("DELETE FROM messages WHERE epoch < ?", int64(startHeight)); err != nil { + if err := tx.Rollback(); err != nil { + fmt.Printf("ERROR: rollback: %s", err) + } + return err + } + + if err := tx.Commit(); err != nil { + return err + } + + return nil + }, +} From cafa1eaba4b4bd620d233843186f57b2c2f13eb2 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 16:56:51 +0200 Subject: [PATCH 089/129] fix test for CI test files are run individually... --- itests/msgindex_test.go | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/itests/msgindex_test.go b/itests/msgindex_test.go index 59fda75b9..f450060c8 100644 --- a/itests/msgindex_test.go +++ b/itests/msgindex_test.go @@ -9,10 +9,15 @@ import ( "github.com/stretchr/testify/require" + lapi "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/itests/kit" "github.com/filecoin-project/lotus/node" + + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/exitcode" ) func init() { @@ -85,6 +90,35 @@ func TestMsgIndex(t *testing.T) { } func testSearchMsgWithIndex(t *testing.T, makeMsgIndex func(cs *store.ChainStore) (index.MsgIndex, error)) { - suite := apiSuite{opts: []interface{}{kit.ConstructorOpts(node.Override(new(index.MsgIndex), makeMsgIndex))}} - suite.testSearchMsg(t) + // copy of apiSuite.testSearchMsgWith; needs to be copied or else CI is angry, tests are built individually there + ctx := context.Background() + + full, _, ens := kit.EnsembleMinimal(t, kit.ConstructorOpts(node.Override(new(index.MsgIndex), makeMsgIndex))) + + senderAddr, err := full.WalletDefaultAddress(ctx) + require.NoError(t, err) + + msg := &types.Message{ + From: senderAddr, + To: senderAddr, + Value: big.Zero(), + } + + ens.BeginMining(100 * time.Millisecond) + + 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) + + require.Equalf(t, res.TipSet, searchRes.TipSet, "search ts: %s, different from wait ts: %s", searchRes.TipSet, res.TipSet) } From 06f93861bcf9b22a51a13ef63b310c4dd5282575 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 17:00:16 +0200 Subject: [PATCH 090/129] make gen --- cmd/lotus-shed/msgindex.go | 3 ++- itests/msgindex_test.go | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cmd/lotus-shed/msgindex.go b/cmd/lotus-shed/msgindex.go index c3f288422..f04b47599 100644 --- a/cmd/lotus-shed/msgindex.go +++ b/cmd/lotus-shed/msgindex.go @@ -5,13 +5,14 @@ import ( "fmt" "path" + "github.com/ipfs/go-cid" _ "github.com/mattn/go-sqlite3" "github.com/urfave/cli/v2" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" + lcli "github.com/filecoin-project/lotus/cli" - "github.com/ipfs/go-cid" ) var msgindexCmd = &cli.Command{ diff --git a/itests/msgindex_test.go b/itests/msgindex_test.go index f450060c8..cb5fd85c9 100644 --- a/itests/msgindex_test.go +++ b/itests/msgindex_test.go @@ -9,15 +9,15 @@ import ( "github.com/stretchr/testify/require" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/exitcode" + lapi "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/index" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/itests/kit" "github.com/filecoin-project/lotus/node" - - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/exitcode" ) func init() { From 6deec4c5f4283de13ed94083b1de99be762b87f8 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 17:26:20 +0200 Subject: [PATCH 091/129] lint --- cmd/lotus-shed/msgindex.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-shed/msgindex.go b/cmd/lotus-shed/msgindex.go index f04b47599..d2cb2cf3d 100644 --- a/cmd/lotus-shed/msgindex.go +++ b/cmd/lotus-shed/msgindex.go @@ -83,6 +83,10 @@ var msgindexBackfillCmd = &cli.Command{ } insertStmt, err := tx.Prepare("INSERT INTO messages VALUES (?, ?, ?)") + if err != nil { + return err + } + insertMsg := func(cid, tsCid cid.Cid, epoch abi.ChainEpoch) error { key := cid.String() tskey := tsCid.String() @@ -190,7 +194,7 @@ var msgindexPruneCmd = &cli.Command{ return err } - if _, err := tx.Exec("DELETE FROM messages WHERE epoch < ?", int64(startHeight)); err != nil { + if _, err := tx.Exec("DELETE FROM messages WHERE epoch < ?", startHeight); err != nil { if err := tx.Rollback(); err != nil { fmt.Printf("ERROR: rollback: %s", err) } From 5ade40cbacd88d74574b6bf4551d65a367266cb3 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Mar 2023 17:27:12 +0200 Subject: [PATCH 092/129] increase coalesce delays for test to deflake on CI --- chain/index/msgindex_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chain/index/msgindex_test.go b/chain/index/msgindex_test.go index 9861a5e7c..24f9b845f 100644 --- a/chain/index/msgindex_test.go +++ b/chain/index/msgindex_test.go @@ -200,9 +200,9 @@ func init() { rng = rand.New(rand.NewSource(314159)) // adjust those to make tests snappy - CoalesceMinDelay = time.Millisecond - CoalesceMaxDelay = 10 * time.Millisecond - CoalesceMergeInterval = time.Millisecond + CoalesceMinDelay = 100 * time.Millisecond + CoalesceMaxDelay = time.Second + CoalesceMergeInterval = 100 * time.Millisecond } func newMockChainStore() *mockChainStore { From b852f5e2fd9e690622023b9288a4327805f7964c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Mar 2023 11:14:38 -0700 Subject: [PATCH 093/129] fix: itest: avoid failing the test when we race the miner I've been seeing quite a few tests failing here, so I'm hoping this will deflake them a bit. --- itests/kit/blockminer.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go index 9dd83ee47..4cd0cc671 100644 --- a/itests/kit/blockminer.go +++ b/itests/kit/blockminer.go @@ -192,12 +192,15 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur reportSuccessFn := func(success bool, epoch abi.ChainEpoch, err error) { // if api shuts down before mining, we may get an error which we should probably just ignore // (fixing it will require rewriting most of the mining loop) - if err != nil && !strings.Contains(err.Error(), "websocket connection closed") && !api.ErrorIsIn(err, []error{new(jsonrpc.RPCConnectionError)}) { + if err != nil && ctx.Err() == nil && !strings.Contains(err.Error(), "websocket connection closed") && !api.ErrorIsIn(err, []error{new(jsonrpc.RPCConnectionError)}) { require.NoError(bm.t, err) } target = epoch - wait <- success + select { + case wait <- success: + case <-ctx.Done(): + } } var success bool From 73a2b4152bd74453798f769ccde1fe13ab15a648 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Mar 2023 11:44:59 -0700 Subject: [PATCH 094/129] feat: eth: Avoid StateCompute in EthTxnReceipt lookup (#10460) Instead: 1. Use the receipt from the message search. 2. Re-compute the gas fees that would have been charged. fixes #10418 Co-authored-by: raulk --- node/impl/full/eth.go | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 969213282..b4a5c75d6 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -39,6 +39,7 @@ import ( "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" + "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/node/modules/dtypes" ) @@ -427,20 +428,15 @@ func (a *EthModule) EthGetTransactionReceipt(ctx context.Context, txHash ethtype return nil, nil } - replay, err := a.StateAPI.StateReplay(ctx, types.EmptyTSK, c) - if err != nil { - return nil, nil - } - var events []types.Event - if rct := replay.MsgRct; rct != nil && rct.EventsRoot != nil { + if rct := msgLookup.Receipt; rct.EventsRoot != nil { events, err = a.ChainAPI.ChainGetEvents(ctx, *rct.EventsRoot) if err != nil { return nil, nil } } - receipt, err := newEthTxReceipt(ctx, tx, replay, events, a.StateAPI) + receipt, err := newEthTxReceipt(ctx, tx, msgLookup, events, a.Chain, a.StateAPI) if err != nil { return nil, nil } @@ -2046,7 +2042,7 @@ func newEthTxFromMessageLookup(ctx context.Context, msgLookup *api.MsgLookup, tx return tx, nil } -func newEthTxReceipt(ctx context.Context, tx ethtypes.EthTx, replay *api.InvocResult, events []types.Event, sa StateAPI) (api.EthTxReceipt, error) { +func newEthTxReceipt(ctx context.Context, tx ethtypes.EthTx, lookup *api.MsgLookup, events []types.Event, cs *store.ChainStore, sa StateAPI) (api.EthTxReceipt, error) { var ( transactionIndex ethtypes.EthUint64 blockHash ethtypes.EthHash @@ -2075,25 +2071,34 @@ func newEthTxReceipt(ctx context.Context, tx ethtypes.EthTx, replay *api.InvocRe LogsBloom: ethtypes.EmptyEthBloom[:], } - if replay.MsgRct.ExitCode.IsSuccess() { + if lookup.Receipt.ExitCode.IsSuccess() { receipt.Status = 1 - } - if replay.MsgRct.ExitCode.IsError() { + } else { receipt.Status = 0 } - receipt.GasUsed = ethtypes.EthUint64(replay.MsgRct.GasUsed) + receipt.GasUsed = ethtypes.EthUint64(lookup.Receipt.GasUsed) // TODO: handle CumulativeGasUsed receipt.CumulativeGasUsed = ethtypes.EmptyEthInt - effectiveGasPrice := big.Div(replay.GasCost.TotalCost, big.NewInt(replay.MsgRct.GasUsed)) + // TODO: avoid loading the tipset twice (once here, once when we convert the message to a txn) + ts, err := cs.GetTipSetFromKey(ctx, lookup.TipSet) + if err != nil { + return api.EthTxReceipt{}, xerrors.Errorf("failed to lookup tipset %s when constructing the eth txn receipt: %w", lookup.TipSet, err) + } + + baseFee := ts.Blocks()[0].ParentBaseFee + gasOutputs := vm.ComputeGasOutputs(lookup.Receipt.GasUsed, int64(tx.Gas), baseFee, big.Int(tx.MaxFeePerGas), big.Int(tx.MaxPriorityFeePerGas), true) + totalSpent := big.Sum(gasOutputs.BaseFeeBurn, gasOutputs.MinerTip, gasOutputs.OverEstimationBurn) + + effectiveGasPrice := big.Div(totalSpent, big.NewInt(lookup.Receipt.GasUsed)) receipt.EffectiveGasPrice = ethtypes.EthBigInt(effectiveGasPrice) - if receipt.To == nil && replay.MsgRct.ExitCode.IsSuccess() { + if receipt.To == nil && lookup.Receipt.ExitCode.IsSuccess() { // Create and Create2 return the same things. var ret eam.CreateExternalReturn - if err := ret.UnmarshalCBOR(bytes.NewReader(replay.MsgRct.Return)); err != nil { + if err := ret.UnmarshalCBOR(bytes.NewReader(lookup.Receipt.Return)); err != nil { return api.EthTxReceipt{}, xerrors.Errorf("failed to parse contract creation result: %w", err) } addr := ethtypes.EthAddress(ret.EthAddress) From dcb49dc8ee41ea0afbc623161e7405a403ef601f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Mar 2023 15:29:09 -0700 Subject: [PATCH 095/129] refactor: update cache to the new generic version (#10463) - Adds type safety. - Reduces allocations. - Fixes the drand cache (was storing by value, but retrieving by pointer) --- chain/badtscache.go | 13 +++------- chain/beacon/drand/drand.go | 16 +++++------- chain/block_receipt_tracker.go | 12 ++++----- chain/events/message_cache.go | 18 +++++++------- chain/messagepool/messagepool.go | 23 +++++++---------- chain/store/messages.go | 6 ++--- chain/store/store.go | 15 ++++++----- chain/sub/incoming.go | 37 ++++++++++++---------------- cmd/lotus-shed/state-stats.go | 8 +++--- go.mod | 3 ++- go.sum | 5 +++- miner/miner.go | 11 ++++----- miner/testminer.go | 4 +-- node/impl/full/gas.go | 8 +++--- storage/paths/localstorage_cached.go | 16 ++++++------ tools/stats/ipldstore/ipldstore.go | 8 +++--- tools/stats/points/collect.go | 8 +++--- 17 files changed, 95 insertions(+), 116 deletions(-) diff --git a/chain/badtscache.go b/chain/badtscache.go index 19b79bb9b..0f215dcdc 100644 --- a/chain/badtscache.go +++ b/chain/badtscache.go @@ -3,14 +3,14 @@ package chain import ( "fmt" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/build" ) type BadBlockCache struct { - badBlocks *lru.ARCCache + badBlocks *lru.ARCCache[cid.Cid, BadBlockReason] } type BadBlockReason struct { @@ -43,7 +43,7 @@ func (bbr BadBlockReason) String() string { } func NewBadBlockCache() *BadBlockCache { - cache, err := lru.NewARC(build.BadBlockCacheSize) + cache, err := lru.NewARC[cid.Cid, BadBlockReason](build.BadBlockCacheSize) if err != nil { panic(err) // ok } @@ -66,10 +66,5 @@ func (bts *BadBlockCache) Purge() { } func (bts *BadBlockCache) Has(c cid.Cid) (BadBlockReason, bool) { - rval, ok := bts.badBlocks.Get(c) - if !ok { - return BadBlockReason{}, false - } - - return rval.(BadBlockReason), true + return bts.badBlocks.Get(c) } diff --git a/chain/beacon/drand/drand.go b/chain/beacon/drand/drand.go index 181fa3046..46a2dc6ec 100644 --- a/chain/beacon/drand/drand.go +++ b/chain/beacon/drand/drand.go @@ -12,7 +12,7 @@ import ( gclient "github.com/drand/drand/lp2p/client" "github.com/drand/kyber" kzap "github.com/go-kit/kit/log/zap" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" logging "github.com/ipfs/go-log/v2" pubsub "github.com/libp2p/go-libp2p-pubsub" "go.uber.org/zap/zapcore" @@ -61,7 +61,7 @@ type DrandBeacon struct { filGenTime uint64 filRoundTime uint64 - localCache *lru.Cache + localCache *lru.Cache[uint64, *types.BeaconEntry] } // DrandHTTPClient interface overrides the user agent used by drand @@ -110,7 +110,7 @@ func NewDrandBeacon(genesisTs, interval uint64, ps *pubsub.PubSub, config dtypes return nil, xerrors.Errorf("creating drand client: %w", err) } - lc, err := lru.New(1024) + lc, err := lru.New[uint64, *types.BeaconEntry](1024) if err != nil { return nil, err } @@ -160,16 +160,12 @@ func (db *DrandBeacon) Entry(ctx context.Context, round uint64) <-chan beacon.Re return out } func (db *DrandBeacon) cacheValue(e types.BeaconEntry) { - db.localCache.Add(e.Round, e) + db.localCache.Add(e.Round, &e) } func (db *DrandBeacon) getCachedValue(round uint64) *types.BeaconEntry { - v, ok := db.localCache.Get(round) - if !ok { - return nil - } - e, _ := v.(types.BeaconEntry) - return &e + v, _ := db.localCache.Get(round) + return v } func (db *DrandBeacon) VerifyEntry(curr types.BeaconEntry, prev types.BeaconEntry) error { diff --git a/chain/block_receipt_tracker.go b/chain/block_receipt_tracker.go index 58de71e19..9c1e035a2 100644 --- a/chain/block_receipt_tracker.go +++ b/chain/block_receipt_tracker.go @@ -5,7 +5,7 @@ import ( "sync" "time" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/lotus/build" @@ -17,7 +17,7 @@ type blockReceiptTracker struct { // using an LRU cache because i don't want to handle all the edge cases for // manual cleanup and maintenance of a fixed size set - cache *lru.Cache + cache *lru.Cache[types.TipSetKey, *peerSet] } type peerSet struct { @@ -25,7 +25,7 @@ type peerSet struct { } func newBlockReceiptTracker() *blockReceiptTracker { - c, _ := lru.New(512) + c, _ := lru.New[types.TipSetKey, *peerSet](512) return &blockReceiptTracker{ cache: c, } @@ -46,20 +46,18 @@ func (brt *blockReceiptTracker) Add(p peer.ID, ts *types.TipSet) { return } - val.(*peerSet).peers[p] = build.Clock.Now() + val.peers[p] = build.Clock.Now() } func (brt *blockReceiptTracker) GetPeers(ts *types.TipSet) []peer.ID { brt.lk.Lock() defer brt.lk.Unlock() - val, ok := brt.cache.Get(ts.Key()) + ps, ok := brt.cache.Get(ts.Key()) if !ok { return nil } - ps := val.(*peerSet) - out := make([]peer.ID, 0, len(ps.peers)) for p := range ps.peers { out = append(out, p) diff --git a/chain/events/message_cache.go b/chain/events/message_cache.go index 81b79cb38..d47d3a168 100644 --- a/chain/events/message_cache.go +++ b/chain/events/message_cache.go @@ -4,7 +4,7 @@ import ( "context" "sync" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/api" @@ -14,14 +14,14 @@ type messageCache struct { api EventAPI blockMsgLk sync.Mutex - blockMsgCache *lru.ARCCache + blockMsgCache *lru.ARCCache[cid.Cid, *api.BlockMessages] } -func newMessageCache(api EventAPI) *messageCache { - blsMsgCache, _ := lru.NewARC(500) +func newMessageCache(a EventAPI) *messageCache { + blsMsgCache, _ := lru.NewARC[cid.Cid, *api.BlockMessages](500) return &messageCache{ - api: api, + api: a, blockMsgCache: blsMsgCache, } } @@ -30,14 +30,14 @@ func (c *messageCache) ChainGetBlockMessages(ctx context.Context, blkCid cid.Cid c.blockMsgLk.Lock() defer c.blockMsgLk.Unlock() - msgsI, ok := c.blockMsgCache.Get(blkCid) + msgs, ok := c.blockMsgCache.Get(blkCid) var err error if !ok { - msgsI, err = c.api.ChainGetBlockMessages(ctx, blkCid) + msgs, err = c.api.ChainGetBlockMessages(ctx, blkCid) if err != nil { return nil, err } - c.blockMsgCache.Add(blkCid, msgsI) + c.blockMsgCache.Add(blkCid, msgs) } - return msgsI.(*api.BlockMessages), nil + return msgs, nil } diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index c9704403e..0d787bd50 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -12,7 +12,7 @@ import ( "time" "github.com/hashicorp/go-multierror" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" @@ -159,7 +159,7 @@ type MessagePool struct { // pruneCooldown is a channel used to allow a cooldown time between prunes pruneCooldown chan struct{} - blsSigCache *lru.TwoQueueCache + blsSigCache *lru.TwoQueueCache[cid.Cid, crypto.Signature] changes *lps.PubSub @@ -167,9 +167,9 @@ type MessagePool struct { netName dtypes.NetworkName - sigValCache *lru.TwoQueueCache + sigValCache *lru.TwoQueueCache[string, struct{}] - nonceCache *lru.Cache + nonceCache *lru.Cache[nonceCacheKey, uint64] evtTypes [3]journal.EventType journal journal.Journal @@ -369,9 +369,9 @@ 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) + cache, _ := lru.New2Q[cid.Cid, crypto.Signature](build.BlsSignatureCacheSize) + verifcache, _ := lru.New2Q[string, struct{}](build.VerifSigCacheSize) + noncecache, _ := lru.New[nonceCacheKey, uint64](256) cfg, err := loadConfig(ctx, ds) if err != nil { @@ -1053,7 +1053,7 @@ func (mp *MessagePool) getStateNonce(ctx context.Context, addr address.Address, n, ok := mp.nonceCache.Get(nk) if ok { - return n.(uint64), nil + return n, nil } act, err := mp.api.GetActorAfter(addr, ts) @@ -1473,15 +1473,10 @@ func (mp *MessagePool) MessagesForBlocks(ctx context.Context, blks []*types.Bloc } func (mp *MessagePool) RecoverSig(msg *types.Message) *types.SignedMessage { - val, ok := mp.blsSigCache.Get(msg.Cid()) + sig, ok := mp.blsSigCache.Get(msg.Cid()) if !ok { return nil } - sig, ok := val.(crypto.Signature) - if !ok { - log.Errorf("value in signature cache was not a signature (got %T)", val) - return nil - } return &types.SignedMessage{ Message: *msg, diff --git a/chain/store/messages.go b/chain/store/messages.go index 33d0c579a..c39cb3f9b 100644 --- a/chain/store/messages.go +++ b/chain/store/messages.go @@ -207,9 +207,7 @@ type mmCids struct { } 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) + if mmcids, ok := cs.mmCache.Get(mmc); ok { return mmcids.bls, mmcids.secpk, nil } @@ -229,7 +227,7 @@ func (cs *ChainStore) ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.C return nil, nil, xerrors.Errorf("loading secpk message cids for block: %w", err) } - cs.mmCache.Add(mmc, &mmCids{ + cs.mmCache.Add(mmc, mmCids{ bls: blscids, secpk: secpkcids, }) diff --git a/chain/store/store.go b/chain/store/store.go index 754e3a123..d7188a7bf 100644 --- a/chain/store/store.go +++ b/chain/store/store.go @@ -11,7 +11,7 @@ import ( "sync" "time" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" "github.com/ipfs/go-cid" dstore "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/query" @@ -120,8 +120,8 @@ type ChainStore struct { reorgCh chan<- reorg reorgNotifeeCh chan ReorgNotifee - mmCache *lru.ARCCache // msg meta cache (mh.Messages -> secp, bls []cid) - tsCache *lru.ARCCache + mmCache *lru.ARCCache[cid.Cid, mmCids] + tsCache *lru.ARCCache[types.TipSetKey, *types.TipSet] evtTypes [1]journal.EventType journal journal.Journal @@ -133,8 +133,8 @@ type ChainStore struct { } func NewChainStore(chainBs bstore.Blockstore, stateBs bstore.Blockstore, ds dstore.Batching, weight WeightFunc, j journal.Journal) *ChainStore { - c, _ := lru.NewARC(DefaultMsgMetaCacheSize) - tsc, _ := lru.NewARC(DefaultTipSetCacheSize) + c, _ := lru.NewARC[cid.Cid, mmCids](DefaultMsgMetaCacheSize) + tsc, _ := lru.NewARC[types.TipSetKey, *types.TipSet](DefaultTipSetCacheSize) if j == nil { j = journal.NilJournal() } @@ -818,9 +818,8 @@ func (cs *ChainStore) GetBlock(ctx context.Context, c cid.Cid) (*types.BlockHead } 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 + if ts, ok := cs.tsCache.Get(tsk); ok { + return ts, nil } // Fetch tipset block headers from blockstore in parallel diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index cbda39d8c..55ef7c511 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -7,7 +7,7 @@ import ( "sync" "time" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" bserv "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" blocks "github.com/ipfs/go-libipfs/blocks" @@ -217,7 +217,7 @@ func fetchCids( type BlockValidator struct { self peer.ID - peers *lru.TwoQueueCache + peers *lru.TwoQueueCache[peer.ID, int] killThresh int @@ -231,7 +231,7 @@ type BlockValidator struct { } func NewBlockValidator(self peer.ID, chain *store.ChainStore, cns consensus.Consensus, blacklist func(peer.ID)) *BlockValidator { - p, _ := lru.New2Q(4096) + p, _ := lru.New2Q[peer.ID, int](4096) return &BlockValidator{ self: self, peers: p, @@ -244,21 +244,19 @@ func NewBlockValidator(self peer.ID, chain *store.ChainStore, cns consensus.Cons } func (bv *BlockValidator) flagPeer(p peer.ID) { - v, ok := bv.peers.Get(p) + val, ok := bv.peers.Get(p) if !ok { - bv.peers.Add(p, int(1)) + bv.peers.Add(p, 1) return } - val := v.(int) - if val >= bv.killThresh { log.Warnf("blacklisting peer %s", p) bv.blacklist(p) return } - bv.peers.Add(p, v.(int)+1) + bv.peers.Add(p, val+1) } func (bv *BlockValidator) Validate(ctx context.Context, pid peer.ID, msg *pubsub.Message) (res pubsub.ValidationResult) { @@ -293,11 +291,11 @@ func (bv *BlockValidator) Validate(ctx context.Context, pid peer.ID, msg *pubsub } type blockReceiptCache struct { - blocks *lru.TwoQueueCache + blocks *lru.TwoQueueCache[cid.Cid, int] } func newBlockReceiptCache() *blockReceiptCache { - c, _ := lru.New2Q(8192) + c, _ := lru.New2Q[cid.Cid, int](8192) return &blockReceiptCache{ blocks: c, @@ -307,12 +305,12 @@ func newBlockReceiptCache() *blockReceiptCache { func (brc *blockReceiptCache) add(bcid cid.Cid) int { val, ok := brc.blocks.Get(bcid) if !ok { - brc.blocks.Add(bcid, int(1)) + brc.blocks.Add(bcid, 1) return 0 } - brc.blocks.Add(bcid, val.(int)+1) - return val.(int) + brc.blocks.Add(bcid, val+1) + return val } type MessageValidator struct { @@ -466,13 +464,13 @@ type peerMsgInfo struct { type IndexerMessageValidator struct { self peer.ID - peerCache *lru.TwoQueueCache + peerCache *lru.TwoQueueCache[address.Address, *peerMsgInfo] chainApi full.ChainModuleAPI stateApi full.StateModuleAPI } func NewIndexerMessageValidator(self peer.ID, chainApi full.ChainModuleAPI, stateApi full.StateModuleAPI) *IndexerMessageValidator { - peerCache, _ := lru.New2Q(8192) + peerCache, _ := lru.New2Q[address.Address, *peerMsgInfo](8192) return &IndexerMessageValidator{ self: self, @@ -515,15 +513,12 @@ func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg return pubsub.ValidationReject } - minerID := minerAddr.String() msgCid := idxrMsg.Cid var msgInfo *peerMsgInfo - val, ok := v.peerCache.Get(minerID) + msgInfo, ok := v.peerCache.Get(minerAddr) if !ok { msgInfo = &peerMsgInfo{} - } else { - msgInfo = val.(*peerMsgInfo) } // Lock this peer's message info. @@ -544,7 +539,7 @@ func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg // Check that the miner ID maps to the peer that sent the message. err = v.authenticateMessage(ctx, minerAddr, originPeer) if err != nil { - log.Warnw("cannot authenticate messsage", "err", err, "peer", originPeer, "minerID", minerID) + log.Warnw("cannot authenticate messsage", "err", err, "peer", originPeer, "minerID", minerAddr) stats.Record(ctx, metrics.IndexerMessageValidationFailure.M(1)) return pubsub.ValidationReject } @@ -554,7 +549,7 @@ func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg // messages from the same peer are handled concurrently, there is a // small chance that one msgInfo could replace the other here when // the info is first cached. This is OK, so no need to prevent it. - v.peerCache.Add(minerID, msgInfo) + v.peerCache.Add(minerAddr, msgInfo) } } diff --git a/cmd/lotus-shed/state-stats.go b/cmd/lotus-shed/state-stats.go index 521e32c79..28fa79778 100644 --- a/cmd/lotus-shed/state-stats.go +++ b/cmd/lotus-shed/state-stats.go @@ -9,7 +9,7 @@ import ( "sync" "github.com/docker/go-units" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" offline "github.com/ipfs/go-ipfs-exchange-offline" @@ -50,13 +50,13 @@ type fieldItem struct { type cacheNodeGetter struct { ds format.NodeGetter - cache *lru.TwoQueueCache + cache *lru.TwoQueueCache[cid.Cid, format.Node] } func newCacheNodeGetter(d format.NodeGetter, size int) (*cacheNodeGetter, error) { cng := &cacheNodeGetter{ds: d} - cache, err := lru.New2Q(size) + cache, err := lru.New2Q[cid.Cid, format.Node](size) if err != nil { return nil, err } @@ -68,7 +68,7 @@ func newCacheNodeGetter(d format.NodeGetter, size int) (*cacheNodeGetter, error) func (cng *cacheNodeGetter) Get(ctx context.Context, c cid.Cid) (format.Node, error) { if n, ok := cng.cache.Get(c); ok { - return n.(format.Node), nil + return n, nil } n, err := cng.ds.Get(ctx, c) diff --git a/go.mod b/go.mod index ac5d5ccdd..045173fa1 100644 --- a/go.mod +++ b/go.mod @@ -70,7 +70,7 @@ require ( github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e github.com/hashicorp/go-multierror v1.1.1 - github.com/hashicorp/golang-lru v0.5.4 + github.com/hashicorp/golang-lru/v2 v2.0.2 github.com/hashicorp/raft v1.1.1 github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 @@ -230,6 +230,7 @@ require ( github.com/hashicorp/go-hclog v0.16.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect + github.com/hashicorp/golang-lru v0.6.0 // indirect github.com/huin/goupnp v1.0.3 // indirect github.com/iancoleman/orderedmap v0.1.0 // indirect github.com/ipfs/go-bitfield v1.0.0 // indirect diff --git a/go.sum b/go.sum index 474b45ab5..4c7abce57 100644 --- a/go.sum +++ b/go.sum @@ -640,8 +640,11 @@ github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= +github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5twqnfBdU= +github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= diff --git a/miner/miner.go b/miner/miner.go index f954352ae..0d3e12de8 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -10,7 +10,7 @@ import ( "sync" "time" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" logging "github.com/ipfs/go-log/v2" "go.opencensus.io/trace" "golang.org/x/xerrors" @@ -61,7 +61,7 @@ func randTimeOffset(width time.Duration) time.Duration { // NewMiner instantiates a miner with a concrete WinningPoStProver and a miner // address (which can be different from the worker's address). func NewMiner(api v1api.FullNode, epp gen.WinningPoStProver, addr address.Address, sf *slashfilter.SlashFilter, j journal.Journal) *Miner { - arc, err := lru.NewARC(10000) + arc, err := lru.NewARC[abi.ChainEpoch, bool](10000) if err != nil { panic(err) } @@ -122,7 +122,7 @@ type Miner struct { // minedBlockHeights is a safeguard that caches the last heights we mined. // It is consulted before publishing a newly mined block, for a sanity check // intended to avoid slashings in case of a bug. - minedBlockHeights *lru.ARCCache + minedBlockHeights *lru.ARCCache[abi.ChainEpoch, bool] evtTypes [1]journal.EventType journal journal.Journal @@ -331,13 +331,12 @@ minerLoop: } } - blkKey := fmt.Sprintf("%d", b.Header.Height) - if _, ok := m.minedBlockHeights.Get(blkKey); ok { + if _, ok := m.minedBlockHeights.Get(b.Header.Height); ok { log.Warnw("Created a block at the same height as another block we've created", "height", b.Header.Height, "miner", b.Header.Miner, "parents", b.Header.Parents) continue } - m.minedBlockHeights.Add(blkKey, true) + m.minedBlockHeights.Add(b.Header.Height, true) if err := m.api.SyncSubmitBlock(ctx, b); err != nil { log.Errorf("failed to submit newly mined block: %+v", err) diff --git a/miner/testminer.go b/miner/testminer.go index 7f29a7ae0..deda89f42 100644 --- a/miner/testminer.go +++ b/miner/testminer.go @@ -3,7 +3,7 @@ package miner import ( "context" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" ds "github.com/ipfs/go-datastore" "github.com/filecoin-project/go-address" @@ -22,7 +22,7 @@ type MineReq struct { func NewTestMiner(nextCh <-chan MineReq, addr address.Address) func(v1api.FullNode, gen.WinningPoStProver) *Miner { return func(api v1api.FullNode, epp gen.WinningPoStProver) *Miner { - arc, err := lru.NewARC(10000) + arc, err := lru.NewARC[abi.ChainEpoch, bool](10000) if err != nil { panic(err) } diff --git a/node/impl/full/gas.go b/node/impl/full/gas.go index cd3cb0156..24e1b3fbc 100644 --- a/node/impl/full/gas.go +++ b/node/impl/full/gas.go @@ -6,7 +6,7 @@ import ( "math/rand" "sort" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" "go.uber.org/fx" "golang.org/x/xerrors" @@ -61,7 +61,7 @@ type GasAPI struct { func NewGasPriceCache() *GasPriceCache { // 50 because we usually won't access more than 40 - c, err := lru.New2Q(50) + c, err := lru.New2Q[types.TipSetKey, []GasMeta](50) if err != nil { // err only if parameter is bad panic(err) @@ -73,7 +73,7 @@ func NewGasPriceCache() *GasPriceCache { } type GasPriceCache struct { - c *lru.TwoQueueCache + c *lru.TwoQueueCache[types.TipSetKey, []GasMeta] } type GasMeta struct { @@ -84,7 +84,7 @@ type GasMeta struct { 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 + return i, nil } var prices []GasMeta diff --git a/storage/paths/localstorage_cached.go b/storage/paths/localstorage_cached.go index cac0a44b6..af43d1696 100644 --- a/storage/paths/localstorage_cached.go +++ b/storage/paths/localstorage_cached.go @@ -4,7 +4,7 @@ import ( "sync" "time" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/storiface" @@ -17,13 +17,13 @@ type cachedLocalStorage struct { base LocalStorage statLk sync.Mutex - stats *lru.Cache // path -> statEntry - pathDUs *lru.Cache // path -> *diskUsageEntry + stats *lru.Cache[string, statEntry] + pathDUs *lru.Cache[string, *diskUsageEntry] } func newCachedLocalStorage(ls LocalStorage) *cachedLocalStorage { - statCache, _ := lru.New(1024) - duCache, _ := lru.New(1024) + statCache, _ := lru.New[string, statEntry](1024) + duCache, _ := lru.New[string, *diskUsageEntry](1024) return &cachedLocalStorage{ base: ls, @@ -60,8 +60,8 @@ func (c *cachedLocalStorage) Stat(path string) (fsutil.FsStat, error) { c.statLk.Lock() defer c.statLk.Unlock() - if v, ok := c.stats.Get(path); ok && time.Now().Sub(v.(statEntry).time) < StatTimeout { - return v.(statEntry).stat, nil + if v, ok := c.stats.Get(path); ok && time.Now().Sub(v.time) < StatTimeout { + return v.stat, nil } // if we don't, get the stat @@ -83,7 +83,7 @@ func (c *cachedLocalStorage) DiskUsage(path string) (int64, error) { var entry *diskUsageEntry if v, ok := c.pathDUs.Get(path); ok { - entry = v.(*diskUsageEntry) + entry = v // if we have recent cached entry, use that if time.Now().Sub(entry.last.time) < StatTimeout { diff --git a/tools/stats/ipldstore/ipldstore.go b/tools/stats/ipldstore/ipldstore.go index e172d2af2..2b96fb0cd 100644 --- a/tools/stats/ipldstore/ipldstore.go +++ b/tools/stats/ipldstore/ipldstore.go @@ -5,7 +5,7 @@ import ( "context" "fmt" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "go.opencensus.io/stats" @@ -16,7 +16,7 @@ import ( type ApiIpldStore struct { ctx context.Context api apiIpldStoreApi - cache *lru.TwoQueueCache + cache *lru.TwoQueueCache[cid.Cid, []byte] cacheSize int } @@ -31,7 +31,7 @@ func NewApiIpldStore(ctx context.Context, api apiIpldStoreApi, cacheSize int) (* cacheSize: cacheSize, } - cache, err := lru.New2Q(store.cacheSize) + cache, err := lru.New2Q[cid.Cid, []byte](store.cacheSize) if err != nil { return nil, err } @@ -64,7 +64,7 @@ func (ht *ApiIpldStore) Get(ctx context.Context, c cid.Cid, out interface{}) err if a, ok := ht.cache.Get(c); ok { stats.Record(ctx, metrics.IpldStoreCacheHit.M(1)) - raw = a.([]byte) + raw = a } else { bs, err := ht.read(ctx, c) if err != nil { diff --git a/tools/stats/points/collect.go b/tools/stats/points/collect.go index 98c124b2d..8b8669574 100644 --- a/tools/stats/points/collect.go +++ b/tools/stats/points/collect.go @@ -8,7 +8,7 @@ import ( "strings" "time" - lru "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru/v2" client "github.com/influxdata/influxdb1-client/v2" "github.com/ipfs/go-cid" "go.opencensus.io/stats" @@ -41,11 +41,11 @@ type ChainPointCollector struct { ctx context.Context api LotusApi store adt.Store - actorDigestCache *lru.TwoQueueCache + actorDigestCache *lru.TwoQueueCache[address.Address, string] } func NewChainPointCollector(ctx context.Context, store adt.Store, api LotusApi) (*ChainPointCollector, error) { - actorDigestCache, err := lru.New2Q(2 << 15) + actorDigestCache, err := lru.New2Q[address.Address, string](2 << 15) if err != nil { return nil, err } @@ -62,7 +62,7 @@ func NewChainPointCollector(ctx context.Context, store adt.Store, api LotusApi) func (c *ChainPointCollector) actorDigest(ctx context.Context, addr address.Address, tipset *types.TipSet) (string, error) { if code, ok := c.actorDigestCache.Get(addr); ok { - return code.(string), nil + return code, nil } actor, err := c.api.StateGetActor(ctx, addr, tipset.Key()) From 3556a4b07b6084430824006957d9a5f90acaedc1 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Mar 2023 16:36:48 -0700 Subject: [PATCH 096/129] fix: gateway: correctly apply the fee history lookback max This fix ensures that the full fee-history range falls into the allowable lookback rang. --- gateway/node.go | 3 +++ gateway/proxy_eth.go | 60 +++++++++++++++++++++++--------------------- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/gateway/node.go b/gateway/node.go index a97778eac..8eb2d08e0 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -193,6 +193,9 @@ func (gw *Node) checkTipset(ts *types.TipSet) error { } func (gw *Node) checkTipsetHeight(ts *types.TipSet, h abi.ChainEpoch) error { + if h > ts.Height() { + return fmt.Errorf("tipset height in future") + } tsBlock := ts.Blocks()[0] heightDelta := time.Duration(uint64(tsBlock.Height-h)*build.BlockDelaySecs) * time.Second timeAtHeight := time.Unix(int64(tsBlock.Timestamp), 0).Add(-heightDelta) diff --git a/gateway/proxy_eth.go b/gateway/proxy_eth.go index e1a261a7e..e6f266d55 100644 --- a/gateway/proxy_eth.go +++ b/gateway/proxy_eth.go @@ -80,32 +80,36 @@ func (gw *Node) checkBlkHash(ctx context.Context, blkHash ethtypes.EthHash) erro return gw.checkTipsetKey(ctx, tsk) } -func (gw *Node) checkBlkParam(ctx context.Context, blkParam string) error { +func (gw *Node) checkBlkParam(ctx context.Context, blkParam string, lookback ethtypes.EthUint64) error { if blkParam == "earliest" { // also not supported in node impl return fmt.Errorf("block param \"earliest\" is not supported") } - switch blkParam { - case "pending", "latest": - // those will be recent enough, so we don't need to check - return nil - default: - var num ethtypes.EthUint64 - err := num.UnmarshalJSON([]byte(`"` + blkParam + `"`)) - if err != nil { - return fmt.Errorf("cannot parse block number: %v", err) - } - head, err := gw.target.ChainHead(ctx) - if err != nil { - return err - } - if err := gw.checkTipsetHeight(head, abi.ChainEpoch(num)); err != nil { - return err - } + head, err := gw.target.ChainHead(ctx) + if err != nil { + return err } - return nil + var num ethtypes.EthUint64 + switch blkParam { + case "pending", "latest": + // Head is always ok. + if lookback == 0 { + return nil + } + // Can't look beyond 0 anyways. + if lookback > ethtypes.EthUint64(head.Height()) { + break + } + num = ethtypes.EthUint64(head.Height()) - lookback + default: + if err := num.UnmarshalJSON([]byte(`"` + blkParam + `"`)); err != nil { + return fmt.Errorf("cannot parse block number: %v", err) + } + + } + return gw.checkTipsetHeight(head, abi.ChainEpoch(num)) } func (gw *Node) EthGetBlockTransactionCountByHash(ctx context.Context, blkHash ethtypes.EthHash) (ethtypes.EthUint64, error) { @@ -133,7 +137,7 @@ func (gw *Node) EthGetBlockByNumber(ctx context.Context, blkNum string, fullTxIn return ethtypes.EthBlock{}, err } - if err := gw.checkBlkParam(ctx, blkNum); err != nil { + if err := gw.checkBlkParam(ctx, blkNum, 0); err != nil { return ethtypes.EthBlock{}, err } @@ -169,7 +173,7 @@ func (gw *Node) EthGetTransactionCount(ctx context.Context, sender ethtypes.EthA return 0, err } - if err := gw.checkBlkParam(ctx, blkOpt); err != nil { + if err := gw.checkBlkParam(ctx, blkOpt, 0); err != nil { return 0, err } @@ -189,7 +193,7 @@ func (gw *Node) EthGetCode(ctx context.Context, address ethtypes.EthAddress, blk return nil, err } - if err := gw.checkBlkParam(ctx, blkOpt); err != nil { + if err := gw.checkBlkParam(ctx, blkOpt, 0); err != nil { return nil, err } @@ -201,7 +205,7 @@ func (gw *Node) EthGetStorageAt(ctx context.Context, address ethtypes.EthAddress return nil, err } - if err := gw.checkBlkParam(ctx, blkParam); err != nil { + if err := gw.checkBlkParam(ctx, blkParam, 0); err != nil { return nil, err } @@ -213,7 +217,7 @@ func (gw *Node) EthGetBalance(ctx context.Context, address ethtypes.EthAddress, return ethtypes.EthBigInt(big.Zero()), err } - if err := gw.checkBlkParam(ctx, blkParam); err != nil { + if err := gw.checkBlkParam(ctx, blkParam, 0); err != nil { return ethtypes.EthBigInt(big.Zero()), err } @@ -272,7 +276,7 @@ func (gw *Node) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (ethtype return ethtypes.EthFeeHistory{}, err } - if err := gw.checkBlkParam(ctx, params.NewestBlkNum); err != nil { + if err := gw.checkBlkParam(ctx, params.NewestBlkNum, params.BlkCount); err != nil { return ethtypes.EthFeeHistory{}, err } @@ -305,7 +309,7 @@ func (gw *Node) EthCall(ctx context.Context, tx ethtypes.EthCall, blkParam strin return nil, err } - if err := gw.checkBlkParam(ctx, blkParam); err != nil { + if err := gw.checkBlkParam(ctx, blkParam, 0); err != nil { return nil, err } @@ -327,12 +331,12 @@ func (gw *Node) EthGetLogs(ctx context.Context, filter *ethtypes.EthFilterSpec) } if filter.FromBlock != nil { - if err := gw.checkBlkParam(ctx, *filter.FromBlock); err != nil { + if err := gw.checkBlkParam(ctx, *filter.FromBlock, 0); err != nil { return nil, err } } if filter.ToBlock != nil { - if err := gw.checkBlkParam(ctx, *filter.ToBlock); err != nil { + if err := gw.checkBlkParam(ctx, *filter.ToBlock, 0); err != nil { return nil, err } } From 6afa99d0a153c7dd642f632e55ffb291afebe933 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Tue, 24 Nov 2020 08:11:28 +0100 Subject: [PATCH 097/129] Plumb through a proper Flush() method on all blockstores --- blockstore/badger/blockstore.go | 12 ++++++++++++ blockstore/blockstore.go | 12 ++++++++++++ blockstore/buffered.go | 2 ++ blockstore/discard.go | 4 ++++ blockstore/idstore.go | 4 ++++ blockstore/mem.go | 2 ++ blockstore/net.go | 2 ++ blockstore/splitstore/splitstore.go | 17 +++++++++++++++++ blockstore/splitstore/splitstore_expose.go | 4 ++++ blockstore/splitstore/splitstore_test.go | 2 ++ blockstore/sync.go | 2 ++ blockstore/timed.go | 10 ++++++++++ blockstore/union.go | 9 +++++++++ 13 files changed, 82 insertions(+) diff --git a/blockstore/badger/blockstore.go b/blockstore/badger/blockstore.go index 3087c01f7..1b52eb548 100644 --- a/blockstore/badger/blockstore.go +++ b/blockstore/badger/blockstore.go @@ -601,6 +601,18 @@ func (b *Blockstore) View(ctx context.Context, cid cid.Cid, fn func([]byte) erro }) } +func (b *Blockstore) Flush(context.Context) error { + if err := b.access(); err != nil { + return err + } + defer b.viewers.Done() + + b.lockDB() + defer b.unlockDB() + + return b.db.Sync() +} + // Has implements Blockstore.Has. func (b *Blockstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { if err := b.access(); err != nil { diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index be1f1199f..8d16bbd50 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -18,6 +18,7 @@ type Blockstore interface { blockstore.Blockstore blockstore.Viewer BatchDeleter + Flusher } // BasicBlockstore is an alias to the original IPFS Blockstore. @@ -25,6 +26,10 @@ type BasicBlockstore = blockstore.Blockstore type Viewer = blockstore.Viewer +type Flusher interface { + Flush(context.Context) error +} + type BatchDeleter interface { DeleteMany(ctx context.Context, cids []cid.Cid) error } @@ -106,6 +111,13 @@ type adaptedBlockstore struct { var _ Blockstore = (*adaptedBlockstore)(nil) +func (a *adaptedBlockstore) Flush(ctx context.Context) error { + if flusher, canFlush := a.Blockstore.(Flusher); canFlush { + return flusher.Flush(ctx) + } + return nil +} + func (a *adaptedBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { blk, err := a.Get(ctx, cid) if err != nil { diff --git a/blockstore/buffered.go b/blockstore/buffered.go index e089ed561..bc37b2f69 100644 --- a/blockstore/buffered.go +++ b/blockstore/buffered.go @@ -46,6 +46,8 @@ var ( _ Viewer = (*BufferedBlockstore)(nil) ) +func (bs *BufferedBlockstore) Flush(ctx context.Context) error { return bs.write.Flush(ctx) } + func (bs *BufferedBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { a, err := bs.read.AllKeysChan(ctx) if err != nil { diff --git a/blockstore/discard.go b/blockstore/discard.go index 7f1a76a22..878797561 100644 --- a/blockstore/discard.go +++ b/blockstore/discard.go @@ -38,6 +38,10 @@ func (b *discardstore) View(ctx context.Context, cid cid.Cid, f func([]byte) err return b.bs.View(ctx, cid, f) } +func (b *discardstore) Flush(ctx context.Context) error { + return nil +} + func (b *discardstore) Put(ctx context.Context, blk blocks.Block) error { return nil } diff --git a/blockstore/idstore.go b/blockstore/idstore.go index a0ecec5f0..ae807076d 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -179,3 +179,7 @@ func (b *idstore) Close() error { } return nil } + +func (b *idstore) Flush(ctx context.Context) error { + return b.bs.Flush(ctx) +} diff --git a/blockstore/mem.go b/blockstore/mem.go index 05da287c5..5b06634de 100644 --- a/blockstore/mem.go +++ b/blockstore/mem.go @@ -17,6 +17,8 @@ func NewMemory() MemBlockstore { // To match behavior of badger blockstore we index by multihash only. type MemBlockstore map[string]blocks.Block +func (MemBlockstore) Flush(context.Context) error { return nil } + func (m MemBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error { delete(m, string(k.Hash())) return nil diff --git a/blockstore/net.go b/blockstore/net.go index a6b008af2..62aceed71 100644 --- a/blockstore/net.go +++ b/blockstore/net.go @@ -410,6 +410,8 @@ func (n *NetworkStore) HashOnRead(enabled bool) { return } +func (*NetworkStore) Flush(context.Context) error { return nil } + func (n *NetworkStore) Stop(ctx context.Context) error { close(n.closing) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index 410cc50df..bd9efb630 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -476,6 +476,23 @@ func (s *SplitStore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { } } +func (s *SplitStore) Flush(ctx context.Context) error { + s.txnLk.RLock() + defer s.txnLk.RUnlock() + + if err := s.cold.Flush(ctx); err != nil { + return err + } + if err := s.hot.Flush(ctx); err != nil { + return err + } + if err := s.ds.Sync(ctx, dstore.Key{}); err != nil { + return err + } + + return nil +} + func (s *SplitStore) Put(ctx context.Context, blk blocks.Block) error { if isIdentiyCid(blk.Cid()) { return nil diff --git a/blockstore/splitstore/splitstore_expose.go b/blockstore/splitstore/splitstore_expose.go index d092fbb9b..7461e338d 100644 --- a/blockstore/splitstore/splitstore_expose.go +++ b/blockstore/splitstore/splitstore_expose.go @@ -77,6 +77,10 @@ func (es *exposedSplitStore) GetSize(ctx context.Context, c cid.Cid) (int, error return size, err } +func (es *exposedSplitStore) Flush(ctx context.Context) error { + return es.s.Flush(ctx) +} + func (es *exposedSplitStore) Put(ctx context.Context, blk blocks.Block) error { return es.s.Put(ctx, blk) } diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index c97a9d01c..68e1bfb65 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -757,6 +757,8 @@ func (b *mockStore) DeleteMany(_ context.Context, cids []cid.Cid) error { return nil } +func (b *mockStore) Flush(context.Context) error { return nil } + func (b *mockStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return nil, errors.New("not implemented") } diff --git a/blockstore/sync.go b/blockstore/sync.go index 4f97027ae..652943dca 100644 --- a/blockstore/sync.go +++ b/blockstore/sync.go @@ -20,6 +20,8 @@ type SyncBlockstore struct { bs MemBlockstore // specifically use a memStore to save indirection overhead. } +func (*SyncBlockstore) Flush(context.Context) error { return nil } + func (m *SyncBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error { m.mu.Lock() defer m.mu.Unlock() diff --git a/blockstore/timed.go b/blockstore/timed.go index dda2e1958..3deabb7b8 100644 --- a/blockstore/timed.go +++ b/blockstore/timed.go @@ -93,6 +93,16 @@ func (t *TimedCacheBlockstore) rotate() { t.mu.Unlock() } +func (t *TimedCacheBlockstore) Flush(ctx context.Context) error { + t.mu.Lock() + defer t.mu.Unlock() + + if err := t.active.Flush(ctx); err != nil { + return err + } + return t.inactive.Flush(ctx) +} + 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. diff --git a/blockstore/union.go b/blockstore/union.go index 3372cd20c..ae6f81955 100644 --- a/blockstore/union.go +++ b/blockstore/union.go @@ -55,6 +55,15 @@ func (m unionBlockstore) GetSize(ctx context.Context, cid cid.Cid) (size int, er return size, err } +func (m unionBlockstore) Flush(ctx context.Context) (err error) { + for _, bs := range m { + if err = bs.Flush(ctx); err != nil { + break + } + } + return err +} + func (m unionBlockstore) Put(ctx context.Context, block blocks.Block) (err error) { for _, bs := range m { if err = bs.Put(ctx, block); err != nil { From 51c6b64c91e100d533dc50a92b18b23050dff3fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 14 Mar 2023 13:58:36 +0100 Subject: [PATCH 098/129] feat: consensus: log ApplyBlock timing/gas stats --- chain/consensus/compute_state.go | 22 +++++++++++++++++++--- metrics/metrics.go | 5 +++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/chain/consensus/compute_state.go b/chain/consensus/compute_state.go index cfb2cdf31..e627a62d2 100644 --- a/chain/consensus/compute_state.go +++ b/chain/consensus/compute_state.go @@ -3,6 +3,7 @@ package consensus import ( "context" "sync/atomic" + "time" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" @@ -113,6 +114,8 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, return sm.VMConstructor()(ctx, vmopt) } + var cronGas int64 + runCron := func(vmCron vm.Interface, epoch abi.ChainEpoch) error { cronMsg := &types.Message{ To: cron.Address, @@ -130,6 +133,8 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, return xerrors.Errorf("running cron: %w", err) } + cronGas += ret.GasUsed + 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) @@ -181,7 +186,9 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, } } - partDone() + vmEarly := partDone() + earlyCronGas := cronGas + cronGas = 0 partDone = metrics.Timer(ctx, metrics.VMApplyMessages) vmi, err := makeVm(pstate, epoch, ts.MinTimestamp()) @@ -196,6 +203,8 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, processedMsgs = make(map[cid.Cid]struct{}) ) + var msgGas int64 + for _, b := range bms { penalty := types.NewInt(0) gasReward := big.Zero() @@ -210,6 +219,8 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, return cid.Undef, cid.Undef, err } + msgGas += r.GasUsed + receipts = append(receipts, &r.MessageReceipt) gasReward = big.Add(gasReward, r.GasCosts.MinerTip) penalty = big.Add(penalty, r.GasCosts.MinerPenalty) @@ -239,14 +250,14 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, } } - partDone() + vmMsg := partDone() partDone = metrics.Timer(ctx, metrics.VMApplyCron) if err := runCron(vmi, epoch); err != nil { return cid.Cid{}, cid.Cid{}, err } - partDone() + vmCron := partDone() partDone = metrics.Timer(ctx, metrics.VMApplyFlush) rectarr := blockadt.MakeEmptyArray(sm.ChainStore().ActorStore(ctx)) @@ -282,6 +293,11 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, return cid.Undef, cid.Undef, xerrors.Errorf("vm flush failed: %w", err) } + vmFlush := partDone() + partDone = func() time.Duration { return time.Duration(0) } + + log.Infow("ApplyBlocks stats", "early", vmEarly, "earlyCronGas", earlyCronGas, "vmMsg", vmMsg, "msgGas", msgGas, "vmCron", vmCron, "cronGas", cronGas, "vmFlush", vmFlush, "epoch", epoch, "tsk", ts.Key()) + stats.Record(ctx, metrics.VMSends.M(int64(atomic.LoadUint64(&vm.StatSends))), metrics.VMApplied.M(int64(atomic.LoadUint64(&vm.StatApplied)))) diff --git a/metrics/metrics.go b/metrics/metrics.go index 149195faf..ca638ac27 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -775,9 +775,10 @@ func SinceInMilliseconds(startTime time.Time) float64 { // Timer is a function stopwatch, calling it starts the timer, // calling the returned function will record the duration. -func Timer(ctx context.Context, m *stats.Float64Measure) func() { +func Timer(ctx context.Context, m *stats.Float64Measure) func() time.Duration { start := time.Now() - return func() { + return func() time.Duration { stats.Record(ctx, m.M(SinceInMilliseconds(start))) + return time.Since(start) } } From 27e3c0b89f3a3897f3a5ecdf907e38c9f1a2973a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 14 Mar 2023 14:45:23 +0100 Subject: [PATCH 099/129] fix: stmgr: don't attempt to lookup genesis state (#10472) * fix: stmgr: don't attempt to lookup genesis state * stmgr: More correct fix for genesis state compute --- chain/stmgr/execute.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/chain/stmgr/execute.go b/chain/stmgr/execute.go index 57ff205b9..f85ff7c04 100644 --- a/chain/stmgr/execute.go +++ b/chain/stmgr/execute.go @@ -53,6 +53,16 @@ func (sm *StateManager) TipSetState(ctx context.Context, ts *types.TipSet) (st c sm.stlk.Unlock() + if ts.Height() == 0 { + // NB: This is here because the process that executes blocks requires that the + // block miner reference a valid miner in the state tree. Unless we create some + // magical genesis miner, this won't work properly, so we short circuit here + // This avoids the question of 'who gets paid the genesis block reward'. + // This also makes us not attempt to lookup the tipset state with + // tryLookupTipsetState, which would cause a very long, very slow walk. + return ts.Blocks()[0].ParentStateRoot, ts.Blocks()[0].ParentMessageReceipts, nil + } + // First, try to find the tipset in the current chain. If found, we can avoid re-executing // it. if st, rec, found := tryLookupTipsetState(ctx, sm.cs, ts); found { From e8325f9a98c3ef8f1fd26f3f20f68434a93c93ae Mon Sep 17 00:00:00 2001 From: raulk Date: Tue, 14 Mar 2023 12:49:40 +0000 Subject: [PATCH 100/129] Revert "Eth API: drop support for 'pending' block parameter." This reverts commit 9412753ba33c4bba7dd5df34a1cd5f9a34464e4f. --- node/impl/full/eth.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index b4a5c75d6..70752cf3a 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -235,13 +235,14 @@ func (a *EthModule) EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthH } func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict bool) (tipset *types.TipSet, err error) { - switch blkParam { - case "earliest", "pending": - return nil, fmt.Errorf("block param %q is not supported", blkParam) + if blkParam == "earliest" { + return nil, fmt.Errorf("block param \"earliest\" is not supported") } head := a.Chain.GetHeaviestTipSet() switch blkParam { + case "pending": + return head, nil case "latest": parent, err := a.Chain.GetTipSetFromKey(ctx, head.Parents()) if err != nil { From 991895c0f2f453f53ecdd933bbc398947e4e139f Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 14 Mar 2023 11:09:43 -0400 Subject: [PATCH 101/129] fix: build: drop drand incentinet servers --- build/drand.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/build/drand.go b/build/drand.go index 3027d930b..3b976ac92 100644 --- a/build/drand.go +++ b/build/drand.go @@ -69,10 +69,6 @@ var DrandConfigs = map[DrandEnum]dtypes.DrandConfig{ ChainInfoJSON: `{"public_key":"8cda589f88914aa728fd183f383980b35789ce81b274e5daee1f338b77d02566ef4d3fb0098af1f844f10f9c803c1827","period":25,"genesis_time":1595348225,"hash":"e73b7dc3c4f6a236378220c0dd6aa110eb16eed26c11259606e07ee122838d4f","groupHash":"567d4785122a5a3e75a9bc9911d7ea807dd85ff76b78dc4ff06b075712898607"}`, }, DrandIncentinet: { - Servers: []string{ - "https://dev1.drand.sh", - "https://dev2.drand.sh", - }, ChainInfoJSON: `{"public_key":"8cad0c72c606ab27d36ee06de1d5b2db1faf92e447025ca37575ab3a8aac2eaae83192f846fc9e158bc738423753d000","period":30,"genesis_time":1595873820,"hash":"80c8b872c714f4c00fdd3daa465d5514049f457f01f85a4caf68cdcd394ba039","groupHash":"d9406aaed487f7af71851b4399448e311f2328923d454e971536c05398ce2d9b"}`, }, } From adfa766e1b0d1b6fed0ee1e607179d14cdd0af07 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 14 Mar 2023 13:35:26 -0400 Subject: [PATCH 102/129] feat: gateway: export StateVerifierStatus --- api/api_gateway.go | 1 + api/proxy_gen.go | 13 +++++++++++++ build/openrpc/full.json.gz | Bin 33618 -> 33618 bytes build/openrpc/gateway.json.gz | Bin 9051 -> 9079 bytes build/openrpc/miner.json.gz | Bin 16047 -> 16046 bytes build/openrpc/worker.json.gz | Bin 5224 -> 5225 bytes gateway/node.go | 1 + gateway/proxy_fil.go | 10 ++++++++++ 8 files changed, 25 insertions(+) diff --git a/api/api_gateway.go b/api/api_gateway.go index 7efccea6a..cac28d2a0 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -70,6 +70,7 @@ type Gateway interface { StateNetworkName(context.Context) (dtypes.NetworkName, error) StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) + StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*MsgLookup, error) StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*MsgLookup, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 6c3264ac3..5bf0d911f 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -772,6 +772,8 @@ type GatewayMethods struct { StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `` + StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `` + StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*MsgLookup, error) `` Version func(p0 context.Context) (APIVersion, error) `` @@ -4857,6 +4859,17 @@ func (s *GatewayStub) StateVerifiedClientStatus(p0 context.Context, p1 address.A return nil, ErrNotSupported } +func (s *GatewayStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { + if s.Internal.StateVerifierStatus == nil { + return nil, ErrNotSupported + } + return s.Internal.StateVerifierStatus(p0, p1, p2) +} + +func (s *GatewayStub) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*MsgLookup, error) { if s.Internal.StateWaitMsg == nil { return nil, ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index cea5756857a071bbdcfa605bd1d8cba2e9d2b989..aec3cf7b3efcab1a5f8c0a3478f095ee4bdf20af 100644 GIT binary patch delta 30981 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≤XC}lJU)IxHfP^}?Idj`m?H8ipy$AX-SjDc;n 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

FAT8EXdC7IvM_;k{vt0}p*<+KtFjYy6%fXf^ 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 E09z&mvH$=8 delta 30971 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 literal 9051 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 N|NqPI-gZUa0RZVLzFGhP diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 20916fd24883f0977bfb7857e60309bcd57229da..a68cabbb988204dd4f7b2f84ef19f48fb60cfd7c 100644 GIT binary patch delta 13517 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 H^&0~K&8bC@ delta 13523 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 L^Ktit&=CI*(@IWU diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index ffb4befd31ec85f04440fea64c1eca7f930bec68..ab8a27e92c9bf117a0b679f62a3025213f390801 100644 GIT binary patch delta 3954 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 M|HN1yMXfFY0E+CS)c^nh delta 3953 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 L(Kk?Otu6ron&^;A diff --git a/gateway/node.go b/gateway/node.go index a97778eac..2b123d982 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -90,6 +90,7 @@ type TargetAPI interface { StateCirculatingSupply(context.Context, types.TipSetKey) (abi.TokenAmount, 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) + StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) StateVMCirculatingSupplyInternal(context.Context, types.TipSetKey) (api.CirculatingSupply, error) WalletBalance(context.Context, address.Address) (types.BigInt, error) diff --git a/gateway/proxy_fil.go b/gateway/proxy_fil.go index 7641f569e..8007e1e7b 100644 --- a/gateway/proxy_fil.go +++ b/gateway/proxy_fil.go @@ -489,6 +489,16 @@ func (gw *Node) StateVerifiedClientStatus(ctx context.Context, addr address.Addr return gw.target.StateVerifiedClientStatus(ctx, addr, tsk) } +func (gw *Node) StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return nil, err + } + if err := gw.checkTipsetKey(ctx, tsk); err != nil { + return nil, err + } + return gw.target.StateVerifierStatus(ctx, addr, tsk) +} + func (gw *Node) StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (api.CirculatingSupply, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return api.CirculatingSupply{}, err From 92dd629f4219d136802797bde478e7b97a5c6f8b Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 15 Mar 2023 15:12:22 +1300 Subject: [PATCH 103/129] chore: update go-libp2p-pubsub to v0.9.2 --- go.mod | 3 +-- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index d446a892e..35812f60a 100644 --- a/go.mod +++ b/go.mod @@ -117,7 +117,7 @@ require ( github.com/libp2p/go-libp2p-consensus v0.0.1 github.com/libp2p/go-libp2p-gorpc v0.5.0 github.com/libp2p/go-libp2p-kad-dht v0.21.0 - github.com/libp2p/go-libp2p-pubsub v0.9.0 + github.com/libp2p/go-libp2p-pubsub v0.9.2 github.com/libp2p/go-libp2p-raft v0.4.0 github.com/libp2p/go-libp2p-record v0.2.0 github.com/libp2p/go-libp2p-routing-helpers v0.4.0 @@ -194,7 +194,6 @@ require ( github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/drand/kyber-bls12381 v0.2.3 // indirect github.com/elastic/go-windows v1.0.0 // indirect - github.com/emirpasic/gods v1.18.1 // indirect github.com/etclabscore/go-jsonschema-walk v0.0.6 // indirect github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 // indirect github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 // indirect diff --git a/go.sum b/go.sum index f39f2a96b..2eca56b26 100644 --- a/go.sum +++ b/go.sum @@ -268,8 +268,6 @@ github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6 github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -1082,8 +1080,8 @@ 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-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= -github.com/libp2p/go-libp2p-pubsub v0.9.0 h1:mcLb4WzwhUG4OKb0rp1/bYMd/DYhvMyzJheQH3LMd1s= -github.com/libp2p/go-libp2p-pubsub v0.9.0/go.mod h1:OEsj0Cc/BpkqikXRTrVspWU/Hx7bMZwHP+6vNMd+c7I= +github.com/libp2p/go-libp2p-pubsub v0.9.2 h1:CoWrvqtIbk+8iTLk1yCN8zODMgBSCqRgyVCvHaGJx8Y= +github.com/libp2p/go-libp2p-pubsub v0.9.2/go.mod h1:RYA7aM9jIic5VV47WXu4GkcRxRhrdElWf8xtyli+Dzc= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-raft v0.4.0 h1:2atEs7/FWH35bRiLh8gTejGh5NA9u4eG7BXjpf/B+Z4= github.com/libp2p/go-libp2p-raft v0.4.0/go.mod h1:qJCYtFBTbip2wngLxFeAb9o52XmAPi2vSIQ4hV7IpSA= From 6ef415744cfcfbc3e2856651d1592767106c63b1 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 14 Mar 2023 19:53:39 -0700 Subject: [PATCH 104/129] chore: update ffi to increase execution parallelism (#10480) This changes the default validation parallelism from 1 to 4, and makes it configurable with a LOTUS_FVM_CONCURRENCY environment variable. --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 8baa0faaa..28e3cd44d 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 8baa0faaa0794c9d50808c72db154e307a77e94c +Subproject commit 28e3cd44d91681c074aba362d1e5c954db110ad9 From 21b74deab45615d221f365a19e937bbfa9a65300 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 15 Mar 2023 18:10:29 +1300 Subject: [PATCH 105/129] fix connection gater integration test --- itests/net_test.go | 64 +++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/itests/net_test.go b/itests/net_test.go index 43524a51b..2ee8f60b9 100644 --- a/itests/net_test.go +++ b/itests/net_test.go @@ -21,7 +21,7 @@ func TestNetConn(t *testing.T) { firstNode, secondNode, _, _ := kit.EnsembleTwoOne(t) - //stm: @NETWORK_COMMON_ID_001 + // stm: @NETWORK_COMMON_ID_001 secondNodeID, err := secondNode.ID(ctx) require.NoError(t, err) @@ -31,21 +31,21 @@ func TestNetConn(t *testing.T) { t.Errorf("node should be not connected to peers. %s", err.Error()) } - //stm: @NETWORK_COMMON_ADDRS_LISTEN_001 + // stm: @NETWORK_COMMON_ADDRS_LISTEN_001 addrInfo, err := secondNode.NetAddrsListen(ctx) require.NoError(t, err) - //stm: @NETWORK_COMMON_CONNECT_001 + // stm: @NETWORK_COMMON_CONNECT_001 err = firstNode.NetConnect(ctx, addrInfo) if err != nil { t.Errorf("nodes failed to connect. %s", err.Error()) } - //stm: @NETWORK_COMMON_PEER_INFO_001 + // stm: @NETWORK_COMMON_PEER_INFO_001 netPeerInfo, err := firstNode.NetPeerInfo(ctx, secondNodeID) require.NoError(t, err) - //stm: @NETWORK_COMMON_AGENT_VERSION_001 + // stm: @NETWORK_COMMON_AGENT_VERSION_001 agent, err := firstNode.NetAgentVersion(ctx, secondNodeID) require.NoError(t, err) @@ -53,7 +53,7 @@ func TestNetConn(t *testing.T) { t.Errorf("agents not matching. %s", err.Error()) } - //stm: @NETWORK_COMMON_FIND_PEER_001 + // stm: @NETWORK_COMMON_FIND_PEER_001 secondNodePeer, err := firstNode.NetFindPeer(ctx, secondNodeID) require.NoError(t, err) @@ -67,12 +67,12 @@ func TestNetConn(t *testing.T) { t.Errorf("peer does not have connected state") } - //stm: @NETWORK_COMMON_PEERS_001 + // stm: @NETWORK_COMMON_PEERS_001 addrs, err := firstNode.NetPeers(ctx) require.NoError(t, err) require.NotEqual(t, 0, len(addrs)) - //stm: @NETWORK_COMMON_DISCONNECT_001 + // stm: @NETWORK_COMMON_DISCONNECT_001 err = firstNode.NetDisconnect(ctx, secondNodeID) if err != nil { t.Errorf("nodes failed to disconnect. %s", err.Error()) @@ -84,7 +84,7 @@ func TestNetConn(t *testing.T) { t.Errorf("peer should have disconnected") } - //stm: @NETWORK_COMMON_PEERS_001 + // stm: @NETWORK_COMMON_PEERS_001 addrs, err = firstNode.NetPeers(ctx) require.NoError(t, err) @@ -120,13 +120,13 @@ func TestNetStat(t *testing.T) { } } - //stm: @NETWORK_COMMON_STAT_001 + // stm: @NETWORK_COMMON_STAT_001 t.Run("all", withScope(t, "all")) - //stm: @NETWORK_COMMON_STAT_002 + // stm: @NETWORK_COMMON_STAT_002 t.Run("system", withScope(t, "system")) - //stm: @NETWORK_COMMON_STAT_003 + // stm: @NETWORK_COMMON_STAT_003 t.Run("transient", withScope(t, "transient")) - //stm: @NETWORK_COMMON_STAT_004 + // stm: @NETWORK_COMMON_STAT_004 t.Run("peer", withScope(t, fmt.Sprintf("peer:%s", sId))) } @@ -145,11 +145,11 @@ func TestNetLimit(t *testing.T) { } } - //stm: @NETWORK_COMMON_LIMIT_001 + // stm: @NETWORK_COMMON_LIMIT_001 t.Run("system", withScope(t, "system")) - //stm: @NETWORK_COMMON_LIMIT_002 + // stm: @NETWORK_COMMON_LIMIT_002 t.Run("transient", withScope(t, "transient")) - //stm: @NETWORK_COMMON_LIMIT_003 + // stm: @NETWORK_COMMON_LIMIT_003 t.Run("peer", withScope(t, fmt.Sprintf("peer:%s", sId))) } @@ -158,7 +158,7 @@ func TestNetBlockPeer(t *testing.T) { firstNode, secondNode, _, _ := kit.EnsembleTwoOne(t) - //stm: @NETWORK_COMMON_ID_001 + // stm: @NETWORK_COMMON_ID_001 firstAddrInfo, _ := firstNode.NetAddrsListen(ctx) firstNodeID, err := firstNode.ID(ctx) require.NoError(t, err) @@ -170,11 +170,11 @@ func TestNetBlockPeer(t *testing.T) { require.NoError(t, err, "failed to determine connectedness") require.NotEqual(t, connectedness, network.Connected, "shouldn't already be connected") - //stm: @NETWORK_COMMON_BLOCK_ADD_001 + // stm: @NETWORK_COMMON_BLOCK_ADD_001 err = firstNode.NetBlockAdd(ctx, api.NetBlockList{Peers: []peer.ID{secondNodeID}}) require.NoError(t, err) - //stm: @NETWORK_COMMON_BLOCK_LIST_001 + // stm: @NETWORK_COMMON_BLOCK_LIST_001 list, err := firstNode.NetBlockList(ctx) require.NoError(t, err) @@ -182,16 +182,22 @@ func TestNetBlockPeer(t *testing.T) { t.Errorf("blocked peer not in blocked peer list") } - require.Error(t, secondNode.NetConnect(ctx, firstAddrInfo), "shouldn't be able to connect to second node") - connectedness, err = secondNode.NetConnectedness(ctx, firstAddrInfo.ID) + err = secondNode.NetConnect(ctx, firstAddrInfo) + // With early muxer selection, we'll only learn that the handshake failed + // when we do something with the connection, for example when we open a stream. + if err == nil { + _, err = secondNode.NetPing(context.Background(), firstAddrInfo.ID) + } + require.Error(t, err, "shouldn't be able to connect to second node") + connectedness, err = firstNode.NetConnectedness(ctx, secondNodeID) require.NoError(t, err, "failed to determine connectedness") require.NotEqual(t, connectedness, network.Connected) - //stm: @NETWORK_COMMON_BLOCK_REMOVE_001 + // stm: @NETWORK_COMMON_BLOCK_REMOVE_001 err = firstNode.NetBlockRemove(ctx, api.NetBlockList{Peers: []peer.ID{secondNodeID}}) require.NoError(t, err) - //stm: @NETWORK_COMMON_BLOCK_LIST_001 + // stm: @NETWORK_COMMON_BLOCK_LIST_001 list, err = firstNode.NetBlockList(ctx) require.NoError(t, err) @@ -210,7 +216,7 @@ func TestNetBlockIPAddr(t *testing.T) { firstNode, secondNode, _, _ := kit.EnsembleTwoOne(t) - //stm: @NETWORK_COMMON_ADDRS_LISTEN_001 + // stm: @NETWORK_COMMON_ADDRS_LISTEN_001 firstAddrInfo, _ := firstNode.NetAddrsListen(ctx) secondAddrInfo, _ := secondNode.NetAddrsListen(ctx) @@ -229,11 +235,11 @@ func TestNetBlockIPAddr(t *testing.T) { require.NoError(t, err, "failed to determine connectedness") require.NotEqual(t, connectedness, network.Connected, "shouldn't already be connected") - //stm: @NETWORK_COMMON_BLOCK_ADD_001 + // stm: @NETWORK_COMMON_BLOCK_ADD_001 require.NoError(t, firstNode.NetBlockAdd(ctx, api.NetBlockList{ IPAddrs: secondNodeIPs}), "failed to add blocked IPs") - //stm: @NETWORK_COMMON_BLOCK_LIST_001 + // stm: @NETWORK_COMMON_BLOCK_LIST_001 list, err := firstNode.NetBlockList(ctx) require.NoError(t, err) @@ -255,11 +261,11 @@ func TestNetBlockIPAddr(t *testing.T) { require.NoError(t, err, "failed to determine connectedness") require.NotEqual(t, connectedness, network.Connected) - //stm: @NETWORK_COMMON_BLOCK_REMOVE_001 + // stm: @NETWORK_COMMON_BLOCK_REMOVE_001 err = firstNode.NetBlockRemove(ctx, api.NetBlockList{IPAddrs: secondNodeIPs}) require.NoError(t, err) - //stm: @NETWORK_COMMON_BLOCK_LIST_001 + // stm: @NETWORK_COMMON_BLOCK_LIST_001 list, err = firstNode.NetBlockList(ctx) require.NoError(t, err) @@ -274,7 +280,7 @@ func TestNetBlockIPAddr(t *testing.T) { } func getConnState(ctx context.Context, t *testing.T, node *kit.TestFullNode, peer peer.ID) network.Connectedness { - //stm: @NETWORK_COMMON_CONNECTEDNESS_001 + // stm: @NETWORK_COMMON_CONNECTEDNESS_001 connState, err := node.NetConnectedness(ctx, peer) require.NoError(t, err) From 58306a87f1699a7452a96ddcb5beeed8dd3010b2 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 15 Mar 2023 18:10:59 +1300 Subject: [PATCH 106/129] chore: update go-libp2p to v0.26.2 --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 35812f60a..d60d2f34d 100644 --- a/go.mod +++ b/go.mod @@ -113,7 +113,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/libp2p/go-libp2p v0.26.0 + github.com/libp2p/go-libp2p v0.26.2 github.com/libp2p/go-libp2p-consensus v0.0.1 github.com/libp2p/go-libp2p-gorpc v0.5.0 github.com/libp2p/go-libp2p-kad-dht v0.21.0 @@ -300,7 +300,7 @@ require ( github.com/quic-go/qtls-go1-19 v0.2.1 // indirect github.com/quic-go/qtls-go1-20 v0.1.1 // indirect github.com/quic-go/quic-go v0.33.0 // indirect - github.com/quic-go/webtransport-go v0.5.1 // indirect + github.com/quic-go/webtransport-go v0.5.2 // indirect github.com/rivo/uniseg v0.1.0 // indirect github.com/rs/cors v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect diff --git a/go.sum b/go.sum index 2eca56b26..199db1bf2 100644 --- a/go.sum +++ b/go.sum @@ -1004,8 +1004,8 @@ github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xS github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= -github.com/libp2p/go-libp2p v0.26.0 h1:0FE0bP9/G9YADjruqoFvf1snBBFvrdh1MmTuEeUkl2E= -github.com/libp2p/go-libp2p v0.26.0/go.mod h1:R8N+XhwPDPLNb4TKboKJKnDeg9vPw8+zlC6g793dTGw= +github.com/libp2p/go-libp2p v0.26.2 h1:eHEoW/696FP7/6DxOvcrKfTD6Bi0DExxiMSZUJxswA0= +github.com/libp2p/go-libp2p v0.26.2/go.mod h1:x75BN32YbwuY0Awm2Uix4d4KOz+/4piInkp4Wr3yOo8= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -1488,8 +1488,8 @@ github.com/quic-go/qtls-go1-20 v0.1.1 h1:KbChDlg82d3IHqaj2bn6GfKRj84Per2VGf5XV3w github.com/quic-go/qtls-go1-20 v0.1.1/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0= github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA= -github.com/quic-go/webtransport-go v0.5.1 h1:1eVb7WDWCRoaeTtFHpFBJ6WDN1bSrPrRoW6tZgSw0Ow= -github.com/quic-go/webtransport-go v0.5.1/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= +github.com/quic-go/webtransport-go v0.5.2 h1:GA6Bl6oZY+g/flt00Pnu0XtivSD8vukOu3lYhJjnGEk= +github.com/quic-go/webtransport-go v0.5.2/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= 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.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= From 311645b5592acd273564244d58a44626ca093e02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 15 Mar 2023 12:13:57 +0100 Subject: [PATCH 107/129] make mod-tidy ci happy --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 2b8e8e143..d25d2cdad 100644 --- a/go.mod +++ b/go.mod @@ -75,7 +75,6 @@ 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-block-format v0.1.1 github.com/ipfs/go-blockservice v0.5.0 github.com/ipfs/go-cid v0.3.2 github.com/ipfs/go-cidutil v0.1.0 @@ -232,6 +231,7 @@ require ( github.com/huin/goupnp v1.0.3 // indirect github.com/iancoleman/orderedmap v0.1.0 // indirect github.com/ipfs/go-bitfield v1.1.0 // indirect + github.com/ipfs/go-block-format v0.1.1 // indirect github.com/ipfs/go-filestore v1.2.0 // indirect github.com/ipfs/go-ipfs-cmds v0.8.2 // indirect github.com/ipfs/go-ipfs-delay v0.0.1 // indirect From 7e21486103b3d2706b5c1df11280801b57a6c9a0 Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 15 Mar 2023 13:57:20 +0200 Subject: [PATCH 108/129] update go-libp2p-pubsub to v0.9.3 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d25d2cdad..00b4cdabc 100644 --- a/go.mod +++ b/go.mod @@ -117,7 +117,7 @@ require ( github.com/libp2p/go-libp2p-consensus v0.0.1 github.com/libp2p/go-libp2p-gorpc v0.5.0 github.com/libp2p/go-libp2p-kad-dht v0.21.0 - github.com/libp2p/go-libp2p-pubsub v0.9.2 + github.com/libp2p/go-libp2p-pubsub v0.9.3 github.com/libp2p/go-libp2p-raft v0.4.0 github.com/libp2p/go-libp2p-record v0.2.0 github.com/libp2p/go-libp2p-routing-helpers v0.4.0 diff --git a/go.sum b/go.sum index 26a17091d..b655bcc91 100644 --- a/go.sum +++ b/go.sum @@ -1081,8 +1081,8 @@ 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-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= -github.com/libp2p/go-libp2p-pubsub v0.9.2 h1:CoWrvqtIbk+8iTLk1yCN8zODMgBSCqRgyVCvHaGJx8Y= -github.com/libp2p/go-libp2p-pubsub v0.9.2/go.mod h1:RYA7aM9jIic5VV47WXu4GkcRxRhrdElWf8xtyli+Dzc= +github.com/libp2p/go-libp2p-pubsub v0.9.3 h1:ihcz9oIBMaCK9kcx+yHWm3mLAFBMAUsM4ux42aikDxo= +github.com/libp2p/go-libp2p-pubsub v0.9.3/go.mod h1:RYA7aM9jIic5VV47WXu4GkcRxRhrdElWf8xtyli+Dzc= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-raft v0.4.0 h1:2atEs7/FWH35bRiLh8gTejGh5NA9u4eG7BXjpf/B+Z4= github.com/libp2p/go-libp2p-raft v0.4.0/go.mod h1:qJCYtFBTbip2wngLxFeAb9o52XmAPi2vSIQ4hV7IpSA= From a44f598cc21ab7610db227080b9faf7d612c14b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 15 Mar 2023 17:19:32 +0100 Subject: [PATCH 109/129] update go-jsonrpc to v0.2.3 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 00b4cdabc..ebb33ffd4 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.27.0-rc1 - github.com/filecoin-project/go-jsonrpc v0.2.2 + github.com/filecoin-project/go-jsonrpc v0.2.3 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 github.com/filecoin-project/go-state-types v0.10.0 diff --git a/go.sum b/go.sum index b655bcc91..7d0d05dd7 100644 --- a/go.sum +++ b/go.sum @@ -332,8 +332,8 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-jsonrpc v0.2.2 h1:yo7Ga5qaSFfAukjyI6pdFBxzUVbQoHjKdYMpf2vMvh4= -github.com/filecoin-project/go-jsonrpc v0.2.2/go.mod h1:jBSvPTl8V1N7gSTuCR4bis8wnQnIjHbRPpROol6iQKM= +github.com/filecoin-project/go-jsonrpc v0.2.3 h1:xdixRQfLbD8gt56dpBNKiya9gvI/79nNM13IHKTfm5E= +github.com/filecoin-project/go-jsonrpc v0.2.3/go.mod h1:jBSvPTl8V1N7gSTuCR4bis8wnQnIjHbRPpROol6iQKM= 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.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= From 470dd8da3dfdc8fe4de9e5c838894efcb28be0db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 15 Mar 2023 18:34:10 +0100 Subject: [PATCH 110/129] ethrpc: Buffer sub messages if subscriber is slow --- go.mod | 2 + go.sum | 4 ++ node/impl/full/eth.go | 119 ++++++++++++++++++++++++++++++++---------- 3 files changed, 96 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index ebb33ffd4..48c33cfde 100644 --- a/go.mod +++ b/go.mod @@ -304,6 +304,7 @@ require ( github.com/rivo/uniseg v0.1.0 // indirect github.com/rs/cors v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/segmentio/fasthash v1.0.3 // indirect github.com/shirou/gopsutil v2.18.12+incompatible // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect @@ -319,6 +320,7 @@ require ( github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/zondax/hid v0.9.1 // indirect github.com/zondax/ledger-go v0.12.1 // indirect + github.com/zyedidia/generic v1.2.1 // indirect go.opentelemetry.io/otel/metric v0.33.0 // indirect go.opentelemetry.io/otel/sdk/metric v0.33.0 // indirect go.opentelemetry.io/otel/trace v1.12.0 // indirect diff --git a/go.sum b/go.sum index 7d0d05dd7..94927236b 100644 --- a/go.sum +++ b/go.sum @@ -1516,6 +1516,8 @@ github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0 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/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM= +github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcVLEXjMjBPjjEU5vksH8= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= @@ -1705,6 +1707,8 @@ github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= github.com/zondax/hid v0.9.1/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= +github.com/zyedidia/generic v1.2.1 h1:Zv5KS/N2m0XZZiuLS82qheRG4X1o5gsWreGb0hR7XDc= +github.com/zyedidia/generic v1.2.1/go.mod h1:ly2RBz4mnz1yeuVbQA/VFwGjK3mnHGRj1JuoG336Bis= 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= diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index b4a5c75d6..91a20c27e 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/zyedidia/generic/queue" "sort" "strconv" "sync" @@ -1352,7 +1353,7 @@ func (e *EthEvent) EthSubscribe(ctx context.Context, p jsonrpc.RawParams) (ethty return ethtypes.EthSubscriptionID{}, xerrors.Errorf("connection doesn't support callbacks") } - sub, err := e.SubManager.StartSubscription(e.SubscribtionCtx, ethCb.EthSubscription) + sub, err := e.SubManager.StartSubscription(e.SubscribtionCtx, ethCb.EthSubscription, e.uninstallFilter) if err != nil { return ethtypes.EthSubscriptionID{}, err } @@ -1418,18 +1419,11 @@ func (e *EthEvent) EthUnsubscribe(ctx context.Context, id ethtypes.EthSubscripti return false, api.ErrNotSupported } - filters, err := e.SubManager.StopSubscription(ctx, id) + err := e.SubManager.StopSubscription(ctx, id) if err != nil { return false, nil } - for _, f := range filters { - if err := e.uninstallFilter(ctx, f); err != nil { - // this will leave the filter a zombie, collecting events up to the maximum allowed - log.Warnf("failed to remove filter when unsubscribing: %v", err) - } - } - return true, nil } @@ -1615,7 +1609,7 @@ type EthSubscriptionManager struct { subs map[ethtypes.EthSubscriptionID]*ethSubscription } -func (e *EthSubscriptionManager) StartSubscription(ctx context.Context, out ethSubscriptionCallback) (*ethSubscription, error) { // nolint +func (e *EthSubscriptionManager) StartSubscription(ctx context.Context, out ethSubscriptionCallback, dropFilter func(context.Context, filter.Filter) error) (*ethSubscription, error) { // nolint rawid, err := uuid.NewRandom() if err != nil { return nil, xerrors.Errorf("new uuid: %w", err) @@ -1626,13 +1620,17 @@ func (e *EthSubscriptionManager) StartSubscription(ctx context.Context, out ethS ctx, quit := context.WithCancel(ctx) sub := ðSubscription{ - Chain: e.Chain, - StateAPI: e.StateAPI, - ChainAPI: e.ChainAPI, - id: id, - in: make(chan interface{}, 200), - out: out, - quit: quit, + Chain: e.Chain, + StateAPI: e.StateAPI, + ChainAPI: e.ChainAPI, + uninstallFilter: dropFilter, + id: id, + in: make(chan interface{}, 200), + out: out, + quit: quit, + + toSend: queue.New[[]byte](), + sendCond: make(chan struct{}, 1), } e.mu.Lock() @@ -1643,37 +1641,46 @@ func (e *EthSubscriptionManager) StartSubscription(ctx context.Context, out ethS e.mu.Unlock() go sub.start(ctx) + go sub.startOut(ctx) return sub, nil } -func (e *EthSubscriptionManager) StopSubscription(ctx context.Context, id ethtypes.EthSubscriptionID) ([]filter.Filter, error) { +func (e *EthSubscriptionManager) StopSubscription(ctx context.Context, id ethtypes.EthSubscriptionID) error { e.mu.Lock() defer e.mu.Unlock() sub, ok := e.subs[id] if !ok { - return nil, xerrors.Errorf("subscription not found") + return xerrors.Errorf("subscription not found") } sub.stop() delete(e.subs, id) - return sub.filters, nil + return nil } type ethSubscriptionCallback func(context.Context, jsonrpc.RawParams) error +const maxSendQueue = 20000 + type ethSubscription struct { - Chain *store.ChainStore - StateAPI StateAPI - ChainAPI ChainAPI - id ethtypes.EthSubscriptionID - in chan interface{} - out ethSubscriptionCallback + Chain *store.ChainStore + StateAPI StateAPI + ChainAPI ChainAPI + uninstallFilter func(context.Context, filter.Filter) error + id ethtypes.EthSubscriptionID + in chan interface{} + out ethSubscriptionCallback mu sync.Mutex filters []filter.Filter quit func() + + sendLk sync.Mutex + sendQueueLen int + toSend *queue.Queue[[]byte] + sendCond chan struct{} } func (e *ethSubscription) addFilter(ctx context.Context, f filter.Filter) { @@ -1684,6 +1691,36 @@ func (e *ethSubscription) addFilter(ctx context.Context, f filter.Filter) { e.filters = append(e.filters, f) } +// sendOut processes the final subscription queue. It's here in case the subscriber +// is slow, and we need to buffer the messages. +func (e *ethSubscription) startOut(ctx context.Context) { + for { + select { + case <-ctx.Done(): + return + case <-e.sendCond: + e.sendLk.Lock() + + for !e.toSend.Empty() { + front := e.toSend.Dequeue() + e.sendQueueLen-- + + e.sendLk.Unlock() + + if err := e.out(ctx, front); err != nil { + log.Warnw("error sending subscription response, killing subscription", "sub", e.id, "error", err) + e.stop() + return + } + + e.sendLk.Lock() + } + + e.sendLk.Unlock() + } + } +} + func (e *ethSubscription) send(ctx context.Context, v interface{}) { resp := ethtypes.EthSubscriptionResponse{ SubscriptionID: e.id, @@ -1696,10 +1733,22 @@ func (e *ethSubscription) send(ctx context.Context, v interface{}) { return } - if err := e.out(ctx, outParam); err != nil { - log.Warnw("sending subscription response", "sub", e.id, "error", err) + e.sendLk.Lock() + defer e.sendLk.Unlock() + + e.toSend.Enqueue(outParam) + + e.sendQueueLen++ + if e.sendQueueLen > maxSendQueue { + log.Warnw("subscription send queue full, killing subscription", "sub", e.id) + e.stop() return } + + select { + case e.sendCond <- struct{}{}: + default: // already signalled, and we're holding the lock so we know that the event will be processed + } } func (e *ethSubscription) start(ctx context.Context) { @@ -1743,11 +1792,23 @@ func (e *ethSubscription) start(ctx context.Context) { func (e *ethSubscription) stop() { e.mu.Lock() - defer e.mu.Unlock() + if e.quit == nil { + e.mu.Unlock() + return + } if e.quit != nil { e.quit() e.quit = nil + e.mu.Unlock() + + for _, f := range e.filters { + // note: the context in actually unused in uninstallFilter + if err := e.uninstallFilter(context.TODO(), f); err != nil { + // this will leave the filter a zombie, collecting events up to the maximum allowed + log.Warnf("failed to remove filter when unsubscribing: %v", err) + } + } } } From 720e95991c19140037e2270e624451c5636a5124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 15 Mar 2023 18:51:46 +0100 Subject: [PATCH 111/129] make lint happy --- go.mod | 3 +-- go.sum | 2 -- node/impl/full/eth.go | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 48c33cfde..27d488458 100644 --- a/go.mod +++ b/go.mod @@ -147,6 +147,7 @@ require ( github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 github.com/xeipuuv/gojsonschema v1.2.0 github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 + github.com/zyedidia/generic v1.2.1 go.opencensus.io v0.24.0 go.opentelemetry.io/otel v1.12.0 go.opentelemetry.io/otel/bridge/opencensus v0.33.0 @@ -304,7 +305,6 @@ require ( github.com/rivo/uniseg v0.1.0 // indirect github.com/rs/cors v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/segmentio/fasthash v1.0.3 // indirect github.com/shirou/gopsutil v2.18.12+incompatible // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect @@ -320,7 +320,6 @@ require ( github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/zondax/hid v0.9.1 // indirect github.com/zondax/ledger-go v0.12.1 // indirect - github.com/zyedidia/generic v1.2.1 // indirect go.opentelemetry.io/otel/metric v0.33.0 // indirect go.opentelemetry.io/otel/sdk/metric v0.33.0 // indirect go.opentelemetry.io/otel/trace v1.12.0 // indirect diff --git a/go.sum b/go.sum index 94927236b..5e20e850f 100644 --- a/go.sum +++ b/go.sum @@ -1516,8 +1516,6 @@ github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0 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/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM= -github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcVLEXjMjBPjjEU5vksH8= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 91a20c27e..64592a4c6 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -6,7 +6,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/zyedidia/generic/queue" "sort" "strconv" "sync" @@ -15,6 +14,7 @@ import ( "github.com/google/uuid" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" + "github.com/zyedidia/generic/queue" "go.uber.org/fx" "golang.org/x/xerrors" From fee480193e2a562e92ef0d12dd0726e02bf74d08 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Mar 2023 21:59:16 -0700 Subject: [PATCH 112/129] feat: apply gateway lookback limit to eth API lookback This change: 1. Introduces new "limited" API endpoints for EthGetTransactionByHash and EthGetTransactionReceipt that accept lookback-limits. 2. Implements the gateway version of these API endpoints by calling the limited variants with the default message search lookback limit. fixes #10412 --- api/api_full.go | 2 + api/mocks/mock_full.go | 30 +++++++ api/proxy_gen.go | 26 ++++++ build/openrpc/full.json.gz | Bin 33618 -> 33805 bytes build/openrpc/gateway.json.gz | Bin 9079 -> 9078 bytes build/openrpc/miner.json.gz | Bin 15864 -> 15865 bytes build/openrpc/worker.json.gz | Bin 5225 -> 5223 bytes documentation/en/api-v1-unstable-methods.md | 89 ++++++++++++++++++++ gateway/node.go | 4 +- gateway/proxy_eth.go | 4 +- node/impl/full/dummy.go | 9 ++ node/impl/full/eth.go | 13 ++- 12 files changed, 171 insertions(+), 6 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index 37e197ab3..6ce061865 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -797,10 +797,12 @@ type FullNode interface { EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthHash, fullTxInfo bool) (ethtypes.EthBlock, error) //perm:read EthGetBlockByNumber(ctx context.Context, blkNum string, fullTxInfo bool) (ethtypes.EthBlock, error) //perm:read EthGetTransactionByHash(ctx context.Context, txHash *ethtypes.EthHash) (*ethtypes.EthTx, error) //perm:read + EthGetTransactionByHashLimited(ctx context.Context, txHash *ethtypes.EthHash, limit abi.ChainEpoch) (*ethtypes.EthTx, error) //perm:read EthGetTransactionHashByCid(ctx context.Context, cid cid.Cid) (*ethtypes.EthHash, error) //perm:read EthGetMessageCidByTransactionHash(ctx context.Context, txHash *ethtypes.EthHash) (*cid.Cid, error) //perm:read EthGetTransactionCount(ctx context.Context, sender ethtypes.EthAddress, blkOpt string) (ethtypes.EthUint64, error) //perm:read EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.EthHash) (*EthTxReceipt, error) //perm:read + EthGetTransactionReceiptLimited(ctx context.Context, txHash ethtypes.EthHash, limit abi.ChainEpoch) (*EthTxReceipt, error) //perm:read EthGetTransactionByBlockHashAndIndex(ctx context.Context, blkHash ethtypes.EthHash, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) //perm:read EthGetTransactionByBlockNumberAndIndex(ctx context.Context, blkNum ethtypes.EthUint64, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) //perm:read diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index fc7ff5588..83efbffdb 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -1296,6 +1296,21 @@ func (mr *MockFullNodeMockRecorder) EthGetTransactionByHash(arg0, arg1 interface return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetTransactionByHash", reflect.TypeOf((*MockFullNode)(nil).EthGetTransactionByHash), arg0, arg1) } +// EthGetTransactionByHashLimited mocks base method. +func (m *MockFullNode) EthGetTransactionByHashLimited(arg0 context.Context, arg1 *ethtypes.EthHash, arg2 abi.ChainEpoch) (*ethtypes.EthTx, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "EthGetTransactionByHashLimited", arg0, arg1, arg2) + ret0, _ := ret[0].(*ethtypes.EthTx) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// EthGetTransactionByHashLimited indicates an expected call of EthGetTransactionByHashLimited. +func (mr *MockFullNodeMockRecorder) EthGetTransactionByHashLimited(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetTransactionByHashLimited", reflect.TypeOf((*MockFullNode)(nil).EthGetTransactionByHashLimited), arg0, arg1, arg2) +} + // EthGetTransactionCount mocks base method. func (m *MockFullNode) EthGetTransactionCount(arg0 context.Context, arg1 ethtypes.EthAddress, arg2 string) (ethtypes.EthUint64, error) { m.ctrl.T.Helper() @@ -1341,6 +1356,21 @@ func (mr *MockFullNodeMockRecorder) EthGetTransactionReceipt(arg0, arg1 interfac return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetTransactionReceipt", reflect.TypeOf((*MockFullNode)(nil).EthGetTransactionReceipt), arg0, arg1) } +// EthGetTransactionReceiptLimited mocks base method. +func (m *MockFullNode) EthGetTransactionReceiptLimited(arg0 context.Context, arg1 ethtypes.EthHash, arg2 abi.ChainEpoch) (*api.EthTxReceipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "EthGetTransactionReceiptLimited", arg0, arg1, arg2) + ret0, _ := ret[0].(*api.EthTxReceipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// EthGetTransactionReceiptLimited indicates an expected call of EthGetTransactionReceiptLimited. +func (mr *MockFullNodeMockRecorder) EthGetTransactionReceiptLimited(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetTransactionReceiptLimited", reflect.TypeOf((*MockFullNode)(nil).EthGetTransactionReceiptLimited), arg0, arg1, arg2) +} + // EthMaxPriorityFeePerGas mocks base method. func (m *MockFullNode) EthMaxPriorityFeePerGas(arg0 context.Context) (ethtypes.EthBigInt, error) { m.ctrl.T.Helper() diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 24b11df3f..dbae138a9 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -290,12 +290,16 @@ type FullNodeMethods struct { EthGetTransactionByHash func(p0 context.Context, p1 *ethtypes.EthHash) (*ethtypes.EthTx, error) `perm:"read"` + EthGetTransactionByHashLimited func(p0 context.Context, p1 *ethtypes.EthHash, p2 abi.ChainEpoch) (*ethtypes.EthTx, error) `perm:"read"` + EthGetTransactionCount func(p0 context.Context, p1 ethtypes.EthAddress, p2 string) (ethtypes.EthUint64, error) `perm:"read"` EthGetTransactionHashByCid func(p0 context.Context, p1 cid.Cid) (*ethtypes.EthHash, error) `perm:"read"` EthGetTransactionReceipt func(p0 context.Context, p1 ethtypes.EthHash) (*EthTxReceipt, error) `perm:"read"` + EthGetTransactionReceiptLimited func(p0 context.Context, p1 ethtypes.EthHash, p2 abi.ChainEpoch) (*EthTxReceipt, error) `perm:"read"` + EthMaxPriorityFeePerGas func(p0 context.Context) (ethtypes.EthBigInt, error) `perm:"read"` EthNewBlockFilter func(p0 context.Context) (ethtypes.EthFilterID, error) `perm:"write"` @@ -2274,6 +2278,17 @@ func (s *FullNodeStub) EthGetTransactionByHash(p0 context.Context, p1 *ethtypes. return nil, ErrNotSupported } +func (s *FullNodeStruct) EthGetTransactionByHashLimited(p0 context.Context, p1 *ethtypes.EthHash, p2 abi.ChainEpoch) (*ethtypes.EthTx, error) { + if s.Internal.EthGetTransactionByHashLimited == nil { + return nil, ErrNotSupported + } + return s.Internal.EthGetTransactionByHashLimited(p0, p1, p2) +} + +func (s *FullNodeStub) EthGetTransactionByHashLimited(p0 context.Context, p1 *ethtypes.EthHash, p2 abi.ChainEpoch) (*ethtypes.EthTx, error) { + return nil, ErrNotSupported +} + func (s *FullNodeStruct) EthGetTransactionCount(p0 context.Context, p1 ethtypes.EthAddress, p2 string) (ethtypes.EthUint64, error) { if s.Internal.EthGetTransactionCount == nil { return *new(ethtypes.EthUint64), ErrNotSupported @@ -2307,6 +2322,17 @@ func (s *FullNodeStub) EthGetTransactionReceipt(p0 context.Context, p1 ethtypes. return nil, ErrNotSupported } +func (s *FullNodeStruct) EthGetTransactionReceiptLimited(p0 context.Context, p1 ethtypes.EthHash, p2 abi.ChainEpoch) (*EthTxReceipt, error) { + if s.Internal.EthGetTransactionReceiptLimited == nil { + return nil, ErrNotSupported + } + return s.Internal.EthGetTransactionReceiptLimited(p0, p1, p2) +} + +func (s *FullNodeStub) EthGetTransactionReceiptLimited(p0 context.Context, p1 ethtypes.EthHash, p2 abi.ChainEpoch) (*EthTxReceipt, error) { + return nil, ErrNotSupported +} + func (s *FullNodeStruct) EthMaxPriorityFeePerGas(p0 context.Context) (ethtypes.EthBigInt, error) { if s.Internal.EthMaxPriorityFeePerGas == nil { return *new(ethtypes.EthBigInt), ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index aec3cf7b3efcab1a5f8c0a3478f095ee4bdf20af..d15fd5b6deee8f0610a4432f583e1c10407d87a5 100644 GIT binary patch delta 33464 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 575f79a1a7cd242d8649fef67c3dc5c3aa978551..06583cf0624ca65bb3fc9d67ddd6a3cd34bc7e71 100644 GIT binary patch delta 6151 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 ZgTDIk@Z;hC4Fv!I|Nomr(i%eJ0RVR^#V!B< delta 6153 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 bmmhRT>chj2hyNE000960jJJ`@LgN7dHjUxP diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 5ea8edb34ddbc254334f6f50535476feee74f1ff..1a4946ee049ec852b606f727107f93a941c79635 100644 GIT binary patch delta 12496 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 ajGr7CkB?s-|6c$A0RR88!|37a5(5C*Y%U}K delta 12494 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index ab8a27e92c9bf117a0b679f62a3025213f390801..0e0734c8db511306cf9dbc9137cf74f26f2028df 100644 GIT binary patch delta 2881 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 delta 2911 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 JA4RP$0Ra9Ftt9{e diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index aedfbfce0..8d95c7e0c 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -91,9 +91,11 @@ * [EthGetTransactionByBlockHashAndIndex](#EthGetTransactionByBlockHashAndIndex) * [EthGetTransactionByBlockNumberAndIndex](#EthGetTransactionByBlockNumberAndIndex) * [EthGetTransactionByHash](#EthGetTransactionByHash) + * [EthGetTransactionByHashLimited](#EthGetTransactionByHashLimited) * [EthGetTransactionCount](#EthGetTransactionCount) * [EthGetTransactionHashByCid](#EthGetTransactionHashByCid) * [EthGetTransactionReceipt](#EthGetTransactionReceipt) + * [EthGetTransactionReceiptLimited](#EthGetTransactionReceiptLimited) * [EthMaxPriorityFeePerGas](#EthMaxPriorityFeePerGas) * [EthNewBlockFilter](#EthNewBlockFilter) * [EthNewFilter](#EthNewFilter) @@ -2810,6 +2812,45 @@ Response: } ``` +### EthGetTransactionByHashLimited + + +Perms: read + +Inputs: +```json +[ + "0x37690cfec6c1bf4c3b9288c7a5d783e98731e90b0a4c177c2a374c7a9427355e", + 10101 +] +``` + +Response: +```json +{ + "chainId": "0x5", + "nonce": "0x5", + "hash": "0x37690cfec6c1bf4c3b9288c7a5d783e98731e90b0a4c177c2a374c7a9427355e", + "blockHash": "0x37690cfec6c1bf4c3b9288c7a5d783e98731e90b0a4c177c2a374c7a9427355e", + "blockNumber": "0x5", + "transactionIndex": "0x5", + "from": "0x5cbeecf99d3fdb3f25e309cc264f240bb0664031", + "to": "0x5cbeecf99d3fdb3f25e309cc264f240bb0664031", + "value": "0x0", + "type": "0x5", + "input": "0x07", + "gas": "0x5", + "maxFeePerGas": "0x0", + "maxPriorityFeePerGas": "0x0", + "accessList": [ + "0x37690cfec6c1bf4c3b9288c7a5d783e98731e90b0a4c177c2a374c7a9427355e" + ], + "v": "0x0", + "r": "0x0", + "s": "0x0" +} +``` + ### EthGetTransactionCount @@ -2888,6 +2929,54 @@ Response: } ``` +### EthGetTransactionReceiptLimited + + +Perms: read + +Inputs: +```json +[ + "0x37690cfec6c1bf4c3b9288c7a5d783e98731e90b0a4c177c2a374c7a9427355e", + 10101 +] +``` + +Response: +```json +{ + "transactionHash": "0x37690cfec6c1bf4c3b9288c7a5d783e98731e90b0a4c177c2a374c7a9427355e", + "transactionIndex": "0x5", + "blockHash": "0x37690cfec6c1bf4c3b9288c7a5d783e98731e90b0a4c177c2a374c7a9427355e", + "blockNumber": "0x5", + "from": "0x5cbeecf99d3fdb3f25e309cc264f240bb0664031", + "to": "0x5cbeecf99d3fdb3f25e309cc264f240bb0664031", + "root": "0x37690cfec6c1bf4c3b9288c7a5d783e98731e90b0a4c177c2a374c7a9427355e", + "status": "0x5", + "contractAddress": "0x5cbeecf99d3fdb3f25e309cc264f240bb0664031", + "cumulativeGasUsed": "0x5", + "gasUsed": "0x5", + "effectiveGasPrice": "0x0", + "logsBloom": "0x07", + "logs": [ + { + "address": "0x5cbeecf99d3fdb3f25e309cc264f240bb0664031", + "data": "0x07", + "topics": [ + "0x37690cfec6c1bf4c3b9288c7a5d783e98731e90b0a4c177c2a374c7a9427355e" + ], + "removed": true, + "logIndex": "0x5", + "transactionIndex": "0x5", + "transactionHash": "0x37690cfec6c1bf4c3b9288c7a5d783e98731e90b0a4c177c2a374c7a9427355e", + "blockHash": "0x37690cfec6c1bf4c3b9288c7a5d783e98731e90b0a4c177c2a374c7a9427355e", + "blockNumber": "0x5" + } + ], + "type": "0x5" +} +``` + ### EthMaxPriorityFeePerGas diff --git a/gateway/node.go b/gateway/node.go index 494aa2dc8..b263a75bd 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -101,11 +101,11 @@ type TargetAPI interface { EthGetBlockTransactionCountByHash(ctx context.Context, blkHash ethtypes.EthHash) (ethtypes.EthUint64, error) EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthHash, fullTxInfo bool) (ethtypes.EthBlock, error) EthGetBlockByNumber(ctx context.Context, blkNum string, fullTxInfo bool) (ethtypes.EthBlock, error) - EthGetTransactionByHash(ctx context.Context, txHash *ethtypes.EthHash) (*ethtypes.EthTx, error) + EthGetTransactionByHashLimited(ctx context.Context, txHash *ethtypes.EthHash, limit abi.ChainEpoch) (*ethtypes.EthTx, error) EthGetTransactionHashByCid(ctx context.Context, cid cid.Cid) (*ethtypes.EthHash, error) EthGetMessageCidByTransactionHash(ctx context.Context, txHash *ethtypes.EthHash) (*cid.Cid, error) EthGetTransactionCount(ctx context.Context, sender ethtypes.EthAddress, blkOpt string) (ethtypes.EthUint64, error) - EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.EthHash) (*api.EthTxReceipt, error) + EthGetTransactionReceiptLimited(ctx context.Context, txHash ethtypes.EthHash, limit abi.ChainEpoch) (*api.EthTxReceipt, error) EthGetTransactionByBlockHashAndIndex(ctx context.Context, blkHash ethtypes.EthHash, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) EthGetTransactionByBlockNumberAndIndex(ctx context.Context, blkNum ethtypes.EthUint64, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) EthGetCode(ctx context.Context, address ethtypes.EthAddress, blkOpt string) (ethtypes.EthBytes, error) diff --git a/gateway/proxy_eth.go b/gateway/proxy_eth.go index e6f266d55..7e1659f08 100644 --- a/gateway/proxy_eth.go +++ b/gateway/proxy_eth.go @@ -149,7 +149,7 @@ func (gw *Node) EthGetTransactionByHash(ctx context.Context, txHash *ethtypes.Et return nil, err } - return gw.target.EthGetTransactionByHash(ctx, txHash) + return gw.target.EthGetTransactionByHashLimited(ctx, txHash, gw.stateWaitLookbackLimit) } func (gw *Node) EthGetTransactionHashByCid(ctx context.Context, cid cid.Cid) (*ethtypes.EthHash, error) { @@ -185,7 +185,7 @@ func (gw *Node) EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.Et return nil, err } - return gw.target.EthGetTransactionReceipt(ctx, txHash) + return gw.target.EthGetTransactionReceiptLimited(ctx, txHash, gw.stateWaitLookbackLimit) } func (gw *Node) EthGetCode(ctx context.Context, address ethtypes.EthAddress, blkOpt string) (ethtypes.EthBytes, error) { diff --git a/node/impl/full/dummy.go b/node/impl/full/dummy.go index d86b02d4b..a4a125d6f 100644 --- a/node/impl/full/dummy.go +++ b/node/impl/full/dummy.go @@ -8,6 +8,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-jsonrpc" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types/ethtypes" @@ -57,6 +58,10 @@ func (e *EthModuleDummy) EthGetTransactionByHash(ctx context.Context, txHash *et return nil, ErrModuleDisabled } +func (e *EthModuleDummy) EthGetTransactionByHashLimited(ctx context.Context, txHash *ethtypes.EthHash, limit abi.ChainEpoch) (*ethtypes.EthTx, error) { + return nil, ErrModuleDisabled +} + func (e *EthModuleDummy) EthGetTransactionCount(ctx context.Context, sender ethtypes.EthAddress, blkOpt string) (ethtypes.EthUint64, error) { return 0, ErrModuleDisabled } @@ -65,6 +70,10 @@ func (e *EthModuleDummy) EthGetTransactionReceipt(ctx context.Context, txHash et return nil, ErrModuleDisabled } +func (e *EthModuleDummy) EthGetTransactionReceiptLimited(ctx context.Context, txHash ethtypes.EthHash, limit abi.ChainEpoch) (*api.EthTxReceipt, error) { + return nil, ErrModuleDisabled +} + func (e *EthModuleDummy) EthGetTransactionByBlockHashAndIndex(ctx context.Context, blkHash ethtypes.EthHash, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) { return ethtypes.EthTx{}, ErrModuleDisabled } diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 64592a4c6..266ad9ce9 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -54,10 +54,12 @@ type EthModuleAPI interface { EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthHash, fullTxInfo bool) (ethtypes.EthBlock, error) EthGetBlockByNumber(ctx context.Context, blkNum string, fullTxInfo bool) (ethtypes.EthBlock, error) EthGetTransactionByHash(ctx context.Context, txHash *ethtypes.EthHash) (*ethtypes.EthTx, error) + EthGetTransactionByHashLimited(ctx context.Context, txHash *ethtypes.EthHash, limit abi.ChainEpoch) (*ethtypes.EthTx, error) EthGetMessageCidByTransactionHash(ctx context.Context, txHash *ethtypes.EthHash) (*cid.Cid, error) EthGetTransactionHashByCid(ctx context.Context, cid cid.Cid) (*ethtypes.EthHash, error) EthGetTransactionCount(ctx context.Context, sender ethtypes.EthAddress, blkOpt string) (ethtypes.EthUint64, error) EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.EthHash) (*api.EthTxReceipt, error) + EthGetTransactionReceiptLimited(ctx context.Context, txHash ethtypes.EthHash, limit abi.ChainEpoch) (*api.EthTxReceipt, error) EthGetCode(ctx context.Context, address ethtypes.EthAddress, blkOpt string) (ethtypes.EthBytes, error) EthGetStorageAt(ctx context.Context, address ethtypes.EthAddress, position ethtypes.EthBytes, blkParam string) (ethtypes.EthBytes, error) EthGetBalance(ctx context.Context, address ethtypes.EthAddress, blkParam string) (ethtypes.EthBigInt, error) @@ -89,8 +91,6 @@ type EthEventAPI interface { var ( _ EthModuleAPI = *new(api.FullNode) _ EthEventAPI = *new(api.FullNode) - - _ EthModuleAPI = *new(api.Gateway) ) // EthModule provides the default implementation of the standard Ethereum JSON-RPC API. @@ -278,6 +278,11 @@ func (a *EthModule) EthGetBlockByNumber(ctx context.Context, blkParam string, fu } func (a *EthModule) EthGetTransactionByHash(ctx context.Context, txHash *ethtypes.EthHash) (*ethtypes.EthTx, error) { + return a.EthGetTransactionByHashLimited(ctx, txHash, api.LookbackNoLimit) + +} + +func (a *EthModule) EthGetTransactionByHashLimited(ctx context.Context, txHash *ethtypes.EthHash, limit abi.ChainEpoch) (*ethtypes.EthTx, error) { // Ethereum's behavior is to return null when the txHash is invalid, so we use nil to check if txHash is valid if txHash == nil { return nil, nil @@ -409,6 +414,10 @@ func (a *EthModule) EthGetTransactionCount(ctx context.Context, sender ethtypes. } func (a *EthModule) EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.EthHash) (*api.EthTxReceipt, error) { + return a.EthGetTransactionReceiptLimited(ctx, txHash, api.LookbackNoLimit) +} + +func (a *EthModule) EthGetTransactionReceiptLimited(ctx context.Context, txHash ethtypes.EthHash, limit abi.ChainEpoch) (*api.EthTxReceipt, error) { c, err := a.EthTxHashManager.TransactionHashLookup.GetCidFromHash(txHash) if err != nil { log.Debug("could not find transaction hash %s in lookup table", txHash.String()) From 3776ee3b6232fd55fc794fa51fc9ffcda7aa7d7d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 14 Mar 2023 08:33:04 -0700 Subject: [PATCH 113/129] fix: actually apply limit --- node/impl/full/eth.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 266ad9ce9..4f3727b11 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -299,7 +299,7 @@ func (a *EthModule) EthGetTransactionByHashLimited(ctx context.Context, txHash * } // first, try to get the cid from mined transactions - msgLookup, err := a.StateAPI.StateSearchMsg(ctx, types.EmptyTSK, c, api.LookbackNoLimit, true) + msgLookup, err := a.StateAPI.StateSearchMsg(ctx, types.EmptyTSK, c, limit, true) if err == nil && msgLookup != nil { tx, err := newEthTxFromMessageLookup(ctx, msgLookup, -1, a.Chain, a.StateAPI) if err == nil { @@ -428,7 +428,7 @@ func (a *EthModule) EthGetTransactionReceiptLimited(ctx context.Context, txHash c = txHash.ToCid() } - msgLookup, err := a.StateAPI.StateSearchMsg(ctx, types.EmptyTSK, c, api.LookbackNoLimit, true) + msgLookup, err := a.StateAPI.StateSearchMsg(ctx, types.EmptyTSK, c, limit, true) if err != nil || msgLookup == nil { return nil, nil } From 17274e72da3491156233ef0b2c1dea65387595d5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 14 Mar 2023 08:45:56 -0700 Subject: [PATCH 114/129] feat: expose limited apis on the gateway --- api/api_gateway.go | 2 ++ api/proxy_gen.go | 26 ++++++++++++++++++++++++++ build/openrpc/full.json.gz | Bin 33805 -> 33808 bytes build/openrpc/gateway.json.gz | Bin 9078 -> 9288 bytes build/openrpc/miner.json.gz | Bin 15865 -> 15860 bytes build/openrpc/worker.json.gz | Bin 5223 -> 5226 bytes gateway/proxy_eth.go | 24 ++++++++++++++++++++++-- node/impl/full/eth.go | 2 ++ 8 files changed, 52 insertions(+), 2 deletions(-) diff --git a/api/api_gateway.go b/api/api_gateway.go index cac28d2a0..4389fc34b 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -85,10 +85,12 @@ type Gateway interface { EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthHash, fullTxInfo bool) (ethtypes.EthBlock, error) EthGetBlockByNumber(ctx context.Context, blkNum string, fullTxInfo bool) (ethtypes.EthBlock, error) EthGetTransactionByHash(ctx context.Context, txHash *ethtypes.EthHash) (*ethtypes.EthTx, error) + EthGetTransactionByHashLimited(ctx context.Context, txHash *ethtypes.EthHash, limit abi.ChainEpoch) (*ethtypes.EthTx, error) EthGetTransactionHashByCid(ctx context.Context, cid cid.Cid) (*ethtypes.EthHash, error) EthGetMessageCidByTransactionHash(ctx context.Context, txHash *ethtypes.EthHash) (*cid.Cid, error) EthGetTransactionCount(ctx context.Context, sender ethtypes.EthAddress, blkOpt string) (ethtypes.EthUint64, error) EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.EthHash) (*EthTxReceipt, error) + EthGetTransactionReceiptLimited(ctx context.Context, txHash ethtypes.EthHash, limit abi.ChainEpoch) (*EthTxReceipt, error) EthGetCode(ctx context.Context, address ethtypes.EthAddress, blkOpt string) (ethtypes.EthBytes, error) EthGetStorageAt(ctx context.Context, address ethtypes.EthAddress, position ethtypes.EthBytes, blkParam string) (ethtypes.EthBytes, error) EthGetBalance(ctx context.Context, address ethtypes.EthAddress, blkParam string) (ethtypes.EthBigInt, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index dbae138a9..843471381 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -698,12 +698,16 @@ type GatewayMethods struct { EthGetTransactionByHash func(p0 context.Context, p1 *ethtypes.EthHash) (*ethtypes.EthTx, error) `` + EthGetTransactionByHashLimited func(p0 context.Context, p1 *ethtypes.EthHash, p2 abi.ChainEpoch) (*ethtypes.EthTx, error) `` + EthGetTransactionCount func(p0 context.Context, p1 ethtypes.EthAddress, p2 string) (ethtypes.EthUint64, error) `` EthGetTransactionHashByCid func(p0 context.Context, p1 cid.Cid) (*ethtypes.EthHash, error) `` EthGetTransactionReceipt func(p0 context.Context, p1 ethtypes.EthHash) (*EthTxReceipt, error) `` + EthGetTransactionReceiptLimited func(p0 context.Context, p1 ethtypes.EthHash, p2 abi.ChainEpoch) (*EthTxReceipt, error) `` + EthMaxPriorityFeePerGas func(p0 context.Context) (ethtypes.EthBigInt, error) `` EthNewBlockFilter func(p0 context.Context) (ethtypes.EthFilterID, error) `` @@ -4456,6 +4460,17 @@ func (s *GatewayStub) EthGetTransactionByHash(p0 context.Context, p1 *ethtypes.E return nil, ErrNotSupported } +func (s *GatewayStruct) EthGetTransactionByHashLimited(p0 context.Context, p1 *ethtypes.EthHash, p2 abi.ChainEpoch) (*ethtypes.EthTx, error) { + if s.Internal.EthGetTransactionByHashLimited == nil { + return nil, ErrNotSupported + } + return s.Internal.EthGetTransactionByHashLimited(p0, p1, p2) +} + +func (s *GatewayStub) EthGetTransactionByHashLimited(p0 context.Context, p1 *ethtypes.EthHash, p2 abi.ChainEpoch) (*ethtypes.EthTx, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) EthGetTransactionCount(p0 context.Context, p1 ethtypes.EthAddress, p2 string) (ethtypes.EthUint64, error) { if s.Internal.EthGetTransactionCount == nil { return *new(ethtypes.EthUint64), ErrNotSupported @@ -4489,6 +4504,17 @@ func (s *GatewayStub) EthGetTransactionReceipt(p0 context.Context, p1 ethtypes.E return nil, ErrNotSupported } +func (s *GatewayStruct) EthGetTransactionReceiptLimited(p0 context.Context, p1 ethtypes.EthHash, p2 abi.ChainEpoch) (*EthTxReceipt, error) { + if s.Internal.EthGetTransactionReceiptLimited == nil { + return nil, ErrNotSupported + } + return s.Internal.EthGetTransactionReceiptLimited(p0, p1, p2) +} + +func (s *GatewayStub) EthGetTransactionReceiptLimited(p0 context.Context, p1 ethtypes.EthHash, p2 abi.ChainEpoch) (*EthTxReceipt, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) EthMaxPriorityFeePerGas(p0 context.Context) (ethtypes.EthBigInt, error) { if s.Internal.EthMaxPriorityFeePerGas == nil { return *new(ethtypes.EthBigInt), ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index d15fd5b6deee8f0610a4432f583e1c10407d87a5..79f32fe149fc6432b9b8028d9838927d4134de8e 100644 GIT binary patch delta 28530 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 ksz058kBoB#j- delta 28618 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 UU;p|40RRC1|LGGrNfgQk08)Xyr~m)} diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 06583cf0624ca65bb3fc9d67ddd6a3cd34bc7e71..a04b9b814ed21102108bd800089bbde7275bd04e 100644 GIT binary patch literal 9288 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 literal 9078 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%0Arbba{vGU diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 1a4946ee049ec852b606f727107f93a941c79635..58475e05dbdaa3f2045561c96b2928df2d9c9756 100644 GIT binary patch delta 12113 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 H>JkG0q0eNK delta 12117 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 Lvcu@%>JkG0?KpZ4 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 0e0734c8db511306cf9dbc9137cf74f26f2028df..6c3616074c8c084ee49ca617f22da08f31316efb 100644 GIT binary patch delta 3856 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 S*8d*>0RR7skdo`IE&%|7)NX44 delta 3853 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 P00960{}HDHtu6ro3_)}M diff --git a/gateway/proxy_eth.go b/gateway/proxy_eth.go index 7e1659f08..3342875c3 100644 --- a/gateway/proxy_eth.go +++ b/gateway/proxy_eth.go @@ -145,11 +145,21 @@ func (gw *Node) EthGetBlockByNumber(ctx context.Context, blkNum string, fullTxIn } func (gw *Node) EthGetTransactionByHash(ctx context.Context, txHash *ethtypes.EthHash) (*ethtypes.EthTx, error) { + return gw.target.EthGetTransactionByHashLimited(ctx, txHash, api.LookbackNoLimit) +} + +func (gw *Node) EthGetTransactionByHashLimited(ctx context.Context, txHash *ethtypes.EthHash, limit abi.ChainEpoch) (*ethtypes.EthTx, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return nil, err } + if limit == api.LookbackNoLimit { + limit = gw.stateWaitLookbackLimit + } + if gw.stateWaitLookbackLimit != api.LookbackNoLimit && limit > gw.stateWaitLookbackLimit { + limit = gw.stateWaitLookbackLimit + } - return gw.target.EthGetTransactionByHashLimited(ctx, txHash, gw.stateWaitLookbackLimit) + return gw.target.EthGetTransactionByHashLimited(ctx, txHash, limit) } func (gw *Node) EthGetTransactionHashByCid(ctx context.Context, cid cid.Cid) (*ethtypes.EthHash, error) { @@ -181,11 +191,21 @@ func (gw *Node) EthGetTransactionCount(ctx context.Context, sender ethtypes.EthA } func (gw *Node) EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.EthHash) (*api.EthTxReceipt, error) { + return gw.EthGetTransactionReceiptLimited(ctx, txHash, api.LookbackNoLimit) +} + +func (gw *Node) EthGetTransactionReceiptLimited(ctx context.Context, txHash ethtypes.EthHash, limit abi.ChainEpoch) (*api.EthTxReceipt, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return nil, err } + if limit == api.LookbackNoLimit { + limit = gw.stateWaitLookbackLimit + } + if gw.stateWaitLookbackLimit != api.LookbackNoLimit && limit > gw.stateWaitLookbackLimit { + limit = gw.stateWaitLookbackLimit + } - return gw.target.EthGetTransactionReceiptLimited(ctx, txHash, gw.stateWaitLookbackLimit) + return gw.target.EthGetTransactionReceiptLimited(ctx, txHash, limit) } func (gw *Node) EthGetCode(ctx context.Context, address ethtypes.EthAddress, blkOpt string) (ethtypes.EthBytes, error) { diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 4f3727b11..4470db1c8 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -91,6 +91,8 @@ type EthEventAPI interface { var ( _ EthModuleAPI = *new(api.FullNode) _ EthEventAPI = *new(api.FullNode) + + _ EthModuleAPI = *new(api.Gateway) ) // EthModule provides the default implementation of the standard Ethereum JSON-RPC API. From 1676d5148436136c74afc9dcc050106750e5aa42 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 16 Mar 2023 17:17:26 +0200 Subject: [PATCH 115/129] shed: expand homedir in repo path for msgindex tools --- cmd/lotus-shed/msgindex.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-shed/msgindex.go b/cmd/lotus-shed/msgindex.go index d2cb2cf3d..fae733bbe 100644 --- a/cmd/lotus-shed/msgindex.go +++ b/cmd/lotus-shed/msgindex.go @@ -7,6 +7,7 @@ import ( "github.com/ipfs/go-cid" _ "github.com/mattn/go-sqlite3" + "github.com/mitchellh/go-homedir" "github.com/urfave/cli/v2" "golang.org/x/xerrors" @@ -64,7 +65,12 @@ var msgindexBackfillCmd = &cli.Command{ } epochs := cctx.Int("epochs") - dbPath := path.Join(cctx.String("repo"), "sqlite", "msgindex.db") + basePath, err := homedir.Expand(cctx.String("repo")) + if err != nil { + return err + } + + dbPath := path.Join(basePath, "sqlite", "msgindex.db") db, err := sql.Open("sqlite3", dbPath) if err != nil { return err @@ -176,7 +182,12 @@ var msgindexPruneCmd = &cli.Command{ } } - dbPath := path.Join(cctx.String("repo"), "sqlite", "msgindex.db") + basePath, err := homedir.Expand(cctx.String("repo")) + if err != nil { + return err + } + + dbPath := path.Join(basePath, "sqlite", "msgindex.db") db, err := sql.Open("sqlite3", dbPath) if err != nil { return err From 91fccc421ae87623b64617d1c3e0ec5fde7f4a4b Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 16 Mar 2023 17:25:20 +0200 Subject: [PATCH 116/129] add ON CONFLICT REPLACE clause in messages --- chain/index/msgindex.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index 0140b3e74..aa23b4e4d 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -26,7 +26,7 @@ var log = logging.Logger("msgindex") var dbName = "msgindex.db" var dbDefs = []string{ `CREATE TABLE IF NOT EXISTS messages ( - cid VARCHAR(80) PRIMARY KEY, + cid VARCHAR(80) PRIMARY KEY ON CONFLICT REPLACE, tipset_cid VARCHAR(80) NOT NULL, epoch INTEGER NOT NULL )`, From 8bceaadda8b97e8591b673d15904dd57856e98c5 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 16 Mar 2023 17:32:06 +0200 Subject: [PATCH 117/129] chain errors in searchForIndexedMsg --- chain/stmgr/searchwait.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chain/stmgr/searchwait.go b/chain/stmgr/searchwait.go index e9feeec12..2d1262867 100644 --- a/chain/stmgr/searchwait.go +++ b/chain/stmgr/searchwait.go @@ -176,7 +176,7 @@ func (sm *StateManager) SearchForMessage(ctx context.Context, head *types.TipSet func (sm *StateManager) searchForIndexedMsg(ctx context.Context, mcid cid.Cid, m types.ChainMsg) (*types.TipSet, *types.MessageReceipt, cid.Cid, error) { minfo, err := sm.msgIndex.GetMsgInfo(ctx, mcid) if err != nil { - return nil, nil, cid.Undef, err + return nil, nil, cid.Undef, xerrors.Errorf("error looking up message in index: %w", err) } // check the height against the current tipset; minimum execution confidence requires that the @@ -190,7 +190,7 @@ func (sm *StateManager) searchForIndexedMsg(ctx context.Context, mcid cid.Cid, m // TODO optimization: the index should have it implicitly so we can return it in the msginfo. xts, err := sm.cs.GetTipsetByHeight(ctx, minfo.Epoch+1, curTs, false) if err != nil { - return nil, nil, cid.Undef, err + return nil, nil, cid.Undef, xerrors.Errorf("error looking up execution tipset: %w", err) } // check that it is indeed the parent of the inclusion tipset @@ -205,7 +205,7 @@ func (sm *StateManager) searchForIndexedMsg(ctx context.Context, mcid cid.Cid, m } r, foundMsg, err := sm.tipsetExecutedMessage(ctx, xts, mcid, m.VMMessage(), false) - return xts, r, foundMsg, err + return xts, r, foundMsg, xerrors.Errorf("error in tipstExecutedMessage: %w", err) } // searchBackForMsg searches up to limit tipsets backwards from the given From 90c4763e0074727715760e9119e07b987ce0e4a8 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 16 Mar 2023 17:33:12 +0200 Subject: [PATCH 118/129] fix typos --- chain/index/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/index/interface.go b/chain/index/interface.go index 8907dc09d..f875a94bf 100644 --- a/chain/index/interface.go +++ b/chain/index/interface.go @@ -16,9 +16,9 @@ var ErrClosed = errors.New("index closed") type MsgInfo struct { // the message this record refers to Message cid.Cid - // the tipset where this messages was included + // the tipset where this message was included TipSet cid.Cid - // the epoch whre this message was included + // the epoch where this message was included Epoch abi.ChainEpoch } From ff22a462533c7b87f5245633a5b121339b11cfc1 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 16 Mar 2023 17:38:46 +0200 Subject: [PATCH 119/129] complain if head change processing is building backlog --- chain/index/msgindex.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index aa23b4e4d..16b47616f 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -290,9 +290,14 @@ func (x *msgIndex) onHeadChange(rev, app []*types.TipSet) error { // do it in the background to avoid blocking head change processing x.mx.Lock() x.pend = append(x.pend, headChange{rev: rev, app: app}) - // TODO log loudly if this is building backlog (it shouldn't but better be safe on this) + pendLen := len(x.pend) x.mx.Unlock() + // complain loudly if this is building backlog + if pendLen > 10 { + log.Warnf("message index head change processing is building backlog: %d pending head changes", pendLen) + } + select { case x.sema <- struct{}{}: default: From 1e7f5c6a1e8e23de27ac006ee84e1feb0dbc8b05 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 16 Mar 2023 17:41:06 +0200 Subject: [PATCH 120/129] shut down the index if there is an error during head processing --- chain/index/msgindex.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index 16b47616f..534a11cd4 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -314,8 +314,11 @@ func (x *msgIndex) background(ctx context.Context) { case <-x.sema: err := x.processHeadChanges(ctx) if err != nil { - // TODO should we shut down the index altogether? we just log for now. - log.Errorf("error processing head change notifications: %s", err) + // we can't rely on an inconsistent index, so shut it down. + log.Errorf("error processing head change notifications: %s; shutting down message index", err) + if err2 := x.Close(); err2 != nil { + log.Errorf("error shutting down index: %s", err2) + } } case <-ctx.Done(): From 9c087cc52c0e059e4944870c8619399bb33dd7fe Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 16 Mar 2023 17:42:09 +0200 Subject: [PATCH 121/129] second error variable name to avoid confusing they yushie. --- chain/index/msgindex.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chain/index/msgindex.go b/chain/index/msgindex.go index 534a11cd4..d5c6a252e 100644 --- a/chain/index/msgindex.go +++ b/chain/index/msgindex.go @@ -341,8 +341,8 @@ func (x *msgIndex) processHeadChanges(ctx context.Context) error { for _, hc := range pend { for _, ts := range hc.rev { if err := x.doRevert(ctx, tx, ts); err != nil { - if err := tx.Rollback(); err != nil { - log.Errorf("error rolling back transaction: %s", err) + if err2 := tx.Rollback(); err2 != nil { + log.Errorf("error rolling back transaction: %s", err2) } return xerrors.Errorf("error reverting %s: %w", ts, err) } @@ -350,8 +350,8 @@ func (x *msgIndex) processHeadChanges(ctx context.Context) error { for _, ts := range hc.app { if err := x.doApply(ctx, tx, ts); err != nil { - if err := tx.Rollback(); err != nil { - log.Errorf("error rolling back transaction: %s", err) + if err2 := tx.Rollback(); err2 != nil { + log.Errorf("error rolling back transaction: %s", err2) } return xerrors.Errorf("error applying %s: %w", ts, err) } From ef2f2b0f89e76941b52a9746142f6e5f0b207348 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 16 Mar 2023 17:43:56 +0200 Subject: [PATCH 122/129] reword funny comment --- chain/stmgr/searchwait.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/stmgr/searchwait.go b/chain/stmgr/searchwait.go index 2d1262867..5d232d105 100644 --- a/chain/stmgr/searchwait.go +++ b/chain/stmgr/searchwait.go @@ -193,7 +193,7 @@ func (sm *StateManager) searchForIndexedMsg(ctx context.Context, mcid cid.Cid, m return nil, nil, cid.Undef, xerrors.Errorf("error looking up execution tipset: %w", err) } - // check that it is indeed the parent of the inclusion tipset + // check that the parent of the execution index is indeed the inclusion tipset parent := xts.Parents() parentCid, err := parent.Cid() if err != nil { From 3710768910b07fd4d082c6e47c5bf9790f2a4f41 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 16 Mar 2023 17:45:16 +0200 Subject: [PATCH 123/129] add TODO for WaitForMessage to use the index --- chain/stmgr/searchwait.go | 1 + 1 file changed, 1 insertion(+) diff --git a/chain/stmgr/searchwait.go b/chain/stmgr/searchwait.go index 5d232d105..89d0b252f 100644 --- a/chain/stmgr/searchwait.go +++ b/chain/stmgr/searchwait.go @@ -19,6 +19,7 @@ import ( // happened, with an optional limit to how many epochs it will search. It guarantees that the message has been on // chain for at least confidence epochs without being reverted before returning. func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*types.TipSet, *types.MessageReceipt, cid.Cid, error) { + // TODO use the index to speed this up. ctx, cancel := context.WithCancel(ctx) defer cancel() From 883bbf8701b69d5f96ee61259cb913d972cb3819 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 16 Mar 2023 17:51:28 +0200 Subject: [PATCH 124/129] add sanity check in SearchForIndexedMsg call site Check that receipt is non nil, and the message was indeed found. --- chain/stmgr/searchwait.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/chain/stmgr/searchwait.go b/chain/stmgr/searchwait.go index 89d0b252f..6b9adff71 100644 --- a/chain/stmgr/searchwait.go +++ b/chain/stmgr/searchwait.go @@ -151,7 +151,17 @@ func (sm *StateManager) SearchForMessage(ctx context.Context, head *types.TipSet switch { case err == nil: - return fts, r, foundMsg, nil + if r != nil && foundMsg.Defined() { + return fts, r, foundMsg, nil + } + + // debug log this, it's noteworthy + if r == nil { + log.Debugf("missing receipt for message in index for %s", mcid) + } + if !foundMsg.Defined() { + log.Debugf("message %s not found", mcid) + } case errors.Is(err, index.ErrNotFound): // ok for the index to have incomplete data From 2207ab3c937adf08d81b1c01f38f0e246bf72e0e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 16 Mar 2023 08:53:52 -0700 Subject: [PATCH 125/129] fix: eth: handle a potential divide by zero in receipt handling This isn't really possible to hit on-chain at this piont (message won't be accepted) but we might as well be extra careful. fixes #10471 --- node/impl/full/eth.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 26fed34b0..14812e4de 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -2165,7 +2165,10 @@ func newEthTxReceipt(ctx context.Context, tx ethtypes.EthTx, lookup *api.MsgLook gasOutputs := vm.ComputeGasOutputs(lookup.Receipt.GasUsed, int64(tx.Gas), baseFee, big.Int(tx.MaxFeePerGas), big.Int(tx.MaxPriorityFeePerGas), true) totalSpent := big.Sum(gasOutputs.BaseFeeBurn, gasOutputs.MinerTip, gasOutputs.OverEstimationBurn) - effectiveGasPrice := big.Div(totalSpent, big.NewInt(lookup.Receipt.GasUsed)) + effectiveGasPrice := big.Zero() + if lookup.Receipt.GasUsed > 0 { + effectiveGasPrice = big.Div(totalSpent, big.NewInt(lookup.Receipt.GasUsed)) + } receipt.EffectiveGasPrice = ethtypes.EthBigInt(effectiveGasPrice) if receipt.To == nil && lookup.Receipt.ExitCode.IsSuccess() { From 252387768d85d05e264427bb01a20d05819de0a6 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Fri, 17 Mar 2023 09:29:18 -0600 Subject: [PATCH 126/129] Don't enforce walking receipt tree during compaction --- 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 12d0ff899..a77236fbf 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -983,7 +983,7 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp } atomic.AddInt64(szWalk, sz) - sz, err := s.walkObject(hdr.ParentMessageReceipts, visitor, fHot) + sz, err := s.walkObjectIncomplete(hdr.ParentMessageReceipts, visitor, fHot, stopWalk) if err != nil { return xerrors.Errorf("error walking message receipts (cid: %s): %w", hdr.ParentMessageReceipts, err) } From 2b3a86eefb352b108e1be366b7ecffacdd367a4d Mon Sep 17 00:00:00 2001 From: ZenGround0 <5515260+ZenGround0@users.noreply.github.com> Date: Mon, 20 Mar 2023 10:54:30 -0400 Subject: [PATCH 127/129] Demote now common logs (#10516) Co-authored-by: zenground0 --- 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 a77236fbf..e5cfec0e4 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -452,7 +452,7 @@ func (s *SplitStore) doTxnProtect(root cid.Cid, markSet MarkSet) (int64, error) }, func(c cid.Cid) error { if s.txnMissing != nil { - log.Warnf("missing object reference %s in %s", c, root) + log.Debugf("missing object reference %s in %s", c, root) s.txnRefsMx.Lock() s.txnMissing[c] = struct{}{} s.txnRefsMx.Unlock() From 43da1084669fa1d91bd0b1bb22b4d459b477ba4b Mon Sep 17 00:00:00 2001 From: ZenGround0 <5515260+ZenGround0@users.noreply.github.com> Date: Mon, 20 Mar 2023 12:19:14 -0400 Subject: [PATCH 128/129] feat:config:force existing users to opt into new defaults (#10488) * Config default does not comment out EnableSplitstore * Loadability check * Remove test used for debugging * regexp for properly safe check that config is set * regexp for safely matching the EnableSpitstore field in the config * Add instructions for undeleting config and remind users to set splitstore false for full archive * UpdateConfig small docs and functional opts * make gen * Lint * Fix * nil pointer check on validate * Unit testing of EnableSplitstore cases * Address Review --------- Co-authored-by: zenground0 --- cmd/lotus-miner/config.go | 4 +- cmd/lotus-miner/init_restore.go | 2 +- cmd/lotus/backup.go | 2 +- cmd/lotus/config.go | 4 +- documentation/en/default-lotus-config.toml | 2 +- node/config/load.go | 131 +++++++++++++++++++-- node/config/load_test.go | 81 ++++++++++++- node/repo/fsrepo.go | 10 +- 8 files changed, 216 insertions(+), 20 deletions(-) diff --git a/cmd/lotus-miner/config.go b/cmd/lotus-miner/config.go index 652426583..b7af1b2e5 100644 --- a/cmd/lotus-miner/config.go +++ b/cmd/lotus-miner/config.go @@ -31,7 +31,7 @@ var configDefaultCmd = &cli.Command{ Action: func(cctx *cli.Context) error { c := config.DefaultStorageMiner() - cb, err := config.ConfigUpdate(c, nil, !cctx.Bool("no-comment")) + cb, err := config.ConfigUpdate(c, nil, config.Commented(!cctx.Bool("no-comment"))) if err != nil { return err } @@ -83,7 +83,7 @@ var configUpdateCmd = &cli.Command{ cfgDef := config.DefaultStorageMiner() - updated, err := config.ConfigUpdate(cfgNode, cfgDef, !cctx.Bool("no-comment")) + updated, err := config.ConfigUpdate(cfgNode, cfgDef, config.Commented(!cctx.Bool("no-comment"))) if err != nil { return err } diff --git a/cmd/lotus-miner/init_restore.go b/cmd/lotus-miner/init_restore.go index 618825a27..f3ab9d04a 100644 --- a/cmd/lotus-miner/init_restore.go +++ b/cmd/lotus-miner/init_restore.go @@ -189,7 +189,7 @@ func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfi return } - ff, err := config.FromFile(cf, rcfg) + ff, err := config.FromFile(cf, config.SetDefault(func() (interface{}, error) { return rcfg, nil })) if err != nil { cerr = xerrors.Errorf("loading config: %w", err) return diff --git a/cmd/lotus/backup.go b/cmd/lotus/backup.go index 4bdd21322..efbac3e2b 100644 --- a/cmd/lotus/backup.go +++ b/cmd/lotus/backup.go @@ -66,7 +66,7 @@ func restore(cctx *cli.Context, r repo.Repo) error { return } - ff, err := config.FromFile(cf, rcfg) + ff, err := config.FromFile(cf, config.SetDefault(func() (interface{}, error) { return rcfg, nil })) if err != nil { cerr = xerrors.Errorf("loading config: %w", err) return diff --git a/cmd/lotus/config.go b/cmd/lotus/config.go index fcb7e2b08..4b323bfb2 100644 --- a/cmd/lotus/config.go +++ b/cmd/lotus/config.go @@ -31,7 +31,7 @@ var configDefaultCmd = &cli.Command{ Action: func(cctx *cli.Context) error { c := config.DefaultFullNode() - cb, err := config.ConfigUpdate(c, nil, !cctx.Bool("no-comment")) + cb, err := config.ConfigUpdate(c, nil, config.Commented(!cctx.Bool("no-comment")), config.DefaultKeepUncommented()) if err != nil { return err } @@ -83,7 +83,7 @@ var configUpdateCmd = &cli.Command{ cfgDef := config.DefaultFullNode() - updated, err := config.ConfigUpdate(cfgNode, cfgDef, !cctx.Bool("no-comment")) + updated, err := config.ConfigUpdate(cfgNode, cfgDef, config.Commented(!cctx.Bool("no-comment")), config.DefaultKeepUncommented()) if err != nil { return err } diff --git a/documentation/en/default-lotus-config.toml b/documentation/en/default-lotus-config.toml index c51321714..4e6cba4a3 100644 --- a/documentation/en/default-lotus-config.toml +++ b/documentation/en/default-lotus-config.toml @@ -191,7 +191,7 @@ [Chainstore] # type: bool # env var: LOTUS_CHAINSTORE_ENABLESPLITSTORE - #EnableSplitstore = true + EnableSplitstore = true [Chainstore.Splitstore] # ColdStoreType specifies the type of the coldstore. diff --git a/node/config/load.go b/node/config/load.go index 6f5731ea1..29cb15d27 100644 --- a/node/config/load.go +++ b/node/config/load.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "io" + "io/ioutil" "os" "reflect" "regexp" @@ -17,17 +18,46 @@ import ( // FromFile loads config from a specified file overriding defaults specified in // the def parameter. If file does not exist or is empty defaults are assumed. -func FromFile(path string, def interface{}) (interface{}, error) { +func FromFile(path string, opts ...LoadCfgOpt) (interface{}, error) { + var loadOpts cfgLoadOpts + var err error + for _, opt := range opts { + if err = opt(&loadOpts); err != nil { + return nil, xerrors.Errorf("failed to apply load cfg option: %w", err) + } + } + var def interface{} + if loadOpts.defaultCfg != nil { + def, err = loadOpts.defaultCfg() + if err != nil { + return nil, xerrors.Errorf("no config found") + } + } + // check for loadability file, err := os.Open(path) switch { case os.IsNotExist(err): + if loadOpts.canFallbackOnDefault != nil { + if err := loadOpts.canFallbackOnDefault(); err != nil { + return nil, err + } + } return def, nil case err != nil: return nil, err } - - defer file.Close() //nolint:errcheck // The file is RO - return FromReader(file, def) + defer file.Close() //nolint:errcheck,staticcheck // The file is RO + cfgBs, err := ioutil.ReadAll(file) + if err != nil { + return nil, xerrors.Errorf("failed to read config for validation checks %w", err) + } + buf := bytes.NewBuffer(cfgBs) + if loadOpts.validate != nil { + if err := loadOpts.validate(buf.String()); err != nil { + return nil, xerrors.Errorf("config failed validation: %w", err) + } + } + return FromReader(buf, def) } // FromReader loads config from a reader instance. @@ -46,7 +76,88 @@ func FromReader(reader io.Reader, def interface{}) (interface{}, error) { return cfg, nil } -func ConfigUpdate(cfgCur, cfgDef interface{}, comment bool) ([]byte, error) { +type cfgLoadOpts struct { + defaultCfg func() (interface{}, error) + canFallbackOnDefault func() error + validate func(string) error +} + +type LoadCfgOpt func(opts *cfgLoadOpts) error + +func SetDefault(f func() (interface{}, error)) LoadCfgOpt { + return func(opts *cfgLoadOpts) error { + opts.defaultCfg = f + return nil + } +} + +func SetCanFallbackOnDefault(f func() error) LoadCfgOpt { + return func(opts *cfgLoadOpts) error { + opts.canFallbackOnDefault = f + return nil + } +} + +func SetValidate(f func(string) error) LoadCfgOpt { + return func(opts *cfgLoadOpts) error { + opts.validate = f + return nil + } +} + +func NoDefaultForSplitstoreTransition() error { + return xerrors.Errorf("FullNode config not found and fallback to default disallowed while we transition to splitstore discard default. Use `lotus config default` to set this repo up with a default config. Be sure to set `EnableSplitstore` to `false` if you are running a full archive node") +} + +// Match the EnableSplitstore field +func MatchEnableSplitstoreField(s string) bool { + enableSplitstoreRx := regexp.MustCompile(`(?m)^\s*EnableSplitstore\s*=`) + return enableSplitstoreRx.MatchString(s) +} + +func ValidateSplitstoreSet(cfgRaw string) error { + if !MatchEnableSplitstoreField(cfgRaw) { + return xerrors.Errorf("Config does not contain explicit set of EnableSplitstore field, refusing to load. Please explicitly set EnableSplitstore. Set it to false if you are running a full archival node") + } + return nil +} + +type cfgUpdateOpts struct { + comment bool + keepUncommented func(string) bool +} + +// UpdateCfgOpt is a functional option for updating the config +type UpdateCfgOpt func(opts *cfgUpdateOpts) error + +// KeepUncommented sets a function for matching default valeus that should remain uncommented during +// a config update that comments out default values. +func KeepUncommented(f func(string) bool) UpdateCfgOpt { + return func(opts *cfgUpdateOpts) error { + opts.keepUncommented = f + return nil + } +} + +func Commented(commented bool) UpdateCfgOpt { + return func(opts *cfgUpdateOpts) error { + opts.comment = commented + return nil + } +} + +func DefaultKeepUncommented() UpdateCfgOpt { + return KeepUncommented(MatchEnableSplitstoreField) +} + +// ConfigUpdate takes in a config and a default config and optionally comments out default values +func ConfigUpdate(cfgCur, cfgDef interface{}, opts ...UpdateCfgOpt) ([]byte, error) { + var updateOpts cfgUpdateOpts + for _, opt := range opts { + if err := opt(&updateOpts); err != nil { + return nil, xerrors.Errorf("failed to apply update cfg option to ConfigUpdate's config: %w", err) + } + } var nodeStr, defStr string if cfgDef != nil { buf := new(bytes.Buffer) @@ -68,7 +179,7 @@ func ConfigUpdate(cfgCur, cfgDef interface{}, comment bool) ([]byte, error) { nodeStr = buf.String() } - if comment { + if updateOpts.comment { // create a map of default lines, so we can comment those out later defLines := strings.Split(defStr, "\n") defaults := map[string]struct{}{} @@ -130,8 +241,10 @@ func ConfigUpdate(cfgCur, cfgDef interface{}, comment bool) ([]byte, error) { } } - // if there is the same line in the default config, comment it out it output - if _, found := defaults[strings.TrimSpace(nodeLines[i])]; (cfgDef == nil || found) && len(line) > 0 { + // filter lines from options + optsFilter := updateOpts.keepUncommented != nil && updateOpts.keepUncommented(line) + // if there is the same line in the default config, comment it out in output + if _, found := defaults[strings.TrimSpace(nodeLines[i])]; (cfgDef == nil || found) && len(line) > 0 && !optsFilter { line = pad + "#" + line[len(pad):] } outLines = append(outLines, line) @@ -159,5 +272,5 @@ func ConfigUpdate(cfgCur, cfgDef interface{}, comment bool) ([]byte, error) { } func ConfigComment(t interface{}) ([]byte, error) { - return ConfigUpdate(t, nil, true) + return ConfigUpdate(t, nil, Commented(true), DefaultKeepUncommented()) } diff --git a/node/config/load_test.go b/node/config/load_test.go index 17e185be2..cab5268df 100644 --- a/node/config/load_test.go +++ b/node/config/load_test.go @@ -11,19 +11,21 @@ import ( "github.com/stretchr/testify/assert" ) +func fullNodeDefault() (interface{}, error) { return DefaultFullNode(), nil } + func TestDecodeNothing(t *testing.T) { //stm: @NODE_CONFIG_LOAD_FILE_002 assert := assert.New(t) { - cfg, err := FromFile(os.DevNull, DefaultFullNode()) + cfg, err := FromFile(os.DevNull, SetDefault(fullNodeDefault)) assert.Nil(err, "error should be nil") assert.Equal(DefaultFullNode(), cfg, "config from empty file should be the same as default") } { - cfg, err := FromFile("./does-not-exist.toml", DefaultFullNode()) + cfg, err := FromFile("./does-not-exist.toml", SetDefault(fullNodeDefault)) assert.Nil(err, "error should be nil") assert.Equal(DefaultFullNode(), cfg, "config from not exisiting file should be the same as default") @@ -58,9 +60,82 @@ func TestParitalConfig(t *testing.T) { assert.NoError(err, "closing tmp file should not error") defer os.Remove(fname) //nolint:errcheck - cfg, err := FromFile(fname, DefaultFullNode()) + cfg, err := FromFile(fname, SetDefault(fullNodeDefault)) assert.Nil(err, "error should be nil") assert.Equal(expected, cfg, "config from reader should contain changes") } } + +func TestValidateSplitstoreSet(t *testing.T) { + cfgSet := ` + EnableSplitstore = false + ` + assert.NoError(t, ValidateSplitstoreSet(cfgSet)) + cfgSloppySet := ` + EnableSplitstore = true + ` + assert.NoError(t, ValidateSplitstoreSet(cfgSloppySet)) + + // Missing altogether + cfgMissing := ` + [Chainstore] + # type: bool + # env var: LOTUS_CHAINSTORE_ENABLESPLITSTORE + # oops its mising + + [Chainstore.Splitstore] + ColdStoreType = "discard" + ` + err := ValidateSplitstoreSet(cfgMissing) + assert.Error(t, err) + cfgCommentedOut := ` + # EnableSplitstore = false + ` + err = ValidateSplitstoreSet(cfgCommentedOut) + assert.Error(t, err) +} + +// Default config keeps EnableSplitstore field uncommented +func TestKeepEnableSplitstoreUncommented(t *testing.T) { + cfgStr, err := ConfigComment(DefaultFullNode()) + assert.NoError(t, err) + assert.True(t, MatchEnableSplitstoreField(string(cfgStr))) + + cfgStrFromDef, err := ConfigUpdate(DefaultFullNode(), DefaultFullNode(), Commented(true), DefaultKeepUncommented()) + assert.NoError(t, err) + assert.True(t, MatchEnableSplitstoreField(string(cfgStrFromDef))) +} + +// Loading a config with commented EnableSplitstore fails when setting validator +func TestValidateConfigSetsEnableSplitstore(t *testing.T) { + cfgCommentedOutEnableSS, err := ConfigUpdate(DefaultFullNode(), DefaultFullNode(), Commented(true)) + assert.NoError(t, err) + // assert that this config comments out EnableSplitstore + assert.False(t, MatchEnableSplitstoreField(string(cfgCommentedOutEnableSS))) + + // write config with commented out EnableSplitstore to file + f, err := ioutil.TempFile("", "config.toml") + fname := f.Name() + assert.NoError(t, err) + defer func() { + err = f.Close() + assert.NoError(t, err) + os.Remove(fname) //nolint:errcheck + }() + _, err = f.WriteString(string(cfgCommentedOutEnableSS)) + assert.NoError(t, err) + + _, err = FromFile(fname, SetDefault(fullNodeDefault), SetValidate(ValidateSplitstoreSet)) + assert.Error(t, err) +} + +// Loading without a config file and a default fails if the default fallback is disabled +func TestFailToFallbackToDefault(t *testing.T) { + dir, err := ioutil.TempDir("", "dirWithNoFiles") + assert.NoError(t, err) + defer assert.NoError(t, os.RemoveAll(dir)) + nonExistantFileName := dir + "/notarealfile" + _, err = FromFile(nonExistantFileName, SetDefault(fullNodeDefault), SetCanFallbackOnDefault(NoDefaultForSplitstoreTransition)) + assert.Error(t, err) +} diff --git a/node/repo/fsrepo.go b/node/repo/fsrepo.go index 3012daaca..2dbedd5e7 100644 --- a/node/repo/fsrepo.go +++ b/node/repo/fsrepo.go @@ -545,7 +545,15 @@ func (fsr *fsLockedRepo) Config() (interface{}, error) { } func (fsr *fsLockedRepo) loadConfigFromDisk() (interface{}, error) { - return config.FromFile(fsr.configPath, fsr.repoType.Config()) + var opts []config.LoadCfgOpt + if fsr.repoType == FullNode { + opts = append(opts, config.SetCanFallbackOnDefault(config.NoDefaultForSplitstoreTransition)) + opts = append(opts, config.SetValidate(config.ValidateSplitstoreSet)) + } + opts = append(opts, config.SetDefault(func() (interface{}, error) { + return fsr.repoType.Config(), nil + })) + return config.FromFile(fsr.configPath, opts...) } func (fsr *fsLockedRepo) SetConfig(c func(interface{})) error { From f48c6268f8389f5c67d000b1a40a905642013623 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Wed, 22 Mar 2023 03:24:48 +0100 Subject: [PATCH 129/129] chore: all: bump go-libipfs --- go.mod | 6 +++--- go.sum | 15 ++++++--------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index d4dd212ab..a4794c03a 100644 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab github.com/ipfs/bbloom v0.0.4 github.com/ipfs/go-blockservice v0.5.0 - github.com/ipfs/go-cid v0.3.2 + github.com/ipfs/go-cid v0.4.0 github.com/ipfs/go-cidutil v0.1.0 github.com/ipfs/go-datastore v0.6.0 github.com/ipfs/go-ds-badger2 v0.1.3 @@ -97,7 +97,7 @@ require ( github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.4.0 - github.com/ipfs/go-libipfs v0.5.0 + github.com/ipfs/go-libipfs v0.7.0 github.com/ipfs/go-log/v2 v2.5.1 github.com/ipfs/go-merkledag v0.9.0 github.com/ipfs/go-metrics-interface v0.0.1 @@ -244,7 +244,7 @@ require ( github.com/ipfs/go-ipld-legacy v0.1.1 // indirect github.com/ipfs/go-ipns v0.3.0 // indirect github.com/ipfs/go-log v1.0.5 // indirect - github.com/ipfs/go-path v0.3.0 // indirect + github.com/ipfs/go-path v0.3.1 // indirect github.com/ipfs/go-peertaskqueue v0.8.1 // indirect github.com/ipfs/go-verifcid v0.0.2 // indirect github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0 // indirect diff --git a/go.sum b/go.sum index 5e20e850f..1d9e10262 100644 --- a/go.sum +++ b/go.sum @@ -698,8 +698,8 @@ github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqg github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.2.0/go.mod h1:P+HXFDF4CVhaVayiEb4wkAy7zBHxBwsJyt0Y5U6MLro= -github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc= -github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw= +github.com/ipfs/go-cid v0.4.0 h1:a4pdZq0sx6ZSxbCizebnKiMCx/xI/aBBFlB73IgH4rA= +github.com/ipfs/go-cid v0.4.0/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q= github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= @@ -731,7 +731,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-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= github.com/ipfs/go-filestore v1.2.0 h1:O2wg7wdibwxkEDcl7xkuQsPvJFRBVgVSsOJ/GP6z3yU= github.com/ipfs/go-filestore v1.2.0/go.mod h1:HLJrCxRXquTeEEpde4lTLMaE/MYJZD7WHLkp9z6+FF8= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= @@ -805,8 +804,8 @@ github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2 github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= github.com/ipfs/go-ipns v0.3.0 h1:ai791nTgVo+zTuq2bLvEGmWP1M0A6kGTXUsgv/Yq67A= github.com/ipfs/go-ipns v0.3.0/go.mod h1:3cLT2rbvgPZGkHJoPO1YMJeh6LtkxopCkKFcio/wE24= -github.com/ipfs/go-libipfs v0.5.0 h1:gtvzeoTdUHPUN4B5izzyBS3Cxtpvi+l7hd2mmjN+teM= -github.com/ipfs/go-libipfs v0.5.0/go.mod h1:iZ9QyhzNr3AkxRXrbQYb//rv7iLyvZJX0GNuc3lJDiQ= +github.com/ipfs/go-libipfs v0.7.0 h1:Mi54WJTODaOL2/ZSm5loi3SwI3jI2OuFWUrQIkJ5cpM= +github.com/ipfs/go-libipfs v0.7.0/go.mod h1:KsIf/03CqhICzyRGyGo68tooiBE2iFbI/rXW7FhAYr0= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I= @@ -838,17 +837,15 @@ github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fG github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= -github.com/ipfs/go-path v0.3.0 h1:tkjga3MtpXyM5v+3EbRvOHEoo+frwi4oumw5K+KYWyA= -github.com/ipfs/go-path v0.3.0/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= +github.com/ipfs/go-path v0.3.1 h1:wkeaCWE/NTuuPGlEkLTsED5UkzfKYZpxaFFPgk8ZVLE= +github.com/ipfs/go-path v0.3.1/go.mod h1:eNLsxJEEMxn/CDzUJ6wuNl+6No6tEUhOZcPKsZsYX0E= 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.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= 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.4.3 h1:EdDc1sNZNFDUlo4UrVAvvAofVI5EwTnKu8Nv8mgXkWQ= github.com/ipfs/go-unixfs v0.4.3/go.mod h1:TSG7G1UuT+l4pNj91raXAPkX0BhJi3jST1FDTfQ5QyM= -github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= github.com/ipfs/go-unixfsnode v1.5.2 h1:CvsiTt58W2uR5dD8bqQv+aAY0c1qolmXmSyNbPHYiew= github.com/ipfs/go-unixfsnode v1.5.2/go.mod h1:NlOebRwYx8lMCNMdhAhEspYPBD3obp7TE0LvBqHY+ks= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0=