9 "github.com/bytom/bytom/encoding/blockchain"
10 "github.com/bytom/bytom/encoding/bufpool"
11 "github.com/bytom/bytom/errors"
12 "github.com/bytom/bytom/protocol/bc"
15 // BlockHeader defines information about a block and is used in the Bytom
16 type BlockHeader struct {
17 Version uint64 // The version of the block.
18 Height uint64 // The height of the block.
19 PreviousBlockHash bc.Hash // The hash of the previous block.
20 Timestamp uint64 // The time of the block in seconds.
25 // Hash returns complete hash of the block header.
26 func (bh *BlockHeader) Hash() bc.Hash {
27 h, _ := mapBlockHeader(bh)
31 // Time returns the time represented by the Timestamp in block header.
32 func (bh *BlockHeader) Time() time.Time {
33 return time.Unix(int64(bh.Timestamp/1000), 0).UTC()
36 // MarshalText fulfills the json.Marshaler interface. This guarantees that
37 // block headers will get deserialized correctly when being parsed from HTTP
39 func (bh *BlockHeader) MarshalText() ([]byte, error) {
41 defer bufpool.Put(buf)
43 if _, err := bh.WriteTo(buf); err != nil {
47 enc := make([]byte, hex.EncodedLen(buf.Len()))
48 hex.Encode(enc, buf.Bytes())
52 // UnmarshalText fulfills the encoding.TextUnmarshaler interface.
53 func (bh *BlockHeader) UnmarshalText(text []byte) error {
54 decoded := make([]byte, hex.DecodedLen(len(text)))
55 if _, err := hex.Decode(decoded, text); err != nil {
59 serflag, err := bh.readFrom(blockchain.NewReader(decoded))
64 if serflag == SerBlockTransactions {
65 return fmt.Errorf("unsupported serialization flags 0x%02x", serflag)
71 // WriteTo writes the block header to the input io.Writer
72 func (bh *BlockHeader) WriteTo(w io.Writer) (int64, error) {
73 ew := errors.NewWriter(w)
74 if err := bh.writeTo(ew, SerBlockHeader); err != nil {
77 return ew.Written(), ew.Err()
80 func (bh *BlockHeader) readFrom(r *blockchain.Reader) (serflag uint8, err error) {
82 if _, err := io.ReadFull(r, serflags[:]); err != nil {
88 case SerBlockHeader, SerBlockFull:
89 case SerBlockTransactions:
92 return 0, fmt.Errorf("unsupported serialization flags 0x%x", serflags)
95 if bh.Version, err = blockchain.ReadVarint63(r); err != nil {
99 if bh.Height, err = blockchain.ReadVarint63(r); err != nil {
103 if _, err = bh.PreviousBlockHash.ReadFrom(r); err != nil {
107 if bh.Timestamp, err = blockchain.ReadVarint63(r); err != nil {
111 if _, err = blockchain.ReadExtensibleString(r, bh.BlockCommitment.readFrom); err != nil {
115 if _, err = blockchain.ReadExtensibleString(r, bh.BlockWitness.readFrom); err != nil {
119 if _, err = blockchain.ReadExtensibleString(r, bh.SupLinks.readFrom); err != nil {
126 func (bh *BlockHeader) writeTo(w io.Writer, serflags uint8) (err error) {
127 w.Write([]byte{serflags})
128 if serflags == SerBlockTransactions {
132 if _, err = blockchain.WriteVarint63(w, bh.Version); err != nil {
136 if _, err = blockchain.WriteVarint63(w, bh.Height); err != nil {
140 if _, err = bh.PreviousBlockHash.WriteTo(w); err != nil {
144 if _, err = blockchain.WriteVarint63(w, bh.Timestamp); err != nil {
148 if _, err = blockchain.WriteExtensibleString(w, nil, bh.BlockCommitment.writeTo); err != nil {
152 if _, err = blockchain.WriteExtensibleString(w, nil, bh.BlockWitness.writeTo); err != nil {
156 if _, err = blockchain.WriteExtensibleString(w, nil, bh.SupLinks.writeTo); err != nil {