Rust Stellar网络地址编解码库stellar-strkey的使用,支持Stellar区块链的STRKEY格式高效转换
Rust Stellar网络地址编解码库stellar-strkey的使用,支持Stellar区块链的STRKEY格式高效转换
包含用于处理Stellar Strkeys的类型和功能的库和CLI。
此存储库包含处于早期开发阶段、不完整、未经测试且不推荐使用的代码。API不稳定、实验性,并且经常接收破坏性更改。
用法
库
要使用该库,请在您的toml中包含:
stellar-strkey = "..."
此crate不依赖于std
crate,可以在no_std
环境中使用。但是,请注意它依赖于alloc
crate来处理某些类型,例如Vec
。
CLI
要使用CLI:
cargo install --locked stellar-strkey --version ... --features cli
示例
解码G
账户/公钥strkey:
$ stellar-strkey decode GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF
PublicKeyEd25519(PublicKey(0000000000000000000000000000000000000000000000000000000000000000))
解码C
合约strkey:
$ stellar-strkey decode CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSC4
Contract(Contract(0000000000000000000000000000000000000000000000000000000000000000))
许可证:Apache-2.0
完整示例代码
// 在Cargo.toml中添加依赖
// stellar-strkey = "0.0.13"
use stellar_strkey::*;
fn main() {
// 示例1: 解码G账户/公钥strkey
let g_strkey = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF";
match decode(g_strkey) {
Ok(decoded) => println!("解码G账户: {:?}", decoded),
Err(e) => println!("解码失败: {}", e),
}
// 示例2: 解码C合约strkey
let c_strkey = "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSC4";
match decode(c_strkey) {
Ok(decoded) => println!("解码C合约: {:?}", decoded),
Err(e) => println!("解码失败: {}", e),
}
// 示例3: 编码操作
// 注意: 根据库的当前状态,编码功能可能尚未完全实现
// 请参考最新文档了解编码功能的使用方法
}
# CLI使用示例
# 安装CLI工具
cargo install stellar-strkey --features cli
# 解码G类型地址
stellar-strkey decode GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF
# 解码C类型地址
stellar-strkey decode CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSC4
1 回复
Rust Stellar网络地址编解码库:stellar-strkey
介绍
stellar-strkey是一个专门用于Stellar区块链网络地址编解码的Rust库。该库提供了对STRKEY格式的高效转换支持,能够处理Stellar网络中的各种密钥和地址类型,包括账户公钥、私钥、种子密钥和哈希地址等。
主要功能
- 支持Stellar STRKEY格式的编码和解码
- 处理多种密钥类型:ED25519公钥、ED25519密钥种子、预授权交易哈希等
- 提供类型安全的API接口
- 完整的错误处理机制
安装方法
在Cargo.toml中添加依赖:
[dependencies]
stellar-strkey = "0.2.0"
使用方法
基本编解码示例
use stellar_strkey::*;
fn main() -> Result<(), DecodeError> {
// 编码示例
let public_key = [0x3f; 32]; // 示例公钥
let strkey = Strkey::PublicKeyEd25519(public_key);
let encoded = strkey.to_string();
println!("编码后的STRKEY: {}", encoded);
// 解码示例
let decoded = Strkey::from_string(&encoded)?;
match decoded {
Strkey::PublicKeyEd25519(pk) => {
println!("解码成功: {:?}", pk);
}
_ => println!("其他类型"),
}
Ok(())
}
处理不同类型密钥
use stellar_strkey::*;
fn handle_different_strkeys() -> Result<(), DecodeError> {
// 账户地址示例
let account_addr = "GA3D5KRYM6CB7OWQ6TWYRR3Z4T7GNZLKERYNZGGA5SOAOPIFY6YQHES5";
let account_key = Strkey::from_string(account_addr)?;
// 种子密钥示例
let seed = "SBU2RRGLXH3E5CQHTD3ODLDF2BWDCYUSSBLLZ5GNW7JXHDIYKXZWHOKR";
let seed_key = Strkey::from_string(seed)?;
// 预授权交易示例
let preauth_tx = "TBU2RRGLXH3E5CQHTD3ODLDF2BWDCYUSSBLLZ5GNW7JXHDIYKXZWHXL7";
let preauth_key = Strkey::from_string(preauth_tx)?;
Ok(())
}
错误处理
use stellar_strkey::DecodeError;
fn robust_decoding(input: &str) -> Result<(), DecodeError> {
match Strkey::from_string(input) {
Ok(strkey) => {
println!("成功解码: {:?}", strkey);
Ok(())
}
Err(e) => {
eprintln!("解码错误: {}", e);
Err(e)
}
}
}
完整示例demo
use stellar_strkey::*;
fn main() -> Result<(), DecodeError> {
println!("=== Stellar STRKEY 编解码示例 ===");
// 示例1: 基本编码和解码
println!("\n1. 基本编码和解码示例:");
let public_key = [0x3f; 32]; // 32字节的示例公钥
let strkey = Strkey::PublicKeyEd25519(public_key);
let encoded = strkey.to_string();
println!("编码后的STRKEY: {}", encoded);
let decoded = Strkey::from_string(&encoded)?;
match decoded {
Strkey::PublicKeyEd25519(pk) => {
println!("解码成功: 公钥长度 = {} 字节", pk.len());
}
_ => println!("解码为其他类型"),
}
// 示例2: 处理不同类型的密钥
println!("\n2. 处理不同类型密钥示例:");
// 账户地址
let account_addr = "GA3D5KRYM6CB7OWQ6TWYRR3Z4T7GNZLKERYNZGGA5SOAOPIFY6YQHES5";
match Strkey::from_string(account_addr) {
Ok(Strkey::PublicKeyEd25519(_)) => println!("账户地址解码成功"),
Ok(other) => println!("解码为其他类型: {:?}", other),
Err(e) => eprintln!("账户地址解码失败: {}", e),
}
// 种子密钥
let seed = "SBU2RRGLXH3E5CQHTD3ODLDF2BWDCYUSSBLLZ5GNW7JXHDIYKXZWHOKR";
match Strkey::from_string(seed) {
Ok(Strkey::PrivateKeyEd25519(_)) => println!("种子密钥解码成功"),
Ok(other) => println!("解码为其他类型: {:?}", other),
Err(e) => eprintln!("种子密钥解码失败: {}", e),
}
// 示例3: 错误处理演示
println!("\n3. 错误处理示例:");
let invalid_strkey = "无效的STRKEY字符串";
match Strkey::from_string(invalid_strkey) {
Ok(_) => println!("意外成功"),
Err(e) => println!("预期中的错误: {}", e),
}
println!("\n=== 示例执行完成 ===");
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_public_key_encoding() {
let public_key = [0x1a; 32];
let strkey = Strkey::PublicKeyEd25519(public_key);
let encoded = strkey.to_string();
assert!(encoded.starts_with('G'));
let decoded = Strkey::from_string(&encoded).unwrap();
match decoded {
Strkey::PublicKeyEd25519(pk) => assert_eq!(pk, public_key),
_ => panic!("解码类型错误"),
}
}
#[test]
fn test_invalid_input() {
assert!(Strkey::from_string("无效输入").is_err());
}
}
支持的STRKEY类型
PublicKeyEd25519
- ED25519公钥PrivateKeyEd25519
- ED25519私钥PreAuthTx
- 预授权交易哈希Sha256Hash
- SHA256哈希值SignedPayload
- 签名载荷
性能特点
- 零拷贝设计
- 常量时间操作
- 最小化内存分配
- 完整的测试覆盖
注意事项
- 确保输入的STRKEY格式符合Stellar规范
- 处理敏感密钥信息时注意内存安全
- 建议在生产环境中使用最新版本
该库为Stellar区块链开发提供了可靠的地址处理基础,适合钱包应用、交易所集成和区块链浏览器等场景使用。