def _extended_key(self, ver_bytes, raw_serkey): '''Return the 78-byte extended key given prefix version bytes and serialized key bytes. ''' if not isinstance(ver_bytes, (bytes, bytearray)): raise TypeError('ver_bytes must be raw bytes') if len(ver_bytes) != 4: raise ValueError('ver_bytes must have length 4') if not isinstance(raw_serkey, (bytes, bytearray)): raise TypeError('raw_serkey must be raw bytes') if len(raw_serkey) != 33: raise ValueError('raw_serkey must have length 33') return (ver_bytes + bytes([self.depth]) + self.parent_fingerprint() + pack_be_uint32(self.n) + self.chain_code + raw_serkey)
def test_block(block_details): coin, block_info = block_details raw_block = unhexlify(block_info['block']) block = coin.block(raw_block, block_info['height']) h = coin.electrum_header(block.header, block_info['height']) assert block_info['merkleroot'] == h['merkle_root'] assert block_info['time'] == h['timestamp'] assert block_info['previousblockhash'] == h['prev_block_hash'] assert block_info['height'] == h['block_height'] assert block_info['nonce'] == h['nonce'] assert block_info['bits'] == pack_be_uint32(h['bits']).hex() assert coin.header_hash(block.header) == hex_str_to_hash( block_info['hash']) assert (coin.header_prevhash(block.header) == hex_str_to_hash( block_info['previousblockhash'])) for n, (tx, txid) in enumerate(block.transactions): assert txid == hex_str_to_hash(block_info['tx'][n])
def child(self, n): '''Return the derived child extended pubkey at index N.''' if not 0 <= n < (1 << 31): raise ValueError('invalid BIP32 public key child number') msg = self.pubkey_bytes + pack_be_uint32(n) L, R = self._hmac_sha512(msg) curve = self.CURVE L = bytes_to_int(L) if L >= curve.order: raise DerivationError point = curve.generator * L + self.ec_point() if point == EC.INFINITY: raise DerivationError verkey = ecdsa.VerifyingKey.from_public_point(point, curve=curve) return PubKey(verkey, R, n, self.depth + 1, self)
def child(self, n): '''Return the derived child extended privkey at index N.''' if not 0 <= n < (1 << 32): raise ValueError('invalid BIP32 private key child number') if n >= self.HARDENED: serkey = b'\0' + self.privkey_bytes else: serkey = self.public_key.pubkey_bytes msg = serkey + pack_be_uint32(n) L, R = self._hmac_sha512(msg) curve = self.CURVE L = bytes_to_int(L) exponent = (L + bytes_to_int(self.privkey_bytes)) % curve.order if exponent == 0 or L >= curve.order: raise DerivationError privkey = _exponent_to_bytes(exponent) return PrivKey(privkey, R, n, self.depth + 1, self)
def undo_key(self, height: int) -> bytes: '''DB key for undo information at the given height.''' return b'U' + pack_be_uint32(height)