core/types: polish

This commit is contained in:
Gary Rong 2025-02-05 13:39:57 +08:00
parent 1715f60b38
commit 80db6321cc
8 changed files with 49 additions and 42 deletions

View file

@ -304,7 +304,8 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
// Set the receipt logs and create the bloom filter. // Set the receipt logs and create the bloom filter.
receipt.Logs = statedb.GetLogs(tx.Hash(), vmContext.BlockNumber.Uint64(), blockHash) receipt.Logs = statedb.GetLogs(tx.Hash(), vmContext.BlockNumber.Uint64(), blockHash)
receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) receipt.Bloom = types.CreateBloom(receipt)
// These three are non-consensus fields: // These three are non-consensus fields:
//receipt.BlockHash //receipt.BlockHash
//receipt.BlockNumber //receipt.BlockNumber
@ -376,7 +377,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
StateRoot: root, StateRoot: root,
TxRoot: types.DeriveSha(includedTxs, trie.NewStackTrie(nil)), TxRoot: types.DeriveSha(includedTxs, trie.NewStackTrie(nil)),
ReceiptRoot: types.DeriveSha(receipts, trie.NewStackTrie(nil)), ReceiptRoot: types.DeriveSha(receipts, trie.NewStackTrie(nil)),
Bloom: types.CreateBloom(receipts), Bloom: types.MergeBloom(receipts),
LogsHash: rlpHash(statedb.Logs()), LogsHash: rlpHash(statedb.Logs()),
Receipts: receipts, Receipts: receipts,
Rejected: rejectedTxs, Rejected: rejectedTxs,

View file

@ -338,7 +338,7 @@ func TestBlockReceiptStorage(t *testing.T) {
ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}), ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}),
GasUsed: 111111, GasUsed: 111111,
} }
receipt1.Bloom = types.CreateBloom(types.Receipts{receipt1}) receipt1.Bloom = types.CreateBloom(receipt1)
receipt2 := &types.Receipt{ receipt2 := &types.Receipt{
PostState: common.Hash{2}.Bytes(), PostState: common.Hash{2}.Bytes(),
@ -351,7 +351,7 @@ func TestBlockReceiptStorage(t *testing.T) {
ContractAddress: common.BytesToAddress([]byte{0x02, 0x22, 0x22}), ContractAddress: common.BytesToAddress([]byte{0x02, 0x22, 0x22}),
GasUsed: 222222, GasUsed: 222222,
} }
receipt2.Bloom = types.CreateBloom(types.Receipts{receipt2}) receipt2.Bloom = types.CreateBloom(receipt2)
receipts := []*types.Receipt{receipt1, receipt2} receipts := []*types.Receipt{receipt1, receipt2}
// Check that no receipt entries are in a pristine database // Check that no receipt entries are in a pristine database
@ -679,7 +679,7 @@ func TestReadLogs(t *testing.T) {
ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}), ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}),
GasUsed: 111111, GasUsed: 111111,
} }
receipt1.Bloom = types.CreateBloom(types.Receipts{receipt1}) receipt1.Bloom = types.CreateBloom(receipt1)
receipt2 := &types.Receipt{ receipt2 := &types.Receipt{
PostState: common.Hash{2}.Bytes(), PostState: common.Hash{2}.Bytes(),
@ -692,7 +692,7 @@ func TestReadLogs(t *testing.T) {
ContractAddress: common.BytesToAddress([]byte{0x02, 0x22, 0x22}), ContractAddress: common.BytesToAddress([]byte{0x02, 0x22, 0x22}),
GasUsed: 222222, GasUsed: 222222,
} }
receipt2.Bloom = types.CreateBloom(types.Receipts{receipt2}) receipt2.Bloom = types.CreateBloom(receipt2)
receipts := []*types.Receipt{receipt1, receipt2} receipts := []*types.Receipt{receipt1, receipt2}
hash := common.BytesToHash([]byte{0x03, 0x14}) hash := common.BytesToHash([]byte{0x03, 0x14})

View file

@ -189,7 +189,7 @@ func MakeReceipt(evm *vm.EVM, result *ExecutionResult, statedb *state.StateDB, b
// Set the receipt logs and create the bloom filter. // Set the receipt logs and create the bloom filter.
receipt.Logs = statedb.GetLogs(tx.Hash(), blockNumber.Uint64(), blockHash) receipt.Logs = statedb.GetLogs(tx.Hash(), blockNumber.Uint64(), blockHash)
receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) receipt.Bloom = types.CreateBloom(receipt)
receipt.BlockHash = blockHash receipt.BlockHash = blockHash
receipt.BlockNumber = blockNumber receipt.BlockNumber = blockNumber
receipt.TransactionIndex = uint(statedb.TxIndex()) receipt.TransactionIndex = uint(statedb.TxIndex())

View file

@ -100,10 +100,28 @@ func (b *Bloom) UnmarshalText(input []byte) error {
return hexutil.UnmarshalFixedText("Bloom", input, b[:]) return hexutil.UnmarshalFixedText("Bloom", input, b[:])
} }
// CreateBloom creates a bloom filter out of the give Receipts (+Logs) // CreateBloom creates a bloom filter out of the give Receipt (+Logs)
func CreateBloom(receipts Receipts) Bloom { func CreateBloom(receipt *Receipt) Bloom {
buf := make([]byte, 6) var (
var bin Bloom bin Bloom
buf = make([]byte, 6)
)
for _, log := range receipt.Logs {
bin.add(log.Address.Bytes(), buf)
for _, b := range log.Topics {
bin.add(b[:], buf)
}
}
return bin
}
// CreateBlooms creates a bloom filter out of the give Receipts (+Logs).
// This function is just for benchmarking.
func CreateBlooms(receipts []*Receipt) Bloom {
var (
bin Bloom
buf = make([]byte, 6)
)
for _, receipt := range receipts { for _, receipt := range receipts {
for _, log := range receipt.Logs { for _, log := range receipt.Logs {
bin.add(log.Address.Bytes(), buf) bin.add(log.Address.Bytes(), buf)
@ -115,9 +133,9 @@ func CreateBloom(receipts Receipts) Bloom {
return bin return bin
} }
// MergeBloom merges the already calculated bloom in Receipts // MergeBloom merges the precomputed bloom filters in the Receipts without
// without recalculating. So it assumes receipt.Bloom is populated // recalculating them. It assumes that each receipts Bloom field is already
// with the correct bloom already. // correctly populated.
func MergeBloom(receipts Receipts) Bloom { func MergeBloom(receipts Receipts) Bloom {
var bin Bloom var bin Bloom
for _, receipt := range receipts { for _, receipt := range receipts {
@ -128,23 +146,9 @@ func MergeBloom(receipts Receipts) Bloom {
} }
} }
} }
return bin return bin
} }
// LogsBloom returns the bloom bytes for the given logs
func LogsBloom(logs []*Log) []byte {
buf := make([]byte, 6)
var bin Bloom
for _, log := range logs {
bin.add(log.Address.Bytes(), buf)
for _, b := range log.Topics {
bin.add(b[:], buf)
}
}
return bin[:]
}
// Bloom9 returns the bloom filter for the given data // Bloom9 returns the bloom filter for the given data
func Bloom9(data []byte) []byte { func Bloom9(data []byte) []byte {
var b Bloom var b Bloom

View file

@ -130,7 +130,7 @@ func BenchmarkCreateBloom(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
var bl Bloom var bl Bloom
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
bl = CreateBloom(rSmall) bl = CreateBlooms(rSmall)
} }
b.StopTimer() b.StopTimer()
var exp = common.HexToHash("c384c56ece49458a427c67b90fefe979ebf7104795be65dc398b280f24104949") var exp = common.HexToHash("c384c56ece49458a427c67b90fefe979ebf7104795be65dc398b280f24104949")
@ -143,7 +143,7 @@ func BenchmarkCreateBloom(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
var bl Bloom var bl Bloom
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
bl = CreateBloom(rLarge) bl = CreateBlooms(rLarge)
} }
b.StopTimer() b.StopTimer()
var exp = common.HexToHash("c384c56ece49458a427c67b90fefe979ebf7104795be65dc398b280f24104949") var exp = common.HexToHash("c384c56ece49458a427c67b90fefe979ebf7104795be65dc398b280f24104949")
@ -154,15 +154,16 @@ func BenchmarkCreateBloom(b *testing.B) {
}) })
b.Run("small-mergebloom", func(b *testing.B) { b.Run("small-mergebloom", func(b *testing.B) {
for _, receipt := range rSmall { for _, receipt := range rSmall {
receipt.Bloom = CreateBloom(Receipts{receipt}) receipt.Bloom = CreateBloom(receipt)
} }
b.ReportAllocs() b.ReportAllocs()
var bl Bloom var bl Bloom
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
bl = MergeBloom(rSmall) bl = MergeBloom(rSmall)
} }
b.StopTimer() b.StopTimer()
var exp = common.HexToHash("c384c56ece49458a427c67b90fefe979ebf7104795be65dc398b280f24104949") var exp = common.HexToHash("c384c56ece49458a427c67b90fefe979ebf7104795be65dc398b280f24104949")
got := crypto.Keccak256Hash(bl.Bytes()) got := crypto.Keccak256Hash(bl.Bytes())
if got != exp { if got != exp {
@ -171,15 +172,16 @@ func BenchmarkCreateBloom(b *testing.B) {
}) })
b.Run("large-mergebloom", func(b *testing.B) { b.Run("large-mergebloom", func(b *testing.B) {
for _, receipt := range rLarge { for _, receipt := range rLarge {
receipt.Bloom = CreateBloom(Receipts{receipt}) receipt.Bloom = CreateBloom(receipt)
} }
b.ReportAllocs() b.ReportAllocs()
var bl Bloom var bl Bloom
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
bl = MergeBloom(rLarge) bl = MergeBloom(rLarge)
} }
b.StopTimer() b.StopTimer()
var exp = common.HexToHash("c384c56ece49458a427c67b90fefe979ebf7104795be65dc398b280f24104949") var exp = common.HexToHash("c384c56ece49458a427c67b90fefe979ebf7104795be65dc398b280f24104949")
got := crypto.Keccak256Hash(bl.Bytes()) got := crypto.Keccak256Hash(bl.Bytes())
if got != exp { if got != exp {

View file

@ -291,7 +291,7 @@ func (r *ReceiptForStorage) DecodeRLP(s *rlp.Stream) error {
} }
r.CumulativeGasUsed = stored.CumulativeGasUsed r.CumulativeGasUsed = stored.CumulativeGasUsed
r.Logs = stored.Logs r.Logs = stored.Logs
r.Bloom = CreateBloom(Receipts{(*Receipt)(r)}) r.Bloom = CreateBloom((*Receipt)(r))
return nil return nil
} }

View file

@ -394,7 +394,7 @@ func TestTypedReceiptEncodingDecoding(t *testing.T) {
func TestReceiptMarshalBinary(t *testing.T) { func TestReceiptMarshalBinary(t *testing.T) {
// Legacy Receipt // Legacy Receipt
legacyReceipt.Bloom = CreateBloom(Receipts{legacyReceipt}) legacyReceipt.Bloom = CreateBloom(legacyReceipt)
have, err := legacyReceipt.MarshalBinary() have, err := legacyReceipt.MarshalBinary()
if err != nil { if err != nil {
t.Fatalf("marshal binary error: %v", err) t.Fatalf("marshal binary error: %v", err)
@ -421,7 +421,7 @@ func TestReceiptMarshalBinary(t *testing.T) {
// 2930 Receipt // 2930 Receipt
buf.Reset() buf.Reset()
accessListReceipt.Bloom = CreateBloom(Receipts{accessListReceipt}) accessListReceipt.Bloom = CreateBloom(accessListReceipt)
have, err = accessListReceipt.MarshalBinary() have, err = accessListReceipt.MarshalBinary()
if err != nil { if err != nil {
t.Fatalf("marshal binary error: %v", err) t.Fatalf("marshal binary error: %v", err)
@ -439,7 +439,7 @@ func TestReceiptMarshalBinary(t *testing.T) {
// 1559 Receipt // 1559 Receipt
buf.Reset() buf.Reset()
eip1559Receipt.Bloom = CreateBloom(Receipts{eip1559Receipt}) eip1559Receipt.Bloom = CreateBloom(eip1559Receipt)
have, err = eip1559Receipt.MarshalBinary() have, err = eip1559Receipt.MarshalBinary()
if err != nil { if err != nil {
t.Fatalf("marshal binary error: %v", err) t.Fatalf("marshal binary error: %v", err)
@ -463,7 +463,7 @@ func TestReceiptUnmarshalBinary(t *testing.T) {
if err := gotLegacyReceipt.UnmarshalBinary(legacyBinary); err != nil { if err := gotLegacyReceipt.UnmarshalBinary(legacyBinary); err != nil {
t.Fatalf("unmarshal binary error: %v", err) t.Fatalf("unmarshal binary error: %v", err)
} }
legacyReceipt.Bloom = CreateBloom(Receipts{legacyReceipt}) legacyReceipt.Bloom = CreateBloom(legacyReceipt)
if !reflect.DeepEqual(gotLegacyReceipt, legacyReceipt) { if !reflect.DeepEqual(gotLegacyReceipt, legacyReceipt) {
t.Errorf("receipt unmarshalled from binary mismatch, got %v want %v", gotLegacyReceipt, legacyReceipt) t.Errorf("receipt unmarshalled from binary mismatch, got %v want %v", gotLegacyReceipt, legacyReceipt)
} }
@ -474,7 +474,7 @@ func TestReceiptUnmarshalBinary(t *testing.T) {
if err := gotAccessListReceipt.UnmarshalBinary(accessListBinary); err != nil { if err := gotAccessListReceipt.UnmarshalBinary(accessListBinary); err != nil {
t.Fatalf("unmarshal binary error: %v", err) t.Fatalf("unmarshal binary error: %v", err)
} }
accessListReceipt.Bloom = CreateBloom(Receipts{accessListReceipt}) accessListReceipt.Bloom = CreateBloom(accessListReceipt)
if !reflect.DeepEqual(gotAccessListReceipt, accessListReceipt) { if !reflect.DeepEqual(gotAccessListReceipt, accessListReceipt) {
t.Errorf("receipt unmarshalled from binary mismatch, got %v want %v", gotAccessListReceipt, accessListReceipt) t.Errorf("receipt unmarshalled from binary mismatch, got %v want %v", gotAccessListReceipt, accessListReceipt)
} }
@ -485,7 +485,7 @@ func TestReceiptUnmarshalBinary(t *testing.T) {
if err := got1559Receipt.UnmarshalBinary(eip1559RctBinary); err != nil { if err := got1559Receipt.UnmarshalBinary(eip1559RctBinary); err != nil {
t.Fatalf("unmarshal binary error: %v", err) t.Fatalf("unmarshal binary error: %v", err)
} }
eip1559Receipt.Bloom = CreateBloom(Receipts{eip1559Receipt}) eip1559Receipt.Bloom = CreateBloom(eip1559Receipt)
if !reflect.DeepEqual(got1559Receipt, eip1559Receipt) { if !reflect.DeepEqual(got1559Receipt, eip1559Receipt) {
t.Errorf("receipt unmarshalled from binary mismatch, got %v want %v", got1559Receipt, eip1559Receipt) t.Errorf("receipt unmarshalled from binary mismatch, got %v want %v", got1559Receipt, eip1559Receipt)
} }

View file

@ -42,7 +42,7 @@ func makeReceipt(addr common.Address) *types.Receipt {
receipt.Logs = []*types.Log{ receipt.Logs = []*types.Log{
{Address: addr}, {Address: addr},
} }
receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) receipt.Bloom = types.CreateBloom(receipt)
return receipt return receipt
} }