def test_can_add_node_declaration_block( forced_memory_blockchain: MemoryBlockchain, user_account_key_pair: KeyPair, ): blockchain = forced_memory_blockchain user_account = user_account_key_pair.public request0 = NodeDeclarationSignedChangeRequest.create( identifier=hexstr('abcd'), network_addresses=['127.0.0.1'], fee_amount=3, signing_key=user_account_key_pair.private) block0 = Block.create_from_signed_change_request(blockchain, request0) blockchain.add_block(block0) assert blockchain.get_current_node(user_account) == request0.message.node blockchain.snapshot_blockchain_state() assert blockchain.blockchain_states[-1].get_node( user_account) == request0.message.node request1 = NodeDeclarationSignedChangeRequest.create( identifier=hexstr('abcd'), network_addresses=['127.0.0.2', '192.168.0.34'], fee_amount=3, signing_key=user_account_key_pair.private) block1 = Block.create_from_signed_change_request(blockchain, request1) blockchain.add_block(block1) assert blockchain.get_current_node(user_account) == request1.message.node blockchain.snapshot_blockchain_state() assert blockchain.blockchain_states[-1].get_node( user_account) == request1.message.node
def test_node_identifier_is_removed_when_node_declaration_signed_change_request_is_serialized( memory_blockchain, user_account_key_pair): request = NodeDeclarationSignedChangeRequest.create( identifier=hexstr('abcd'), network_addresses=['127.0.0.1'], fee_amount=3, fee_account=hexstr('dcba'), signing_key=user_account_key_pair.private) block = Block.create_from_signed_change_request(memory_blockchain, request) compact_dict = block.to_compact_dict() assert ck('identifier') not in compact_dict[ck('message')][ck( 'signed_change_request')][ck('message')][ck('node')]
def test_node_declaration_signed_change_request_valid_network_addresses( user_account_key_pair, network_address, forced_memory_blockchain): request = NodeDeclarationSignedChangeRequest.create( network_addresses=[network_address], fee_amount=3, fee_account=hexstr('be10aa7e'), signing_key=user_account_key_pair.private) request.validate(forced_memory_blockchain, block_number=0)
def test_node_declaration_signed_change_request_validate_negative_fee_amount( user_account_key_pair, forced_memory_blockchain): request = NodeDeclarationSignedChangeRequest.create( network_addresses=[], fee_amount=-3, fee_account=hexstr('be10aa7e'), signing_key=user_account_key_pair.private) with pytest.raises(ValidationError, match='Node fee_amount must be greater or equal to 0'): request.validate(forced_memory_blockchain, block_number=0)
def test_node_declaration_signed_change_request_validate_fee_account_is_hexadecimal( user_account_key_pair, forced_memory_blockchain): request = NodeDeclarationSignedChangeRequest.create( network_addresses=[], fee_amount=3, fee_account=hexstr('non-hexadecimal'), signing_key=user_account_key_pair.private) with pytest.raises(ValidationError, match='Node fee_account must be hexadecimal string'): request.validate(forced_memory_blockchain, block_number=0)
def test_create_node_declaration_block(memory_blockchain, user_account_key_pair): request = NodeDeclarationSignedChangeRequest.create( identifier=hexstr('abcd'), network_addresses=['127.0.0.1'], fee_amount=3, fee_account=hexstr('dcba'), signing_key=user_account_key_pair.private) block = Block.create_from_signed_change_request(memory_blockchain, request) assert block assert block.message.signed_change_request assert block.message.signed_change_request.signer assert block.message.signed_change_request.signature assert block.message.signed_change_request.message assert block.message.signed_change_request.message.node.network_addresses == [ '127.0.0.1' ] assert block.message.signed_change_request.message.node.fee_amount == 3 assert block.message.signed_change_request.message.node.fee_account == hexstr( 'dcba')
def test_node_declaration_signed_change_request_validate_network_addresses_scheme( user_account_key_pair, forced_memory_blockchain): request = NodeDeclarationSignedChangeRequest.create( network_addresses=['ftp://my.domain.com/'], fee_amount=3, fee_account=hexstr('be10aa7e'), signing_key=user_account_key_pair.private) with pytest.raises( ValidationError, match='Node network_addresses scheme must be one of http, https'): request.validate(forced_memory_blockchain, block_number=0)
def test_node_declaration_signed_change_request_validate_empty_network_addresses( user_account_key_pair, network_addresses, forced_memory_blockchain): request = NodeDeclarationSignedChangeRequest.create( network_addresses=[network_addresses], fee_amount=3, fee_account=hexstr('be10aa7e'), signing_key=user_account_key_pair.private) with pytest.raises(ValidationError, match='Node network_addresses must be not empty'): request.validate(forced_memory_blockchain, block_number=0)
def test_can_create_node_declaration_signed_change_request( user_account_key_pair): request = NodeDeclarationSignedChangeRequest.create( network_addresses=['127.0.0.1'], fee_amount=3, fee_account=hexstr('be10aa7e'), signing_key=user_account_key_pair.private) assert request assert request.signer assert request.signature assert request.message assert request.message.node.network_addresses == ['127.0.0.1'] assert request.message.node.fee_amount == 3 assert request.message.node.fee_account == 'be10aa7e'
def test_validate_account_root_files_raises( forced_memory_blockchain: MemoryBlockchain, ): blockchain = forced_memory_blockchain assert blockchain.blockchain_states for balance in blockchain.blockchain_states[0].account_states.values(): balance.balance_lock = hexstr() with pytest.raises(ValidationError, match='Account state balance_lock must be not empty'): blockchain.validate_account_root_files() blockchain.blockchain_states = [] with pytest.raises( ValidationError, match='Blockchain must contain at least one account root file'): blockchain.validate_account_root_files()
def retrieve(self, request, pk: str = None): assert pk is not None blockchain = BlockchainBase.get_instance() node_id = hexstr(pk.lower()) if node_id == PRIMARY_VALIDATOR_NODE_ID: node = blockchain.get_primary_validator() elif node_id == SELF_NODE_ID: node = blockchain.get_node_by_identifier( identifier=get_node_identifier()) else: node = blockchain.get_node_by_identifier(identifier=node_id) if node is None: raise NotFound(detail='Node not found') serializer = self.serializer_class(node) return Response(serializer.data)
def primary_validator_key_pair() -> KeyPair: return KeyPair( public=hexstr('b9dc49411424cce606d27eeaa8d74cb84826d8a1001d17603638b73bdc6077f1'), private=hexstr('98d6b2744d93245e48e336b7d24a316947005b00805c776cff9946109c194675'), )
def node_key_pair() -> KeyPair: return KeyPair( public=hexstr('1c8e5f54a15b63a9f3d540ce505fd0799575ffeaac62ce625c917e6d915ea8bb'), private=hexstr('d0a03fea134f3f83901f36071f79026b2224a7f926546486f72104351dc23432'), )
from datetime import datetime from thenewboston_node.core.utils.cryptography import KeyPair from thenewboston_node.core.utils.types import hexstr from ..blockchain.memory_blockchain import MemoryBlockchain from ..models import ( AccountState, Block, BlockchainState, CoinTransferSignedChangeRequest, NodeDeclarationSignedChangeRequest, PrimaryValidator, RegularNode ) TREASURY_KEY_PAIR = KeyPair( public=hexstr('00f3d2477317d53bcc2a410decb68c769eea2f0d74b679369b7417e198bd97b6'), private=hexstr('f94fbd639d9507f544fb27b79b5344a2d7b461e333053ed1be45b90c988e6355'), ) REGULAR_NODE_KEY_PAIR = KeyPair( public=hexstr('accf7efe1b2ae044f25b98c38cffa3d6992b82e271c71353df549cbab7abaaf9'), private=hexstr('0e92ed657cafd81a51cc32b867af259d8aca2446dd31d1598f0467a15904187b'), ) PV_KEY_PAIR = KeyPair( public=hexstr('657cf373f6f8fb72854bd302269b8b2b3576e3e2a686bd7d0a112babaa1790c6'), private=hexstr('5ef5773228743963817f79ea4a4b1e7c1a270f781af44fd141dc68193bce1228'), ) PV_FIN_ACCOUNT_KEY_PAIR = KeyPair( public=hexstr('7a5dc06babda703a7d2d8ea18d3309a0c5e6830a25bac03e69633d283244e001'), private=hexstr('d41f52e67645aea0657e2c324efa88a7583310d1e8e7e616bb1233fffeba5151'), )
def get_type_compact_transform_map(): return { CompactableMixin: lambda type_, value: type_.to_compact_values(value), hexstr: lambda type_, value: hexstr(value).to_bytes(), }
def treasury_account_key_pair() -> KeyPair: return KeyPair( public=hexstr('4d3cf1d9e4547d324de2084b568f807ef12045075a7a01b8bec1e7f013fc3732'), private=hexstr('1104d51eb539e66fa108f99d18ab179aa98c10678961821ddd87bfdbf351cb79'), )
BLOCKCHAIN_STATE_MODELS = ( models.BlockchainState, models.AccountState, ) TYPE_NAME_MAP = { 'str': 'string', 'int': 'integer', 'dict': 'object', 'list': 'array', 'tuple': 'array', } BLOCK_SAMPLE = models.Block( signer=hexstr( '4d3cf1d9e4547d324de2084b568f807ef12045075a7a01b8bec1e7f013fc3732'), message_hash=hexstr( '9677f4cbd7aaf32ba9615416f7bd0991b7de1434a7fa2c31add25c3355ef3959'), signature=hexstr( 'd1c49087103b631a58228bdf8fb70d4789259cf22d815e207660cfe8d478ad' 'ad9c7affe587942203e08be1dc1e14c6dd5a8abd8640f328e45f667a91a7c06a06'), message=models.BlockMessage( block_type=BlockType.COIN_TRANSFER.value, block_identifier=hexstr( 'd606af9d1d769192813d71051148ef1896e3d85062c31ad3e62331e25d9c96bc' ), block_number=0, timestamp=datetime.datetime(2021, 1, 1), signed_change_request=models.CoinTransferSignedChangeRequest( message=models.CoinTransferSignedChangeRequestMessage( balance_lock=hexstr(
def user_account_key_pair() -> KeyPair: return KeyPair( public=hexstr('97b369953f665956d47b0a003c268ad2b05cf601b8798210ca7c2423afb9af78'), private=hexstr('f450b3082201544bc9348e862b818d3423857c0eb7bec5d00751098424186454'), )
def hash_normalized_dict(normalized_dict: bytes) -> hexstr: return hexstr(sha3_256(normalized_dict).digest().hex())