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.
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. | ✅ |
The package has been published on pypi and can be installed by running:
pip install --upgrade subxtpy
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
Use the subxt-cli
tool to download the metadata for your target runtime from a node.
- Install:
cargo install subxt-cli
- 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.
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())
For more details regarding utilizing subxtpy
, please visit the documentation.
We wrote some tests by following the examples provided in the official subxt repo. These tests can be run by running:
- 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
- Running the python tests, which connect to the local node:
pip install -r requirements.txt pytest
Contributions to subxtpy
are welcome! If you encounter any issues or have suggestions for improvements, please open an issue or submit a pull request.
Here's a simple usage of the library with Flask to build an API for blockchain interaction.
The entire code within this repository is licensed under the Apache-2.0 license. See the LICENSE file for more details.