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 合约:

  1. **调用 map_account**:你需要发起一笔交易,显式地将你的 32 字节 ID 绑定到一个 20 字节的 EVM 地址。
  2. 存储绑定:这个映射关系会记录在链上状态中。
  3. 好处:这样你在使用以太坊工具(如 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 subkeyRust 项目构建工具 cargo 的专用命令,核心作用是:为指定的 Rust 项目(包)subkey,以 生产环境优化模式 构建可执行文件或库文件(subkey 通常是 Polkadot/Substrate 生态中的密钥管理工具,此处作为包名)。

下面我们拆分每个参数详细解释,帮你彻底理解:


一、核心命令:cargo build

cargo 是 Rust 官方的项目管理和构建工具(类似 Node.js 的 npm、Java 的 maven),而 cargo buildcargo 的核心子命令之一,基础功能是编译构建当前 Rust 工作区(workspace)中的项目代码,生成对应的二进制文件(可执行程序)或库文件。

默认情况下(不带任何参数),cargo build 会以「调试模式(debug mode)」构建项目,该模式不开启代码优化,编译速度快,保留完整调试信息,方便开发阶段调试程序。


二、关键参数:--release

--releasecargo build 的核心优化参数,它的作用是:启用生产环境优化模式(发布模式)构建项目,对应的构建产物会输出到 target/release/ 目录下(而非调试模式的 target/debug/)。

该模式的核心特性:

  1. 开启 Rust 编译器的最高级别优化(-O3 级别),会对代码进行常量折叠、死代码消除、循环优化等一系列优化操作,最终生成的二进制文件运行速度更快、体积更小;
  2. 关闭调试信息,无法直接用于调试(gdb 等调试工具难以解析);
  3. 编译时间更长(因优化操作耗时);
  4. 适用于生产环境部署、性能测试等场景(而非开发调试阶段)。

三、指定包参数:-p subkey(全称 --package subkey

1. 核心作用

-p--package 的简写形式,该参数的作用是 在一个 Rust 工作区(多包项目)中,明确指定本次只构建 subkey 这个包(package/crate),而非构建工作区中的所有包

2. 适用场景

Rust 支持「工作区(workspace)」特性,一个项目根目录下可以包含多个子包(比如一个区块链项目可能同时包含 nodeclisubkey 等多个子包)。默认执行 cargo build 会构建工作区中所有可构建的包,而 -p subkey 可以精准指定只构建 subkey,避免不必要的编译,节省时间。

3. 补充说明

subkey 是包的「名称」(对应包目录下 Cargo.toml 文件中的 name = "subkey" 配置),而非包的目录路径,cargo 会自动在工作区中查找该名称对应的包并构建。


四、补充细节

  1. 产物路径:该命令构建完成后,subkey 的可执行文件(或库文件)会生成在 <项目根目录>/target/release/ 下(可执行文件直接名为 subkey(Linux/Mac)或 subkey.exe(Windows));
  2. cargo build --release 的区别:后者会构建工作区所有包的 release 版本,前者只构建 subkey 一个包的 release 版本;
  3. subkey 背景subkey 通常是 Polkadot、Substrate 区块链生态中的密钥生成、管理、签名验证工具,该命令常见于编译安装该工具的场景。

总结

  1. 整体:编译 Rust 工作区中的 subkey 包,生成生产环境优化后的构建产物;
  2. 各部分:cargo build(基础构建)→ --release(生产环境优化,输出到 target/release)→ -p subkey(指定只构建 subkey 包,而非整个工作区)。

yarn add polkadot-api 是什么意思

yarn add polkadot-api

命令整体含义

yarn add polkadot-apiJavaScript/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 部分功能(或作为其升级/补充版本)。

二、关键执行结果(命令运行后会发生什么)

  1. 创建/更新 node_modules/ 目录

    • 如果项目中没有 node_modules/ 目录,yarn 会自动创建该目录,并将 polkadot-api 及其所有依赖(依赖的依赖,即间接依赖)下载并存放至此;
    • 如果已有该目录,会新增 polkadot-api 相关文件,同时更新可能存在的依赖版本。
  2. 更新项目配置文件

    • 自动更新 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 的安装版本、所有间接依赖的版本及下载地址,确保团队其他成员或部署环境安装时,能获得完全一致的依赖版本,避免“本地能运行,线上报错”的版本冲突问题。
  3. 可选:安装指定版本
    若你需要安装 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

三、补充说明

  1. 适用前提:执行该命令前,需确保当前目录是 JavaScript/TypeScript 项目根目录(已通过 yarn initnpm init 初始化,存在 package.json 文件),否则会报错;
  2. npm install polkadot-api 的区别:两者功能一致(均安装该包),只是包管理器不同(yarn vs npm),对应的锁定文件分别是 yarn.lockpackage-lock.json
  3. 开发环境安装:若仅在开发/测试阶段使用该包(生产环境无需打包),可添加 --dev 参数(简写 -D),会将其注册到 package.jsondevDependencies 字段:
    1
    2
    3
    yarn add polkadot-api --dev
    # 简写
    yarn add polkadot-api -D

总结

  1. 整体:通过 yarn 包管理器为当前 JS/TS 项目安装 Polkadot 生态的 polkadot-api 依赖包;
  2. 各部分:yarn(包管理器)→ add(安装命令)→ polkadot-api(目标依赖包,用于 Polkadot 链交互);
  3. 核心结果:依赖存入 node_modules/,版本记录到 package.jsonyarn.lock,可在项目中引入并使用该包的功能。

波卡支持的签名算法有哪些

波卡(基于Substrate)核心支持3种签名算法:sr25519(默认)、ed25519、ecdsa(secp256k1),均适配SS58地址体系,核心差异在曲线、签名特性与适用场景。以下从算法细节、特性对比与安全审计视角展开说明。


一、三大核心签名算法详解

  1. sr25519(Schnorrkel/Ristretto)

    • 底层:基于Curve25519的Schnorr变体,用Ristretto点压缩剔除cofactor风险,哈希依赖merlin(基于Keccak‑f(1600))。
    • 核心特性:支持HDKD(分层确定性密钥推导)、原生签名聚合多签、VRF(可验证随机函数),适合链上治理与验证人场景。
    • 适用:波卡/Substrate默认账户算法,Polkadot‑JS扩展默认生成,适合日常转账、Staking、多签与平行链操作。
    • 地址:SS58前缀适配对应链,公钥32字节,校验和2/4字节。
  2. ed25519(EdDSA)

    • 底层:EdDSA变体,Curve25519+SHA‑512,确定性签名,无随机数依赖,抗侧信道攻击。
    • 核心特性:签名/验签速度快,HSM(硬件安全模块)兼容性好,适合传统密钥管理方案。
    • 适用:需对接企业级HSM、冷钱包或外部KMS的场景,账户迁移与合规存储更友好。
    • 地址:与sr25519同属SS58体系,仅密钥推导与签名逻辑不同,地址格式兼容。
  3. 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安全审计视角的关键提示

  1. 账户选型安全
    • 日常操作优先sr25519,利用HDKD与多签提升安全性;大额资产用ed25519+HSM冷存储,降低私钥泄露风险。
    • ecdsa跨链复用私钥时,需隔离波卡与BTC/ETH生态操作,避免一链泄露全链受损。
  2. 签名验证要点
    • 合约审计中,需确认签名算法与链配置匹配,如EVM平行链的ecdsa验签需适配secp256k1参数,避免验签逻辑漏洞。
    • 跨链消息验证时,注意不同算法的公钥格式差异,用Substrate API Sidecar的validate接口校验SS58地址与公钥对应关系。
  3. 格式转换风险
    • 同一公钥在不同算法下地址不同,不可混淆;如sr25519与ed25519公钥不可互转,需通过钱包重新生成对应算法账户。

四、快速实操指南

  1. 在Polkadot‑JS扩展中创建账户时,可手动选择算法:默认sr25519,可选ed25519或ecdsa。
  2. 验证签名算法:通过Subscan账户详情页查看公钥类型,或用Polkadot‑JS UI的“签名验证”工具校验交易签名算法。
  3. 跨链/跨算法迁移:需重新生成目标算法的密钥对,通过链上转账迁移资产,不可直接复用私钥。

需要我按你常用的钱包(如Polkadot‑JS/Talisman) 给出三种算法的账户创建步骤,并补充2个合约审计中签名算法校验的常见漏洞与修复方案吗?

波卡revive计算gas的维度 A. ref_time B. proof_size C input size D storage deposit 这是多选题

这道题的正确答案是 A. ref_timeB. proof_sizeD. storage deposit

选项解析

  1. A. ref_time(正确)
    ref_time 是 参考时间,用于衡量交易执行过程中消耗的计算资源(如指令执行、逻辑判断、数据处理等),是波卡(Substrate)网络中计算 Gas 的核心维度之一,直接对应交易的计算成本。

  2. B. proof_size(正确)
    proof_size 是 证明大小,用于衡量交易中携带的零知识证明(ZKP)或其他密码学证明的字节大小,针对需要验证证明的交易(如隐私交易、跨链消息),其大小会直接影响验证成本,属于 Gas 计算的重要维度。

  3. C. input size(错误)
    input size(输入大小)是交易的附带数据长度,但波卡网络不直接将其作为独立的 Gas 计算维度。输入数据的处理成本已被包含在 ref_time 中(如数据解析、存储读取等操作的计算时间),不会单独计费。

  4. 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...010x00...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)通过 staticcallcall 发送到对应的地址,预编译合约会处理整个 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 等不同链的地址吗?

参考资料