From a755ca5dae99223555db771d61e0436d5921006d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 24 Nov 2019 20:16:18 +0100 Subject: [PATCH] stmgr: check for duplicate nonces when looking back for msg --- build/params_debug.go | 6 ++++++ chain/stmgr/stmgr.go | 35 +++++++++++++++++++++++------------ storage/post.go | 2 +- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/build/params_debug.go b/build/params_debug.go index bf36ad106..3337c827f 100644 --- a/build/params_debug.go +++ b/build/params_debug.go @@ -2,8 +2,14 @@ package build +import "os" + // Seconds const BlockDelay = 2 // Blocks const ProvingPeriodDuration uint64 = 40 + +func init() { + os.Setenv("TRUST_PARAMS", "1") +} diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index eaaa4fc13..7260d5bea 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -322,7 +322,12 @@ func (sm *StateManager) GetBlsPublicKey(ctx context.Context, addr address.Addres } func (sm *StateManager) GetReceipt(ctx context.Context, msg cid.Cid, ts *types.TipSet) (*types.MessageReceipt, error) { - r, err := sm.tipsetExecutedMessage(ts, msg) + m, err := sm.cs.GetCMessage(msg) + if err != nil { + return nil, fmt.Errorf("failed to load message: %w", err) + } + + r, err := sm.tipsetExecutedMessage(ts, msg, m.VMMessage()) if err != nil { return nil, err } @@ -331,11 +336,6 @@ func (sm *StateManager) GetReceipt(ctx context.Context, msg cid.Cid, ts *types.T return r, nil } - m, err := sm.cs.GetCMessage(msg) - if err != nil { - return nil, fmt.Errorf("failed to load message: %w", err) - } - _, r, err = sm.searchBackForMsg(ctx, ts, m) if err != nil { return nil, fmt.Errorf("failed to look back through chain for message: %w", err) @@ -368,7 +368,7 @@ func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid) (*type return nil, nil, fmt.Errorf("expected current head on SHC stream (got %s)", head[0].Type) } - r, err := sm.tipsetExecutedMessage(head[0].Val, mcid) + r, err := sm.tipsetExecutedMessage(head[0].Val, mcid, msg.VMMessage()) if err != nil { return nil, nil, err } @@ -403,7 +403,7 @@ func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid) (*type case store.HCRevert: continue case store.HCApply: - r, err := sm.tipsetExecutedMessage(val.Val, mcid) + r, err := sm.tipsetExecutedMessage(val.Val, mcid, msg.VMMessage()) if err != nil { return nil, nil, err } @@ -454,7 +454,7 @@ func (sm *StateManager) searchBackForMsg(ctx context.Context, from *types.TipSet return nil, nil, fmt.Errorf("failed to load tipset during msg wait searchback: %w", err) } - r, err := sm.tipsetExecutedMessage(ts, m.Cid()) + r, err := sm.tipsetExecutedMessage(ts, m.Cid(), m.VMMessage()) if err != nil { return nil, nil, fmt.Errorf("checking for message execution during lookback: %w", err) } @@ -467,7 +467,7 @@ func (sm *StateManager) searchBackForMsg(ctx context.Context, from *types.TipSet } } -func (sm *StateManager) tipsetExecutedMessage(ts *types.TipSet, msg cid.Cid) (*types.MessageReceipt, error) { +func (sm *StateManager) tipsetExecutedMessage(ts *types.TipSet, msg cid.Cid, vmm *types.Message) (*types.MessageReceipt, error) { // The genesis block did not execute any messages if ts.Height() == 0 { return nil, nil @@ -484,8 +484,19 @@ func (sm *StateManager) tipsetExecutedMessage(ts *types.TipSet, msg cid.Cid) (*t } for i, m := range cm { - if m.Cid() == msg { - return sm.cs.GetParentReceipt(ts.Blocks()[0], i) + if m.VMMessage().From == vmm.From { // cheaper to just check origin first + if m.VMMessage().Nonce == vmm.Nonce { + if m.Cid() == msg { + return sm.cs.GetParentReceipt(ts.Blocks()[0], i) + } + + // this should be that message + return nil, xerrors.Errorf("found message with equal nonce as the one we are looking for (F:%s n %d, TS: %s n%d)", + msg, vmm.Nonce, m.Cid(), m.VMMessage().Nonce) + } + if m.VMMessage().Nonce < vmm.Nonce { + return nil, nil // don't bother looking further + } } } diff --git a/storage/post.go b/storage/post.go index 44c330927..62c59a23c 100644 --- a/storage/post.go +++ b/storage/post.go @@ -249,7 +249,7 @@ func (p *post) waitCommit(ctx context.Context) error { ctx, span := trace.StartSpan(ctx, "storage.waitPost") defer span.End() - log.Infof("Waiting for post %s to appear on chain", p.smsg) + log.Infof("Waiting for post %s to appear on chain", p.smsg.Cid()) err := p.m.events.CalledMsg(ctx, func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH uint64) (more bool, err error) { if rec.ExitCode != 0 {