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)
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]
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
def memory_blockchain(blockchain_genesis_state): blockchain = MemoryBlockchain() blockchain.add_blockchain_state(blockchain_genesis_state) blockchain.validate() yield blockchain
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