原文作者:PaperMoon 团队
刚接触 Polkadot 开发,第一个问题往往是:怎么创建账户?在以太坊里你可能习惯了 `ethers.Wallet.createRandom()`,三行代码就搞定。到了 Polkadot 生态,账户体系的底层逻辑不太一样——默认签名算法不是 ECDSA,地址格式不是十六进制的 `0x...`,甚至连 JS 的库都换了一套。本文直接给你三种语言的可运行代码,同时把几个关键概念说清楚,让你知道自己在做什么。
一、Polkadot 账户基础
一个 Polkadot 账户本质上还是一对密钥:私钥用来签名,公钥派生出地址。但有几点和以太坊不同,值得提前了解。
签名算法:默认是 SR25519
Polkadot 默认使用 SR25519 签名方案,而不是以太坊常用的 ECDSA(secp256k1)。SR25519 基于 Schnorr 签名,在安全性和性能上有一定优势,尤其在需要签名聚合的场景下。
此外还支持 ED25519 和 ECDSA。如果你在构建需要和以太坊兼容的场景,可以选择 ECDSA;绝大多数 Polkadot 原生应用用 SR25519 就好。
地址格式:SS58
Polkadot 使用 SS58 编码的地址,而不是以太坊的十六进制格式。SS58 是一种 base58 变体,会在地址中编入网络前缀,不同网络(Polkadot、Kusama、各平行链)的同一个账户显示的地址会不同,但底层是同一把私钥。
`ss58Format: 0` 对应 Polkadot 主网;Kusama 是 `2`;通用格式是 `42`。
助记词:BIP39
这一点和以太坊一样,Polkadot 使用 BIP39 标准的助记词(12 或 24 个英文单词)来备份私钥。助记词是账户的唯一凭证,丢失了无法找回,不要截图保存,不要发给任何人。
二、JavaScript / TypeScript 实现
2.1 环境准备
```bash
mkdir account-creator
cd account-creator
npm init -y && npm pkg set type=module
```
安装依赖:
```bash
npm install @polkadot/util-crypto @polkadot/keyring
npm install --save-dev typescript tsx
```
`@polkadot/util-crypto` 提供密码学工具函数(包括助记词生成);`@polkadot/keyring` 管理账户密钥对。
2.2 代码
新建 `create-account.ts`:
```typescript
import { cryptoWaitReady, mnemonicGenerate } from '@polkadot/util-crypto';
// 中文:从 util-crypto 导入两个函数:等待 WASM 密码学模块初始化完成、生成助记词
import { Keyring } from '@polkadot/keyring';
// 中文:导入 Keyring 类,用于管理账户密钥对
async function main() {
await cryptoWaitReady();
// 中文:@polkadot/util-crypto 底层使用 WASM,必须等待初始化完成才能调用密码学函数
const mnemonic = mnemonicGenerate(12);
// 中文:生成一个 12 单词的 BIP39 助记词,这是账户私钥的人类可读备份形式
const keyring = new Keyring({ type: 'sr25519', ss58Format: 0 });
// 中文:创建 Keyring 实例,指定使用 SR25519 签名方案,ss58Format: 0 表示 Polkadot 主网地址格式
const pair = keyring.addFromMnemonic(mnemonic);
// 中文:从助记词派生密钥对,并加入 Keyring 管理
console.log(`Address: ${pair.address}`);
console.log(`Mnemonic: ${mnemonic}`);
}
main().catch(console.error);
```
2.3 运行
```bash
npx tsx create-account.ts
```
预期输出:
```
Address: 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5
Mnemonic: cushion dog echo people vendor curve truck begin latin romance rebuild ...
```
每次运行都会生成一个新的助记词和对应地址。
三、Python 实现
Python 方案用的是 `substrate-interface` 这个库,它封装了 Substrate 链的所有常用操作,创建账户只是其中一个功能。
3.1 环境准备
```bash
mkdir account-creator-python
cd account-creator-python
python3 -m venv venv
source venv/bin/activate # Windows 用: venv\Scripts\activate
```
安装依赖:
```bash
pip install substrate-interface
```
3.2 代码
新建 `create_account.py`:
```python
from substrateinterface import Keypair
# 中文:从 substrate-interface 导入 Keypair 类,它封装了账户的密钥对管理功能
mnemonic = Keypair.generate_mnemonic()
# 中文:生成一个 BIP39 标准的助记词(默认 12 个词)
keypair = Keypair.create_from_mnemonic(mnemonic)
# 中文:从助记词派生出密钥对,默认使用 SR25519 签名方案
print(f"Address: {keypair.ss58_address}")
# 中文:输出 SS58 格式的账户地址
print(f"Mnemonic: {mnemonic}")
# 中文:输出助记词,生产环境中不应将助记词打印到日志
```
3.3 运行
```bash
python create_account.py
```
预期输出:
```
Address: 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5
Mnemonic: cushion dog echo people vendor curve truck begin latin romance rebuild ...
```
Python 的实现是三个版本里最简洁的,`substrate-interface` 把很多底层细节都封装好了,适合写脚本或后端自动化工具。
四、Rust 实现
Rust 版本直接用 Substrate 的核心库 `sp-core`,这和 Polkadot 节点本身用的密码学实现完全相同,不是 binding,是原生实现。
4.1 环境准备
```bash
cargo new account-creator-rust
cd account-creator-rust
```
在 `Cargo.toml` 的 `[dependencies]` 中添加:
```toml
[package]
name = "account-creator-rust"
version = "0.1.0"
edition = "2021"
[dependencies]
sp-core = "28.0"
sp-runtime = "31.0"
```
4.2 代码
编辑 `src/main.rs`:
```rust
use sp_core::{crypto::Ss58Codec, Pair};
// 中文:导入 Ss58Codec trait(提供 to_ss58check 方法)和 Pair trait(提供密钥对操作接口)
fn main() {
let (pair, phrase, _) = sp_core::sr25519::Pair::generate_with_phrase(None);
// 中文:generate_with_phrase 返回三个值:密钥对、助记词字符串、可选的密码短语(这里传 None 表示不设密码)
let address = pair.public().to_ss58check();
// 中文:从密钥对中取出公钥,再用 to_ss58check() 编码为 SS58 格式的地址字符串
println!("Address: {}", address);
println!("Mnemonic: {}", phrase);
}
```
4.3 运行
```bash
cargo run
```
预期输出:
```
Address: 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5
Mnemonic: cushion dog echo people vendor curve truck begin latin romance rebuild ...
```
Rust 版本的依赖体积比较大,首次 `cargo build` 会花几分钟编译。如果只是写脚本,Python 方案更省事;如果你在构建高性能服务或需要和 Substrate 深度集成,Rust 是更自然的选择。
五、三种语言横向对比
|
对比项 |
JavaScript / TypeScript |
Python |
Rust |
|---|---|---|---|
|
核心库 |
@polkadot/keyring |
substrate-interface |
sp-core |
|
核心逻辑代码量 |
约 8 行 |
约 4 行 |
约 6 行 |
|
适用场景 |
前端钱包、浏览器 dApp、Web 应用 |
自动化脚本、运维工具、后端服务 |
高性能服务、链上组件、节点集成 |
|
上手难度 |
⭐ 最容易 |
⭐⭐ 容易 |
⭐⭐⭐ 较高 |
|
首次编译/运行时间 |
快(即开即用) |
快(解释执行) |
较慢(需编译,数分钟) |
|
类型安全 |
中 |
中 |
高(编译期检查) |
|
典型开发者 |
Web3 前端工程师 |
DevOps / 数据工程师 |
区块链核心开发者 |
六、下一步
账户创建只是第一步。有了账户之后,通常接下来要:
- 发送交易:用刚创建的账户签名并发送交易,参考 Polkadot 文档中"使用 SDK 发送交易"部分
- 查询余额:获取账户的 DOT 余额或资产余额,参考"查询链上数据"部分
- 计算手续费:在实际发送前预估交易费用,参考"计算交易费用"部分
账户创建的代码本身不复杂,复杂的是搞清楚 SS58 格式、签名算法、助记词这些概念为什么和以太坊不一样。理解这些之后,你会发现 Polkadot 的账户体系设计得更灵活——同一把私钥在不同网络上显示不同地址,不同签名算法各有适用场景,这些都是有意为之的设计,不是随便起的。
阅读原文:https://docs.polkadot.com/chain-interactions/accounts/create-account/

740

被折叠的 条评论
为什么被折叠?



