2个版本
0.1.2 | 2023年6月10日 |
---|---|
0.1.1 | 2023年4月14日 |
0.1.0 |
|
#3 in #XRPL
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