-
Notifications
You must be signed in to change notification settings - Fork 20k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
core/types: fix immutability guarantees in Block
This change rearranges the accessor methods in block.go and fixes some minor issues with the copy-on-write logic of block data. As a refresher, the rules around block immutability are as follows: - We copy all data when the block is constructed. This makes the references held inside the block independent of whatever value was passed in. - We copy all header data on access. This is because any change to the header would mess up the cached hash and size values in the block. Calling code is expected to take advantage of this to avoid over-allocating! - When new body data is attached to the block, we create a shallow copy of the block. This ensures block modifications are race-free. - We do not copy body data on access because it does not affect the caches, and also because it would be too expensive. The change corrects these issues: - Block.WithWithdrawals did not create a shallow copy of the block. - Block.WithBody copied the header unnecessarily, and did not preserve withdrawals. However, the bugs did not affect any code in go-ethereum because blocks are *always* created using NewBlockWithHeader().WithBody().WithWithdrawals().
- Loading branch information
Showing
1 changed file
with
63 additions
and
41 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters