def get_balance(client: ExonumClient, key: PublicKey) -> int: """The example returns the balance of the wallet.""" # Call the /wallets/info endpoint to retrieve the balance: service_public_api = client.service_public_api( CRYPTOCURRENCY_INSTANCE_NAME) wallet_info = service_public_api.get_service( "v1/wallets/info?pub_key={}".format(key.hex())) ensure_status_code(wallet_info) balance = wallet_info.json( )["wallet_proof"]["to_wallet"]["entries"][0]["value"]["balance"] return balance
def run() -> None: """This example creates a wallet in the Cryptocurrency service, retrieves proofs for the wallet and verifies them. For the example to work, be sure to have `exonum-cryptocurrency-advanced` service instance with name `XNM` deployed.""" client = ExonumClient(hostname="127.0.0.1", public_api_port=8080, private_api_port=8081) with client.protobuf_loader() as loader: # Load and compile proto files: loader.load_main_proto_files() loader.load_service_proto_files(RUST_RUNTIME_ID, CRYPTOCURRENCY_ARTIFACT_NAME, CRYPTOCURRENCY_ARTIFACT_VERSION) instance_id = get_cryptocurrency_instance_id(client) cryptocurrency_message_generator = MessageGenerator( instance_id, CRYPTOCURRENCY_ARTIFACT_NAME, CRYPTOCURRENCY_ARTIFACT_VERSION) alice_keypair = create_wallet(client, cryptocurrency_message_generator, "Alice") service_public_api = client.service_public_api( CRYPTOCURRENCY_INSTANCE_NAME) wallet_info_response = service_public_api.get_service( "v1/wallets/info?pub_key={}".format( alice_keypair.public_key.hex())) ensure_status_code(wallet_info_response) wallet_info = wallet_info_response.json() # `MapProof` to the whole Exonum state hash: proof_to_table = wallet_info["wallet_proof"]["to_table"] # Expected hash of the proof to the table is a state hash of the block: expected_to_table_hash_raw = wallet_info["block_proof"]["block"][ "state_hash"] expected_to_table_hash = Hash( bytes.fromhex(expected_to_table_hash_raw)) # Verify the proof to the table: verify_proof_to_table(proof_to_table, expected_to_table_hash) # `MapProof` to the wallet as a part of the Cryptocurrency schema: proof_to_wallet = wallet_info["wallet_proof"]["to_wallet"] # Expected hash of the proof to the wallet is the value stored in the # proof to the table: expected_to_wallet_hash_raw = wallet_info["wallet_proof"]["to_table"][ "entries"][0]["value"] expected_to_wallet_hash = Hash( bytes.fromhex(expected_to_wallet_hash_raw)) # Verify the proof to the wallet: verify_proof_to_wallet(proof_to_wallet, expected_to_wallet_hash) # `ListProof` for the transactions associtated with the wallet: proof_wallet_history = wallet_info["wallet_history"]["proof"] # Expected hash for the wallet history is the hash stored in the proof # to the wallet: expected_history_hash_raw = wallet_info["wallet_proof"]["to_wallet"][ "entries"][0]["value"]["history_hash"] expected_history_hash = Hash(bytes(expected_history_hash_raw["data"])) # Verify the proof for the wallet history: verify_wallet_history_proof(proof_wallet_history, expected_history_hash)