forked from cerc-io/plugeth
2f73f4f028
According to the spec the payloadID needs to be random or dependent on all arguments, to prevent two payloads from clashing. This change adds withdrawals into the payload derivation. --------- Co-authored-by: lightclient@protonmail.com <lightclient@protonmail.com> Co-authored-by: Martin Holst Swende <martin@swende.se> Co-authored-by: Felix Lange <fjl@twurst.com>
159 lines
4.3 KiB
Go
159 lines
4.3 KiB
Go
// Copyright 2022 The go-ethereum Authors
|
|
// This file is part of the go-ethereum library.
|
|
//
|
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>
|
|
|
|
package miner
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/ethereum/go-ethereum/beacon/engine"
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/ethereum/go-ethereum/consensus/ethash"
|
|
"github.com/ethereum/go-ethereum/core/rawdb"
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
"github.com/ethereum/go-ethereum/params"
|
|
)
|
|
|
|
func TestBuildPayload(t *testing.T) {
|
|
var (
|
|
db = rawdb.NewMemoryDatabase()
|
|
recipient = common.HexToAddress("0xdeadbeef")
|
|
)
|
|
w, b := newTestWorker(t, params.TestChainConfig, ethash.NewFaker(), db, 0)
|
|
defer w.close()
|
|
|
|
timestamp := uint64(time.Now().Unix())
|
|
args := &BuildPayloadArgs{
|
|
Parent: b.chain.CurrentBlock().Hash(),
|
|
Timestamp: timestamp,
|
|
Random: common.Hash{},
|
|
FeeRecipient: recipient,
|
|
}
|
|
payload, err := w.buildPayload(args)
|
|
if err != nil {
|
|
t.Fatalf("Failed to build payload %v", err)
|
|
}
|
|
verify := func(outer *engine.ExecutionPayloadEnvelope, txs int) {
|
|
payload := outer.ExecutionPayload
|
|
if payload.ParentHash != b.chain.CurrentBlock().Hash() {
|
|
t.Fatal("Unexpect parent hash")
|
|
}
|
|
if payload.Random != (common.Hash{}) {
|
|
t.Fatal("Unexpect random value")
|
|
}
|
|
if payload.Timestamp != timestamp {
|
|
t.Fatal("Unexpect timestamp")
|
|
}
|
|
if payload.FeeRecipient != recipient {
|
|
t.Fatal("Unexpect fee recipient")
|
|
}
|
|
if len(payload.Transactions) != txs {
|
|
t.Fatal("Unexpect transaction set")
|
|
}
|
|
}
|
|
empty := payload.ResolveEmpty()
|
|
verify(empty, 0)
|
|
|
|
full := payload.ResolveFull()
|
|
verify(full, len(pendingTxs))
|
|
|
|
// Ensure resolve can be called multiple times and the
|
|
// result should be unchanged
|
|
dataOne := payload.Resolve()
|
|
dataTwo := payload.Resolve()
|
|
if !reflect.DeepEqual(dataOne, dataTwo) {
|
|
t.Fatal("Unexpected payload data")
|
|
}
|
|
}
|
|
|
|
func TestPayloadId(t *testing.T) {
|
|
ids := make(map[string]int)
|
|
for i, tt := range []*BuildPayloadArgs{
|
|
&BuildPayloadArgs{
|
|
Parent: common.Hash{1},
|
|
Timestamp: 1,
|
|
Random: common.Hash{0x1},
|
|
FeeRecipient: common.Address{0x1},
|
|
},
|
|
// Different parent
|
|
&BuildPayloadArgs{
|
|
Parent: common.Hash{2},
|
|
Timestamp: 1,
|
|
Random: common.Hash{0x1},
|
|
FeeRecipient: common.Address{0x1},
|
|
},
|
|
// Different timestamp
|
|
&BuildPayloadArgs{
|
|
Parent: common.Hash{2},
|
|
Timestamp: 2,
|
|
Random: common.Hash{0x1},
|
|
FeeRecipient: common.Address{0x1},
|
|
},
|
|
// Different Random
|
|
&BuildPayloadArgs{
|
|
Parent: common.Hash{2},
|
|
Timestamp: 2,
|
|
Random: common.Hash{0x2},
|
|
FeeRecipient: common.Address{0x1},
|
|
},
|
|
// Different fee-recipient
|
|
&BuildPayloadArgs{
|
|
Parent: common.Hash{2},
|
|
Timestamp: 2,
|
|
Random: common.Hash{0x2},
|
|
FeeRecipient: common.Address{0x2},
|
|
},
|
|
// Different withdrawals (non-empty)
|
|
&BuildPayloadArgs{
|
|
Parent: common.Hash{2},
|
|
Timestamp: 2,
|
|
Random: common.Hash{0x2},
|
|
FeeRecipient: common.Address{0x2},
|
|
Withdrawals: []*types.Withdrawal{
|
|
&types.Withdrawal{
|
|
Index: 0,
|
|
Validator: 0,
|
|
Address: common.Address{},
|
|
Amount: 0,
|
|
},
|
|
},
|
|
},
|
|
// Different withdrawals (non-empty)
|
|
&BuildPayloadArgs{
|
|
Parent: common.Hash{2},
|
|
Timestamp: 2,
|
|
Random: common.Hash{0x2},
|
|
FeeRecipient: common.Address{0x2},
|
|
Withdrawals: []*types.Withdrawal{
|
|
&types.Withdrawal{
|
|
Index: 2,
|
|
Validator: 0,
|
|
Address: common.Address{},
|
|
Amount: 0,
|
|
},
|
|
},
|
|
},
|
|
} {
|
|
id := tt.Id().String()
|
|
if prev, exists := ids[id]; exists {
|
|
t.Errorf("ID collision, case %d and case %d: id %v", prev, i, id)
|
|
}
|
|
ids[id] = i
|
|
}
|
|
}
|