波卡治理系列(二)提案投票的具体过程

关于什么是链上治理之类的,可以看之前的文章《波卡运行原理系列(二)治理机制》
http://blog.boka.network/?p=374
本文主要基于Kusama网络的实际运行,讨论下治理操作的具体过程

名词翻译

Proposal Pre-images 提案预览
Democracy Proposals 民主提案
Democracy Referenda 公投(民主公投)
Council Motion 议会议案
Tech Comm Proposals 技术委员会提案
Treasury Proposals 财政提案

角色

群众:KSM/DOT 持有人
Council:议会,投票选举产生
Technical Committee:必须是Runtime的开发者,由议会选举

提案分类

更新代码或参数:这种提案有两种方式,分别是公投和Fast-Tracking
申请资金:具体是指从Treasury中申请资金用于社区活动,Treasury的资金来源包括链上交易手续费等

公投

所有人都可以提交
Launch period: 28 天(kusama)

过程:Proposal -> Referendum -> 议会投票 (28天) -> 公投 (28天) -> 实施 (30天)

注:
Kusama 7天
Polkadot 28天

Proposal

每28天,排在第一位的Proposal变成Referendum,进入议会投票。
Proposal阶段所有人可以通过锁定的token,用seconding方式支持,提升该Porposal排位。

议会投票 & 公投

议会投票的意义是为了解决由于关注度低或者度假,大多数用户没有参与投票,而少数参与投票用户不能代表社区意见的情况发生。

议会投票赞成 <50% -> 不通过。

议会投票赞成 >50% 但 <100% -> 普通用户公投 – 按参与投票比例,通过的条件如下黄色曲线

10%投票,超过75%赞成则通过提案
100%投票,超过50%赞成则通过提案

议会投票赞成 = 100% -> 普通用户公投 – 按参与投票比例,通过的条件如下绿色曲线

10%投票,超过25%赞成则通过提案
100%投票,超过50%赞成则通过提案

锁仓时间和投票权重

你可以通过增加锁仓时间来提升投票权重
最长 128 weeks – 32 months – 两年半
也可以不锁 参与投票 但权重很低
最终只有与你意愿一致的投票,才会导致锁定
锁仓的 token 可以同时做其它的投票操作,比如staking、second等

实施

如果公投通过,30天后实施,不赞成的用户可以有机会在此期间离开生态

技术委员会提案

技术委员会成员可以发起Fast-Tracking提案
3天投票时间
投票通过后立即实施

投票通过条件:
3/4 议会成员同意
2/3 技术委员会同意

Treasury提案

Treasury提案本文不做展开,有兴趣的同学可以查看官方Wiki
https://wiki.polkadot.network/docs/en/learn-treasury

将来可能会加入其它治理提案

Oracle Committee – 用于预言机系统的治理

Spontaneous Subject Committee – 用于少数人能够弄懂特定技术投票

波卡运行原理系列(四)BABE共识简述

BABE是目前Kusama、Edgeware等网络使用的共识之一,用于确定出块顺序。

概念定义

Slot,槽,区块生成时间
Epoch,时期,固定长度的Slot的集合
VRF,可验证随机函数,私钥相关,任何人可以通过公钥来证明

解决问题

引入随机性,尽可能让下一个出块验证者不可预测,从而满足出块的去中心化

步骤

验证人使用自己的私钥生成VRF(随机数 + Proof)

验证人计算 SlotNo + Epoch No + 随机数 得到一个值,如果该值小于一个特定值,则获得出块机会

如果一个 Slot 方式如下情况:
1 Slot 没有人的VRF满足要求
2 Slot 多个验证者满足要求
则按照Aura顺序指定验证人出块,被称为次级Aura区块,优先级低

每个Epoch,将根据最新的Staking情况,重新选择验证者集合
重新选择验证者集合的随机数来自上一个Slot的随机值混合

BABE通过这个过程确定了出块验证者的顺序
确定出块(敲定)则需要通过GRANDPA完成,具体可以看波卡运行原理系列(三)
http://blog.boka.network/2020/02/29/bo-ka-yun-xing-yuan-li-xi-lie-san-zu-jian-zi-dian/

区块结构

区块由摘要 Digest 和 封章 Seal 组成

Digest包含:
Pre-digest:VRF输出和证明
运行时处理的 transactions 记录集合
Post-digest:Epoch 切换时才有,输出混合随机值用于重新选择验证者集合

封章即节点的签名

BABE的问题

在很小范围和概率情况下,节点可以影响随机值:
1 节点可以选择不出块,从而随机值不到下个 Epoch,因此能够实现小概率的验证人顺序预测。
2 一个Slot可能存在没有BABE验证者,或有多个验证者的情况

所以在此基础上诞生改良的 Sassafras 共识,具体可以看TangWei的视频,本文不展开讨论
https://www.bilibili.com/video/BV1bz411z73k

Substrate 应用链开发视频教程02 – 如何使用 PolkadotJS 与 Substrate 进行交互

本教程内容覆盖 DAPP 架构、搭建 DAPP 开发测试环境、三个基于 PolkadotJS 的 DAPP 应用 Sample

Screen Shot 2020-04-21 at 10.48.15

腾讯
https://v.qq.com/x/page/o0952vkp0zs.html

B站
https://www.bilibili.com/video/BV1wK4y1k7q1

YouTube
https://youtu.be/fApNFRFPGDs

PPT
https://github.com/ericfish/Substrate-Dev-Book/blob/master/ppt/Sub-Video-02.pdf

代码:
https://github.com/ericfish/Substrate-Dev-Book

推荐开发测试钱包 MathWallet 浏览器插件:
http://mathwallet.org

Substrate 应用链开发视频教程01 – 开发环境的设置和调试技巧

内容覆盖搭建 Substrate 不同版本的环境、如何保证版本一致、如何使用 CLion 进行调试

Youtube:
https://youtu.be/17_uIlxevf0

腾讯视频:
https://v.qq.com/x/page/m09437gz5zz.html

B站:
https://www.bilibili.com/video/BV1Ea4y1t7kp/

PPT
https://github.com/ericfish/Substrate-Dev-Book/blob/master/ppt/Sub-Video-01.pdf

代码:
https://github.com/ericfish/Substrate-Dev-Book

推荐开发测试钱包 MathWallet 浏览器插件:
http://mathwallet.org

PolkadotJS 开发教程 – 查询交易记录

因为区块链上只存储最新的状态,以及状态之间的变化,所以默认情况下无法像数据库那样查询交易记录。
一般查询交易记录的方法有三种:中心化归档、订阅Events、遍历Block。

中心化数据归档

请查看 Polkascan 的开源方案,本文不做展开
https://github.com/polkascan

Events

通过订阅 api.query.system.events

见代码
https://github.com/ericfish/Substrate-Dev-Book/blob/master/02-tx-history/events.js

运行

node events.js

到钱包界面发起一笔转账测试,会发现出现一条新的Event记录

Screen Shot 2020-03-31 at 15.32.01

对Event解析后,可以获得转账操作的各种详细信息:

[
    {
        "phase": {
            "ApplyExtrinsic": "0"
        }, 
        "event": {
            "index": "0x0000", 
            "data": [
                {
                    "weight": 10000, 
                    "class": "Operational", 
                    "paysFee": true
                }
            ]
        }, 
        "topics": [ ]
    }, 
    {
        "phase": {
            "ApplyExtrinsic": "1"
        }, 
        "event": {
            "index": "0x0302", 
            "data": [
                "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", 
                "5CiPPseXPECbkjWCa6MnjNokrgYjMqmKndv2rSnekmSK2DjL", 
                2200000000000, 
                0
            ]
        }, 
        "topics": [ ]
    }, 
    {
        "phase": {
            "ApplyExtrinsic": "1"
        }, 
        "event": {
            "index": "0x0000", 
            "data": [
                {
                    "weight": 1000000, 
                    "class": "Normal", 
                    "paysFee": true
                }
            ]
        }, 
        "topics": [ ]
    }
]

默认情况下,以下操作会产生Event
https://polkadot.js.org/api/substrate/events.html

另一个监听解析 Event 示例
https://polkadot.js.org/api/examples/promise/08_system_events/

另外一个通过监听Event,并写入记录到Mongodb的例子
https://substrate.dev/docs/en/tutorials/tcr/building-an-event-based-off-chain-storage
https://github.com/substrate-developer-hub/substrate-events-listener

遍历 Block

基于 Event 的数据,我们可以通过 range 来查询区块区间的所有数据

const events = await api.query.system.events.range([startHdr]);

示例:
https://github.com/ericfish/Substrate-Dev-Book/blob/master/02-tx-history/range.js

运行

node range.js

TIP

介绍一个可以比较方便的查询和测试 PolkadotJS API 的工具
https://apiexplorer.polkalert.com/
支持本地的ws接口

 

PolkadotJS 开发教程 – Substrate 应用链各个模块的版本

各个模块的说明

首先需要理解一下各个模块都是什么?

Substrate:应用链框架,包含了各种模块,可以快速启动一个自定义的区块链
https://github.com/paritytech/substrate/

Polkadot:基于Substrate的区块链,将来是波卡主网,目前Kusama实验网也基于这套代码
https://github.com/paritytech/polkadot/

PolkadotJS:与Substrate交互的JS框架
https://github.com/polkadot-js/api

PolkadotJS-APP:React开发的基于PolkadotJS API的网页钱包
https://github.com/polkadot-js/apps

因为目前不管是 Substrate,Polkadot,PolkadotJS 还是 PolkadotJS-APP 都在快速迭代中,因此各个版本之间存在大量不兼容的情况。

如何查看当前的版本

可以通过 PolkadotJS-APP 左下角查看当前运行环境的版本

第一行:node的版本
第二行:PolkadotJS版本
第三行:PolkadotJS-APP版本

Artboard

以下是几个配合可用的版本示例:

Substrate 2.0 Node Template

https://substrate.dev/docs/en/tutorials/creating-your-first-substrate-chain/setup
对应可用的 PolkadotJS-APP(麦子钱包运行的老版本网页钱包):
http://app2.substrate.cc

SubstrateKitty

https://substrate.dev/substrate-collectables-workshop/#/?id=substrate-collectables-workshop
对应可用的 PolkadotJS-APP(麦子钱包运行的更老版本网页钱包):
http://app.substrate.cc

Kusama

使用最新的 PolkadotJS-APP:
https://polkadot.js.org/apps

Edgeware

注:
插件钱包的版本与 PolkadotJS-APP 网页钱包类似,同样存在兼容性问题,对于特定版本的 API 需要下载对于版本的插件钱包

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 只是经济角度定义的角色,实际运行中一个节点可以扮演了多个不同的角色

参考文献