From e8e751c44e2bfe71f01505c8cf7412e22e777c87 Mon Sep 17 00:00:00 2001 From: samliok Date: Thu, 13 Aug 2026 19:10:44 -0400 Subject: [PATCH] Extract BlockDeserializer interface from VM --- adapters.go | 10 +++++----- config.go | 5 ++--- instance.go | 18 ++++++++++-------- instance_test.go | 4 +++- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/adapters.go b/adapters.go index 1f8512be..4d6b2153 100644 --- a/adapters.go +++ b/adapters.go @@ -229,17 +229,17 @@ func (bw *BlockBuilderWaiter) BuildBlock(ctx context.Context, metadata common.Pr } type blockDeserializer struct { - vm VM - msm *metadata.StateMachine + deserializer BlockDeserializer + msm *metadata.StateMachine } -func (bp *blockDeserializer) DeserializeBlock(ctx context.Context, bytes []byte) (common.Block, error) { +func (bd *blockDeserializer) DeserializeBlock(ctx context.Context, bytes []byte) (common.Block, error) { var rawBlock metadata.RawBlock if err := rawBlock.UnmarshalCanoto(bytes); err != nil { return nil, err } - block, err := bp.vm.ParseBlock(ctx, rawBlock.InnerBlockBytes) + block, err := bd.deserializer.ParseBlock(ctx, rawBlock.InnerBlockBytes) if err != nil { return nil, err } @@ -248,6 +248,6 @@ func (bp *blockDeserializer) DeserializeBlock(ctx context.Context, bytes []byte) InnerBlock: block, Metadata: rawBlock.Metadata, }, - msm: bp.msm, + msm: bd.msm, }, nil } diff --git a/config.go b/config.go index a47474f5..1aba21aa 100644 --- a/config.go +++ b/config.go @@ -53,12 +53,11 @@ type VM interface { // WaitForPendingBlock returns when either the given context is cancelled, // or when the VM signals that a block should be built. WaitForPendingBlock(ctx context.Context) +} +type BlockDeserializer interface { // ParseBlock parses the given block bytes into a VMBlock. ParseBlock(context.Context, []byte) (avalanchego.VMBlock, error) - - // ComputeICMEpoch computes the ICM epoch transition given the input parameters. - ComputeICMEpoch(input metadata.ICMEpochInput) metadata.ICMEpochInfo } type Storage interface { diff --git a/instance.go b/instance.go index 7dc61abe..848e14b2 100644 --- a/instance.go +++ b/instance.go @@ -39,12 +39,14 @@ type Config struct { // WalCreator is the interface to create new write-ahead logs for the simplex instance. WalCreator wal.Creator // Storage is the interface to the block storage layer for the simplex instance. - Storage Storage - Logger common.Logger - Sender Sender - WALs []wal.DeletableWAL - VM VM - ID common.NodeID + Storage Storage + Logger common.Logger + Sender Sender + WALs []wal.DeletableWAL + VM VM + ICMETransition metadata.ICMEpochTransition + BlockDeserializer BlockDeserializer + ID common.NodeID } type nodeRole byte @@ -461,7 +463,7 @@ func (i *Instance) createEpochConfig() (simplex.EpochConfig, error) { GetPChainHeightForProposing: i.Config.PlatformChain.GetMinimumHeight, GetPChainHeightForVerifying: i.Config.PlatformChain.GetCurrentHeight, AuxiliaryInfoApp: &NoopAuxiliaryInfoApp{}, - ComputeICMEpoch: i.Config.VM.ComputeICMEpoch, + ComputeICMEpoch: i.Config.ICMETransition, GetBlock: i.cs.RetrieveBlock, }) if err != nil { @@ -513,7 +515,7 @@ func (i *Instance) createEpochConfig() (simplex.EpochConfig, error) { Storage: epochAwareStorage, Comm: comm, BlockBuilder: blockBuilder, - BlockDeserializer: &blockDeserializer{vm: i.Config.VM, msm: msm}, + BlockDeserializer: &blockDeserializer{deserializer: i.Config.BlockDeserializer, msm: msm}, } return epochConfig, nil } diff --git a/instance_test.go b/instance_test.go index a6092468..e271fcd9 100644 --- a/instance_test.go +++ b/instance_test.go @@ -873,12 +873,14 @@ func newInstance(t *testing.T, nodeID common.NodeID, storage *MockStorage, net * // newInstanceWithVM is like newInstance but uses a caller-supplied VM, so a test // can share one controllable VM across restarts of the same node. -func newInstanceWithVM(t *testing.T, nodeID common.NodeID, storage *MockStorage, net *inMemNetwork, pChain *testPlatformChain, cops *testCryptoOps, genesisBlock *testInnerBlock, vm VM) *Instance { +func newInstanceWithVM(t *testing.T, nodeID common.NodeID, storage *MockStorage, net *inMemNetwork, pChain *testPlatformChain, cops *testCryptoOps, genesisBlock *testInnerBlock, vm *testVM) *Instance { comm := &networkSender{net: net, self: nodeID} config := Config{ Logger: testutil.MakeLogger(t, int(nodeID[0])), ID: nodeID, VM: vm, + BlockDeserializer: vm, + ICMETransition: vm.ComputeICMEpoch, Storage: storage, Sender: comm, Broadcaster: comm,