mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 07:06:42 +00:00
Moved TxDependency Metadata to ExtraData in Block Header (#930)
* moved TxDependency Metadata to ExtraData in Block Header * updated unit tests * lints * small bug fix * small improvement * minor bug fix * addressed comments * bug fix, only using the BlockExtraData structure after the Parallel Universe HF * addressed comments * fixed an error * bug fix * encoding nil ValidatorBytes and TxDependency in prepare if the current block is not the last block of the sprint * bug fix
This commit is contained in:
parent
896e4bbcbe
commit
e7b00c40c6
9 changed files with 192 additions and 103 deletions
|
|
@ -54,9 +54,6 @@ var (
|
||||||
"0": 64,
|
"0": 64,
|
||||||
} // Default number of blocks after which to checkpoint and reset the pending votes
|
} // Default number of blocks after which to checkpoint and reset the pending votes
|
||||||
|
|
||||||
extraVanity = 32 // Fixed number of extra-data prefix bytes reserved for signer vanity
|
|
||||||
extraSeal = 65 // Fixed number of extra-data suffix bytes reserved for signer seal
|
|
||||||
|
|
||||||
uncleHash = types.CalcUncleHash(nil) // Always Keccak256(RLP([])) as uncles are meaningless outside of PoW.
|
uncleHash = types.CalcUncleHash(nil) // Always Keccak256(RLP([])) as uncles are meaningless outside of PoW.
|
||||||
|
|
||||||
validatorHeaderBytesLength = common.AddressLength + 20 // address + power
|
validatorHeaderBytesLength = common.AddressLength + 20 // address + power
|
||||||
|
|
@ -120,11 +117,11 @@ func ecrecover(header *types.Header, sigcache *lru.ARCCache, c *params.BorConfig
|
||||||
return address.(common.Address), nil
|
return address.(common.Address), nil
|
||||||
}
|
}
|
||||||
// Retrieve the signature from the header extra-data
|
// Retrieve the signature from the header extra-data
|
||||||
if len(header.Extra) < extraSeal {
|
if len(header.Extra) < types.ExtraSealLength {
|
||||||
return common.Address{}, errMissingSignature
|
return common.Address{}, errMissingSignature
|
||||||
}
|
}
|
||||||
|
|
||||||
signature := header.Extra[len(header.Extra)-extraSeal:]
|
signature := header.Extra[len(header.Extra)-types.ExtraSealLength:]
|
||||||
|
|
||||||
// Recover the public key and the Ethereum address
|
// Recover the public key and the Ethereum address
|
||||||
pubkey, err := crypto.Ecrecover(SealHash(header, c).Bytes(), signature)
|
pubkey, err := crypto.Ecrecover(SealHash(header, c).Bytes(), signature)
|
||||||
|
|
@ -355,7 +352,8 @@ func (c *Bor) verifyHeader(chain consensus.ChainHeaderReader, header *types.Head
|
||||||
isSprintEnd := IsSprintStart(number+1, c.config.CalculateSprint(number))
|
isSprintEnd := IsSprintStart(number+1, c.config.CalculateSprint(number))
|
||||||
|
|
||||||
// Ensure that the extra-data contains a signer list on checkpoint, but none otherwise
|
// Ensure that the extra-data contains a signer list on checkpoint, but none otherwise
|
||||||
signersBytes := len(header.Extra) - extraVanity - extraSeal
|
signersBytes := len(header.GetValidatorBytes(c.config))
|
||||||
|
|
||||||
if !isSprintEnd && signersBytes != 0 {
|
if !isSprintEnd && signersBytes != 0 {
|
||||||
return errExtraValidators
|
return errExtraValidators
|
||||||
}
|
}
|
||||||
|
|
@ -400,11 +398,11 @@ func (c *Bor) verifyHeader(chain consensus.ChainHeaderReader, header *types.Head
|
||||||
// validateHeaderExtraField validates that the extra-data contains both the vanity and signature.
|
// validateHeaderExtraField validates that the extra-data contains both the vanity and signature.
|
||||||
// header.Extra = header.Vanity + header.ProducerBytes (optional) + header.Seal
|
// header.Extra = header.Vanity + header.ProducerBytes (optional) + header.Seal
|
||||||
func validateHeaderExtraField(extraBytes []byte) error {
|
func validateHeaderExtraField(extraBytes []byte) error {
|
||||||
if len(extraBytes) < extraVanity {
|
if len(extraBytes) < types.ExtraVanityLength {
|
||||||
return errMissingVanity
|
return errMissingVanity
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(extraBytes) < extraVanity+extraSeal {
|
if len(extraBytes) < types.ExtraVanityLength+types.ExtraSealLength {
|
||||||
return errMissingSignature
|
return errMissingSignature
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -475,8 +473,7 @@ func (c *Bor) verifyCascadingFields(chain consensus.ChainHeaderReader, header *t
|
||||||
|
|
||||||
sort.Sort(valset.ValidatorsByAddress(newValidators))
|
sort.Sort(valset.ValidatorsByAddress(newValidators))
|
||||||
|
|
||||||
headerVals, err := valset.ParseValidators(header.Extra[extraVanity : len(header.Extra)-extraSeal])
|
headerVals, err := valset.ParseValidators(header.GetValidatorBytes(c.config))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -494,7 +491,7 @@ func (c *Bor) verifyCascadingFields(chain consensus.ChainHeaderReader, header *t
|
||||||
|
|
||||||
// verify the validator list in the last sprint block
|
// verify the validator list in the last sprint block
|
||||||
if IsSprintStart(number, c.config.CalculateSprint(number)) {
|
if IsSprintStart(number, c.config.CalculateSprint(number)) {
|
||||||
parentValidatorBytes := parent.Extra[extraVanity : len(parent.Extra)-extraSeal]
|
parentValidatorBytes := parent.GetValidatorBytes(c.config)
|
||||||
validatorsBytes := make([]byte, len(snap.ValidatorSet.Validators)*validatorHeaderBytesLength)
|
validatorsBytes := make([]byte, len(snap.ValidatorSet.Validators)*validatorHeaderBytesLength)
|
||||||
|
|
||||||
currentValidators := snap.ValidatorSet.Copy().Validators
|
currentValidators := snap.ValidatorSet.Copy().Validators
|
||||||
|
|
@ -731,11 +728,11 @@ func (c *Bor) Prepare(chain consensus.ChainHeaderReader, header *types.Header) e
|
||||||
header.Difficulty = new(big.Int).SetUint64(Difficulty(snap.ValidatorSet, currentSigner.signer))
|
header.Difficulty = new(big.Int).SetUint64(Difficulty(snap.ValidatorSet, currentSigner.signer))
|
||||||
|
|
||||||
// Ensure the extra data has all it's components
|
// Ensure the extra data has all it's components
|
||||||
if len(header.Extra) < extraVanity {
|
if len(header.Extra) < types.ExtraVanityLength {
|
||||||
header.Extra = append(header.Extra, bytes.Repeat([]byte{0x00}, extraVanity-len(header.Extra))...)
|
header.Extra = append(header.Extra, bytes.Repeat([]byte{0x00}, types.ExtraVanityLength-len(header.Extra))...)
|
||||||
}
|
}
|
||||||
|
|
||||||
header.Extra = header.Extra[:extraVanity]
|
header.Extra = header.Extra[:types.ExtraVanityLength]
|
||||||
|
|
||||||
// get validator set if number
|
// get validator set if number
|
||||||
if IsSprintStart(number+1, c.config.CalculateSprint(number)) {
|
if IsSprintStart(number+1, c.config.CalculateSprint(number)) {
|
||||||
|
|
@ -747,13 +744,47 @@ func (c *Bor) Prepare(chain consensus.ChainHeaderReader, header *types.Header) e
|
||||||
// sort validator by address
|
// sort validator by address
|
||||||
sort.Sort(valset.ValidatorsByAddress(newValidators))
|
sort.Sort(valset.ValidatorsByAddress(newValidators))
|
||||||
|
|
||||||
|
if c.config.IsParallelUniverse(header.Number) {
|
||||||
|
var tempValidatorBytes []byte
|
||||||
|
|
||||||
|
for _, validator := range newValidators {
|
||||||
|
tempValidatorBytes = append(tempValidatorBytes, validator.HeaderBytes()...)
|
||||||
|
}
|
||||||
|
|
||||||
|
blockExtraData := &types.BlockExtraData{
|
||||||
|
ValidatorBytes: tempValidatorBytes,
|
||||||
|
TxDependency: nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
blockExtraDataBytes, err := rlp.EncodeToBytes(blockExtraData)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("error while encoding block extra data: %v", err)
|
||||||
|
return fmt.Errorf("error while encoding block extra data: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
header.Extra = append(header.Extra, blockExtraDataBytes...)
|
||||||
|
} else {
|
||||||
for _, validator := range newValidators {
|
for _, validator := range newValidators {
|
||||||
header.Extra = append(header.Extra, validator.HeaderBytes()...)
|
header.Extra = append(header.Extra, validator.HeaderBytes()...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if c.config.IsParallelUniverse(header.Number) {
|
||||||
|
blockExtraData := &types.BlockExtraData{
|
||||||
|
ValidatorBytes: nil,
|
||||||
|
TxDependency: nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
blockExtraDataBytes, err := rlp.EncodeToBytes(blockExtraData)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("error while encoding block extra data: %v", err)
|
||||||
|
return fmt.Errorf("error while encoding block extra data: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
header.Extra = append(header.Extra, blockExtraDataBytes...)
|
||||||
|
}
|
||||||
|
|
||||||
// add extra seal space
|
// add extra seal space
|
||||||
header.Extra = append(header.Extra, make([]byte, extraSeal)...)
|
header.Extra = append(header.Extra, make([]byte, types.ExtraSealLength)...)
|
||||||
|
|
||||||
// Mix digest is reserved for now, set to empty
|
// Mix digest is reserved for now, set to empty
|
||||||
header.MixDigest = common.Hash{}
|
header.MixDigest = common.Hash{}
|
||||||
|
|
@ -1053,7 +1084,7 @@ func Sign(signFn SignerFn, signer common.Address, header *types.Header, c *param
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
copy(header.Extra[len(header.Extra)-extraSeal:], sighash)
|
copy(header.Extra[len(header.Extra)-types.ExtraSealLength:], sighash)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,7 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
validatorBytes := header.Extra[extraVanity : len(header.Extra)-extraSeal]
|
validatorBytes := header.GetValidatorBytes(s.config)
|
||||||
|
|
||||||
// get validators from headers and use that for new validator set
|
// get validators from headers and use that for new validator set
|
||||||
newVals, _ := valset.ParseValidators(validatorBytes)
|
newVals, _ := valset.ParseValidators(validatorBytes)
|
||||||
|
|
|
||||||
|
|
@ -284,9 +284,11 @@ func (p *ParallelStateProcessor) Process(block *types.Block, statedb *state.Stat
|
||||||
|
|
||||||
coinbase, _ := p.bc.Engine().Author(header)
|
coinbase, _ := p.bc.Engine().Author(header)
|
||||||
|
|
||||||
deps := GetDeps(block.Header().TxDependency)
|
blockTxDependency := block.GetTxDependency()
|
||||||
|
|
||||||
if block.Header().TxDependency != nil {
|
deps := GetDeps(blockTxDependency)
|
||||||
|
|
||||||
|
if blockTxDependency != nil {
|
||||||
metadata = true
|
metadata = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -306,7 +308,7 @@ func (p *ParallelStateProcessor) Process(block *types.Block, statedb *state.Stat
|
||||||
shouldDelayFeeCal = false
|
shouldDelayFeeCal = false
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(header.TxDependency) != len(block.Transactions()) {
|
if len(blockTxDependency) != len(block.Transactions()) {
|
||||||
task := &ExecutionTask{
|
task := &ExecutionTask{
|
||||||
msg: msg,
|
msg: msg,
|
||||||
config: p.config,
|
config: p.config,
|
||||||
|
|
|
||||||
|
|
@ -28,12 +28,17 @@ import (
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
|
"github.com/ethereum/go-ethereum/log"
|
||||||
|
"github.com/ethereum/go-ethereum/params"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
EmptyRootHash = common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")
|
EmptyRootHash = common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")
|
||||||
EmptyUncleHash = rlpHash([]*Header(nil))
|
EmptyUncleHash = rlpHash([]*Header(nil))
|
||||||
|
|
||||||
|
ExtraVanityLength = 32 // Fixed number of extra-data prefix bytes reserved for signer vanity
|
||||||
|
ExtraSealLength = 65 // Fixed number of extra-data suffix bytes reserved for signer seal
|
||||||
)
|
)
|
||||||
|
|
||||||
// A BlockNonce is a 64-bit hash which proves (combined with the
|
// A BlockNonce is a 64-bit hash which proves (combined with the
|
||||||
|
|
@ -87,11 +92,6 @@ type Header struct {
|
||||||
// BaseFee was added by EIP-1559 and is ignored in legacy headers.
|
// BaseFee was added by EIP-1559 and is ignored in legacy headers.
|
||||||
BaseFee *big.Int `json:"baseFeePerGas" rlp:"optional"`
|
BaseFee *big.Int `json:"baseFeePerGas" rlp:"optional"`
|
||||||
|
|
||||||
// length of TxDependency -> n (n = number of transactions in the block)
|
|
||||||
// length of TxDependency[i] -> k (k = a whole number)
|
|
||||||
// k elements in TxDependency[i] -> transaction indexes on which transaction i is dependent on
|
|
||||||
TxDependency [][]uint64 `json:"txDependency" rlp:"optional"`
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TODO (MariusVanDerWijden) Add this field once needed
|
TODO (MariusVanDerWijden) Add this field once needed
|
||||||
// Random was added during the merge and contains the BeaconState randomness
|
// Random was added during the merge and contains the BeaconState randomness
|
||||||
|
|
@ -99,6 +99,16 @@ type Header struct {
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Used for Encoding and Decoding of the Extra Data Field
|
||||||
|
type BlockExtraData struct {
|
||||||
|
ValidatorBytes []byte
|
||||||
|
|
||||||
|
// length of TxDependency -> n (n = number of transactions in the block)
|
||||||
|
// length of TxDependency[i] -> k (k = a whole number)
|
||||||
|
// k elements in TxDependency[i] -> transaction indexes on which transaction i is dependent on
|
||||||
|
TxDependency [][]uint64
|
||||||
|
}
|
||||||
|
|
||||||
// field type overrides for gencodec
|
// field type overrides for gencodec
|
||||||
type headerMarshaling struct {
|
type headerMarshaling struct {
|
||||||
Difficulty *hexutil.Big
|
Difficulty *hexutil.Big
|
||||||
|
|
@ -258,14 +268,6 @@ func CopyHeader(h *Header) *Header {
|
||||||
copy(cpy.Extra, h.Extra)
|
copy(cpy.Extra, h.Extra)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(h.TxDependency) > 0 {
|
|
||||||
cpy.TxDependency = make([][]uint64, len(h.TxDependency))
|
|
||||||
|
|
||||||
for i, dep := range h.TxDependency {
|
|
||||||
cpy.TxDependency[i] = make([]uint64, len(dep))
|
|
||||||
copy(cpy.TxDependency[i], dep)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return &cpy
|
return &cpy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -321,7 +323,40 @@ func (b *Block) TxHash() common.Hash { return b.header.TxHash }
|
||||||
func (b *Block) ReceiptHash() common.Hash { return b.header.ReceiptHash }
|
func (b *Block) ReceiptHash() common.Hash { return b.header.ReceiptHash }
|
||||||
func (b *Block) UncleHash() common.Hash { return b.header.UncleHash }
|
func (b *Block) UncleHash() common.Hash { return b.header.UncleHash }
|
||||||
func (b *Block) Extra() []byte { return common.CopyBytes(b.header.Extra) }
|
func (b *Block) Extra() []byte { return common.CopyBytes(b.header.Extra) }
|
||||||
func (b *Block) TxDependency() [][]uint64 { return b.header.TxDependency }
|
|
||||||
|
func (b *Block) GetTxDependency() [][]uint64 {
|
||||||
|
if len(b.header.Extra) < ExtraVanityLength+ExtraSealLength {
|
||||||
|
log.Error("length of extra less is than vanity and seal")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var blockExtraData BlockExtraData
|
||||||
|
if err := rlp.DecodeBytes(b.header.Extra[ExtraVanityLength:len(b.header.Extra)-ExtraSealLength], &blockExtraData); err != nil {
|
||||||
|
log.Debug("error while decoding block extra data", "err", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return blockExtraData.TxDependency
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Header) GetValidatorBytes(config *params.BorConfig) []byte {
|
||||||
|
if !config.IsParallelUniverse(h.Number) {
|
||||||
|
return h.Extra[ExtraVanityLength : len(h.Extra)-ExtraSealLength]
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(h.Extra) < ExtraVanityLength+ExtraSealLength {
|
||||||
|
log.Error("length of extra less is than vanity and seal")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var blockExtraData BlockExtraData
|
||||||
|
if err := rlp.DecodeBytes(h.Extra[ExtraVanityLength:len(h.Extra)-ExtraSealLength], &blockExtraData); err != nil {
|
||||||
|
log.Debug("error while decoding block extra data", "err", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return blockExtraData.ValidatorBytes
|
||||||
|
}
|
||||||
|
|
||||||
func (b *Block) BaseFee() *big.Int {
|
func (b *Block) BaseFee() *big.Int {
|
||||||
if b.header.BaseFee == nil {
|
if b.header.BaseFee == nil {
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/common/math"
|
"github.com/ethereum/go-ethereum/common/math"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
"golang.org/x/crypto/sha3"
|
"golang.org/x/crypto/sha3"
|
||||||
|
|
@ -68,10 +69,27 @@ func TestBlockEncoding(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTxDependencyBlockEncoding(t *testing.T) {
|
// This is a replica of `(h *Header) GetValidatorBytes` function
|
||||||
|
// This was needed because currently, `IsParallelUniverse` will always return false.
|
||||||
|
func GetValidatorBytesTest(h *Header) []byte {
|
||||||
|
if len(h.Extra) < ExtraVanityLength+ExtraSealLength {
|
||||||
|
log.Error("length of extra less is than vanity and seal")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var blockExtraData BlockExtraData
|
||||||
|
if err := rlp.DecodeBytes(h.Extra[ExtraVanityLength:len(h.Extra)-ExtraSealLength], &blockExtraData); err != nil {
|
||||||
|
log.Debug("error while decoding block extra data", "err", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return blockExtraData.ValidatorBytes
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTxDependencyBlockDecoding(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
blockEnc := common.FromHex("f90268f90201a083cafc574e1f51ba9dc0568fc617a08ea2429fb384059c972f13b19fa1c8dd55a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017a05fe50b260da6308036625b850b5d6ced6d0a9f814c0688bc91ffb7b7a3a54b67a0bc37d79753ad738a6dac4921e57392f145d8887476de3f783dfa7edae9283e52b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd8825208845506eb0780a0bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff49888a13a5a8c8f2bb1c480c6c20201c20180f861f85f800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba09bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094fa08a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b1c0")
|
blockEnc := common.FromHex("f90270f9026ba00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000948888f1f195afa192cfee860698584c030f4c9db1a0ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8825208845506eb07b8710000000000000000000000000000000000000000000000000000000000000000cf8776616c20736574c6c20201c201800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff498880000000000000000c0c0")
|
||||||
|
|
||||||
var block Block
|
var block Block
|
||||||
|
|
||||||
|
|
@ -91,17 +109,14 @@ func TestTxDependencyBlockEncoding(t *testing.T) {
|
||||||
check("Coinbase", block.Coinbase(), common.HexToAddress("8888f1f195afa192cfee860698584c030f4c9db1"))
|
check("Coinbase", block.Coinbase(), common.HexToAddress("8888f1f195afa192cfee860698584c030f4c9db1"))
|
||||||
check("MixDigest", block.MixDigest(), common.HexToHash("bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff498"))
|
check("MixDigest", block.MixDigest(), common.HexToHash("bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff498"))
|
||||||
check("Root", block.Root(), common.HexToHash("ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017"))
|
check("Root", block.Root(), common.HexToHash("ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017"))
|
||||||
check("Hash", block.Hash(), common.HexToHash("0xc6d8dc8995c0a4374bb9f87bd0dd8c0761e6e026a71edbfed5e961c9e55dbd6a"))
|
|
||||||
check("Nonce", block.Nonce(), uint64(0xa13a5a8c8f2bb1c4))
|
|
||||||
check("Time", block.Time(), uint64(1426516743))
|
check("Time", block.Time(), uint64(1426516743))
|
||||||
check("Size", block.Size(), common.StorageSize(len(blockEnc)))
|
|
||||||
check("TxDependency", block.TxDependency(), [][]uint64{{2, 1}, {1, 0}})
|
|
||||||
|
|
||||||
tx1 := NewTransaction(0, common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"), big.NewInt(10), 50000, big.NewInt(10), nil)
|
validatorBytes := GetValidatorBytesTest(block.header)
|
||||||
tx1, _ = tx1.WithSignature(HomesteadSigner{}, common.Hex2Bytes("9bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094f8a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b100"))
|
txDependency := block.GetTxDependency()
|
||||||
|
|
||||||
|
check("validatorBytes", validatorBytes, []byte("val set"))
|
||||||
|
check("txDependency", txDependency, [][]uint64{{2, 1}, {1, 0}})
|
||||||
|
|
||||||
check("len(Transactions)", len(block.Transactions()), 1)
|
|
||||||
check("Transactions[0].Hash", block.Transactions()[0].Hash(), tx1.Hash())
|
|
||||||
ourBlockEnc, err := rlp.EncodeToBytes(&block)
|
ourBlockEnc, err := rlp.EncodeToBytes(&block)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,6 @@ func (h Header) MarshalJSON() ([]byte, error) {
|
||||||
MixDigest common.Hash `json:"mixHash"`
|
MixDigest common.Hash `json:"mixHash"`
|
||||||
Nonce BlockNonce `json:"nonce"`
|
Nonce BlockNonce `json:"nonce"`
|
||||||
BaseFee *hexutil.Big `json:"baseFeePerGas" rlp:"optional"`
|
BaseFee *hexutil.Big `json:"baseFeePerGas" rlp:"optional"`
|
||||||
TxDependency [][]uint64 `json:"txDependency" rlp:"optional"`
|
|
||||||
Hash common.Hash `json:"hash"`
|
Hash common.Hash `json:"hash"`
|
||||||
}
|
}
|
||||||
var enc Header
|
var enc Header
|
||||||
|
|
@ -52,7 +51,6 @@ func (h Header) MarshalJSON() ([]byte, error) {
|
||||||
enc.MixDigest = h.MixDigest
|
enc.MixDigest = h.MixDigest
|
||||||
enc.Nonce = h.Nonce
|
enc.Nonce = h.Nonce
|
||||||
enc.BaseFee = (*hexutil.Big)(h.BaseFee)
|
enc.BaseFee = (*hexutil.Big)(h.BaseFee)
|
||||||
enc.TxDependency = h.TxDependency
|
|
||||||
enc.Hash = h.Hash()
|
enc.Hash = h.Hash()
|
||||||
return json.Marshal(&enc)
|
return json.Marshal(&enc)
|
||||||
}
|
}
|
||||||
|
|
@ -76,7 +74,6 @@ func (h *Header) UnmarshalJSON(input []byte) error {
|
||||||
MixDigest *common.Hash `json:"mixHash"`
|
MixDigest *common.Hash `json:"mixHash"`
|
||||||
Nonce *BlockNonce `json:"nonce"`
|
Nonce *BlockNonce `json:"nonce"`
|
||||||
BaseFee *hexutil.Big `json:"baseFeePerGas" rlp:"optional"`
|
BaseFee *hexutil.Big `json:"baseFeePerGas" rlp:"optional"`
|
||||||
TxDependency [][]uint64 `json:"txDependency" rlp:"optional"`
|
|
||||||
}
|
}
|
||||||
var dec Header
|
var dec Header
|
||||||
if err := json.Unmarshal(input, &dec); err != nil {
|
if err := json.Unmarshal(input, &dec); err != nil {
|
||||||
|
|
@ -143,8 +140,5 @@ func (h *Header) UnmarshalJSON(input []byte) error {
|
||||||
if dec.BaseFee != nil {
|
if dec.BaseFee != nil {
|
||||||
h.BaseFee = (*big.Int)(dec.BaseFee)
|
h.BaseFee = (*big.Int)(dec.BaseFee)
|
||||||
}
|
}
|
||||||
if dec.TxDependency != nil {
|
|
||||||
h.TxDependency = dec.TxDependency
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,8 +41,7 @@ func (obj *Header) EncodeRLP(_w io.Writer) error {
|
||||||
w.WriteBytes(obj.MixDigest[:])
|
w.WriteBytes(obj.MixDigest[:])
|
||||||
w.WriteBytes(obj.Nonce[:])
|
w.WriteBytes(obj.Nonce[:])
|
||||||
_tmp1 := obj.BaseFee != nil
|
_tmp1 := obj.BaseFee != nil
|
||||||
_tmp2 := len(obj.TxDependency) > 0
|
if _tmp1 {
|
||||||
if _tmp1 || _tmp2 {
|
|
||||||
if obj.BaseFee == nil {
|
if obj.BaseFee == nil {
|
||||||
w.Write(rlp.EmptyString)
|
w.Write(rlp.EmptyString)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -52,17 +51,6 @@ func (obj *Header) EncodeRLP(_w io.Writer) error {
|
||||||
w.WriteBigInt(obj.BaseFee)
|
w.WriteBigInt(obj.BaseFee)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if _tmp2 {
|
|
||||||
_tmp3 := w.List()
|
|
||||||
for _, _tmp4 := range obj.TxDependency {
|
|
||||||
_tmp5 := w.List()
|
|
||||||
for _, _tmp6 := range _tmp4 {
|
|
||||||
w.WriteUint64(_tmp6)
|
|
||||||
}
|
|
||||||
w.ListEnd(_tmp5)
|
|
||||||
}
|
|
||||||
w.ListEnd(_tmp3)
|
|
||||||
}
|
|
||||||
w.ListEnd(_tmp0)
|
w.ListEnd(_tmp0)
|
||||||
return w.Flush()
|
return w.Flush()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/metrics"
|
"github.com/ethereum/go-ethereum/metrics"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
"github.com/ethereum/go-ethereum/trie"
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -1176,6 +1177,11 @@ mainloop:
|
||||||
close(chDeps)
|
close(chDeps)
|
||||||
depsWg.Wait()
|
depsWg.Wait()
|
||||||
|
|
||||||
|
var blockExtraData types.BlockExtraData
|
||||||
|
|
||||||
|
tempVanity := env.header.Extra[:types.ExtraVanityLength]
|
||||||
|
tempSeal := env.header.Extra[len(env.header.Extra)-types.ExtraSealLength:]
|
||||||
|
|
||||||
if len(mvReadMapList) > 0 {
|
if len(mvReadMapList) > 0 {
|
||||||
tempDeps := make([][]uint64, len(mvReadMapList))
|
tempDeps := make([][]uint64, len(mvReadMapList))
|
||||||
|
|
||||||
|
|
@ -1200,14 +1206,32 @@ mainloop:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := rlp.DecodeBytes(env.header.Extra[types.ExtraVanityLength:len(env.header.Extra)-types.ExtraSealLength], &blockExtraData); err != nil {
|
||||||
|
log.Error("error while decoding block extra data", "err", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
if delayFlag {
|
if delayFlag {
|
||||||
env.header.TxDependency = tempDeps
|
blockExtraData.TxDependency = tempDeps
|
||||||
} else {
|
} else {
|
||||||
env.header.TxDependency = nil
|
blockExtraData.TxDependency = nil
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
env.header.TxDependency = nil
|
blockExtraData.TxDependency = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
blockExtraDataBytes, err := rlp.EncodeToBytes(blockExtraData)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("error while encoding block extra data: %v", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
env.header.Extra = []byte{}
|
||||||
|
|
||||||
|
env.header.Extra = append(tempVanity, blockExtraDataBytes...)
|
||||||
|
|
||||||
|
env.header.Extra = append(env.header.Extra, tempSeal...)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !w.isRunning() && len(coalescedLogs) > 0 {
|
if !w.isRunning() && len(coalescedLogs) > 0 {
|
||||||
|
|
|
||||||
|
|
@ -949,11 +949,11 @@ func BenchmarkBorMiningBlockSTMMetadata(b *testing.B) {
|
||||||
|
|
||||||
// check for dependencies for block number > 4
|
// check for dependencies for block number > 4
|
||||||
if block.NumberU64() <= 4 {
|
if block.NumberU64() <= 4 {
|
||||||
if block.TxDependency() != nil {
|
if block.GetTxDependency() != nil {
|
||||||
b.Fatalf("dependency not nil")
|
b.Fatalf("dependency not nil")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
deps := block.TxDependency()
|
deps := block.GetTxDependency()
|
||||||
if len(deps[0]) != 0 {
|
if len(deps[0]) != 0 {
|
||||||
b.Fatalf("wrong dependency")
|
b.Fatalf("wrong dependency")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue