Ejemplo n.º 1
0
    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])
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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}
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
    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])
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    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
Ejemplo n.º 9
0
    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])
Ejemplo n.º 10
0
    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])
Ejemplo n.º 11
0
    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)
Ejemplo n.º 12
0
    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
Ejemplo n.º 13
0
    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])
Ejemplo n.º 14
0
    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))
Ejemplo n.º 15
0
 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
Ejemplo n.º 16
0
    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])
Ejemplo n.º 17
0
 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])
Ejemplo n.º 18
0
    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])
Ejemplo n.º 19
0
 def header_hash(cls, header):
     '''Given a header return hash'''
     return double_sha256(header)
Ejemplo n.º 20
0
 def header_hash(cls, header):
     '''Given a header return hash'''
     return double_sha256(header[:cls.BASIC_HEADER_SIZE])
Ejemplo n.º 21
0
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'