[DEV-244] Remove BlockHeader.NumParentBlocks and use a method instead (#121)

This commit is contained in:
Ori Newman 2018-11-06 11:26:59 +02:00 committed by Svarog
parent 8a234bf4a3
commit 05d46e7c01
13 changed files with 118 additions and 136 deletions

View File

@ -164,7 +164,6 @@ func (node *blockNode) Header() *wire.BlockHeader {
// No lock is needed because all accessed fields are immutable. // No lock is needed because all accessed fields are immutable.
return &wire.BlockHeader{ return &wire.BlockHeader{
Version: node.version, Version: node.version,
NumParentBlocks: byte(len(node.parents)),
ParentHashes: node.ParentHashes(), ParentHashes: node.ParentHashes(),
MerkleRoot: node.merkleRoot, MerkleRoot: node.merkleRoot,
Timestamp: time.Unix(node.timestamp, 0), Timestamp: time.Unix(node.timestamp, 0),

View File

@ -510,7 +510,6 @@ func (g *testGenerator) nextBlock(blockName string, spend *spendableOut, mungers
block := wire.MsgBlock{ block := wire.MsgBlock{
Header: wire.BlockHeader{ Header: wire.BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 1, // TODO: (Stas) This is wrong. Modified only to satisfy compilation.
ParentHashes: []daghash.Hash{g.tip.BlockHash()}, // TODO: (Stas) This is wrong. Modified only to satisfy compilation. ParentHashes: []daghash.Hash{g.tip.BlockHash()}, // TODO: (Stas) This is wrong. Modified only to satisfy compilation.
MerkleRoot: calcMerkleRoot(txns), MerkleRoot: calcMerkleRoot(txns),
Bits: g.params.PowLimitBits, Bits: g.params.PowLimitBits,

View File

@ -55,7 +55,6 @@ var (
regTestGenesisBlock = wire.MsgBlock{ regTestGenesisBlock = wire.MsgBlock{
Header: wire.BlockHeader{ Header: wire.BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 0,
ParentHashes: []daghash.Hash{}, ParentHashes: []daghash.Hash{},
MerkleRoot: *newHashFromStr("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"), MerkleRoot: *newHashFromStr("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"),
Timestamp: time.Unix(0x5b28c636, 0), // 2018-06-19 09:00:38 +0000 UTC Timestamp: time.Unix(0x5b28c636, 0), // 2018-06-19 09:00:38 +0000 UTC

View File

@ -431,7 +431,7 @@ func checkBlockHeaderSanity(header *wire.BlockHeader, powLimit *big.Int, timeSou
//checkBlockParentsOrder ensures that the block's parents are ordered by hash //checkBlockParentsOrder ensures that the block's parents are ordered by hash
func checkBlockParentsOrder(header *wire.BlockHeader) error { func checkBlockParentsOrder(header *wire.BlockHeader) error {
sortedHashes := make([]daghash.Hash, 0, len(header.ParentHashes)) sortedHashes := make([]daghash.Hash, 0, header.NumParentBlocks())
for _, hash := range header.ParentHashes { for _, hash := range header.ParentHashes {
sortedHashes = append(sortedHashes, hash) sortedHashes = append(sortedHashes, hash)
} }

View File

@ -170,7 +170,6 @@ func TestCheckBlockSanity(t *testing.T) {
var invalidParentsOrderBlock = wire.MsgBlock{ var invalidParentsOrderBlock = wire.MsgBlock{
Header: wire.BlockHeader{ Header: wire.BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 2,
ParentHashes: []daghash.Hash{ ParentHashes: []daghash.Hash{
[32]byte{ // Make go vet happy. [32]byte{ // Make go vet happy.
0x4b, 0xb0, 0x75, 0x35, 0xdf, 0xd5, 0x8e, 0x0b, 0x4b, 0xb0, 0x75, 0x35, 0xdf, 0xd5, 0x8e, 0x0b,
@ -611,7 +610,6 @@ func TestValidateParents(t *testing.T) {
var Block100000 = wire.MsgBlock{ var Block100000 = wire.MsgBlock{
Header: wire.BlockHeader{ Header: wire.BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 2,
ParentHashes: []daghash.Hash{ ParentHashes: []daghash.Hash{
[32]byte{ // Make go vet happy. [32]byte{ // Make go vet happy.
0x16, 0x5e, 0x38, 0xe8, 0xb3, 0x91, 0x45, 0x95, 0x16, 0x5e, 0x38, 0xe8, 0xb3, 0x91, 0x45, 0x95,

View File

@ -79,7 +79,6 @@ var genesisMerkleRoot = daghash.Hash([daghash.HashSize]byte{ // Make go vet happ
var genesisBlock = wire.MsgBlock{ var genesisBlock = wire.MsgBlock{
Header: wire.BlockHeader{ Header: wire.BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 0,
ParentHashes: []daghash.Hash{}, ParentHashes: []daghash.Hash{},
MerkleRoot: genesisMerkleRoot, // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b MerkleRoot: genesisMerkleRoot, // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
Timestamp: time.Unix(0x5bbe076c, 0), // 2018-10-10 14:06:36 +0000 UTC Timestamp: time.Unix(0x5bbe076c, 0), // 2018-10-10 14:06:36 +0000 UTC
@ -108,7 +107,6 @@ var regTestGenesisMerkleRoot = genesisMerkleRoot
var regTestGenesisBlock = wire.MsgBlock{ var regTestGenesisBlock = wire.MsgBlock{
Header: wire.BlockHeader{ Header: wire.BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 0,
ParentHashes: []daghash.Hash{}, ParentHashes: []daghash.Hash{},
MerkleRoot: regTestGenesisMerkleRoot, // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b MerkleRoot: regTestGenesisMerkleRoot, // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
Timestamp: time.Unix(0x5bbe0d4b, 0), // 2018-06-19 09:00:38 +0000 UTC Timestamp: time.Unix(0x5bbe0d4b, 0), // 2018-06-19 09:00:38 +0000 UTC
@ -137,7 +135,6 @@ var testNet3GenesisMerkleRoot = genesisMerkleRoot
var testNet3GenesisBlock = wire.MsgBlock{ var testNet3GenesisBlock = wire.MsgBlock{
Header: wire.BlockHeader{ Header: wire.BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 0,
ParentHashes: []daghash.Hash{}, ParentHashes: []daghash.Hash{},
MerkleRoot: testNet3GenesisMerkleRoot, // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b MerkleRoot: testNet3GenesisMerkleRoot, // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
Timestamp: time.Unix(0x5bbe0e49, 0), // 2018-06-19 09:04:06 +0000 UTC Timestamp: time.Unix(0x5bbe0e49, 0), // 2018-06-19 09:04:06 +0000 UTC
@ -166,7 +163,6 @@ var simNetGenesisMerkleRoot = genesisMerkleRoot
var simNetGenesisBlock = wire.MsgBlock{ var simNetGenesisBlock = wire.MsgBlock{
Header: wire.BlockHeader{ Header: wire.BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 0,
ParentHashes: []daghash.Hash{}, ParentHashes: []daghash.Hash{},
MerkleRoot: simNetGenesisMerkleRoot, // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b MerkleRoot: simNetGenesisMerkleRoot, // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
Timestamp: time.Unix(0x5bbe00fe, 0), // 2018-10-10 13:39:10 +0000 UTC Timestamp: time.Unix(0x5bbe00fe, 0), // 2018-10-10 13:39:10 +0000 UTC

View File

@ -45,7 +45,6 @@ func generateBlock(parent *wire.MsgBlock) *wire.MsgBlock {
return &wire.MsgBlock{ return &wire.MsgBlock{
Header: wire.BlockHeader{ Header: wire.BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 1,
ParentHashes: []daghash.Hash{parent.BlockHash()}, ParentHashes: []daghash.Hash{parent.BlockHash()},
MerkleRoot: genesisMerkleRoot, MerkleRoot: genesisMerkleRoot,
Timestamp: time.Unix(0x5b28c4c8, 0), // 2018-06-19 08:54:32 +0000 UTC Timestamp: time.Unix(0x5b28c4c8, 0), // 2018-06-19 08:54:32 +0000 UTC

View File

@ -716,7 +716,6 @@ mempoolLoop:
var msgBlock wire.MsgBlock var msgBlock wire.MsgBlock
msgBlock.Header = wire.BlockHeader{ msgBlock.Header = wire.BlockHeader{
Version: nextBlockVersion, Version: nextBlockVersion,
NumParentBlocks: byte(len(g.dag.TipHashes())),
ParentHashes: g.dag.TipHashes(), ParentHashes: g.dag.TipHashes(),
MerkleRoot: *merkles[len(merkles)-1], MerkleRoot: *merkles[len(merkles)-1],
Timestamp: ts, Timestamp: ts,

View File

@ -305,7 +305,6 @@ func TestBlockErrors(t *testing.T) {
var Block100000 = wire.MsgBlock{ var Block100000 = wire.MsgBlock{
Header: wire.BlockHeader{ Header: wire.BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 2,
ParentHashes: []daghash.Hash{ ParentHashes: []daghash.Hash{
[32]byte{ // Make go vet happy. [32]byte{ // Make go vet happy.
0x82, 0xdc, 0xbd, 0xe6, 0x88, 0x37, 0x74, 0x5b, 0x82, 0xdc, 0xbd, 0xe6, 0x88, 0x37, 0x74, 0x5b,

View File

@ -34,9 +34,6 @@ type BlockHeader struct {
// Version of the block. This is not the same as the protocol version. // Version of the block. This is not the same as the protocol version.
Version int32 Version int32
// Number of entries in ParentHashes
NumParentBlocks byte
// Hashes of the parent block headers in the blockDAG. // Hashes of the parent block headers in the blockDAG.
ParentHashes []daghash.Hash ParentHashes []daghash.Hash
@ -53,13 +50,18 @@ type BlockHeader struct {
Nonce uint64 Nonce uint64
} }
// NumParentBlocks return the number of entries in ParentHashes
func (h *BlockHeader) NumParentBlocks() byte {
return byte(len(h.ParentHashes))
}
// BlockHash computes the block identifier hash for the given block header. // BlockHash computes the block identifier hash for the given block header.
func (h *BlockHeader) BlockHash() daghash.Hash { func (h *BlockHeader) BlockHash() daghash.Hash {
// Encode the header and double sha256 everything prior to the number of // Encode the header and double sha256 everything prior to the number of
// transactions. Ignore the error returns since there is no way the // transactions. Ignore the error returns since there is no way the
// encode could fail except being out of memory which would cause a // encode could fail except being out of memory which would cause a
// run-time panic. // run-time panic.
buf := bytes.NewBuffer(make([]byte, 0, BaseBlockHeaderPayload+len(h.ParentHashes))) buf := bytes.NewBuffer(make([]byte, 0, BaseBlockHeaderPayload+h.NumParentBlocks()))
_ = writeBlockHeader(buf, 0, h) _ = writeBlockHeader(buf, 0, h)
return daghash.DoubleHashH(buf.Bytes()) return daghash.DoubleHashH(buf.Bytes())
@ -67,7 +69,7 @@ func (h *BlockHeader) BlockHash() daghash.Hash {
// SelectedParentHash returns the hash of the selected block header. // SelectedParentHash returns the hash of the selected block header.
func (h *BlockHeader) SelectedParentHash() *daghash.Hash { func (h *BlockHeader) SelectedParentHash() *daghash.Hash {
if h.NumParentBlocks == 0 { if h.NumParentBlocks() == 0 {
return nil return nil
} }
@ -76,7 +78,7 @@ func (h *BlockHeader) SelectedParentHash() *daghash.Hash {
// IsGenesis returns true iff this block is a genesis block // IsGenesis returns true iff this block is a genesis block
func (h *BlockHeader) IsGenesis() bool { func (h *BlockHeader) IsGenesis() bool {
return h.NumParentBlocks == 0 return h.NumParentBlocks() == 0
} }
// BtcDecode decodes r using the bitcoin protocol encoding into the receiver. // BtcDecode decodes r using the bitcoin protocol encoding into the receiver.
@ -118,7 +120,7 @@ func (h *BlockHeader) Serialize(w io.Writer) error {
// SerializeSize returns the number of bytes it would take to serialize the // SerializeSize returns the number of bytes it would take to serialize the
// block header. // block header.
func (h *BlockHeader) SerializeSize() int { func (h *BlockHeader) SerializeSize() int {
return BaseBlockHeaderPayload + int(h.NumParentBlocks)*daghash.HashSize return BaseBlockHeaderPayload + int(h.NumParentBlocks())*daghash.HashSize
} }
// NewBlockHeader returns a new BlockHeader using the provided version, previous // NewBlockHeader returns a new BlockHeader using the provided version, previous
@ -131,7 +133,6 @@ func NewBlockHeader(version int32, parentHashes []daghash.Hash, merkleRootHash *
// doesn't support better. // doesn't support better.
return &BlockHeader{ return &BlockHeader{
Version: version, Version: version,
NumParentBlocks: byte(len(parentHashes)),
ParentHashes: parentHashes, ParentHashes: parentHashes,
MerkleRoot: *merkleRootHash, MerkleRoot: *merkleRootHash,
Timestamp: time.Unix(time.Now().Unix(), 0), Timestamp: time.Unix(time.Now().Unix(), 0),
@ -144,13 +145,14 @@ func NewBlockHeader(version int32, parentHashes []daghash.Hash, merkleRootHash *
// decoding block headers stored to disk, such as in a database, as opposed to // decoding block headers stored to disk, such as in a database, as opposed to
// decoding from the wire. // decoding from the wire.
func readBlockHeader(r io.Reader, pver uint32, bh *BlockHeader) error { func readBlockHeader(r io.Reader, pver uint32, bh *BlockHeader) error {
err := readElements(r, &bh.Version, &bh.NumParentBlocks) var numParentBlocks byte
err := readElements(r, &bh.Version, &numParentBlocks)
if err != nil { if err != nil {
return err return err
} }
bh.ParentHashes = make([]daghash.Hash, bh.NumParentBlocks) bh.ParentHashes = make([]daghash.Hash, numParentBlocks)
for i := byte(0); i < bh.NumParentBlocks; i++ { for i := byte(0); i < numParentBlocks; i++ {
err := readElement(r, &bh.ParentHashes[i]) err := readElement(r, &bh.ParentHashes[i])
if err != nil { if err != nil {
return err return err
@ -164,6 +166,6 @@ func readBlockHeader(r io.Reader, pver uint32, bh *BlockHeader) error {
// opposed to encoding for the wire. // opposed to encoding for the wire.
func writeBlockHeader(w io.Writer, pver uint32, bh *BlockHeader) error { func writeBlockHeader(w io.Writer, pver uint32, bh *BlockHeader) error {
sec := int64(bh.Timestamp.Unix()) sec := int64(bh.Timestamp.Unix())
return writeElements(w, bh.Version, bh.NumParentBlocks, &bh.ParentHashes, &bh.MerkleRoot, return writeElements(w, bh.Version, bh.NumParentBlocks(), &bh.ParentHashes, &bh.MerkleRoot,
sec, bh.Bits, bh.Nonce) sec, bh.Bits, bh.Nonce)
} }

View File

@ -56,7 +56,6 @@ func TestBlockHeaderWire(t *testing.T) {
bits := uint32(0x1d00ffff) bits := uint32(0x1d00ffff)
baseBlockHdr := &BlockHeader{ baseBlockHdr := &BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 2,
ParentHashes: []daghash.Hash{mainNetGenesisHash, simNetGenesisHash}, ParentHashes: []daghash.Hash{mainNetGenesisHash, simNetGenesisHash},
MerkleRoot: mainNetGenesisMerkleRoot, MerkleRoot: mainNetGenesisMerkleRoot,
Timestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST Timestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST
@ -195,7 +194,6 @@ func TestBlockHeaderSerialize(t *testing.T) {
bits := uint32(0x1d00ffff) bits := uint32(0x1d00ffff)
baseBlockHdr := &BlockHeader{ baseBlockHdr := &BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 2,
ParentHashes: []daghash.Hash{mainNetGenesisHash, simNetGenesisHash}, ParentHashes: []daghash.Hash{mainNetGenesisHash, simNetGenesisHash},
MerkleRoot: mainNetGenesisMerkleRoot, MerkleRoot: mainNetGenesisMerkleRoot,
Timestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST Timestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST
@ -275,7 +273,6 @@ func TestBlockHeaderSerializeSize(t *testing.T) {
timestamp := time.Unix(0x495fab29, 0) // 2009-01-03 12:15:05 -0600 CST timestamp := time.Unix(0x495fab29, 0) // 2009-01-03 12:15:05 -0600 CST
baseBlockHdr := &BlockHeader{ baseBlockHdr := &BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 2,
ParentHashes: []daghash.Hash{mainNetGenesisHash, simNetGenesisHash}, ParentHashes: []daghash.Hash{mainNetGenesisHash, simNetGenesisHash},
MerkleRoot: mainNetGenesisMerkleRoot, MerkleRoot: mainNetGenesisMerkleRoot,
Timestamp: timestamp, Timestamp: timestamp,
@ -285,7 +282,6 @@ func TestBlockHeaderSerializeSize(t *testing.T) {
genesisBlockHdr := &BlockHeader{ genesisBlockHdr := &BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 0,
ParentHashes: []daghash.Hash{}, ParentHashes: []daghash.Hash{},
MerkleRoot: mainNetGenesisMerkleRoot, MerkleRoot: mainNetGenesisMerkleRoot,
Timestamp: timestamp, Timestamp: timestamp,
@ -322,7 +318,6 @@ func TestIsGenesis(t *testing.T) {
baseBlockHdr := &BlockHeader{ baseBlockHdr := &BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 2,
ParentHashes: []daghash.Hash{mainNetGenesisHash, simNetGenesisHash}, ParentHashes: []daghash.Hash{mainNetGenesisHash, simNetGenesisHash},
MerkleRoot: mainNetGenesisMerkleRoot, MerkleRoot: mainNetGenesisMerkleRoot,
Timestamp: timestamp, Timestamp: timestamp,
@ -331,7 +326,6 @@ func TestIsGenesis(t *testing.T) {
} }
genesisBlockHdr := &BlockHeader{ genesisBlockHdr := &BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 0,
ParentHashes: []daghash.Hash{}, ParentHashes: []daghash.Hash{},
MerkleRoot: mainNetGenesisMerkleRoot, MerkleRoot: mainNetGenesisMerkleRoot,
Timestamp: timestamp, Timestamp: timestamp,

View File

@ -492,7 +492,6 @@ func TestBlockSerializeSize(t *testing.T) {
var blockOne = MsgBlock{ var blockOne = MsgBlock{
Header: BlockHeader{ Header: BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 2,
ParentHashes: []daghash.Hash{mainNetGenesisHash, simNetGenesisHash}, ParentHashes: []daghash.Hash{mainNetGenesisHash, simNetGenesisHash},
MerkleRoot: daghash.Hash(mainNetGenesisMerkleRoot), MerkleRoot: daghash.Hash(mainNetGenesisMerkleRoot),

View File

@ -338,7 +338,6 @@ func TestMerkleBlockOverflowErrors(t *testing.T) {
var merkleBlockOne = MsgMerkleBlock{ var merkleBlockOne = MsgMerkleBlock{
Header: BlockHeader{ Header: BlockHeader{
Version: 1, Version: 1,
NumParentBlocks: 2,
ParentHashes: []daghash.Hash{mainNetGenesisHash, simNetGenesisHash}, ParentHashes: []daghash.Hash{mainNetGenesisHash, simNetGenesisHash},
MerkleRoot: daghash.Hash([daghash.HashSize]byte{ // Make go vet happy. MerkleRoot: daghash.Hash([daghash.HashSize]byte{ // Make go vet happy.
0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44, 0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44,