99 lines
3.1 KiB
Go
99 lines
3.1 KiB
Go
|
package itests
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/stretchr/testify/require"
|
||
|
|
||
|
"github.com/filecoin-project/go-address"
|
||
|
"github.com/filecoin-project/go-state-types/abi"
|
||
|
actorstypes "github.com/filecoin-project/go-state-types/actors"
|
||
|
"github.com/filecoin-project/go-state-types/builtin"
|
||
|
"github.com/filecoin-project/go-state-types/manifest"
|
||
|
"github.com/filecoin-project/go-state-types/network"
|
||
|
gstStore "github.com/filecoin-project/go-state-types/store"
|
||
|
|
||
|
"github.com/filecoin-project/lotus/blockstore"
|
||
|
"github.com/filecoin-project/lotus/chain/actors"
|
||
|
builtin2 "github.com/filecoin-project/lotus/chain/actors/builtin"
|
||
|
"github.com/filecoin-project/lotus/chain/consensus/filcns"
|
||
|
"github.com/filecoin-project/lotus/chain/state"
|
||
|
"github.com/filecoin-project/lotus/chain/stmgr"
|
||
|
"github.com/filecoin-project/lotus/chain/types"
|
||
|
"github.com/filecoin-project/lotus/chain/types/ethtypes"
|
||
|
"github.com/filecoin-project/lotus/chain/vm"
|
||
|
"github.com/filecoin-project/lotus/itests/kit"
|
||
|
"github.com/filecoin-project/lotus/node/impl"
|
||
|
)
|
||
|
|
||
|
func TestMigrationNV18(t *testing.T) {
|
||
|
kit.QuietMiningLogs()
|
||
|
|
||
|
nv18epoch := abi.ChainEpoch(100)
|
||
|
testClient, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(),
|
||
|
kit.UpgradeSchedule(stmgr.Upgrade{
|
||
|
Network: network.Version17,
|
||
|
Height: -1,
|
||
|
}, stmgr.Upgrade{
|
||
|
Network: network.Version18,
|
||
|
Height: nv18epoch,
|
||
|
Migration: filcns.UpgradeActorsV10,
|
||
|
},
|
||
|
))
|
||
|
|
||
|
ens.InterconnectAll().BeginMining(10 * time.Millisecond)
|
||
|
|
||
|
clientApi := testClient.FullNode.(*impl.FullNodeAPI)
|
||
|
ctx, cancel := context.WithCancel(context.Background())
|
||
|
defer cancel()
|
||
|
|
||
|
testClient.WaitTillChain(ctx, kit.HeightAtLeast(nv18epoch+5))
|
||
|
|
||
|
// Now that we have upgraded, we need to:
|
||
|
// - the EAM exists, has "empty" state
|
||
|
// - the EthZeroAddress exists
|
||
|
// - all actors have nil Address fields
|
||
|
|
||
|
bs := blockstore.NewAPIBlockstore(testClient)
|
||
|
ctxStore := gstStore.WrapBlockStore(ctx, bs)
|
||
|
|
||
|
currTs, err := clientApi.ChainHead(ctx)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
newStateTree, err := state.LoadStateTree(ctxStore, currTs.Blocks()[0].ParentStateRoot)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
require.Equal(t, types.StateTreeVersion5, newStateTree.Version())
|
||
|
|
||
|
codeIDsv10, ok := actors.GetActorCodeIDsFromManifest(actorstypes.Version10)
|
||
|
require.True(t, ok)
|
||
|
|
||
|
// check the EAM actor
|
||
|
EAMActor, err := newStateTree.GetActor(builtin.EthereumAddressManagerActorAddr)
|
||
|
require.NoError(t, err)
|
||
|
require.Equal(t, vm.EmptyObjectCid, EAMActor.Head)
|
||
|
EAMCodeID, ok := codeIDsv10[manifest.EamKey]
|
||
|
require.True(t, ok)
|
||
|
require.Equal(t, EAMCodeID, EAMActor.Code)
|
||
|
|
||
|
// check the EthZeroAddress
|
||
|
ethZeroAddr, err := (ethtypes.EthAddress{}).ToFilecoinAddress()
|
||
|
require.NoError(t, err)
|
||
|
ethZeroAddrID, err := newStateTree.LookupID(ethZeroAddr)
|
||
|
require.NoError(t, err)
|
||
|
ethZeroActor, err := newStateTree.GetActor(ethZeroAddrID)
|
||
|
require.NoError(t, err)
|
||
|
require.True(t, builtin2.IsEthAccountActor(ethZeroActor.Code))
|
||
|
require.Equal(t, vm.EmptyObjectCid, ethZeroActor.Head)
|
||
|
|
||
|
// check all actor's Address fields
|
||
|
require.NoError(t, newStateTree.ForEach(func(address address.Address, actor *types.Actor) error {
|
||
|
if address != ethZeroAddrID {
|
||
|
require.Nil(t, actor.Address)
|
||
|
}
|
||
|
return nil
|
||
|
}))
|
||
|
}
|