Skip to content

Commit 6d7e0b7

Browse files
miner: catalyst: return transaction fees for block
1 parent 38938d0 commit 6d7e0b7

File tree

7 files changed

+38
-30
lines changed

7 files changed

+38
-30
lines changed

core/beacon/types.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ type executableDataMarshaling struct {
7575
Transactions []hexutil.Bytes
7676
}
7777

78+
type ExecutableDataV2 struct {
79+
ExecutionPayload *ExecutableData `json:"executionPayload" gencodec:"required"`
80+
BlockValue *big.Int `json:"blockValue" gencodec:"required"`
81+
}
82+
7883
type PayloadStatusV1 struct {
7984
Status string `json:"status"`
8085
LatestValidHash *common.Hash `json:"latestValidHash"`
@@ -197,8 +202,8 @@ func ExecutableDataToBlock(params ExecutableData) (*types.Block, error) {
197202

198203
// BlockToExecutableData constructs the ExecutableData structure by filling the
199204
// fields from the given block. It assumes the given block is post-merge block.
200-
func BlockToExecutableData(block *types.Block) *ExecutableData {
201-
return &ExecutableData{
205+
func BlockToExecutableData(block *types.Block, fees *big.Int) *ExecutableDataV2 {
206+
data := &ExecutableData{
202207
BlockHash: block.Hash(),
203208
ParentHash: block.ParentHash(),
204209
FeeRecipient: block.Coinbase(),
@@ -215,4 +220,5 @@ func BlockToExecutableData(block *types.Block) *ExecutableData {
215220
ExtraData: block.Extra(),
216221
Withdrawals: block.Withdrawals(),
217222
}
223+
return &ExecutableDataV2{ExecutionPayload: data, BlockValue: fees}
218224
}

eth/catalyst/api.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,11 +352,11 @@ func (api *ConsensusAPI) GetPayloadV1(payloadID beacon.PayloadID) (*beacon.Execu
352352
if err != nil {
353353
return nil, err
354354
}
355-
return data, nil
355+
return data.ExecutionPayload, nil
356356
}
357357

358358
// GetPayloadV2 returns a cached payload by id.
359-
func (api *ConsensusAPI) GetPayloadV2(payloadID beacon.PayloadID) (*beacon.ExecutableData, error) {
359+
func (api *ConsensusAPI) GetPayloadV2(payloadID beacon.PayloadID) (*beacon.ExecutableDataV2, error) {
360360
log.Trace("Engine API request received", "method", "GetPayload", "id", payloadID)
361361
data := api.localBlocks.get(payloadID)
362362
if data == nil {

eth/catalyst/api_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ func assembleBlock(api *ConsensusAPI, parentHash common.Hash, params *beacon.Pay
657657
if err != nil {
658658
return nil, err
659659
}
660-
return payload.ResolveFull(), nil
660+
return payload.ResolveFull().ExecutionPayload, nil
661661
}
662662

663663
func TestEmptyBlocks(t *testing.T) {
@@ -899,7 +899,7 @@ func TestNewPayloadOnInvalidTerminalBlock(t *testing.T) {
899899
if err != nil {
900900
t.Fatalf("error preparing payload, err=%v", err)
901901
}
902-
data := *payload.Resolve()
902+
data := *payload.Resolve().ExecutionPayload
903903
resp2, err := api.NewPayloadV1(data)
904904
if err != nil {
905905
t.Fatalf("error sending NewPayload, err=%v", err)
@@ -1039,12 +1039,12 @@ func TestWithdrawals(t *testing.T) {
10391039
if err != nil {
10401040
t.Fatalf("error getting payload, err=%v", err)
10411041
}
1042-
if execData.StateRoot != parent.Root {
1043-
t.Fatalf("mismatch state roots (got: %s, want: %s)", execData.StateRoot, blocks[8].Root())
1042+
if execData.ExecutionPayload.StateRoot != parent.Root {
1043+
t.Fatalf("mismatch state roots (got: %s, want: %s)", execData.ExecutionPayload.StateRoot, blocks[8].Root())
10441044
}
10451045

10461046
// 10: verify locally built block
1047-
if status, err := api.NewPayloadV2(*execData); err != nil {
1047+
if status, err := api.NewPayloadV2(*execData.ExecutionPayload); err != nil {
10481048
t.Fatalf("error validating payload: %v", err)
10491049
} else if status.Status != beacon.VALID {
10501050
t.Fatalf("invalid payload")
@@ -1054,7 +1054,7 @@ func TestWithdrawals(t *testing.T) {
10541054
aa := common.Address{0xaa}
10551055
bb := common.Address{0xbb}
10561056
params = beacon.PayloadAttributes{
1057-
Timestamp: execData.Timestamp + 5,
1057+
Timestamp: execData.ExecutionPayload.Timestamp + 5,
10581058
Withdrawals: []*types.Withdrawal{
10591059
{
10601060
Index: 0,
@@ -1068,7 +1068,7 @@ func TestWithdrawals(t *testing.T) {
10681068
},
10691069
},
10701070
}
1071-
fcState.HeadBlockHash = execData.BlockHash
1071+
fcState.HeadBlockHash = execData.ExecutionPayload.BlockHash
10721072
_, err = api.ForkchoiceUpdatedV2(fcState, &params)
10731073
if err != nil {
10741074
t.Fatalf("error preparing payload, err=%v", err)
@@ -1085,21 +1085,21 @@ func TestWithdrawals(t *testing.T) {
10851085
if err != nil {
10861086
t.Fatalf("error getting payload, err=%v", err)
10871087
}
1088-
if status, err := api.NewPayloadV2(*execData); err != nil {
1088+
if status, err := api.NewPayloadV2(*execData.ExecutionPayload); err != nil {
10891089
t.Fatalf("error validating payload: %v", err)
10901090
} else if status.Status != beacon.VALID {
10911091
t.Fatalf("invalid payload")
10921092
}
10931093

10941094
// 11: set block as head.
1095-
fcState.HeadBlockHash = execData.BlockHash
1095+
fcState.HeadBlockHash = execData.ExecutionPayload.BlockHash
10961096
_, err = api.ForkchoiceUpdatedV2(fcState, nil)
10971097
if err != nil {
10981098
t.Fatalf("error preparing payload, err=%v", err)
10991099
}
11001100

11011101
// 11: verify withdrawals were processed.
1102-
db, _, err := ethservice.APIBackend.StateAndHeaderByNumber(context.Background(), rpc.BlockNumber(execData.Number))
1102+
db, _, err := ethservice.APIBackend.StateAndHeaderByNumber(context.Background(), rpc.BlockNumber(execData.ExecutionPayload.Number))
11031103
if err != nil {
11041104
t.Fatalf("unable to load db: %v", err)
11051105
}

eth/catalyst/queue.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func (q *payloadQueue) put(id beacon.PayloadID, payload *miner.Payload) {
7070
}
7171

7272
// get retrieves a previously stored payload item or nil if it does not exist.
73-
func (q *payloadQueue) get(id beacon.PayloadID) *beacon.ExecutableData {
73+
func (q *payloadQueue) get(id beacon.PayloadID) *beacon.ExecutableDataV2 {
7474
q.lock.RLock()
7575
defer q.lock.RUnlock()
7676

eth/catalyst/tester.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package catalyst
1818

1919
import (
20+
"math/big"
2021
"sync"
2122
"time"
2223

@@ -76,8 +77,8 @@ func (tester *FullSyncTester) Start() error {
7677
return
7778
}
7879
// Shoot out consensus events in order to trigger syncing.
79-
data := beacon.BlockToExecutableData(tester.block)
80-
tester.api.NewPayloadV1(*data)
80+
data := beacon.BlockToExecutableData(tester.block, big.NewInt(0))
81+
tester.api.NewPayloadV1(*data.ExecutionPayload)
8182
tester.api.ForkchoiceUpdatedV1(beacon.ForkchoiceStateV1{
8283
HeadBlockHash: tester.block.Hash(),
8384
SafeBlockHash: tester.block.Hash(),

miner/payload_building.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func (payload *Payload) update(block *types.Block, fees *big.Int, elapsed time.D
108108

109109
// Resolve returns the latest built payload and also terminates the background
110110
// thread for updating payload. It's safe to be called multiple times.
111-
func (payload *Payload) Resolve() *beacon.ExecutableData {
111+
func (payload *Payload) Resolve() *beacon.ExecutableDataV2 {
112112
payload.lock.Lock()
113113
defer payload.lock.Unlock()
114114

@@ -118,23 +118,23 @@ func (payload *Payload) Resolve() *beacon.ExecutableData {
118118
close(payload.stop)
119119
}
120120
if payload.full != nil {
121-
return beacon.BlockToExecutableData(payload.full)
121+
return beacon.BlockToExecutableData(payload.full, payload.fullFees)
122122
}
123-
return beacon.BlockToExecutableData(payload.empty)
123+
return beacon.BlockToExecutableData(payload.empty, big.NewInt(0))
124124
}
125125

126126
// ResolveEmpty is basically identical to Resolve, but it expects empty block only.
127127
// It's only used in tests.
128-
func (payload *Payload) ResolveEmpty() *beacon.ExecutableData {
128+
func (payload *Payload) ResolveEmpty() *beacon.ExecutableDataV2 {
129129
payload.lock.Lock()
130130
defer payload.lock.Unlock()
131131

132-
return beacon.BlockToExecutableData(payload.empty)
132+
return beacon.BlockToExecutableData(payload.empty, big.NewInt(0))
133133
}
134134

135135
// ResolveFull is basically identical to Resolve, but it expects full block only.
136136
// It's only used in tests.
137-
func (payload *Payload) ResolveFull() *beacon.ExecutableData {
137+
func (payload *Payload) ResolveFull() *beacon.ExecutableDataV2 {
138138
payload.lock.Lock()
139139
defer payload.lock.Unlock()
140140

@@ -146,7 +146,7 @@ func (payload *Payload) ResolveFull() *beacon.ExecutableData {
146146
}
147147
payload.cond.Wait()
148148
}
149-
return beacon.BlockToExecutableData(payload.full)
149+
return beacon.BlockToExecutableData(payload.full, payload.fullFees)
150150
}
151151

152152
// buildPayload builds the payload according to the provided parameters.

miner/payload_building_test.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,21 @@ func TestBuildPayload(t *testing.T) {
4747
if err != nil {
4848
t.Fatalf("Failed to build payload %v", err)
4949
}
50-
verify := func(data *beacon.ExecutableData, txs int) {
51-
if data.ParentHash != b.chain.CurrentBlock().Hash() {
50+
verify := func(outer *beacon.ExecutableDataV2, txs int) {
51+
payload := outer.ExecutionPayload
52+
if payload.ParentHash != b.chain.CurrentBlock().Hash() {
5253
t.Fatal("Unexpect parent hash")
5354
}
54-
if data.Random != (common.Hash{}) {
55+
if payload.Random != (common.Hash{}) {
5556
t.Fatal("Unexpect random value")
5657
}
57-
if data.Timestamp != timestamp {
58+
if payload.Timestamp != timestamp {
5859
t.Fatal("Unexpect timestamp")
5960
}
60-
if data.FeeRecipient != recipient {
61+
if payload.FeeRecipient != recipient {
6162
t.Fatal("Unexpect fee recipient")
6263
}
63-
if len(data.Transactions) != txs {
64+
if len(payload.Transactions) != txs {
6465
t.Fatal("Unexpect transaction set")
6566
}
6667
}

0 commit comments

Comments
 (0)