From d21cb96ddbb244f58c6bd21acecdfbdb4c5a70fd Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Tue, 18 Feb 2020 15:10:42 -0300 Subject: [PATCH 01/23] doc: add comments related to actor code review --- chain/state/statetree.go | 5 +++++ chain/stmgr/stmgr.go | 2 ++ chain/sync.go | 3 +++ chain/types/actor.go | 1 + chain/types/vmcontext.go | 1 + chain/vm/mkactor.go | 1 + chain/vm/vm.go | 1 + 7 files changed, 14 insertions(+) diff --git a/chain/state/statetree.go b/chain/state/statetree.go index 3b1884dcc..149ba819f 100644 --- a/chain/state/statetree.go +++ b/chain/state/statetree.go @@ -21,10 +21,12 @@ import ( var log = logging.Logger("statetree") +// Stores actors state by their ID. type StateTree struct { root *hamt.Node Store cbor.IpldStore + // Maps ID addresses to actors. actorcache map[address.Address]*types.Actor snapshots []cid.Cid } @@ -70,6 +72,7 @@ func (st *StateTree) SetActor(addr address.Address, act *types.Actor) error { return st.root.Set(context.TODO(), string(addr.Bytes()), act) } +// `LookupID` gets the ID address of this actor's `addr` stored in the `InitActor`. func (st *StateTree) LookupID(addr address.Address) (address.Address, error) { if addr.Protocol() == address.ID { return addr, nil @@ -92,11 +95,13 @@ func (st *StateTree) LookupID(addr address.Address) (address.Address, error) { return a, nil } +// GetActor returns the actor from any type of `addr` provided. func (st *StateTree) GetActor(addr address.Address) (*types.Actor, error) { if addr == address.Undef { return nil, fmt.Errorf("GetActor called on undefined address") } + // Transform `addr` to its ID format. iaddr, err := st.LookupID(addr) if err != nil { if xerrors.Is(err, init_.ErrAddressNotFound) { diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index 71e0c4caf..6894b8fd3 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -429,6 +429,8 @@ func (sm *StateManager) LoadActorStateRaw(ctx context.Context, a address.Address return act, nil } +// Similar to `vm.ResolveToKeyAddr` but does not allow `Actor` type of addresses. Uses the `TipSet` `ts` +// to generate the VM state. func (sm *StateManager) ResolveToKeyAddress(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) { switch addr.Protocol() { case address.BLS, address.SECP256K1: diff --git a/chain/sync.go b/chain/sync.go index 8f72f7fdd..6aa6766b4 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -789,6 +789,7 @@ func (syncer *Syncer) checkBlockMessages(ctx context.Context, b *types.FullBlock } if _, ok := nonces[m.From]; !ok { + // `GetActor` does not validate that this is an account actor. act, err := st.GetActor(m.From) if err != nil { return xerrors.Errorf("failed to get actor: %w", err) @@ -827,6 +828,8 @@ func (syncer *Syncer) checkBlockMessages(ctx context.Context, b *types.FullBlock return xerrors.Errorf("block had invalid secpk message at index %d: %w", i, err) } + // `From` being an account actor is only validated inside the `vm.ResolveToKeyAddr` call + // in `StateManager.ResolveToKeyAddress` here (and not in `checkMsg`). kaddr, err := syncer.sm.ResolveToKeyAddress(ctx, m.Message.From, baseTs) if err != nil { return xerrors.Errorf("failed to resolve key addr: %w", err) diff --git a/chain/types/actor.go b/chain/types/actor.go index 30661a74c..b5ce69895 100644 --- a/chain/types/actor.go +++ b/chain/types/actor.go @@ -9,6 +9,7 @@ import ( var ErrActorNotFound = init_.ErrAddressNotFound type Actor struct { + // Identifies the type of actor (string coded as a CID), see `chain/actors/actors.go`. Code cid.Cid Head cid.Cid Nonce uint64 diff --git a/chain/types/vmcontext.go b/chain/types/vmcontext.go index ef7a910d6..d0ce42c0f 100644 --- a/chain/types/vmcontext.go +++ b/chain/types/vmcontext.go @@ -21,6 +21,7 @@ type Storage interface { type StateTree interface { SetActor(addr address.Address, act *Actor) error + // GetActor returns the actor from any type of `addr` provided. GetActor(addr address.Address) (*Actor, error) } diff --git a/chain/vm/mkactor.go b/chain/vm/mkactor.go index df3f235dd..9e14384cd 100644 --- a/chain/vm/mkactor.go +++ b/chain/vm/mkactor.go @@ -26,6 +26,7 @@ func init() { var EmptyObjectCid cid.Cid +// Creates account actors from only BLS/SECP256K1 addresses. func TryCreateAccountActor(st *state.StateTree, addr address.Address) (*types.Actor, aerrors.ActorError) { act, err := makeActor(st, addr) if err != nil { diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 29d0afc00..d6036188f 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -66,6 +66,7 @@ type ExecutionResult struct { // Send allows the current execution context to invoke methods on other actors in the system +// ResolveToKeyAddr returns the public key type of address (`BLS`/`SECP256K1`) of an account actor identified by `addr`. func ResolveToKeyAddr(state types.StateTree, cst cbor.IpldStore, addr address.Address) (address.Address, aerrors.ActorError) { if addr.Protocol() == address.BLS || addr.Protocol() == address.SECP256K1 { return addr, nil From 921f11db34e083745ad75c01f40ee83074b094c4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 20 Mar 2020 17:18:57 -0700 Subject: [PATCH 02/23] Rewrite chain export walker function to actually do the right thing --- chain/store/store.go | 102 +++++++++++++++++++++++++++++----------- node/impl/full/chain.go | 9 +++- node/impl/full/state.go | 1 - node/impl/full/sync.go | 1 - 4 files changed, 82 insertions(+), 31 deletions(-) diff --git a/chain/store/store.go b/chain/store/store.go index f9935a3ec..ae3564901 100644 --- a/chain/store/store.go +++ b/chain/store/store.go @@ -30,16 +30,14 @@ import ( lru "github.com/hashicorp/golang-lru" block "github.com/ipfs/go-block-format" - "github.com/ipfs/go-blockservice" car "github.com/ipfs/go-car" + carutil "github.com/ipfs/go-car/util" "github.com/ipfs/go-cid" dstore "github.com/ipfs/go-datastore" blockstore "github.com/ipfs/go-ipfs-blockstore" bstore "github.com/ipfs/go-ipfs-blockstore" cbor "github.com/ipfs/go-ipld-cbor" - format "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log/v2" - dag "github.com/ipfs/go-merkledag" cbg "github.com/whyrusleeping/cbor-gen" pubsub "github.com/whyrusleeping/pubsub" "golang.org/x/xerrors" @@ -734,7 +732,7 @@ func (cs *ChainStore) readMsgMetaCids(mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) cst := cbor.NewCborStore(cs.bs) var msgmeta types.MsgMeta if err := cst.Get(context.TODO(), mmc, &msgmeta); err != nil { - return nil, nil, xerrors.Errorf("failed to load msgmeta: %w", err) + return nil, nil, xerrors.Errorf("failed to load msgmeta (%s): %w", mmc, err) } blscids, err := cs.readAMTCids(msgmeta.BlsMessages) @@ -972,14 +970,18 @@ func (cs *ChainStore) GetTipsetByHeight(ctx context.Context, h abi.ChainEpoch, t } func recurseLinks(bs blockstore.Blockstore, root cid.Cid, in []cid.Cid) ([]cid.Cid, error) { + if root.Prefix().Codec != cid.DagCBOR { + return in, nil + } + data, err := bs.Get(root) if err != nil { - return nil, err + return nil, xerrors.Errorf("recurse links get (%s) failed: %w", root, err) } top, err := cbg.ScanForLinks(bytes.NewReader(data.RawData())) if err != nil { - return nil, err + return nil, xerrors.Errorf("scanning for links failed: %w", err) } in = append(in, top...) @@ -998,41 +1000,87 @@ func (cs *ChainStore) Export(ctx context.Context, ts *types.TipSet, w io.Writer) if ts == nil { ts = cs.GetHeaviestTipSet() } - bsrv := blockservice.New(cs.bs, nil) - dserv := dag.NewDAGService(bsrv) - return car.WriteCarWithWalker(ctx, dserv, ts.Cids(), w, func(nd format.Node) ([]*format.Link, error) { - var b types.BlockHeader - if err := b.UnmarshalCBOR(bytes.NewBuffer(nd.RawData())); err != nil { - return nil, err + + seen := cid.NewSet() + + h := &car.CarHeader{ + Roots: ts.Cids(), + Version: 1, + } + + if err := car.WriteHeader(h, w); err != nil { + return xerrors.Errorf("failed to write car header: %s", err) + } + + blocksToWalk := ts.Cids() + + walkChain := func(blk cid.Cid) error { + if !seen.Visit(blk) { + return nil } - var out []*format.Link - for _, p := range b.Parents { - out = append(out, &format.Link{Cid: p}) - } - - cids, err := recurseLinks(cs.bs, b.Messages, nil) + data, err := cs.bs.Get(blk) if err != nil { - return nil, err + return xerrors.Errorf("getting block: %w", err) } - for _, c := range cids { - out = append(out, &format.Link{Cid: c}) + if err := carutil.LdWrite(w, blk.Bytes(), data.RawData()); err != nil { + return xerrors.Errorf("failed to write block to car output: %w", err) } + var b types.BlockHeader + if err := b.UnmarshalCBOR(bytes.NewBuffer(data.RawData())); err != nil { + return xerrors.Errorf("unmarshaling block header (cid=%s): %w", blk, err) + } + + for _, p := range b.Parents { + blocksToWalk = append(blocksToWalk, p) + } + + cids, err := recurseLinks(cs.bs, b.Messages, []cid.Cid{b.Messages}) + if err != nil { + return xerrors.Errorf("recursing messages failed: %w", err) + } + + out := cids + if b.Height == 0 { - cids, err := recurseLinks(cs.bs, b.ParentStateRoot, nil) + cids, err := recurseLinks(cs.bs, b.ParentStateRoot, []cid.Cid{b.ParentStateRoot}) if err != nil { - return nil, err + return xerrors.Errorf("recursing genesis state failed: %w", err) } - for _, c := range cids { - out = append(out, &format.Link{Cid: c}) + out = append(out, cids...) + } + + for _, c := range out { + if seen.Visit(c) { + if c.Prefix().Codec != cid.DagCBOR { + continue + } + data, err := cs.bs.Get(c) + if err != nil { + return xerrors.Errorf("writing object to car (get %s): %w", c, err) + } + + if err := carutil.LdWrite(w, c.Bytes(), data.RawData()); err != nil { + return xerrors.Errorf("failed to write out car object: %w", err) + } } } - return out, nil - }) + return nil + } + + for len(blocksToWalk) > 0 { + next := blocksToWalk[0] + blocksToWalk = blocksToWalk[1:] + if err := walkChain(next); err != nil { + return xerrors.Errorf("walk chain failed: %w", err) + } + } + + return nil } func (cs *ChainStore) Import(r io.Reader) (*types.TipSet, error) { diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index 5d65dd278..c1bcfb0f5 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -20,11 +20,11 @@ import ( offline "github.com/ipfs/go-ipfs-exchange-offline" cbor "github.com/ipfs/go-ipld-cbor" ipld "github.com/ipfs/go-ipld-format" + logging "github.com/ipfs/go-log" "github.com/ipfs/go-merkledag" "github.com/ipfs/go-path" "github.com/ipfs/go-path/resolver" mh "github.com/multiformats/go-multihash" - "github.com/prometheus/common/log" "go.uber.org/fx" "golang.org/x/xerrors" @@ -35,6 +35,8 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) +var log = logging.Logger("fullnode") + type ChainAPI struct { fx.In @@ -424,7 +426,7 @@ func (a *ChainAPI) ChainExport(ctx context.Context, tsk types.TipSetKey) (<-chan for { buf := make([]byte, 4096) n, err := r.Read(buf) - if err != nil { + if err != nil && err != io.EOF { log.Errorf("chain export pipe read failed: %s", err) return } @@ -433,6 +435,9 @@ func (a *ChainAPI) ChainExport(ctx context.Context, tsk types.TipSetKey) (<-chan case <-ctx.Done(): log.Warnf("export writer failed: %s", ctx.Err()) } + if err == io.EOF { + return + } } }() diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 0e7ab49c0..49131a02c 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -10,7 +10,6 @@ import ( "github.com/ipfs/go-hamt-ipld" cbor "github.com/ipfs/go-ipld-cbor" "github.com/libp2p/go-libp2p-core/peer" - "github.com/prometheus/common/log" cbg "github.com/whyrusleeping/cbor-gen" "go.uber.org/fx" "golang.org/x/xerrors" diff --git a/node/impl/full/sync.go b/node/impl/full/sync.go index 436e14356..97d23043e 100644 --- a/node/impl/full/sync.go +++ b/node/impl/full/sync.go @@ -8,7 +8,6 @@ import ( "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/types" cid "github.com/ipfs/go-cid" - "github.com/prometheus/common/log" pubsub "github.com/libp2p/go-libp2p-pubsub" "go.uber.org/fx" From 6fcfd0a4f0993af94b6568ba112ae352b901e0e2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 20 Mar 2020 18:15:31 -0700 Subject: [PATCH 03/23] add a test to roundtrip export/import a chain --- chain/store/store_test.go | 37 +++++++++++++++++++++++++++++++++++++ go.mod | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/chain/store/store_test.go b/chain/store/store_test.go index 70513fed9..d182b08f2 100644 --- a/chain/store/store_test.go +++ b/chain/store/store_test.go @@ -1,6 +1,7 @@ package store_test import ( + "bytes" "context" "testing" @@ -13,6 +14,8 @@ import ( "github.com/filecoin-project/specs-actors/actors/abi/big" "github.com/filecoin-project/specs-actors/actors/builtin/power" "github.com/filecoin-project/specs-actors/actors/crypto" + + datastore "github.com/ipfs/go-datastore" blockstore "github.com/ipfs/go-ipfs-blockstore" ) @@ -70,3 +73,37 @@ func BenchmarkGetRandomness(b *testing.B) { } } } + +func TestChainExportImport(t *testing.T) { + cg, err := gen.NewGenerator() + if err != nil { + t.Fatal(err) + } + + var last *types.TipSet + for i := 0; i < 100; i++ { + ts, err := cg.NextTipSet() + if err != nil { + t.Fatal(err) + } + + last = ts.TipSet.TipSet() + } + + buf := new(bytes.Buffer) + if err := cg.ChainStore().Export(context.TODO(), last, buf); err != nil { + t.Fatal(err) + } + + nbs := blockstore.NewBlockstore(datastore.NewMapDatastore()) + cs := store.NewChainStore(nbs, datastore.NewMapDatastore(), nil) + + root, err := cs.Import(buf) + if err != nil { + t.Fatal(err) + } + + if !root.Equals(last) { + t.Fatal("imported chain differed from exported chain") + } +} diff --git a/go.mod b/go.mod index 02a3ebb31..b15a48922 100644 --- a/go.mod +++ b/go.mod @@ -89,7 +89,7 @@ require ( github.com/multiformats/go-multiaddr-net v0.1.2 github.com/multiformats/go-multihash v0.0.13 github.com/opentracing/opentracing-go v1.1.0 - github.com/prometheus/common v0.4.0 + github.com/prometheus/common v0.4.0 // indirect github.com/stretchr/testify v1.4.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba github.com/whyrusleeping/cbor-gen v0.0.0-20200222160900-51052a1e8191 From 1076a1a89d012db87d233d1001ba218ea2fd9f68 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Wed, 18 Mar 2020 21:13:04 -0700 Subject: [PATCH 04/23] WIP: integrate graphsync for chainsync requests --- chain/blocksync/blocksync.go | 12 +- chain/blocksync/blocksync_client.go | 42 ++++++- chain/blocksync/graphsync_client.go | 168 ++++++++++++++++++++++++++++ go.mod | 32 ++++-- go.sum | 130 ++++++++++++--------- node/hello/hello.go | 3 +- node/modules/services.go | 24 ++-- 7 files changed, 327 insertions(+), 84 deletions(-) create mode 100644 chain/blocksync/graphsync_client.go diff --git a/chain/blocksync/blocksync.go b/chain/blocksync/blocksync.go index f26ffeb02..ccb7a5498 100644 --- a/chain/blocksync/blocksync.go +++ b/chain/blocksync/blocksync.go @@ -138,7 +138,7 @@ func (bss *BlockSyncService) processRequest(ctx context.Context, p peer.ID, req reqlen = BlockSyncMaxRequestLength } - chain, err := bss.collectChainSegment(types.NewTipSetKey(req.Start...), reqlen, opts) + chain, err := collectChainSegment(bss.cs, types.NewTipSetKey(req.Start...), reqlen, opts) if err != nil { log.Warn("encountered error while responding to block sync request: ", err) return &BlockSyncResponse{ @@ -158,18 +158,18 @@ func (bss *BlockSyncService) processRequest(ctx context.Context, p peer.ID, req }, nil } -func (bss *BlockSyncService) collectChainSegment(start types.TipSetKey, length uint64, opts *BSOptions) ([]*BSTipSet, error) { +func collectChainSegment(cs *store.ChainStore, start types.TipSetKey, length uint64, opts *BSOptions) ([]*BSTipSet, error) { var bstips []*BSTipSet cur := start for { var bst BSTipSet - ts, err := bss.cs.LoadTipSet(cur) + ts, err := cs.LoadTipSet(cur) if err != nil { return nil, xerrors.Errorf("failed loading tipset %s: %w", cur, err) } if opts.IncludeMessages { - bmsgs, bmincl, smsgs, smincl, err := bss.gatherMessages(ts) + bmsgs, bmincl, smsgs, smincl, err := gatherMessages(cs, ts) if err != nil { return nil, xerrors.Errorf("gather messages failed: %w", err) } @@ -194,7 +194,7 @@ func (bss *BlockSyncService) collectChainSegment(start types.TipSetKey, length u } } -func (bss *BlockSyncService) gatherMessages(ts *types.TipSet) ([]*types.Message, [][]uint64, []*types.SignedMessage, [][]uint64, error) { +func gatherMessages(cs *store.ChainStore, ts *types.TipSet) ([]*types.Message, [][]uint64, []*types.SignedMessage, [][]uint64, error) { blsmsgmap := make(map[cid.Cid]uint64) secpkmsgmap := make(map[cid.Cid]uint64) var secpkmsgs []*types.SignedMessage @@ -202,7 +202,7 @@ func (bss *BlockSyncService) gatherMessages(ts *types.TipSet) ([]*types.Message, var secpkincl, blsincl [][]uint64 for _, b := range ts.Blocks() { - bmsgs, smsgs, err := bss.cs.MessagesForBlock(b) + bmsgs, smsgs, err := cs.MessagesForBlock(b) if err != nil { return nil, nil, nil, nil, err } diff --git a/chain/blocksync/blocksync_client.go b/chain/blocksync/blocksync_client.go index 69cd5ec7c..9ff85657a 100644 --- a/chain/blocksync/blocksync_client.go +++ b/chain/blocksync/blocksync_client.go @@ -12,6 +12,8 @@ import ( blocks "github.com/ipfs/go-block-format" bserv "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" + graphsync "github.com/ipfs/go-graphsync" + gsnet "github.com/ipfs/go-graphsync/network" host "github.com/libp2p/go-libp2p-core/host" inet "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" @@ -28,18 +30,20 @@ import ( type BlockSync struct { bserv bserv.BlockService + gsync graphsync.GraphExchange host host.Host syncPeers *bsPeerTracker peerMgr *peermgr.PeerMgr } -func NewBlockSyncClient(bserv dtypes.ChainBlockService, h host.Host, pmgr peermgr.MaybePeerMgr) *BlockSync { +func NewBlockSyncClient(bserv dtypes.ChainBlockService, h host.Host, pmgr peermgr.MaybePeerMgr, gs dtypes.Graphsync) *BlockSync { return &BlockSync{ bserv: bserv, host: h, syncPeers: newPeerTracker(pmgr.Mgr), peerMgr: pmgr.Mgr, + gsync: gs, } } @@ -234,14 +238,45 @@ func (bs *BlockSync) sendRequestToPeer(ctx context.Context, p peer.ID, req *Bloc } }() - start := time.Now() - if span.IsRecordingEvents() { span.AddAttributes( trace.StringAttribute("peer", p.Pretty()), ) } + gsproto := string(gsnet.ProtocolGraphsync) + supp, err := bs.host.Peerstore().SupportsProtocols(p /*, BlockSyncProtocolID, */, gsproto) + if err != nil { + return nil, xerrors.Errorf("failed to get protocols for peer: %w", err) + } + + if len(supp) == 0 { + return nil, xerrors.Errorf("peer %s supports no known sync protocols", p) + } + + switch supp[0] { + case BlockSyncProtocolID: + res, err := bs.fetchBlocksBlockSync(ctx, p, req) + if err != nil { + return nil, xerrors.Errorf("blocksync req failed: %w", err) + } + return res, nil + case gsproto: + res, err := bs.fetchBlocksGraphSync(ctx, p, req) + if err != nil { + return nil, xerrors.Errorf("graphsync req failed: %w", err) + } + return res, nil + default: + return nil, xerrors.Errorf("peerstore somehow returned unexpected protocols: %v", supp) + } + +} +func (bs *BlockSync) fetchBlocksBlockSync(ctx context.Context, p peer.ID, req *BlockSyncRequest) (*BlockSyncResponse, error) { + ctx, span := trace.StartSpan(ctx, "blockSyncFetch") + defer span.End() + + start := time.Now() s, err := bs.host.NewStream(inet.WithNoDial(ctx, "should already have connection"), p, BlockSyncProtocolID) if err != nil { bs.RemovePeer(p) @@ -272,7 +307,6 @@ func (bs *BlockSync) sendRequestToPeer(ctx context.Context, p peer.ID, req *Bloc } bs.syncPeers.logSuccess(p, time.Since(start)) - return &res, nil } diff --git a/chain/blocksync/graphsync_client.go b/chain/blocksync/graphsync_client.go new file mode 100644 index 000000000..33f91fdd7 --- /dev/null +++ b/chain/blocksync/graphsync_client.go @@ -0,0 +1,168 @@ +package blocksync + +import ( + "context" + + "github.com/ipfs/go-cid" + "github.com/ipfs/go-datastore" + "github.com/ipld/go-ipld-prime" + "github.com/libp2p/go-libp2p-core/peer" + "golang.org/x/xerrors" + + store "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/chain/types" + + ipldfree "github.com/ipld/go-ipld-prime/impl/free" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + ipldselector "github.com/ipld/go-ipld-prime/traversal/selector" + selectorbuilder "github.com/ipld/go-ipld-prime/traversal/selector/builder" +) + +const ( + // could be anything? <100 though I think is the base limit + recursionDepth = 50 + + // AMT selector recursion. An AMT has arity of 8 so this gives allows + // us to retrieve trees with 8^10 (1,073,741,824) elements. + amtRecursionDepth = uint32(10) + + // some constants for looking up tuple encoded struct fields + // field index of Parents field in a block header + blockIndexParentsField = 3 + + // field index of Messages field in a block header + blockIndexMessagesField = 8 + + // field index of AMT node in AMT head + amtHeadNodeFieldIndex = 2 + + // field index of links array AMT node + amtNodeLinksFieldIndex = 1 + + // field index of values array AMT node + amtNodeValuesFieldIndex = 2 +) + +var blockHeadersSelector, fullSelector ipld.Node + +var amtSelector selectorbuilder.SelectorSpec + +func init() { + // builer for selectors + ssb := selectorbuilder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + // blockHeaders only selector + blockHeadersSelector = ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(recursionDepth), ssb.ExploreIndex(blockIndexParentsField, + ssb.ExploreUnion( + ssb.ExploreAll( + ssb.Matcher(), + ), + ssb.ExploreIndex(0, ssb.ExploreRecursiveEdge()), + ))).Node() + // amt selector -- needed to selector through a messages AMT + amtSelector = ssb.ExploreIndex(amtHeadNodeFieldIndex, + ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(int(amtRecursionDepth)), + ssb.ExploreUnion( + ssb.ExploreIndex(amtNodeLinksFieldIndex, + ssb.ExploreAll(ssb.ExploreRecursiveEdge())), + ssb.ExploreIndex(amtNodeValuesFieldIndex, + ssb.ExploreAll(ssb.Matcher()))))) + // messages too selector + fullSelector = ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(recursionDepth), + ssb.ExploreIndex(blockIndexParentsField, + ssb.ExploreUnion( + ssb.ExploreAll( + ssb.ExploreIndex(blockIndexMessagesField, + ssb.ExploreRange(0, 2, amtSelector), + )), + ssb.ExploreIndex(0, ssb.ExploreRecursiveEdge()), + ))).Node() +} + +func selectorForRequest(req *BlockSyncRequest) ipld.Node { + // builer for selectors + ssb := selectorbuilder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + + bso := ParseBSOptions(req.Options) + if bso.IncludeMessages { + return ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(int(req.RequestLength)), + ssb.ExploreIndex(blockIndexParentsField, + ssb.ExploreUnion( + ssb.ExploreAll( + ssb.ExploreIndex(blockIndexMessagesField, + ssb.ExploreRange(0, 2, amtSelector), + )), + ssb.ExploreIndex(0, ssb.ExploreRecursiveEdge()), + ))).Node() + } else { + return ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(int(req.RequestLength)), ssb.ExploreIndex(blockIndexParentsField, + ssb.ExploreUnion( + ssb.ExploreAll( + ssb.Matcher(), + ), + ssb.ExploreIndex(0, ssb.ExploreRecursiveEdge()), + ))).Node() + } + +} + +func (bs *BlockSync) executeGsyncSelector(ctx context.Context, p peer.ID, root cid.Cid, sel ipld.Node) error { + resp, errs := bs.gsync.Request(ctx, p, cidlink.Link{Cid: root}, sel) + + for { + select { + case _, ok := <-resp: + if !ok { + return nil + } + case err, ok := <-errs: + if !ok { + return nil + } + return xerrors.Errorf("failed to complete graphsync request: %w", err) + } + } + +} + +// Fallback for interacting with other non-lotus nodes +func (bs *BlockSync) fetchBlocksGraphSync(ctx context.Context, p peer.ID, req *BlockSyncRequest) (*BlockSyncResponse, error) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + sel := selectorForRequest(req) + + // TODO: + for _, c := range req.Start { + if _, err := bs.bserv.GetBlock(ctx, c); err != nil { + return nil, xerrors.Errorf("failed to fetch blocks: %w") + } + } + + req2 := *req + req2.RequestLength = 1 + immediateTsSelector := selectorForRequest(&req2) + + // Do this because we can only request one root at a time + for _, r := range req.Start { + if err := bs.executeGsyncSelector(ctx, p, r, immediateTsSelector); err != nil { + return nil, err + } + } + + // execute the selector forreal + if err := bs.executeGsyncSelector(ctx, p, req.Start[0], sel); err != nil { + return nil, err + } + + // Now pull the data we fetched out of the chainstore (where it should now be persisted) + tempcs := store.NewChainStore(bs.bserv.Blockstore(), datastore.NewMapDatastore(), nil) + + opts := ParseBSOptions(req.Options) + tsk := types.NewTipSetKey(req.Start...) + chain, err := collectChainSegment(tempcs, tsk, req.RequestLength, opts) + if err != nil { + return nil, xerrors.Errorf("failed to load chain data from chainstore after successful graphsync response (start = %v): %w", req.Start, err) + } + + return &BlockSyncResponse{Chain: chain}, nil +} diff --git a/go.mod b/go.mod index b15a48922..39123fd9b 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect github.com/coreos/go-systemd/v22 v22.0.0 + github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f // indirect github.com/docker/go-units v0.4.0 github.com/filecoin-project/chain-validation v0.0.6-0.20200320210432-2793319e9867 github.com/filecoin-project/filecoin-ffi v0.0.0-20200304181354-4446ff8a1bb9 @@ -40,7 +41,7 @@ require ( github.com/ipfs/go-blockservice v0.1.3-0.20190908200855-f22eea50656c github.com/ipfs/go-car v0.0.3-0.20200304012825-b6769248bfef github.com/ipfs/go-cid v0.0.5 - github.com/ipfs/go-datastore v0.4.2 + github.com/ipfs/go-datastore v0.4.4 github.com/ipfs/go-ds-badger2 v0.0.0-20200211201106-609c9d2a39c7 github.com/ipfs/go-filestore v0.0.2 github.com/ipfs/go-fs-lock v0.0.1 @@ -61,16 +62,19 @@ require ( github.com/ipfs/go-path v0.0.7 github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785 + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/lib/pq v1.2.0 - github.com/libp2p/go-libp2p v0.5.2 + github.com/libp2p/go-eventbus v0.1.0 + github.com/libp2p/go-libp2p v0.6.0 github.com/libp2p/go-libp2p-circuit v0.1.4 github.com/libp2p/go-libp2p-connmgr v0.1.0 - github.com/libp2p/go-libp2p-core v0.3.0 + github.com/libp2p/go-libp2p-core v0.5.0 github.com/libp2p/go-libp2p-discovery v0.2.0 github.com/libp2p/go-libp2p-kad-dht v0.1.1 - github.com/libp2p/go-libp2p-mplex v0.2.1 + github.com/libp2p/go-libp2p-mplex v0.2.2 github.com/libp2p/go-libp2p-peer v0.2.0 - github.com/libp2p/go-libp2p-peerstore v0.1.4 + github.com/libp2p/go-libp2p-peerstore v0.2.0 github.com/libp2p/go-libp2p-pubsub v0.2.6 github.com/libp2p/go-libp2p-quic-transport v0.1.1 github.com/libp2p/go-libp2p-record v0.1.1 @@ -78,15 +82,15 @@ require ( github.com/libp2p/go-libp2p-secio v0.2.1 github.com/libp2p/go-libp2p-swarm v0.2.2 github.com/libp2p/go-libp2p-tls v0.1.0 - github.com/libp2p/go-libp2p-yamux v0.2.1 + github.com/libp2p/go-libp2p-yamux v0.2.5 github.com/libp2p/go-maddr-filter v0.0.5 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/minio/sha256-simd v0.1.1 github.com/mitchellh/go-homedir v1.1.0 github.com/multiformats/go-base32 v0.0.3 - github.com/multiformats/go-multiaddr v0.2.0 + github.com/multiformats/go-multiaddr v0.2.1 github.com/multiformats/go-multiaddr-dns v0.2.0 - github.com/multiformats/go-multiaddr-net v0.1.2 + github.com/multiformats/go-multiaddr-net v0.1.3 github.com/multiformats/go-multihash v0.0.13 github.com/opentracing/opentracing-go v1.1.0 github.com/prometheus/common v0.4.0 // indirect @@ -95,16 +99,22 @@ require ( github.com/whyrusleeping/cbor-gen v0.0.0-20200222160900-51052a1e8191 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 github.com/whyrusleeping/pubsub v0.0.0-20131020042734-02de8aa2db3d - go.opencensus.io v0.22.2 + go.opencensus.io v0.22.3 go.uber.org/dig v1.8.0 // indirect go.uber.org/fx v1.9.0 go.uber.org/goleak v1.0.0 // indirect - go.uber.org/multierr v1.4.0 - go.uber.org/zap v1.13.0 + go.uber.org/multierr v1.5.0 + go.uber.org/zap v1.14.1 + golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6 // indirect + golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect + golang.org/x/net v0.0.0-20200301022130-244492dfa37a // indirect + golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d // indirect golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 + golang.org/x/tools v0.0.0-20200318150045-ba25ddc85566 // indirect golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 gopkg.in/urfave/cli.v2 v2.0.0-20180128182452-d3ae77c26ac8 gotest.tools v2.2.0+incompatible + honnef.co/go/tools v0.0.1-2020.1.3 // indirect launchpad.net/gocheck v0.0.0-20140225173054-000000000087 // indirect ) diff --git a/go.sum b/go.sum index 1d1481fc2..5913eb2f1 100644 --- a/go.sum +++ b/go.sum @@ -10,7 +10,6 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= @@ -26,11 +25,8 @@ github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrU 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/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/apache/thrift v0.12.0 h1:pODnxUFNcjP9UTLZGTdeh+j16A8lJbRvD3rOtrk/7bs= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -78,6 +74,9 @@ github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= +github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f h1:BOaYiTvg8p9vBUXpklC22XSK/mifLF7lG9jtmYYi3Tc= +github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo= @@ -100,7 +99,6 @@ github.com/fatih/color v1.8.0 h1:5bzFgL+oy7JITMTxUPJ00n7VxmYd/PdMp5mHFX40/RY= github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= github.com/filecoin-project/chain-validation v0.0.6-0.20200320210432-2793319e9867 h1:6+9Khz+vidBfWG7xQ6a2uRpLnd3RhMVcOwJxu3XhvgI= github.com/filecoin-project/chain-validation v0.0.6-0.20200320210432-2793319e9867/go.mod h1:YTLxUr6gOZpkUaXzLe7OZ4s1dpfJGp2FY/J2/K5DJqc= -github.com/filecoin-project/go-address v0.0.0-20200107215422-da8eea2842b5 h1:/MmWluswvDIbuPvBct4q6HeQgVm62O2DzWYTB38kt4A= github.com/filecoin-project/go-address v0.0.0-20200107215422-da8eea2842b5/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be h1:TooKBwR/g8jG0hZ3lqe9S5sy2vTUcLOZLlz3M5wGn2E= github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= @@ -141,7 +139,6 @@ github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 h1:EzDjxMg43q1tA2c0MV3tNbaontnHLplHyFF6M5KiVP0= github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -242,18 +239,19 @@ github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= +github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.2 h1:h8/n7WPzhp239kkLws+epN3Ic7YtcBPgcaXfEfdVDWM= -github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.4 h1:rjvQ9+muFaJ+QZ7dN5B1MSDNQ0JVZKkkES/rMZmA8X8= +github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= -github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= +github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger2 v0.0.0-20200211201106-609c9d2a39c7 h1:2P493YpV0SsG9c0btHfZt9eZCO+tzLAelQyrwQQcey0= github.com/ipfs/go-ds-badger2 v0.0.0-20200211201106-609c9d2a39c7/go.mod h1:d/QTAGj3T4lF4CuFpywNnAQ0RbffuDc1BtGFAvuYWls= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= +github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-filestore v0.0.2 h1:pcYwpjtXXwirtbjBXKVJM9CTa9F7/8v1EkfnDaHTO3s= github.com/ipfs/go-filestore v0.0.2/go.mod h1:KnZ41qJsCt2OX2mxZS0xsK3Psr0/oB93HMMssLujjVc= github.com/ipfs/go-fs-lock v0.0.1 h1:XHX8uW4jQBYWHj59XXcjg7BHlHxV9ZOYs6Y43yb7/l0= @@ -275,7 +273,6 @@ github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcB github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-ds-help v0.0.1 h1:QBg+Ts2zgeemK/dB0saiF/ykzRGgfoFMT90Rzo0OnVU= github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-ds-help v0.1.1 h1:IW/bXGeaAZV2VH0Kuok+Ohva/zHkHmeLFBxC1k7mNPc= github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= @@ -340,20 +337,21 @@ github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6 github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= -github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= -github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= +github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= +github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -365,7 +363,6 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/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 h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ= @@ -399,8 +396,8 @@ github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68 github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= github.com/libp2p/go-libp2p v0.2.1/go.mod h1:HZbtEOrgZN4F1fGZVvkV+930Wx3DkqlpBlO8dIoZWds= github.com/libp2p/go-libp2p v0.3.0/go.mod h1:J7DPB1+zB5VLc8v/kKSD8+u2cbyIGI0Dh/Pf3Wprt+0= -github.com/libp2p/go-libp2p v0.5.2 h1:fjQUTyB7x/4XgO31OEWkJ5uFeHRgpoExlf0rXz5BO8k= -github.com/libp2p/go-libp2p v0.5.2/go.mod h1:o2r6AcpNl1eNGoiWhRtPji03NYOvZumeQ6u+X6gSxnM= +github.com/libp2p/go-libp2p v0.6.0 h1:EFArryT9N7AVA70LCcOh8zxsW+FeDnxwcpWQx9k7+GM= +github.com/libp2p/go-libp2p v0.6.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= 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 h1:WLBZcIRsjZlWdAZj9CiBSvU2wQXoUOiS1Zk1tM7DTJI= @@ -426,8 +423,11 @@ github.com/libp2p/go-libp2p-core v0.0.9/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYe 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.3.0 h1:F7PqduvrztDtFsAa/bcheQ3azmNo+Nq7m8hQY5GiUW8= 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 h1:FBQ1fpq2Fo/ClyjojVJ5AKXlKhvNc/B6U0O+7AN1ffE= +github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= 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 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= @@ -452,8 +452,9 @@ github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3x 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 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-mplex v0.2.2 h1:+Ld7YDAfVERQ0E+qqjE7o6fHwKuM0SqTzYiwN1lVVSA= +github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5 h1:/mH8pXFVKleflDL1YwqMg27W9GD8kjEx7NY0P6eGc98= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= @@ -471,8 +472,10 @@ github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4T github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= github.com/libp2p/go-libp2p-peerstore v0.1.2/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= -github.com/libp2p/go-libp2p-peerstore v0.1.4 h1:d23fvq5oYMJ/lkkbO4oTwBp/JP+I/1m5gZJobNXCE/k= -github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= +github.com/libp2p/go-libp2p-peerstore v0.2.0 h1:XcgJhI8WyUOCbHyRLNEX5542YNj8hnLSJ2G1InRjDhk= +github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= +github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= +github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.2.6 h1:ypZaukCFrtD8cNeeb9nnWG4MD2Y1T0p22aQ+f7FKJig= @@ -504,7 +507,6 @@ github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MB 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= -github.com/libp2p/go-libp2p-testing v0.1.0 h1:WaFRj/t3HdMZGNZqnU2pS7pDRBmMeoDx7/HDNpeyT9U= github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= github.com/libp2p/go-libp2p-testing v0.1.1 h1:U03z3HnGI7Ni8Xx6ONVZvUFOAzWYmolWf5W5jAOPNmU= github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= @@ -513,21 +515,25 @@ github.com/libp2p/go-libp2p-tls v0.1.0/go.mod h1:VZdoSWQDeNpIIAFJFv+6uqTqpnIIDHc 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 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-transport-upgrader v0.2.0 h1:5EhPgQhXZNyfL22ERZTUoVp9UVVbNowWNVtELQaKCHk= +github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= 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 h1:Q3XYNiKCC2vIxrvUJL+Jg1kiyeEaIDNKLjgEjo3VQdI= 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= +github.com/libp2p/go-libp2p-yamux v0.2.5 h1:MuyItOqz03oi8npvjgMJxgnhllJLZnO/dKVOpTZ9+XI= +github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA= 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 h1:CW3AgbMO6vUvT4kf87y4N+0P8KUl2aqLYhrGyDUbLSg= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= 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 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-mplex v0.1.1 h1:huPH/GGRJzmsHR9IZJJsrSwIM5YE2gL4ssgl1YWb/ps= +github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= 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 h1:agEFehY3zWJFUHK6SEMR7UYmk2z6kC3oeCM7ybLhguA= @@ -560,12 +566,13 @@ github.com/libp2p/go-ws-transport v0.2.0 h1:MJCw2OrPA9+76YNRvdo1wMnSOxb9Bivj6sVF github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= 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 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI= 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= +github.com/libp2p/go-yamux v1.3.3 h1:mWuzZRCAeTBFdynLlsYgA/EIeMOLr8XY04wa52NRhsE= +github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/lucas-clemente/quic-go v0.11.2 h1:Mop0ac3zALaBR3wGs6j8OYe/tcFvFsxTUFMkE/7yUOI= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/marten-seemann/qtls v0.2.3 h1:0yWJ43C62LsZt08vuQJDK1uC1czUc3FJeCLPoNAI4vA= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= @@ -609,8 +616,9 @@ github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lg github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0 h1:lR52sFwcTCuQb6bTfnXF6zA2XfyYvyd+5a9qECv/J90= github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= +github.com/multiformats/go-multiaddr v0.2.1 h1:SgG/cw5vqyB5QQe5FPe2TqggU9WtrA9X4nZw7LlVqOI= +github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -621,10 +629,10 @@ github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/e github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.1 h1:jFFKUuXTXv+3ARyHZi3XUqQO+YWMKgBdhEvuGRfnL6s= github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.2 h1:P7zcBH9FRETdPkDrylcXVjQLQ2t1JQtNItZULWNWgeg= github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQKME1qHfpYmyIjFVsSOY6Y= +github.com/multiformats/go-multiaddr-net v0.1.3 h1:q/IYAvoPKuRzGeERn3uacWgm0LIWkLZBAvO5DxSzq3g= +github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= @@ -645,26 +653,25 @@ github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXS github.com/multiformats/go-varint v0.0.5 h1:XVZwSo04Cs3j/jS0uAEPpT3JY6DzMcVLLoWOSnCxOjg= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.9.0 h1:SZjF721BByVj8QH636/8S2DnX4n0Re3SteMmw3N+tzc= github.com/onsi/ginkgo v1.9.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.6.0 h1:8XTW0fcJZEq9q+Upcyws4JSGua2MFysCL5xkaSgHc+M= github.com/onsi/gomega v1.6.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/otiai10/copy v1.0.2 h1:DDNipYy6RkIkjMwy+AWzgKiNTyj2RUI9yEMeETEpVyc= github.com/otiai10/copy v1.0.2/go.mod h1:c7RpqBkwMom4bYTSkLSym4VSJz/XtncWRAj/J4PEIMY= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95 h1:+OLn68pqasWca0z5ryit9KGfp3sUsW4Lqg32iRMJyzs= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/mint v1.3.0 h1:Ady6MKVezQwHBkGzLFbrsywyp09Ah7rkmfjV3Bcr5uc= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -704,7 +711,6 @@ github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAri github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 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= @@ -742,9 +748,7 @@ github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli/v2 v2.0.0 h1:+HU9SCbu8GnEUFtIBfuUNXN39ofWViIEJIp6SURMpCg= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= @@ -778,15 +782,18 @@ github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSv github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= -go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/dig v1.8.0 h1:1rR6hnL/bu1EVcjnRDN5kx1vbIjEJDTGhSQ2B3ddpcI= go.uber.org/dig v1.8.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= @@ -794,14 +801,14 @@ go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= go.uber.org/goleak v1.0.0 h1:qsup4IcBdlmsnGfqyLl4Ntn3C2XCCuKAE7DwHpScyUo= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= 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 h1:f3WCSC2KzAcBXGATIxAB1E2XuCpNU255wNKZ505qi3E= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= 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 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= +go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go4.org v0.0.0-20190218023631-ce4c26f7be8e h1:m9LfARr2VIOW0vsV19kEKp/sWQvZnGobA8JHui/XJoY= go4.org v0.0.0-20190218023631-ce4c26f7be8e/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -819,17 +826,22 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6 h1:TjszyFsQsyZNHwdVdZ5m7bjmreu0znc2kRYsEml9/Ww= +golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -846,16 +858,19 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -878,9 +893,12 @@ golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449 h1:gSbV7h1NRL2G1xTg/owz62CST1oJBmxy4QpMMregXVQ= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d h1:62ap6LNOjDU6uGmKXHJbSfciMoV+FeI1sRXx/pLDL44= +golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -901,8 +919,12 @@ golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtn 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-20191216173652-a0e659d51361 h1:RIIXAeV6GvDBuADKumTODatUqANFZ+5BPMnzsy4hulY= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200318150045-ba25ddc85566 h1:OXjomkWHhzUx4+HldlJ2TsMxJdWgEo5CTtspD1wdhdk= +golang.org/x/tools v0.0.0-20200318150045-ba25ddc85566/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -920,7 +942,6 @@ google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRn google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -945,7 +966,8 @@ gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/node/hello/hello.go b/node/hello/hello.go index c1802f7cb..251642125 100644 --- a/node/hello/hello.go +++ b/node/hello/hello.go @@ -2,9 +2,10 @@ package hello import ( "context" - "github.com/filecoin-project/specs-actors/actors/abi" "time" + "github.com/filecoin-project/specs-actors/actors/abi" + "github.com/filecoin-project/specs-actors/actors/abi/big" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" diff --git a/node/modules/services.go b/node/modules/services.go index 89a32b03f..73c9b1267 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -3,11 +3,13 @@ package modules import ( "context" + eventbus "github.com/libp2p/go-eventbus" + event "github.com/libp2p/go-libp2p-core/event" "github.com/libp2p/go-libp2p-core/host" - inet "github.com/libp2p/go-libp2p-core/network" peer "github.com/libp2p/go-libp2p-peer" pubsub "github.com/libp2p/go-libp2p-pubsub" "go.uber.org/fx" + "golang.org/x/xerrors" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/retrievalmarket/discovery" @@ -23,20 +25,26 @@ import ( "github.com/filecoin-project/lotus/node/modules/helpers" ) -func RunHello(mctx helpers.MetricsCtx, lc fx.Lifecycle, h host.Host, svc *hello.Service) { +func RunHello(mctx helpers.MetricsCtx, lc fx.Lifecycle, h host.Host, svc *hello.Service) error { h.SetStreamHandler(hello.ProtocolID, svc.HandleStream) - bundle := inet.NotifyBundle{ - ConnectedF: func(_ inet.Network, c inet.Conn) { + sub, err := h.EventBus().Subscribe(new(event.EvtPeerIdentificationCompleted), eventbus.BufSize(1024)) + if err != nil { + return xerrors.Errorf("failed to subscribe to event bus: %w", err) + } + + go func() { + for evt := range sub.Out() { + pic := evt.(event.EvtPeerIdentificationCompleted) go func() { - if err := svc.SayHello(helpers.LifecycleCtx(mctx, lc), c.RemotePeer()); err != nil { + if err := svc.SayHello(helpers.LifecycleCtx(mctx, lc), pic.Peer); err != nil { log.Warnw("failed to say hello", "error", err) return } }() - }, - } - h.Network().Notify(&bundle) + } + }() + return nil } func RunPeerMgr(mctx helpers.MetricsCtx, lc fx.Lifecycle, pmgr *peermgr.PeerMgr) { From 34f755b2b988df7d92a07822915367686584dcea Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 19 Mar 2020 14:28:59 -0700 Subject: [PATCH 05/23] feat(chainsync): fixes to make graphsync work for chain fetching - store to chain blockstore (ok for now, since storage provider is a seperate process) - simplify request fetching and processing --- chain/blocksync/graphsync_client.go | 51 +++++++++++++++-------------- node/modules/graphsync.go | 4 +-- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/chain/blocksync/graphsync_client.go b/chain/blocksync/graphsync_client.go index 33f91fdd7..5d4af01cb 100644 --- a/chain/blocksync/graphsync_client.go +++ b/chain/blocksync/graphsync_client.go @@ -93,35 +93,38 @@ func selectorForRequest(req *BlockSyncRequest) ipld.Node { )), ssb.ExploreIndex(0, ssb.ExploreRecursiveEdge()), ))).Node() - } else { - return ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(int(req.RequestLength)), ssb.ExploreIndex(blockIndexParentsField, - ssb.ExploreUnion( - ssb.ExploreAll( - ssb.Matcher(), - ), - ssb.ExploreIndex(0, ssb.ExploreRecursiveEdge()), - ))).Node() } + return ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(int(req.RequestLength)), ssb.ExploreIndex(blockIndexParentsField, + ssb.ExploreUnion( + ssb.ExploreAll( + ssb.Matcher(), + ), + ssb.ExploreIndex(0, ssb.ExploreRecursiveEdge()), + ))).Node() + +} + +func firstTipsetSelector(req *BlockSyncRequest) ipld.Node { + // builer for selectors + ssb := selectorbuilder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + + bso := ParseBSOptions(req.Options) + if bso.IncludeMessages { + return ssb.ExploreIndex(blockIndexMessagesField, + ssb.ExploreRange(0, 2, amtSelector), + ).Node() + } + return ssb.Matcher().Node() } func (bs *BlockSync) executeGsyncSelector(ctx context.Context, p peer.ID, root cid.Cid, sel ipld.Node) error { - resp, errs := bs.gsync.Request(ctx, p, cidlink.Link{Cid: root}, sel) + _, errs := bs.gsync.Request(ctx, p, cidlink.Link{Cid: root}, sel) - for { - select { - case _, ok := <-resp: - if !ok { - return nil - } - case err, ok := <-errs: - if !ok { - return nil - } - return xerrors.Errorf("failed to complete graphsync request: %w", err) - } + for err := range errs { + return xerrors.Errorf("failed to complete graphsync request: %w", err) } - + return nil } // Fallback for interacting with other non-lotus nodes @@ -138,9 +141,7 @@ func (bs *BlockSync) fetchBlocksGraphSync(ctx context.Context, p peer.ID, req *B } } - req2 := *req - req2.RequestLength = 1 - immediateTsSelector := selectorForRequest(&req2) + immediateTsSelector := firstTipsetSelector(req) // Do this because we can only request one root at a time for _, r := range req.Start { diff --git a/node/modules/graphsync.go b/node/modules/graphsync.go index 13c1dde10..ec1d7e903 100644 --- a/node/modules/graphsync.go +++ b/node/modules/graphsync.go @@ -15,8 +15,8 @@ import ( ) // GraphsyncStorer creates a storer that stores data in the client blockstore -func GraphsyncStorer(clientBs dtypes.ClientBlockstore) dtypes.GraphsyncStorer { - return dtypes.GraphsyncStorer(storeutil.StorerForBlockstore(clientBs)) +func GraphsyncStorer(chainBs dtypes.ChainBlockstore) dtypes.GraphsyncStorer { + return dtypes.GraphsyncStorer(storeutil.StorerForBlockstore(chainBs)) } // GraphsyncLoader creates a loader that reads from both the chain blockstore and the client blockstore From 2e9a052f62757ff46d79e5f856e6dcae0284d8aa Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 19 Mar 2020 17:16:26 -0700 Subject: [PATCH 06/23] fix(chainsync): support longer graphsync fetches with loop --- chain/blocksync/graphsync_client.go | 63 ++++++++++++++++++----------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/chain/blocksync/graphsync_client.go b/chain/blocksync/graphsync_client.go index 5d4af01cb..6fadb44b2 100644 --- a/chain/blocksync/graphsync_client.go +++ b/chain/blocksync/graphsync_client.go @@ -41,6 +41,9 @@ const ( // field index of values array AMT node amtNodeValuesFieldIndex = 2 + + // maximum depth per traversal + maxRequestLength = 50 ) var blockHeadersSelector, fullSelector ipld.Node @@ -132,15 +135,6 @@ func (bs *BlockSync) fetchBlocksGraphSync(ctx context.Context, p peer.ID, req *B ctx, cancel := context.WithCancel(ctx) defer cancel() - sel := selectorForRequest(req) - - // TODO: - for _, c := range req.Start { - if _, err := bs.bserv.GetBlock(ctx, c); err != nil { - return nil, xerrors.Errorf("failed to fetch blocks: %w") - } - } - immediateTsSelector := firstTipsetSelector(req) // Do this because we can only request one root at a time @@ -150,20 +144,43 @@ func (bs *BlockSync) fetchBlocksGraphSync(ctx context.Context, p peer.ID, req *B } } - // execute the selector forreal - if err := bs.executeGsyncSelector(ctx, p, req.Start[0], sel); err != nil { - return nil, err + var totalDepth uint64 = 0 + var nextReq BlockSyncRequest = *req + var wholeChain []*BSTipSet + var reachedGenesis bool + for totalDepth < req.RequestLength && !reachedGenesis { + if nextReq.RequestLength > maxRequestLength { + nextReq.RequestLength = maxRequestLength + } + + sel := selectorForRequest(&nextReq) + + // execute the selector forreal + if err := bs.executeGsyncSelector(ctx, p, req.Start[0], sel); err != nil { + return nil, err + } + + // Now pull the data we fetched out of the chainstore (where it should now be persisted) + tempcs := store.NewChainStore(bs.bserv.Blockstore(), datastore.NewMapDatastore(), nil) + + opts := ParseBSOptions(req.Options) + tsk := types.NewTipSetKey(req.Start...) + chain, err := collectChainSegment(tempcs, tsk, req.RequestLength, opts) + if err != nil { + return nil, xerrors.Errorf("failed to load chain data from chainstore after successful graphsync response (start = %v): %w", req.Start, err) + } + wholeChain = append(wholeChain, chain...) + totalDepth += nextReq.RequestLength + nextCids := make([]cid.Cid, 0, len(chain[len(chain)-1].Blocks)) + for _, blk := range chain[len(chain)-1].Blocks { + if blk.Height == 0 || blk.Parents == nil { + reachedGenesis = true + } + nextCids = append(nextCids, blk.Cid()) + } + nextReq.Start = nextCids + nextReq.RequestLength = req.RequestLength - totalDepth } - // Now pull the data we fetched out of the chainstore (where it should now be persisted) - tempcs := store.NewChainStore(bs.bserv.Blockstore(), datastore.NewMapDatastore(), nil) - - opts := ParseBSOptions(req.Options) - tsk := types.NewTipSetKey(req.Start...) - chain, err := collectChainSegment(tempcs, tsk, req.RequestLength, opts) - if err != nil { - return nil, xerrors.Errorf("failed to load chain data from chainstore after successful graphsync response (start = %v): %w", req.Start, err) - } - - return &BlockSyncResponse{Chain: chain}, nil + return &BlockSyncResponse{Chain: wholeChain}, nil } From 9d7f19b9507d1790e9cf241d3b2a57b937c12d3a Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Fri, 20 Mar 2020 21:23:29 -0700 Subject: [PATCH 07/23] some cleanup --- chain/blocksync/graphsync_client.go | 80 ++++++++--------------------- 1 file changed, 20 insertions(+), 60 deletions(-) diff --git a/chain/blocksync/graphsync_client.go b/chain/blocksync/graphsync_client.go index 6fadb44b2..e5ad2134e 100644 --- a/chain/blocksync/graphsync_client.go +++ b/chain/blocksync/graphsync_client.go @@ -19,8 +19,6 @@ import ( ) const ( - // could be anything? <100 though I think is the base limit - recursionDepth = 50 // AMT selector recursion. An AMT has arity of 8 so this gives allows // us to retrieve trees with 8^10 (1,073,741,824) elements. @@ -46,21 +44,11 @@ const ( maxRequestLength = 50 ) -var blockHeadersSelector, fullSelector ipld.Node - var amtSelector selectorbuilder.SelectorSpec func init() { // builer for selectors ssb := selectorbuilder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) - // blockHeaders only selector - blockHeadersSelector = ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(recursionDepth), ssb.ExploreIndex(blockIndexParentsField, - ssb.ExploreUnion( - ssb.ExploreAll( - ssb.Matcher(), - ), - ssb.ExploreIndex(0, ssb.ExploreRecursiveEdge()), - ))).Node() // amt selector -- needed to selector through a messages AMT amtSelector = ssb.ExploreIndex(amtHeadNodeFieldIndex, ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(int(amtRecursionDepth)), @@ -69,16 +57,6 @@ func init() { ssb.ExploreAll(ssb.ExploreRecursiveEdge())), ssb.ExploreIndex(amtNodeValuesFieldIndex, ssb.ExploreAll(ssb.Matcher()))))) - // messages too selector - fullSelector = ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(recursionDepth), - ssb.ExploreIndex(blockIndexParentsField, - ssb.ExploreUnion( - ssb.ExploreAll( - ssb.ExploreIndex(blockIndexMessagesField, - ssb.ExploreRange(0, 2, amtSelector), - )), - ssb.ExploreIndex(0, ssb.ExploreRecursiveEdge()), - ))).Node() } func selectorForRequest(req *BlockSyncRequest) ipld.Node { @@ -104,7 +82,6 @@ func selectorForRequest(req *BlockSyncRequest) ipld.Node { ), ssb.ExploreIndex(0, ssb.ExploreRecursiveEdge()), ))).Node() - } func firstTipsetSelector(req *BlockSyncRequest) ipld.Node { @@ -144,43 +121,26 @@ func (bs *BlockSync) fetchBlocksGraphSync(ctx context.Context, p peer.ID, req *B } } - var totalDepth uint64 = 0 - var nextReq BlockSyncRequest = *req - var wholeChain []*BSTipSet - var reachedGenesis bool - for totalDepth < req.RequestLength && !reachedGenesis { - if nextReq.RequestLength > maxRequestLength { - nextReq.RequestLength = maxRequestLength - } - - sel := selectorForRequest(&nextReq) - - // execute the selector forreal - if err := bs.executeGsyncSelector(ctx, p, req.Start[0], sel); err != nil { - return nil, err - } - - // Now pull the data we fetched out of the chainstore (where it should now be persisted) - tempcs := store.NewChainStore(bs.bserv.Blockstore(), datastore.NewMapDatastore(), nil) - - opts := ParseBSOptions(req.Options) - tsk := types.NewTipSetKey(req.Start...) - chain, err := collectChainSegment(tempcs, tsk, req.RequestLength, opts) - if err != nil { - return nil, xerrors.Errorf("failed to load chain data from chainstore after successful graphsync response (start = %v): %w", req.Start, err) - } - wholeChain = append(wholeChain, chain...) - totalDepth += nextReq.RequestLength - nextCids := make([]cid.Cid, 0, len(chain[len(chain)-1].Blocks)) - for _, blk := range chain[len(chain)-1].Blocks { - if blk.Height == 0 || blk.Parents == nil { - reachedGenesis = true - } - nextCids = append(nextCids, blk.Cid()) - } - nextReq.Start = nextCids - nextReq.RequestLength = req.RequestLength - totalDepth + if req.RequestLength > maxRequestLength { + req.RequestLength = maxRequestLength } - return &BlockSyncResponse{Chain: wholeChain}, nil + sel := selectorForRequest(req) + + // execute the selector forreal + if err := bs.executeGsyncSelector(ctx, p, req.Start[0], sel); err != nil { + return nil, err + } + + // Now pull the data we fetched out of the chainstore (where it should now be persisted) + tempcs := store.NewChainStore(bs.bserv.Blockstore(), datastore.NewMapDatastore(), nil) + + opts := ParseBSOptions(req.Options) + tsk := types.NewTipSetKey(req.Start...) + chain, err := collectChainSegment(tempcs, tsk, req.RequestLength, opts) + if err != nil { + return nil, xerrors.Errorf("failed to load chain data from chainstore after successful graphsync response (start = %v): %w", req.Start, err) + } + + return &BlockSyncResponse{Chain: chain}, nil } From f3781e8329b29c55a1dfb59481c255f34dd6a5bc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 21 Mar 2020 14:17:01 -0700 Subject: [PATCH 08/23] update and rerun cbor gen --- api/cbor_gen.go | 2 +- chain/blocksync/cbor_gen.go | 2 +- chain/types/cbor_gen.go | 30 +++++++++++++++--------------- go.mod | 2 +- go.sum | 2 ++ node/hello/cbor_gen.go | 4 ++-- paychmgr/cbor_gen.go | 8 ++++---- storage/sealing/cbor_gen.go | 4 ++-- 8 files changed, 28 insertions(+), 26 deletions(-) diff --git a/api/cbor_gen.go b/api/cbor_gen.go index 2a72de578..3e80fb67d 100644 --- a/api/cbor_gen.go +++ b/api/cbor_gen.go @@ -124,7 +124,7 @@ func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) error { { if err := t.Channel.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Channel: %w", err) } } diff --git a/chain/blocksync/cbor_gen.go b/chain/blocksync/cbor_gen.go index 60cb1c0b3..6668eb3a6 100644 --- a/chain/blocksync/cbor_gen.go +++ b/chain/blocksync/cbor_gen.go @@ -7,7 +7,7 @@ import ( "io" "github.com/filecoin-project/lotus/chain/types" - "github.com/ipfs/go-cid" + cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" ) diff --git a/chain/types/cbor_gen.go b/chain/types/cbor_gen.go index 0adccccbb..ab16fbcd5 100644 --- a/chain/types/cbor_gen.go +++ b/chain/types/cbor_gen.go @@ -9,7 +9,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/abi" "github.com/filecoin-project/specs-actors/actors/crypto" "github.com/filecoin-project/specs-actors/actors/runtime/exitcode" - "github.com/ipfs/go-cid" + cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" ) @@ -133,7 +133,7 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { { if err := t.Miner.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Miner: %w", err) } } @@ -153,7 +153,7 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { } else { t.Ticket = new(Ticket) if err := t.Ticket.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Ticket pointer: %w", err) } } @@ -163,7 +163,7 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { { if err := t.EPostProof.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.EPostProof: %w", err) } } @@ -198,7 +198,7 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { { if err := t.ParentWeight.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.ParentWeight: %w", err) } } @@ -268,7 +268,7 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { { if err := t.BLSAggregate.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.BLSAggregate: %w", err) } } @@ -302,7 +302,7 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { } else { t.BlockSig = new(crypto.Signature) if err := t.BlockSig.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.BlockSig pointer: %w", err) } } @@ -707,7 +707,7 @@ func (t *Message) UnmarshalCBOR(r io.Reader) error { { if err := t.To.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.To: %w", err) } } @@ -716,7 +716,7 @@ func (t *Message) UnmarshalCBOR(r io.Reader) error { { if err := t.From.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.From: %w", err) } } @@ -739,7 +739,7 @@ func (t *Message) UnmarshalCBOR(r io.Reader) error { { if err := t.Value.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Value: %w", err) } } @@ -748,7 +748,7 @@ func (t *Message) UnmarshalCBOR(r io.Reader) error { { if err := t.GasPrice.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.GasPrice: %w", err) } } @@ -852,7 +852,7 @@ func (t *SignedMessage) UnmarshalCBOR(r io.Reader) error { { if err := t.Message.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Message: %w", err) } } @@ -861,7 +861,7 @@ func (t *SignedMessage) UnmarshalCBOR(r io.Reader) error { { if err := t.Signature.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Signature: %w", err) } } @@ -1026,7 +1026,7 @@ func (t *Actor) UnmarshalCBOR(r io.Reader) error { { if err := t.Balance.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Balance: %w", err) } } @@ -1238,7 +1238,7 @@ func (t *BlockMsg) UnmarshalCBOR(r io.Reader) error { } else { t.Header = new(BlockHeader) if err := t.Header.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Header pointer: %w", err) } } diff --git a/go.mod b/go.mod index b15a48922..b8bc49cf2 100644 --- a/go.mod +++ b/go.mod @@ -92,7 +92,7 @@ require ( github.com/prometheus/common v0.4.0 // indirect github.com/stretchr/testify v1.4.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba - github.com/whyrusleeping/cbor-gen v0.0.0-20200222160900-51052a1e8191 + github.com/whyrusleeping/cbor-gen v0.0.0-20200321164527-9340289d0ca7 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 github.com/whyrusleeping/pubsub v0.0.0-20131020042734-02de8aa2db3d go.opencensus.io v0.22.2 diff --git a/go.sum b/go.sum index 1d1481fc2..3124f53bb 100644 --- a/go.sum +++ b/go.sum @@ -759,6 +759,8 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:X github.com/whyrusleeping/cbor-gen v0.0.0-20200206220010-03c9665e2a66/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200222160900-51052a1e8191 h1:TeuxLwKwQy612jEhfVhGJTqLsM2EwMi1eJE052ug+NY= github.com/whyrusleeping/cbor-gen v0.0.0-20200222160900-51052a1e8191/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= +github.com/whyrusleeping/cbor-gen v0.0.0-20200321164527-9340289d0ca7 h1:SVU2yhhHHamTPIMT9kk28KSYdO3ykTZeIp5p+6G9qNk= +github.com/whyrusleeping/cbor-gen v0.0.0-20200321164527-9340289d0ca7/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= 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= diff --git a/node/hello/cbor_gen.go b/node/hello/cbor_gen.go index 3572e1594..f65beaeff 100644 --- a/node/hello/cbor_gen.go +++ b/node/hello/cbor_gen.go @@ -7,7 +7,7 @@ import ( "io" "github.com/filecoin-project/specs-actors/actors/abi" - "github.com/ipfs/go-cid" + cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" ) @@ -133,7 +133,7 @@ func (t *HelloMessage) UnmarshalCBOR(r io.Reader) error { { if err := t.HeaviestTipSetWeight.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.HeaviestTipSetWeight: %w", err) } } diff --git a/paychmgr/cbor_gen.go b/paychmgr/cbor_gen.go index 158fd5912..abaf760f5 100644 --- a/paychmgr/cbor_gen.go +++ b/paychmgr/cbor_gen.go @@ -110,7 +110,7 @@ func (t *VoucherInfo) UnmarshalCBOR(r io.Reader) error { } else { t.Voucher = new(paych.SignedVoucher) if err := t.Voucher.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Voucher pointer: %w", err) } } @@ -294,7 +294,7 @@ func (t *ChannelInfo) UnmarshalCBOR(r io.Reader) error { { if err := t.Channel.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Channel: %w", err) } } @@ -304,7 +304,7 @@ func (t *ChannelInfo) UnmarshalCBOR(r io.Reader) error { { if err := t.Control.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Control: %w", err) } } @@ -314,7 +314,7 @@ func (t *ChannelInfo) UnmarshalCBOR(r io.Reader) error { { if err := t.Target.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Target: %w", err) } } diff --git a/storage/sealing/cbor_gen.go b/storage/sealing/cbor_gen.go index 6fe46d985..42ad7c029 100644 --- a/storage/sealing/cbor_gen.go +++ b/storage/sealing/cbor_gen.go @@ -694,7 +694,7 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) error { { if err := t.Ticket.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Ticket: %w", err) } } @@ -729,7 +729,7 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) error { { if err := t.Seed.UnmarshalCBOR(br); err != nil { - return err + return xerrors.Errorf("unmarshaling t.Seed: %w", err) } } From f1dbd35407269313df4fa8ab2405304376aed7b5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 21 Mar 2020 15:25:00 -0700 Subject: [PATCH 09/23] change genesis fields to match interop --- chain/events/events_test.go | 4 ++-- chain/events/tscache_test.go | 4 ++-- chain/gen/genesis/genesis.go | 9 +++------ chain/gen/mining.go | 4 ++-- chain/sync.go | 2 +- chain/types/blockheader.go | 2 +- chain/types/blockheader_test.go | 2 +- chain/types/cbor_gen.go | 16 ++++++++++++++-- chain/types/mock/chain.go | 2 +- node/hello/cbor_gen.go | 2 +- 10 files changed, 28 insertions(+), 19 deletions(-) diff --git a/chain/events/events_test.go b/chain/events/events_test.go index eaddad69b..c599b676b 100644 --- a/chain/events/events_test.go +++ b/chain/events/events_test.go @@ -70,7 +70,7 @@ func makeTs(t *testing.T, h abi.ChainEpoch, msgcid cid.Cid) *types.TipSet { ParentMessageReceipts: dummyCid, BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS}, - BLSAggregate: crypto.Signature{Type: crypto.SigTypeBLS}, + BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS}, }, { Height: h, @@ -83,7 +83,7 @@ func makeTs(t *testing.T, h abi.ChainEpoch, msgcid cid.Cid) *types.TipSet { ParentMessageReceipts: dummyCid, BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS}, - BLSAggregate: crypto.Signature{Type: crypto.SigTypeBLS}, + BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS}, }, }) diff --git a/chain/events/tscache_test.go b/chain/events/tscache_test.go index 62a8a2d25..1278e58e9 100644 --- a/chain/events/tscache_test.go +++ b/chain/events/tscache_test.go @@ -30,7 +30,7 @@ func TestTsCache(t *testing.T) { Messages: dummyCid, ParentMessageReceipts: dummyCid, BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS}, - BLSAggregate: crypto.Signature{Type: crypto.SigTypeBLS}, + BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS}, }}) if err != nil { t.Fatal(err) @@ -72,7 +72,7 @@ func TestTsCacheNulls(t *testing.T) { Messages: dummyCid, ParentMessageReceipts: dummyCid, BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS}, - BLSAggregate: crypto.Signature{Type: crypto.SigTypeBLS}, + BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS}, }}) if err != nil { t.Fatal(err) diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index 0e46b0079..35f69d221 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -5,10 +5,8 @@ import ( "encoding/json" "github.com/filecoin-project/go-amt-ipld/v2" - "github.com/filecoin-project/specs-actors/actors/abi" "github.com/filecoin-project/specs-actors/actors/builtin" "github.com/filecoin-project/specs-actors/actors/builtin/account" - "github.com/filecoin-project/specs-actors/actors/crypto" "github.com/filecoin-project/specs-actors/actors/runtime" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" @@ -254,10 +252,9 @@ func MakeGenesisBlock(ctx context.Context, bs bstore.Blockstore, sys runtime.Sys } b := &types.BlockHeader{ - Miner: builtin.InitActorAddr, + Miner: builtin.SystemActorAddr, Ticket: genesisticket, EPostProof: types.EPostProof{ - Proofs: []abi.PoStProof{{ProofBytes: []byte("not a real proof")}}, PostRand: []byte("i guess this is kinda random"), }, Parents: []cid.Cid{}, @@ -266,8 +263,8 @@ func MakeGenesisBlock(ctx context.Context, bs bstore.Blockstore, sys runtime.Sys ParentStateRoot: stateroot, Messages: mmb.Cid(), ParentMessageReceipts: emptyroot, - BLSAggregate: crypto.Signature{Type: crypto.SigTypeBLS, Data: []byte("signatureeee")}, - BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS, Data: []byte("block signatureeee")}, + BLSAggregate: nil, + BlockSig: nil, Timestamp: template.Timestamp, } diff --git a/chain/gen/mining.go b/chain/gen/mining.go index 5b8bafa85..083d972c1 100644 --- a/chain/gen/mining.go +++ b/chain/gen/mining.go @@ -133,7 +133,7 @@ func MinerCreateBlock(ctx context.Context, sm *stmgr.StateManager, w *wallet.Wal return fullBlock, nil } -func aggregateSignatures(sigs []crypto.Signature) (crypto.Signature, error) { +func aggregateSignatures(sigs []crypto.Signature) (*crypto.Signature, error) { var blsSigs []bls.Signature for _, s := range sigs { var bsig bls.Signature @@ -142,7 +142,7 @@ func aggregateSignatures(sigs []crypto.Signature) (crypto.Signature, error) { } aggSig := bls.Aggregate(blsSigs) - return crypto.Signature{ + return &crypto.Signature{ Type: crypto.SigTypeBLS, Data: aggSig[:], }, nil diff --git a/chain/sync.go b/chain/sync.go index eeb78b745..87759d422 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -874,7 +874,7 @@ func (syncer *Syncer) checkBlockMessages(ctx context.Context, b *types.FullBlock return nil } -func (syncer *Syncer) verifyBlsAggregate(ctx context.Context, sig crypto.Signature, msgs []cid.Cid, pubks []bls.PublicKey) error { +func (syncer *Syncer) verifyBlsAggregate(ctx context.Context, sig *crypto.Signature, msgs []cid.Cid, pubks []bls.PublicKey) error { _, span := trace.StartSpan(ctx, "syncer.verifyBlsAggregate") defer span.End() span.AddAttributes( diff --git a/chain/types/blockheader.go b/chain/types/blockheader.go index 7d579a261..1bffe2230 100644 --- a/chain/types/blockheader.go +++ b/chain/types/blockheader.go @@ -53,7 +53,7 @@ type BlockHeader struct { Messages cid.Cid // 8 - BLSAggregate crypto.Signature // 9 + BLSAggregate *crypto.Signature // 9 Timestamp uint64 // 10 diff --git a/chain/types/blockheader_test.go b/chain/types/blockheader_test.go index 7a59ccdcc..d46bc1876 100644 --- a/chain/types/blockheader_test.go +++ b/chain/types/blockheader_test.go @@ -36,7 +36,7 @@ func testBlockHeader(t testing.TB) *BlockHeader { }, Parents: []cid.Cid{c, c}, ParentMessageReceipts: c, - BLSAggregate: crypto.Signature{Type: crypto.SigTypeBLS, Data: []byte("boo! im a signature")}, + BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS, Data: []byte("boo! im a signature")}, ParentWeight: NewInt(123125126212), Messages: c, Height: 85919298723, diff --git a/chain/types/cbor_gen.go b/chain/types/cbor_gen.go index ab16fbcd5..e1c3e4474 100644 --- a/chain/types/cbor_gen.go +++ b/chain/types/cbor_gen.go @@ -267,8 +267,20 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { { - if err := t.BLSAggregate.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.BLSAggregate: %w", err) + pb, err := br.PeekByte() + if err != nil { + return err + } + if pb == cbg.CborNull[0] { + var nbuf [1]byte + if _, err := br.Read(nbuf[:]); err != nil { + return err + } + } else { + t.BLSAggregate = new(crypto.Signature) + if err := t.BLSAggregate.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.BLSAggregate pointer: %w", err) + } } } diff --git a/chain/types/mock/chain.go b/chain/types/mock/chain.go index b10ebe728..4b5494e0c 100644 --- a/chain/types/mock/chain.go +++ b/chain/types/mock/chain.go @@ -68,7 +68,7 @@ func MkBlock(parents *types.TipSet, weightInc uint64, ticketNonce uint64) *types }, Parents: pcids, ParentMessageReceipts: c, - BLSAggregate: crypto.Signature{Type: crypto.SigTypeBLS, Data: []byte("boo! im a signature")}, + BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS, Data: []byte("boo! im a signature")}, ParentWeight: weight, Messages: c, Height: height, diff --git a/node/hello/cbor_gen.go b/node/hello/cbor_gen.go index f65beaeff..5185496b9 100644 --- a/node/hello/cbor_gen.go +++ b/node/hello/cbor_gen.go @@ -7,7 +7,7 @@ import ( "io" "github.com/filecoin-project/specs-actors/actors/abi" - cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" ) From 719cec13d52488c9fbb354bcf1307417d81ee98d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 23 Mar 2020 13:46:15 -0700 Subject: [PATCH 10/23] prefer blocksync, fallback to graphsync --- chain/blocksync/blocksync_client.go | 2 +- go.sum | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/chain/blocksync/blocksync_client.go b/chain/blocksync/blocksync_client.go index 9ff85657a..c1048934f 100644 --- a/chain/blocksync/blocksync_client.go +++ b/chain/blocksync/blocksync_client.go @@ -245,7 +245,7 @@ func (bs *BlockSync) sendRequestToPeer(ctx context.Context, p peer.ID, req *Bloc } gsproto := string(gsnet.ProtocolGraphsync) - supp, err := bs.host.Peerstore().SupportsProtocols(p /*, BlockSyncProtocolID, */, gsproto) + supp, err := bs.host.Peerstore().SupportsProtocols(p, BlockSyncProtocolID, gsproto) if err != nil { return nil, xerrors.Errorf("failed to get protocols for peer: %w", err) } diff --git a/go.sum b/go.sum index 5913eb2f1..b2feb66e1 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,7 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= @@ -25,6 +26,7 @@ github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrU 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/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -352,6 +354,7 @@ github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -653,6 +656,7 @@ github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXS github.com/multiformats/go-varint v0.0.5 h1:XVZwSo04Cs3j/jS0uAEPpT3JY6DzMcVLLoWOSnCxOjg= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -748,7 +752,9 @@ github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli/v2 v2.0.0 h1:+HU9SCbu8GnEUFtIBfuUNXN39ofWViIEJIp6SURMpCg= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= From 8bc4195b7ab7e9477f2d1c5d705cd5b0464c8346 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 22 Mar 2020 23:39:42 -0700 Subject: [PATCH 11/23] WIP: updating and getting chainval tests passing --- chain/validation/state.go | 4 +-- chain/vm/runtime.go | 30 ++++++++++------------ chain/vm/validation_test.go | 2 +- chain/vm/vm.go | 51 ++++++++++++++++++++----------------- go.mod | 4 +-- go.sum | 16 +++--------- 6 files changed, 50 insertions(+), 57 deletions(-) diff --git a/chain/validation/state.go b/chain/validation/state.go index 7ac9717ca..b4538a09f 100644 --- a/chain/validation/state.go +++ b/chain/validation/state.go @@ -171,8 +171,8 @@ func (a *actorWrapper) Head() cid.Cid { return a.Actor.Head } -func (a *actorWrapper) CallSeqNum() int64 { - return int64(a.Actor.Nonce) +func (a *actorWrapper) CallSeqNum() uint64 { + return a.Actor.Nonce } func (a *actorWrapper) Balance() big.Int { diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 492900990..76bf5db55 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "encoding/binary" + "fmt" "github.com/filecoin-project/go-address" "github.com/filecoin-project/specs-actors/actors/abi" @@ -47,10 +48,10 @@ type Runtime struct { numActorsCreated uint64 } -func (rs *Runtime) ResolveAddress(address address.Address) (ret address.Address, ok bool) { - r, err := rs.LookupID(address) +func (rt *Runtime) ResolveAddress(address address.Address) (ret address.Address, ok bool) { + r, err := rt.state.LookupID(address) if err != nil { // TODO: check notfound - rs.Abortf(exitcode.ErrPlaceholder, "resolve address: %v", err) + rt.Abortf(exitcode.ErrPlaceholder, "resolve address: %v", err) } return r, true } @@ -106,17 +107,17 @@ func (rs *Runtime) shimCall(f func() interface{}) (rval []byte, aerr aerrors.Act } func (rs *Runtime) Message() vmr.Message { - var err error + var ok bool rawm := *rs.msg - rawm.From, err = rs.LookupID(rawm.From) - if err != nil { - rs.Abortf(exitcode.ErrPlaceholder, "resolve from address: %v", err) + rawm.From, ok = rs.ResolveAddress(rawm.From) + if !ok { + rs.Abortf(exitcode.ErrPlaceholder, "resolve from address failed") } - rawm.To, err = rs.LookupID(rawm.To) - if err != nil { - rs.Abortf(exitcode.ErrPlaceholder, "resolve to address: %v", err) + rawm.To, ok = rs.ResolveAddress(rawm.To) + if !ok { + rs.Abortf(exitcode.ErrPlaceholder, "resolve to address failed") } return &rawm @@ -218,8 +219,8 @@ func (rs *Runtime) StartSpan(name string) vmr.TraceSpan { } func (rt *Runtime) ValidateImmediateCallerIs(as ...address.Address) { - imm, err := rt.LookupID(rt.Message().Caller()) - if err != nil { + imm, ok := rt.ResolveAddress(rt.Message().Caller()) + if !ok { rt.Abortf(exitcode.ErrIllegalState, "couldn't resolve immediate caller") } @@ -236,6 +237,7 @@ func (rt *Runtime) Context() context.Context { } func (rs *Runtime) Abortf(code exitcode.ExitCode, msg string, args ...interface{}) { + log.Error("Abortf: ", fmt.Sprintf(msg, args...)) panic(aerrors.NewfSkip(2, uint8(code), msg, args...)) } @@ -384,10 +386,6 @@ func (ssh *shimStateHandle) Transaction(obj vmr.CBORer, f func() interface{}) in return out } -func (rt *Runtime) LookupID(a address.Address) (address.Address, error) { - return rt.state.LookupID(a) -} - func (rt *Runtime) GetBalance(a address.Address) (types.BigInt, aerrors.ActorError) { act, err := rt.state.GetActor(a) switch err { diff --git a/chain/vm/validation_test.go b/chain/vm/validation_test.go index 26e02fb56..9684bd52d 100644 --- a/chain/vm/validation_test.go +++ b/chain/vm/validation_test.go @@ -36,7 +36,7 @@ func init() { // initialize the test skipper with tests being skipped TestSuiteSkipper = TestSkipper{testSkips: []suites.TestCase{ /* tests to skip go here */ - tipset.TestInternalMessageApplicationFailure, + //tipset.TestInternalMessageApplicationFailure, tipset.TestInvalidSenderAddress, tipset.TestBlockMessageDeduplication, tipset.TestMinerSubmitFallbackPoSt, diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 559d15bf4..3293ab501 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -192,30 +192,14 @@ type ApplyRet struct { func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, gasCharge int64) ([]byte, aerrors.ActorError, *Runtime) { - st := vm.cstate - - fromActor, err := st.GetActor(msg.From) - if err != nil { - return nil, aerrors.Absorb(err, 1, "could not find source actor"), nil + origin, aerr := ResolveToKeyAddr(vm.cstate, vm.cst, msg.From) + if aerr != nil { + return nil, aerr, nil } + st := vm.cstate gasUsed := gasCharge - toActor, err := st.GetActor(msg.To) - if err != nil { - if xerrors.Is(err, init_.ErrAddressNotFound) { - a, err := TryCreateAccountActor(st, msg.To) - if err != nil { - return nil, aerrors.Absorb(err, 1, "could not create account"), nil - } - toActor = a - gasUsed += PricelistByEpoch(vm.blockHeight).OnCreateActor() - } else { - return nil, aerrors.Escalate(err, "getting actor"), nil - } - } - - origin := msg.From on := msg.Nonce var nac uint64 = 0 if parent != nil { @@ -231,7 +215,26 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, }() } - aerr := rt.chargeGasSafe(rt.Pricelist().OnMethodInvocation(msg.Value, msg.Method)) + fromActor, err := st.GetActor(msg.From) + if err != nil { + return nil, aerrors.Absorb(err, 1, "could not find source actor"), rt + } + + toActor, err := st.GetActor(msg.To) + if err != nil { + if xerrors.Is(err, init_.ErrAddressNotFound) { + a, err := TryCreateAccountActor(st, msg.To) + if err != nil { + return nil, aerrors.Absorb(err, 1, "could not create account"), rt + } + toActor = a + gasUsed += PricelistByEpoch(vm.blockHeight).OnCreateActor() + } else { + return nil, aerrors.Escalate(err, "getting actor"), rt + } + } + + aerr = rt.chargeGasSafe(rt.Pricelist().OnMethodInvocation(msg.Value, msg.Method)) if aerr != nil { return nil, aerr, rt } @@ -348,6 +351,9 @@ func (vm *VM) ApplyMessage(ctx context.Context, msg *types.Message) (*ApplyRet, defer st.ClearSnapshot() ret, actorErr, rt := vm.send(ctx, msg, nil, msgGasCost) + if aerrors.IsFatal(actorErr) { + return nil, xerrors.Errorf("[from=%s,to=%s,n=%d,m=%d,h=%d] fatal error: %w", msg.From, msg.To, msg.Nonce, msg.Method, vm.blockHeight, actorErr) + } { actorErr2 := rt.chargeGasSafe(rt.Pricelist().OnChainReturnValue(len(ret))) @@ -357,9 +363,6 @@ func (vm *VM) ApplyMessage(ctx context.Context, msg *types.Message) (*ApplyRet, } } - if aerrors.IsFatal(actorErr) { - return nil, xerrors.Errorf("[from=%s,to=%s,n=%d,m=%d,h=%d] fatal error: %w", msg.From, msg.To, msg.Nonce, msg.Method, vm.blockHeight, actorErr) - } if actorErr != nil { log.Warnw("Send actor error", "from", msg.From, "to", msg.To, "nonce", msg.Nonce, "method", msg.Method, "height", vm.blockHeight, "error", fmt.Sprintf("%+v", actorErr)) } diff --git a/go.mod b/go.mod index a4d542ea1..c3b5f3357 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/coreos/go-systemd/v22 v22.0.0 github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f // indirect github.com/docker/go-units v0.4.0 - github.com/filecoin-project/chain-validation v0.0.6-0.20200320210432-2793319e9867 + github.com/filecoin-project/chain-validation v0.0.6-0.20200322224319-fcaa08b8283d github.com/filecoin-project/filecoin-ffi v0.0.0-20200304181354-4446ff8a1bb9 github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200131012142-05d80eeccc5e @@ -26,7 +26,7 @@ require ( github.com/filecoin-project/go-sectorbuilder v0.0.2-0.20200314022627-38af9db49ba2 github.com/filecoin-project/go-statemachine v0.0.0-20200226041606-2074af6d51d9 github.com/filecoin-project/go-statestore v0.1.0 - github.com/filecoin-project/specs-actors v0.0.0-20200312030511-3f5510bf6130 + github.com/filecoin-project/specs-actors v0.0.0-20200321055844-54fa2e8da1c2 github.com/filecoin-project/specs-storage v0.0.0-20200303233430-1a5a408f7513 github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 github.com/go-ole/go-ole v1.2.4 // indirect diff --git a/go.sum b/go.sum index 6927f4466..539f4de2d 100644 --- a/go.sum +++ b/go.sum @@ -10,7 +10,6 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= @@ -26,7 +25,6 @@ github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrU 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/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -99,8 +97,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/fatih/color v1.8.0 h1:5bzFgL+oy7JITMTxUPJ00n7VxmYd/PdMp5mHFX40/RY= github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= -github.com/filecoin-project/chain-validation v0.0.6-0.20200320210432-2793319e9867 h1:6+9Khz+vidBfWG7xQ6a2uRpLnd3RhMVcOwJxu3XhvgI= -github.com/filecoin-project/chain-validation v0.0.6-0.20200320210432-2793319e9867/go.mod h1:YTLxUr6gOZpkUaXzLe7OZ4s1dpfJGp2FY/J2/K5DJqc= +github.com/filecoin-project/chain-validation v0.0.6-0.20200322224319-fcaa08b8283d h1:mI7PdOtOME1uqIJpFU8ki/hRkZNvh0O8OFLiHEnczgY= +github.com/filecoin-project/chain-validation v0.0.6-0.20200322224319-fcaa08b8283d/go.mod h1:YTLxUr6gOZpkUaXzLe7OZ4s1dpfJGp2FY/J2/K5DJqc= github.com/filecoin-project/go-address v0.0.0-20200107215422-da8eea2842b5/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be h1:TooKBwR/g8jG0hZ3lqe9S5sy2vTUcLOZLlz3M5wGn2E= github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= @@ -133,8 +131,8 @@ github.com/filecoin-project/specs-actors v0.0.0-20200210130641-2d1fbd8672cf/go.m github.com/filecoin-project/specs-actors v0.0.0-20200226200336-94c9b92b2775/go.mod h1:0HAWYrvajFHDgRaKbF0rl+IybVLZL5z4gQ8koCMPhoU= github.com/filecoin-project/specs-actors v0.0.0-20200302223606-0eaf97b10aaf/go.mod h1:0HAWYrvajFHDgRaKbF0rl+IybVLZL5z4gQ8koCMPhoU= github.com/filecoin-project/specs-actors v0.0.0-20200306000749-99e98e61e2a0/go.mod h1:0HAWYrvajFHDgRaKbF0rl+IybVLZL5z4gQ8koCMPhoU= -github.com/filecoin-project/specs-actors v0.0.0-20200312030511-3f5510bf6130 h1:atiWEDtI/gzSm89fL+NyneLN3eHfBd1QPgOZyXPjA5M= -github.com/filecoin-project/specs-actors v0.0.0-20200312030511-3f5510bf6130/go.mod h1:5WngRgTN5Eo4+0SjCBqLzEr2l6Mj45DrP2606gBhqI0= +github.com/filecoin-project/specs-actors v0.0.0-20200321055844-54fa2e8da1c2 h1:6oyLnDQTUnqaVSy+GxiMsfS5EYZm6xtzXcylw29NtOk= +github.com/filecoin-project/specs-actors v0.0.0-20200321055844-54fa2e8da1c2/go.mod h1:5WngRgTN5Eo4+0SjCBqLzEr2l6Mj45DrP2606gBhqI0= github.com/filecoin-project/specs-storage v0.0.0-20200303233430-1a5a408f7513 h1:okBx3lPomwDxlPmRvyP078BwivDfdxNUlpCDhDD0ia8= github.com/filecoin-project/specs-storage v0.0.0-20200303233430-1a5a408f7513/go.mod h1:sC2Ck2l1G8hXI5Do/3sp0yxbMRMnukbFwP9KF1CRFLw= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= @@ -354,7 +352,6 @@ github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -656,7 +653,6 @@ github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXS github.com/multiformats/go-varint v0.0.5 h1:XVZwSo04Cs3j/jS0uAEPpT3JY6DzMcVLLoWOSnCxOjg= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -752,9 +748,7 @@ github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli/v2 v2.0.0 h1:+HU9SCbu8GnEUFtIBfuUNXN39ofWViIEJIp6SURMpCg= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= @@ -767,8 +761,6 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20191212224538-d370462a7e8a/go.mod h1:x github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200206220010-03c9665e2a66/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200222160900-51052a1e8191 h1:TeuxLwKwQy612jEhfVhGJTqLsM2EwMi1eJE052ug+NY= -github.com/whyrusleeping/cbor-gen v0.0.0-20200222160900-51052a1e8191/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200321164527-9340289d0ca7 h1:SVU2yhhHHamTPIMT9kk28KSYdO3ykTZeIp5p+6G9qNk= github.com/whyrusleeping/cbor-gen v0.0.0-20200321164527-9340289d0ca7/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= From 1c55c6afbae19b5f053c23a218ec52ccb79f9806 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 22 Mar 2020 23:43:58 -0700 Subject: [PATCH 12/23] update to anorths chainval PR --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c3b5f3357..e376866f5 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/coreos/go-systemd/v22 v22.0.0 github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f // indirect github.com/docker/go-units v0.4.0 - github.com/filecoin-project/chain-validation v0.0.6-0.20200322224319-fcaa08b8283d + github.com/filecoin-project/chain-validation v0.0.6-0.20200322224124-43046d8bc33f github.com/filecoin-project/filecoin-ffi v0.0.0-20200304181354-4446ff8a1bb9 github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200131012142-05d80eeccc5e diff --git a/go.sum b/go.sum index 539f4de2d..730bb41df 100644 --- a/go.sum +++ b/go.sum @@ -97,8 +97,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/fatih/color v1.8.0 h1:5bzFgL+oy7JITMTxUPJ00n7VxmYd/PdMp5mHFX40/RY= github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= -github.com/filecoin-project/chain-validation v0.0.6-0.20200322224319-fcaa08b8283d h1:mI7PdOtOME1uqIJpFU8ki/hRkZNvh0O8OFLiHEnczgY= -github.com/filecoin-project/chain-validation v0.0.6-0.20200322224319-fcaa08b8283d/go.mod h1:YTLxUr6gOZpkUaXzLe7OZ4s1dpfJGp2FY/J2/K5DJqc= +github.com/filecoin-project/chain-validation v0.0.6-0.20200322224124-43046d8bc33f h1:+Hx42GMXOSd2masNH5MLnmd+I8mmHAqPOUErqV8UtC0= +github.com/filecoin-project/chain-validation v0.0.6-0.20200322224124-43046d8bc33f/go.mod h1:YTLxUr6gOZpkUaXzLe7OZ4s1dpfJGp2FY/J2/K5DJqc= github.com/filecoin-project/go-address v0.0.0-20200107215422-da8eea2842b5/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be h1:TooKBwR/g8jG0hZ3lqe9S5sy2vTUcLOZLlz3M5wGn2E= github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= From 05d43af3fc25f9ee94a4320f0b800fd56cb90c9f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 23 Mar 2020 04:17:45 -0400 Subject: [PATCH 13/23] Only try to resolve origin address during top-level invocation --- chain/vm/vm.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 3293ab501..b40accd35 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -191,15 +191,10 @@ type ApplyRet struct { func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, gasCharge int64) ([]byte, aerrors.ActorError, *Runtime) { - - origin, aerr := ResolveToKeyAddr(vm.cstate, vm.cst, msg.From) - if aerr != nil { - return nil, aerr, nil - } - st := vm.cstate gasUsed := gasCharge + var origin address.Address on := msg.Nonce var nac uint64 = 0 if parent != nil { @@ -207,6 +202,12 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, origin = parent.origin on = parent.originNonce nac = parent.numActorsCreated + } else { + var aerr aerrors.ActorError + origin, aerr = ResolveToKeyAddr(vm.cstate, vm.cst, msg.From) + if aerr != nil { + return nil, aerr, nil + } } rt := vm.makeRuntime(ctx, msg, origin, on, gasUsed, nac) if parent != nil { @@ -234,7 +235,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, } } - aerr = rt.chargeGasSafe(rt.Pricelist().OnMethodInvocation(msg.Value, msg.Method)) + aerr := rt.chargeGasSafe(rt.Pricelist().OnMethodInvocation(msg.Value, msg.Method)) if aerr != nil { return nil, aerr, rt } From 72c6552b0bafb123b1fb0763105009da954bf48d Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 23 Mar 2020 05:43:08 -0400 Subject: [PATCH 14/23] Allow invocation of account actor methods --- chain/vm/invoker.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/chain/vm/invoker.go b/chain/vm/invoker.go index 91258cacb..941c63903 100644 --- a/chain/vm/invoker.go +++ b/chain/vm/invoker.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/hex" "fmt" + "github.com/filecoin-project/specs-actors/actors/builtin/account" "reflect" "github.com/ipfs/go-cid" @@ -53,16 +54,13 @@ func NewInvoker() *invoker { inv.Register(builtin.StorageMinerActorCodeID, miner.Actor{}, miner.State{}) inv.Register(builtin.MultisigActorCodeID, multisig.Actor{}, multisig.State{}) inv.Register(builtin.PaymentChannelActorCodeID, paych.Actor{}, paych.State{}) + inv.Register(builtin.AccountActorCodeID, account.Actor{}, account.State{}) return inv } func (inv *invoker) Invoke(act *types.Actor, rt runtime.Runtime, method abi.MethodNum, params []byte) ([]byte, aerrors.ActorError) { - if act.Code == builtin.AccountActorCodeID { - return nil, aerrors.Newf(254, "cannot invoke methods on account actors") - } - code, ok := inv.builtInCode[act.Code] if !ok { log.Errorf("no code for actor %s (Addr: %s)", act.Code, rt.Message().Receiver()) From 066b755b6a86f6d3cee1d37733bdb079bde64008 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 23 Mar 2020 05:43:30 -0400 Subject: [PATCH 15/23] set up initial account state of new Secp accounts --- chain/vm/mkactor.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/chain/vm/mkactor.go b/chain/vm/mkactor.go index 9e14384cd..d8bc7bca8 100644 --- a/chain/vm/mkactor.go +++ b/chain/vm/mkactor.go @@ -74,10 +74,18 @@ func NewBLSAccountActor(st *state.StateTree, addr address.Address) (*types.Actor } func NewSecp256k1AccountActor(st *state.StateTree, addr address.Address) (*types.Actor, aerrors.ActorError) { + var acstate account.State + acstate.Address = addr + + c, err := st.Store.Put(context.TODO(), &acstate) + if err != nil { + return nil, aerrors.Escalate(err, "serializing account actor state") + } + nact := &types.Actor{ Code: builtin.AccountActorCodeID, Balance: types.NewInt(0), - Head: EmptyObjectCid, + Head: c, } return nact, nil From 6fe245a278a34e52b5a135da070840c9c4b712b4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 23 Mar 2020 13:44:06 -0700 Subject: [PATCH 16/23] use proper exitcodes for caller validation --- chain/vm/invoker.go | 8 +++++--- chain/vm/runtime.go | 4 ++-- chain/vm/validation_test.go | 1 - chain/vm/vm.go | 1 + 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/chain/vm/invoker.go b/chain/vm/invoker.go index 941c63903..e5716740f 100644 --- a/chain/vm/invoker.go +++ b/chain/vm/invoker.go @@ -4,9 +4,11 @@ import ( "bytes" "encoding/hex" "fmt" - "github.com/filecoin-project/specs-actors/actors/builtin/account" "reflect" + "github.com/filecoin-project/specs-actors/actors/builtin/account" + "github.com/filecoin-project/specs-actors/actors/runtime/exitcode" + "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" @@ -64,10 +66,10 @@ func (inv *invoker) Invoke(act *types.Actor, rt runtime.Runtime, method abi.Meth code, ok := inv.builtInCode[act.Code] if !ok { log.Errorf("no code for actor %s (Addr: %s)", act.Code, rt.Message().Receiver()) - return nil, aerrors.Newf(255, "no code for actor %s(%d)(%s)", act.Code, method, hex.EncodeToString(params)) + return nil, aerrors.Newf(byte(exitcode.SysErrorIllegalActor), "no code for actor %s(%d)(%s)", act.Code, method, hex.EncodeToString(params)) } if method >= abi.MethodNum(len(code)) || code[method] == nil { - return nil, aerrors.Newf(255, "no method %d on actor", method) + return nil, aerrors.Newf(byte(exitcode.SysErrInvalidMethod), "no method %d on actor", method) } return code[method](act, rt, params) diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 76bf5db55..f29798da9 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -229,7 +229,7 @@ func (rt *Runtime) ValidateImmediateCallerIs(as ...address.Address) { return } } - rt.Abortf(exitcode.ErrForbidden, "caller %s is not one of %s", rt.Message().Caller(), as) + rt.Abortf(exitcode.SysErrForbidden, "caller %s is not one of %s", rt.Message().Caller(), as) } func (rt *Runtime) Context() context.Context { @@ -255,7 +255,7 @@ func (rt *Runtime) ValidateImmediateCallerType(ts ...cid.Cid) { return } } - rt.Abortf(exitcode.ErrForbidden, "caller cid type %q was not one of %v", callerCid, ts) + rt.Abortf(exitcode.SysErrForbidden, "caller cid type %q was not one of %v", callerCid, ts) } func (rs *Runtime) CurrEpoch() abi.ChainEpoch { diff --git a/chain/vm/validation_test.go b/chain/vm/validation_test.go index 9684bd52d..b8570706d 100644 --- a/chain/vm/validation_test.go +++ b/chain/vm/validation_test.go @@ -36,7 +36,6 @@ func init() { // initialize the test skipper with tests being skipped TestSuiteSkipper = TestSkipper{testSkips: []suites.TestCase{ /* tests to skip go here */ - //tipset.TestInternalMessageApplicationFailure, tipset.TestInvalidSenderAddress, tipset.TestBlockMessageDeduplication, tipset.TestMinerSubmitFallbackPoSt, diff --git a/chain/vm/vm.go b/chain/vm/vm.go index b40accd35..8114c6241 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -209,6 +209,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, return nil, aerr, nil } } + rt := vm.makeRuntime(ctx, msg, origin, on, gasUsed, nac) if parent != nil { defer func() { From 2228f13f997028b736847b87fe2004441eb92305 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 23 Mar 2020 14:46:05 -0700 Subject: [PATCH 17/23] a couple vm fixes --- chain/vm/validation_test.go | 4 ++-- chain/vm/vm.go | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/chain/vm/validation_test.go b/chain/vm/validation_test.go index b8570706d..4a8e85331 100644 --- a/chain/vm/validation_test.go +++ b/chain/vm/validation_test.go @@ -36,8 +36,8 @@ func init() { // initialize the test skipper with tests being skipped TestSuiteSkipper = TestSkipper{testSkips: []suites.TestCase{ /* tests to skip go here */ - tipset.TestInvalidSenderAddress, - tipset.TestBlockMessageDeduplication, + //tipset.TestInvalidSenderAddress, + //tipset.TestBlockMessageDeduplication, tipset.TestMinerSubmitFallbackPoSt, tipset.TestMinerMissPoStChallengeWindow, }} diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 8114c6241..2daf38c8d 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -66,6 +66,14 @@ type ExecutionResult struct { // Send allows the current execution context to invoke methods on other actors in the system +func ResolveToStableAddr(state types.StateTree, cst cbor.IpldStore, addr address.Address) (address.Address, aerrors.ActorError) { + if addr == builtin.SystemActorAddr { + return addr, nil + } + + return ResolveToKeyAddr(state, cst, addr) +} + // ResolveToKeyAddr returns the public key type of address (`BLS`/`SECP256K1`) of an account actor identified by `addr`. func ResolveToKeyAddr(state types.StateTree, cst cbor.IpldStore, addr address.Address) (address.Address, aerrors.ActorError) { if addr.Protocol() == address.BLS || addr.Protocol() == address.SECP256K1 { @@ -74,11 +82,11 @@ func ResolveToKeyAddr(state types.StateTree, cst cbor.IpldStore, addr address.Ad act, err := state.GetActor(addr) if err != nil { - return address.Undef, aerrors.Newf(1, "failed to find actor: %s", addr) + return address.Undef, aerrors.Newf(byte(exitcode.SysErrActorNotFound), "failed to find actor: %s", addr) } if act.Code != builtin.AccountActorCodeID { - return address.Undef, aerrors.New(1, "address was not for an account actor") + return address.Undef, aerrors.Fatalf("address %s was not for an account actor", addr) } var aast account.State @@ -204,7 +212,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, nac = parent.numActorsCreated } else { var aerr aerrors.ActorError - origin, aerr = ResolveToKeyAddr(vm.cstate, vm.cst, msg.From) + origin, aerr = ResolveToStableAddr(vm.cstate, vm.cst, msg.From) if aerr != nil { return nil, aerr, nil } @@ -358,6 +366,9 @@ func (vm *VM) ApplyMessage(ctx context.Context, msg *types.Message) (*ApplyRet, } { + if rt == nil { + return nil, xerrors.Errorf("send returned nil runtime, send error was: %s", actorErr) + } actorErr2 := rt.chargeGasSafe(rt.Pricelist().OnChainReturnValue(len(ret))) if actorErr == nil { //TODO: Ambigous what to do in this case From 9e67bef4bd111aca296954617fa68da902caf1d9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 23 Mar 2020 18:31:21 -0700 Subject: [PATCH 18/23] drop balance checks in block validation --- chain/sync.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/chain/sync.go b/chain/sync.go index 2a6feff4d..d160e4a49 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -5,10 +5,11 @@ import ( "context" "errors" "fmt" - "github.com/minio/blake2b-simd" "sync" "time" + "github.com/minio/blake2b-simd" + "github.com/filecoin-project/specs-actors/actors/abi" "github.com/filecoin-project/specs-actors/actors/builtin" @@ -779,7 +780,6 @@ func (syncer *Syncer) checkBlockMessages(ctx context.Context, b *types.FullBlock } nonces := make(map[address.Address]uint64) - balances := make(map[address.Address]types.BigInt) stateroot, _, err := syncer.sm.TipSetState(ctx, baseTs) if err != nil { @@ -804,7 +804,6 @@ func (syncer *Syncer) checkBlockMessages(ctx context.Context, b *types.FullBlock return xerrors.Errorf("failed to get actor: %w", err) } nonces[m.From] = act.Nonce - balances[m.From] = act.Balance } if nonces[m.From] != m.Nonce { @@ -812,11 +811,6 @@ func (syncer *Syncer) checkBlockMessages(ctx context.Context, b *types.FullBlock } nonces[m.From]++ - if balances[m.From].LessThan(m.RequiredFunds()) { - return xerrors.Errorf("not enough funds for message execution") - } - - balances[m.From] = types.BigSub(balances[m.From], m.RequiredFunds()) return nil } From 14591e718dbbc65b9dd319ba3d235e34aa7d515f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 23 Mar 2020 18:52:39 -0700 Subject: [PATCH 19/23] skip tests so we can get this merged in --- chain/vm/validation_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/chain/vm/validation_test.go b/chain/vm/validation_test.go index 4a8e85331..c15b15a74 100644 --- a/chain/vm/validation_test.go +++ b/chain/vm/validation_test.go @@ -8,6 +8,7 @@ import ( "testing" suites "github.com/filecoin-project/chain-validation/suites" + "github.com/filecoin-project/chain-validation/suites/message" "github.com/filecoin-project/chain-validation/suites/tipset" factory "github.com/filecoin-project/lotus/chain/validation" @@ -36,10 +37,11 @@ func init() { // initialize the test skipper with tests being skipped TestSuiteSkipper = TestSkipper{testSkips: []suites.TestCase{ /* tests to skip go here */ - //tipset.TestInvalidSenderAddress, - //tipset.TestBlockMessageDeduplication, + tipset.TestInvalidSenderAddress, + tipset.TestBlockMessageDeduplication, tipset.TestMinerSubmitFallbackPoSt, tipset.TestMinerMissPoStChallengeWindow, + message.TestNestedSends, }} } From 9ccc02d66476f3e7fed80fbf374298e9927ef824 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 23 Mar 2020 23:17:29 -0400 Subject: [PATCH 20/23] Load actor states afresh before making state changes - Not doing this is causing bugs when reverting, since the actor cache gets reset --- chain/vm/vm.go | 86 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 20 deletions(-) diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 2daf38c8d..2cea8900a 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -225,11 +225,6 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, }() } - fromActor, err := st.GetActor(msg.From) - if err != nil { - return nil, aerrors.Absorb(err, 1, "could not find source actor"), rt - } - toActor, err := st.GetActor(msg.To) if err != nil { if xerrors.Is(err, init_.ErrAddressNotFound) { @@ -250,7 +245,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, } if types.BigCmp(msg.Value, types.NewInt(0)) != 0 { - if err := Transfer(fromActor, toActor, msg.Value); err != nil { + if err := vm.transfer(msg.From, msg.To, msg.Value); err != nil { return nil, aerrors.Absorb(err, 1, "failed to transfer funds"), nil } } @@ -349,11 +344,13 @@ func (vm *VM) ApplyMessage(ctx context.Context, msg *types.Message) (*ApplyRet, } gasHolder := &types.Actor{Balance: types.NewInt(0)} - if err := Transfer(fromActor, gasHolder, gascost); err != nil { + if err := vm.transferToGasHolder(msg.From, gasHolder, gascost); err != nil { return nil, xerrors.Errorf("failed to withdraw gas funds: %w", err) } - fromActor.Nonce++ + if err := vm.incrementNonce(msg.From); err != nil { + return nil, err + } if err := st.Snapshot(ctx); err != nil { return nil, xerrors.Errorf("snapshot failed: %w", err) @@ -396,18 +393,13 @@ func (vm *VM) ApplyMessage(ctx context.Context, msg *types.Message) (*ApplyRet, } // refund unused gas refund := types.BigMul(types.NewInt(uint64(msg.GasLimit-gasUsed)), msg.GasPrice) - if err := Transfer(gasHolder, fromActor, refund); err != nil { + if err := vm.transferFromGasHolder(msg.From, gasHolder, refund); err != nil { return nil, xerrors.Errorf("failed to refund gas") } } - rwAct, err := st.GetActor(builtin.RewardActorAddr) - if err != nil { - return nil, xerrors.Errorf("getting burnt funds actor failed: %w", err) - } - gasReward := types.BigMul(msg.GasPrice, types.NewInt(uint64(gasUsed))) - if err := Transfer(gasHolder, rwAct, gasReward); err != nil { + if err := vm.transferFromGasHolder(builtin.RewardActorAddr, gasHolder, gasReward); err != nil { return nil, xerrors.Errorf("failed to give miner gas reward: %w", err) } @@ -595,7 +587,21 @@ func (vm *VM) Invoke(act *types.Actor, rt *Runtime, method abi.MethodNum, params return ret, nil } -func Transfer(from, to *types.Actor, amt types.BigInt) error { +func (vm *VM) SetInvoker(i *invoker) { + vm.inv = i +} + +func (vm *VM) incrementNonce(addr address.Address) error { + a, err := vm.cstate.GetActor(addr) + if err != nil { + return xerrors.Errorf("nonce increment of sender failed") + } + + a.Nonce++ + return nil +} + +func (vm *VM) transfer(from, to address.Address, amt types.BigInt) error { if from == to { return nil } @@ -604,15 +610,55 @@ func Transfer(from, to *types.Actor, amt types.BigInt) error { return xerrors.Errorf("attempted to transfer negative value") } - if err := deductFunds(from, amt); err != nil { + f, err := vm.cstate.GetActor(from) + if err != nil { + return xerrors.Errorf("transfer failed when retrieving sender actor") + } + + t, err := vm.cstate.GetActor(to) + if err != nil { + return xerrors.Errorf("transfer failed when retrieving receiver actor") + } + + if err := deductFunds(f, amt); err != nil { return err } - depositFunds(to, amt) + depositFunds(t, amt) return nil } -func (vm *VM) SetInvoker(i *invoker) { - vm.inv = i +func (vm *VM) transferToGasHolder(addr address.Address, gasHolder *types.Actor, amt types.BigInt) error { + if amt.LessThan(types.NewInt(0)) { + return xerrors.Errorf("attempted to transfer negative value to gas holder") + } + + a, err := vm.cstate.GetActor(addr) + if err != nil { + return xerrors.Errorf("transfer to gas holder failed when retrieving sender actor") + } + + if err := deductFunds(a, amt); err != nil { + return err + } + depositFunds(gasHolder, amt) + return nil +} + +func (vm *VM) transferFromGasHolder(addr address.Address, gasHolder *types.Actor, amt types.BigInt) error { + if amt.LessThan(types.NewInt(0)) { + return xerrors.Errorf("attempted to transfer negative value from gas holder") + } + + a, err := vm.cstate.GetActor(addr) + if err != nil { + return xerrors.Errorf("transfer from gas holder failed when retrieving receiver actor") + } + + if err := deductFunds(gasHolder, amt); err != nil { + return err + } + depositFunds(a, amt) + return nil } func deductFunds(act *types.Actor, amt types.BigInt) error { From 753e8ff7f57ae6a342032d90c8d6369a7920a47c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 24 Mar 2020 02:50:20 -0400 Subject: [PATCH 21/23] Award gas fees to miners correctly --- chain/stmgr/stmgr.go | 3 ++- chain/vm/validation_test.go | 4 +--- go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index 6894b8fd3..b65de7e1d 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -174,7 +174,7 @@ func (sm *StateManager) ApplyBlocks(ctx context.Context, pstate cid.Cid, bms []B vmi.SetBlockMiner(b.Miner) penalty := types.NewInt(0) - gasReward := types.NewInt(0) + gasReward := big.Zero() for _, cm := range append(b.BlsMessages, b.SecpkMessages...) { m := cm.VMMessage() @@ -198,6 +198,7 @@ func (sm *StateManager) ApplyBlocks(ctx context.Context, pstate cid.Cid, bms []B } receipts = append(receipts, &r.MessageReceipt) + gasReward = big.Add(gasReward, big.NewInt(r.GasUsed)) if cb != nil { if err := cb(cm.Cid(), m, r); err != nil { diff --git a/chain/vm/validation_test.go b/chain/vm/validation_test.go index c15b15a74..feb06810a 100644 --- a/chain/vm/validation_test.go +++ b/chain/vm/validation_test.go @@ -8,7 +8,6 @@ import ( "testing" suites "github.com/filecoin-project/chain-validation/suites" - "github.com/filecoin-project/chain-validation/suites/message" "github.com/filecoin-project/chain-validation/suites/tipset" factory "github.com/filecoin-project/lotus/chain/validation" @@ -37,11 +36,10 @@ func init() { // initialize the test skipper with tests being skipped TestSuiteSkipper = TestSkipper{testSkips: []suites.TestCase{ /* tests to skip go here */ - tipset.TestInvalidSenderAddress, tipset.TestBlockMessageDeduplication, tipset.TestMinerSubmitFallbackPoSt, tipset.TestMinerMissPoStChallengeWindow, - message.TestNestedSends, + tipset.TestMinerRewardsAndPenalties, }} } diff --git a/go.mod b/go.mod index e376866f5..f6b62393d 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/coreos/go-systemd/v22 v22.0.0 github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f // indirect github.com/docker/go-units v0.4.0 - github.com/filecoin-project/chain-validation v0.0.6-0.20200322224124-43046d8bc33f + github.com/filecoin-project/chain-validation v0.0.6-0.20200324001434-7c1ecd76e3eb github.com/filecoin-project/filecoin-ffi v0.0.0-20200304181354-4446ff8a1bb9 github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200131012142-05d80eeccc5e diff --git a/go.sum b/go.sum index 730bb41df..06866109a 100644 --- a/go.sum +++ b/go.sum @@ -97,8 +97,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/fatih/color v1.8.0 h1:5bzFgL+oy7JITMTxUPJ00n7VxmYd/PdMp5mHFX40/RY= github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= -github.com/filecoin-project/chain-validation v0.0.6-0.20200322224124-43046d8bc33f h1:+Hx42GMXOSd2masNH5MLnmd+I8mmHAqPOUErqV8UtC0= -github.com/filecoin-project/chain-validation v0.0.6-0.20200322224124-43046d8bc33f/go.mod h1:YTLxUr6gOZpkUaXzLe7OZ4s1dpfJGp2FY/J2/K5DJqc= +github.com/filecoin-project/chain-validation v0.0.6-0.20200324001434-7c1ecd76e3eb h1:tynvU1AYRXYAzRrMX6VZGYgUg3+/lweulbAyeZqET/I= +github.com/filecoin-project/chain-validation v0.0.6-0.20200324001434-7c1ecd76e3eb/go.mod h1:YTLxUr6gOZpkUaXzLe7OZ4s1dpfJGp2FY/J2/K5DJqc= github.com/filecoin-project/go-address v0.0.0-20200107215422-da8eea2842b5/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be h1:TooKBwR/g8jG0hZ3lqe9S5sy2vTUcLOZLlz3M5wGn2E= github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= From df13cfa52b21ef344d397f13171974f192961262 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 24 Mar 2020 04:43:09 -0400 Subject: [PATCH 22/23] Only resolve origin to pubkey address when creating a new account actor --- chain/vm/runtime.go | 3 ++- chain/vm/vm.go | 16 +--------------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index f29798da9..37e04f8c0 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -159,7 +159,8 @@ func (rs *Runtime) Store() vmr.Store { func (rt *Runtime) NewActorAddress() address.Address { var b bytes.Buffer - if err := rt.origin.MarshalCBOR(&b); err != nil { // todo: spec says cbor; why not just bytes? + oa, _ := ResolveToKeyAddr(rt.vm.cstate, rt.vm.cst, rt.origin) + if err := oa.MarshalCBOR(&b); err != nil { // todo: spec says cbor; why not just bytes? rt.Abortf(exitcode.ErrSerialization, "writing caller address into a buffer: %v", err) } diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 2cea8900a..eb78d2ed0 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -66,14 +66,6 @@ type ExecutionResult struct { // Send allows the current execution context to invoke methods on other actors in the system -func ResolveToStableAddr(state types.StateTree, cst cbor.IpldStore, addr address.Address) (address.Address, aerrors.ActorError) { - if addr == builtin.SystemActorAddr { - return addr, nil - } - - return ResolveToKeyAddr(state, cst, addr) -} - // ResolveToKeyAddr returns the public key type of address (`BLS`/`SECP256K1`) of an account actor identified by `addr`. func ResolveToKeyAddr(state types.StateTree, cst cbor.IpldStore, addr address.Address) (address.Address, aerrors.ActorError) { if addr.Protocol() == address.BLS || addr.Protocol() == address.SECP256K1 { @@ -202,7 +194,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, st := vm.cstate gasUsed := gasCharge - var origin address.Address + origin := msg.From on := msg.Nonce var nac uint64 = 0 if parent != nil { @@ -210,12 +202,6 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, origin = parent.origin on = parent.originNonce nac = parent.numActorsCreated - } else { - var aerr aerrors.ActorError - origin, aerr = ResolveToStableAddr(vm.cstate, vm.cst, msg.From) - if aerr != nil { - return nil, aerr, nil - } } rt := vm.makeRuntime(ctx, msg, origin, on, gasUsed, nac) From d5b1bfe1970298d193e0f53057d3b65413367fe6 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 24 Mar 2020 04:44:50 -0400 Subject: [PATCH 23/23] only skip one test --- chain/vm/validation_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/chain/vm/validation_test.go b/chain/vm/validation_test.go index feb06810a..8335f6ac7 100644 --- a/chain/vm/validation_test.go +++ b/chain/vm/validation_test.go @@ -36,9 +36,6 @@ func init() { // initialize the test skipper with tests being skipped TestSuiteSkipper = TestSkipper{testSkips: []suites.TestCase{ /* tests to skip go here */ - tipset.TestBlockMessageDeduplication, - tipset.TestMinerSubmitFallbackPoSt, - tipset.TestMinerMissPoStChallengeWindow, tipset.TestMinerRewardsAndPenalties, }} }