|
|
|
package block
|
|
|
|
|
|
|
|
import (
|
|
|
|
"math/big"
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
|
|
)
|
|
|
|
|
|
|
|
// HeaderFieldSetter is a header field setter.
|
|
|
|
//
|
|
|
|
// See NewHeaderWith for how it is used.
|
|
|
|
type HeaderFieldSetter struct {
|
|
|
|
h *Header
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewHeaderWith creates a new header and returns its field setter context.
|
|
|
|
//
|
|
|
|
// Call a chain of setters on the returned field setter, followed by a call of
|
|
|
|
// Header method. Example:
|
|
|
|
//
|
|
|
|
// header := NewHeaderWith().
|
|
|
|
// ParentHash(parent.Hash()).
|
|
|
|
// Epoch(parent.Epoch()).
|
|
|
|
// ShardID(parent.ShardID()).
|
|
|
|
// Number(new(big.Int).Add(parent.Number(), big.NewInt(1)).
|
|
|
|
// Header()
|
|
|
|
func NewHeaderWith() *HeaderFieldSetter {
|
|
|
|
return (*HeaderFieldSetter)(&HeaderFieldSetter{h: NewHeader()})
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParentHash sets the parent hash field.
|
|
|
|
func (s HeaderFieldSetter) ParentHash(newParentHash common.Hash) HeaderFieldSetter {
|
|
|
|
s.h.SetParentHash(newParentHash)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// Coinbase sets the coinbase address field.
|
|
|
|
func (s HeaderFieldSetter) Coinbase(newCoinbase common.Address) HeaderFieldSetter {
|
|
|
|
s.h.SetCoinbase(newCoinbase)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// Root sets the state trie root hash field.
|
|
|
|
func (s HeaderFieldSetter) Root(newRoot common.Hash) HeaderFieldSetter {
|
|
|
|
s.h.SetRoot(newRoot)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// TxHash sets the transaction trie root hash field.
|
|
|
|
func (s HeaderFieldSetter) TxHash(newTxHash common.Hash) HeaderFieldSetter {
|
|
|
|
s.h.SetTxHash(newTxHash)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReceiptHash sets the same-shard transaction receipt trie hash.
|
|
|
|
func (s HeaderFieldSetter) ReceiptHash(newReceiptHash common.Hash) HeaderFieldSetter {
|
|
|
|
s.h.SetReceiptHash(newReceiptHash)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// OutgoingReceiptHash sets the egress transaction receipt trie hash.
|
|
|
|
func (s HeaderFieldSetter) OutgoingReceiptHash(newOutgoingReceiptHash common.Hash) HeaderFieldSetter {
|
|
|
|
s.h.SetOutgoingReceiptHash(newOutgoingReceiptHash)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// IncomingReceiptHash sets the ingress transaction receipt trie hash.
|
|
|
|
func (s HeaderFieldSetter) IncomingReceiptHash(newIncomingReceiptHash common.Hash) HeaderFieldSetter {
|
|
|
|
s.h.SetIncomingReceiptHash(newIncomingReceiptHash)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// Bloom sets the smart contract log Bloom filter for this block.
|
|
|
|
func (s HeaderFieldSetter) Bloom(newBloom types.Bloom) HeaderFieldSetter {
|
|
|
|
s.h.SetBloom(newBloom)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// Number sets the block number.
|
|
|
|
//
|
|
|
|
// It stores a copy; the caller may freely modify the original.
|
|
|
|
func (s HeaderFieldSetter) Number(newNumber *big.Int) HeaderFieldSetter {
|
|
|
|
s.h.SetNumber(newNumber)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// GasLimit sets the gas limit for transactions in this block.
|
|
|
|
func (s HeaderFieldSetter) GasLimit(newGasLimit uint64) HeaderFieldSetter {
|
|
|
|
s.h.SetGasLimit(newGasLimit)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// GasUsed sets the amount of gas used by transactions in this block.
|
|
|
|
func (s HeaderFieldSetter) GasUsed(newGasUsed uint64) HeaderFieldSetter {
|
|
|
|
s.h.SetGasUsed(newGasUsed)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// Time sets the UNIX timestamp of this block.
|
|
|
|
//
|
|
|
|
// It stores a copy; the caller may freely modify the original.
|
|
|
|
func (s HeaderFieldSetter) Time(newTime *big.Int) HeaderFieldSetter {
|
|
|
|
s.h.SetTime(newTime)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// Extra sets the extra data field of this block.
|
|
|
|
//
|
|
|
|
// It stores a copy; the caller may freely modify the original.
|
|
|
|
func (s HeaderFieldSetter) Extra(newExtra []byte) HeaderFieldSetter {
|
|
|
|
s.h.SetExtra(newExtra)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// MixDigest sets the mixhash of this block.
|
|
|
|
func (s HeaderFieldSetter) MixDigest(newMixDigest common.Hash) HeaderFieldSetter {
|
|
|
|
s.h.SetMixDigest(newMixDigest)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// ViewID sets the view ID in which the block was originally proposed.
|
|
|
|
//
|
|
|
|
// It stores a copy; the caller may freely modify the original.
|
|
|
|
func (s HeaderFieldSetter) ViewID(newViewID *big.Int) HeaderFieldSetter {
|
|
|
|
s.h.SetViewID(newViewID)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// Epoch sets the epoch number of this block.
|
|
|
|
//
|
|
|
|
// It stores a copy; the caller may freely modify the original.
|
|
|
|
func (s HeaderFieldSetter) Epoch(newEpoch *big.Int) HeaderFieldSetter {
|
|
|
|
s.h.SetEpoch(newEpoch)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// ShardID sets the shard ID to which this block belongs.
|
|
|
|
func (s HeaderFieldSetter) ShardID(newShardID uint32) HeaderFieldSetter {
|
|
|
|
s.h.SetShardID(newShardID)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// LastCommitSignature sets the FBFT commit group signature for the last block.
|
|
|
|
func (s HeaderFieldSetter) LastCommitSignature(newLastCommitSignature [96]byte) HeaderFieldSetter {
|
|
|
|
s.h.SetLastCommitSignature(newLastCommitSignature)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// LastCommitBitmap sets the signatory bitmap of the previous block.
|
|
|
|
//
|
|
|
|
// It stores a copy; the caller may freely modify the original.
|
|
|
|
func (s HeaderFieldSetter) LastCommitBitmap(newLastCommitBitmap []byte) HeaderFieldSetter {
|
|
|
|
s.h.SetLastCommitBitmap(newLastCommitBitmap)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// ShardStateHash sets the shard state hash.
|
|
|
|
func (s HeaderFieldSetter) ShardStateHash(newShardStateHash common.Hash) HeaderFieldSetter {
|
|
|
|
s.h.SetShardStateHash(newShardStateHash)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// Vrf sets the output of the VRF for the epoch.
|
|
|
|
//
|
|
|
|
// It stores a copy; the caller may freely modify the original.
|
|
|
|
func (s HeaderFieldSetter) Vrf(newVrf []byte) HeaderFieldSetter {
|
|
|
|
s.h.SetVrf(newVrf)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// Vdf sets the output of the VDF for the epoch.
|
|
|
|
//
|
|
|
|
// It stores a copy; the caller may freely modify the original.
|
|
|
|
func (s HeaderFieldSetter) Vdf(newVdf []byte) HeaderFieldSetter {
|
|
|
|
s.h.SetVdf(newVdf)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// ShardState sets the RLP-encoded form of shard state
|
|
|
|
//
|
|
|
|
// It stores a copy; the caller may freely modify the original.
|
|
|
|
func (s HeaderFieldSetter) ShardState(newShardState []byte) HeaderFieldSetter {
|
|
|
|
s.h.SetShardState(newShardState)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// CrossLinks sets the RLP-encoded form of non-beacon block headers chosen to be
|
|
|
|
// canonical by the beacon committee.
|
|
|
|
//
|
|
|
|
// It stores a copy; the caller may freely modify the original.
|
|
|
|
func (s HeaderFieldSetter) CrossLinks(newCrossLinks []byte) HeaderFieldSetter {
|
|
|
|
s.h.SetCrossLinks(newCrossLinks)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// Header returns the header whose fields have been set. Call this at the end
|
|
|
|
// of a field setter chain.
|
|
|
|
func (s HeaderFieldSetter) Header() *Header {
|
|
|
|
return s.h
|
|
|
|
}
|