A block header
| 497 | |
| 498 | |
| 499 | class CBlockHeader(ImmutableSerializable): |
| 500 | """A block header""" |
| 501 | __slots__ = ['nVersion', 'hashPrevBlock', 'hashMerkleRoot', 'nTime', 'nBits', 'nNonce'] |
| 502 | |
| 503 | def __init__(self, nVersion=2, hashPrevBlock=b'\x00'*32, hashMerkleRoot=b'\x00'*32, nTime=0, nBits=0, nNonce=0): |
| 504 | object.__setattr__(self, 'nVersion', nVersion) |
| 505 | assert len(hashPrevBlock) == 32 |
| 506 | object.__setattr__(self, 'hashPrevBlock', hashPrevBlock) |
| 507 | assert len(hashMerkleRoot) == 32 |
| 508 | object.__setattr__(self, 'hashMerkleRoot', hashMerkleRoot) |
| 509 | object.__setattr__(self, 'nTime', nTime) |
| 510 | object.__setattr__(self, 'nBits', nBits) |
| 511 | object.__setattr__(self, 'nNonce', nNonce) |
| 512 | |
| 513 | @classmethod |
| 514 | def stream_deserialize(cls, f): |
| 515 | nVersion = struct.unpack(b"<i", ser_read(f,4))[0] |
| 516 | hashPrevBlock = ser_read(f,32) |
| 517 | hashMerkleRoot = ser_read(f,32) |
| 518 | nTime = struct.unpack(b"<I", ser_read(f,4))[0] |
| 519 | nBits = struct.unpack(b"<I", ser_read(f,4))[0] |
| 520 | nNonce = struct.unpack(b"<I", ser_read(f,4))[0] |
| 521 | return cls(nVersion, hashPrevBlock, hashMerkleRoot, nTime, nBits, nNonce) |
| 522 | |
| 523 | def stream_serialize(self, f): |
| 524 | f.write(struct.pack(b"<i", self.nVersion)) |
| 525 | assert len(self.hashPrevBlock) == 32 |
| 526 | f.write(self.hashPrevBlock) |
| 527 | assert len(self.hashMerkleRoot) == 32 |
| 528 | f.write(self.hashMerkleRoot) |
| 529 | f.write(struct.pack(b"<I", self.nTime)) |
| 530 | f.write(struct.pack(b"<I", self.nBits)) |
| 531 | f.write(struct.pack(b"<I", self.nNonce)) |
| 532 | |
| 533 | @staticmethod |
| 534 | def calc_difficulty(nBits): |
| 535 | """Calculate difficulty from nBits target""" |
| 536 | nShift = (nBits >> 24) & 0xff |
| 537 | dDiff = float(0x0000ffff) / float(nBits & 0x00ffffff) |
| 538 | while nShift < 29: |
| 539 | dDiff *= 256.0 |
| 540 | nShift += 1 |
| 541 | while nShift > 29: |
| 542 | dDiff /= 256.0 |
| 543 | nShift -= 1 |
| 544 | return dDiff |
| 545 | difficulty = property(lambda self: CBlockHeader.calc_difficulty(self.nBits)) |
| 546 | |
| 547 | def __repr__(self): |
| 548 | return "%s(%i, lx(%s), lx(%s), %s, 0x%08x, 0x%08x)" % \ |
| 549 | (self.__class__.__name__, self.nVersion, b2lx(self.hashPrevBlock), b2lx(self.hashMerkleRoot), |
| 550 | self.nTime, self.nBits, self.nNonce) |
| 551 | |
| 552 | class NoWitnessData(Exception): |
| 553 | """The block does not have witness data""" |