hyperspace nv21 // av13 upgrade.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user