8个版本

0.0.10 2020年4月7日
0.0.9 2020年4月1日
0.0.8 2020年3月26日

#1 in #xrp

MIT 协议

2MB
36K SLoC

JavaScript 32K SLoC // 0.3% comments Rust 4.5K SLoC // 0.0% comments Shell 9 SLoC

Crate Crate Docs

xpring-rs

xpring-rs 是一个Rust客户端库,

  • 执行XRP账本钱包生成/派生的相关离线计算
  • 提供与XRP账本交互的简单接口

架构

alt text

功能

xpring-rs 提供以下功能

  • 钱包生成和派生(基于种子或HD钱包)
  • 地址验证
  • 获取账户余额
  • 发送XRP支付

要求

  • Node.js (10+)

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
xpring = "0.0.10"

用法

注意: xpring-rs 只支持X-Address格式。有关此格式的更多信息,请参阅实用工具部分http://xrpaddress.info

钱包

钱包是xpring-rs中的一个基本模型对象。钱包提供

  • 密钥管理
  • 地址派生
  • 签名功能

钱包可以从种子或助记词以及派生路径派生出来。您还可以生成一个新的随机HD钱包。

钱包派生

xpring-rs可以从种子派生钱包,也可以从助记词和派生路径派生出分层确定性钱包(HD钱包)。

分层确定性钱包

分层确定性钱包是通过助记词和派生路径创建的。只需将助记词和派生路径传递给钱包生成函数即可。请注意,如果您不传递派生路径,则将使用默认路径。

use xpring::{Xrpl};

...
// TestNet
let mut xrpl = Xrpl::new("http://test.xrp.xpring.io:50051", false)?;

// With mnemonic and default derivation path
let wallet_from_mnemonic = xrpl.wallet_from_mnemonic(
    "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", 
    None
)?;

// With mnemonic and custom derivation path
let wallet_from_mnemonic = xrpl.wallet_from_mnemonic(
    "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", 
    Some("m/44'/144'/0'/0/1")
)?;
基于种子的钱包

您可以通过传递一个base58check编码的种子字符串来构建基于种子的钱包。

let wallet_from_seed = xrpl.wallet_from_seed("snYP7oArxKepd3GPDcrjMsJYiJeJB", None)?;
// XWalletGenerationResult { wallet: 
//   XWallet 
//     { 
//       public_key: "031D68BC1A142E6766B2BDFB006CCFE135EF2E0E2E94ABB5CF5C9AB6104776FBAE", 
//       private_key: "0090802A50AA84EFB6CDB225F17C27616EA94048C179142FECF03F4712A07EA7A4", 
//       test: true, 
//       address: Some("TVHLFWLKvbMv1LFzd6FA2Bf9MPpcy4mRto4VFAAxLuNpvdW") 
//     }, 
//   mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", 
//   derivation_path: "m/44\'/144\'/0\'/0/0" 
// }

钱包生成

xpring-rs可以生成一个新的随机HD钱包。钱包生成调用结果是一个包含以下内容的XWalletGenerationResult结构:

  • 随机生成的助记词
  • 使用的派生路径,这是默认路径
  • 新钱包的引用
// Generate a random wallet.
let random_wallet = xrpl.generate_random_wallet(None)?; //no entropy and testnet 
let random_wallet_with_entropy = xrpl.generate_random_wallet(Some("00000000000000000000000000000000"))?; //entropy and mainnet 

// XWalletGenerationResult { wallet: 
//   XWallet 
//     { 
//       public_key: "031D68BC1A142E6766B2BDFB006CCFE135EF2E0E2E94ABB5CF5C9AB6104776FBAE", 
//       private_key: "0090802A50AA84EFB6CDB225F17C27616EA94048C179142FECF03F4712A07EA7A4", 
//       test: true, 
//       address: Some("TVHLFWLKvbMv1LFzd6FA2Bf9MPpcy4mRto4VFAAxLuNpvdW") 
//     }, 
//   mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", 
//   derivation_path: "m/44\'/144\'/0\'/0/0" 
// }

钱包属性

生成的钱包可以提供其XRP账本上的公钥、私钥和地址。

let wallet_from_mnemonic = xrpl.wallet_from_mnemonic(
    "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", 
    Some("m/44'/144'/0'/0/1")
)?;

println!("Address: {}", wallet.address); //XVMFQQBMhdouRqhPMuawgBMN1AVFTofPAdRsXG5RkPtUPNQ
println!("Public Key: {}", wallet.publicKey); //031D68BC1A142E6766B2BDFB006CCFE135EF2E0E2E94ABB5CF5C9AB6104776FBAE
println!("Private Key: {}", wallet.privateKey); //0090802A50AA84EFB6CDB225F17C27616EA94048C179142FECF03F4712A07EA7A4

签名/验证

钱包还可以签名和验证任意消息。通常,用户应使用wallet上的函数执行加密函数,而不是使用这些低级API。

let signed_message = xrpl.wallet_sign(
    "mymessage", 
    "000974B4CFE004A2E6C4364CBF3510A36A352796728D0861F6B555ED7E54A70389"
    ).unwrap();

println!("Signed Message: {:?}", signed_message); //304402204146402099809E1F021421569F72BA34DCAFCC832741AB6310F887F60734D9F002203E813AD6A59D67D8EE06C8EA05BCC1BA8F690B631E6F243E8BE60633D27BE05D

...

let verified_message = xrpl.wallet_verify(
    "mymessage", 
    "3045022100DD88E31FF9AFD2A6DA48D40C4B4E8F11725E11C9D9E52388710E35ED19212EF6022068CFA9C09071322751C11DD21E89088879DC28B3B683D3F863090FB7C331EC32", 
    "038BF420B5271ADA2D7479358FF98A29954CF18DC25155184AEAD05796DA737E89"
).unwrap();
// true

获取余额

let balance = xrpl.get_balance("TVr7v7JGN5suv7Zgdu9aL4PtCkwayZNYWvjSG23uMMWMvzZ")?;
//1000.00

检查交易状态

一个 Xrpl 实例可以检查 XRP 账本上交易的状态。

Xrpl 返回以下交易状态

  • 成功:交易成功验证并应用到 XRP 账本。
  • 失败:交易成功验证但未应用到 XRP 账本。或者操作将永远不会被验证。
  • 待处理:交易尚未被验证,但将来可能会被验证。
  • 未知:无法确定交易状态。

注意:有关更多信息,请参阅可靠交易提交交易结果

这些状态由 XTransactionStatus 枚举确定。

let status = xrpl.get_transaction_status("4DBA25199653A2E8BC5879DF2F830DA0149D9DE5216D2A4496A59505C107D6BB")?;
//SUCCEEDED

注意:示例交易哈希可能会导致“交易未找到”错误,因为测试网会定期重置,或者访问的节点可能只维护一个月的历史记录。最近的交易哈希可以在 XRP 账本探索器中找到:主网测试网

发送 XRP

XrplClient 可以向 XRP 账本上的其他账户发送 XRP。

注意:支付操作将阻塞调用线程,直到操作达到最终且不可逆的成功或失败状态。

let w = wallet.from_seed(
    "shKtxFAYfNUHYayYMYkp3KjQQX2UY",
    None,
).unwrap();
let response = client.send(12.12, "T7jkn8zYC2NhPdcbVxkiEXZGy56YiEE4P7uXRgpy5j4Q6S1","T7QqSicoC1nB4YRyzWzctWW7KjwiYUtDzVaLwFd4N7W1AUU", w); 
//XrplReliableSendResponse {
//  transaction_status: SUCCEEDED,
//  transaction_hash: "EE70A3A5B8F5E5C6B7AA8A76E640E4AF4AFC37E87767130824F7D211CE45604E",
//  transaction_info: ""
//}

工具

地址验证

xrpl.validate_address("rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1")?; // returns true
xrpl.validate_address("XVLhHMPHU98es4dbozjVtdWzVrDjtV18pX8yuPT7y4xaEHi")?; // returns true
xrpl.validate_address("1DiqLtKZZviDxccRpowkhVowsbLSNQWBE8")?; // returns false

您还可以验证地址是 X-地址还是经典地址。

xrpl.validate_x_address("rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1")?; // returns false
xrpl.validate_x_address("XVLhHMPHU98es4dbozjVtdWzVrDjtV18pX8yuPT7y4xaEHi")?; // returns true
xrpl.validate_x_address("1DiqLtKZZviDxccRpowkhVowsbLSNQWBE8")?; // returns false
xrpl.validate_classic_address("rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1")?; // returns true
xrpl.validate_classic_address("XVLhHMPHU98es4dbozjVtdWzVrDjtV18pX8yuPT7y4xaEHi")?; // returns false

X-地址编码

// Encode an X-Address.
xpring.encode_classic_address("rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1", Some(12345), None)?;
//XVfC9CTCJh6GN2x8bnrw3LtdbqiVCUvtU3HnooQDgBnUpQT

// Decode an X-Address.
xpring.decode_x_address("XVfC9CTCJh6GN2x8bnrw3LtdbqiVCUvtU3HnooQDgBnUpQT")?;
// ClassicAddress {
//     address: "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1",
//     tag: Some(12345),
//     test: false
// }

ILP

Ilp 实例可以发送 ILP 支付并获取账户余额。

获取余额

// Ilp instance
let mut ilp = Ilp::new("http://hermes-grpc.ilpv4.dev", "test", "password")?;

// Send Payment
let payment =
    ilp.get_balance()?;
//  IlpBalanceResponse {
//      account_id: "sdk_account1",
//      asset_code: "XRP",
//      asset_scale: 9,
//      net_balance: -10491,
//      prepaid_amount: 0,
//      clearing_balance: -10491,
//  }

发送 ILP 支付

// Ilp instance
let mut ilp = Ilp::new("http://hermes-grpc.ilpv4.dev", "test", "password")?;

// Send Payment
let payment =
    ilp.send_to(
        "$money.ilpv4.dev/test2",
        8,
        10
    )?;
//  IlpSendResponse {
//      payment_status: SUCCEEDED,
//      original_amount: 8,
//      amount_delivered: 8,
//      amount_sent: 8,
//  }

示例

您可以在示例文件夹中找到一些示例代码。

贡献

欢迎提交拉取请求!要开始构建此库并提交拉取请求,请参阅贡献页面。

许可

xpring-rs 在 MIT 许可证下提供。有关更多信息,请参阅LICENSE文件。

依赖项

~11MB
~176K SLoC