hyperspace nv21 // av13 upgrade.

This commit is contained in:
Raúl Kripalani
2023-02-24 18:26:50 +00:00
parent 1a08a45ca5
commit e76e22e210
2 changed files with 121 additions and 0 deletions
+24
View File
@@ -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)
+97
View File
@@ -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)
}