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, )
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)))
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, )
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