什么是 Cosmos 地址转换器?
Cosmos 地址转换器把任意 Cosmos SDK 链的 bech32 地址解码为原始账户字节(钱包为 20 字节,模块账户和合约账户为 32 字节),再用不同的人类可读前缀重新编码。所有 Cosmos SDK 链都使用同一种编码,详见 Cosmos SDK 账户文档:前缀、分隔符 1、以 bech32 的 32 字符字符表表示的数据,以及六个字符的校验和。各链之间只有前缀不同,因此字节相同的 cosmos1…、osmo1… 和 juno1… 地址属于同一个密钥。
转换原理
- 对包含前缀在内的整个字符串验证 bech32 校验和。工具使用与 SegWit 地址相同的 polymod,bech32 常量为 1(Cosmos 不使用 bech32m)。
- 把 5 位数据组转换回字节,不允许填充,并要求长度为 20 或 32 字节。
- 对表中的每个前缀,把字节重新分为 5 位一组,并用该前缀重新计算校验和。
示例
地址 cosmos15c20sqakl4uqnp4y93uwe8rlwlnda5futtjxsl 解码后得到 20 字节 0xa614f803b6fd780986a42c78ec9c7f77e6ded13c。用 Osmosis 前缀重新编码这些字节,会得到一个 osmo1… 地址,其 32 个数据字符完全相同,但六位校验和不同,因为前缀也是校验和的输入之一。0x 形式(已做 EIP-55 校验和处理)就是 EVM 兼容链对同样字节所显示的地址。
表中的前缀
| 前缀 | 链 | 密钥派生 | 前缀 | 链 | 密钥派生 |
|---|---|---|---|---|---|
| cosmos | Cosmos Hub | secp256k1 | celestia | Celestia | secp256k1 |
| osmo | Osmosis | secp256k1 | dydx | dYdX Chain | secp256k1 |
| juno | Juno | secp256k1 | noble | Noble | secp256k1 |
| stars | Stargaze | secp256k1 | neutron | Neutron | secp256k1 |
| akash | Akash | secp256k1 | stride | Stride | secp256k1 |
| kava | Kava | secp256k1 | evmos | Evmos | ethsecp256k1 |
| secret | Secret Network | secp256k1 | cre | Crescent | secp256k1 |
| axelar | Axelar | secp256k1 | regen | Regen | secp256k1 |
| inj | Injective | ethsecp256k1 | terra | Terra | secp256k1 |
| sei | Sei | secp256k1(EVM 地址在链上关联) | kujira | Kujira | secp256k1 |
前缀不在此列表中的地址同样会被解码,并以其自身前缀显示在表格顶部。
转换后的地址何时是你的,何时不是
Keplr、Leap 等钱包会从你的助记词为每条链派生一个密钥。对于共用标准 coin type 118 和 secp256k1 派生方式的链,每条链上派生出的地址正是重新编码后的那个地址,这也是 IBC 转账到“你在另一条链上的地址”能够成立的原因。使用 coin type 60 和以太坊式密钥的链(Injective、Evmos)会派生出不同的字节;Sei 则通过链上关联把一个独立的 EVM 地址与 sei1 账户绑定,而不是共享字节。向转换后的地址发送之前,请先在对应链的钱包中确认。
典型用途
- 当钱包只显示一条链时,从 Cosmos Hub 地址找到你的 Osmosis 或 Celestia 充值地址。
- 把 MetaMask 的 0x 地址转换成交易所提币表单要求的
inj1…或evmos1…形式。 - 检查
valoper地址有没有被误粘贴到应填账户地址的位置。
带任意前缀的原始 bech32 字符串请使用 bech32 编码 / 解码器;验证 EIP-55 形式请使用以太坊校验和转换器。