@@ -18,9 +18,11 @@ package eth
1818
1919import (
2020 "bytes"
21+ "crypto/sha256"
2122 "math"
2223 "math/big"
2324 "math/rand"
25+ "os"
2426 "testing"
2527 "time"
2628
@@ -30,15 +32,18 @@ import (
3032 "github.com/ethereum/go-ethereum/core"
3133 "github.com/ethereum/go-ethereum/core/rawdb"
3234 "github.com/ethereum/go-ethereum/core/txpool"
35+ "github.com/ethereum/go-ethereum/core/txpool/blobpool"
3336 "github.com/ethereum/go-ethereum/core/txpool/legacypool"
3437 "github.com/ethereum/go-ethereum/core/types"
3538 "github.com/ethereum/go-ethereum/core/vm"
3639 "github.com/ethereum/go-ethereum/crypto"
40+ "github.com/ethereum/go-ethereum/crypto/kzg4844"
3741 "github.com/ethereum/go-ethereum/ethdb"
3842 "github.com/ethereum/go-ethereum/p2p"
3943 "github.com/ethereum/go-ethereum/p2p/enode"
4044 "github.com/ethereum/go-ethereum/params"
4145 "github.com/ethereum/go-ethereum/rlp"
46+ "github.com/holiman/uint256"
4247)
4348
4449var (
@@ -62,12 +67,15 @@ type testBackend struct {
6267
6368// newTestBackend creates an empty chain and wraps it into a mock backend.
6469func newTestBackend (blocks int ) * testBackend {
65- return newTestBackendWithGenerator (blocks , false , nil )
70+ return newTestBackendWithGenerator (blocks , false , false , nil )
6671}
6772
6873// newTestBackendWithGenerator creates a chain with a number of explicitly defined blocks and
6974// wraps it into a mock backend.
70- func newTestBackendWithGenerator (blocks int , shanghai bool , generator func (int , * core.BlockGen )) * testBackend {
75+ func newTestBackendWithGenerator (
76+ blocks int , shanghai bool , cancun bool ,
77+ generator func (int , * core.BlockGen ),
78+ ) * testBackend {
7179 var (
7280 // Create a database pre-initialize with a genesis block
7381 db = rawdb .NewMemoryDatabase ()
@@ -99,9 +107,21 @@ func newTestBackendWithGenerator(blocks int, shanghai bool, generator func(int,
99107 }
100108 }
101109
110+ if cancun {
111+ config .CancunTime = u64 (0 )
112+ config .BlobScheduleConfig = & params.BlobScheduleConfig {
113+ Cancun : & params.BlobConfig {
114+ Target : 3 ,
115+ Max : 6 ,
116+ UpdateFraction : params .DefaultCancunBlobConfig .UpdateFraction ,
117+ },
118+ }
119+ }
120+
102121 gspec := & core.Genesis {
103- Config : config ,
104- Alloc : types.GenesisAlloc {testAddr : {Balance : big .NewInt (100_000_000_000_000_000 )}},
122+ Config : config ,
123+ Alloc : types.GenesisAlloc {testAddr : {Balance : big .NewInt (100_000_000_000_000_000 )}},
124+ Difficulty : common .Big0 ,
105125 }
106126 chain , _ := core .NewBlockChain (db , nil , gspec , nil , engine , vm.Config {}, nil )
107127
@@ -115,8 +135,12 @@ func newTestBackendWithGenerator(blocks int, shanghai bool, generator func(int,
115135 txconfig := legacypool .DefaultConfig
116136 txconfig .Journal = "" // Don't litter the disk with test journals
117137
118- pool := legacypool .New (txconfig , chain )
119- txpool , _ := txpool .New (txconfig .PriceLimit , chain , []txpool.SubPool {pool })
138+ storage , _ := os .MkdirTemp ("" , "blobpool-" )
139+ defer os .RemoveAll (storage )
140+
141+ blobPool := blobpool .New (blobpool.Config {Datadir : storage }, chain )
142+ legacyPool := legacypool .New (txconfig , chain )
143+ txpool , _ := txpool .New (txconfig .PriceLimit , chain , []txpool.SubPool {legacyPool , blobPool })
120144
121145 return & testBackend {
122146 db : db ,
@@ -351,7 +375,7 @@ func testGetBlockBodies(t *testing.T, protocol uint) {
351375 }
352376 }
353377
354- backend := newTestBackendWithGenerator (maxBodiesServe + 15 , true , gen )
378+ backend := newTestBackendWithGenerator (maxBodiesServe + 15 , true , false , gen )
355379 defer backend .close ()
356380
357381 peer , _ := newTestPeer ("peer" , protocol , backend )
@@ -471,7 +495,7 @@ func testGetBlockReceipts(t *testing.T, protocol uint) {
471495 }
472496 }
473497 // Assemble the test environment
474- backend := newTestBackendWithGenerator (4 , false , generator )
498+ backend := newTestBackendWithGenerator (4 , false , false , generator )
475499 defer backend .close ()
476500
477501 peer , _ := newTestPeer ("peer" , protocol , backend )
@@ -548,7 +572,7 @@ func setup() (*testBackend, *testPeer) {
548572 block .SetExtra ([]byte ("yeehaw" ))
549573 }
550574 }
551- backend := newTestBackendWithGenerator (maxBodiesServe + 15 , true , gen )
575+ backend := newTestBackendWithGenerator (maxBodiesServe + 15 , true , false , gen )
552576 peer , _ := newTestPeer ("peer" , ETH68 , backend )
553577 // Discard all messages
554578 go func () {
@@ -573,3 +597,81 @@ func FuzzEthProtocolHandlers(f *testing.F) {
573597 handler (backend , decoder {msg : msg }, peer .Peer )
574598 })
575599}
600+
601+ func TestGetPooledTransaction (t * testing.T ) {
602+ t .Run ("blobTx" , func (t * testing.T ) {
603+ testGetPooledTransaction (t , true )
604+ })
605+ t .Run ("legacyTx" , func (t * testing.T ) {
606+ testGetPooledTransaction (t , false )
607+ })
608+ }
609+
610+ func testGetPooledTransaction (t * testing.T , blobTx bool ) {
611+ var (
612+ emptyBlob = kzg4844.Blob {}
613+ emptyBlobs = []kzg4844.Blob {emptyBlob }
614+ emptyBlobCommit , _ = kzg4844 .BlobToCommitment (& emptyBlob )
615+ emptyBlobProof , _ = kzg4844 .ComputeBlobProof (& emptyBlob , emptyBlobCommit )
616+ emptyBlobHash = kzg4844 .CalcBlobHashV1 (sha256 .New (), & emptyBlobCommit )
617+ )
618+ backend := newTestBackendWithGenerator (0 , true , true , nil )
619+ defer backend .close ()
620+
621+ peer , _ := newTestPeer ("peer" , ETH68 , backend )
622+ defer peer .close ()
623+
624+ signer := types .NewCancunSigner (params .TestChainConfig .ChainID )
625+ var (
626+ tx * types.Transaction
627+ err error
628+ )
629+
630+ if blobTx {
631+ tx , err = types .SignNewTx (testKey , signer , & types.BlobTx {
632+ ChainID : uint256 .MustFromBig (params .TestChainConfig .ChainID ),
633+ Nonce : 0 ,
634+ GasTipCap : uint256 .NewInt (20_000_000_000 ),
635+ GasFeeCap : uint256 .NewInt (21_000_000_000 ),
636+ Gas : 21000 ,
637+ To : testAddr ,
638+ BlobHashes : []common.Hash {emptyBlobHash },
639+ BlobFeeCap : uint256 .MustFromBig (common .Big1 ),
640+ Sidecar : & types.BlobTxSidecar {
641+ Blobs : emptyBlobs ,
642+ Commitments : []kzg4844.Commitment {emptyBlobCommit },
643+ Proofs : []kzg4844.Proof {emptyBlobProof },
644+ },
645+ })
646+ if err != nil {
647+ t .Fatal (err )
648+ }
649+ } else {
650+ tx , err = types .SignTx (
651+ types .NewTransaction (0 , testAddr , big .NewInt (10_000 ), params .TxGas , big .NewInt (1_000_000_000 ), nil ),
652+ signer ,
653+ testKey ,
654+ )
655+ if err != nil {
656+ t .Fatal (err )
657+ }
658+ }
659+ errs := backend .txpool .Add ([]* types.Transaction {tx }, true )
660+ for _ , err := range errs {
661+ if err != nil {
662+ t .Fatal (err )
663+ }
664+ }
665+
666+ // Send the hash request and verify the response
667+ p2p .Send (peer .app , GetPooledTransactionsMsg , GetPooledTransactionsPacket {
668+ RequestId : 123 ,
669+ GetPooledTransactionsRequest : []common.Hash {tx .Hash ()},
670+ })
671+ if err := p2p .ExpectMsg (peer .app , PooledTransactionsMsg , PooledTransactionsPacket {
672+ RequestId : 123 ,
673+ PooledTransactionsResponse : []* types.Transaction {tx },
674+ }); err != nil {
675+ t .Errorf ("pooled transaction mismatch: %v" , err )
676+ }
677+ }
0 commit comments