8个版本
0.0.10 | 2020年4月7日 |
---|---|
0.0.9 | 2020年4月1日 |
0.0.8 | 2020年3月26日 |
#1 in #xrp
2MB
36K SLoC
xpring-rs
xpring-rs 是一个Rust客户端库,
- 执行XRP账本钱包生成/派生的相关离线计算
- 提供与XRP账本交互的简单接口
架构
功能
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