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区块链开发提供了可靠的地址处理基础,适合钱包应用、交易所集成和区块链浏览器等场景使用。

回到顶部