Add Serialize/Deserialize for BlockHeader.
This commit introduces two new functions for Blockheader named Serialize and Deserialize. The functions provide a stable mechanism for serializing and deserializing block headers to and from disk. The main benefit here is deserialization of the header since typically only full blocks are serialized to disk. Then when a header is needed, only the header portion of the block is read and deserialized.
This commit is contained in:
parent
d6aea22adb
commit
06d1236d49
1 changed files with 26 additions and 2 deletions
|
@ -63,6 +63,26 @@ func (h *BlockHeader) BlockSha() (ShaHash, error) {
|
|||
return sha, nil
|
||||
}
|
||||
|
||||
// Deserialize decodes a block header from r into the receiver using a format
|
||||
// that is suitable for long-term storage such as a database while respecting
|
||||
// the Version field.
|
||||
func (h *BlockHeader) Deserialize(r io.Reader) error {
|
||||
// At the current time, there is no difference between the wire encoding
|
||||
// at protocol version 0 and the stable long-term storage format. As
|
||||
// a result, make use of readBlockHeader.
|
||||
return readBlockHeader(r, 0, h)
|
||||
}
|
||||
|
||||
// Serialize encodes a block header from r into the receiver using a format
|
||||
// that is suitable for long-term storage such as a database while respecting
|
||||
// the Version field.
|
||||
func (h *BlockHeader) Serialize(w io.Writer) error {
|
||||
// At the current time, there is no difference between the wire encoding
|
||||
// at protocol version 0 and the stable long-term storage format. As
|
||||
// a result, make use of writeBlockHeader.
|
||||
return writeBlockHeader(w, 0, h)
|
||||
}
|
||||
|
||||
// NewBlockHeader returns a new BlockHeader using the provided previous block
|
||||
// hash, merkle root hash, difficulty bits, and nonce used to generate the
|
||||
// block with defaults for the remaining fields.
|
||||
|
@ -79,7 +99,9 @@ func NewBlockHeader(prevHash *ShaHash, merkleRootHash *ShaHash, bits uint32,
|
|||
}
|
||||
}
|
||||
|
||||
// readBlockHeader reads a bitcoin block header from r.
|
||||
// readBlockHeader reads a bitcoin block header from r. See Deserialize for
|
||||
// decoding block headers stored to disk, such as in a database, as opposed to
|
||||
// decoding from the wire.
|
||||
func readBlockHeader(r io.Reader, pver uint32, bh *BlockHeader) error {
|
||||
var sec uint32
|
||||
err := readElements(r, &bh.Version, &bh.PrevBlock, &bh.MerkleRoot, &sec,
|
||||
|
@ -92,7 +114,9 @@ func readBlockHeader(r io.Reader, pver uint32, bh *BlockHeader) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// writeBlockHeader writes a bitcoin block header to w.
|
||||
// writeBlockHeader writes a bitcoin block header to w. See Serialize for
|
||||
// encoding block headers to be stored to disk, such as in a database, as
|
||||
// opposed to encoding for the wire.
|
||||
func writeBlockHeader(w io.Writer, pver uint32, bh *BlockHeader) error {
|
||||
sec := uint32(bh.Timestamp.Unix())
|
||||
err := writeElements(w, bh.Version, &bh.PrevBlock, &bh.MerkleRoot,
|
||||
|
|
Loading…
Reference in a new issue