求助:如何用cosmrs库将公钥转成cosmosvalcons前缀的共识地址
使用cosmrs将Ed25519共识公钥转换为cosmosvalcons前缀地址
需求说明
需要通过cosmrs库将Ed25519类型的共识公钥转换为带cosmosvalcons前缀的Bech32编码地址,此前尝试未得到正确前缀的结果,以下是可运行的示例代码及关键说明。
示例公钥
{ "consensus_pubkey": { "@type": "/cosmos.crypto.ed25519.PubKey", "key": "bDO9bUrbyg0f1pTpmjjZU5cgsweCWdwL6HUVnsKJi7k=" } }
示例代码(Rust)
use cosmrs::{crypto::PublicKey, hrp::Hrp, prelude::*}; use base64::{engine::general_purpose, Engine as _}; fn main() -> Result<(), Box<dyn std::error::Error>> { // 提取示例公钥中的base64编码内容 let base64_pubkey = "bDO9bUrbyg0f1pTpmjjZU5cgsweCWdwL6HUVnsKJi7k="; // 解码base64为原始字节数组 let pubkey_bytes = general_purpose::STANDARD.decode(base64_pubkey)?; // 将原始字节转换为cosmrs的Ed25519公钥实例 let pubkey = PublicKey::from_raw_ed25519(&pubkey_bytes)?; // 指定HRP前缀为cosmosvalcons,生成对应地址 let hrp = Hrp::try_from("cosmosvalcons")?; let address = pubkey.address(&hrp)?; // 输出结果 println!("共识地址: {}", address); Ok(()) }
关键说明
- 公钥类型匹配:示例公钥为Ed25519类型,需调用
from_raw_ed25519方法转换;若为Secp256k1等其他类型,需使用对应from_raw_*方法。 - HRP前缀指定:cosmrs默认HRP前缀为
cosmos,必须显式设置为cosmosvalcons才能生成目标格式地址,这是此前转换失败的核心原因。 - 核心方法翻译(基于官方文档):
PublicKey结构体:用于表示Cosmos生态的各类公钥,支持Ed25519、Secp256k1等主流算法。from_raw_*系列方法:从原始字节数组创建公钥实例,需保证字节长度与算法匹配(如Ed25519公钥固定为32字节)。address(&self, hrp: &Hrp)方法:根据传入的HRP前缀生成Bech32编码地址,返回的Addr实例可直接转为字符串输出。
内容的提问来源于stack exchange,提问作者user20778175
相关产品推荐
相关产品推荐

