形式多样的波卡地址格式

>![address](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/673a91b1-682c-482f-ddda-313ee530be3e.png)

## SS58 地址

SS58 是一个简单的地址格式，设计用于基于 Substrate 开发的链。使用其他地址格式也是没有问题的，但 SS58 是一个默认项。 SS58 基于比特币的 Base58-check 格式，并作了一些修改。

### 类型前缀

**SS58 格式包含一个地址类型前缀，用来标识属于特定网络（平行链）的地址。不同的类型前缀，生成的地址的开头是不一样的。**

polkadot 网络上已经有了多条平行链，每条平行链会规定 1 个前缀，这样会有自己特定的格式，就会跟其他平行链的地址区分开来。

举个例子：

- 通用的 substrate 地址总是以数字 5 开头
- polkadot 地址总是以数字 1 开头
- kusama 地址总是以大写字母开头，如 C、D、F、G、H、J

以下 4 个地址看似完全不一样，如果使用 subkey inspect 工具，就会发现它们有相同的 public key，即公钥。

```bash
5CCvtLnaPwk1cBo8wuayYAuwgCumHnssrY5Nxk7S7t1ruBU2 # substrate 类型地址
19E2g3eFj1V3ioeuYdygKk6XpuQz6S1w2os836nfy3P5bYL # polkadot 类型地址
CiYYf8T2JkwMqcaicQ2S8GwpoC16Th4Juv8MQPPbgEMe6dv # kusama 类型地址
211pcbTg6dkkcJrHxsSDTLQLzgLMXvjDpSMBGsXoJWzFtbPS # acala 类型地址
```

有技术背景的朋友可以尝试下 `subkey inspect`，这个命令还会显示地址是哪个网络（平行链）的。

```shell
subkey inspect 5CyREBErNFhogptd92dtC8ybuoUczVYh2ijvdhTpS2PJGeq7

  Network ID/version: substrate
  Public key (hex):   0x28340716214bbe2fc67db7eec79ae267cb664fe74395ad9831dafa4d36d21716
  Account ID:         0x28340716214bbe2fc67db7eec79ae267cb664fe74395ad9831dafa4d36d21716
  SS58 Address:       5CyREBErNFhogptd92dtC8ybuoUczVYh2ijvdhTpS2PJGeq7

###########

subkey inspect 1uiNWVvE2yH8Mu96fgtLHokmRUGgo6q7DUQnzTAz7QpT5c5

  Network ID/version: polkadot
  Public key (hex):   0x28340716214bbe2fc67db7eec79ae267cb664fe74395ad9831dafa4d36d21716
  Account ID:         0x28340716214bbe2fc67db7eec79ae267cb664fe74395ad9831dafa4d36d21716
  SS58 Address:       1uiNWVvE2yH8Mu96fgtLHokmRUGgo6q7DUQnzTAz7QpT5c5
```

那这些网络（平行链）的类型前缀是如何规定的？可以去查看 [ss58-registry](https://github.com/paritytech/ss58-registry/blob/main/ss58-registry.json)。这里列出一个简单的表。


| 前缀 | 地址类型 | 地址开头 | 地址示例 |
|---|---|---|---|
|  0 | polkadot   | 1 | 19E2g3eFj1V3ioeuYdygKk6XpuQz6S1w2os836nfy3P5bYL |
| 2  | kusama     | C、D、F、G、H、J等  | CiYYf8T2JkwMqcaicQ2S8GwpoC16Th4Juv8MQPPbgEMe6dv |
|  42 | substrate | 5 | 5CCvtLnaPwk1cBo8wuayYAuwgCumHnssrY5Nxk7S7t1ruBU2 |
|  10 | acala     | 2 | 211pcbTg6dkkcJrHxsSDTLQLzgLMXvjDpSMBGsXoJWzFtbPS |
|  30 | phala     | 3 | 3zm1nSHjnTFHjUwa5X2h1MiqvPCEdbKdbFRoaYPpZct1XJgD |

## 不同类型地址转换

有 1 个 substrate 类型的地址 `5CyREBErNFhogptd92dtC8ybuoUczVYh2ijvdhTpS2PJGeq7`，如何转换成 polkadot 类型的地址呢？

我们可以使用线上工具 https://polkadot-address-convertor.netlify.app/ 得到结果 `1uiNWVvE2yH8Mu96fgtLHokmRUGgo6q7DUQnzTAz7QpT5c5`。

## Subkey

Subkey 是跟随 Substrate 一起开发的密钥生成程序。它的主要功能是生成密钥对(当前支持 sr25519， ed25519 和 secp256k1)，对 SS58 地址进行编码以及从助记符和原始种子还原密钥。它还可以在消息（包括编码后的交易）上创建和验证签名。

### 生成地址与密钥

generate 命令以生成密钥与地址

```shell
subkey generate # 默认生成sr25519密钥

输出结果

Secret phrase `spend report solution aspect tilt omit market cancel what type cave author` is account:
  Secret seed:      0x554b6fc625fbea8f56eb56262d92ccb083fd6eaaf5ee9a966eaab4db2062f4d0
  Public key (hex): 0x143fa4ecea108937a2324d36ee4cbce3c6f3a08b0499b276cd7adb7a7631a559
  Account ID:       0x143fa4ecea108937a2324d36ee4cbce3c6f3a08b0499b276cd7adb7a7631a559
  SS58 Address:     5CXFinBHRrArHzmC6iYVHSSgY1wMQEdL2AiL6RmSEsFvWezd
```

generate 还支持以下 子命令

```shell
subkey generate -n polkadot
subkey generate --scheme ed25519 # 生成 ed25519 类型密钥
subkey generate --words 12 # (支持12、15、18、21和24)
```

### 检验地址

inspect 命令可根据给定的密钥种子重新计算密钥对的公钥和地址。

```shell
subkey inspect 5CyREBErNFhogptd92dtC8ybuoUczVYh2ijvdhTpS2PJGeq7

输出结果

  Network ID/version: substrate # 地址类型
  Public key (hex):   0x28340716214bbe2fc67db7eec79ae267cb664fe74395ad9831dafa4d36d21716 #公钥
  Account ID:         0x28340716214bbe2fc67db7eec79ae267cb664fe74395ad9831dafa4d36d21716
  SS58 Address:       5CyREBErNFhogptd92dtC8ybuoUczVYh2ijvdhTpS2PJGeq7
```

如果提供 1 个无效的地址，inspect 会提示地址无效。

```
subkey inspect 5GearBErNFhogptd92dtC8ybuoUczVYh2ijvdhTpS2PJGeq7

输出结果

Invalid phrase/URI given
```


---

参考：

https://polkadot-address-convertor.netlify.app/

https://wiki.polkadot.network/docs/learn-accounts

https://wiki.polkadot.network/docs/learn-account-generation

https://github.com/paritytech/ss58-registry/blob/main/ss58-registry.json

https://docs.substrate.io/v3/advanced/ss58/

https://polkadot.js.org/docs/keyring/start/ss58/

https://zhuanlan.zhihu.com/p/262929418

https://zhuanlan.zhihu.com/p/84322255