Polkadot Solidity开发-课程笔记5
revive对EVM账号的映射是什么意思
简单来说,revive 对 EVM 账号的映射是为了让 Polkadot 的“原生账户”和 Ethereum 的“20 字节账户”能够互相识别并互通。
由于你之前提到过,你预判了香港高才通并拿到了签证,这种通过特定标准(映射)获得新身份的逻辑,与 revive 处理账号的方式有异曲同工之妙。
1. 为什么要映射?(核心背景)
在 Polkadot 生态中,账号通常是 32 字节(SS58 格式),而以太坊(EVM)使用的是 20 字节(H160 格式)。
- 不映射的问题:如果你想在 Polkadot 上直接用 MetaMask(以太坊钱包)操作,或者让以太坊智能合约识别你的 Polkadot 原生账号,两者的“语言”是对不上的。
- revive 的作用:
pallet-revive是 Polkadot 2.0 引入的新组件,它不仅支持以太坊虚拟机(EVM),还支持更先进的 PolkaVM(PVM)。映射就是为了让这两个世界的账号能“握手”。
2. 映射的两种路径
根据技术实现,映射通常分为以下两种方式:
A. 从 EVM 映射到 Polkadot (默认转换)
当你在 revive 上使用一个以太坊地址(如 0x123...)时,系统会自动通过一个确定的算法将其转换为 Polkadot 的 32 字节格式。
- 逻辑:通常是在以太坊地址前填充特定的后缀(如
0xEE...)或者进行哈希运算。 - 结果:这保证了每个以太坊账号在 Polkadot 链上都有一个对应的“影子账号”来持有资产。
B. 从 Polkadot 映射到 EVM (状态映射)
这是你作为 Polkadot 原生用户最需要关注的。如果你有一个现有的 Polkadot 32 字节账号,想去玩 revive 上的 EVM 合约:
- **调用
map_account**:你需要发起一笔交易,显式地将你的 32 字节 ID 绑定到一个 20 字节的 EVM 地址。 - 存储绑定:这个映射关系会记录在链上状态中。
- 好处:这样你在使用以太坊工具(如 MetaMask)时,实际上操作的是你原本的 Polkadot 账户资产。
3. 技术实现对比
| 特性 | 以太坊原生 (H160) | Polkadot 原生 (AccountId32) |
|---|---|---|
| 长度 | 20 字节 | 32 字节 |
| 映射方式 | 自动拼接后缀或哈希 | 显式调用 map_account 绑定 |
| 兼容工具 | MetaMask, Hardhat | Polkadot{.js}, Talisman |
4. 这对你有什么意义?
revive 的映射机制是为了排除“账号不兼容”这个错误障碍。
- 资产互通:你可以直接在 Asset Hub 等平行链上,用以太坊的方式处理原本属于 Polkadot 格式的资产。
- 开发者友好:正如你提到的“获取全球信息权”的重要性,这种映射让开发者可以无缝把以太坊的 DApp 搬到 Polkadot 上,同时保留对原生生态的访问。
Polkadot Revive 技术演示
这个视频详细介绍了 Project Revive 的架构,包括它是如何让 Solidity 合约在 PolkaVM 上运行以及账号处理的相关逻辑。
如果你需要,我可以为你演示如何在测试网(如 Westend)上实际操作这个账号映射过程,或者帮你分析它对你未来预判 Web3 行业机会有什么影响?
cargo build –release -p subkey是什么意思
命令整体含义

cargo build --release -p subkey 是 Rust 项目构建工具 cargo 的专用命令,核心作用是:为指定的 Rust 项目(包)subkey,以 生产环境优化模式 构建可执行文件或库文件(subkey 通常是 Polkadot/Substrate 生态中的密钥管理工具,此处作为包名)。
下面我们拆分每个参数详细解释,帮你彻底理解:
一、核心命令:cargo build
cargo 是 Rust 官方的项目管理和构建工具(类似 Node.js 的 npm、Java 的 maven),而 cargo build 是 cargo 的核心子命令之一,基础功能是编译构建当前 Rust 工作区(workspace)中的项目代码,生成对应的二进制文件(可执行程序)或库文件。
默认情况下(不带任何参数),cargo build 会以「调试模式(debug mode)」构建项目,该模式不开启代码优化,编译速度快,保留完整调试信息,方便开发阶段调试程序。
二、关键参数:--release
--release 是 cargo build 的核心优化参数,它的作用是:启用生产环境优化模式(发布模式)构建项目,对应的构建产物会输出到 target/release/ 目录下(而非调试模式的 target/debug/)。
该模式的核心特性:
- 开启 Rust 编译器的最高级别优化(
-O3级别),会对代码进行常量折叠、死代码消除、循环优化等一系列优化操作,最终生成的二进制文件运行速度更快、体积更小; - 关闭调试信息,无法直接用于调试(
gdb等调试工具难以解析); - 编译时间更长(因优化操作耗时);
- 适用于生产环境部署、性能测试等场景(而非开发调试阶段)。
三、指定包参数:-p subkey(全称 --package subkey)
1. 核心作用
-p 是 --package 的简写形式,该参数的作用是 在一个 Rust 工作区(多包项目)中,明确指定本次只构建 subkey 这个包(package/crate),而非构建工作区中的所有包。
2. 适用场景
Rust 支持「工作区(workspace)」特性,一个项目根目录下可以包含多个子包(比如一个区块链项目可能同时包含 node、cli、subkey 等多个子包)。默认执行 cargo build 会构建工作区中所有可构建的包,而 -p subkey 可以精准指定只构建 subkey,避免不必要的编译,节省时间。
3. 补充说明
subkey 是包的「名称」(对应包目录下 Cargo.toml 文件中的 name = "subkey" 配置),而非包的目录路径,cargo 会自动在工作区中查找该名称对应的包并构建。
四、补充细节
- 产物路径:该命令构建完成后,
subkey的可执行文件(或库文件)会生成在<项目根目录>/target/release/下(可执行文件直接名为subkey(Linux/Mac)或subkey.exe(Windows)); - 与
cargo build --release的区别:后者会构建工作区所有包的 release 版本,前者只构建subkey一个包的 release 版本; subkey背景:subkey通常是 Polkadot、Substrate 区块链生态中的密钥生成、管理、签名验证工具,该命令常见于编译安装该工具的场景。
总结
- 整体:编译 Rust 工作区中的
subkey包,生成生产环境优化后的构建产物; - 各部分:
cargo build(基础构建)→--release(生产环境优化,输出到 target/release)→-p subkey(指定只构建 subkey 包,而非整个工作区)。
yarn add polkadot-api 是什么意思
yarn add polkadot-api
命令整体含义
yarn add polkadot-api 是 JavaScript/TypeScript 生态中的包管理命令,核心作用是:通过 yarn 包管理器,将名为 polkadot-api 的第三方依赖包安装到当前项目中,并自动完成依赖注册、版本锁定等相关配置,方便你在项目中使用该包提供的功能(polkadot-api 是专门用于与 Polkadot/Substrate 区块链生态交互的开发工具包)。
下面拆分核心组件和关键细节,帮你彻底理解:
一、核心组件解析
1. yarn:JavaScript 包管理器
yarn 是一款流行的开源包管理工具(由 Facebook 推出,替代早期的 npm 部分场景,也可与 npm 兼容),核心功能是:
- 下载/安装第三方依赖包到项目中;
- 管理依赖版本,避免版本冲突;
- 记录依赖信息到配置文件,方便团队协作和项目部署。
它的作用类似 Rust 中的cargo、Java 中的maven、Python 中的pip。
2. add:yarn 的核心子命令
yarn add <包名> 是 yarn 的核心安装命令,作用是为当前项目安装指定的第三方依赖包。
- 执行该命令后,
yarn会自动从官方包仓库(npm registry)下载polkadot-api的最新稳定版本(或指定版本,默认最新); - 会将依赖包解压到项目的
node_modules/目录(所有本地依赖的存放目录); - 自动更新项目的配置文件,完成依赖注册。
3. polkadot-api:目标依赖包
polkadot-api 是专门针对 Polkadot/Substrate 区块链生态开发的 JavaScript/TypeScript 工具包,核心用途是:
- 让开发者在前端项目(Vue/React 等)或 Node.js 后端项目中,轻松与 Polkadot 节点、Substrate 自定义链进行交互;
- 提供密钥管理、交易签名与发送、链上数据查询(区块、账户、合约等)、事件监听等核心功能;
- 是 Polkadot 生态前端/Node.js 开发的核心依赖之一,替代早期的
@polkadot/api部分功能(或作为其升级/补充版本)。
二、关键执行结果(命令运行后会发生什么)
创建/更新
node_modules/目录- 如果项目中没有
node_modules/目录,yarn会自动创建该目录,并将polkadot-api及其所有依赖(依赖的依赖,即间接依赖)下载并存放至此; - 如果已有该目录,会新增
polkadot-api相关文件,同时更新可能存在的依赖版本。
- 如果项目中没有
更新项目配置文件
- 自动更新
package.json文件:在该文件的dependencies字段中,添加polkadot-api的版本记录(格式如"polkadot-api": "^x.y.z"),标记该包为项目的生产环境依赖(运行项目时必须的依赖,区别于开发环境依赖devDependencies);
示例package.json片段:1
2
3
4
5
6
7
8{
"name": "your-project",
"version": "1.0.0",
"dependencies": {
"polkadot-api": "^0.12.0", // 安装后自动添加
"other-package": "^1.0.0"
}
} - 自动更新/创建
yarn.lock文件:该文件是yarn的版本锁定文件,会精确记录polkadot-api的安装版本、所有间接依赖的版本及下载地址,确保团队其他成员或部署环境安装时,能获得完全一致的依赖版本,避免“本地能运行,线上报错”的版本冲突问题。
- 自动更新
可选:安装指定版本
若你需要安装polkadot-api的特定版本(而非最新版),可在包名后添加版本号,格式如下:1
2
3
4# 安装 0.12.0 精确版本
yarn add polkadot-api@0.12.0
# 安装 ^0.12.0 版本(兼容 0.12.x 系列更新,默认方式)
yarn add polkadot-api@^0.12.0
三、补充说明
- 适用前提:执行该命令前,需确保当前目录是 JavaScript/TypeScript 项目根目录(已通过
yarn init或npm init初始化,存在package.json文件),否则会报错; - 与
npm install polkadot-api的区别:两者功能一致(均安装该包),只是包管理器不同(yarnvsnpm),对应的锁定文件分别是yarn.lock和package-lock.json; - 开发环境安装:若仅在开发/测试阶段使用该包(生产环境无需打包),可添加
--dev参数(简写-D),会将其注册到package.json的devDependencies字段:1
2
3yarn add polkadot-api --dev
# 简写
yarn add polkadot-api -D
总结
- 整体:通过
yarn包管理器为当前 JS/TS 项目安装 Polkadot 生态的polkadot-api依赖包; - 各部分:
yarn(包管理器)→add(安装命令)→polkadot-api(目标依赖包,用于 Polkadot 链交互); - 核心结果:依赖存入
node_modules/,版本记录到package.json和yarn.lock,可在项目中引入并使用该包的功能。
波卡支持的签名算法有哪些
波卡(基于Substrate)核心支持3种签名算法:sr25519(默认)、ed25519、ecdsa(secp256k1),均适配SS58地址体系,核心差异在曲线、签名特性与适用场景。以下从算法细节、特性对比与安全审计视角展开说明。
一、三大核心签名算法详解
sr25519(Schnorrkel/Ristretto)
- 底层:基于Curve25519的Schnorr变体,用Ristretto点压缩剔除cofactor风险,哈希依赖merlin(基于Keccak‑f(1600))。
- 核心特性:支持HDKD(分层确定性密钥推导)、原生签名聚合多签、VRF(可验证随机函数),适合链上治理与验证人场景。
- 适用:波卡/Substrate默认账户算法,Polkadot‑JS扩展默认生成,适合日常转账、Staking、多签与平行链操作。
- 地址:SS58前缀适配对应链,公钥32字节,校验和2/4字节。
ed25519(EdDSA)
- 底层:EdDSA变体,Curve25519+SHA‑512,确定性签名,无随机数依赖,抗侧信道攻击。
- 核心特性:签名/验签速度快,HSM(硬件安全模块)兼容性好,适合传统密钥管理方案。
- 适用:需对接企业级HSM、冷钱包或外部KMS的场景,账户迁移与合规存储更友好。
- 地址:与sr25519同属SS58体系,仅密钥推导与签名逻辑不同,地址格式兼容。
ecdsa(secp256k1)
- 底层:ECDSA变体,基于secp256k1曲线,与比特币/以太坊兼容,哈希常用SHA‑256。
- 核心特性:生态工具成熟,私钥可复用至部分BTC/ETH生态钱包,适合跨链资产互通场景。
- 适用:兼容传统区块链账户体系,或需与EVM平行链(如Moonbeam)做签名互通的场景。
- 地址:可映射为SS58格式(前缀适配链配置),也支持EVM兼容地址(如H160),需注意格式转换安全。
二、关键特性对比表
| 维度 | sr25519 | ed25519 | ecdsa(secp256k1) |
|---|---|---|---|
| 签名类型 | Schnorr(Schnorrkel) | EdDSA(Schnorr变体) | ECDSA |
| 曲线 | Curve25519(Ristretto) | Curve25519 | secp256k1 |
| 核心能力 | HDKD、多签聚合、VRF | 快速签名/验签、HSM适配 | 跨链生态兼容、工具成熟 |
| 安全优势 | 剔除cofactor,多签更安全 | 确定性签名,抗侧信道 | 长期实践验证,攻击成本高 |
| 波卡默认 | 是 | 否 | 否 |
| 钱包支持 | Polkadot‑JS、Talisman等 | 主流钱包均支持 | 需手动选择或适配 |
三、Web3安全审计视角的关键提示
- 账户选型安全
- 日常操作优先sr25519,利用HDKD与多签提升安全性;大额资产用ed25519+HSM冷存储,降低私钥泄露风险。
- ecdsa跨链复用私钥时,需隔离波卡与BTC/ETH生态操作,避免一链泄露全链受损。
- 签名验证要点
- 合约审计中,需确认签名算法与链配置匹配,如EVM平行链的ecdsa验签需适配secp256k1参数,避免验签逻辑漏洞。
- 跨链消息验证时,注意不同算法的公钥格式差异,用Substrate API Sidecar的validate接口校验SS58地址与公钥对应关系。
- 格式转换风险
- 同一公钥在不同算法下地址不同,不可混淆;如sr25519与ed25519公钥不可互转,需通过钱包重新生成对应算法账户。
四、快速实操指南
- 在Polkadot‑JS扩展中创建账户时,可手动选择算法:默认sr25519,可选ed25519或ecdsa。
- 验证签名算法:通过Subscan账户详情页查看公钥类型,或用Polkadot‑JS UI的“签名验证”工具校验交易签名算法。
- 跨链/跨算法迁移:需重新生成目标算法的密钥对,通过链上转账迁移资产,不可直接复用私钥。
需要我按你常用的钱包(如Polkadot‑JS/Talisman) 给出三种算法的账户创建步骤,并补充2个合约审计中签名算法校验的常见漏洞与修复方案吗?
波卡revive计算gas的维度 A. ref_time B. proof_size C input size D storage deposit 这是多选题
这道题的正确答案是 A. ref_time、B. proof_size、D. storage deposit。
选项解析
A. ref_time(正确)
ref_time 是 参考时间,用于衡量交易执行过程中消耗的计算资源(如指令执行、逻辑判断、数据处理等),是波卡(Substrate)网络中计算 Gas 的核心维度之一,直接对应交易的计算成本。B. proof_size(正确)
proof_size 是 证明大小,用于衡量交易中携带的零知识证明(ZKP)或其他密码学证明的字节大小,针对需要验证证明的交易(如隐私交易、跨链消息),其大小会直接影响验证成本,属于 Gas 计算的重要维度。C. input size(错误)
input size(输入大小)是交易的附带数据长度,但波卡网络不直接将其作为独立的 Gas 计算维度。输入数据的处理成本已被包含在 ref_time 中(如数据解析、存储读取等操作的计算时间),不会单独计费。D. storage deposit(正确)
storage deposit 是 存储押金,用于衡量交易对链上存储的新增或修改成本。波卡采用“存储押金”机制:用户需要为占用的链上存储支付押金(可在存储释放时退还),这部分成本属于交易的必要费用,与 ref_time、proof_size 共同构成交易的总费用计算维度。
补充说明
波卡(Substrate)的交易费用计算公式可简化为:
总费用 = 基础费用 + (ref_time × 时间单价) + (proof_size × 证明单价) + storage deposit
其中:
- 基础费用是网络固定收取的最低费用;
- ref_time 和 proof_size 是消耗型费用(交易执行后不退还);
- storage deposit 是押金型费用(存储释放时可退还)。
干扰选项修正(针对你之前需要的混淆选项逻辑)
若将选项 C 作为干扰项,其迷惑点在于:输入大小会影响交易处理效率,但波卡已将其成本整合到 ref_time 中,并非独立计费维度,容易让人误以为“数据量大就会单独加费”。
需要我为你整理波卡交易费用计算的完整公式,并补充各维度在智能合约审计中的校验要点吗?
revive precompile的地址分配 A. 连续分配 B 不同类型有自己的空间
在 Ethereum 以及兼容 EVM 的链(如 Revive/Rollup 等)中,Precompiles(预编译合约) 的地址分配逻辑通常遵循 B 方案:不同类型(或逻辑分组)有自己的空间,但在某些特定实现或升级阶段,也会表现出一定的连续性。
针对 Revive 或类 EVM 架构,预编译地址的分配逻辑可以从以下几个维度来理解:
1. 核心分配逻辑:分组空间 (Namespace Partitioning)
EVM 并不随机分配地址,而是预留了**低位地址空间(Low-address space)**专门给预编译合约。
- 标准 EVM 预编译 (Standard Range):
地址范围通常从0x00...01到0x00...09(目前以太坊主网)。这部分是连续分配的,每增加一个新功能(如 sha256, blake2f),地址就加 1。 - 特定链/特定引擎扩展 (Custom Range):
对于像 Revive 这种可能涉及跨链通信、L2 特性或特定加密算法的链,通常会开辟一个新的地址段,以防与以太坊未来的标准预编译地址冲突。例如: 0x00...01-0x00...ffff: 预留给标准以太坊。0x00...0100或更高: 预留给特定链的扩展功能(如存储证明、身份验证)。
2. Revive 中的具体体现
在 Revive 的架构中,地址分配往往考虑到 RISC-V 兼容性 或 PVM (PolkaVM) 的特性。
- 固定偏移量: 开发者会定义一个起始 Base 地址,不同类型的预编译合约根据功能模块分布在不同的 Offset 上。
- 类型化空间:
- 算力密集型: 放在标准 EVM 区间。
- 系统交互型: 可能会放在一个远高于标准区间的特定地址段(如
0x...4000之后),形成一个“私有空间”。
3. 为什么选择“不同类型有自己的空间”?
这种设计主要为了解决以下三个问题:
| 维度 | 优势说明 |
|---|---|
| 防冲突 | 避免链升级时,自定义预编译地址被以太坊主网新出的预编译地址覆盖。 |
| 路由效率 | 节点在执行交易时,可以快速通过地址前缀判断该调用是走标准 EVM 逻辑、还是走 Revive 特有的系统调用。 |
| 权限隔离 | 不同空间的地址可以设置不同的访问权限或 Gas 计费模型(例如系统级合约与普通加密库)。 |
总结
Revive 的预编译地址分配更倾向于 B(不同类型有自己的空间)。虽然在一个小类型内部(比如基础加密库)地址可能是连续的,但从宏观架构上看,为了保证兼容性和可扩展性,会为不同功能的预编译合约划分独立的地址区间。
正如你之前“排除错误选项”的逻辑,这种空间隔离的设计正是为了排除“地址冲突”和“逻辑耦合”这两个错误选项,从而保证系统长期运行的稳健性。
如果你需要查看 Revive 特定的预编译地址映射表(如具体哪些地址对应哪些功能),需要我帮你检索其最新的技术文档或代码定义吗?
revive precompile应该如何调用? A 没有selector,只能直接call B 要根据每个precompile的定义,有的可以选择selector
针对 Revive (Pallet-revive / PolkaVM) 的 Precompile 调用方式,正确答案更倾向于 B(根据定义而定,有的可以/需要选择器),但需要分层理解。
这与原生以太坊(EVM)的逻辑略有不同。在 Revive 这种基于 RISC-V 的环境中,为了兼容性和扩展性,调用机制被设计得更加灵活:
1. 标准以太坊预编译 (0x01 - 0x09)
对于这部分地址(如 sha256, ecrecover),Revive 保持了与 EVM 的完全一致性:
- 调用方式: 没有 Selector。
- 逻辑: 它们被视为“黑盒”函数。你只需要将原始数据(Raw bytes)通过
staticcall或call发送到对应的地址,预编译合约会处理整个 Input。 - 例子: 调用
0x02(sha256) 时,你发送的是要哈希的数据,而不是函数签名。
2. Revive 自定义/系统预编译 (如 0x100 及以上)
Revive 引入了一些特定的系统调用(如跨链 XCM、状态查询或特定的加密算法 secp256r1 等)。对于这些较复杂的预编译合约:
- 调用方式: 支持并推荐使用 Selector。
- 原因: 这些预编译合约往往不只是一个功能,而是一个“系统合约”,内部可能包含多个方法(例如
verify(),getQuota(),transfer())。 - 实现: Revive 使用了
SolInterface(基于 Alloy 库)。这意味着你可以像调用普通 Solidity 合约一样,通过 4 字节选择器 (Function Selector) 来分发(Dispatch)逻辑。
总结对比
| 类型 | 代表地址 | 是否有 Selector | 调用建议 |
|---|---|---|---|
| 标准 EVM 预编译 | 0x01 ~ 0x09 |
无 | 直接发送 Raw Data |
| Revive 系统预编译 | 0x100 以上 |
有 | 使用 ABI 编码(Selector + Params) |
为什么 Revive 选 B 而不是 A?
这体现了你之前提到的“排除错误选项”的思维:
- 如果全选 A (无 Selector):那么当一个预编译合约需要增加新功能时,就必须分配一个新地址。这会导致地址空间极度碎片化,管理成本极高。
- 如果选 B (支持 Selector):可以将逻辑相关的多种功能整合在同一个地址下。这不仅符合 Solidity 开发者的习惯(可以直接定义 Interface 并调用),也让系统扩展更加优雅。
既然你在写书并研究 Revive,需要我为你提供一个在 Solidity 中调用 Revive 特有预编译合约(带 Selector)的代码示例吗?
波卡的SS58账号在每天链上都一样吗 A. 一样 B. 根据prefix不同
在波卡(Polkadot)生态中,关于 SS58 账号的呈现方式,正确答案是 B(根据 prefix 不同,看起来不一样,但本质是同一个账号)。
你可以这样理解波卡的地址逻辑:
1. 核心逻辑:一个公钥,多种皮肤
波卡地址的底层是一个 32 字节的公钥 (Public Key)。SS58 是一种编码格式,它的公式大致是:SS58 = Base58(Prefix + Public Key + Checksum)
Prefix(前缀):每个链都有自己的编号。
Polkadot: Prefix 0 (地址通常以
1开头)Kusama: Prefix 2 (地址通常以大写字母开头,如
C, D, E...)Generic Substrate: Prefix 42 (地址通常以
5开头)外观不同:由于前缀不同,同一个公钥在不同的链上生成的字符串(地址)是完全不同的。
本质相同:虽然看起来不一样,但由于它们对应同一个私钥/公钥对,你在一条链上拥有的私钥,可以推导出并在所有链上使用。
2. 为什么设计成“外观不一样”?
这其实是波卡为了防止用户误转账的一种保护机制(排除“用户在错误链上转账”这个错误选项):
- 如果你想往 Polkadot 转账,却输入了一个以
5开头的 Generic 地址,钱包或交易所会立刻提示“地址格式不匹配”,从而避免资金进入错误的链。
3. 行业新趋势:地址统一化 (Unifying)
你在 2026 年关注这个话题非常敏锐。波卡社区(包括 Gavin Wood 的提议)正在推进 “统一地址格式”:
- 现状:各链各样,用户很晕。
- 目标:未来可能倾向于在 UI 层统一使用 Polkadot 的 Prefix 0 或统一的 EVM 风格地址(尤其是随着 pallet-revive 的普及),让用户感知到“我在所有链上都是同一个号”。
总结与复盘
| 维度 | 特点 |
|---|---|
| 视觉表现 | 不一样 (由 Prefix 决定) |
| 底层公钥 | 完全一样 |
| 转账兼容性 | 无法直接混用(需转换),但私钥通用 |
这就呼应了你之前的预判:“获得全球信息获取权的重要性”。在波卡生态中,如果你能理解 SS58 的编码原理,你就能在不同链之间自由“转换”身份,而普通用户可能会被这一串看似不同的字符困住。
你想让我为你展示如何用同一个公钥,通过工具转换出 Polkadot、Kusama 和 Astar 等不同链的地址吗?
参考资料
- 【第二课-2.1:波卡账号和签名体系等概念介绍|Polkadot 上的 Solidity 与 EVM 开发者路径】 https://www.bilibili.com/video/BV13SiuBqECs/?share_source=copy_web&vd_source=eba7ead3baa3d262a5be9ffe7184d3b4