def header_hash(cls, header): '''Given a header return hash''' height, = struct.unpack('<I', header[68:72]) if height >= cls.FORK_HEIGHT: return double_sha256(header) else: return double_sha256(header[:68] + header[100:112])
def header_hash(cls, header): height, = struct.unpack('<I', header[68:72]) blockhash = "" if height >= cls.FORK_HEIGHT: blockhash = double_sha256(header) else: blockhash = double_sha256(header[:68] + header[100:112]) print("height: ", cls.counter) print("blockhash: ", hash_to_str(blockhash)) print("block: ", hash_to_str(header)) cls.counter = cls.counter + 1 return blockhash
def read_tx(self): '''Return a (Deserialized TX, TX_HASH) pair. The hash needs to be reversed for human display; for efficiency we process it in the natural serialized order. ''' marker = self.binary[self.cursor + 4] if marker: return super().read_tx() # Ugh, this is nasty. start = self.cursor version = self._read_le_int32() orig_ser = self.binary[start:self.cursor] marker = self._read_byte() flag = self._read_byte() start = self.cursor inputs = self._read_inputs() outputs = self._read_outputs() orig_ser += self.binary[start:self.cursor] witness = self._read_witness(len(inputs)) start = self.cursor locktime = self._read_le_uint32() orig_ser += self.binary[start:self.cursor] return TxSegWit(version, marker, flag, inputs, outputs, witness, locktime), double_sha256(orig_ser)
async def tx_merkle(self, tx_hash, height): '''tx_hash is a hex string.''' hex_hashes = await self.daemon_request('block_hex_hashes', height, 1) block = await self.daemon_request('deserialised_block', hex_hashes[0]) tx_hashes = block['tx'] try: pos = tx_hashes.index(tx_hash) except ValueError: raise RPCError( BAD_REQUEST, f'tx hash {tx_hash} not in ' f'block {hex_hashes[0]} at height {height:,d}') idx = pos hashes = [hex_str_to_hash(txh) for txh in tx_hashes] merkle_branch = [] while len(hashes) > 1: if len(hashes) & 1: hashes.append(hashes[-1]) idx = idx - 1 if (idx & 1) else idx + 1 merkle_branch.append(hash_to_str(hashes[idx])) idx //= 2 hashes = [ double_sha256(hashes[n] + hashes[n + 1]) for n in range(0, len(hashes), 2) ] return {"block_height": height, "merkle": merkle_branch, "pos": pos}
def header_hash(cls, header, height=0): if height > cls.MBC_HEIGHT and height < cls.RAINFOREST_HEIGHT: return groestl_hash(header) elif height >= cls.RAINFOREST_HEIGHT: return rainforest_hash(header) else: return double_sha256(header)
def read_tx_and_hash(self): '''Return a (deserialized TX, tx_hash) pair. The hash needs to be reversed for human display; for efficiency we process it in the natural serialized order. ''' start = self.cursor return self.read_tx(), double_sha256(self.binary[start:self.cursor])
def read_tx(self): '''Return a (Deserialized TX, TX_HASH) pair. The hash needs to be reversed for human display; for efficiency we process it in the natural serialized order. ''' tx_version = self._get_version() if tx_version == self.bitcoin_diamond_tx_version: marker = self.binary[self.cursor + 4 + 32] else: marker = self.binary[self.cursor + 4] if marker: return super().read_tx() # Ugh, this is nasty. start = self.cursor version = self._read_le_int32() if version == self.bitcoin_diamond_tx_version: present_block_hash = hash_to_str(self._read_nbytes(32)) else: present_block_hash = None orig_ser = self.binary[start:self.cursor] marker = self._read_byte() flag = self._read_byte() start = self.cursor inputs = self._read_inputs() outputs = self._read_outputs() orig_ser += self.binary[start:self.cursor] witness = self._read_witness(len(inputs)) start = self.cursor locktime = self._read_le_uint32() orig_ser += self.binary[start:self.cursor] if present_block_hash is not None: return TxBitcoinDiamondSegWit(version, present_block_hash, marker, flag, inputs, outputs, witness, locktime), double_sha256(orig_ser) else: return TxSegWit(version, marker, flag, inputs, outputs, witness, locktime), double_sha256(orig_ser)
def read_tx_and_hash(self, coinbase): '''Return a (deserialized TX, tx_hash) pair. The hash needs to be reversed for human display; for efficiency we process it in the natural serialized order. ''' start = self.cursor tx = self.my_read_tx(coinbase) tx_id = double_sha256(self.binary[start:self.cursor]) return tx, tx_id
def read_tx(self): start = self.cursor return TxTime( self._read_le_int32(), # version self._read_le_uint32(), # time self._read_inputs(), # inputs self._read_outputs(), # outputs self._read_le_uint32(), # locktime ), double_sha256(self.binary[start:self.cursor])
def read_tx(self): start = self.cursor return TxComment( self._read_le_int32(), # version self._read_le_uint32(), # time self._read_inputs(), # inputs self._read_outputs(), # outputs self._read_le_uint32(), # locktime self._read_varbytes() # txcomment ), double_sha256(self.binary[start:self.cursor])
def header_hash(cls, header): '''Given a header return hash''' header_to_be_hashed = header[:cls.BASIC_HEADER_SIZE] # New block header format has some extra flags in the end if len(header) == cls.HEADER_SIZE_POST_FORK: flags, = struct.unpack('<I', header[-4:]) # Proof of work blocks have special serialization if flags & cls.BLOCK_PROOF_OF_STAKE != 0: header_to_be_hashed += cls.BLOCK_PROOF_OF_STAKE_FLAGS return double_sha256(header_to_be_hashed)
def _read_tx_parts(self): '''Return a (deserialized TX, tx_hash, vsize) tuple.''' start = self.cursor marker = self.binary[self.cursor + 4] if marker: tx = self._read_tx() tx_hash = double_sha256(self.binary[start:self.cursor]) return tx, tx_hash, self.binary_length # Ugh, this is nasty. version = self._read_le_int32() orig_ser = self.binary[start:self.cursor] marker = self._read_byte() flag = self._read_byte() start = self.cursor inputs = self._read_inputs() outputs = self._read_outputs() orig_ser += self.binary[start:self.cursor] base_size = self.cursor - start witness = self._read_witness(len(inputs)) start = self.cursor locktime = self._read_le_uint32() # FLO -> if version >= 2: tx_comment = self._read_varbytes() else: tx_comment = "" # <- FLO orig_ser += self.binary[start:self.cursor] vsize = (3 * base_size + self.binary_length) // 4 return TxFloSegWit(version, marker, flag, inputs, outputs, witness, locktime, tx_comment), double_sha256(orig_ser), vsize
def read_tx(self): '''Return a (Deserialized TX, TX_HASH) pair. The hash needs to be reversed for human display; for efficiency we process it in the natural serialized order. ''' start = self.cursor return Tx( self._read_le_int32(), # version self._read_inputs(), # inputs self._read_outputs(), # outputs self._read_le_uint32() # locktime ), double_sha256(self.binary[start:self.cursor])
def __init__(self, env, peer_mgr): super().__init__() self.coin = env.coin self.peer_mgr = peer_mgr # If this isn't something a peer or client expects # then you won't appear in the client's network dialog box self.channel = env.coin.IRC_CHANNEL self.prefix = env.coin.IRC_PREFIX self.nick = '{}{}'.format( self.prefix, env.irc_nick if env.irc_nick else double_sha256(env.host.encode())[:5].hex()) self.peer_regexp = re.compile('({}[^!]*)!'.format(self.prefix))
def read_block(self): tx_hashes = [] txs = [] tx_count = self.read_varint() for n in range(tx_count): start = self.cursor tx = self.read_tx() # Note this hash needs to be reversed for human display # For efficiency we store it in the natural serialized order tx_hash = double_sha256(self.binary[start:self.cursor]) tx_hashes.append(tx_hash) txs.append(tx) return tx_hashes, txs
def read_tx(self): '''Return a (Deserialized TX, TX_HASH) pair. The hash needs to be reversed for human display; for efficiency we process it in the natural serialized order. ''' start = self.cursor version = self._get_version() if version != self.bitcoin_diamond_tx_version: return Tx( self._read_le_int32(), # version self._read_inputs(), # inputs self._read_outputs(), # outputs self._read_le_uint32() # locktime ), double_sha256(self.binary[start:self.cursor]) else: return TxBitcoinDiamond( self._read_le_int32(), # version hash_to_str(self._read_nbytes(32)), # blockhash self._read_inputs(), # inputs self._read_outputs(), # outputs self._read_le_uint32() # locktime ), double_sha256(self.binary[start:self.cursor])
def read_tx(self): start = self.cursor base_tx = TxJoinSplit( self._read_le_int32(), # version self._read_inputs(), # inputs self._read_outputs(), # outputs self._read_le_uint32() # locktime ) if base_tx.version >= 2: joinsplit_size = self._read_varint() if joinsplit_size > 0: self.cursor += joinsplit_size * 1802 # JSDescription self.cursor += 32 # joinSplitPubKey self.cursor += 64 # joinSplitSig return base_tx, double_sha256(self.binary[start:self.cursor])
def read_tx(self): start = self.cursor version = self._read_le_int32() inputs = self._read_inputs() outputs = self._read_outputs() locktime = self._read_le_uint32() if version > 1: time = self._read_le_uint32() else: time = 0 return TxTime( version, time, inputs, outputs, locktime, ), double_sha256(self.binary[start:self.cursor])
def header_hash(cls, header): '''Given a header return hash''' return double_sha256(header)
def header_hash(cls, header): '''Given a header return hash''' return double_sha256(header[:cls.BASIC_HEADER_SIZE])
def test_double_sha256(): assert lib_hash.double_sha256( b'double_sha256' ) == b'ksn\x8e\xb7\xb9\x0f\xf6\xd9\xad\x88\xd9#\xa1\xbcU(j1Bx\xce\xd5;s\xectL\xe7\xc5\xb4\x00'