Ejemplo n.º 1
0
    def get_receipt(self, db, i):
        t = trie.Trie(db, self.meta.hash_evm_receipt_root)
        receipt = rlp.decode(t.get(rlp.encode(i)),
                             quarkchain.evm.messages.Receipt)
        if receipt.contract_address != b"":
            contract_address = Address(receipt.contract_address,
                                       receipt.contract_full_shard_id)
        else:
            contract_address = Address.create_empty_account(full_shard_id=0)

        if i > 0:
            prev_gas_used = rlp.decode(t.get(
                rlp.encode(i - 1)), quarkchain.evm.messages.Receipt).gas_used
        else:
            prev_gas_used = self.meta.evm_cross_shard_receive_gas_used

        logs = [
            Log.create_from_eth_log(eth_log, self, tx_idx=i, log_idx=j)
            for j, eth_log in enumerate(receipt.logs)
        ]

        return TransactionReceipt(
            receipt.state_root,
            receipt.gas_used,
            prev_gas_used,
            contract_address,
            receipt.bloom,
            logs,
        )
Ejemplo n.º 2
0
def run_test(name, pairs):
    Logger.debug('testing %s' % name)

    def _dec(x):
        if isinstance(x, str) and x.startswith('0x'):
            return bytes.fromhex(str(x[2:]))
        if isinstance(x, str):
            return bytes(x, "ascii")
        return x

    pairs['in'] = [(_dec(k), _dec(v)) for k, v in pairs['in']]
    deletes = [(k, v) for k, v in pairs['in'] if v is None]

    N_PERMUTATIONS = 100
    for i, permut in enumerate(itertools.permutations(pairs['in'])):
        if i > N_PERMUTATIONS:
            break
        if pairs.get('nopermute', None) is not None and pairs['nopermute']:
            permut = pairs['in']
            N_PERMUTATIONS = 1
        t = trie.Trie(InMemoryDb())
        for k, v in permut:
            # logger.debug('updating with (%s, %s)' %(k, v))
            if v is not None:
                t.update(k, v)
            else:
                t.delete(k)
        # make sure we have deletes at the end
        for k, v in deletes:
            t.delete(k)
        if pairs['root'] != '0x' + t.root_hash.hex():
            raise Exception("Mismatch: %r %r %r %r" %
                            (name, pairs['root'], '0x' + t.root_hash.hex(),
                             (i, list(permut) + deletes)))
Ejemplo n.º 3
0
    def get_receipt(self, db, i,
                    x_shard_receive_tx_list: typing.Optional[HashList]):
        t = trie.Trie(db, self.meta.hash_evm_receipt_root)
        receipt = rlp.decode(t.get(rlp.encode(i)),
                             quarkchain.evm.messages.Receipt)
        if receipt.contract_address != b"":
            contract_address = Address(receipt.contract_address,
                                       receipt.contract_full_shard_key)
        else:
            contract_address = Address.create_empty_account(full_shard_key=0)

        if i > 0:
            prev_gas_used = rlp.decode(t.get(
                rlp.encode(i - 1)), quarkchain.evm.messages.Receipt).gas_used
        else:
            prev_gas_used = self.meta.evm_cross_shard_receive_gas_used

        if i < len(self.tx_list):
            tx_hash = self.tx_list[i].get_hash()
        elif x_shard_receive_tx_list is not None:
            tx_hash = x_shard_receive_tx_list.hlist[i - len(self.tx_list)]
        else:
            # possible in older version of database. return a fake receipt instead
            return TransactionReceipt.create_empty_receipt()
        logs = [
            Log.create_from_eth_log(eth_log,
                                    self,
                                    tx_hash,
                                    tx_idx=i,
                                    log_idx=j)
            for j, eth_log in enumerate(receipt.logs)
        ]

        return TransactionReceipt(
            receipt.state_root,
            receipt.gas_used,
            prev_gas_used,
            contract_address,
            receipt.bloom,
            logs,
        )
Ejemplo n.º 4
0
def mk_receipt_sha(receipts, db):
    t = trie.Trie(db)
    for i, receipt in enumerate(receipts):
        t.update(rlp.encode(i), rlp.encode(receipt))
    return t.root_hash