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

Dencun header changes #7993

Merged
merged 23 commits into from
Nov 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
556e500
Pull in basic types from op-service/eth package.
Nov 1, 2023
ba2ec85
Pull in basic types from op-service/sources.
Nov 1, 2023
6b4cb22
Pull in blob and blob_test from PR.
Nov 1, 2023
78716c9
Revert "Pull in basic types from op-service/eth package."
Nov 1, 2023
c174cb5
Add placeholder for dencun fork test.
Nov 1, 2023
149a6bc
Add filler scaffolding for dencun fork test: literally the old shapel…
Nov 1, 2023
4806862
Start to tweak things in dencun_fork_test: mainly replacing "shanghai…
Nov 1, 2023
adcdf91
More minor test tweaks: change require statement's message, get head'…
Nov 1, 2023
118ce7f
Fix usage of IsCancun.
Nov 2, 2023
d0a7922
Tweak test message: really we're just testing isCancun, so acknowledg…
Nov 2, 2023
5c584ca
Use types.Withdrawals in rpcBlock, not eth.Withdrawals.
Nov 2, 2023
d57f75f
Flag the failing line, it's non-obvious in CI output.
Nov 2, 2023
bc2b4de
Add how test is failing just for onlookers.
Nov 2, 2023
79932ba
Add issue links per semgrep request.
Nov 2, 2023
1131944
WIP stash for discussion.
Nov 3, 2023
8389e8c
Commit missed hunk editing a comment in dencun_fork_test.
Nov 3, 2023
acf1c64
Remove useless call to ParentBeaconRoot.
Nov 6, 2023
65916c5
Remove some commented-out cruft.
Nov 6, 2023
2c57e7d
Set necessary header fields if config is cancun.
Nov 6, 2023
78eeb2a
Preserve co-authorship.
Nov 6, 2023
5376fc8
return check for nil tx in rpc block verification
Nov 7, 2023
2b1378f
return withdrawals check in rpc block verification.
Nov 7, 2023
e289de0
remove blob.go and blob_test.go. they'll come back in in another PR w…
Nov 7, 2023
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
53 changes: 53 additions & 0 deletions op-e2e/actions/dencun_fork_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package actions

import (
"testing"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/log"
"github.com/stretchr/testify/require"

"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
"github.com/ethereum-optimism/optimism/op-service/testlog"
)

func TestDencunL1Fork(gt *testing.T) {
t := NewDefaultTesting(gt)
dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams)
sd := e2eutils.Setup(t, dp, defaultAlloc)
activation := sd.L1Cfg.Timestamp + 24
sd.L1Cfg.Config.CancunTime = &activation
log := testlog.Logger(t, log.LvlDebug)
_, _, miner, sequencer, _, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log)

l1Head := miner.l1Chain.CurrentBlock()
require.False(t, sd.L1Cfg.Config.IsCancun(l1Head.Number, l1Head.Time), "Cancun not active yet")

// start op-nodes
sequencer.ActL2PipelineFull(t)
verifier.ActL2PipelineFull(t)

// build empty L1 blocks, crossing the fork boundary
miner.ActL1SetFeeRecipient(common.Address{'A', 0})
miner.ActEmptyBlock(t)
miner.ActEmptyBlock(t) // Cancun activates here
miner.ActEmptyBlock(t)
// verify Cancun is active
l1Head = miner.l1Chain.CurrentBlock()
require.True(t, sd.L1Cfg.Config.IsCancun(l1Head.Number, l1Head.Time), "Cancun active")

// build L2 chain up to and including L2 blocks referencing Cancun L1 blocks
sequencer.ActL1HeadSignal(t)
sequencer.ActBuildToL1Head(t)
miner.ActL1StartBlock(12)(t)
batcher.ActSubmitAll(t)
miner.ActL1IncludeTx(batcher.batcherAddr)(t)
miner.ActL1EndBlock(t)

// sync verifier
verifier.ActL1HeadSignal(t)
verifier.ActL2PipelineFull(t)
// verify verifier accepted Cancun L1 inputs
require.Equal(t, l1Head.Hash(), verifier.SyncStatus().SafeL2.L1Origin.Hash, "verifier synced L1 chain that includes Cancun headers")
require.Equal(t, sequencer.SyncStatus().UnsafeL2, verifier.SyncStatus().UnsafeL2, "verifier and sequencer agree")
}
7 changes: 7 additions & 0 deletions op-e2e/actions/l1_miner.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,13 @@ func (s *L1Miner) ActL1StartBlock(timeDelta uint64) Action {
if s.l1Cfg.Config.IsShanghai(header.Number, header.Time) {
header.WithdrawalsHash = &types.EmptyWithdrawalsHash
}
if s.l1Cfg.Config.IsCancun(header.Number, header.Time) {
var root common.Hash
var zero uint64
header.BlobGasUsed = &zero
header.ExcessBlobGas = &zero
header.ParentBeaconRoot = &root
}

s.l1Building = true
s.l1BuildingHeader = header
Expand Down
17 changes: 15 additions & 2 deletions op-service/sources/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,16 @@ type rpcHeader struct {
BaseFee *hexutil.Big `json:"baseFeePerGas"`

// WithdrawalsRoot was added by EIP-4895 and is ignored in legacy headers.
WithdrawalsRoot *common.Hash `json:"withdrawalsRoot"`
WithdrawalsRoot *common.Hash `json:"withdrawalsRoot,omitempty"`

// BlobGasUsed was added by EIP-4844 and is ignored in legacy headers.
BlobGasUsed *hexutil.Uint64 `json:"blobGasUsed,omitempty"`

// ExcessBlobGas was added by EIP-4844 and is ignored in legacy headers.
ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas,omitempty"`

// ParentBeaconRoot was added by EIP-4788 and is ignored in legacy headers.
ParentBeaconRoot *common.Hash `json:"parentBeaconBlockRoot,omitempty"`

// untrusted info included by RPC, may have to be checked
Hash common.Hash `json:"hash"`
Expand Down Expand Up @@ -156,6 +165,10 @@ func (hdr *rpcHeader) createGethHeader() *types.Header {
Nonce: hdr.Nonce,
BaseFee: (*big.Int)(hdr.BaseFee),
WithdrawalsHash: hdr.WithdrawalsRoot,
// Cancun
BlobGasUsed: (*uint64)(hdr.BlobGasUsed),
ExcessBlobGas: (*uint64)(hdr.ExcessBlobGas),
ParentBeaconRoot: hdr.ParentBeaconRoot,
}
}

Expand Down Expand Up @@ -185,7 +198,7 @@ func (block *rpcBlock) verify() error {
}
for i, tx := range block.Transactions {
if tx == nil {
return fmt.Errorf("block tx %d is null", i)
return fmt.Errorf("block tx %d is nil", i)
}
}
if computed := types.DeriveSha(types.Transactions(block.Transactions), trie.NewStackTrie(nil)); block.TxHash != computed {
Expand Down