2个版本

0.1.2 2023年6月10日
0.1.1 2023年4月14日
0.1.0 2023年4月14日

#3 in #XRPL

MIT 许可证

40KB
1K SLoC

XRPL

XRPL账本的JSON RPC交互的多线程WebSocket客户端库。客户端核心维护单个WebSocket连接,但可以通过单个函数调用对JSON RPC进行原子请求,或使用返回监听器接收消息的函数进行订阅。这些功能通过使用tokio-tungstenite的WebSocket实现,以及使用tokio::sync实现的通道来实现。

路线图

  • 连接到账本,并执行基本RPC请求 ✅
    • 打开并维护到账本的WebSocket连接 ✅
    • 执行信息原子JSON RPC请求 ✅
    • 使用专用监听器进行订阅请求 ✅
  • 实现钱包
    • 从熵创建新钱包
    • 从种子推导钱包
  • 实现交易
    • 创建类型安全的交易构建器
    • 使用钱包签名交易

用法

此客户端库被编写为尽可能接近JavaScript客户端。JavaScript库的一个常见示例如下

import { Client } from "xrpl";

async function main() {
  const client = new Client("wss://xrpl.ws");
  const res = await client.request({
    command: "account_info",
    account: "r...",
  });
  console.log(res);
}

使用此客户端,可以执行相同的请求

use xrpl::{XrplClient, request};

#[tokio::main]
async fn main() {
    let account = "r..."; // an xrpl address
    let client = XrplClient::new("wss://xrpl.ws").await.unwrap();
    let server_info = client.request(request::AccountInfo { account: "r...".into(), ..Default::default() }).await;
    println!("{server_info}");
}

另一方面,订阅的处理方式略有不同。在JavaScript中,订阅可能看起来像这样

import { Client } from "xrpl";

async function main() {
  const client = new Client("wss://xrpl.ws");
  const subscription_res = await client.request({
    command: "subscribe",
    streams: ["ledger"],
  });
  console.log(subscription_res); // an acknowledgement message wiht some relevant data
  client.on("ledgerClosed", (msg) => console.log(msg)); // the actual messages, delivered via a callback
}

在此库中,相同的订阅可能看起来像这样

async fn main() {
    let client = XrplClient::new("wss://xrpl.ws").await.unwrap();
    let (subscription_res, receiver) = client.request(subscription::LedgerClosed).await;
    println!("{subscription_res:?}"); // the acknowledgement message with data etc...
    loop {
          let msg = receiver.recv().await;
          match msg {
              Ok(msg) => println!("{msg:#?}"), // the actual messages
              Err(e) => {
                  eprintln!("{e:#?}");
                  break;
              }
          }
      }
}

接收器使用mpsc::broadcast实现,因此可以通过receiver.resubscribe()或移动到不同的线程等简单地克隆。

依赖项

~6–16MB
~221K SLoC