Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove simple mutable #1869

Merged
merged 1 commit into from
Jan 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions state/keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ import (
var errInvalidHexadecimalString = errors.New("invalid hexadecimal string")

var (
_ Scope = (*Keys)(nil)
_ Scope = (*SimulatedKeys)(nil)
_ Scope = (*Keys)(nil)
_ Scope = (*SimulatedKeys)(nil)
CompletePermissions Scope = fullAccess{}
)

const (
Expand All @@ -34,6 +35,10 @@ type Scope interface {
Has(key []byte, perm Permissions) bool
}

type fullAccess struct{}

func (fullAccess) Has([]byte, Permissions) bool { return true }

// StateKey holds the name of the key and its permission (Read/Allocate/Write). By default,
// initialization of Keys with duplicate key will not work. And to prevent duplicate
// insertions from overriding the original permissions, use the Add function below.
Expand Down
52 changes: 0 additions & 52 deletions state/simple.go

This file was deleted.

51 changes: 26 additions & 25 deletions vm/vm.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import (
"github.com/ava-labs/hypersdk/internal/validitywindow"
"github.com/ava-labs/hypersdk/internal/workers"
"github.com/ava-labs/hypersdk/state"
"github.com/ava-labs/hypersdk/state/tstate"
"github.com/ava-labs/hypersdk/statesync"
"github.com/ava-labs/hypersdk/storage"

Expand Down Expand Up @@ -474,32 +475,17 @@ func (vm *VM) extractLatestOutputBlock(ctx context.Context) (*chain.OutputBlock,
}

func (vm *VM) initGenesisAsLastAccepted(ctx context.Context) (*chain.OutputBlock, error) {
sps := state.NewSimpleMutable(vm.stateDB)
if err := vm.genesis.InitializeState(ctx, vm.tracer, sps, vm.balanceHandler); err != nil {
ts := tstate.New(0)
tsv := ts.NewView(state.CompletePermissions, vm.stateDB, 0)
if err := vm.genesis.InitializeState(ctx, vm.tracer, tsv, vm.balanceHandler); err != nil {
return nil, fmt.Errorf("failed to initialize genesis state: %w", err)
}
if err := sps.Commit(ctx); err != nil {
return nil, fmt.Errorf("failed to commit genesis state: %w", err)
}
root, err := vm.stateDB.GetMerkleRoot(ctx)
if err != nil {
return nil, fmt.Errorf("failed to get initialized genesis root: %w", err)
}
vm.snowCtx.Log.Info("genesis state created", zap.Stringer("root", root))

// Create genesis block
genesisExecutionBlk, err := chain.NewGenesisBlock(root)
if err != nil {
return nil, fmt.Errorf("failed to create genesis block: %w", err)
}
// Set executed block, since we will never execute the genesis block

// Update chain metadata
sps = state.NewSimpleMutable(vm.stateDB)
if err := sps.Insert(ctx, chain.HeightKey(vm.metadataManager.HeightPrefix()), binary.BigEndian.AppendUint64(nil, 0)); err != nil {
if err := tsv.Insert(ctx, chain.HeightKey(vm.metadataManager.HeightPrefix()), binary.BigEndian.AppendUint64(nil, 0)); err != nil {
return nil, fmt.Errorf("failed to set genesis height: %w", err)
}
if err := sps.Insert(ctx, chain.TimestampKey(vm.metadataManager.TimestampPrefix()), binary.BigEndian.AppendUint64(nil, 0)); err != nil {
if err := tsv.Insert(ctx, chain.TimestampKey(vm.metadataManager.TimestampPrefix()), binary.BigEndian.AppendUint64(nil, 0)); err != nil {
return nil, fmt.Errorf("failed to set genesis timestamp: %w", err)
}
genesisRules := vm.ruleFactory.GetRules(0)
Expand All @@ -509,16 +495,31 @@ func (vm *VM) initGenesisAsLastAccepted(ctx context.Context) (*chain.OutputBlock
feeManager.SetUnitPrice(i, minUnitPrice[i])
vm.snowCtx.Log.Info("set genesis unit price", zap.Int("dimension", int(i)), zap.Uint64("price", feeManager.UnitPrice(i)))
}
if err := sps.Insert(ctx, chain.FeeKey(vm.metadataManager.FeePrefix()), feeManager.Bytes()); err != nil {
if err := tsv.Insert(ctx, chain.FeeKey(vm.metadataManager.FeePrefix()), feeManager.Bytes()); err != nil {
return nil, fmt.Errorf("failed to set genesis fee manager: %w", err)
}

// Commit genesis block post-execution state and compute root
if err := sps.Commit(ctx); err != nil {
return nil, fmt.Errorf("failed to commit genesis state: %w", err)
tsv.Commit()
view, err := vm.stateDB.NewView(ctx, merkledb.ViewChanges{
MapOps: ts.ChangedKeys(),
ConsumeBytes: true,
})
if err != nil {
return nil, fmt.Errorf("failed to commit genesis initialized state diff: %w", err)
}
if err := view.CommitToDB(ctx); err != nil {
return nil, fmt.Errorf("failed to commit genesis view: %w", err)
}
root, err := vm.stateDB.GetMerkleRoot(ctx)
if err != nil {
return nil, fmt.Errorf("failed to get initialized genesis root: %w", err)
}
if _, err := vm.stateDB.GetMerkleRoot(ctx); err != nil {
return nil, fmt.Errorf("failed to get genesis root: %w", err)
vm.snowCtx.Log.Info("genesis state created", zap.Stringer("root", root))
// Create genesis block
genesisExecutionBlk, err := chain.NewGenesisBlock(root)
if err != nil {
return nil, fmt.Errorf("failed to create genesis block: %w", err)
}
if err := vm.chainStore.UpdateLastAccepted(ctx, genesisExecutionBlk); err != nil {
return nil, fmt.Errorf("failed to write genesis block: %w", err)
Expand Down
Loading