remove receipt tests in peer_test.go

This commit is contained in:
healthykim 2026-03-19 03:10:51 +09:00
parent 155da48d55
commit 5bb2cf35ab

View file

@ -21,17 +21,11 @@ package eth
import (
"crypto/rand"
"math/big"
"testing"
"time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/p2p/enode"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rlp"
)
// testPeer is a simulated peer to allow testing direct network calls.
@ -94,328 +88,3 @@ func TestPeerSet(t *testing.T) {
t.Fatalf("bad size")
}
}
func TestPartialReceipt(t *testing.T) {
gen := func(_ int, g *core.BlockGen) {
signer := types.HomesteadSigner{}
for range 4 {
tx, _ := types.SignTx(types.NewTransaction(g.TxNonce(testAddr), testAddr, big.NewInt(10), params.TxGas, g.BaseFee(), nil), signer, testKey)
g.AddTx(tx)
}
}
backend := newTestBackendWithGenerator(4, true, true, gen)
defer backend.close()
app, net := p2p.MsgPipe()
var id enode.ID
if _, err := rand.Read(id[:]); err != nil {
t.Fatalf("failed to create random peer: %v", err)
}
peer := NewPeer(ETH70, p2p.NewPeer(id, "peer", nil), net, nil, nil)
packetCh := make(chan *GetReceiptsPacket70, 1)
go func() {
for {
msg, err := app.ReadMsg()
if err != nil {
return
}
if msg.Code == GetReceiptsMsg {
var pkt GetReceiptsPacket70
if err := msg.Decode(&pkt); err == nil {
select {
case packetCh <- &pkt:
default:
}
}
}
msg.Discard()
}
}()
hashes := []common.Hash{
backend.chain.GetBlockByNumber(1).Hash(),
backend.chain.GetBlockByNumber(2).Hash(),
backend.chain.GetBlockByNumber(3).Hash(),
backend.chain.GetBlockByNumber(4).Hash(),
}
gasUsed := []uint64{
backend.chain.GetBlockByNumber(1).GasUsed(),
backend.chain.GetBlockByNumber(2).GasUsed(),
backend.chain.GetBlockByNumber(3).GasUsed(),
backend.chain.GetBlockByNumber(4).GasUsed(),
}
timestamps := []uint64{
backend.chain.GetBlockByNumber(1).Time(),
backend.chain.GetBlockByNumber(2).Time(),
backend.chain.GetBlockByNumber(3).Time(),
backend.chain.GetBlockByNumber(4).Time(),
}
sink := make(chan *Response, 1)
req, err := peer.RequestReceipts(hashes, gasUsed, timestamps, sink)
if err != nil {
t.Fatalf("RequestReceipts failed: %v", err)
}
select {
case _ = <-packetCh:
case <-time.After(2 * time.Second):
t.Fatalf("timeout waiting for request packet")
}
receipts := []Receipt{
{GasUsed: 21_000, Logs: rlp.RawValue(make([]byte, 1))},
}
logReceipts := []Receipt{
{GasUsed: 21_000, Logs: rlp.RawValue(make([]byte, 1))},
{GasUsed: 21_000, Logs: rlp.RawValue(make([]byte, 1))},
{GasUsed: 21_000, Logs: rlp.RawValue(make([]byte, 1))},
}
delivery := &ReceiptsPacket70{
RequestId: req.id,
LastBlockIncomplete: true,
List: encodeRL([]*ReceiptList{
{
items: encodeRL(receipts),
},
{
items: encodeRL(receipts),
},
}),
}
receiptList, _ := delivery.List.Items()
if err := peer.bufferReceipts(delivery.RequestId, receiptList, delivery.LastBlockIncomplete, backend); err != nil {
t.Fatalf("first bufferReceipts failed: %v", err)
}
if err := peer.requestPartialReceipts(req.id); err != nil {
t.Fatalf("requestPartialReceipts failed: %v", err)
}
var rereq *GetReceiptsPacket70
select {
case rereq = <-packetCh:
case <-time.After(2 * time.Second):
t.Fatalf("timeout waiting for re-request packet")
}
buffer, ok := peer.receiptBuffer[rereq.RequestId]
if !ok {
t.Fatalf("receiptBuffer should buffer incomplete receipts")
}
if rereq.FirstBlockReceiptIndex != uint64(buffer.list[len(buffer.list)-1].items.Len()) {
t.Fatalf("unexpected FirstBlockReceiptIndex, got %d want %d", rereq.FirstBlockReceiptIndex, buffer.list[len(buffer.list)-1].items.Len())
}
delivery = &ReceiptsPacket70{
RequestId: req.id,
LastBlockIncomplete: true,
List: encodeRL([]*ReceiptList{
{
items: encodeRL(receipts),
},
}),
}
receiptLists, _ := delivery.List.Items()
if err := peer.bufferReceipts(delivery.RequestId, receiptLists, delivery.LastBlockIncomplete, backend); err != nil {
t.Fatalf("second bufferReceipts failed: %v", err)
}
if err := peer.requestPartialReceipts(req.id); err != nil {
t.Fatalf("requestPartialReceipts failed: %v", err)
}
select {
case rereq = <-packetCh:
case <-time.After(2 * time.Second):
t.Fatalf("timeout waiting for re-request packet")
}
buffer, ok = peer.receiptBuffer[rereq.RequestId]
if !ok {
t.Fatalf("receiptBuffer should buffer incomplete receipts")
}
if rereq.FirstBlockReceiptIndex != uint64(buffer.list[len(buffer.list)-1].items.Len()) {
t.Fatalf("unexpected FirstBlockReceiptIndex, got %d want %d", rereq.FirstBlockReceiptIndex, buffer.list[len(buffer.list)-1].items.Len())
}
if len(rereq.GetReceiptsRequest) != 3 {
t.Fatalf("wrong partial request range, got %d want %d", len(rereq.GetReceiptsRequest), 3)
}
delivery = &ReceiptsPacket70{
RequestId: rereq.RequestId,
LastBlockIncomplete: false,
List: encodeRL([]*ReceiptList{
{
items: encodeRL(receipts),
},
{
items: encodeRL(receipts),
},
{
items: encodeRL(receipts),
},
}),
}
receiptList, _ = delivery.List.Items()
if err := peer.bufferReceipts(delivery.RequestId, receiptList, delivery.LastBlockIncomplete, backend); err != nil {
t.Fatalf("third bufferReceipts failed: %v", err)
}
merged := peer.flushReceipts(rereq.RequestId)
if merged == nil {
t.Fatalf("flushReceipts should return merged receipt lists")
}
if _, ok := peer.receiptBuffer[rereq.RequestId]; ok {
t.Fatalf("receiptBuffer should be cleared after flush")
}
for i, list := range merged {
if i == 1 {
if list.items.Len() != len(logReceipts) {
t.Fatalf("wrong response buffering, got %d want %d", list.items.Len(), len(logReceipts))
}
} else {
if list.items.Len() != len(receipts) {
t.Fatalf("wrong response buffering, got %d want %d", list.items.Len(), len(receipts))
}
}
}
}
func TestPartialReceiptFailure(t *testing.T) {
gen := func(_ int, g *core.BlockGen) {
signer := types.HomesteadSigner{}
for range 4 {
tx, _ := types.SignTx(types.NewTransaction(g.TxNonce(testAddr), testAddr, big.NewInt(10), params.TxGas, g.BaseFee(), nil), signer, testKey)
g.AddTx(tx)
}
}
backend := newTestBackendWithGenerator(4, true, true, gen)
defer backend.close()
app, net := p2p.MsgPipe()
var id enode.ID
if _, err := rand.Read(id[:]); err != nil {
t.Fatalf("failed to create random peer: %v", err)
}
peer := NewPeer(ETH70, p2p.NewPeer(id, "peer", nil), net, nil, nil)
packetCh := make(chan *GetReceiptsPacket70, 1)
go func() {
for {
msg, err := app.ReadMsg()
if err != nil {
return
}
if msg.Code == GetReceiptsMsg {
var pkt GetReceiptsPacket70
if err := msg.Decode(&pkt); err == nil {
select {
case packetCh <- &pkt:
default:
}
}
}
msg.Discard()
}
}()
// If a peer delivers response which is never requested, the tracker should reject it.
delivery := &ReceiptsPacket70{
RequestId: 66,
LastBlockIncomplete: true,
List: encodeRL([]*ReceiptList{
{
items: encodeRL([]Receipt{
{GasUsed: 21_000, Logs: rlp.RawValue(make([]byte, 1))},
}),
},
{
items: encodeRL([]Receipt{
{GasUsed: 21_000, Logs: rlp.RawValue(make([]byte, 2))},
}),
},
}),
}
// If a peer deliverse excessive amount of receipts, it should also fail the validation
hashes := []common.Hash{
backend.chain.GetBlockByNumber(1).Hash(),
backend.chain.GetBlockByNumber(2).Hash(),
backend.chain.GetBlockByNumber(3).Hash(),
backend.chain.GetBlockByNumber(4).Hash(),
}
gasUsed := []uint64{
backend.chain.GetBlockByNumber(1).GasUsed(),
backend.chain.GetBlockByNumber(2).GasUsed(),
backend.chain.GetBlockByNumber(3).GasUsed(),
backend.chain.GetBlockByNumber(4).GasUsed(),
}
timestamps := []uint64{
backend.chain.GetBlockByNumber(1).Time(),
backend.chain.GetBlockByNumber(2).Time(),
backend.chain.GetBlockByNumber(3).Time(),
backend.chain.GetBlockByNumber(4).Time(),
}
// Case 1 ) The number of receipts exceeds maximum tx count
sink := make(chan *Response, 1)
req, err := peer.RequestReceipts(hashes, gasUsed, timestamps, sink)
if err != nil {
t.Fatalf("RequestReceipts failed: %v", err)
}
select {
case _ = <-packetCh:
case <-time.After(2 * time.Second):
t.Fatalf("timeout waiting for request packet")
}
maxTxCount := backend.chain.GetBlockByNumber(1).GasUsed() / 21_000
excessiveReceipts := []Receipt{{Logs: rlp.RawValue(make([]byte, 1))}}
for range maxTxCount {
excessiveReceipts = append(excessiveReceipts, Receipt{Logs: rlp.RawValue(make([]byte, 1))})
}
delivery = &ReceiptsPacket70{
RequestId: req.id,
LastBlockIncomplete: true,
List: encodeRL([]*ReceiptList{{
items: encodeRL(excessiveReceipts),
}}),
}
receiptList, _ := delivery.List.Items()
err = peer.bufferReceipts(delivery.RequestId, receiptList, delivery.LastBlockIncomplete, backend)
if err == nil {
t.Fatal("Response with the excessive number of receipts should fail the validation")
}
// Case 2 ) Total receipt size exceeds the block gas limit
req, err = peer.RequestReceipts(hashes, gasUsed, timestamps, sink)
if err != nil {
t.Fatalf("RequestReceipts failed: %v", err)
}
select {
case _ = <-packetCh:
case <-time.After(2 * time.Second):
t.Fatalf("timeout waiting for request packet")
}
maxReceiptSize := backend.chain.GetBlockByNumber(1).GasUsed() / params.LogDataGas
delivery = &ReceiptsPacket70{
RequestId: req.id,
LastBlockIncomplete: true,
List: encodeRL([]*ReceiptList{{
items: encodeRL([]Receipt{
{Logs: rlp.RawValue(make([]byte, maxReceiptSize+1))},
}),
}}),
}
receiptList, _ = delivery.List.Items()
err = peer.bufferReceipts(delivery.RequestId, receiptList, delivery.LastBlockIncomplete, backend)
if err == nil {
t.Fatal("Response with the large log size should fail the validation")
}
}