| 729 | |
| 730 | |
| 731 | class CBlockHeader: |
| 732 | __slots__ = ("hashMerkleRoot", "hashPrevBlock", "nBits", "nNonce", |
| 733 | "nTime", "nVersion") |
| 734 | |
| 735 | def __init__(self, header=None): |
| 736 | if header is None: |
| 737 | self.set_null() |
| 738 | else: |
| 739 | self.nVersion = header.nVersion |
| 740 | self.hashPrevBlock = header.hashPrevBlock |
| 741 | self.hashMerkleRoot = header.hashMerkleRoot |
| 742 | self.nTime = header.nTime |
| 743 | self.nBits = header.nBits |
| 744 | self.nNonce = header.nNonce |
| 745 | |
| 746 | def set_null(self): |
| 747 | self.nVersion = 4 |
| 748 | self.hashPrevBlock = 0 |
| 749 | self.hashMerkleRoot = 0 |
| 750 | self.nTime = 0 |
| 751 | self.nBits = 0 |
| 752 | self.nNonce = 0 |
| 753 | |
| 754 | def deserialize(self, f): |
| 755 | self.nVersion = int.from_bytes(f.read(4), "little", signed=True) |
| 756 | self.hashPrevBlock = deser_uint256(f) |
| 757 | self.hashMerkleRoot = deser_uint256(f) |
| 758 | self.nTime = int.from_bytes(f.read(4), "little") |
| 759 | self.nBits = int.from_bytes(f.read(4), "little") |
| 760 | self.nNonce = int.from_bytes(f.read(4), "little") |
| 761 | |
| 762 | def serialize(self): |
| 763 | return self._serialize_header() |
| 764 | |
| 765 | def _serialize_header(self): |
| 766 | r = b"" |
| 767 | r += self.nVersion.to_bytes(4, "little", signed=True) |
| 768 | r += ser_uint256(self.hashPrevBlock) |
| 769 | r += ser_uint256(self.hashMerkleRoot) |
| 770 | r += self.nTime.to_bytes(4, "little") |
| 771 | r += self.nBits.to_bytes(4, "little") |
| 772 | r += self.nNonce.to_bytes(4, "little") |
| 773 | return r |
| 774 | |
| 775 | @property |
| 776 | def hash_hex(self): |
| 777 | """Return block header hash as hex string.""" |
| 778 | return hash256(self._serialize_header())[::-1].hex() |
| 779 | |
| 780 | @property |
| 781 | def hash_int(self): |
| 782 | """Return block header hash as integer.""" |
| 783 | return uint256_from_str(hash256(self._serialize_header())) |
| 784 | |
| 785 | def __repr__(self): |
| 786 | return "CBlockHeader(nVersion=%i hashPrevBlock=%064x hashMerkleRoot=%064x nTime=%s nBits=%08x nNonce=%08x)" \ |
| 787 | % (self.nVersion, self.hashPrevBlock, self.hashMerkleRoot, |
| 788 | time.ctime(self.nTime), self.nBits, self.nNonce) |
no outgoing calls