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 subxtpyTo build the library locally, maturin needs to be installed:
# For ubuntu, run the below first:
# pip install patchelf
pip install maturinThe following command will build the package locally:
maturin developUse 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.scaleThis 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.