예제 #1
0
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
예제 #2
0
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')]
예제 #3
0
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)
예제 #4
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)
예제 #5
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)
예제 #6
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')
예제 #7
0
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)
예제 #8
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)
예제 #9
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()
예제 #11
0
    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)
예제 #12
0
def primary_validator_key_pair() -> KeyPair:
    return KeyPair(
        public=hexstr('b9dc49411424cce606d27eeaa8d74cb84826d8a1001d17603638b73bdc6077f1'),
        private=hexstr('98d6b2744d93245e48e336b7d24a316947005b00805c776cff9946109c194675'),
    )
예제 #13
0
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'),
)
예제 #15
0
def get_type_compact_transform_map():
    return {
        CompactableMixin: lambda type_, value: type_.to_compact_values(value),
        hexstr: lambda type_, value: hexstr(value).to_bytes(),
    }
예제 #16
0
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(
예제 #18
0
def user_account_key_pair() -> KeyPair:
    return KeyPair(
        public=hexstr('97b369953f665956d47b0a003c268ad2b05cf601b8798210ca7c2423afb9af78'),
        private=hexstr('f450b3082201544bc9348e862b818d3423857c0eb7bec5d00751098424186454'),
    )
예제 #19
0
def hash_normalized_dict(normalized_dict: bytes) -> hexstr:
    return hexstr(sha3_256(normalized_dict).digest().hex())