def __init__(self, raw_block=None, format="decoded", version=536870912, testnet=False): if format not in ("decoded", "raw"): raise ValueError("tx_format error, raw or decoded allowed") self["format"] = format self["testnet"] = testnet self["header"] = None self["hash"] = None self["version"] = version self["versionHex"] = pack(">L", version).hex() self["previousBlockHash"] = None self["merkleRoot"] = None self["tx"] = dict() self["time"] = None self["bits"] = None self["nonce"] = None self["weight"] = 0 self["size"] = 80 self["strippedSize"] = 80 self["amount"] = 0 self["height"] = None self["difficulty"] = None self["targetDifficulty"] = None self["target"] = None if raw_block is None: return self["size"] = len(raw_block) if isinstance(raw_block, bytes) else int( len(raw_block) / 2) s = self.get_stream(raw_block) self["format"] = "raw" self["version"] = unpack("<L", s.read(4))[0] self["versionHex"] = pack(">L", self["version"]).hex() self["previousBlockHash"] = s.read(32) self["merkleRoot"] = s.read(32) self["time"] = unpack("<L", s.read(4))[0] self["bits"] = s.read(4) self["target"] = bits_to_target(unpack("<L", self["bits"])[0]) self["targetDifficulty"] = target_to_difficulty(self["target"]) self["target"] = self["target"].to_bytes(32, byteorder="little") self["nonce"] = unpack("<L", s.read(4))[0] s.seek(-80, 1) self["header"] = s.read(80) self["hash"] = double_sha256(self["header"]) block_target = int.from_bytes(self["hash"], byteorder="little") self["difficulty"] = target_to_difficulty(block_target) tx_count = var_int_to_int(read_var_int(s)) self["tx"] = {i: Transaction(s, format="raw") for i in range(tx_count)} for t in self["tx"].values(): self["amount"] += t["amount"] self["strippedSize"] += t["bSize"] self["strippedSize"] += var_int_len(tx_count) self["weight"] = self["strippedSize"] * 3 + self["size"] if format == "decoded": self.decode(testnet=testnet)
def decode_block_tx(block): s = get_stream(block) b = dict() b["amount"] = 0 b["size"] = int(len(block) / 2) b["strippedSize"] = 80 b["version"] = unpack("<L", s.read(4))[0] b["versionHex"] = pack(">L", b["version"]).hex() b["previousBlockHash"] = rh2s(s.read(32)) b["merkleRoot"] = rh2s(s.read(32)) b["time"] = unpack("<L", s.read(4))[0] b["bits"] = s.read(4) b["target"] = bits_to_target(unpack("<L", b["bits"])[0]) b["targetDifficulty"] = target_to_difficulty(b["target"]) b["target"] = b["target"].to_bytes(32, byteorder="little") b["nonce"] = unpack("<L", s.read(4))[0] s.seek(-80, 1) b["header"] = s.read(80) b["bits"] = rh2s(b["bits"]) b["target"] = rh2s(b["target"]) b["hash"] = double_sha256(b["header"], hex=0) b["hash"] = rh2s(b["hash"]) b["rawTx"] = dict() b["tx"] = list() for i in range(var_int_to_int(read_var_int(s))): b["rawTx"][i] = Transaction(s, format="raw", keep_raw_tx=True) b["tx"].append(rh2s(b["rawTx"][i]["txId"])) b["amount"] += b["rawTx"][i]["amount"] b["strippedSize"] += b["rawTx"][i]["bSize"] b["strippedSize"] += var_int_len(len(b["tx"])) b["weight"] = b["strippedSize"] * 3 + b["size"] return b