Skip to content

Interact with Substrate based nodes in Rust or WebAssembly using Python

License

Notifications You must be signed in to change notification settings

philoniare/subxtpy

Repository files navigation

subxtpy · build Documentation

subxtpy is a Python wrapper for the subxt library. This library leverages the functionality provided by the subxt library to offer a convenient and efficient way to communicate with Substrate-based blockchains in Python.

Features

Feature Description Supported
Submit Extrinsics Submit transactions (extrinsics) to the blockchain.
Read Storage Values Read and iterate over storage values on the blockchain.
Read Constants Fetch constants defined in the runtime metadata.
Call Runtime APIs Call runtime APIs and retrieve their results.
Dynamic Types Use dynamic types based on metadata for more flexible interactions.
Subscribe to Blocks, events Subscribe to new blocks and read the extrinsics and events.

Usage

Installation

The package has been published on pypi and can be installed by running:

pip install --upgrade subxtpy

Local Testing

To build the library locally, maturin needs to be installed:

# For ubuntu, run the below first:
# pip install patchelf
pip install maturin

The following command will build the package locally:

maturin develop

Downloading Metadata from a Substrate Node

Use the subxt-cli tool to download the metadata for your target runtime from a node.

  1. Install:
cargo install subxt-cli
  1. Save the encoded metadata to a file:
subxt metadata -f bytes > artifacts/metadata.scale

This defaults to querying the metadata of a locally running node on the default http://localhost:9933/. If querying a different node, the metadata command accepts a --url argument.

Example Usage

Here is an example of how to use subxtpy to interact with a Substrate-based blockchain:

import asyncio
from subxtpy import SubxtClient, Keypair

async def main():
    client = await SubxtClient.from_url("ws://127.0.0.1:9944")

    # Read a storage value
    value = await client.storage("System", "Account",
                                 ["d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"])
    print(value)

    # Fetch a constant
    constant_value = await client.constant("Balances", "ExistentialDeposit")
    print(constant_value)

    # Call a runtime API
    api_result = await client.runtime_api_call("AccountNonceApi", "account_nonce",
                                               ["e5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a"])
    print(api_result)

    # Sign and submit a transaction
    from_keypair = Keypair.from_secret_key("e5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a")

    remark_payload = ["Hello"]
    transfer_tx_hash = await client.sign_and_submit(from_keypair, "System", "remark", remark_payload)
    print("Remark tx hash:", transfer_tx_hash)

asyncio.run(main())

Subxtpy Documentation

For more details regarding utilizing subxtpy, please visit the documentation.

Testing

We wrote some tests by following the examples provided in the official subxt repo. These tests can be run by running:

  1. Node template locally:
    cargo build --package minimal-template-node --release
    ./target/release/minimal-template-node --dev
    
    # docker version:
    docker build . -t polkadot-sdk-minimal-template
    docker run -p 9944:9944 --rm polkadot-sdk-minimal-template --dev --rpc-external
  2. Running the python tests, which connect to the local node:
    pip install -r requirements.txt
    pytest

Contributing

Contributions to subxtpy are welcome! If you encounter any issues or have suggestions for improvements, please open an issue or submit a pull request.

Real World Usage

Here's a simple usage of the library with Flask to build an API for blockchain interaction.

License

The entire code within this repository is licensed under the Apache-2.0 license. See the LICENSE file for more details.

About

Interact with Substrate based nodes in Rust or WebAssembly using Python

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published