原文作者:PaperMoon团队
你已经知道 Polkadot 用 32 字节地址,以太坊用 20 字节地址,两边需要映射才能互通——但"知道"和"做到"之间差着一整套操作流程。这篇教程不讲为什么,只讲怎么做。打开你的浏览器,跟着走一遍,十分钟内搞定双钱包互通。
准备工作
在开始之前,确保你手头有这些东西:
| 工具 | 用途 | 安装方式 |
|---|---|---|
| MetaMask 浏览器插件 | 以太坊钱包,用于验证 EVM 兼容性 | metamask.io |
| Polkadot.js 浏览器插件 | Polkadot 原生钱包,用于发起 map_account | polkadot.js.org |
| Chrome / Firefox 浏览器 | 两个插件都支持 | — |
本教程使用 Polkadot Hub TestNet(测试网) 操作,不花真金白银。全部流程在主网上完全一致,只是网络参数不同。
第一步:配置 MetaMask 连接 Polkadot Hub TestNet
打开 MetaMask,手动添加一个自定义网络。
1.1 进入网络设置
点击 MetaMask 左上角的网络选择器 → 点击「添加网络」→ 选择「手动添加网络」。
1.2 填写网络参数
| 字段 | 值 |
|---|---|
| 网络名称 | Polkadot Hub TestNet |
| RPC URL | https://eth-rpc-testnet.polkadot.io/ |
| 链 ID | 420420417 |
| 货币符号 | PAS |
| 区块浏览器 URL | https://blockscout-testnet.polkadot.io/ |
1.3 保存并切换
点击「保存」,然后将当前网络切换到刚添加的「Polkadot Hub TestNet」。切换成功后,MetaMask 右上角会显示网络名称,余额显示 `0 PAS`。
记下你的 MetaMask 地址(`0x` 开头的 20 字节地址),后面会用到。
主网参数备查:如果你要在主网操作,RPC URL 改为 `https://eth-rpc.polkadot.io/`,链 ID 改为 `420420419`,货币符号改为 `DOT`,浏览器 URL 改为 `https://blockscout.polkadot.io/`。
第二步:配置 Polkadot.js 连接测试网
2.1 安装 Polkadot.js 插件并创建账户
如果还没有 Polkadot.js 账户:
1. 安装浏览器插件后,点击插件图标
2. 点击「+」→「Create New Account」
3. **备份好助记词**(12 个单词,写在纸上,不要截图)
4. 设置账户名称和密码
5. 创建完成,你会看到一个 SS58 格式的地址(类似 `5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY`)
2.2 打开 Polkadot.js Apps
在浏览器中访问:
https://polkadot.js.org/apps/?rpc=wss://asset-hub-paseo-rpc.n.dwellir.com#/explorer
这会直接连接到测试网(Asset Hub Paseo)。页面左上角应该显示「Asset Hub (Paseo)」或类似字样,确认连接正确。
2.3 确认账户可见
点击顶部菜单「Accounts」→「Accounts」,你应该能看到刚才创建的账户。如果看不到,点击页面上的「Allow Access」授权插件。
第三步:领取测试币
两个钱包都需要测试币。MetaMask 侧需要 PAS 来支付 Gas 费,Polkadot.js 侧需要 PAS 来支付映射押金和交易费。
3.1 给 Polkadot.js 账户领币
1. 打开 Polkadot 水龙头:[https://faucet.polkadot.io/](https://faucet.polkadot.io/)
2. 在下拉菜单中选择测试网(Paseo Asset Hub)
3. 粘贴你的 Polkadot.js 账户地址(SS58 格式)
4. 点击发送
5. 等待几秒,回到 Polkadot.js Apps 的 Accounts 页面,确认余额已到账
3.2 给 MetaMask 账户领币
同样在水龙头页面:
1. 选择同一个测试网
2. 粘贴你的 MetaMask 地址(`0x` 开头)
3. 点击发送
4. 回到 MetaMask 确认余额到账
> 如果水龙头限制了领取频率,等几分钟再试。测试网的币没有价值,不用担心。
第四步:执行 map_account 地址映射(核心步骤)
这是整个教程的关键操作——把你的 Polkadot.js 原生账户映射到一个 20 字节的以太坊兼容地址,让 MetaMask 也能操作它。
4.1 打开 Extrinsics 页面
在 Polkadot.js Apps 中:
1. 点击顶部菜单「Developer」→「Extrinsics」
2. 你会看到一个交易构造界面
4.2 构造 map_account 调用
按以下步骤填写:
1. 「using the selected account」:选择你要映射的 Polkadot.js 账户
2. 「submit the following extrinsic」:在左侧下拉菜单中选择 `revive`(即 pallet_revive)
3. 右侧方法下拉菜单:选择 `mapAccount()`
这个调用不需要任何参数——它会自动映射当前发起调用的账户。
4.3 提交交易
1. 点击右下角「Submit Transaction」
2. 弹出签名窗口,输入你的 Polkadot.js 账户密码
3. 点击「Sign and Submit」
4. 等待交易被打包(通常几秒钟)
4.4 确认映射成功
交易成功后,你会在页面右上角看到绿色的成功提示。你也可以通过以下方式验证:
方法一:查看链上事件
1. 点击「Network」→「Explorer」
2. 在最近的区块中找到你的交易
3. 展开事件列表,应该能看到 `revive.AccountMapped` 事件
方法二:查询链上存储
1. 点击「Developer」→「Chain State」
2. 选择 `revive` → `originalAccount`
3. 输入你的 20 字节映射地址(下一步会讲怎么算)
4. 如果返回你的 32 字节账户 ID,说明映射已生效
第五步:计算你的映射地址
映射完成后,你的 Polkadot.js 账户现在有了一个对应的 20 字节以太坊地址。这个地址是通过 Keccak-256 哈希计算出来的。
5.1 用 JavaScript 计算
打开浏览器的开发者控制台(F12 → Console),或者在 Node.js 中运行:
```javascript
// Install ethers first: npm install ethers
// 安装依赖:npm install ethers
const { keccak256 } = require('ethers');
// Replace with your 32-byte Polkadot account ID (hex format)
// 中文:将下面的值替换为你的 32 字节 Polkadot 账户 ID(十六进制格式)
const polkadotAccountHex = '0xYOUR_32_BYTE_ACCOUNT_ID_HERE';
// Keccak-256 hash and take last 20 bytes
// 中文:对账户 ID 做 Keccak-256 哈希,取最后 20 字节
const hash = keccak256(polkadotAccountHex);
const ethAddress = '0x' + hash.slice(-40);
console.log('Your mapped Ethereum address:', ethAddress);
// 中文:输出你的映射以太坊地址
```
5.2 获取你的 32 字节账户 ID
在 Polkadot.js Apps 中:
1. 进入「Accounts」页面
2. 点击你的账户名称旁边的小图标,选择「Copy address」
3. 这是 SS58 编码的地址,你需要将它转换为十六进制格式
或者,在「Developer」→「Chain State」中查询 `system` → `account`,输入你的账户,返回结果中会包含十六进制格式的账户 ID。
5.3 在区块浏览器中验证
把计算出的 20 字节地址粘贴到测试网区块浏览器:
https://blockscout-testnet.polkadot.io/
搜索该地址,应该能看到与你 Polkadot.js 账户相同的余额和交易记录。
第六步:双钱包互通验证
现在来验证映射是否真正生效——从两侧分别操作,确认资金互通。
6.1 测试一:Polkadot.js → MetaMask 方向
从 Polkadot.js 账户向你的 MetaMask 地址转账:
1. 在 Polkadot.js Apps 中,点击「Accounts」→ 你的账户旁的「Send」
2. 在收款地址中,输入你的 MetaMask 地址(`0x` 开头的 20 字节地址)
3. 输入转账金额(比如 0.5 PAS)
4. 提交并签名
等待交易确认后,打开 MetaMask,检查余额是否增加了 0.5 PAS。
6.2 测试二:MetaMask → 映射地址方向
从 MetaMask 向你映射后的 20 字节地址转账:
1. 打开 MetaMask,点击「发送」
2. 在收款地址中,粘贴你在第五步计算出的映射地址
3. 输入转账金额(比如 0.3 PAS)
4. 确认并发送
等待交易确认后,回到 Polkadot.js Apps 的 Accounts 页面,检查你的原生账户余额是否增加了 0.3 PAS。
如果两个方向都通了——恭喜,映射成功!你的 Polkadot 原生账户现在可以同时被 Polkadot.js 和 MetaMask 操作。
6.3 测试三:用 MetaMask 调用智能合约
如果你在测试网上有已部署的合约,可以进一步验证:
1. 在 MetaMask 中切换到 Polkadot Hub TestNet
2. 使用任意 DApp 前端或 Remix 连接 MetaMask
3. 用你的映射账户调用合约方法
4. 在 Polkadot.js 的 Explorer 中确认交易事件
常见问题排查
映射交易失败:「revive.AccountAlreadyMapped」
说明你的账户已经映射过了,不需要重复操作。你可以在 Chain State 中查询 `revive.originalAccount` 来确认现有映射。
MetaMask 转账失败:Gas 估算错误
- 确认 MetaMask 网络配置正确(RPC URL 和链 ID)
- 确认账户有足够的 PAS 支付 Gas 费
- 尝试手动设置 Gas Limit 为 `100000`
映射后 MetaMask 余额显示为 0
映射建立的是地址关联,不会自动同步余额显示。你需要往映射后的 20 字节地址转一笔测试币,MetaMask 才会显示。如果你往映射地址转了币但 MetaMask 不显示,检查你是否连接的是正确的网络。
在 Polkadot.js 中找不到 revive pallet
确认你连接的是 Asset Hub(`wss://asset-hub-paseo-rpc.n.dwellir.com`),不是中继链。pallet_revive 只部署在 Asset Hub 上,中继链没有这个模块。
如何取消映射
在 Polkadot.js Apps 的 Extrinsics 页面,选择 `revive` → `unmapAccount()`,提交交易即可。取消后,映射押金会退还到你的账户。
主网操作速查表
当你在测试网跑通全流程后,切换到主网只需要改这些参数:
| 参数 | 测试网 | 主网 |
|---|---|---|
| MetaMask RPC URL | https://eth-rpc-testnet.polkadot.io/ | https://eth-rpc.polkadot.io/ |
| 链 ID | 420420417 | 420420419 |
| 货币符号 | PAS | DOT |
| 区块浏览器 | https://blockscout-testnet.polkadot.io/ | https://blockscout.polkadot.io/ |
| Polkadot.js WSS | wss://asset-hub-paseo-rpc.n.dwellir.com | wss://polkadot-asset-hub-rpc.polkadot.io |
| 映射押金 | PAS(测试币) | DOT(真实资产,可退还) |
主网注意:主网映射需要押金为真实的 DOT。操作前确保你理解整个流程(先在测试网练一遍),并确认账户有足够余额。
全流程回顾
完整的操作路径,一图总结:
```
[1] 安装 MetaMask + Polkadot.js 插件
↓
[2] MetaMask 添加 Polkadot Hub TestNet 网络(链 ID: 420420417)
↓
[3] Polkadot.js Apps 连接 Asset Hub Paseo 测试网
↓
[4] 水龙头领取 PAS 测试币(两个钱包都领)
↓
[5] Polkadot.js Apps → Developer → Extrinsics
→ revive → mapAccount() → 签名提交
↓
[6] 计算映射后的 20 字节地址(Keccak-256 哈希)
↓
[7] 双向转账验证:Polkadot.js ↔ MetaMask 互通
↓
✅ 映射完成,双钱包可操作同一账户
```
从这里开始,你可以用 MetaMask 连接 Polkadot 上的 DApp、部署 Solidity 合约、调用合约方法——所有以太坊工具链都能用了。
阅读原文:https://docs.polkadot.com/smart-contracts/for-eth-devs/accounts/
186

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



