Skip to content

Commit db8eed8

Browse files
authored
all: exclude empty outputs in requests commitment (#30670)
Implements changes from these spec PRs: - ethereum/EIPs#8989 - ethereum/execution-apis#599
1 parent 2406305 commit db8eed8

20 files changed

+62
-83
lines changed

beacon/engine/types.go

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -265,15 +265,7 @@ func ExecutableDataToBlockNoHash(data ExecutableData, versionedHashes []common.H
265265

266266
var requestsHash *common.Hash
267267
if requests != nil {
268-
// Put back request type byte.
269-
typedRequests := make([][]byte, len(requests))
270-
for i, reqdata := range requests {
271-
typedReqdata := make([]byte, len(reqdata)+1)
272-
typedReqdata[0] = byte(i)
273-
copy(typedReqdata[1:], reqdata)
274-
typedRequests[i] = typedReqdata
275-
}
276-
h := types.CalcRequestsHash(typedRequests)
268+
h := types.CalcRequestsHash(requests)
277269
requestsHash = &h
278270
}
279271

@@ -343,20 +335,11 @@ func BlockToExecutableData(block *types.Block, fees *big.Int, sidecars []*types.
343335
}
344336
}
345337

346-
// Remove type byte in requests.
347-
var plainRequests [][]byte
348-
if requests != nil {
349-
plainRequests = make([][]byte, len(requests))
350-
for i, reqdata := range requests {
351-
plainRequests[i] = reqdata[1:]
352-
}
353-
}
354-
355338
return &ExecutionPayloadEnvelope{
356339
ExecutionPayload: data,
357340
BlockValue: fees,
358341
BlobsBundle: &bundle,
359-
Requests: plainRequests,
342+
Requests: requests,
360343
Override: false,
361344
}
362345
}

cmd/evm/internal/t8ntool/execution.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -366,21 +366,19 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
366366
// Gather the execution-layer triggered requests.
367367
var requests [][]byte
368368
if chainConfig.IsPrague(vmContext.BlockNumber, vmContext.Time) {
369-
// EIP-6110 deposits
369+
requests = [][]byte{}
370+
// EIP-6110
370371
var allLogs []*types.Log
371372
for _, receipt := range receipts {
372373
allLogs = append(allLogs, receipt.Logs...)
373374
}
374-
depositRequests, err := core.ParseDepositLogs(allLogs, chainConfig)
375-
if err != nil {
375+
if err := core.ParseDepositLogs(&requests, allLogs, chainConfig); err != nil {
376376
return nil, nil, nil, NewError(ErrorEVM, fmt.Errorf("could not parse requests logs: %v", err))
377377
}
378-
requests = append(requests, depositRequests)
379-
380-
// EIP-7002 withdrawals
381-
requests = append(requests, core.ProcessWithdrawalQueue(evm))
382-
// EIP-7251 consolidations
383-
requests = append(requests, core.ProcessConsolidationQueue(evm))
378+
// EIP-7002
379+
core.ProcessWithdrawalQueue(&requests, evm)
380+
// EIP-7251
381+
core.ProcessConsolidationQueue(&requests, evm)
384382
}
385383

386384
// Commit block

core/chain_makers.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -349,25 +349,22 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse
349349

350350
var requests [][]byte
351351
if config.IsPrague(b.header.Number, b.header.Time) {
352+
requests = [][]byte{}
352353
// EIP-6110 deposits
353354
var blockLogs []*types.Log
354355
for _, r := range b.receipts {
355356
blockLogs = append(blockLogs, r.Logs...)
356357
}
357-
depositRequests, err := ParseDepositLogs(blockLogs, config)
358-
if err != nil {
358+
if err := ParseDepositLogs(&requests, blockLogs, config); err != nil {
359359
panic(fmt.Sprintf("failed to parse deposit log: %v", err))
360360
}
361-
requests = append(requests, depositRequests)
362361
// create EVM for system calls
363362
blockContext := NewEVMBlockContext(b.header, cm, &b.header.Coinbase)
364363
evm := vm.NewEVM(blockContext, statedb, cm.config, vm.Config{})
365-
// EIP-7002 withdrawals
366-
withdrawalRequests := ProcessWithdrawalQueue(evm)
367-
requests = append(requests, withdrawalRequests)
368-
// EIP-7251 consolidations
369-
consolidationRequests := ProcessConsolidationQueue(evm)
370-
requests = append(requests, consolidationRequests)
364+
// EIP-7002
365+
ProcessWithdrawalQueue(&requests, evm)
366+
// EIP-7251
367+
ProcessConsolidationQueue(&requests, evm)
371368
}
372369
if requests != nil {
373370
reqHash := types.CalcRequestsHash(requests)

core/genesis.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -472,9 +472,7 @@ func (g *Genesis) toBlockWithRoot(root common.Hash) *types.Block {
472472
}
473473
}
474474
if conf.IsPrague(num, g.Timestamp) {
475-
emptyRequests := [][]byte{{0x00}, {0x01}, {0x02}}
476-
rhash := types.CalcRequestsHash(emptyRequests)
477-
head.RequestsHash = &rhash
475+
head.RequestsHash = &types.EmptyRequestsHash
478476
}
479477
}
480478
return types.NewBlock(head, &types.Body{Withdrawals: withdrawals}, nil, trie.NewStackTrie(nil))

core/state_processor.go

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,15 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg
106106
// Read requests if Prague is enabled.
107107
var requests [][]byte
108108
if p.config.IsPrague(block.Number(), block.Time()) {
109-
// EIP-6110 deposits
110-
depositRequests, err := ParseDepositLogs(allLogs, p.config)
111-
if err != nil {
109+
requests = [][]byte{}
110+
// EIP-6110
111+
if err := ParseDepositLogs(&requests, allLogs, p.config); err != nil {
112112
return nil, err
113113
}
114-
requests = append(requests, depositRequests)
115-
// EIP-7002 withdrawals
116-
withdrawalRequests := ProcessWithdrawalQueue(evm)
117-
requests = append(requests, withdrawalRequests)
118-
// EIP-7251 consolidations
119-
consolidationRequests := ProcessConsolidationQueue(evm)
120-
requests = append(requests, consolidationRequests)
114+
// EIP-7002
115+
ProcessWithdrawalQueue(&requests, evm)
116+
// EIP-7251
117+
ProcessConsolidationQueue(&requests, evm)
121118
}
122119

123120
// Finalize the block, applying any consensus engine specific extras (e.g. block rewards)
@@ -271,17 +268,17 @@ func ProcessParentBlockHash(prevHash common.Hash, evm *vm.EVM) {
271268

272269
// ProcessWithdrawalQueue calls the EIP-7002 withdrawal queue contract.
273270
// It returns the opaque request data returned by the contract.
274-
func ProcessWithdrawalQueue(evm *vm.EVM) []byte {
275-
return processRequestsSystemCall(evm, 0x01, params.WithdrawalQueueAddress)
271+
func ProcessWithdrawalQueue(requests *[][]byte, evm *vm.EVM) {
272+
processRequestsSystemCall(requests, evm, 0x01, params.WithdrawalQueueAddress)
276273
}
277274

278275
// ProcessConsolidationQueue calls the EIP-7251 consolidation queue contract.
279276
// It returns the opaque request data returned by the contract.
280-
func ProcessConsolidationQueue(evm *vm.EVM) []byte {
281-
return processRequestsSystemCall(evm, 0x02, params.ConsolidationQueueAddress)
277+
func ProcessConsolidationQueue(requests *[][]byte, evm *vm.EVM) {
278+
processRequestsSystemCall(requests, evm, 0x02, params.ConsolidationQueueAddress)
282279
}
283280

284-
func processRequestsSystemCall(evm *vm.EVM, requestType byte, addr common.Address) []byte {
281+
func processRequestsSystemCall(requests *[][]byte, evm *vm.EVM, requestType byte, addr common.Address) {
285282
if tracer := evm.Config.Tracer; tracer != nil {
286283
if tracer.OnSystemCallStart != nil {
287284
tracer.OnSystemCallStart()
@@ -302,26 +299,32 @@ func processRequestsSystemCall(evm *vm.EVM, requestType byte, addr common.Addres
302299
evm.StateDB.AddAddressToAccessList(addr)
303300
ret, _, _ := evm.Call(vm.AccountRef(msg.From), *msg.To, msg.Data, 30_000_000, common.U2560)
304301
evm.StateDB.Finalise(true)
302+
if len(ret) == 0 {
303+
return // skip empty output
304+
}
305305

306-
// Create withdrawals requestsData with prefix 0x01
306+
// Append prefixed requestsData to the requests list.
307307
requestsData := make([]byte, len(ret)+1)
308308
requestsData[0] = requestType
309309
copy(requestsData[1:], ret)
310-
return requestsData
310+
*requests = append(*requests, requestsData)
311311
}
312312

313313
// ParseDepositLogs extracts the EIP-6110 deposit values from logs emitted by
314314
// BeaconDepositContract.
315-
func ParseDepositLogs(logs []*types.Log, config *params.ChainConfig) ([]byte, error) {
315+
func ParseDepositLogs(requests *[][]byte, logs []*types.Log, config *params.ChainConfig) error {
316316
deposits := make([]byte, 1) // note: first byte is 0x00 (== deposit request type)
317317
for _, log := range logs {
318318
if log.Address == config.DepositContractAddress {
319319
request, err := types.DepositLogToRequest(log.Data)
320320
if err != nil {
321-
return nil, fmt.Errorf("unable to parse deposit data: %v", err)
321+
return fmt.Errorf("unable to parse deposit data: %v", err)
322322
}
323323
deposits = append(deposits, request...)
324324
}
325325
}
326-
return deposits, nil
326+
if len(deposits) > 1 {
327+
*requests = append(*requests, deposits)
328+
}
329+
return nil
327330
}

core/types/hashes.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ var (
4141
// EmptyWithdrawalsHash is the known hash of the empty withdrawal set.
4242
EmptyWithdrawalsHash = common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")
4343

44+
// EmptyRequestsHash is the known hash of an empty request set, sha256("").
45+
EmptyRequestsHash = common.HexToHash("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
46+
4447
// EmptyVerkleHash is the known hash of an empty verkle trie.
4548
EmptyVerkleHash = common.Hash{}
4649
)

eth/tracers/internal/tracetest/supply_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func TestSupplyOmittedFields(t *testing.T) {
8686

8787
expected := supplyInfo{
8888
Number: 0,
89-
Hash: common.HexToHash("0xc02ee8ee5b54a40e43f0fa827d431e1bd4f217e941790dda10b2521d1925a20b"),
89+
Hash: common.HexToHash("0x3055fc27d6b4a08eb07033a0d1ee755a4b2988086f28a6189eac1b507525eeb1"),
9090
ParentHash: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"),
9191
}
9292
actual := out[expected.Number]

internal/ethapi/testdata/eth_getBlockReceipts-block-with-blob-tx.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{
33
"blobGasPrice": "0x1",
44
"blobGasUsed": "0x20000",
5-
"blockHash": "0x11e6318d77a45c01f89f76b56d36c6936c5250f4e2bd238cb7b09df73cf0cb7d",
5+
"blockHash": "0x17124e31fb075a301b1d7d4135683b0a09fe4e6d453c54e2e734d5ee00744a49",
66
"blockNumber": "0x6",
77
"contractAddress": null,
88
"cumulativeGasUsed": "0x5208",

internal/ethapi/testdata/eth_getBlockReceipts-block-with-contract-create-tx.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[
22
{
3-
"blockHash": "0x5526cd89bc188f20fd5e9bb50d8054dc5a51a81a74ed07eacf36a4a8b10de4b1",
3+
"blockHash": "0xb3e447c77374fd285964cba692e96b1673a88a959726826b5b6e2dca15472b0a",
44
"blockNumber": "0x2",
55
"contractAddress": "0xae9bea628c4ce503dcfd7e305cab4e29e7476592",
66
"cumulativeGasUsed": "0xcf50",

internal/ethapi/testdata/eth_getBlockReceipts-block-with-dynamic-fee-tx.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[
22
{
3-
"blockHash": "0x3e946aa9e252873af511b257d9d89a1bcafa54ce7c6a6442f8407ecdf81e288d",
3+
"blockHash": "0x102e50de30318ee99a03a09db74387e79cad3165bf6840cc84249806a2a302f3",
44
"blockNumber": "0x4",
55
"contractAddress": null,
66
"cumulativeGasUsed": "0x538d",

internal/ethapi/testdata/eth_getBlockReceipts-block-with-legacy-contract-call-tx.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[
22
{
3-
"blockHash": "0xc281d4299fc4e8ce5bba7ecb8deb50f5403d604c806b36aa887dfe2ff84c064f",
3+
"blockHash": "0xcc6225bf39327429a3d869af71182d619a354155187d0b5a8ecd6a9309cffcaa",
44
"blockNumber": "0x3",
55
"contractAddress": null,
66
"cumulativeGasUsed": "0x5e28",
@@ -19,7 +19,7 @@
1919
"blockNumber": "0x3",
2020
"transactionHash": "0xeaf3921cbf03ba45bad4e6ab807b196ce3b2a0b5bacc355b6272fa96b11b4287",
2121
"transactionIndex": "0x0",
22-
"blockHash": "0xc281d4299fc4e8ce5bba7ecb8deb50f5403d604c806b36aa887dfe2ff84c064f",
22+
"blockHash": "0xcc6225bf39327429a3d869af71182d619a354155187d0b5a8ecd6a9309cffcaa",
2323
"logIndex": "0x0",
2424
"removed": false
2525
}

internal/ethapi/testdata/eth_getBlockReceipts-block-with-legacy-transfer-tx.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[
22
{
3-
"blockHash": "0xda50d57d8802553b00bb8e4d777bd5c4114086941119ca04edb15429f4818ed9",
3+
"blockHash": "0xe9bd1d8c303b1af5c704b9d78e62c54a34af47e0db04ac1389a5ef74a619b9da",
44
"blockNumber": "0x1",
55
"contractAddress": null,
66
"cumulativeGasUsed": "0x5208",

internal/ethapi/testdata/eth_getBlockReceipts-tag-latest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{
33
"blobGasPrice": "0x1",
44
"blobGasUsed": "0x20000",
5-
"blockHash": "0x11e6318d77a45c01f89f76b56d36c6936c5250f4e2bd238cb7b09df73cf0cb7d",
5+
"blockHash": "0x17124e31fb075a301b1d7d4135683b0a09fe4e6d453c54e2e734d5ee00744a49",
66
"blockNumber": "0x6",
77
"contractAddress": null,
88
"cumulativeGasUsed": "0x5208",

internal/ethapi/testdata/eth_getTransactionReceipt-blob-tx.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"blobGasPrice": "0x1",
33
"blobGasUsed": "0x20000",
4-
"blockHash": "0x11e6318d77a45c01f89f76b56d36c6936c5250f4e2bd238cb7b09df73cf0cb7d",
4+
"blockHash": "0x17124e31fb075a301b1d7d4135683b0a09fe4e6d453c54e2e734d5ee00744a49",
55
"blockNumber": "0x6",
66
"contractAddress": null,
77
"cumulativeGasUsed": "0x5208",

internal/ethapi/testdata/eth_getTransactionReceipt-create-contract-tx.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"blockHash": "0x5526cd89bc188f20fd5e9bb50d8054dc5a51a81a74ed07eacf36a4a8b10de4b1",
2+
"blockHash": "0xb3e447c77374fd285964cba692e96b1673a88a959726826b5b6e2dca15472b0a",
33
"blockNumber": "0x2",
44
"contractAddress": "0xae9bea628c4ce503dcfd7e305cab4e29e7476592",
55
"cumulativeGasUsed": "0xcf50",

internal/ethapi/testdata/eth_getTransactionReceipt-create-contract-with-access-list.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"blockHash": "0xa04ad6be58c45fe483991b89416572bc50426b0de44b769757e95c704250f874",
2+
"blockHash": "0x53bffe54375c0a31fe7bc0db7455db7d48278234c2400efa4d40d1c57cbe868d",
33
"blockNumber": "0x5",
44
"contractAddress": "0xfdaa97661a584d977b4d3abb5370766ff5b86a18",
55
"cumulativeGasUsed": "0xe01c",

internal/ethapi/testdata/eth_getTransactionReceipt-dynamic-tx-with-logs.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"blockHash": "0x3e946aa9e252873af511b257d9d89a1bcafa54ce7c6a6442f8407ecdf81e288d",
2+
"blockHash": "0x102e50de30318ee99a03a09db74387e79cad3165bf6840cc84249806a2a302f3",
33
"blockNumber": "0x4",
44
"contractAddress": null,
55
"cumulativeGasUsed": "0x538d",

internal/ethapi/testdata/eth_getTransactionReceipt-normal-transfer-tx.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"blockHash": "0xda50d57d8802553b00bb8e4d777bd5c4114086941119ca04edb15429f4818ed9",
2+
"blockHash": "0xe9bd1d8c303b1af5c704b9d78e62c54a34af47e0db04ac1389a5ef74a619b9da",
33
"blockNumber": "0x1",
44
"contractAddress": null,
55
"cumulativeGasUsed": "0x5208",

internal/ethapi/testdata/eth_getTransactionReceipt-with-logs.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"blockHash": "0xc281d4299fc4e8ce5bba7ecb8deb50f5403d604c806b36aa887dfe2ff84c064f",
2+
"blockHash": "0xcc6225bf39327429a3d869af71182d619a354155187d0b5a8ecd6a9309cffcaa",
33
"blockNumber": "0x3",
44
"contractAddress": null,
55
"cumulativeGasUsed": "0x5e28",
@@ -18,7 +18,7 @@
1818
"blockNumber": "0x3",
1919
"transactionHash": "0xeaf3921cbf03ba45bad4e6ab807b196ce3b2a0b5bacc355b6272fa96b11b4287",
2020
"transactionIndex": "0x0",
21-
"blockHash": "0xc281d4299fc4e8ce5bba7ecb8deb50f5403d604c806b36aa887dfe2ff84c064f",
21+
"blockHash": "0xcc6225bf39327429a3d869af71182d619a354155187d0b5a8ecd6a9309cffcaa",
2222
"logIndex": "0x0",
2323
"removed": false
2424
}

miner/worker.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,18 +121,15 @@ func (miner *Miner) generateWork(params *generateParams, witness bool) *newPaylo
121121
// Collect consensus-layer requests if Prague is enabled.
122122
var requests [][]byte
123123
if miner.chainConfig.IsPrague(work.header.Number, work.header.Time) {
124+
requests = [][]byte{}
124125
// EIP-6110 deposits
125-
depositRequests, err := core.ParseDepositLogs(allLogs, miner.chainConfig)
126-
if err != nil {
126+
if err := core.ParseDepositLogs(&requests, allLogs, miner.chainConfig); err != nil {
127127
return &newPayloadResult{err: err}
128128
}
129-
requests = append(requests, depositRequests)
130-
// EIP-7002 withdrawals
131-
withdrawalRequests := core.ProcessWithdrawalQueue(work.evm)
132-
requests = append(requests, withdrawalRequests)
129+
// EIP-7002
130+
core.ProcessWithdrawalQueue(&requests, work.evm)
133131
// EIP-7251 consolidations
134-
consolidationRequests := core.ProcessConsolidationQueue(work.evm)
135-
requests = append(requests, consolidationRequests)
132+
core.ProcessConsolidationQueue(&requests, work.evm)
136133
}
137134
if requests != nil {
138135
reqHash := types.CalcRequestsHash(requests)

0 commit comments

Comments
 (0)