0.0.2 |
|
---|---|
0.0.1 |
|
#9 in #xrp
2MB
35K SLoC
xpring-rs
xpring-rs 是一个 Rust 客户端库,
- 执行围绕 XRP 分类账钱包生成/派生的某些离线计算
- 提供与 XRP 分类账交互的简单接口。
架构
功能
xpring-rs 提供以下功能
- 钱包生成和派生(基于种子或 HD 钱包)
- 地址验证
- 获取账户余额
- 发送 XRP 付款
要求
- Node.js (10+)
安装
将此内容添加到您的 Cargo.toml
[dependencies]
xpring-rs = "0.0.2"
使用方法
注意: xRs 只能与 X-地址格式一起使用。有关此格式的更多信息,请参阅实用工具部分和http://xrpaddress.info。
钱包
钱包是 xRs 中的基本模型对象。钱包提供
- 密钥管理
- 地址派生
- 签名功能
钱包可以从种子或助记词和派生路径派生出来。您还可以生成一个新的随机 HD 钱包。
钱包派生
xpring-rs 可以从种子派生钱包,也可以从助记词和派生路径派生出分层确定性钱包(HD 钱包)。
分层确定性钱包
分层确定性钱包是使用助记词和派生路径创建的。只需将助记词和派生路径传递给钱包生成函数即可。请注意,如果您省略传递派生路径,将使用默认路径。
use xpring_rs::{Xpring};
...
let mut xpring = Xpring::new("http://test.xrp.xpring.io:50051")?;
// With mnemonic and default derivation path
let wallet_from_mnemonic = xpring.wallet_from_mnemonic("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about".to_owned(), None, true)?;
// With mnemonic and custom derivation path
let wallet_from_mnemonic = xpring.wallet_from_mnemonic("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about".to_owned(), Some("m/44'/144'/0'/0/1".to_owned()), true)?;
基于种子的钱包
您可以通过传递 base58check 编码的种子字符串来构建基于种子的钱包。
let wallet_from_seed = xpring.wallet_from_seed("snYP7oArxKepd3GPDcrjMsJYiJeJB".to_owned(), None, true)?;
// 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 = xpring.generate_random_wallet(None, false)?; //no entropy and testnet
let random_wallet_with_entropy = xpring.generate_random_wallet("00000000000000000000000000000000".to_owned(), false)?; //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 = xpring.wallet_from_mnemonic("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about".to_owned(), Some("m/44'/144'/0'/0/1".to_owned()), false)?;
println!("Address: {}", wallet.address); //XVMFQQBMhdouRqhPMuawgBMN1AVFTofPAdRsXG5RkPtUPNQ
println!("Public Key: {}", wallet.publicKey); //031D68BC1A142E6766B2BDFB006CCFE135EF2E0E2E94ABB5CF5C9AB6104776FBAE
println!("Private Key: {}", wallet.privateKey); //0090802A50AA84EFB6CDB225F17C27616EA94048C179142FECF03F4712A07EA7A4
签名/验证
钱包也可以签名和验证任意消息。通常,用户应该使用 wallet
上的函数来执行加密函数,而不是使用这些低级API。
let signed_message = xpring.wallet_sign(
"mymessage".to_owned(),
"000974B4CFE004A2E6C4364CBF3510A36A352796728D0861F6B555ED7E54A70389".to_owned()
).unwrap();
println!("Signed Message: {:?}", signed_message); //304402204146402099809E1F021421569F72BA34DCAFCC832741AB6310F887F60734D9F002203E813AD6A59D67D8EE06C8EA05BCC1BA8F690B631E6F243E8BE60633D27BE05D
...
let verified_message = xpring.wallet_verify(
"mymessage".to_owned(),
"3045022100DD88E31FF9AFD2A6DA48D40C4B4E8F11725E11C9D9E52388710E35ED19212EF6022068CFA9C09071322751C11DD21E89088879DC28B3B683D3F863090FB7C331EC32".to_owned(),
"038BF420B5271ADA2D7479358FF98A29954CF18DC25155184AEAD05796DA737E89".to_owned()
).unwrap();
// true
获取余额
let balance = xpring.get_balance("TVr7v7JGN5suv7Zgdu9aL4PtCkwayZNYWvjSG23uMMWMvzZ")?;
//1000.00
检查交易状态
Xpring
实例可以检查 XRP 账本上交易的状态。
xRs 返回以下交易状态
SUCCEEDED
:交易已成功验证并应用到 XRP 账本。FAILED:
交易已成功验证但未应用到 XRP 账本。或者操作将永远不会被验证。PENDING
:交易尚未验证,但可能在未来被验证。UNKNOWN
:无法确定交易状态。
这些状态由 XTransactionStatus
枚举确定。
let status = xpring.get_transaction_status("4DBA25199653A2E8BC5879DF2F830DA0149D9DE5216D2A4496A59505C107D6BB")?;
//SUCCEEDED
注意:示例交易哈希可能导致“未找到交易”错误,因为 TestNet 会定期重置,或者访问的节点可能仅维护一个月的历史记录。最近的交易哈希可以在XRP 账本探索器中找到。
发送 XRP
XRPClient
可以向 XRP 账本上的其他账户发送 XRP。
注意:支付操作将阻塞调用线程,直到操作达到最终且不可逆转的成功或失败状态。
let w = wallet.from_seed(
"shKtxFAYfNUHYayYMYkp3KjQQX2UY".to_owned(),
None,
true
).unwrap();
let response = client.send(12.12, "T7jkn8zYC2NhPdcbVxkiEXZGy56YiEE4P7uXRgpy5j4Q6S1","T7QqSicoC1nB4YRyzWzctWW7KjwiYUtDzVaLwFd4N7W1AUU", w);
//XReliableSendResponse {
// transaction_status: SUCCEEDED,
// transaction_hash: "EE70A3A5B8F5E5C6B7AA8A76E640E4AF4AFC37E87767130824F7D211CE45604E",
// transaction_info: ""
//}
实用工具
地址验证
...
xpring.validate_address("rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1")?; // returns true
xpring.validate_address("XVLhHMPHU98es4dbozjVtdWzVrDjtV18pX8yuPT7y4xaEHi")?; // returns true
xpring.validate_address("1DiqLtKZZviDxccRpowkhVowsbLSNQWBE8")?; // returns false
您还可以验证地址是否为 X-地址或经典地址。
xpring.validate_x_address("rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1")?; // returns false
xpring.validate_x_address("XVLhHMPHU98es4dbozjVtdWzVrDjtV18pX8yuPT7y4xaEHi")?; // returns true
xpring.validate_x_address("1DiqLtKZZviDxccRpowkhVowsbLSNQWBE8")?; // returns false
...
xpring.validate_classic_address("rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1")?; // returns true
xpring.validate_classic_address("XVLhHMPHU98es4dbozjVtdWzVrDjtV18pX8yuPT7y4xaEHi")?; // returns false
X-地址编码
// Encode an X-Address.
xpring.encode_clasic_address("rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1", Some(12345), None)?;
//XVfC9CTCJh6GN2x8bnrw3LtdbqiVCUvtU3HnooQDgBnUpQT
// Decode an X-Address.
xpring.decode_x_address("XVfC9CTCJh6GN2x8bnrw3LtdbqiVCUvtU3HnooQDgBnUpQT")?;
// ClassicAddress {
// address: "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1",
// tag: Some(12345),
// test: false
// }
示例
您可以在 示例 文件夹中找到一些示例代码。
贡献
TBD
许可证
xRs 在 MIT 许可证下可用。有关更多信息,请参阅LICENSE 文件。
依赖关系
~10MB
~176K SLoC