-
Notifications
You must be signed in to change notification settings - Fork 200
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Extra receipt for internal EVM call when finalizing blocks #584
Changes from 8 commits
b678496
741ea34
f52e5c2
ec2951e
206c638
94fc4f6
f773d04
0354ea7
b222c83
41f8160
ff30d36
5d76786
d0a9474
963d481
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -786,11 +786,11 @@ func SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts ty | |
signer := types.MakeSigner(config, block.Number()) | ||
|
||
transactions, logIndex := block.Transactions(), uint(0) | ||
if len(transactions) != len(receipts) { | ||
if len(transactions) != len(receipts) && len(transactions)+1 != len(receipts) { | ||
return errors.New("transaction and receipt count mismatch") | ||
} | ||
|
||
for j := 0; j < len(receipts); j++ { | ||
for j := 0; j < len(transactions); j++ { | ||
// The transaction hash can be retrieved from the transaction itself | ||
receipts[j].TxHash = transactions[j].Hash() | ||
|
||
|
@@ -816,6 +816,16 @@ func SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts ty | |
logIndex++ | ||
} | ||
} | ||
// Handle extra receipt | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit: wdyt of There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wdyt? |
||
if len(transactions)+1 == len(receipts) { | ||
j := len(transactions) | ||
for k := 0; k < len(receipts[j].Logs); k++ { | ||
receipts[j].Logs[k].BlockNumber = block.NumberU64() | ||
receipts[j].Logs[k].BlockHash = block.Hash() | ||
receipts[j].Logs[k].Index = logIndex | ||
logIndex++ | ||
} | ||
} | ||
return nil | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -84,8 +84,16 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg | |
allLogs = append(allLogs, receipt.Logs...) | ||
} | ||
// Finalize the block, applying any consensus engine specific extras (e.g. block rewards) | ||
statedb.Prepare(common.Hash{}, block.Hash(), len(block.Transactions())) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why is this needed? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When logs are added, the associated transaction will be read from the instance variables that are set by this method. |
||
p.engine.Finalize(p.bc, header, statedb, block.Transactions(), block.Uncles(), receipts, block.Randomness()) | ||
|
||
if len(statedb.GetLogs(common.Hash{})) > 0 { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not 100% clear on what's going on here. Would there be a single receipt for all blocks? If not, won't we have the null hash being mapped to many receipts? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, many receipts will be associated into null hash, but they can be separated because they are contained in different blocks. Comparison between using null and block hash
I'll next check that tx hash in receipt is not consensus data. |
||
receipt := types.NewReceipt(nil, false, 0) | ||
receipt.Logs = statedb.GetLogs(common.Hash{}) | ||
receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) | ||
receipts = append(receipts, receipt) | ||
} | ||
|
||
return receipts, allLogs, *usedGas, nil | ||
} | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please add a comment above this:
The receipts may include an additional "block finalization" receipt