#soroban #stellar #smart-contracts #client-server #rust

rs-soroban-client

用于与Stellar区块链上的Soroban智能合约交互的高级Rust客户端库

1 个不稳定版本

0.1.0 2023年6月24日

#29#stellar

Apache-2.0

47KB

Rust Soroban 客户端库

Soroban Logo

用于与Stellar区块链上的Soroban智能合约交互的Rust客户端库

描述

该库由3个组件组成:

  1. rs-stellar-xdr:用于编码/解码XDR数据的基础库。这已经由Stellar核心团队开发。
  2. rs-stellar-base:一个提供用于读取、写入、散列和签名Stellar网络中使用的原始XDR构造函数的全面函数集的库。它为构建和签名事务提供了一个很好的抽象。
  3. rs-soroban-client:用于提交事务的Horizon客户端。

该库将使开发者能够无缝地将Soroban功能集成到基于Rust的应用和服务中。Stellar团队已经通过构建xdr库和Rust stellar strkey实现铺平了大部分基础。这个特定的库是Soroban和整个Rust社区在Stellar生态系统中的缺失部分。

该库的实际应用场景,假设有人想构建一个针对Soroban自身构建的DEX的交易机器人。该机器人会在短时间内执行大量交易,通常利用市场低效和价格差异。Soroban的Rust客户端库将为人提供一套高性能的工具集,用于构建交易算法、与Stellar网络交互以及以最小延迟执行交易。

库的示例用法

// Submitting a transaction
use soroban_client::Server;
use soroban_client::Networks;
use soroban_client::TransactionBuilder;
use soroban_client::Keypair;

#[tokio::main]
async fn main() {
    let server = Server::new("http://127.0.0.1:8000/soroban/rpc").unwrap();
    let public_key = "..."; // Replace with the actual public key
    let secret_string = "..."; // Replace with the actual secret key
    let contract_id = "..."; // Replace with the actual contract ID

    let account = server.get_account(public_key).await.unwrap();

    // Fee hardcoded for this example.
    let fee = 100;

    let contract = Contract::new(contract_id).unwrap();

    let mut transaction = TransactionBuilder::new(&account, fee, Networks::STANDALONE)
        .add_operation(
            // An operation to call increment on the contract
            contract.call("increment").unwrap(),
        )
        .set_timeout(30)
        .build();

    // Simulate the transaction to discover the storage footprint, and update the
    // transaction to include it. If you already know the storage footprint you
    // can use `add_footprint` to add it yourself, skipping this step.
    transaction = server.prepare_transaction(transaction).await.unwrap();

    // Sign the transaction
    let secret_key = Keypair::from_secret(secret_string).unwrap();
    transaction.sign(&secret_key);

    match server.send_transaction(transaction).await {
        Ok(transaction_result) => {
            println!("{:?}", transaction_result);
        }
        Err(err) => {
            eprintln!("{:?}", err);
        }
    }
}

作者

Rahul Soshte (Twitter)

无运行时依赖