Skip to content

Commit 098b024

Browse files
Backport: fix(op-deployer): block getter by num via RPC (#14689) (#14825)
Signed-off-by: Yashvardhan Kukreja <[email protected]>
1 parent 6ce9caf commit 098b024

File tree

13 files changed

+58
-23
lines changed

13 files changed

+58
-23
lines changed

op-chain-ops/genesis/config.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212

1313
"github.com/ethereum/go-ethereum/common"
1414
"github.com/ethereum/go-ethereum/common/hexutil"
15-
"github.com/ethereum/go-ethereum/core/types"
1615
"github.com/ethereum/go-ethereum/log"
1716
"github.com/ethereum/go-ethereum/params"
1817
"github.com/ethereum/go-ethereum/rpc"
@@ -967,7 +966,7 @@ func (d *DeployConfig) SetDeployments(deployments *L1Deployments) {
967966

968967
// RollupConfig converts a DeployConfig to a rollup.Config. If Ecotone is active at genesis, the
969968
// Overhead value is considered a noop.
970-
func (d *DeployConfig) RollupConfig(l1StartBlock *types.Header, l2GenesisBlockHash common.Hash, l2GenesisBlockNumber uint64) (*rollup.Config, error) {
969+
func (d *DeployConfig) RollupConfig(l1StartBlock *eth.BlockRef, l2GenesisBlockHash common.Hash, l2GenesisBlockNumber uint64) (*rollup.Config, error) {
971970
if d.OptimismPortalProxy == (common.Address{}) {
972971
return nil, errors.New("OptimismPortalProxy cannot be address(0)")
973972
}
@@ -989,8 +988,8 @@ func (d *DeployConfig) RollupConfig(l1StartBlock *types.Header, l2GenesisBlockHa
989988
return &rollup.Config{
990989
Genesis: rollup.Genesis{
991990
L1: eth.BlockID{
992-
Hash: l1StartBlock.Hash(),
993-
Number: l1StartBlock.Number.Uint64(),
991+
Hash: l1StartBlock.Hash,
992+
Number: l1StartBlock.Number,
994993
},
995994
L2: eth.BlockID{
996995
Hash: l2GenesisBlockHash,

op-chain-ops/genesis/genesis.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"math/big"
66
"time"
77

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

2324
// NewL2Genesis will create a new L2 genesis
24-
func NewL2Genesis(config *DeployConfig, l1StartHeader *types.Header) (*core.Genesis, error) {
25+
func NewL2Genesis(config *DeployConfig, l1StartHeader *eth.BlockRef) (*core.Genesis, error) {
2526
if config.L2ChainID == 0 {
2627
return nil, errors.New("must define L2 ChainID")
2728
}

op-chain-ops/genesis/layer_two.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/ethereum/go-ethereum/crypto"
1515

1616
"github.com/ethereum-optimism/optimism/op-chain-ops/foundry"
17+
"github.com/ethereum-optimism/optimism/op-service/eth"
1718
"github.com/ethereum-optimism/optimism/op-service/predeploys"
1819
)
1920

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

4243
// BuildL2Genesis will build the L2 genesis block.
43-
func BuildL2Genesis(config *DeployConfig, dump *foundry.ForgeAllocs, l1StartBlock *types.Header) (*core.Genesis, error) {
44+
func BuildL2Genesis(config *DeployConfig, dump *foundry.ForgeAllocs, l1StartBlock *eth.BlockRef) (*core.Genesis, error) {
4445
genspec, err := NewL2Genesis(config, l1StartBlock)
4546
if err != nil {
4647
return nil, err

op-chain-ops/interopgen/deploy.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/standard"
99

1010
"github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/opcm"
11+
"github.com/ethereum-optimism/optimism/op-service/eth"
1112

1213
"github.com/ethereum/go-ethereum/common"
1314
"github.com/ethereum/go-ethereum/core/types"
@@ -301,7 +302,7 @@ func CompleteL2(l2Host *script.Host, cfg *L2Config, l1Block *types.Block, deploy
301302
},
302303
}
303304
// l1Block is used to determine genesis time.
304-
l2Genesis, err := genesis.NewL2Genesis(deployCfg, l1Block.Header())
305+
l2Genesis, err := genesis.NewL2Genesis(deployCfg, eth.BlockRefFromHeader(l1Block.Header()))
305306
if err != nil {
306307
return nil, fmt.Errorf("failed to build L2 genesis config: %w", err)
307308
}
@@ -326,7 +327,7 @@ func CompleteL2(l2Host *script.Host, cfg *L2Config, l1Block *types.Block, deploy
326327
l2Genesis.Alloc = allocs.Accounts
327328
l2GenesisBlock := l2Genesis.ToBlock()
328329

329-
rollupCfg, err := deployCfg.RollupConfig(l1Block.Header(), l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64())
330+
rollupCfg, err := deployCfg.RollupConfig(eth.BlockRefFromHeader(l1Block.Header()), l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64())
330331
if err != nil {
331332
return nil, fmt.Errorf("failed to build L2 rollup config: %w", err)
332333
}

op-deployer/pkg/deployer/pipeline/start_block.go

+29-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,34 @@ import (
77

88
"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
99
"github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/state"
10+
"github.com/ethereum-optimism/optimism/op-service/eth"
1011
"github.com/ethereum/go-ethereum/common"
1112
"github.com/ethereum/go-ethereum/common/hexutil"
13+
"github.com/ethereum/go-ethereum/rpc"
1214
)
1315

16+
type l1BlockRefJSON struct {
17+
Hash common.Hash `json:"hash"`
18+
Number hexutil.Uint64 `json:"number"`
19+
ParentHash common.Hash `json:"parentHash"`
20+
Time hexutil.Uint64 `json:"timestamp"`
21+
}
22+
23+
func blockRefFromRpc(ctx context.Context, l1Client *rpc.Client, numberArg string) (eth.BlockRef, error) {
24+
var l1BRJ l1BlockRefJSON
25+
if err := l1Client.CallContext(ctx, &l1BRJ, "eth_getBlockByNumber", numberArg, false); err != nil {
26+
return eth.BlockRef{}, fmt.Errorf("failed to get L1 block header for block: %w", err)
27+
}
28+
29+
headerBlockRef := eth.BlockRef{
30+
Number: uint64(l1BRJ.Number),
31+
Hash: l1BRJ.Hash,
32+
ParentHash: l1BRJ.ParentHash,
33+
Time: uint64(l1BRJ.Time),
34+
}
35+
return headerBlockRef, nil
36+
}
37+
1438
func SetStartBlockLiveStrategy(ctx context.Context, env *Env, st *state.State, chainID common.Hash) error {
1539
lgr := env.Logger.New("stage", "set-start-block", "strategy", "live")
1640
lgr.Info("setting start block", "id", chainID.Hex())
@@ -20,11 +44,12 @@ func SetStartBlockLiveStrategy(ctx context.Context, env *Env, st *state.State, c
2044
return fmt.Errorf("failed to get chain state: %w", err)
2145
}
2246

23-
startHeader, err := env.L1Client.HeaderByNumber(ctx, nil)
47+
headerBlockRef, err := blockRefFromRpc(ctx, env.L1Client.Client(), "latest")
2448
if err != nil {
25-
return fmt.Errorf("failed to get start block: %w", err)
49+
return fmt.Errorf("failed to get L1 block header: %w", err)
2650
}
27-
thisChainState.StartBlock = startHeader
51+
52+
thisChainState.StartBlock = &headerBlockRef
2853

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

6287
return nil
6388
}

op-deployer/pkg/deployer/state/deploy_config.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func CombineDeployConfig(intent *Intent, chainIntent *ChainIntent, state *State,
124124
BlockNumber: &num,
125125
}
126126
} else {
127-
startHash := chainState.StartBlock.Hash()
127+
startHash := chainState.StartBlock.Hash
128128
cfg.L1StartingBlockTag = &genesis.MarshalableRPCBlockNumberOrHash{
129129
BlockHash: &startHash,
130130
}

op-deployer/pkg/deployer/state/state.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ import (
55

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

8-
"github.com/ethereum/go-ethereum/core/types"
9-
108
"github.com/ethereum-optimism/optimism/op-chain-ops/foundry"
9+
"github.com/ethereum-optimism/optimism/op-service/eth"
1110
"github.com/ethereum-optimism/optimism/op-service/ioutil"
1211
"github.com/ethereum-optimism/optimism/op-service/jsonutil"
1312
"github.com/ethereum/go-ethereum/common"
@@ -115,5 +114,5 @@ type ChainState struct {
115114

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

118-
StartBlock *types.Header `json:"startBlock"`
117+
StartBlock *eth.BlockRef `json:"startBlock"`
119118
}

op-e2e/e2eutils/setup.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) *
153153

154154
allocsMode := GetL2AllocsMode(deployConf, l1Block.Time())
155155
l2Allocs := config.L2Allocs(deployParams.AllocType, allocsMode)
156-
l2Genesis, err := genesis.BuildL2Genesis(deployConf, l2Allocs, l1Block.Header())
156+
l2Genesis, err := genesis.BuildL2Genesis(deployConf, l2Allocs, eth.BlockRefFromHeader(l1Block.Header()))
157157
require.NoError(t, err, "failed to create l2 genesis")
158158
if alloc.PrefundTestUsers {
159159
for _, addr := range deployParams.Addresses.All() {

op-e2e/opgeth/op_geth.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func NewOpGeth(t testing.TB, ctx context.Context, cfg *e2esys.SystemConfig) (*Op
6161
l1Block := l1Genesis.ToBlock()
6262
allocsMode := e2eutils.GetL2AllocsMode(cfg.DeployConfig, l1Block.Time())
6363
l2Allocs := config.L2Allocs(config.AllocTypeStandard, allocsMode)
64-
l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l2Allocs, l1Block.Header())
64+
l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l2Allocs, eth.BlockRefFromHeader(l1Block.Header()))
6565
require.NoError(t, err)
6666
l2GenesisBlock := l2Genesis.ToBlock()
6767

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

9191
// Finally create the engine client
92-
rollupCfg, err := cfg.DeployConfig.RollupConfig(l1Block.Header(), l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64())
92+
rollupCfg, err := cfg.DeployConfig.RollupConfig(eth.BlockRefFromHeader(l1Block.Header()), l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64())
9393
require.NoError(t, err)
9494
rollupCfg.Genesis = rollupGenesis
9595
l2Engine, err := sources.NewEngineClient(

op-e2e/system/e2esys/setup.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ func (cfg SystemConfig) Start(t *testing.T, startOpts ...StartOption) (*System,
577577

578578
t.Log("Generating L2 genesis", "l2_allocs_mode", string(allocsMode))
579579
l2Allocs := config.L2Allocs(cfg.AllocType, allocsMode)
580-
l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l2Allocs, l1Block.Header())
580+
l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l2Allocs, eth.BlockRefFromHeader(l1Block.Header()))
581581
if err != nil {
582582
return nil, err
583583
}

op-node/cmd/genesis/cmd.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"time"
77

8+
"github.com/ethereum-optimism/optimism/op-service/eth"
89
"github.com/ethereum-optimism/optimism/op-service/ioutil"
910
"github.com/ethereum-optimism/optimism/op-service/retry"
1011
"github.com/ethereum-optimism/optimism/op-service/sources/batching"
@@ -191,13 +192,13 @@ var Subcommands = cli.Commands{
191192
}
192193

193194
// Build the L2 genesis block
194-
l2Genesis, err := genesis.BuildL2Genesis(config, l2Allocs, l1StartBlock.Header())
195+
l2Genesis, err := genesis.BuildL2Genesis(config, l2Allocs, eth.BlockRefFromHeader(l1StartBlock.Header()))
195196
if err != nil {
196197
return fmt.Errorf("error creating l2 genesis: %w", err)
197198
}
198199

199200
l2GenesisBlock := l2Genesis.ToBlock()
200-
rollupConfig, err := config.RollupConfig(l1StartBlock.Header(), l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64())
201+
rollupConfig, err := config.RollupConfig(eth.BlockRefFromHeader(l1StartBlock.Header()), l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64())
201202
if err != nil {
202203
return err
203204
}

op-program/client/l2/engine_backend_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ func setupOracle(t *testing.T, blockCount int, headBlockNumber int, enableEcoton
321321
}
322322
l1Genesis, err := genesis.NewL1Genesis(deployConfig)
323323
require.NoError(t, err)
324-
l2Genesis, err := genesis.NewL2Genesis(deployConfig, l1Genesis.ToBlock().Header())
324+
l2Genesis, err := genesis.NewL2Genesis(deployConfig, eth.BlockRefFromHeader(l1Genesis.ToBlock().Header()))
325325
require.NoError(t, err)
326326

327327
l2Genesis.Alloc[fundedAddress] = types.Account{

op-service/eth/id.go

+8
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ func (id L1BlockRef) ParentID() BlockID {
9898
// Because L1BlockRefs are strict subsets of L2BlockRefs, BlockRef is a direct alias of L1BlockRef
9999
type BlockRef = L1BlockRef
100100

101+
func BlockRefFromHeader(h *types.Header) *BlockRef {
102+
return &BlockRef{
103+
Hash: h.Hash(),
104+
Number: h.Number.Uint64(),
105+
ParentHash: h.ParentHash,
106+
Time: h.Time,
107+
}
108+
}
101109
func (id L2BlockRef) ID() BlockID {
102110
return BlockID{
103111
Hash: id.Hash,

0 commit comments

Comments
 (0)