PolkadotJS 开发教程 – 测试插件钱包的配置

插件钱包的优势是可以通过 PolkadotJS 与网页进行交互,从而通过网页开发出更多用户友好的应用

安装麦子钱包浏览器插件

http://mathwallet.xyz

创建Substrate钱包

在【设置Setting】 – 【网络Network】中打开 Substrate 开关

切换网络到 Substrate

点击 +

创建钱包

转入测试Token

启动测试链,步骤如下

https://substrate.dev/docs/en/tutorials/creating-your-first-substrate-chain/interact

打开 https://polkadot.js.org/apps/
从 ALICE 发送测试 Token

注:这里可能存在版本兼容的问题导致发送交易失败,具体可以查看
http://blog.boka.network/2020/03/30/polkadotjs-kai-fa-jiao-cheng-substrate-ying-yong/

PolkadotJS 开发教程 – 实现 Substrate 画布的前端

本文通过给 Substrate 画布应用实现前端界面,具体讲解使用 PolkadotJS 发送交易的方法

Substrate 画布应用通过system.remark交易,每次发送交易会被解析成画布上特定坐标的一个像素点,类似之前EOS上很火的 PixelMaster的极简版。

Screen Shot 2020-03-30 at 13.45.52

启动本地配置 Substrate 2.0 node template 以及画布应用

具体方法查看:
http://blog.boka.network/2020/02/29/subtrate-xue-xi-bi-ji-ben-de-pei-zhi-substrate-20/

测试钱包配置

安装以下插件版本(为保持与 Node 的PolkadotJS 一致,必须使用该版本的插件)
http://medishares-cn.oss-cn-hangzhou.aliyuncs.com/extension/mathwalletplus-v2.1.2.zip

按照下文完成插件钱包配置,并创建一个测试钱包
http://blog.boka.network/2020/03/30/polkadotjs-kai-fa-jiao-cheng-ce-shi-cha-jian-qian/

打开 http://app2.substrate.cc/#/accounts
从默认的 Alice 账号,转100个Token到测试钱包

安装第三方库

下载
https://github.com/ericfish/Substrate-Dev-Book

进入目录 01-remarks-ui

使用下面的命令安装第三方库依赖

npm install

完成交易的js方法

index.js 中首先导入与API和插件交互的对象

const { ApiPromise, WsProvider } = require('@polkadot/api');
import {
    isWeb3Injected,
    web3Accounts,
    web3Enable,
    web3FromAddress
} from "@polkadot/extension-dapp";
web3Enable('polkadot-js/apps');

然后在 index.js 中编写了 login, transfer, remark 三个方法,分别完成登录、转账和发送 system.remark 交易

使用下面的命令进行编译

npm run webpack

完成前端界面

index.html 中分别测试了登录和转账操作

remark.html 中完成了坐标输入、颜色拾取,和发起 remark 交易

测试

访问 http://localhost:8888/index.html
即可测试登录和调用插件钱包进行转账签名

访问 http://localhost:8888/remark.html
即可测试在画布上输出指定颜色的像素点

【PolkaDevWeekly 波卡开发者周报】2020-03-09

Interlay Receives W3F Grant to Build Trustless BTC-Polkadot Bridge
https://medium.com/interlay/interlay-receives-w3f-grant-to-build-trustless-btc-polkadot-bridge-c4bdb40173a3

Interlay 团队会在波卡上做一个 BTC-Polkadot Bridge,设计上应该基本和 ChainX 类似,BTC互换的部分使用了原子交换。

HASH CIB 深度报告:即将上线的波卡开发进度、启动过程与竞争优势
http://mp.weixin.qq.com/s?__biz=MzI1Mzk4ODIwOA==&mid=2247490014&idx=1&sn=aa0272227aa0802a3610d734d5a2eaa9&chksm=e9cd45c1debaccd721625ae8063e582e03c159c125880c6507fca5fb038c5a0d9db572794609&mpshare=1&scene=1&srcid=&sharer_sharetime=1583573514442&sharer_shareid=7134817600c1844f17b9c0df52e52765#rd

比较新和完整的波卡报告,对主网和主要功能的时间预测上应该比较准确。波卡应该是 Eth2 的主要而且唯一的对手,而且落地很可能比 Eth2 更快

学习Substrate编程之加密猫扩展-带生命周期的 kitty
http://mp.weixin.qq.com/s?__biz=MzU0ODk1MTE1MA==&mid=2247484444&idx=3&sn=d739cc516cfd3dc020dfa460496ee176&chksm=fbb6011dccc1880b8e84771a56f9b0e45ed852126c23c9719885bfd51aee4f2161319abe747f&mpshare=1&scene=1&srcid=&sharer_sharetime=1583251832330&sharer_shareid=7134817600c1844f17b9c0df52e52765#rd
http://mp.weixin.qq.com/s?__biz=MzU0ODk1MTE1MA==&mid=2247484452&idx=3&sn=4cfe5f3a41a0711008b009841b7999ae&chksm=fbb60125ccc18833cb7242cd32bb0b341723a74450bf5468afdb168cc5d46d48ee859292c13a&mpshare=1&scene=1&srcid=&sharer_sharetime=1583340117506&sharer_shareid=7134817600c1844f17b9c0df52e52765#rd

官方的 cryptokitty 的例子只写了最简单的第一步,作者继续增加更复杂的一些功能,可以看出用substrate开发,还是比智能合约要简单

Substrate VS Smart contract
https://zhuanlan.zhihu.com/p/108000025

锤姐的substrate开发者入门,可以看出除了开发语言rust本身的灵活性,自定义资源、链上升级、自定义账户、开源基础功能库、自动执行链上逻辑会是应用链的突出优势。

Substrate 区块链应用的交易费用设计
https://zhuanlan.zhihu.com/p/108194544

以 EOS 为例,交易费用设计在链活跃度不高时都不是问题,一但进入资源竞争阶段,则会是大问题,substrate交易费设计矿机能帮助高效调节资源的使用,灵活地往社区期望的方向调整。

波卡运行原理系列(三)组件字典

Substrate

  • Parity 开发的区块链基础框架
  • 开发者可以定制一个区块链的各个模块,自定义开发主要关注 State Machine,Substrate 中称之为 Runtime
  • Polkadot 的 Relay Chain 和 Parachain 都是基于 Substrate 框架开发的

Full node 全节点

  • 同步和保存所有区块数据

Light node 轻节点

  • 仅同步和保存区块头数据

Relay Chain 中继链

  • 类似 ETH 2.0 的信标链或 Cosmos 的 Hub
  • 块中记录的是各个 Parachain 的 Candidate Receipts 和 Erasure Coding
  • 基于 NPoS 共识
  • 为 Parachain 提供安全保证
  • 提供 Parachain 之间消息通信的可靠性凭证

Parachain 平行链

  • 也叫应用链
  • 数量 10-100
  • 基于 Substrate 开发的 runtime
  • 需要通过拍卖的方式获得插槽 Slot 才能成为 Parachain,如果未获得插槽则可以用 Parathread 方式的方式接入 Relay Chain
  • 需要组建 Collator

Collator 收集人

  • Parachain 的 Full node、Relay Chain 的 Light node
  • 哪个 Collator 生成块,由 Parachain 自定义,可以通过类似 POS 或者 POW 的机制来选定(但不提供验证和共识),可以设置激励机制
  • 生成 Candidate Receipts 和 Erasure Coding 发给 Validator
  • 细分的话存在两种 Collator: Polkadot Collator & Cumulus Collator

Validator 验证人

  • 数量 250-1000,由 DOT 持有者投票选出
  • 每个 Parachain 会被随机分配 10 个 Validator
  • 与 Collator 交互验证 Parachain 新的区块数据
  • 需要5-7个 Validator 来验证和签署 Parachain 中新产生的区块
  • 生成 Candidate Receipts 和 Erasure Coding,写入 Relay Chain 交易队列
  • BABE 出块 Validator 选择 Candidate Receipts 构建 Relay Chain 区块
  • 在 GRANDPA 中对区块进行投票,超过三分之二则最终确认

Fishermen 钓鱼人

  • Fishermen 需要抵押 DOT(Collator不需要抵押 DOT)
  • Fishermen 是 Parachain 的 Full node
  • 出块(BABE)与最终确定(GRANDPA)之间,Fishermen 进行有效性检查,防止 Validator 合谋

Bridge 桥

  • 一种特殊的 Parachain,通过运行一个 Sovereign Chain(BTC、ETH等非 substrate 构建)的轻节点,完成资产的跨链
  • 再通过 XCMP 将资产传递到其它 Parachain
  • Sovereign Chain 和 Parachain 的一个简单的区分方法是 Sovereign Chain 自己提供共识,Parachain 由 Relay Chain 提供共识(验证 Parachain 数据需要跑一个 Relay Chain 轻节点)

Nominator 提名人/投票人

  • 一般指 DOT 的投票人(Parachain 可以有自己的Staking机制,所以也可能有 Nominator)
  • 最多投票给 16 个 Validator, 系统会自动分配票数,使得票数尽量分散
  • Stake 解委托:Kusama 是7天
  • 参与治理投票:自定义 Conviction,不同锁定期产生不同的投票权重

Merkle 树

  • 特性:如果某些值发生更改,则可以通过查看新的值和树中受其影响的路径来验证更改
  • 基于此属性,Validator 可以验证状态转换,而无需访问整个状态

Parachain Block

Parachain 区块,由 Collator 生成,Validator 验证后将 Parachain Block 的 Candidate Receipts 和 Erasure Coding 写入 Relay Chain 交易队列

Relay Chain Block

Relay Chain 区块,由 Validator 生成

Candidate Receipt 候选回执

Validator 通过签名为 Parachain 区块构造 Candidate Receipt:

  • Parachain ID
  • Collator ID 和签名
  • 父块 Candidate Receipts 的哈希值
  • 区块 Erasure Coding 的 Merkle 根
  • 跨链消息的 Merkle 根
  • 区块的哈希散列
  • 执行区块之前的 Parachain 的状态根
  • 执行区块之后的 Parachain 的状态根

Erasure Coding 纠删码

  • 解决数据无法获得的问题:Validator 和 Fishermen 谁犯错
  • 三分之一的 Validator 获得了区块编码了的数据片段时,即可重新构建出这个 Parachain 的区块
  • Grandpa 共识机制是一种拜占庭容错的共识算法,也就是说仅在大于三分之二的 Validator 投票验证通过了之后,才完成区块的最终确认,所以可以获得三分之二的有 Erasure Coding 数据片段后,重构 Parachain 产出的区块并进行最终确认
  • Erasure Coding 也用于 Fishermen 来报告区块是否无效时的复核,额外的 Validator 会需要取得这个区块,或者通过数据片段来重组出这个区块并再次检查

Parathread

  • 本质是将部分 Parachain 插槽以类似出租、非独占的方式开放,使得更多基于 Substrate 的链可以接入
  • Parathread 需要激励特定的 Collator 来帮助自己打包区块并提交给 Validator,这里的 Collator 如何组建目前还未看到明确的资料
  • Parathread 通过支付 DOT + TIP 的方式让 Validator 将自己的 Candidate Receipts 写入 Relay Chain
  • Parathread 和 Parachain 的安全性相同,但出块时间稳定性上会比 Parachain 差

Cumulus

  • 本质是一个 Substrate Pallet
  • 为 Substrate 的 Runtime 链提供 Polkadot 共识的工具库
  • 同步 Relay Chain 到 Parachain,从而确定目前已敲定的 Parachain 区块
  • 运行 Collator node 并生成 Parachain 区块数据
  • 发送和接收跨链消息 XCMP 的工具

XCMP

  • Parachain 之间通信的机制
  • 本质上 Parachain 之间直接建立网络连接传递消息
  • 消息的安全性通过 Relay Chain 验证

SPREE(也叫 Trust Wormhole)

  • Relay Chain 解决了 Parachain 被51%攻击的情况,SPREE 解决 Parachain A 由治理的修改对 Parachain B 造成某种意义上攻击的情况。
  • 解决方法是把约定的执行操作的代码wasm放到 Relay Chain 上,单个 Parachain 不能通过自己的治理机制修改该操作。

Hermit Relay Chain 隐继链

  • 将 DOT 的转让、抵押、管理等事务放到一条单独的 Parachain 中,以接入的方式加到 Relay Chain
  • 这样做的好处是 Relay Chain 中将仅包含 Candidate Receipts

2nd Layer Relay Chain 二级中继链

  • Parachain 本身变成一个二级的 Relay Chain
  • 安全性更低、出块敲定速度更慢、跨链消息传递速度更长
  • 接入成本更低,满足安全性要求更低的 Parachain 需求
  • 可以继续往下级联实现无限的拓展性

其它

  • Collator、Validator、Fishermen 只是经济角度定义的角色,实际运行中一个节点可以扮演了多个不同的角色

参考文献

Substrate开发环境配置 – Substrate Playground

写了几篇不同的配置 Substrate 开发环境的方法,本文介绍一种最简单的环境配置方法:

Substrate Playground
https://playground.substrate.dev/

(可能需要科学上网,否则打开较慢)

Substrate Playground 是完全网页端的 Substrate 开发 IDE,类似 Rust Playground 和 CodeSandbox,功能强大到令人惊叹。

以下是它包含的功能:

1 一个完整的代码编辑和编译工具

Screen Shot 2020-02-29 at 15.31.53

2 远程运行一个免费的 node template 节点

Screen Shot 2020-02-29 at 15.28.30

3 该节点已经自动配置好 wss,可以一键链接 Polkadot Apps

Screen Shot 2020-02-29 at 15.28.57

4 还有一套 React 的前端模板,并可以直接启动

Screen Shot 2020-02-29 at 15.30.40

这个环境对于新人快速上手,或者分享DEMO简直好用到炸裂,不得不佩服Parity大神们的功利。

Substrate开发环境配置 – 本地配置 Substrate 2.0 node template 以及画布应用

安装 Substrate 2.0

https://substrate.dev/docs/en/tutorials/creating-your-first-substrate-chain/setup

使用 substrate-node-template 创建一个本地节点并启动

https://substrate.dev/docs/en/tutorials/creating-your-first-substrate-chain/interact

访问 https://polkadot.js.org/apps/ 连接到本地节点

启动 substrate-one-million-remarks

git clone https://github.com/laboon/substrate-one-million-remarks

修改 index.js 中的 WsProvider 代码

启动

/substrate-one-million-remarks
yarn && yarn start

通过浏览器访问画布
http://localhost/

使用 Extrinsics 发送 system.remark
内容:0x1337020020cccccc

然后就可以在 20,20 位置看到画的像素点了

使用 draw.js 发送交易来作画

用 node 命令启动

node draw.js

刷新页面即可看到输出

小结

本例子中的画布应用通过与 system.remark Extrinsic 交互,完成链上作画的操作。该 Extrinsic 为 Substrate 2.0 新增,可以用于多种存证记录用途。

Substrate开发环境配置 – 如何在 VPS 上创建一个 Substrate 1.0 节点

VPS 安装的好处是不影响本机的环境和占用本机性能,不需要时也可以随时释放。

VPS 准备

申请一个 VPS 服务器

本文测试时使用的环境如下
阿里云 HK
系统:Ubuntu 18.04
配置:2核4G
硬盘:默认 40G 系统盘

建议海外服务器,安装速度较快

安装

参考 substrate kitties 教程安装
https://substrate.dev/substrate-collectables-workshop/#/zh-cn/0/setup

配置 wss

安装 ngnix

sudo apt-get install nginx

安装 certbot

https://certbot.eff.org/lets-encrypt/ubuntubionic-nginx.html

修改 nginx 配置 /etc/nginx/site-available/default

server {
    server_name test.substrate.cc; # managed by Certbot
    location / {
    try_files $uri $uri/ =404;
    proxy_pass http://localhost:9944;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/test.substrate.cc/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/test.substrate.cc/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

重启nginx

sudo service nginx restart

启动 substrate

通过 Screen 或 PM2 启动

./target/release/substratekitties --dev

测试

如果你配置的域名是 wss://test.substrate.cc
可以访问 https://test.substrate.cc
如果页面输出
“WebSocket Protocol Error: Unable to parse WebSocket key.”
则应该已经配置好了,接下去用 https://polkadot.js.org/apps/ 测试连接即可。

 

Substrate开发环境配置 – 本地调试 Substrate 2.0

本地调试环境的好处一方面可以更快的定位问题,一方面可以方便学习。
Substrate 2.0 是最新的 substrate 版本,相比 1.0 在模块设计和抽象上做得更好,一些模块的名字做了较大修改。

安装环境

可以直接用官方的fast模式自动安装环境。

curl https://getsubstrate.io -sSf | bash -s -- --fast

建议走代理,否则很慢
Mac Terminal 走 ss 可以看这个 https://github.com/mrdulin/blog/issues/18

下载代码和安装

git clone https://github.com/paritytech/substrate.git
export WASM_BUILD_TYPE=release
cd substrate
cargo build

运行

cargo run --bin substrate -- --dev -d .chaindata --execution=NativeElseWasm

数据文件默认放在 .chaindata 目录
重启如果碰到问题,可以尝试删除数据文件目录 rm -rf .chaindata

配置CLion

可以参考 Aten 的文章
https://learnblockchain.cn/2019/12/21/substrate-run-debug/

 

Substrate开发环境配置 – 为什么 substratekitties 等应用教程测试失败

按照教程
https://substrate.dev/substrate-collectables-workshop/#/zh-cn/README

成功安装substratekitties应用后,使用 https://polkadot.js.org/apps/
进行测试时报如下错误:

submitAndWatchExtrinsic(extrinsic: Extrinsic): ExtrinsicStatus:: 1010: Invalid Transaction: 0

原因

substratekitties应用是基于 substrate 1.0 的,而 polkadot.js 的网页钱包已经切换到 substrate 2.0 了,所以存在兼容性问题

解决方案

1 自己本地安装 0.36 版本的 polkadot.js 网页钱包,教程见:
http://blog.boka.network/2020/02/17/polkadot-xue-xi-bi-ji-polkadotjs-app-an-zhuang/

2 也可以访问下面的站点,是笔者搭的一个 0.36 版本的网页钱包
http://app.substrate.cc/

如何查看版本

在 polkadot.js 网页钱包左下角可以看到 substrate 以及 apps 的版本

43D5A040-6E62-47CE-9660-D129632F06D8

 

Substrate开发环境配置 – polkadot-js app 安装

Github
https://github.com/polkadot-js/apps

是什么

polkadot-js 既是Substrate的钱包,也是Substrate的客户端。

为什么

默认情况下该工具可以通过 https://polkadot.js.org/apps 直接访问,自己本地安装的好处是:

1 解决版本兼容性问题
比如使用 substrate 1.0 开发一些应用链,包括 substratekitties,在新版的 polkadot-js 中存在签名错误的问题。

2 学习substrate网页应用的开发
polkadot-js 使用REACT开发,代码质量很高。

3 给自己的应用链定制钱包

4 https://polkadot.js.org/apps 因为默认走 https,所以节点必须 wss 支持或为本地节点,如果一个远程的 ws 节点无法使用

如何安装

下载 github 代码后,按 README 中步骤安装即可。
关注 Node 和 Yarn 的版本要求。

如何安装老版本

使用git切换到以前的版本即可,比如下面的命令可以切换到 0.36 版本,是一个支持 substrate 1.0 应用链的版本。

git checkout  2e7f28a62

如何配置 VPS

修改 ngnix 的站点配置如下

server {
    listen 80 default_server;
    listen [::]:80 default_server;

  server_name app.substrate.cc;

  # Add index.php to the list if you are using PHP
  index index.html index.htm index.nginx-debian.html;

    location / {

    proxy_pass http://localhost:3000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    }
}