Polkadot Solidity开发-课程笔记9

🚩课程学习链接:https://youtube.com/playlist?list=PLKgwQU2jh_H8zyq46XsUkAz10213HDL0i&si=UqonC3oL304_Mtrk
✏️ 第二课 Task2 任务:
1⃣️选择题:https://wj.qq.com/s2/25402456/fb1j/
2⃣️实践题:https://github.com/papermoonio/2026-h1-building-production-grade-dApps/blob/main/homework/lesson-2/README.md

get-metadata.sh的作用

npx papi add devnet -w ws://localhost:9944
npx papi add hub -w wss://asset-hub-paseo-rpc.n.dwellir.com


你提供的这几行内容并不是编程语言代码,而是在终端/命令行中执行的Shell命令,核心作用是通过 papi 工具配置和添加Polkadot/Substrate生态下的区块链网络节点连接信息,方便后续和这些节点交互。

我来逐行拆解它们的具体作用:

1. get-metadata.sh

这是执行一个名为 get-metadata.sh 的Shell脚本文件(.sh 是Linux/macOS系统的脚本后缀)。

  • 结合Polkadot生态的上下文,这个脚本的核心功能大概率是从指定的区块链节点获取链的元数据(metadata)
  • 元数据是Substrate链的核心配置,包含链的模块、调用方法、数据结构等关键信息,后续和链交互(如调用接口、查询数据)都依赖它。

2. npx papi add devnet -w ws://localhost:9944

  • npx:Node.js的包执行工具,无需全局安装 papi,直接临时下载并执行 papi 命令;
  • papi:是Polkadot生态中用于和Substrate节点交互的命令行工具(Polkadot API CLI);
  • add devnet:给这个节点连接配置命名为 devnet(自定义名称,方便后续引用);
  • -w ws://localhost:9944:指定连接方式为WebSocket(-w--ws的简写),连接地址是本地运行的Substrate开发节点(localhost:9944 是Substrate本地节点默认的WebSocket端口)。
  • 整体作用:添加一个名为 devnet 的本地开发网节点配置,后续可以通过 papi 直接用 devnet 这个别名操作本地节点。

3. npx papi add hub -w wss://asset-hub-paseo-rpc.n.dwellir.com

  • 逻辑和上一行一致,区别是:
    • 节点配置命名为 hub
    • 连接的是远程的公开节点:wss://asset-hub-paseo-rpc.n.dwellir.com(这是Polkadot的Asset Hub Paseo测试网的公开RPC节点,wss 是加密的WebSocket协议)。
  • 整体作用:添加一个名为 hub 的远程Asset Hub测试网节点配置,方便后续和这个公开测试网交互。

总结

  1. 这组命令的核心目的是:配置 papi 工具的节点连接,分别添加本地开发网和远程Asset Hub测试网的节点;
  2. 先执行脚本获取链元数据(交互基础),再添加节点配置(交互入口),最终实现通过 papi 便捷操作这两个区块链节点;
  3. 核心工具 papi 是Polkadot API的命令行封装,-w 指定WebSocket连接是Substrate节点交互的标准方式。

问题一: subkey命令找不到

你在Kali Linux中执行 subkey inspect //Alice 命令时提示 command not found,但通过 find 命令已经找到了 subkey 可执行文件的具体路径,现在需要解决的是如何正确执行这个命令的问题。

解决方法

subkey 命令找不到,核心原因是它的可执行文件所在目录不在系统的 PATH 环境变量中,系统不知道去哪里找这个命令。我给你提供两种最常用的解决方案:

方案1:直接使用绝对路径执行(临时生效,简单快捷)

既然你已经找到了 subkey 的路径,直接用完整路径执行即可,推荐使用 /home/kali/polkadot-sdk/target/release/subkey 这个路径(编译后的release版本):

1
2
# 直接执行命令
/home/kali/polkadot-sdk/target/release/subkey inspect //Alice

方案2:将路径添加到PATH环境变量(永久生效,推荐)

如果需要长期使用 subkey 命令,把它的目录加入系统PATH是更方便的方式:

  1. 临时添加(仅当前终端生效):
1
2
3
4
# 将subkey所在目录加入PATH
export PATH=$PATH:/home/kali/polkadot-sdk/target/release
# 现在可以直接执行subkey命令
subkey inspect //Alice
  1. 永久添加(所有终端、重启后仍生效):
1
2
3
4
5
6
7
8
9
# 编辑bash配置文件(Kali默认用bash)
nano ~/.zshrc
# 在文件末尾添加以下内容
export PATH=$PATH:/home/kali/polkadot-sdk/target/release
# 保存退出(按Ctrl+O,回车,再Ctrl+X)
# 使配置生效
source ~/.zshrc
# 验证是否生效
subkey --help

补充说明

  • 你通过 find 找到的多个 subkey 路径中,/home/kali/polkadot-sdk/target/release/subkey 是编译后的可执行文件,是最适合直接使用的。
  • find 命令提示的 Permission denied 是正常现象,只是某些系统目录没有访问权限,不影响找到 subkey

总结

  1. 临时执行:直接使用 subkey 的绝对路径 /home/kali/polkadot-sdk/target/release/subkey inspect //Alice
  2. 永久生效:将 subkey 所在目录 /home/kali/polkadot-sdk/target/release 添加到系统 PATH 环境变量,之后即可直接用 subkey 命令。

subkey inspect //Alice 是什么?

你成功执行了 subkey inspect //Alice 命令,现在我会一步步解释这个命令的作用,以及回显中每一部分的具体含义,让你能清晰理解这些和Substrate/Polkadot账户相关的核心信息。

1. 命令本身:subkey inspect //Alice 是什么?

subkey 是Substrate/Polkadot生态中用于管理和检查密钥对的官方工具,核心作用是处理账户的密钥生成、解析、验证等;
inspectsubkey 的子命令,意思是“解析/检查”;
//Alice 是Substrate内置的测试用密钥URI(统一资源标识符),是预定义的测试账户(类似的还有//Bob、//Charlie等),专门用于开发和测试环境,绝对不能用于生产环境

简单来说,这个命令的作用是:解析并展示内置测试账户Alice的所有密钥相关信息

2. 回显内容逐行解释

1
Secret Key URI `//Alice` is account:

这行是提示:你输入的密钥URI(//Alice)对应的账户信息如下。

核心字段解释(从私密到公开):

字段 含义 重要性
Network ID: substrate 该账户所属的网络标识,substrate 是默认的Substrate通用网络标识(也可指定polkadot、kusama等) 区分不同区块链网络的账户格式
Secret seed: 0xe5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a 账户的私钥种子(助记词的原始哈希形式),是生成私钥的核心,等同于账户的“终极密码” 绝对保密!泄露则账户资产被盗
Public key (hex): 0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d 公钥的十六进制格式,由私钥通过非对称加密算法生成(无法反向推导私钥) 公开,用于验证签名、生成地址
Account ID: 0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d Substrate中Account ID等同于公钥(部分链会对其哈希处理),是账户的“唯一标识” 链上存储账户状态的核心标识
Public key (SS58): 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY 公钥的SS58编码格式(Substrate专属的地址编码标准) 兼容不同网络的地址格式
SS58 Address: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY 最终的账户地址,也是你在钱包/链上交互时使用的“收款/转账地址” 日常使用的公开地址

关键补充说明

  1. 私钥 vs 公钥 vs 地址的关系:

    • 私钥(Secret seed):自己保管,用于签名交易(证明“你是账户主人”);
    • 公钥:由私钥生成,公开,用于验证签名;
    • 地址(SS58 Address):公钥的“易读易记”编码形式,是对外展示的账户标识。
  2. //Alice 是测试账户的原因:
    Substrate预定义了一批测试账户(Alice、Bob、Charlie等),它们的私钥是公开的,所有开发者都知道,因此只能用于本地测试/开发网,绝对不能用于主网(否则资产会被瞬间转走)。

  3. SS58编码的作用:
    不同区块链(如Polkadot主网、Kusama、本地测试网)的SS58前缀不同,编码后的地址也不同,这样可以避免把Polkadot的资产转到Kusama地址(格式不兼容)。

总结

  1. subkey inspect //Alice 的核心作用是解析测试账户Alice的密钥对信息,展示从私钥到公开地址的全链路数据;
  2. 回显中Secret seed是核心私密信息,其余均为公开信息,SS58 Address是日常使用的账户地址;
  3. //Alice 是测试账户,仅用于开发/测试,切勿在生产环境使用。

安装python包报错

pip install substrate-interface eth-utils

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.

If you wish to install a non-Kali-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have pypy3-venv installed.

If you wish to install a non-Kali-packaged Python application,
it may be easiest to use pipx install xyz, which will manage a
virtual environment for you. Make sure you have pipx installed.

For more information, refer to the following:
* https://www.kali.org/docs/general-use/python3-external-packages/
* /usr/share/doc/python3.13/README.venv

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

看来你正在使用 Kali Linux(或者类似的 Debian 系系统)。这个错误是因为现在的 Python 遵循了 PEP 668 规范,为了防止你安装的第三方库破坏系统自带的 Python 工具,禁止了直接使用 pip install 进行全局安装。

作为一名未来的技术大牛,我们需要用优雅、合规的方式解决这个问题。我有三种方案供你选择:


方案一:最推荐 - 创建虚拟环境 (Virtual Environment)

这是最符合最佳实践的方法。它会为你的波卡学习项目创建一个独立的“褶式 (The Fold)”空间,互不干扰。

1
2
3
4
5
6
7
8
9
# 1. 创建虚拟环境目录 (名字可以随便起,这里叫 polka_env)
python3 -m venv polka_env

# 2. 激活虚拟环境
source polka_env/bin/activate

# 3. 此时你的终端开头会出现 (polka_env),现在可以放心安装了
pip install substrate-interface eth-utils

提示:当你写完代码想退出时,输入 deactivate 即可。


方案二:快速通关 - 使用 --break-system-packages 标志

如果你觉得创建虚拟环境太麻烦,只是想快速测试一下代码,可以强制跳过保护机制。注意:虽然名字叫 “break”,但通常安装这两个小库不会真的弄坏系统,但在生产环境下不建议这样做。

1
2
pip install substrate-interface eth-utils --break-system-packages


方案三:使用 pipx (针对工具类)

如果你打算把这个转换脚本做成一个经常使用的系统工具,pipx 是最好的选择。

1
2
3
4
5
sudo apt update && sudo apt install pipx
pipx ensurepath
# 重新打开终端
pipx install substrate-interface # 虽然 pipx 主要是装应用的,对于库开发还是推荐方案一


接下来你的代码逻辑

当你安装好库后,针对你的“地址转换”作业,有一个核心逻辑需要你预判:

在波卡 EVM 链中,转换逻辑并不是简单的 Base58 编解码。对于像 Moonbeam 这种完全兼容 EVM 的链,你可以直接用这个逻辑验证地址:

  1. H160 地址0x123... (20字节)
  2. AccountId32:在 Moonbeam 里,它实际上是把 0x123... 后面补零或者按特定规则映射到 32 字节。

解决安装问题后,你想让我帮你写一个完整的 Python 脚本,直接连接到 Moonbeam 或者 Astar 的测试网,同时把地址转换、Substrate 余额、EVM 余额这三项全部打印出来做对比吗?