Merge pull request #8174 from filecoin-project/asr/consistent-vm

Use either Lotus VM or FVM consistently
This commit is contained in:
Aayush Rajasekaran 2022-02-24 16:19:29 -05:00 committed by GitHub
commit 755ce8cb91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 79 additions and 25 deletions

View File

@ -491,12 +491,13 @@ func VerifyPreSealedData(ctx context.Context, cs *store.ChainStore, sys vm.Sysca
Actors: filcns.NewActorRegistry(), Actors: filcns.NewActorRegistry(),
Syscalls: mkFakedSigSyscalls(sys), Syscalls: mkFakedSigSyscalls(sys),
CircSupplyCalc: csc, CircSupplyCalc: csc,
FilVested: big.Zero(),
NetworkVersion: nv, NetworkVersion: nv,
BaseFee: types.NewInt(0), BaseFee: big.Zero(),
} }
vm, err := vm.NewVM(ctx, &vmopt) vm, err := vm.NewLotusVM(ctx, &vmopt)
if err != nil { if err != nil {
return cid.Undef, xerrors.Errorf("failed to create NewVM: %w", err) return cid.Undef, xerrors.Errorf("failed to create NewLotusVM: %w", err)
} }
for mi, m := range template.Miners { for mi, m := range template.Miners {

View File

@ -95,12 +95,13 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal
Syscalls: mkFakedSigSyscalls(sys), Syscalls: mkFakedSigSyscalls(sys),
CircSupplyCalc: csc, CircSupplyCalc: csc,
NetworkVersion: nv, NetworkVersion: nv,
BaseFee: types.NewInt(0), BaseFee: big.Zero(),
FilVested: big.Zero(),
} }
vm, err := vm.NewVM(ctx, vmopt) vm, err := vm.NewLotusVM(ctx, vmopt)
if err != nil { if err != nil {
return cid.Undef, xerrors.Errorf("failed to create NewVM: %w", err) return cid.Undef, xerrors.Errorf("failed to create NewLotusVM: %w", err)
} }
if len(miners) == 0 { if len(miners) == 0 {

View File

@ -5,6 +5,12 @@ import (
"errors" "errors"
"fmt" "fmt"
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/filecoin-project/lotus/chain/state"
"github.com/filecoin-project/lotus/blockstore"
"github.com/filecoin-project/lotus/chain/rand" "github.com/filecoin-project/lotus/chain/rand"
"github.com/filecoin-project/go-address" "github.com/filecoin-project/go-address"
@ -64,6 +70,7 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types.
pheight = ts.Height() - 1 pheight = ts.Height() - 1
} }
vmHeight := pheight + 1
bstate := ts.ParentState() bstate := ts.ParentState()
// Run the (not expensive) migration. // Run the (not expensive) migration.
@ -72,9 +79,14 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types.
return nil, fmt.Errorf("failed to handle fork: %w", err) return nil, fmt.Errorf("failed to handle fork: %w", err)
} }
filVested, err := sm.GetFilVested(ctx, vmHeight)
if err != nil {
return nil, err
}
vmopt := &vm.VMOpts{ vmopt := &vm.VMOpts{
StateBase: bstate, StateBase: bstate,
Epoch: pheight + 1, Epoch: vmHeight,
Rand: rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, sm.GetNetworkVersion), Rand: rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, sm.GetNetworkVersion),
Bstore: sm.cs.StateBlockstore(), Bstore: sm.cs.StateBlockstore(),
Actors: sm.tsExec.NewActorRegistry(), Actors: sm.tsExec.NewActorRegistry(),
@ -82,6 +94,7 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types.
CircSupplyCalc: sm.GetVMCirculatingSupply, CircSupplyCalc: sm.GetVMCirculatingSupply,
NetworkVersion: sm.GetNetworkVersion(ctx, pheight+1), NetworkVersion: sm.GetNetworkVersion(ctx, pheight+1),
BaseFee: types.NewInt(0), BaseFee: types.NewInt(0),
FilVested: filVested,
LookbackState: LookbackStateGetterForTipset(sm, ts), LookbackState: LookbackStateGetterForTipset(sm, ts),
} }
@ -112,7 +125,12 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types.
) )
} }
fromActor, err := vmi.StateTree().GetActor(msg.From) stTree, err := sm.StateTree(bstate)
if err != nil {
return nil, err
}
fromActor, err := stTree.GetActor(msg.From)
if err != nil { if err != nil {
return nil, xerrors.Errorf("call raw get actor: %s", err) return nil, xerrors.Errorf("call raw get actor: %s", err)
} }
@ -175,13 +193,15 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri
} }
} }
state, _, err := sm.TipSetState(ctx, ts) vmHeight := ts.Height() + 1
stateCid, _, err := sm.TipSetState(ctx, ts)
if err != nil { if err != nil {
return nil, xerrors.Errorf("computing tipset state: %w", err) return nil, xerrors.Errorf("computing tipset state: %w", err)
} }
// Technically, the tipset we're passing in here should be ts+1, but that may not exist. // Technically, the tipset we're passing in here should be ts+1, but that may not exist.
state, err = sm.HandleStateForks(ctx, state, ts.Height(), nil, ts) stateCid, err = sm.HandleStateForks(ctx, stateCid, ts.Height(), nil, ts)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to handle fork: %w", err) return nil, fmt.Errorf("failed to handle fork: %w", err)
} }
@ -196,16 +216,23 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri
) )
} }
filVested, err := sm.GetFilVested(ctx, vmHeight)
if err != nil {
return nil, err
}
buffStore := blockstore.NewBuffered(sm.cs.StateBlockstore())
vmopt := &vm.VMOpts{ vmopt := &vm.VMOpts{
StateBase: state, StateBase: stateCid,
Epoch: ts.Height() + 1, Epoch: vmHeight,
Rand: r, Rand: r,
Bstore: sm.cs.StateBlockstore(), Bstore: buffStore,
Actors: sm.tsExec.NewActorRegistry(), Actors: sm.tsExec.NewActorRegistry(),
Syscalls: sm.Syscalls, Syscalls: sm.Syscalls,
CircSupplyCalc: sm.GetVMCirculatingSupply, CircSupplyCalc: sm.GetVMCirculatingSupply,
NetworkVersion: sm.GetNetworkVersion(ctx, ts.Height()+1), NetworkVersion: sm.GetNetworkVersion(ctx, ts.Height()+1),
BaseFee: ts.Blocks()[0].ParentBaseFee, BaseFee: ts.Blocks()[0].ParentBaseFee,
FilVested: filVested,
LookbackState: LookbackStateGetterForTipset(sm, ts), LookbackState: LookbackStateGetterForTipset(sm, ts),
} }
vmi, err := sm.newVM(ctx, vmopt) vmi, err := sm.newVM(ctx, vmopt)
@ -219,7 +246,17 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri
} }
} }
fromActor, err := vmi.StateTree().GetActor(msg.From) stateCid, err = vmi.Flush(ctx)
if err != nil {
return nil, xerrors.Errorf("flushing vm: %w", err)
}
stTree, err := state.LoadStateTree(cbor.NewCborStore(buffStore), stateCid)
if err != nil {
return nil, xerrors.Errorf("loading state tree: %w", err)
}
fromActor, err := stTree.GetActor(msg.From)
if err != nil { if err != nil {
return nil, xerrors.Errorf("call raw get actor: %s", err) return nil, xerrors.Errorf("call raw get actor: %s", err)
} }

View File

@ -167,7 +167,7 @@ func TestForkHeightTriggers(t *testing.T) {
inv.Register(nil, testActor{}) inv.Register(nil, testActor{})
sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (*vm.VM, error) { sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (*vm.VM, error) {
nvm, err := vm.NewVM(ctx, vmopt) nvm, err := vm.NewLotusVM(ctx, vmopt)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -282,7 +282,7 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) {
inv.Register(nil, testActor{}) inv.Register(nil, testActor{})
sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (*vm.VM, error) { sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (*vm.VM, error) {
nvm, err := vm.NewVM(ctx, vmopt) nvm, err := vm.NewLotusVM(ctx, vmopt)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -501,7 +501,7 @@ func TestForkPreMigration(t *testing.T) {
inv.Register(nil, testActor{}) inv.Register(nil, testActor{})
sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (*vm.VM, error) { sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (*vm.VM, error) {
nvm, err := vm.NewVM(ctx, vmopt) nvm, err := vm.NewLotusVM(ctx, vmopt)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -84,7 +84,7 @@ type StateManager struct {
compWait map[string]chan struct{} compWait map[string]chan struct{}
stlk sync.Mutex stlk sync.Mutex
genesisMsigLk sync.Mutex genesisMsigLk sync.Mutex
newVM func(context.Context, *vm.VMOpts) (*vm.VM, error) newVM func(context.Context, *vm.VMOpts) (vm.VMI, error)
Syscalls vm.SyscallBuilder Syscalls vm.SyscallBuilder
preIgnitionVesting []msig0.State preIgnitionVesting []msig0.State
postIgnitionVesting []msig0.State postIgnitionVesting []msig0.State
@ -347,12 +347,12 @@ func (sm *StateManager) ValidateChain(ctx context.Context, ts *types.TipSet) err
return nil return nil
} }
func (sm *StateManager) SetVMConstructor(nvm func(context.Context, *vm.VMOpts) (*vm.VM, error)) { func (sm *StateManager) SetVMConstructor(nvm func(context.Context, *vm.VMOpts) (vm.VMI, error)) {
sm.newVM = nvm sm.newVM = nvm
} }
func (sm *StateManager) VMConstructor() func(context.Context, *vm.VMOpts) (*vm.VM, error) { func (sm *StateManager) VMConstructor() func(context.Context, *vm.VMOpts) (vm.VMI, error) {
return func(ctx context.Context, opts *vm.VMOpts) (*vm.VM, error) { return func(ctx context.Context, opts *vm.VMOpts) (vm.VMI, error) {
return sm.newVM(ctx, opts) return sm.newVM(ctx, opts)
} }
} }

View File

@ -79,6 +79,11 @@ func ComputeState(ctx context.Context, sm *StateManager, height abi.ChainEpoch,
// future. It's not guaranteed to be accurate... but that's fine. // future. It's not guaranteed to be accurate... but that's fine.
} }
filVested, err := sm.GetFilVested(ctx, height)
if err != nil {
return cid.Undef, nil, err
}
r := rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, sm.GetNetworkVersion) r := rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, sm.GetNetworkVersion)
vmopt := &vm.VMOpts{ vmopt := &vm.VMOpts{
StateBase: base, StateBase: base,
@ -90,6 +95,7 @@ func ComputeState(ctx context.Context, sm *StateManager, height abi.ChainEpoch,
CircSupplyCalc: sm.GetVMCirculatingSupply, CircSupplyCalc: sm.GetVMCirculatingSupply,
NetworkVersion: sm.GetNetworkVersion(ctx, height), NetworkVersion: sm.GetNetworkVersion(ctx, height),
BaseFee: ts.Blocks()[0].ParentBaseFee, BaseFee: ts.Blocks()[0].ParentBaseFee,
FilVested: filVested,
LookbackState: LookbackStateGetterForTipset(sm, ts), LookbackState: LookbackStateGetterForTipset(sm, ts),
} }
vmi, err := sm.newVM(ctx, vmopt) vmi, err := sm.newVM(ctx, vmopt)

View File

@ -234,7 +234,7 @@ type VMOpts struct {
LookbackState LookbackStateGetter LookbackState LookbackStateGetter
} }
func NewVM(ctx context.Context, opts *VMOpts) (*VM, error) { func NewLotusVM(ctx context.Context, opts *VMOpts) (*VM, error) {
buf := blockstore.NewBuffered(opts.Bstore) buf := blockstore.NewBuffered(opts.Bstore)
cst := cbor.NewCborStore(buf) cst := cbor.NewCborStore(buf)
state, err := state.LoadStateTree(cst, opts.StateBase) state, err := state.LoadStateTree(cst, opts.StateBase)

View File

@ -2,6 +2,7 @@ package vm
import ( import (
"context" "context"
"os"
"github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types"
"github.com/ipfs/go-cid" "github.com/ipfs/go-cid"
@ -12,3 +13,11 @@ type VMI interface {
ApplyImplicitMessage(ctx context.Context, msg *types.Message) (*ApplyRet, error) ApplyImplicitMessage(ctx context.Context, msg *types.Message) (*ApplyRet, error)
Flush(ctx context.Context) (cid.Cid, error) Flush(ctx context.Context) (cid.Cid, error)
} }
func NewVM(ctx context.Context, opts *VMOpts) (VMI, error) {
if os.Getenv("LOTUS_USE_FVM_DOESNT_WORK_YET") == "1" {
return NewFVM(ctx, opts)
}
return NewLotusVM(ctx, opts)
}

View File

@ -92,7 +92,7 @@ func NewBlockBuilder(ctx context.Context, logger *zap.SugaredLogger, sm *stmgr.S
BaseFee: abi.NewTokenAmount(0), BaseFee: abi.NewTokenAmount(0),
LookbackState: stmgr.LookbackStateGetterForTipset(sm, parentTs), LookbackState: stmgr.LookbackStateGetterForTipset(sm, parentTs),
} }
bb.vm, err = vm.NewVM(bb.ctx, vmopt) bb.vm, err = vm.NewLotusVM(bb.ctx, vmopt)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -160,7 +160,7 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, ds ds.Batching, params
return big.Zero(), nil return big.Zero(), nil
} }
return vm.NewVM(ctx, vmopt) return vm.NewLotusVM(ctx, vmopt)
}) })
postcid, receiptsroot, err := tse.ApplyBlocks(context.Background(), postcid, receiptsroot, err := tse.ApplyBlocks(context.Background(),
@ -226,7 +226,7 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP
NetworkVersion: params.NetworkVersion, NetworkVersion: params.NetworkVersion,
} }
lvm, err := vm.NewVM(context.TODO(), vmOpts) lvm, err := vm.NewLotusVM(context.TODO(), vmOpts)
if err != nil { if err != nil {
return nil, cid.Undef, err return nil, cid.Undef, err
} }