Skip to content

Commit 755df16

Browse files
authored
Merge pull request #1068 from qinglin89/dev-rlp
2 parents 64549a7 + 24da9ec commit 755df16

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+3120
-680
lines changed

core/types/access_list_tx.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
"github.com/ethereum/go-ethereum/common"
2323
)
2424

25-
//go:generate gencodec -type AccessTuple -out gen_access_tuple.go
25+
//go:generate go run github.com/fjl/gencodec@latest -type AccessTuple -out gen_access_tuple.go
2626

2727
// AccessList is an EIP-2930 access list.
2828
type AccessList []AccessTuple

core/types/block.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ func (n *BlockNonce) UnmarshalText(input []byte) error {
9393
return hexutil.UnmarshalFixedText("BlockNonce", input, n[:])
9494
}
9595

96-
//go:generate gencodec -type Header -field-override headerMarshaling -out gen_header_json.go
96+
//go:generate go run github.com/fjl/gencodec@latest -type Header -field-override headerMarshaling -out gen_header_json.go
97+
//go:generate go run ../../rlp/rlpgen -type Header -out gen_header_rlp.go
9798

9899
// Header represents a block header in the Ethereum blockchain.
99100
type Header struct {

core/types/block_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ func makeBenchBlock() *Block {
285285
func TestRlpDecodeParentHash(t *testing.T) {
286286
// A minimum one
287287
want := common.HexToHash("0x112233445566778899001122334455667788990011223344556677889900aabb")
288-
if rlpData, err := rlp.EncodeToBytes(Header{ParentHash: want}); err != nil {
288+
if rlpData, err := rlp.EncodeToBytes(&Header{ParentHash: want}); err != nil {
289289
t.Fatal(err)
290290
} else {
291291
if have := HeaderParentHashFromRLP(rlpData); have != want {
@@ -299,7 +299,7 @@ func TestRlpDecodeParentHash(t *testing.T) {
299299
// | BaseFee | dynamic| *big.Int | 64 bits |
300300
mainnetTd := new(big.Int)
301301
mainnetTd.SetString("5ad3c2c71bbff854908", 16)
302-
if rlpData, err := rlp.EncodeToBytes(Header{
302+
if rlpData, err := rlp.EncodeToBytes(&Header{
303303
ParentHash: want,
304304
Difficulty: mainnetTd,
305305
Number: new(big.Int).SetUint64(math.MaxUint64),
@@ -316,7 +316,7 @@ func TestRlpDecodeParentHash(t *testing.T) {
316316
{
317317
// The rlp-encoding of the heder belowCauses _total_ length of 65540,
318318
// which is the first to blow the fast-path.
319-
h := Header{
319+
h := &Header{
320320
ParentHash: want,
321321
Extra: make([]byte, 65041),
322322
}

core/types/gen_account_rlp.go

+27
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/types/gen_header_rlp.go

+56
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/types/gen_log_rlp.go

+23
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/types/log.go

+8-11
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
"github.com/ethereum/go-ethereum/rlp"
2525
)
2626

27-
//go:generate gencodec -type Log -field-override logMarshaling -out gen_log_json.go
27+
//go:generate go run github.com/fjl/gencodec@latest -type Log -field-override logMarshaling -out gen_log_json.go
2828

2929
// Log represents a contract log event. These events are generated by the LOG opcode and
3030
// stored/indexed by the node.
@@ -62,15 +62,14 @@ type logMarshaling struct {
6262
Index hexutil.Uint
6363
}
6464

65+
//go:generate go run ../../rlp/rlpgen -type rlpLog -out gen_log_rlp.go
66+
6567
type rlpLog struct {
6668
Address common.Address
6769
Topics []common.Hash
6870
Data []byte
6971
}
7072

71-
// rlpStorageLog is the storage encoding of a log.
72-
type rlpStorageLog rlpLog
73-
7473
// legacyRlpStorageLog is the previous storage encoding of a log including some redundant fields.
7574
type legacyRlpStorageLog struct {
7675
Address common.Address
@@ -85,7 +84,8 @@ type legacyRlpStorageLog struct {
8584

8685
// EncodeRLP implements rlp.Encoder.
8786
func (l *Log) EncodeRLP(w io.Writer) error {
88-
return rlp.Encode(w, rlpLog{Address: l.Address, Topics: l.Topics, Data: l.Data})
87+
rl := rlpLog{Address: l.Address, Topics: l.Topics, Data: l.Data}
88+
return rlp.Encode(w, &rl)
8989
}
9090

9191
// DecodeRLP implements rlp.Decoder.
@@ -104,11 +104,8 @@ type LogForStorage Log
104104

105105
// EncodeRLP implements rlp.Encoder.
106106
func (l *LogForStorage) EncodeRLP(w io.Writer) error {
107-
return rlp.Encode(w, rlpStorageLog{
108-
Address: l.Address,
109-
Topics: l.Topics,
110-
Data: l.Data,
111-
})
107+
rl := rlpLog{Address: l.Address, Topics: l.Topics, Data: l.Data}
108+
return rlp.Encode(w, &rl)
112109
}
113110

114111
// DecodeRLP implements rlp.Decoder.
@@ -119,7 +116,7 @@ func (l *LogForStorage) DecodeRLP(s *rlp.Stream) error {
119116
if err != nil {
120117
return err
121118
}
122-
var dec rlpStorageLog
119+
var dec rlpLog
123120
err = rlp.DecodeBytes(blob, &dec)
124121
if err == nil {
125122
*l = LogForStorage{

core/types/receipt.go

+14-10
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import (
3131
"github.com/ethereum/go-ethereum/rlp"
3232
)
3333

34-
//go:generate gencodec -type Receipt -field-override receiptMarshaling -out gen_receipt_json.go
34+
//go:generate go run github.com/fjl/gencodec@latest -type Receipt -field-override receiptMarshaling -out gen_receipt_json.go
3535

3636
var (
3737
receiptStatusFailedRLP = []byte{}
@@ -293,16 +293,20 @@ type ReceiptForStorage Receipt
293293

294294
// EncodeRLP implements rlp.Encoder, and flattens all content fields of a receipt
295295
// into an RLP stream.
296-
func (r *ReceiptForStorage) EncodeRLP(w io.Writer) error {
297-
enc := &storedReceiptRLP{
298-
PostStateOrStatus: (*Receipt)(r).statusEncoding(),
299-
CumulativeGasUsed: r.CumulativeGasUsed,
300-
Logs: make([]*LogForStorage, len(r.Logs)),
301-
}
302-
for i, log := range r.Logs {
303-
enc.Logs[i] = (*LogForStorage)(log)
296+
func (r *ReceiptForStorage) EncodeRLP(_w io.Writer) error {
297+
w := rlp.NewEncoderBuffer(_w)
298+
outerList := w.List()
299+
w.WriteBytes((*Receipt)(r).statusEncoding())
300+
w.WriteUint64(r.CumulativeGasUsed)
301+
logList := w.List()
302+
for _, log := range r.Logs {
303+
if err := rlp.Encode(w, log); err != nil {
304+
return err
305+
}
304306
}
305-
return rlp.Encode(w, enc)
307+
w.ListEnd(logList)
308+
w.ListEnd(outerList)
309+
return w.Flush()
306310
}
307311

308312
// DecodeRLP implements rlp.Decoder, and loads both consensus and implementation

core/types/state_account.go

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import (
2222
"github.com/ethereum/go-ethereum/common"
2323
)
2424

25+
//go:generate go run ../../rlp/rlpgen -type StateAccount -out gen_account_rlp.go
26+
2527
// StateAccount is the Ethereum consensus representation of accounts.
2628
// These objects are stored in the main account trie.
2729
type StateAccount struct {

eth/handler_eth_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,7 @@ func testCheckpointChallenge(t *testing.T, syncmode downloader.SyncMode, checkpo
693693
t.Fatalf("failed to answer challenge: %v", err)
694694
}
695695
} else {
696-
responseRlp, _ := rlp.EncodeToBytes(types.Header{Number: response.Number})
696+
responseRlp, _ := rlp.EncodeToBytes(&types.Header{Number: response.Number})
697697
if err := remote.ReplyBlockHeadersRLP(request.RequestId, []rlp.RawValue{responseRlp}); err != nil {
698698
t.Fatalf("failed to answer challenge: %v", err)
699699
}

eth/protocols/eth/handler_test.go

+10-12
Original file line numberDiff line numberDiff line change
@@ -264,11 +264,11 @@ func testGetBlockHeaders(t *testing.T, protocol uint) {
264264
headers = append(headers, backend.chain.GetBlockByHash(hash).Header())
265265
}
266266
// Send the hash request and verify the response
267-
p2p.Send(peer.app, GetBlockHeadersMsg, GetBlockHeadersPacket66{
267+
p2p.Send(peer.app, GetBlockHeadersMsg, &GetBlockHeadersPacket66{
268268
RequestId: 123,
269269
GetBlockHeadersPacket: tt.query,
270270
})
271-
if err := p2p.ExpectMsg(peer.app, BlockHeadersMsg, BlockHeadersPacket66{
271+
if err := p2p.ExpectMsg(peer.app, BlockHeadersMsg, &BlockHeadersPacket66{
272272
RequestId: 123,
273273
BlockHeadersPacket: headers,
274274
}); err != nil {
@@ -279,14 +279,12 @@ func testGetBlockHeaders(t *testing.T, protocol uint) {
279279
if origin := backend.chain.GetBlockByNumber(tt.query.Origin.Number); origin != nil {
280280
tt.query.Origin.Hash, tt.query.Origin.Number = origin.Hash(), 0
281281

282-
p2p.Send(peer.app, GetBlockHeadersMsg, GetBlockHeadersPacket66{
282+
p2p.Send(peer.app, GetBlockHeadersMsg, &GetBlockHeadersPacket66{
283283
RequestId: 456,
284284
GetBlockHeadersPacket: tt.query,
285285
})
286-
if err := p2p.ExpectMsg(peer.app, BlockHeadersMsg, BlockHeadersPacket66{
287-
RequestId: 456,
288-
BlockHeadersPacket: headers,
289-
}); err != nil {
286+
expected := &BlockHeadersPacket66{RequestId: 456, BlockHeadersPacket: headers}
287+
if err := p2p.ExpectMsg(peer.app, BlockHeadersMsg, expected); err != nil {
290288
t.Errorf("test %d by hash: headers mismatch: %v", i, err)
291289
}
292290
}
@@ -364,11 +362,11 @@ func testGetBlockBodies(t *testing.T, protocol uint) {
364362
}
365363
}
366364
// Send the hash request and verify the response
367-
p2p.Send(peer.app, GetBlockBodiesMsg, GetBlockBodiesPacket66{
365+
p2p.Send(peer.app, GetBlockBodiesMsg, &GetBlockBodiesPacket66{
368366
RequestId: 123,
369367
GetBlockBodiesPacket: hashes,
370368
})
371-
if err := p2p.ExpectMsg(peer.app, BlockBodiesMsg, BlockBodiesPacket66{
369+
if err := p2p.ExpectMsg(peer.app, BlockBodiesMsg, &BlockBodiesPacket66{
372370
RequestId: 123,
373371
BlockBodiesPacket: bodies,
374372
}); err != nil {
@@ -436,7 +434,7 @@ func testGetNodeData(t *testing.T, protocol uint) {
436434
it.Release()
437435

438436
// Request all hashes.
439-
p2p.Send(peer.app, GetNodeDataMsg, GetNodeDataPacket66{
437+
p2p.Send(peer.app, GetNodeDataMsg, &GetNodeDataPacket66{
440438
RequestId: 123,
441439
GetNodeDataPacket: hashes,
442440
})
@@ -546,11 +544,11 @@ func testGetBlockReceipts(t *testing.T, protocol uint) {
546544
receipts = append(receipts, backend.chain.GetReceiptsByHash(block.Hash()))
547545
}
548546
// Send the hash request and verify the response
549-
p2p.Send(peer.app, GetReceiptsMsg, GetReceiptsPacket66{
547+
p2p.Send(peer.app, GetReceiptsMsg, &GetReceiptsPacket66{
550548
RequestId: 123,
551549
GetReceiptsPacket: hashes,
552550
})
553-
if err := p2p.ExpectMsg(peer.app, ReceiptsMsg, ReceiptsPacket66{
551+
if err := p2p.ExpectMsg(peer.app, ReceiptsMsg, &ReceiptsPacket66{
554552
RequestId: 123,
555553
ReceiptsPacket: receipts,
556554
}); err != nil {

eth/protocols/eth/peer.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ func (p *Peer) ReplyPooledTransactionsRLP(id uint64, hashes []common.Hash, txs [
260260
p.knownTxs.Add(hashes...)
261261

262262
// Not packed into PooledTransactionsPacket to avoid RLP decoding
263-
return p2p.Send(p.rw, PooledTransactionsMsg, PooledTransactionsRLPPacket66{
263+
return p2p.Send(p.rw, PooledTransactionsMsg, &PooledTransactionsRLPPacket66{
264264
RequestId: id,
265265
PooledTransactionsRLPPacket: txs,
266266
})
@@ -317,7 +317,7 @@ func (p *Peer) AsyncSendNewBlock(block *types.Block, td *big.Int) {
317317

318318
// ReplyBlockHeaders is the eth/66 version of SendBlockHeaders.
319319
func (p *Peer) ReplyBlockHeadersRLP(id uint64, headers []rlp.RawValue) error {
320-
return p2p.Send(p.rw, BlockHeadersMsg, BlockHeadersRLPPacket66{
320+
return p2p.Send(p.rw, BlockHeadersMsg, &BlockHeadersRLPPacket66{
321321
RequestId: id,
322322
BlockHeadersRLPPacket: headers,
323323
})
@@ -326,23 +326,23 @@ func (p *Peer) ReplyBlockHeadersRLP(id uint64, headers []rlp.RawValue) error {
326326
// ReplyBlockBodiesRLP is the eth/66 version of SendBlockBodiesRLP.
327327
func (p *Peer) ReplyBlockBodiesRLP(id uint64, bodies []rlp.RawValue) error {
328328
// Not packed into BlockBodiesPacket to avoid RLP decoding
329-
return p2p.Send(p.rw, BlockBodiesMsg, BlockBodiesRLPPacket66{
329+
return p2p.Send(p.rw, BlockBodiesMsg, &BlockBodiesRLPPacket66{
330330
RequestId: id,
331331
BlockBodiesRLPPacket: bodies,
332332
})
333333
}
334334

335335
// ReplyNodeData is the eth/66 response to GetNodeData.
336336
func (p *Peer) ReplyNodeData(id uint64, data [][]byte) error {
337-
return p2p.Send(p.rw, NodeDataMsg, NodeDataPacket66{
337+
return p2p.Send(p.rw, NodeDataMsg, &NodeDataPacket66{
338338
RequestId: id,
339339
NodeDataPacket: data,
340340
})
341341
}
342342

343343
// ReplyReceiptsRLP is the eth/66 response to GetReceipts.
344344
func (p *Peer) ReplyReceiptsRLP(id uint64, receipts []rlp.RawValue) error {
345-
return p2p.Send(p.rw, ReceiptsMsg, ReceiptsRLPPacket66{
345+
return p2p.Send(p.rw, ReceiptsMsg, &ReceiptsRLPPacket66{
346346
RequestId: id,
347347
ReceiptsRLPPacket: receipts,
348348
})

0 commit comments

Comments
 (0)