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
 | 
						|
	}
 | 
						|
}
 |