mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-14 16:03:45 +00:00
fix: websocket subscribe for state sync logs
This commit is contained in:
parent
34e9724c0d
commit
0f0032e652
2 changed files with 37 additions and 1 deletions
|
|
@ -1457,16 +1457,23 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types.
|
||||||
//
|
//
|
||||||
// block logs = receipt logs + state sync logs = `state.Logs()`
|
// block logs = receipt logs + state sync logs = `state.Logs()`
|
||||||
blockLogs := state.Logs()
|
blockLogs := state.Logs()
|
||||||
|
var stateSyncLogs []*types.Log
|
||||||
if len(blockLogs) > 0 {
|
if len(blockLogs) > 0 {
|
||||||
sort.SliceStable(blockLogs, func(i, j int) bool {
|
sort.SliceStable(blockLogs, func(i, j int) bool {
|
||||||
return blockLogs[i].Index < blockLogs[j].Index
|
return blockLogs[i].Index < blockLogs[j].Index
|
||||||
})
|
})
|
||||||
|
|
||||||
if len(blockLogs) > len(logs) {
|
if len(blockLogs) > len(logs) {
|
||||||
|
stateSyncLogs = blockLogs[len(logs):] // get state-sync logs from `state.Logs()`
|
||||||
|
|
||||||
|
// State sync logs don't have tx index, tx hash and other necessary fields
|
||||||
|
// DeriveFieldsForBorLogs will fill those fields for websocket subscriptions
|
||||||
|
types.DeriveFieldsForBorLogs(stateSyncLogs, block.Hash(), block.NumberU64(), uint(len(receipts)), uint(len(logs)))
|
||||||
|
|
||||||
// Write bor receipt
|
// Write bor receipt
|
||||||
rawdb.WriteBorReceipt(blockBatch, block.Hash(), block.NumberU64(), &types.ReceiptForStorage{
|
rawdb.WriteBorReceipt(blockBatch, block.Hash(), block.NumberU64(), &types.ReceiptForStorage{
|
||||||
Status: types.ReceiptStatusSuccessful, // make receipt status successful
|
Status: types.ReceiptStatusSuccessful, // make receipt status successful
|
||||||
Logs: blockLogs[len(logs):], // get state-sync logs from `state.Logs()`
|
Logs: stateSyncLogs,
|
||||||
})
|
})
|
||||||
|
|
||||||
// Write bor tx reverse lookup
|
// Write bor tx reverse lookup
|
||||||
|
|
@ -1577,6 +1584,12 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types.
|
||||||
if len(logs) > 0 {
|
if len(logs) > 0 {
|
||||||
bc.logsFeed.Send(logs)
|
bc.logsFeed.Send(logs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// send state sync logs into logs feed
|
||||||
|
if len(stateSyncLogs) > 0 {
|
||||||
|
bc.logsFeed.Send(stateSyncLogs)
|
||||||
|
}
|
||||||
|
|
||||||
// In theory we should fire a ChainHeadEvent when we inject
|
// In theory we should fire a ChainHeadEvent when we inject
|
||||||
// a canonical block, but sometimes we can insert a batch of
|
// a canonical block, but sometimes we can insert a batch of
|
||||||
// canonicial blocks. Avoid firing too much ChainHeadEvents,
|
// canonicial blocks. Avoid firing too much ChainHeadEvents,
|
||||||
|
|
@ -2091,6 +2104,12 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error {
|
||||||
}
|
}
|
||||||
receipts := rawdb.ReadReceipts(bc.db, hash, *number, bc.chainConfig)
|
receipts := rawdb.ReadReceipts(bc.db, hash, *number, bc.chainConfig)
|
||||||
|
|
||||||
|
// Append bor receipt
|
||||||
|
borReceipt := rawdb.ReadBorReceipt(bc.db, hash, *number)
|
||||||
|
if borReceipt != nil {
|
||||||
|
receipts = append(receipts, borReceipt)
|
||||||
|
}
|
||||||
|
|
||||||
var logs []*types.Log
|
var logs []*types.Log
|
||||||
for _, receipt := range receipts {
|
for _, receipt := range receipts {
|
||||||
for _, log := range receipt.Logs {
|
for _, log := range receipt.Logs {
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,23 @@ func DeriveFieldsForBorReceipt(receipt *Receipt, hash common.Hash, number uint64
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeriveFieldsForBorLogs fills the receipts with their computed fields based on consensus
|
||||||
|
// data and contextual infos like containing block and transactions.
|
||||||
|
func DeriveFieldsForBorLogs(logs []*Log, hash common.Hash, number uint64, txIndex uint, logIndex uint) {
|
||||||
|
// get derived tx hash
|
||||||
|
txHash := GetDerivedBorTxHash(BorReceiptKey(number, hash))
|
||||||
|
|
||||||
|
// the derived log fields can simply be set from the block and transaction
|
||||||
|
for j := 0; j < len(logs); j++ {
|
||||||
|
logs[j].BlockNumber = number
|
||||||
|
logs[j].BlockHash = hash
|
||||||
|
logs[j].TxHash = txHash
|
||||||
|
logs[j].TxIndex = txIndex
|
||||||
|
logs[j].Index = logIndex
|
||||||
|
logIndex++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MergeBorLogs merges receipt logs and block receipt logs
|
// MergeBorLogs merges receipt logs and block receipt logs
|
||||||
func MergeBorLogs(logs []*Log, borLogs []*Log) []*Log {
|
func MergeBorLogs(logs []*Log, borLogs []*Log) []*Log {
|
||||||
result := append(logs, borLogs...)
|
result := append(logs, borLogs...)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue