From e76e22e21017a0b35ddda0ceccebad6596dd8a77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Fri, 24 Feb 2023 18:26:44 +0000 Subject: [PATCH] hyperspace nv21 // av13 upgrade. --- chain/consensus/filcns/upgrades.go | 24 ++++++++ itests/migration_nv21_test.go | 97 ++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 itests/migration_nv21_test.go diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index d063b6000..c4dc45a9c 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -253,6 +253,10 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { Height: build.UpgradeHyperspaceNV20Height, Network: network.Version20, Migration: UpgradeActorsV12, + }, { + Height: build.UpgradeHyperspaceNV21Height, + Network: network.Version21, + Migration: UpgradeActorsV13, }, } @@ -1746,6 +1750,26 @@ func UpgradeActorsV12(ctx context.Context, sm *stmgr.StateManager, _ stmgr.Migra return LiteMigration(ctx, bstore, newActorsManifestCid, root, oldAv, newAv, oldStateTreeVersion, newStateTreeVersion) } +func UpgradeActorsV13(ctx context.Context, sm *stmgr.StateManager, _ stmgr.MigrationCache, _ stmgr.ExecMonitor, root cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) (cid.Cid, error) { + oldAv := actorstypes.Version12 + newAv := actorstypes.Version13 + oldStateTreeVersion := types.StateTreeVersion5 + newStateTreeVersion := types.StateTreeVersion5 + + // ensure that the manifest is loaded in the blockstore + if err := bundle.LoadBundles(ctx, sm.ChainStore().StateBlockstore(), newAv); err != nil { + return cid.Undef, xerrors.Errorf("failed to load manifest bundle: %w", err) + } + + newActorsManifestCid, ok := actors.GetManifest(newAv) + if !ok { + return cid.Undef, xerrors.Errorf("no manifest CID for actors v12 upgrade") + } + + bstore := sm.ChainStore().StateBlockstore() + return LiteMigration(ctx, bstore, newActorsManifestCid, root, oldAv, newAv, oldStateTreeVersion, newStateTreeVersion) +} + func LiteMigration(ctx context.Context, bstore blockstore.Blockstore, newActorsManifestCid cid.Cid, root cid.Cid, oldAv actorstypes.Version, newAv actorstypes.Version, oldStateTreeVersion types.StateTreeVersion, newStateTreeVersion types.StateTreeVersion) (cid.Cid, error) { buf := blockstore.NewTieredBstore(bstore, blockstore.NewMemorySync()) store := store.ActorStore(ctx, buf) diff --git a/itests/migration_nv21_test.go b/itests/migration_nv21_test.go new file mode 100644 index 000000000..dbad91c28 --- /dev/null +++ b/itests/migration_nv21_test.go @@ -0,0 +1,97 @@ +package itests + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "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 TestMigrationNV21(t *testing.T) { + kit.QuietMiningLogs() + + upgradeEpoch := abi.ChainEpoch(100) + testClient, testMiner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), + kit.UpgradeSchedule(stmgr.Upgrade{ + Network: network.Version20, + Height: -1, + }, stmgr.Upgrade{ + Network: network.Version21, + Height: upgradeEpoch, + Migration: filcns.UpgradeActorsV13, + }, + )) + + ens.InterconnectAll().BeginMining(10 * time.Millisecond) + + clientApi := testClient.FullNode.(*impl.FullNodeAPI) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + testClient.WaitTillChain(ctx, kit.HeightAtLeast(upgradeEpoch+5)) + + bs := blockstore.NewAPIBlockstore(testClient) + ctxStore := gstStore.WrapBlockStore(ctx, bs) + + currTs, err := clientApi.ChainHead(ctx) + require.NoError(t, err) + + // Verify network version. + nv, err := testClient.StateNetworkVersion(ctx, types.EmptyTSK) + require.NoError(t, err) + require.Equal(t, network.Version21, nv) + + newStateTree, err := state.LoadStateTree(ctxStore, currTs.Blocks()[0].ParentStateRoot) + require.NoError(t, err) + + require.Equal(t, types.StateTreeVersion5, newStateTree.Version()) + + codeCids1, ok := actors.GetActorCodeIDsFromManifest(actorstypes.Version13) + require.True(t, ok) + + codeCids2, err := clientApi.StateActorCodeCIDs(ctx, nv) + require.NoError(t, err) + require.Equal(t, codeCids1, codeCids2) + + // Check that the miner actor was migrated. + minerActor, err := clientApi.StateGetActor(ctx, testMiner.ActorAddr, types.EmptyTSK) + require.NoError(t, err) + require.Equal(t, codeCids1[manifest.MinerKey], minerActor.Code) + + // check EAM + eamActor, err := newStateTree.GetActor(builtin.EthereumAddressManagerActorAddr) + require.NoError(t, err) + eamCodeCid, ok := codeCids1[manifest.EamKey] + require.True(t, ok) + require.Equal(t, eamCodeCid, 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) +}