def test_get_account_state_from_blockchain_genesis_state(
    forced_memory_blockchain: MemoryBlockchain, treasury_account_key_pair: KeyPair,
    blockchain_genesis_state: BlockchainState
):
    account = treasury_account_key_pair.public
    assert forced_memory_blockchain.get_account_current_balance(account) == 281474976710656
    assert forced_memory_blockchain.get_account_current_balance(
        account
    ) == blockchain_genesis_state.get_account_balance(account)
Exemplo n.º 2
0
    def handle(self, size, path=None, do_not_validate=False, *args, **options):
        validate = not do_not_validate
        if path:
            os.makedirs(path, exist_ok=True)

            if os.listdir(path):
                raise CommandError(f'Path {path} contains files')

            blockchain = FileBlockchain(base_directory=os.path.abspath(path))
        else:
            blockchain = MemoryBlockchain()

        generate_blockchain(blockchain, size, validate=validate)
def test_yield_blocks_till_snapshot(forced_memory_blockchain: MemoryBlockchain,
                                    blockchain_genesis_state):

    forced_memory_blockchain.blocks = [
        CoinTransferBlockFactory(message=CoinTransferBlockMessageFactory(
            block_number=x, block_identifier=str(x)))  # type: ignore
        for x in range(9)
    ]
    account_root_files = forced_memory_blockchain.blockchain_states
    assert len(account_root_files) == 1
    assert forced_memory_blockchain.get_last_blockchain_state(
    ) == blockchain_genesis_state
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        -1) == blockchain_genesis_state
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot()
    ] == [8, 7, 6, 5, 4, 3, 2, 1, 0]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(5)
    ] == [5, 4, 3, 2, 1, 0]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(1)
    ] == [1, 0]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(0)
    ] == [0]

    account_root_file1 = copy.deepcopy(blockchain_genesis_state)
    account_root_file1.last_block_number = 3
    forced_memory_blockchain.blockchain_states.append(account_root_file1)

    assert len(account_root_files) == 2
    assert forced_memory_blockchain.get_last_blockchain_state(
    ) == account_root_file1
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        -1) == blockchain_genesis_state
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        0) == blockchain_genesis_state
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        1) == blockchain_genesis_state
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        2) == blockchain_genesis_state
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        3) == blockchain_genesis_state
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        4) == account_root_file1

    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot()
    ] == [8, 7, 6, 5, 4]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(5)
    ] == [5, 4]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(3)
    ] == []
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(2)
    ] == [2, 1, 0]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(1)
    ] == [1, 0]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(0)
    ] == [0]

    account_root_file2 = copy.deepcopy(blockchain_genesis_state)
    account_root_file2.last_block_number = 5
    forced_memory_blockchain.blockchain_states.append(account_root_file2)

    assert len(account_root_files) == 3
    assert forced_memory_blockchain.get_last_blockchain_state(
    ) == account_root_file2
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        -1) == blockchain_genesis_state
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        0) == blockchain_genesis_state
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        1) == blockchain_genesis_state
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        2) == blockchain_genesis_state
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        3) == blockchain_genesis_state
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        4) == account_root_file1
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        5) == account_root_file1
    assert forced_memory_blockchain.get_blockchain_state_by_block_number(
        6) == account_root_file2

    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot()
    ] == [8, 7, 6]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(8)
    ] == [8, 7, 6]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(7)
    ] == [7, 6]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(6)
    ] == [6]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(5)
    ] == []
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(4)
    ] == [4]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(3)
    ] == []
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(2)
    ] == [2, 1, 0]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(1)
    ] == [1, 0]
    assert [
        block.message.block_number
        for block in forced_memory_blockchain.yield_blocks_till_snapshot(0)
    ] == [0]
Exemplo n.º 4
0
def test_get_latest_account_root_file(
        forced_memory_blockchain: MemoryBlockchain, blockchain_genesis_state):
    account_root_files = forced_memory_blockchain.blockchain_states
    assert len(account_root_files) == 1
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
    ) == blockchain_genesis_state
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        -1) == blockchain_genesis_state

    account_root_file1 = copy.deepcopy(blockchain_genesis_state)
    account_root_file1.last_block_number = 3
    forced_memory_blockchain.blockchain_states.append(account_root_file1)

    assert len(account_root_files) == 2
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
    ) == account_root_file1
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        -1) == blockchain_genesis_state
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        0) == blockchain_genesis_state
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        1) == blockchain_genesis_state
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        2) == blockchain_genesis_state
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        3) == blockchain_genesis_state
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        4) == account_root_file1

    account_root_file2 = copy.deepcopy(blockchain_genesis_state)
    account_root_file2.last_block_number = 5
    forced_memory_blockchain.blockchain_states.append(account_root_file2)

    assert len(account_root_files) == 3
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
    ) == account_root_file2
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        -1) == blockchain_genesis_state
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        0) == blockchain_genesis_state
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        1) == blockchain_genesis_state
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        2) == blockchain_genesis_state
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        3) == blockchain_genesis_state
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        4) == account_root_file1
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        5) == account_root_file1
    assert forced_memory_blockchain.get_closest_blockchain_state_snapshot(
        6) == account_root_file2
Exemplo n.º 5
0
def memory_blockchain(blockchain_genesis_state):
    blockchain = MemoryBlockchain()
    blockchain.add_blockchain_state(blockchain_genesis_state)
    blockchain.validate()
    yield blockchain
Exemplo n.º 6
0
def test_partial_blockchain(primary_validator, preferred_node):
    account1_key_pair = generate_key_pair()
    account2_key_pair = generate_key_pair()
    account3_key_pair = generate_key_pair()
    new_account_key_pair = generate_key_pair()

    fake_lock1, _ = generate_key_pair()
    fake_lock2, _ = generate_key_pair()
    fake_lock3, _ = generate_key_pair()

    base_account_root_file = BlockchainState(
        account_states={
            account1_key_pair.public: AccountState(balance=1000, balance_lock=fake_lock1),
            account2_key_pair.public: AccountState(balance=2000, balance_lock=fake_lock2),
            account3_key_pair.public: AccountState(balance=3000, balance_lock=fake_lock3),
        },
        last_block_number=1234,
        last_block_identifier='23203d245b5e128465669223b5220b3061af1e2e72b0429ef26b07ce3a2282e7',
        last_block_timestamp=datetime.utcnow(),
        next_block_identifier='626dea61c1a6480d6a4c9cd657c7d7be52ddc38e5f2ec590b609ac01edde62fd',
    )

    blockchain = MemoryBlockchain(account_root_files=[base_account_root_file])
    assert blockchain.get_block_count() == 0
    assert blockchain.get_account_current_balance(account1_key_pair.public) == 1000
    assert blockchain.get_account_current_balance(account2_key_pair.public) == 2000
    assert blockchain.get_account_current_balance(account3_key_pair.public) == 3000
    assert blockchain.get_account_current_balance(new_account_key_pair.public) == 0
    blockchain.validate()

    signed_change_request1 = CoinTransferSignedChangeRequest.from_main_transaction(
        blockchain=blockchain,
        recipient=account2_key_pair.public,
        amount=10,
        signing_key=account1_key_pair.private,
        primary_validator=primary_validator,
        node=preferred_node
    )
    signed_change_request1.validate(blockchain, blockchain.get_next_block_number())
    blockchain.add_block_from_signed_change_request(signed_change_request1, get_node_signing_key())
    blockchain.validate()

    assert blockchain.get_block_count() == 1
    assert blockchain.get_account_current_balance(account1_key_pair.public) == 1000 - 10 - 4 - 1
    assert blockchain.get_account_current_balance(account2_key_pair.public) == 2000 + 10
    assert blockchain.get_account_current_balance(account3_key_pair.public) == 3000
    assert blockchain.get_account_current_balance(new_account_key_pair.public) == 0

    signed_change_request2 = CoinTransferSignedChangeRequest.from_main_transaction(
        blockchain=blockchain,
        recipient=new_account_key_pair.public,
        amount=20,
        signing_key=account2_key_pair.private,
        primary_validator=primary_validator,
        node=preferred_node
    )
    signed_change_request2.validate(blockchain, blockchain.get_next_block_number())
    blockchain.add_block_from_signed_change_request(signed_change_request2, get_node_signing_key())
    blockchain.validate()

    assert blockchain.get_block_count() == 2
    assert blockchain.get_account_current_balance(account1_key_pair.public) == 1000 - 10 - 4 - 1
    assert blockchain.get_account_current_balance(account2_key_pair.public) == 2000 + 10 - 20 - 4 - 1
    assert blockchain.get_account_current_balance(account3_key_pair.public) == 3000
    assert blockchain.get_account_current_balance(new_account_key_pair.public) == 20

    blockchain.snapshot_blockchain_state()
    blockchain.validate()

    assert blockchain.get_account_current_balance(account1_key_pair.public) == 1000 - 10 - 4 - 1
    assert blockchain.get_account_current_balance(account2_key_pair.public) == 2000 + 10 - 20 - 4 - 1
    assert blockchain.get_account_current_balance(account3_key_pair.public) == 3000
    assert blockchain.get_account_current_balance(new_account_key_pair.public) == 20

    signed_change_request3 = CoinTransferSignedChangeRequest.from_main_transaction(
        blockchain=blockchain,
        recipient=account2_key_pair.public,
        amount=30,
        signing_key=account3_key_pair.private,
        primary_validator=primary_validator,
        node=preferred_node
    )
    signed_change_request3.validate(blockchain, blockchain.get_next_block_number())
    blockchain.add_block_from_signed_change_request(signed_change_request3, get_node_signing_key())
    blockchain.validate()

    assert blockchain.get_account_current_balance(account1_key_pair.public) == 1000 - 10 - 4 - 1
    assert blockchain.get_account_current_balance(account2_key_pair.public) == 2000 + 10 - 20 - 4 - 1 + 30
    assert blockchain.get_account_current_balance(account3_key_pair.public) == 3000 - 30 - 4 - 1
    assert blockchain.get_account_current_balance(new_account_key_pair.public) == 20