def test_block_fromjson(): sender, recipient = Key(), Key() trx = Transaction(sender.address, sender.public_key, recipient.address, 'Hello world') trx.sign(sender.private_key) block = Node.mine_block(0, 0, [trx]) block2 = Block.from_json(block.json()) assert block.index == block2.index
def post(self): #: find the longest chain max_height, target_peer = 0, None for peer in peers: res = requests.get(peer + "/chain/height/") height = int(res.json()['data']) if height > max_height: max_height, target_peer = height, peer #: fetch the blocks from target peer if max_height > node.chain.height: logging.info('found longer chain %d. replace mine %d', max_height, node.chain.height) res = requests.get(target_peer + '/block/') block_docs = res.json()['data'] node.chain.blocks = [Block.from_json(doc) for doc in block_docs] self.write(ok())
def get_block(self, number: int) -> Block: """ Gets a block by its block height :param number: The block height of the block to get :return: The list of transactions in the block, returns None if number is past chainhead """ block = self.make_json_rpc_call(Blockchain.GET_BLOCK_METHOD, [hex(number), True]) if "transactions" not in block: logging.error( f'Invalid block at height {number} from {self.endpoint}: {block}' ) result_block = Block.from_json(block) # Inject transaction receipt data for contract calls and deployments for transaction in result_block.get_transactions(): if transaction.is_contract_call( ) or transaction.is_contract_deployment(): transaction.insert_tx_receipt_data( self.get_transaction_receipt(transaction.get_txid())) return result_block
def message(self, pubnub, message_object): if message_object.channel == 'BLOCK': sender_addr = message_object.message["sender_address"] if sender_addr != self.keychain.address: print( f'\nBlock empfangen von Node: {sender_addr} -> {Block.from_json(message_object.message["block"])}' ) block = Block.from_json(message_object.message["block"]) new_chain = self.blockchain.chain[:] new_chain.append(block) try: self.blockchain.replace_chain(Blockchain(new_chain), self.entry_pool) self.entry_pool.filter(self.blockchain) print('\nBlockchain ergänzt') except Exception as e: print(f'\nFehler bei Ergänzung -> {e}') if message_object.channel == 'ENTRY': try: entry = json_to_entry(message_object.message) self.entry_pool.add_entry(entry) print(f'\nEintrag empfangen: {entry}') except Exception as e: print(f'\nFehler beim Empfangen eines Eintrags -> {e}') if message_object.channel == 'CHAIN': recipient_addr = message_object.message["recipient_address"] if recipient_addr == self.keychain.address: self.chain_syncher.add_chain(message_object.message["chain"]) print('\nChain empfangen') if message_object.channel == 'SYNC': sender_addr = message_object.message["sender_address"] if self.keychain.address != sender_addr: self.p2p.send_chain(self.blockchain, sender_addr) print(f'\nChain gesendet an Node: {sender_addr}')
def from_json(chain_json): blockchain = Blockchain() blockchain.chain =list( map(lambda block_json: Block.from_json(block_json), chain_json) ) return blockchain
def from_json(cls, json_data): chain = [] for block_data in json_data['chain']: chain.append(Block.from_json(block_data)) return Chain(chain=chain, current_data=json_data['current_data'])