stmgr: check for duplicate nonces when looking back for msg
This commit is contained in:
parent
c7b34153fb
commit
a755ca5dae
@ -2,8 +2,14 @@
|
|||||||
|
|
||||||
package build
|
package build
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
|
||||||
// Seconds
|
// Seconds
|
||||||
const BlockDelay = 2
|
const BlockDelay = 2
|
||||||
|
|
||||||
// Blocks
|
// Blocks
|
||||||
const ProvingPeriodDuration uint64 = 40
|
const ProvingPeriodDuration uint64 = 40
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
os.Setenv("TRUST_PARAMS", "1")
|
||||||
|
}
|
||||||
|
@ -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) {
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -331,11 +336,6 @@ func (sm *StateManager) GetReceipt(ctx context.Context, msg cid.Cid, ts *types.T
|
|||||||
return r, nil
|
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)
|
_, r, err = sm.searchBackForMsg(ctx, ts, m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to look back through chain for message: %w", err)
|
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)
|
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 {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
@ -403,7 +403,7 @@ func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid) (*type
|
|||||||
case store.HCRevert:
|
case store.HCRevert:
|
||||||
continue
|
continue
|
||||||
case store.HCApply:
|
case store.HCApply:
|
||||||
r, err := sm.tipsetExecutedMessage(val.Val, mcid)
|
r, err := sm.tipsetExecutedMessage(val.Val, mcid, msg.VMMessage())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
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)
|
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 {
|
if err != nil {
|
||||||
return nil, nil, fmt.Errorf("checking for message execution during lookback: %w", err)
|
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
|
// The genesis block did not execute any messages
|
||||||
if ts.Height() == 0 {
|
if ts.Height() == 0 {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@ -484,8 +484,19 @@ func (sm *StateManager) tipsetExecutedMessage(ts *types.TipSet, msg cid.Cid) (*t
|
|||||||
}
|
}
|
||||||
|
|
||||||
for i, m := range cm {
|
for i, m := range cm {
|
||||||
if m.Cid() == msg {
|
if m.VMMessage().From == vmm.From { // cheaper to just check origin first
|
||||||
return sm.cs.GetParentReceipt(ts.Blocks()[0], i)
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,7 +249,7 @@ func (p *post) waitCommit(ctx context.Context) error {
|
|||||||
ctx, span := trace.StartSpan(ctx, "storage.waitPost")
|
ctx, span := trace.StartSpan(ctx, "storage.waitPost")
|
||||||
defer span.End()
|
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) {
|
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 {
|
if rec.ExitCode != 0 {
|
||||||
|
Loading…
Reference in New Issue
Block a user