Skip to content
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
7 changes: 3 additions & 4 deletions op-chain-ops/genesis/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import (

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rpc"
Expand Down Expand Up @@ -981,7 +980,7 @@ func (d *DeployConfig) SetDeployments(deployments *L1Deployments) {

// RollupConfig converts a DeployConfig to a rollup.Config. If Ecotone is active at genesis, the
// Overhead value is considered a noop.
func (d *DeployConfig) RollupConfig(l1StartBlock *types.Header, l2GenesisBlockHash common.Hash, l2GenesisBlockNumber uint64) (*rollup.Config, error) {
func (d *DeployConfig) RollupConfig(l1StartBlock *eth.BlockRef, l2GenesisBlockHash common.Hash, l2GenesisBlockNumber uint64) (*rollup.Config, error) {
if d.OptimismPortalProxy == (common.Address{}) {
return nil, errors.New("OptimismPortalProxy cannot be address(0)")
}
Expand Down Expand Up @@ -1010,8 +1009,8 @@ func (d *DeployConfig) RollupConfig(l1StartBlock *types.Header, l2GenesisBlockHa
return &rollup.Config{
Genesis: rollup.Genesis{
L1: eth.BlockID{
Hash: l1StartBlock.Hash(),
Number: l1StartBlock.Number.Uint64(),
Hash: l1StartBlock.Hash,
Number: l1StartBlock.Number,
},
L2: eth.BlockID{
Hash: l2GenesisBlockHash,
Expand Down
3 changes: 2 additions & 1 deletion op-chain-ops/genesis/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"math/big"
"time"

"github.com/ethereum-optimism/optimism/op-service/eth"
"github.com/ethereum-optimism/optimism/op-service/predeploys"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
Expand All @@ -21,7 +22,7 @@ const defaultGasLimit = 30_000_000
var HoloceneExtraData = eip1559.EncodeHoloceneExtraData(250, 6)

// NewL2Genesis will create a new L2 genesis
func NewL2Genesis(config *DeployConfig, l1StartHeader *types.Header) (*core.Genesis, error) {
func NewL2Genesis(config *DeployConfig, l1StartHeader *eth.BlockRef) (*core.Genesis, error) {
if config.L2ChainID == 0 {
return nil, errors.New("must define L2 ChainID")
}
Expand Down
3 changes: 2 additions & 1 deletion op-chain-ops/genesis/layer_two.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/ethereum/go-ethereum/crypto"

"github.com/ethereum-optimism/optimism/op-chain-ops/foundry"
"github.com/ethereum-optimism/optimism/op-service/eth"
"github.com/ethereum-optimism/optimism/op-service/predeploys"
)

Expand All @@ -40,7 +41,7 @@ var (
type AllocsLoader func(mode L2AllocsMode) *foundry.ForgeAllocs

// BuildL2Genesis will build the L2 genesis block.
func BuildL2Genesis(config *DeployConfig, dump *foundry.ForgeAllocs, l1StartBlock *types.Header) (*core.Genesis, error) {
func BuildL2Genesis(config *DeployConfig, dump *foundry.ForgeAllocs, l1StartBlock *eth.BlockRef) (*core.Genesis, error) {
genspec, err := NewL2Genesis(config, l1StartBlock)
if err != nil {
return nil, err
Expand Down
5 changes: 3 additions & 2 deletions op-chain-ops/interopgen/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"math/big"

"github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/opcm"
"github.com/ethereum-optimism/optimism/op-service/eth"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
Expand Down Expand Up @@ -298,7 +299,7 @@ func CompleteL2(l2Host *script.Host, cfg *L2Config, l1Block *types.Block, deploy
},
}
// l1Block is used to determine genesis time.
l2Genesis, err := genesis.NewL2Genesis(deployCfg, l1Block.Header())
l2Genesis, err := genesis.NewL2Genesis(deployCfg, eth.BlockRefFromHeader(l1Block.Header()))
if err != nil {
return nil, fmt.Errorf("failed to build L2 genesis config: %w", err)
}
Expand All @@ -325,7 +326,7 @@ func CompleteL2(l2Host *script.Host, cfg *L2Config, l1Block *types.Block, deploy
}
l2GenesisBlock := l2Genesis.ToBlock()

rollupCfg, err := deployCfg.RollupConfig(l1Block.Header(), l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64())
rollupCfg, err := deployCfg.RollupConfig(eth.BlockRefFromHeader(l1Block.Header()), l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64())
if err != nil {
return nil, fmt.Errorf("failed to build L2 rollup config: %w", err)
}
Expand Down
33 changes: 29 additions & 4 deletions op-deployer/pkg/deployer/pipeline/start_block.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,34 @@ import (

"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
"github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/state"
"github.com/ethereum-optimism/optimism/op-service/eth"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/rpc"
)

type l1BlockRefJSON struct {
Hash common.Hash `json:"hash"`
Number hexutil.Uint64 `json:"number"`
ParentHash common.Hash `json:"parentHash"`
Time hexutil.Uint64 `json:"timestamp"`
}

func blockRefFromRpc(ctx context.Context, l1Client *rpc.Client, numberArg string) (eth.BlockRef, error) {
var l1BRJ l1BlockRefJSON
if err := l1Client.CallContext(ctx, &l1BRJ, "eth_getBlockByNumber", numberArg, false); err != nil {
return eth.BlockRef{}, fmt.Errorf("failed to get L1 block header for block: %w", err)
}

headerBlockRef := eth.BlockRef{
Number: uint64(l1BRJ.Number),
Hash: l1BRJ.Hash,
ParentHash: l1BRJ.ParentHash,
Time: uint64(l1BRJ.Time),
}
return headerBlockRef, nil
}

func SetStartBlockLiveStrategy(ctx context.Context, env *Env, st *state.State, chainID common.Hash) error {
lgr := env.Logger.New("stage", "set-start-block", "strategy", "live")
lgr.Info("setting start block", "id", chainID.Hex())
Expand All @@ -20,11 +44,12 @@ func SetStartBlockLiveStrategy(ctx context.Context, env *Env, st *state.State, c
return fmt.Errorf("failed to get chain state: %w", err)
}

startHeader, err := env.L1Client.HeaderByNumber(ctx, nil)
headerBlockRef, err := blockRefFromRpc(ctx, env.L1Client.Client(), "latest")
if err != nil {
return fmt.Errorf("failed to get start block: %w", err)
return fmt.Errorf("failed to get L1 block header: %w", err)
}
thisChainState.StartBlock = startHeader

thisChainState.StartBlock = &headerBlockRef

return nil
}
Expand Down Expand Up @@ -57,7 +82,7 @@ func SetStartBlockGenesisStrategy(env *Env, st *state.State, chainID common.Hash
if err != nil {
return fmt.Errorf("failed to build L1 developer genesis: %w", err)
}
thisChainState.StartBlock = devGenesis.ToBlock().Header()
thisChainState.StartBlock = eth.BlockRefFromHeader(devGenesis.ToBlock().Header())

return nil
}
2 changes: 1 addition & 1 deletion op-deployer/pkg/deployer/state/deploy_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ func CombineDeployConfig(intent *Intent, chainIntent *ChainIntent, state *State,
BlockNumber: &num,
}
} else {
startHash := chainState.StartBlock.Hash()
startHash := chainState.StartBlock.Hash
cfg.L1StartingBlockTag = &genesis.MarshalableRPCBlockNumberOrHash{
BlockHash: &startHash,
}
Expand Down
5 changes: 2 additions & 3 deletions op-deployer/pkg/deployer/state/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@ import (

"github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/broadcaster"

"github.com/ethereum/go-ethereum/core/types"

"github.com/ethereum-optimism/optimism/op-chain-ops/foundry"
"github.com/ethereum-optimism/optimism/op-service/eth"
"github.com/ethereum-optimism/optimism/op-service/ioutil"
"github.com/ethereum-optimism/optimism/op-service/jsonutil"
"github.com/ethereum/go-ethereum/common"
Expand Down Expand Up @@ -118,5 +117,5 @@ type ChainState struct {

Allocs *GzipData[foundry.ForgeAllocs] `json:"allocs"`

StartBlock *types.Header `json:"startBlock"`
StartBlock *eth.BlockRef `json:"startBlock"`
}
2 changes: 1 addition & 1 deletion op-e2e/e2eutils/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) *

allocsMode := GetL2AllocsMode(deployConf, l1Block.Time())
l2Allocs := config.L2Allocs(deployParams.AllocType, allocsMode)
l2Genesis, err := genesis.BuildL2Genesis(deployConf, l2Allocs, l1Block.Header())
l2Genesis, err := genesis.BuildL2Genesis(deployConf, l2Allocs, eth.BlockRefFromHeader(l1Block.Header()))
require.NoError(t, err, "failed to create l2 genesis")
if alloc.PrefundTestUsers {
for _, addr := range deployParams.Addresses.All() {
Expand Down
4 changes: 2 additions & 2 deletions op-e2e/opgeth/op_geth.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ func NewOpGeth(t testing.TB, ctx context.Context, cfg *e2esys.SystemConfig) (*Op
l1Block := l1Genesis.ToBlock()
allocsMode := e2eutils.GetL2AllocsMode(cfg.DeployConfig, l1Block.Time())
l2Allocs := config.L2Allocs(config.AllocTypeStandard, allocsMode)
l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l2Allocs, l1Block.Header())
l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l2Allocs, eth.BlockRefFromHeader(l1Block.Header()))
require.NoError(t, err)
l2GenesisBlock := l2Genesis.ToBlock()

Expand Down Expand Up @@ -89,7 +89,7 @@ func NewOpGeth(t testing.TB, ctx context.Context, cfg *e2esys.SystemConfig) (*Op
require.NoError(t, err)

// Finally create the engine client
rollupCfg, err := cfg.DeployConfig.RollupConfig(l1Block.Header(), l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64())
rollupCfg, err := cfg.DeployConfig.RollupConfig(eth.BlockRefFromHeader(l1Block.Header()), l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64())
require.NoError(t, err)
rollupCfg.Genesis = rollupGenesis
l2Engine, err := sources.NewEngineClient(
Expand Down
2 changes: 1 addition & 1 deletion op-e2e/system/e2esys/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -610,7 +610,7 @@ func (cfg SystemConfig) Start(t *testing.T, startOpts ...StartOption) (*System,

t.Log("Generating L2 genesis", "l2_allocs_mode", string(allocsMode))
l2Allocs := config.L2Allocs(cfg.AllocType, allocsMode)
l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l2Allocs, l1Block.Header())
l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l2Allocs, eth.BlockRefFromHeader(l1Block.Header()))
if err != nil {
return nil, err
}
Expand Down
5 changes: 3 additions & 2 deletions op-node/cmd/genesis/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"
"time"

"github.com/ethereum-optimism/optimism/op-service/eth"
"github.com/ethereum-optimism/optimism/op-service/ioutil"
"github.com/ethereum-optimism/optimism/op-service/retry"
"github.com/ethereum-optimism/optimism/op-service/sources/batching"
Expand Down Expand Up @@ -191,13 +192,13 @@ var Subcommands = cli.Commands{
}

// Build the L2 genesis block
l2Genesis, err := genesis.BuildL2Genesis(config, l2Allocs, l1StartBlock.Header())
l2Genesis, err := genesis.BuildL2Genesis(config, l2Allocs, eth.BlockRefFromHeader(l1StartBlock.Header()))
if err != nil {
return fmt.Errorf("error creating l2 genesis: %w", err)
}

l2GenesisBlock := l2Genesis.ToBlock()
rollupConfig, err := config.RollupConfig(l1StartBlock.Header(), l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64())
rollupConfig, err := config.RollupConfig(eth.BlockRefFromHeader(l1StartBlock.Header()), l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64())
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion op-program/client/l2/engine_backend_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ func setupOracle(t *testing.T, blockCount int, headBlockNumber int, enableEcoton
}
l1Genesis, err := genesis.NewL1Genesis(deployConfig)
require.NoError(t, err)
l2Genesis, err := genesis.NewL2Genesis(deployConfig, l1Genesis.ToBlock().Header())
l2Genesis, err := genesis.NewL2Genesis(deployConfig, eth.BlockRefFromHeader(l1Genesis.ToBlock().Header()))
require.NoError(t, err)

l2Genesis.Alloc[fundedAddress] = types.Account{
Expand Down
8 changes: 8 additions & 0 deletions op-service/eth/id.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,14 @@ func (id L1BlockRef) ParentID() BlockID {
// Because L1BlockRefs are strict subsets of L2BlockRefs, BlockRef is a direct alias of L1BlockRef
type BlockRef = L1BlockRef

func BlockRefFromHeader(h *types.Header) *BlockRef {
return &BlockRef{
Hash: h.Hash(),
Number: h.Number.Uint64(),
ParentHash: h.ParentHash,
Time: h.Time,
}
}
func (id L2BlockRef) ID() BlockID {
return BlockID{
Hash: id.Hash,
Expand Down