Skip to content

Latest commit

 

History

History
117 lines (83 loc) · 4.84 KB

README.md

File metadata and controls

117 lines (83 loc) · 4.84 KB

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. ⏳ (Upcoming)

Usage

Installation

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

pip install subxtpy

Local Testing

To build the library locally, maturin needs to be installed. 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

We will be providing guides for various real-world use cases here.

License

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