From 85e17fa5b070bf97aa5afbff736108e8f0dfbdbe Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Mon, 9 Mar 2020 21:38:31 -0700 Subject: [PATCH] fix state cid accounting after 'Transaction' calls --- chain/vm/runtime.go | 7 +++++++ chain/vm/vm.go | 10 ++++------ cli/state.go | 12 +++++++++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index c0be66173..bba76c8e9 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -197,6 +197,13 @@ func (rt *Runtime) CreateActor(codeId cid.Cid, address address.Address) { } func (rt *Runtime) DeleteActor() { + act, err := rt.state.GetActor(rt.Message().Receiver()) + if err != nil { + rt.Abortf(exitcode.SysErrInternal, "failed to load actor in delete actor: %s", err) + } + if !act.Balance.IsZero() { + rt.Abortf(exitcode.SysErrInternal, "cannot delete actor with non-zero balance") + } if err := rt.state.DeleteActor(rt.Message().Receiver()); err != nil { rt.Abortf(exitcode.SysErrInternal, "failed to delete actor: %s", err) } diff --git a/chain/vm/vm.go b/chain/vm/vm.go index de793f9c0..118fc0584 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -56,6 +56,8 @@ type ExecutionResult struct { Msg *types.Message MsgRct *types.MessageReceipt Error string + + Subcalls []*ExecutionResult } // Storage interface @@ -113,12 +115,11 @@ func (bs *gasChargingBlocks) Put(blk block.Block) error { return nil } -func (vm *VM) makeRuntime(ctx context.Context, sroot cid.Cid, msg *types.Message, origin address.Address, usedGas types.BigInt) *Runtime { +func (vm *VM) makeRuntime(ctx context.Context, msg *types.Message, origin address.Address, usedGas types.BigInt) *Runtime { rt := &Runtime{ ctx: ctx, vm: vm, state: vm.cstate, - sroot: sroot, msg: msg, origin: origin, height: vm.blockHeight, @@ -209,7 +210,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, gasUsed = types.BigAdd(parent.gasUsed, gasUsed) origin = parent.origin } - rt := vm.makeRuntime(ctx, toActor.Head, msg, origin, gasUsed) + rt := vm.makeRuntime(ctx, msg, origin, gasUsed) if parent != nil { defer func() { parent.gasUsed = rt.gasUsed @@ -226,9 +227,6 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, if msg.Method != 0 { ret, err := vm.Invoke(toActor, rt, msg.Method, msg.Params) - if !aerrors.IsFatal(err) { - toActor.Head = rt.sroot - } return ret, err, rt } diff --git a/cli/state.go b/cli/state.go index ec7f08921..0809d0240 100644 --- a/cli/state.go +++ b/cli/state.go @@ -23,6 +23,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/miner" "github.com/docker/go-units" @@ -799,15 +800,20 @@ var stateComputeStateCmd = &cli.Command{ if cctx.Bool("show-trace") { for _, ir := range stout.Trace { fmt.Printf("%s\t%s\t%s\t%d\t%x\t%d\t%x\n", ir.Msg.From, ir.Msg.To, ir.Msg.Value, ir.Msg.Method, ir.Msg.Params, ir.MsgRct.ExitCode, ir.MsgRct.Return) - for _, im := range ir.InternalExecutions { - fmt.Printf("\t%s\t%s\t%s\t%d\t%x\t%d\t%x\n", im.Msg.From, im.Msg.To, im.Msg.Value, im.Msg.Method, im.Msg.Params, im.MsgRct.ExitCode, im.MsgRct.Return) - } + printInternalExecutions("\t", ir.InternalExecutions) } } return nil }, } +func printInternalExecutions(prefix string, trace []*vm.ExecutionResult) { + for _, im := range trace { + fmt.Printf("%s%s\t%s\t%s\t%d\t%x\t%d\t%x\n", prefix, im.Msg.From, im.Msg.To, im.Msg.Value, im.Msg.Method, im.Msg.Params, im.MsgRct.ExitCode, im.MsgRct.Return) + printInternalExecutions(prefix+"\t", im.Subcalls) + } +} + var stateWaitMsgCmd = &cli.Command{ Name: "wait-msg", Usage: "Wait for a message to appear on chain",