def get_block(self, index): block = Block.deserialize(self.root.get(World.HEADER_PREFIX + struct.pack('>L', index)), header_only=True) prefix = World.BLOCK_TRANSACTION_PREFIX + struct.pack('>L', index) txs = list(self.root.iterator(prefix=prefix, include_key=False)) block.transactions = [ Transaction.deserialize(self.root.get(tx)) for tx in txs ] return block
async def transactions(self, request): if request.method == 'GET': return web.json_response(data=[tx.json() for tx in self.blockchain.transactions]) elif request.method == 'POST': try: tx = Transaction.deserialize(await request.content.read()) self.blockchain.is_valid_transaction(tx) self.transaction_queue.put(tx) return web.json_response(data = {'ok' : True}) except (CommonException, BlockchainException) as e: return web.json_response(data = {'ok' : False, 'error': str(e)})
def _clear_block(self, wb, index): wb.delete(World.HEADER_PREFIX + struct.pack('>L', index)) prefix = World.BLOCK_TRANSACTION_PREFIX + struct.pack('>L', index) balance = {} for tx in self.root.iterator(prefix=prefix, include_value=False): transact = Transaction.deserialize(self.root.get( self.root.get(tx))) addr = transact.address() self._clear_transaction(wb, addr) src = self.resolve(transact.source) dst = self.resolve(transact.destination) if src not in balance: balance[src] = 0 if dst not in balance: balance[dst] = 0 balance[src] += (transact.fee + transact.amount) balance[dst] -= transact.amount wb.delete(tx) for raw, bal in balance.items(): if raw != config.NOWHERE_NAME: self._set_balance(wb, raw, self.get_balance(raw) + bal)
def get_transaction(self, name_address): k = self.root.get(World.SHORTCUT_PREFIX + _tx_key(name_address)) return Transaction.deserialize(self.root.get(k))
def children(self, name_address): prefix = World.TRANSACTION_PREFIX + _tx_key(name_address) + b'|' result = [] for k, v in self.root.iterator(prefix=prefix): result.append(Transaction.deserialize(v)) return result