Cosmos 地址转换器:Bech32 前缀更换

粘贴任意 Cosmos 生态地址,即可看到同一账户在二十条常用链上的重新编码结果,以及原始的 20 字节十六进制。也能把 0x 账户编码为 Injective、Evmos 等链的 bech32 形式。

任意 bech32 地址(cosmos、osmo、juno、celestia、dydx、inj、sei、kava、akash、stars、axelar、noble、neutron、stride 等)、valoper / valcons 地址,或 20 或 32 字节的 0x 十六进制账户。

由浏览器中的 JavaScript 检查。地址绝不会被上传或存储。

什么是 Cosmos 地址转换器?

Cosmos 地址转换器把任意 Cosmos SDK 链的 bech32 地址解码为原始账户字节(钱包为 20 字节,模块账户和合约账户为 32 字节),再用不同的人类可读前缀重新编码。所有 Cosmos SDK 链都使用同一种编码,详见 Cosmos SDK 账户文档:前缀、分隔符 1、以 bech32 的 32 字符字符表表示的数据,以及六个字符的校验和。各链之间只有前缀不同,因此字节相同的 cosmos1…、osmo1… 和 juno1… 地址属于同一个密钥。

转换原理

  1. 对包含前缀在内的整个字符串验证 bech32 校验和。工具使用与 SegWit 地址相同的 polymod,bech32 常量为 1(Cosmos 不使用 bech32m)。
  2. 把 5 位数据组转换回字节,不允许填充,并要求长度为 20 或 32 字节。
  3. 对表中的每个前缀,把字节重新分为 5 位一组,并用该前缀重新计算校验和。

示例

地址 cosmos15c20sqakl4uqnp4y93uwe8rlwlnda5futtjxsl 解码后得到 20 字节 0xa614f803b6fd780986a42c78ec9c7f77e6ded13c。用 Osmosis 前缀重新编码这些字节,会得到一个 osmo1… 地址,其 32 个数据字符完全相同,但六位校验和不同,因为前缀也是校验和的输入之一。0x 形式(已做 EIP-55 校验和处理)就是 EVM 兼容链对同样字节所显示的地址。

表中的前缀

前缀链密钥派生前缀链密钥派生
cosmosCosmos Hubsecp256k1celestiaCelestiasecp256k1
osmoOsmosissecp256k1dydxdYdX Chainsecp256k1
junoJunosecp256k1nobleNoblesecp256k1
starsStargazesecp256k1neutronNeutronsecp256k1
akashAkashsecp256k1strideStridesecp256k1
kavaKavasecp256k1evmosEvmosethsecp256k1
secretSecret Networksecp256k1creCrescentsecp256k1
axelarAxelarsecp256k1regenRegensecp256k1
injInjectiveethsecp256k1terraTerrasecp256k1
seiSeisecp256k1(EVM 地址在链上关联)kujiraKujirasecp256k1

前缀不在此列表中的地址同样会被解码,并以其自身前缀显示在表格顶部。

转换后的地址何时是你的,何时不是

Keplr、Leap 等钱包会从你的助记词为每条链派生一个密钥。对于共用标准 coin type 118 和 secp256k1 派生方式的链,每条链上派生出的地址正是重新编码后的那个地址,这也是 IBC 转账到“你在另一条链上的地址”能够成立的原因。使用 coin type 60 和以太坊式密钥的链(Injective、Evmos)会派生出不同的字节;Sei 则通过链上关联把一个独立的 EVM 地址与 sei1 账户绑定,而不是共享字节。向转换后的地址发送之前,请先在对应链的钱包中确认。

典型用途

带任意前缀的原始 bech32 字符串请使用 bech32 编码 / 解码器;验证 EIP-55 形式请使用以太坊校验和转换器。

常见问题

cosmos1… 和 osmo1… 地址是同一个账户吗?

它们持有相同的 20 字节,对于使用标准 secp256k1 派生的链,同一助记词会同时生成这两个地址。但每条链都是独立的账本:Osmosis 上的代币记在 osmo1 地址下,Cosmos Hub 上的代币记在 cosmos1 地址下。重新编码不会转移任何资产,只是告诉你你的地址在别的链上长什么样。

为什么我的 Injective 或 Evmos 地址与转换结果不一致?

Injective、Evmos 等 ethsecp256k1 链按以太坊方式派生账户字节(对未压缩公钥做 keccak-256),而大多数 Cosmos 链是对压缩公钥先做 sha256 再做 ripemd160。因此同一助记词在这两类链上会得到不同的字节。转换器只是重新编码你粘贴的字节,所以把 inj1 地址转换为 cosmos1 得到的是一个有效字符串,但并不是你的钱包为 Cosmos Hub 显示的地址。

0x 形式有什么用?

在 Injective 和 Evmos 上,0x 形式就是该账户的以太坊地址,供 MetaMask 和 EVM 工具使用。在其他链上它只是原始字节,可用于调试和查询模块账户。工具显示的是经 EIP-55 校验和处理的形式。

什么是 valoper 和 valcons 地址?

cosmosvaloper1… 是验证人的操作者地址,与操作者钱包是同样的 20 字节,只是前缀不同;cosmosvalcons1… 是验证人共识密钥的哈希。两者都不能接收代币。转换器能识别这两种地址,并为 valoper 显示对应的账户地址。

为什么我的地址有 59 个字符?

那是 32 字节地址:模块账户、跨链账户(ICA)和 CosmWasm 合约地址由 sha256 派生,比钱包地址更长。工具可以解码并用其他前缀重新编码它们,但这类账户只存在于创建它的那条链上。

工具会检查 bech32 校验和吗?

会。Cosmos 地址使用 BIP-173 的原始 bech32 校验和(而非 bech32m),工具会在转换前先验证。校验失败说明有输入错误;若校验和为 bech32m,则说明该字符串是 Taproot 之类的地址,而不是 Cosmos 地址。