查看原文
其他

波卡生态|Polkascan 开发进展更新 #7

PolkaWorld 2020-11-11

Polkascan 基金会的任务是让多链数据可访问和理解。通过 Polkascan 项目,我们正在致力于 Polkadot 生态系统的多链浏览器和数据分析平台。

这次开发更新是我们工作的一部分,它扩展了 Polkascan 堆栈,特别是扩展了 Polkascan 的 Python 库,包括密钥生成、签名和签名验证功能。1) Python 签名者库:用于离线签名和离线签名验证; 2) AngularParity Signer 组件:用于安全在线签名。

我们正在进行的任务是建立 Polkascan 多链浏览器。我们的第四次 grant 工作还剩下签名功能没有放在 Python 库。这个项目旨在提供完整的签名功能,可以从 Python 库和面向用户的Angular (web)应用程序中使用。

本次开发更新中涉及的工作通过提供基于 Python 的签名和签名验证功能以及一个独立的基于 Angular 的可视签名器接口为 Parity Signer 提供了更广泛的 Polkadot & Substrate 生态系统。这两套交付版本都提供了签名和签名验证机制,它们独立于当前主流的 Javascript/Typescript 机制。拥有独立的实现对整个生态系统是有好处的。毋庸置疑,成熟并提供基于 python 和基于 Angular的核心组件有利于生态系统。

我们的团队从第一天起就活跃在波卡的生态系统中,我们相信 Substrate 和 Polkadot 将解决许多行业性问题。此外,我们在 Python 上投入了大量资金。该项目旨在降低使用基于 Substrate 链的 Python 的摩擦,Python 库的完成将使生态系统中的许多团队受益。除此之外,这次资助工作将允许 Python 开发人员与现有或新的 Python 应用程序或任何其他语言的应用程序与现有和新的 Substrate 链集成。

1. 开始

这个开发更新将帮助你从运行一个自己版本的 Substrate 接口开始。

1.1. Github 上的 Substrate 界面

存储库:在我们的 Github(https://github.com/polkascan[1])中可以找到扩展 Polkascan 堆栈和签名者功能的源代码。这个 github 由许多不同的存储库组成,这些存储库共同构成了 Substrate 接口。我们对这些存储库中的分支和版本化发布应用了许多约定。

Image 1a: Polkascan on Github: https://github.com/polkascan[2]

分支:每个存储库在主分支中都有我们最近的工作。

发布:这个开发更新的工作已经发布并标记为“v0.10.x”。

1.2. Substrate 界面是什么?

Substrate 接口由许多不同的软件构件组成,这些构件共同协调接口。Substrate 接口 API 提供了 JSON-RPC 端点,在 Python Substrate 接口库、Python 规模编解码器库和 Python 的各种 RUST 绑定的帮助下,允许与 Substrate 的标准 JSON-RPC 接口进行丰富的交互:Tiny-BIP39 RUST Crate 的 Python绑定,ED25519 Dalek RUST Crate 的 Python 绑定和 SR25519 密码库的 RUST 实现的 Python 绑定。

Substrate 界面图形用户界面是一个基本的用户界面,它展示了 Substrate 界面如何应用于前端Angular Typescript应用程序。特别令人感兴趣的是Angular Parity Signer组件。这些组件包括与Parity Signer的完全兼容,通过:1)QR 地址创建,2)QR 签名有效载荷,和 3)QR 签名。

我们已经选择为我们的所有工件提供完整的 Docker 支持,因此所有相关的存储库的根目录中都有 Dockerfiles。虽然 Substrate 接口的这些不同组件可以独立应用(在其他项目中),但我们提供了一个额外的软件,称为:Substrate 接口,将所有这些组件与 Docker Compose 粘合在一起。

1.3. 需求

  1. 推荐硬件:内存:>2GB(越多越好),存储:>5GB(SSD更好),处理器:更多更快的内核更好(Intel i3)。
  2. 软件要求:Git,Docker&Docker Compose。
  3. Substrate 接口的部署已经在 Mac、Linux 和 Windows 上进行了测试。开始吧!

这个开发更新将帮助你从运行一个自己版本的 Substrate 接口开始。

1.4. 创建和运行 Substrate 界面

这里提供了在你自己的机器上运行我们的浓缩 Substrate 接口 v0.10.* 版本的手把手指南。本段中概述的说明可以在我们的 Github 存储库中找到。https://github.com/polkascan/substrate-interface[3]

  1. 克隆存储库:git clone https://github.com/polkascan/substrate-interface.git
  2. 转到新文件夹:cd substrate-interface
  3. 检查可用版本:git tag
  4. 检查 0.10.x 范围内的最新版本(将“x”替换为最大数字):git checkout 0.10.x
  5. 初始化和更新子模块git submodule update --init --recursive
  6. 为以下五种配置之一构建并运行Docker Compose
##(a)## Kusama Network using a publicly hosted node:
docker-compose -p substrate-interface -f docker-compose.kusama-public.yml up --build --remove-orphans
##(b)## Kusama Network using a local node that is part of the docker-compose configuration:
docker-compose -p substrate-interface -f docker-compose.kusama-local.yml up --build --remove-orphans
##(c)## Polkadot Network using a publicly hosted node:
docker-compose -p substrate-interface -f docker-compose.polkadot-public.yml up --build --remove-orphans
##(d)## Network using a local node that is part of the docker-compose configuration:
docker-compose -p substrate-interface -f docker-compose.polkadot-local.yml up --build --remove-orphans
##(e)## Substrate Node Template Development Network using a local node. This step assumes that a Substrate node is running on your local machine. The Docker-Compose configuration points to your localhost from within the configuration:
docker-compose -p substrate-interface -f docker-compose.kusama-public.yml up --build --remove-orphans

1.5. 开始 Substrate 界面

Substrate 界面 GUI 现在应该可以在浏览器中使用:http://127.0.0.1:8001[4]


Image 1b: Substrate Interface GUI in a Browser:http://127.0.0.1:8001[5]


Substrate接口 API 现在应该可以在 Postman 中使用了。


Image 1c: Substrate Interface APIPostman Documentation[6]


默认 JSON-RPC url:http://127.0.0.1:8000[7]

Image 1d: Substrate Interface API in Postman:http://127.0.0.1:8000[8]

1.6. 清理

下面的 [docker] 命令应该可以帮助您清理。

  • 停止 Docker Compose 文件的所有容器docker-compose -p substrate-interface -f docker-compose.yml down --remove-orphans

  • 删除所有未使用的容器、volumes和图像。docker system prune[confirm] Y

  • 移除所有的容器和图像docker system prune -a[confirm] Y

  • 移除所有 volumes.docker volume prune[confirm] Y

2. Substrate 界面 GUI

遵循“入门”说明后,应通过以下 URI 在浏览器中使用 Substrate 界面GUI: http://127.0.0.1:8001[9]

Image 2a: Substrate Interface GUI in a Browser: 
http://127.0.0.1:8001

Substrate接口 GUI 提供了四个通用部分,在本章的章节中进行了描述。这些部分复制了Polkadot JS 应用程序的类似功能,而不需要后者使用的 Typescript/Javascript 库,有效地使Substrate Interface 成为一个完全独立的堆栈。

2.1. 远程进程调用

方法控件(*method-*control)列出了 Substrate 接口提供的所有远程进程调用方法。这包括所有本机 Substrate 客户端方法,因此提供与任何常规 Substrate 客户端的完全向后兼容性。此外,大量新的方法是可用的与本项目的资助相关工作和以前的资助相关工作。

Image 2.1a: Substrate Interface GUI Remote Procedure Calls

下面的列表重点介绍了在当前资助工作中开发的一些新的 RPC 方法。

  1. keypair_create: 创建一个新的密钥对
  2. keypair_inspect:提供助记短语的详细信息。
  3. keypair_sign:用助记短语标记任意消息。
  4. keypair_verify:验证任意消息的签名
  5. runtime_createSignaturePayload:为任何 runtime 调用创建一个消息负载,该负载可以由密钥对函数签名。
  6. runtime_createExternalSignerPayload:为任何 runtime 调用创建一个消息负载,可以由外部签名者(没有任何解码上下文)签名,例如Parity Signer.
  7. runtime_submitExtrinsic:向区块链提交已签名的外部对象。此方法包含由内部 Python 签名者或外部Parity Signer创建的有效负载签名。

我们要强调的是,不建议在面向用户的应用程序中使用密钥对方法。Substrate 界面 GUI 中的各个组件主要用于展示新功能。

2.2. 链状态

存储函数控件列出 runtime 提供的所有存储函数。Substrate 界面的这一部分没有发生显著变化。推荐参考之前的开发更新 5 了解更多细节。https://medium.com/polkadot-network/polkascan-development-update-5-58521f2c8d66[11]

Image 2.2a: Substrate Interface GUI Chain State

2.3. 具有安全签名的外部

我们最近的被资助的工作的一个重要部分是实现了完全的Parity Signer兼容性。Parity Signer作为一个外部沙盒签名器接口,只需要通过 QR 码进行可验证的安全可视通信。这需要大量的研究,并且已经在 Polkascan 堆栈中实现了通过 QR 码实现的通用脱机签名。本节的其余部分提供了一个逐步说明:

Step 1: 用 Parity Signer 增加一个账户

使用“扫描新地址”按钮从Parity Signer设备添加外部帐户。该示例显示了system.remark extrinsic的构成。这种外部性将向区块链添加任意文本。使用“外部签名”按钮继续下一步。

Image 2.3a: Substrate Interface GUI Create Extrinsic step 1

Step 2:显示一个二维码,可与外部脱机签名者(Parity Signer)签名。当外部签名者用签名创建了二维码后,单击“扫描签名 QR”按钮继续下一步。

Image 2.3b: Substrate Interface GUI Create Extrinsic step 2

Step 3:如果签名有效,则外部签名将提交到区块链。Substrate 接口 GUI 将显示对已提交的交易哈希的引用。该交易将在 Polkascan(或任何其他区块浏览器)上可用。

Image 2.3c: Substrate Interface GUI Create Extrinsic step 3

2.4. 安全消息签名

我们最近被资助的工作的一个重要部分是实现了完全的Parity Signer兼容性。Parity Signer作为一个外部沙盒签名器接口,只需要通过 QR 码进行可验证的安全可视通信。本节将逐步说明任意消息的外部签名:

Step 1: 用 Parity Signer 增加一个账户

使用“扫描新地址”按钮从Parity Signer设备添加外部帐户。该示例显示如何使用Parity Signer对任意消息进行签名。使用“签名消息”按钮继续下一步。

Image 2.4a: Substrate Interface GUI Message Signing step 1

Step 2:显示一个二维码,可与外部脱机签名者(Parity Signer)签名。当外部签名者用签名创建了二维码后,单击“扫描签名QR”按钮继续下一步。

Image 2.4b: Substrate Interface GUI Message Signing step 2

Step 3: Substrate接口 GUI 将显示由外部签名者创建的签名。

Image 2.4c: Substrate Interface GUI Message Signing step 3

Step 4:签名可以通过外部应用程序(如 Polkadot JS Apps )进行验证。

Image 2.4d: Substrate Interface GUI Message Signing step 4

3. Substrate 界面 API

3.1. Substrate 全节点兼容性

Substrate 接口 API 为 Substrate 节点提供 JSON-RPC 接口,并与常规 Substrate 节点的 JSON-RPC 接口完全兼容。例如,RPC 方法 “chain-getBlock” 提供链当前头部的块的详细信息。RPC 方法 “RPC_methods” 为所有已知组提供受支持的 RPC 方法的发现机制,例如:“author”、“chain”、“state”、“system” 等。

3.2. 密钥对 RPC 组

Substrate 接口 API 通过一个名为 “keypair” 的全新组扩展了可用的 RPC 方法,该组公开了 JSON-RPC 接口,用于密钥对生成、密钥对检查、签名和签名验证功能。在我们之前被资助的工作中,这些功能被排除在范围之外(如 development update #5 中所述)。

这四个新的密钥对函数的概述可以在本段中找到。

Keypair creation:keypair_create创建一个新的密钥对。

Keypair inspection:keypair_inspect提供助记短语的详细信息。

Signing:keypair_sign用助记短语标记任意消息。

Verification:keypair_verify验证任意消息的签名。

Substrate 接口 API 目前不支持派生路径特性。然而,当前被资助的工作确实支持基于 Python 的解决方案,该解决方案提供了派生路径特性。请参阅本开发更新的第 4.6 节,其中描述了(不推荐使用的)Python 子密钥包装器。

3.3. Runtime RPC-group

Substrate 接口 API 通过一个名为 “runtime” 的组扩展了可用的 RPC 方法,该组使用 Substrate 节点当前和以前 runtime 特有的所有数据丰富了 JSON-RPC 接口。该组的大多数能力都是在开发更新 5 中记录,并在之前的工作中开发。

当前的资助工作提供了许多与签名交易和任意消息相关的新 RPC 方法。

Create a Signature Payload:runtime_createSignaturePayload为任何 runtime 调用创建一个消息负载,该负载可以由密钥对函数签名。这个例子展示了一个简单的余额转账。

创建一个外部签名者 Payload:runtime_createExternalSignerPayload为任何 runtime 调用创建一个消息负载,可以由外部签名者(没有任何解码上下文)签名,例如Parity Signer。这个例子展示了一个简单的余额转账。

Submit an extrinsic:runtime_submitExtrinsic向区块链提交已签名的外部对象。此方法包含由内部 Python 签名者或外部Parity Signer创建的有效负载签名。这个例子展示了一个简单的余额转账。示例提示错误消息,因为发送帐户的余额不足。

3.4. 文档和代码片段

当前和扩展的 RPC 方法已经通过一个 Postman 集合得到了完整的文档,可以在这里找到。该文档提供了所有当前和扩展的 RPC 方法的测试示例,通过单击文档化 Postman 集合中屏幕顶部的 “Run-inpostman” 按钮,可以轻松地将其导入到您自己的 Postman 应用程序中。

Figure 3.4a: Documentation:Postman collection[12]

Substrate 接口 API 为 Substrate 节点提供了增强的 JSON-RPC 接口。JSON-RPC 标准是任何开发人员都可以使用的通用接口,而不管他们各自的开发环境如何。有文档记录的 Postman 集合为所有包含的 RPC 方法提供了多达 25 个不同的开发环境(C#、cURL、Go、Java、Javascript、NodeJs、OCaml、PHP、Python、Ruby)的代码片段。这说明我们工作的广泛适用性。

Figure 3.4b: Documentation: Postman collection code-snippets for Go-Native.

图 3.4c 中的示例说明了通过 Postman 查询 SS58 编码的帐户地址的“余额”的容易程度。

Figure 3.4c: Example using Substrate Interface API with Postman

4. Python 库

4.1. Python Substrate 界面

Python Substrate 接口库专门用于与 Substrate 节点的接口,提供额外的方便方法来处理缩放编码/解码(底层 JSON-RPC 的默认输出和输入格式)、元数据解析、类型注册表管理和类型的版本控制。Python Substrate 接口库由 Substrate 接口(当然也包括我们的 Polkascan 堆栈)使用。

本次开发更新完成的工作扩展了 Python  Substrate 接口,提供了密钥生成、签名和签名验证功能,以供一般使用,并作为一个独立的 Python 库。

完整的 Python 库文档已经通过 Pdoc 提供。https://pdoc3.github.io/pdoc/[13]

Figure 4.1a: Documentation:Python Substrate Interface[14]

文档说明了如何使用所有可用的方法。考虑到本次开发更新中涉及的主题,这些方法应该看起来很熟悉。

grant 工作提供了一个完整的工件堆栈来说明如何应用这个库。也就是说,这个库可以独立地应用于任何基于 Python 的应用程序中。存储库根目录下的自述文件详细介绍了如何在自己的 Python 项目中开始使用 Python Substrate 接口库。

初始化:初始化接口,得到 Kusama 链的区头块哈希。

substrate = SubstrateInterface(
url=”wss://kusama-rpc.polkadot.io/”,
address_type=2,
type_registry_preset=’kusama’
)
substrate.get_chain_head()

自述文件包含其他示例,说明如何使用 Python Substrate 接口:

  1. 获取特定块的外部对象:https://github.com/polkascan/py-substrate-interface/blob/master/README.md#get-extrinsics-for-a-certain-block
  2. 调用存储:https://github.com/polkascan/py-substrate-interface/blob/master/README.md#make-a-storage-call[15]
  3. 创建并发送签名的外部:https://github.com/polkascan/py-substrate-interface/blob/master/README.md#create-and-send-signed-extrinsics[16]
  4. 密钥创建和签名:https://github.com/polkascan/py-substrate-interface/blob/master/README.md#keypair-creation-and-signing[17]
  5. 元数据和版本控制:https://github.com/polkascan/py-substrate-interface/blob/master/README.md#metadata-and-type-versioning[18]

4.2. Python Bindings BIP39

Python Substrate 接口库(4.1)利用了许多外部加密库。创建此类库的本机 Python 实现远远超出了我们当前项目和工作的范围。Python Bindings BIP39 是一个接口,它公开 RUST 机箱中的方法,并使 Python 解释器可以使用 PyO3(https://github.com/PyO3/pyo3[19])访问这些方法。

在高级 Python 绑定上,BIP39 允许 Python 应用程序:

  1. 生成新的助记词短语
  2. 从助记词短语中创造小秘密
  3. 从助记词短语中创造种子
  4. 验证助记词短语

Rust 可以在crates.io[20]中找到,完整的库文档可以在crates.io[21]查看。

Figure 4.2a: Documentation:Python Bindings for the tiny-bip39 crate[22]

自述文件包含有关如何从 Python 应用程序安装和使用这些绑定的详细说明。

4.3. Python Bindings ED25519

Python Substrate 接口库利用了许多外部加密库。创建此类库的本机 Python 实现远远超出了我们当前项目和工作的范围。Python 绑定 ED25519 是一个接口,它从 RUST 机箱中公开方法,并使 Python 解释器可以使用 PyO3(https://github.com/PyO3/pyo3[23])访问这些方法。

在高级 Python 绑定上,ED25519 允许 Python 应用程序:

  1. 从给定的 32 字节种子返回公钥和私钥对
  2. 使用给定的密钥对消息签名,返回结果签名
  3. 验证给定消息上的签名是否由与指定公钥对应的私钥生成

Rustcrate可以在crates.io[24]找到,完整的库文档可以在docs.rs[25]查看。

Figure 4.3a: Documentation:Python Bindings for the ed25519-dalek RUST crate[26]

自述文件包含有关如何从 Python 应用程序安装和使用这些绑定的详细说明。

4.4. Python Bindings SR25519

Python Substrate 接口库利用了许多外部加密库。创建此类库的本机 Python 实现远远超出了我们当前项目和工作的范围。Python 绑定 SR25519 是一个接口,它从 RUST 机箱中公开方法,并使 Python 解释器可以使用 PyO3 访问这些方法。

在高级 Python 绑定上,SR25519 允许 Python 应用程序:

  1. 从给定的 32 字节种子返回公钥和私钥对
  2. 使用给定的密钥对消息签名,返回结果签名
  3. 验证给定消息上的签名是否由与指定公钥对应的私钥生成
  4. 关于硬和软派生路径的各种低级函数

Rustcrate可以在crates.io[27]找到,完整的库文档可以在docs.rs[28]查看。

Figure 4.4a: Documentation:Python Bindings for the schnorrkel RUST crate[29]

自述文件包含有关如何从 Python 应用程序安装和使用这些绑定的详细说明。

4.5. Python SCALE Codec

Python-SCALE 编解码器库是一个轻量级、高效的二进制序列化和反序列化编解码器。Python-SCALE 编解码器由 Python-substract 接口(当然还有我们的 Polkascan 堆栈)使用。

Substrate 界面的这一部分没有发生显著变化。我们参考之前的开发更新 5 了解更多细节。

完整的 Python 库文档已经通过 Pdoc 提供。https://pdoc3.github.io/pdoc/[30]

Figure 4.5a: Documentation:Python Scale Codec[31]

4.6. Python Subkey Wrapper

Python 子键包装器可以被视为一个功能齐全的工件。我们当前的工作旨在从 Python 库中开发Parity技术的子密钥 CLI 的特性兼容性,进而为本机 Python 应用程序提供密钥对创建、签名和签名验证功能。Polkascan 基金会考虑 Python 子密钥包装器不推荐使用的代码,因为它的几乎所有特性都被 Python 绑定所取代(第 4.2、4.3 和 4.4 节提供了完整的细节)。

我们选择了包含这一部分的开发更新。在编写本文时,不使用 Python 子密钥包装器的 Python Substrate 接口中还不完全支持使用硬/软派生路径来创建密钥对。

自述文件包含有关如何从 Python 应用程序安装和使用包装器的详细说明。

参考链接

[1]

https://github.com/polkascan: https://github.com/polkascan

[2]

 https://github.com/polkascan: https://github.com/polkascan

[3]

https://github.com/polkascan/substrate-interface: https://github.com/polkascan/substrate-interface

[4]

http://127.0.0.1:8001: http://127.0.0.1:8001/

[5]

http://127.0.0.1:8001: http://127.0.0.1:8001/

[6]

Postman Documentation: https://documenter.getpostman.com/view/9969999/SWT5iLXH

[7]

http://127.0.0.1:8000: http://127.0.0.1:8000/

[8]

http://127.0.0.1:8000: http://127.0.0.1:8000/

[9]

 http://127.0.0.1:8001: http://127.0.0.1:8001/

[10]

http://127.0.0.1:8001: http://127.0.0.1:8001/

[11]

https://medium.com/polkadot-network/polkascan-development-update-5-58521f2c8d66: https://medium.com/polkadot-network/polkascan-development-update-5-58521f2c8d66

[12]

Postman collection: https://documenter.getpostman.com/view/9969999/SWT5iLXH?version=latest

[13]

https://pdoc3.github.io/pdoc/: https://pdoc3.github.io/pdoc/

[14]

Python Substrate Interface: https://polkascan.github.io/py-substrate-interface/

[15]

https://github.com/polkascan/py-substrate-interface/blob/master/README.md#make-a-storage-call: https://github.com/polkascan/py-substrate-interface/blob/master/README.md#make-a-storage-call

[16]

https://github.com/polkascan/py-substrate-interface/blob/master/README.md#create-and-send-signed-extrinsics: https://github.com/polkascan/py-substrate-interface/blob/master/README.md#create-and-send-signed-extrinsics

[17]

https://github.com/polkascan/py-substrate-interface/blob/master/README.md#keypair-creation-and-signing: https://github.com/polkascan/py-substrate-interface/blob/master/README.md#keypair-creation-and-signing

[18]

https://github.com/polkascan/py-substrate-interface/blob/master/README.md#metadata-and-type-versioning: https://github.com/polkascan/py-substrate-interface/blob/master/README.md#metadata-and-type-versioning

[19]

https://github.com/PyO3/pyo3: https://github.com/PyO3/pyo3

[20]

crates.io: https://crates.io/crates/py-bip39-bindings

[21]

crates.io: https://crates.io/crates/py-bip39-bindings

[22]

Python Bindings for the tiny-bip39 crate: https://docs.rs/py-bip39-bindings/0.1.5/bip39/

[23]

https://github.com/PyO3/pyo3: https://github.com/PyO3/pyo3

[24]

crates.io: https://crates.io/crates/py-ed25519-bindings

[25]

docs.rs: https://docs.rs/py-ed25519-bindings/0.1.1/ed25519/

[26]

Python Bindings for the ed25519-dalek RUST crate: https://docs.rs/py-ed25519-bindings/0.1.1/ed25519/

[27]

crates.io: https://crates.io/crates/py-ed25519-bindings

[28]

docs.rs: https://docs.rs/py-ed25519-bindings/0.1.1/ed25519/

[29]

Python Bindings for the schnorrkel RUST crate: https://docs.rs/py-sr25519-bindings/0.1.2/sr25519/

[30]

https://pdoc3.github.io/pdoc/: https://pdoc3.github.io/pdoc/

[31]

Python Scale Codec: https://polkascan.github.io/py-scale-codec/


  • 欢迎学习 Substrate: 

    https://substrate.dev/

  • 关注 Substrate 进展:

    https://github.com/paritytech/substrate

  • 关注 Polkadot 进展:

    https://github.com/paritytech/polkadot

更多内容:


Kusama 是什么?Hackusama 回顾系列-1

平行链是波卡生态不可或缺的角色

波卡如何设置代理账户?|Polkadot Wiki


扫码关注公众号,回复 “1” 加入波卡群

关注 PolkaWorld

发现 Web 3.0 时代新机遇


点个 “在看” 再走吧!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存