diff --git a/chain/actors/actor_storagepower.go b/chain/actors/actor_storagepower.go index 80a6f5fdf..e44ca87a0 100644 --- a/chain/actors/actor_storagepower.go +++ b/chain/actors/actor_storagepower.go @@ -144,11 +144,11 @@ func (spa StoragePowerActor) ArbitrateConsensusFault(act *types.Actor, vmctx typ return nil, aerrors.Absorb(oerr, 3, "response from 'GetWorkerAddr' was not a valid address") } - if err := params.Block1.CheckBlockSignature(worker); err != nil { + if err := params.Block1.CheckBlockSignature(vmctx.Context(), worker); err != nil { return nil, aerrors.Absorb(err, 4, "block1 did not have valid signature") } - if err := params.Block2.CheckBlockSignature(worker); err != nil { + if err := params.Block2.CheckBlockSignature(vmctx.Context(), worker); err != nil { return nil, aerrors.Absorb(err, 5, "block2 did not have valid signature") } @@ -169,7 +169,7 @@ func (spa StoragePowerActor) ArbitrateConsensusFault(act *types.Actor, vmctx typ } miner := params.Block1.Miner - if has, err := MinerSetHas(context.TODO(), vmctx, self.Miners, miner); err != nil { + if has, err := MinerSetHas(vmctx, self.Miners, miner); err != nil { return nil, aerrors.Wrapf(err, "failed to check miner in set") } else if !has { return nil, aerrors.New(7, "either already slashed or not a miner") @@ -276,7 +276,7 @@ func (spa StoragePowerActor) UpdateStorage(act *types.Actor, vmctx types.VMConte return nil, err } - has, err := MinerSetHas(context.TODO(), vmctx, self.Miners, vmctx.Message().From) + has, err := MinerSetHas(vmctx, self.Miners, vmctx.Message().From) if err != nil { return nil, err } @@ -327,7 +327,7 @@ func (spa StoragePowerActor) PowerLookup(act *types.Actor, vmctx types.VMContext } func powerLookup(ctx context.Context, vmctx types.VMContext, self *StoragePowerState, miner address.Address) (types.BigInt, ActorError) { - has, err := MinerSetHas(context.TODO(), vmctx, self.Miners, miner) + has, err := MinerSetHas(vmctx, self.Miners, miner) if err != nil { return types.EmptyInt, err } @@ -354,7 +354,7 @@ func (spa StoragePowerActor) IsMiner(act *types.Actor, vmctx types.VMContext, pa return nil, err } - has, err := MinerSetHas(context.TODO(), vmctx, self.Miners, param.Addr) + has, err := MinerSetHas(vmctx, self.Miners, param.Addr) if err != nil { return nil, err } @@ -432,13 +432,13 @@ func pledgeCollateralForSize(vmctx types.VMContext, size, totalStorage types.Big return types.BigAdd(powerCollateral, perCapCollateral), nil } -func MinerSetHas(ctx context.Context, vmctx types.VMContext, rcid cid.Cid, maddr address.Address) (bool, aerrors.ActorError) { - nd, err := hamt.LoadNode(ctx, vmctx.Ipld(), rcid) +func MinerSetHas(vmctx types.VMContext, rcid cid.Cid, maddr address.Address) (bool, aerrors.ActorError) { + nd, err := hamt.LoadNode(vmctx.Context(), vmctx.Ipld(), rcid) if err != nil { return false, aerrors.HandleExternalError(err, "failed to load miner set") } - err = nd.Find(ctx, string(maddr.Bytes()), nil) + err = nd.Find(vmctx.Context(), string(maddr.Bytes()), nil) switch err { case hamt.ErrNotFound: return false, nil diff --git a/chain/messagepool.go b/chain/messagepool.go index 845447af8..af6314cfd 100644 --- a/chain/messagepool.go +++ b/chain/messagepool.go @@ -61,7 +61,6 @@ func (ms *msgSet) add(m *types.SignedMessage) error { log.Error("Add with duplicate nonce") return xerrors.Errorf("message to %s with nonce %d already in mpool") } - log.Warn("Add called with the same message multiple times") } ms.msgs[m.Message.Nonce] = m diff --git a/chain/store/store.go b/chain/store/store.go index e9b1b8b73..8acda44a3 100644 --- a/chain/store/store.go +++ b/chain/store/store.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/go-lotus/build" "github.com/filecoin-project/go-lotus/chain/address" "github.com/filecoin-project/go-lotus/chain/state" + "go.opencensus.io/trace" "go.uber.org/zap" amt "github.com/filecoin-project/go-amt-ipld" @@ -727,6 +728,9 @@ func (cs *ChainStore) TryFillTipSet(ts *types.TipSet) (*FullTipSet, error) { } func (cs *ChainStore) GetRandomness(ctx context.Context, blks []cid.Cid, tickets []*types.Ticket, lb int64) ([]byte, error) { + ctx, span := trace.StartSpan(ctx, "store.GetRandomness") + defer span.End() + if lb < 0 { return nil, fmt.Errorf("negative lookback parameters are not valid (got %d)", lb) } diff --git a/chain/sync.go b/chain/sync.go index 8ce75744d..9456ad083 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -484,7 +484,7 @@ func (syncer *Syncer) ValidateBlock(ctx context.Context, b *types.FullBlock) err return xerrors.Errorf("GetMinerWorker failed: %w", err) } - if err := h.CheckBlockSignature(waddr); err != nil { + if err := h.CheckBlockSignature(ctx, waddr); err != nil { return xerrors.Errorf("check block signature failed: %w", err) } @@ -581,7 +581,7 @@ func (syncer *Syncer) checkBlockMessages(ctx context.Context, b *types.FullBlock pubks = append(pubks, pubk) } - if err := syncer.verifyBlsAggregate(b.Header.BLSAggregate, sigCids, pubks); err != nil { + if err := syncer.verifyBlsAggregate(ctx, b.Header.BLSAggregate, sigCids, pubks); err != nil { return xerrors.Errorf("bls aggregate signature was invalid: %w", err) } @@ -629,7 +629,13 @@ func (syncer *Syncer) checkBlockMessages(ctx context.Context, b *types.FullBlock return nil } -func (syncer *Syncer) verifyBlsAggregate(sig types.Signature, msgs []cid.Cid, pubks []bls.PublicKey) error { +func (syncer *Syncer) verifyBlsAggregate(ctx context.Context, sig types.Signature, msgs []cid.Cid, pubks []bls.PublicKey) error { + ctx, span := trace.StartSpan(ctx, "syncer.verifyBlsAggregate") + defer span.End() + span.AddAttributes( + trace.Int64Attribute("msgCount", int64(len(msgs))), + ) + var digests []bls.Digest for _, c := range msgs { digests = append(digests, bls.Hash(bls.Message(c.Bytes()))) diff --git a/chain/types/blockheader.go b/chain/types/blockheader.go index f1003ed07..59858a1a6 100644 --- a/chain/types/blockheader.go +++ b/chain/types/blockheader.go @@ -2,12 +2,14 @@ package types import ( "bytes" + "context" "crypto/sha256" "math/big" block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" "github.com/multiformats/go-multihash" + "go.opencensus.io/trace" xerrors "golang.org/x/xerrors" "github.com/filecoin-project/go-lotus/chain/address" @@ -98,7 +100,10 @@ func (blk *BlockHeader) SigningBytes() ([]byte, error) { return blkcopy.Serialize() } -func (blk *BlockHeader) CheckBlockSignature(worker address.Address) error { +func (blk *BlockHeader) CheckBlockSignature(ctx context.Context, worker address.Address) error { + ctx, span := trace.StartSpan(ctx, "checkBlockSignature") + defer span.End() + sigb, err := blk.SigningBytes() if err != nil { return xerrors.Errorf("failed to get block signing bytes: %w", err) diff --git a/chain/types/vmcontext.go b/chain/types/vmcontext.go index 8582f1996..89659da00 100644 --- a/chain/types/vmcontext.go +++ b/chain/types/vmcontext.go @@ -1,6 +1,8 @@ package types import ( + "context" + amt "github.com/filecoin-project/go-amt-ipld" "github.com/filecoin-project/go-lotus/chain/actors/aerrors" "github.com/filecoin-project/go-lotus/chain/address" @@ -38,6 +40,8 @@ type VMContext interface { ChargeGas(uint64) aerrors.ActorError GetRandomness(height uint64) ([]byte, aerrors.ActorError) GetBalance(address.Address) (BigInt, aerrors.ActorError) + + Context() context.Context } type storageWrapper struct { diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 2f5369b64..3c30f3cc1 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -239,6 +239,10 @@ func (vmctx *VMContext) GetBalance(a address.Address) (types.BigInt, aerrors.Act } } +func (vmctx *VMContext) Context() context.Context { + return vmctx.ctx +} + type hBlocks interface { GetBlock(context.Context, cid.Cid) (block.Block, error) AddBlock(block.Block) error