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";
    }
}

 

波卡治理系列(一)存储和控制账户

波卡钱包有一下三种账户类型

存储账户 Stash Account

控制账户 Controller Account

会话账户 Session Account(用于验证节点配置,本文暂不涉及)

Staking操作相关的是【存储账户】和【控制账户】两种,对于新用户来说不太容易理解。

首先说下这么做的好处:提供了一种更安全的委托投票管理机制,将资金和操作分离,从而提高Staking操作的安全性。

【存储账户】和【控制账户】不同的权限

存储账户
– 设置控制账户
– 绑定和解绑投票金额

控制账户
– 解绑投票金额
– 设置奖励归集方式
– 提名节点

存储账户可以设置自身为控制账户。
控制账户本身也可以作为存储账户并设置下一级控制账户,实现嵌套的模型。

奖励领取设置

奖励归集到哪个钱包,以及是否自动续投也可以进行设置

所以,如果你持有较多的DOT和KSM,比较安全的方式是先导入存储钱包到麦子钱包,并完成控制账号设置,和资产绑定,然后删除该钱包。
之后所有投票、奖励领取、解委托操作全都通过控制账户来进行操作。

转自:http://blog.mathwallet.net/?p=2665

 

关于 KSM Staking 的一些信息

机制 – NPoS 提名权益证明

Polkadot 使用提名权益证明(NPoS, Nominated Proof of Stake)机制来选择验证人集合,该机制设计有验证人(validator)和提名人(nominator)两种角色,以实现链安全性的最大化。

参与抵押:
* 代币将被锁定12周左右
* 验证人如果做出损害网络行为将面临惩罚

https://mp.weixin.qq.com/s?__biz=MzA5NTQyNDIyNw==&mid=2247483820&idx=1&sn=4759dba8723486661f388f3f80c4d839

通胀率

KSM通胀系统设定:当系统抵押率低于50%时,年平均收益率会高于20%,激励更多的KSM代币抵押进来;相反,当系统抵押率高于50%时,年平均收益率会低于20%,鼓励部分矿工退出。
https://mp.weixin.qq.com/s?__biz=MzI1NTUwOTcwNQ==&mid=2247483658&idx=1&sn=29faa0d0e8b8c63ece760440af017ec6

目前的抵押率和年化:
抵押率 17.66 %
年收益率 20.40 %

更多实时数据:
https://depool.io

节点信息

https://polkascan.io/pre/kusama-cc3/session/validator

https://depool.io

https://labs.hashquark.io/#/polka

如何 Staking

Kusama Staking 工具操作视频
http://blog.mathwallet.net/?p=2654

金晓老师的 Substrate 开发入门

Substrate 总体设计 ( https://learnblockchain.cn/2019/03/02/substrate-project/

环境配置与编译( https://learnblockchain.cn/article/273

运行与调试( https://learnblockchain.cn/2019/12/21/substrate-run-debug/

具备状态的链 ( https://learnblockchain.cn/2019/12/22/substrate-state/

项目结构:

Substrate 1.0  https://learnblockchain.cn/2019/03/10/substrate-structure

Substrate 2.0  https://learnblockchain.cn/2019/12/23/substrate-struct

区块头( https://learnblockchain.cn/2019/12/30/substrate-header

交易体( https://learnblockchain.cn/article/330

Substrate的模型设计( https://learnblockchain.cn/article/331

Runtime概要 ( https://learnblockchain.cn/article/348

Runtime 的 wasm 与 native ( https://learnblockchain.cn/article/382

Kusama 开发者如何领取 KSM 测试代币流程

英文详细教程地址:https://github.com/kusamanetwork/faucet

1 生成有效地址

只有地址中包含”ksma“(不区分大小写 KSMA 或者 kSmA 都可以)才可以申请测试币。

访问 https://polkadot.js.org/apps/#/accounts/vanity
修改配置项
Search for ‘ksma’
case sensitive ‘No’

点击[Start generation]

Artboardks

在找到的 ksma 的地址上点击右侧 + 号

Artboardks

在弹出框中输入自定义名称和密码等信息,完成地址创建

随后即可在 My accounts 中找到添加的新的有效测试钱包
点击最右侧按钮,可以在区块浏览器中获取到 Kusama 钱包地址

ks

2 申请测试币

打开页面 https://github.com/kusamanetwork/faucet/issues

点击 [New issue]

Title 可以随意输入,如 test
Comment 中输入刚才获取的 Kusama 钱包地址

ks

点击 [Submit new issue],大约30秒后即可收到0.1KSM的测试币了

Kusama 的治理

创世期治理

Kusama 的初始治理模型,称为 “创世期治理”,是一个 “三权分立” 模型。

公投议院(大致可以被视为 “立法” 议院)拥有三者中最广泛的会员,是目前最权力最大的机构,所有立法(即对 Kusama 逻辑的更改)必须获得该议院的批准。它是一个所有持币者(即 KSM 代币持有者)的集合,不同持币者的投票权重根据其持有的 KSM 数量和他们愿意继续持有的时间来决定。

另外两个议院是理事会(与执行机构有一些相似之处)和技术委员会。理事会的会员是由代币持有人的批准投票选出的,投票权重仅由其控制的代币数量决定。

技术委员会由多个技术团队每队一票组成 ,技术团队是指所有成功独立实施,或完成了正式指定的 Polkadot / Kusama 协议(波卡运行时环境或目前的 Kusama 运行时)两者之一的团队,也就是说那些同时实现了两者的团队拥有两票。团队的增加或退出由委员会简单多数投票决定。

对公投议院提案的投票持续 28 天,如果获得批准,则在变更生效前等待 30 天。这使得加入 NPoS 共识系统的人(“stakers”)有时间退出网络,如果他们认为这个立法是灾难性的。

所有选民都必须持有 30 天,直到颁布日期到来,以防 “他们的阵营获胜” (如果不是,那么他们就可以自由离开网络)。那些愿意持有两倍长度时间的人将获得一张额外选票,这种情况最多可以增加五票(即那些愿意持有约两年半的人可获得六票)。那些完全不愿意持有的人也可以 投票,但和那些最少持有四周的人相比,他们的投票效力减少了 90%。

当投票率达到 100%(即所有代币都参与了投票,无论其锁定期限如何),如果没有获得至少第一议院的总票数 50% 的支持,则不得通过立法。随着投票率降低,通过机制会因立法的提出方式而有所不同。一般而言,采用 “正向投票率偏差 (Positive Turnout Bias)” 技术,随着不同选民的数量增加,通过立法所需的 “大多数” 的数量从 100% 减少到 50%。换句话说,在不到完全投票的情况下,需要绝大多数赞成票才能通过立法。当投票率增加时,所需的绝大多数的规模也会缩小(因此提案通过的机会增加)。

有两个特例:一种方法是无论投票率如何,都需要用简单多数制,这种计数方法通常被称为 “多数票”。另一种方法学名叫 “负向投票率偏见 (Negative Turnout Bias)”,但通常被称为 “默认票”,是需要绝大多数反对者来阻止立法通过,而当投票率增加到 100% 时,又还原到简单多数制。

Kusama 中的提案

Kusama 的立法议程会拆分到月度提案,供第一议院投票。每个月,都有一个来自理事会或 “公众提案队列” 的提案进入讨论,这两个来源的提案将被轮流处理。也就是说,理事会有权控制 50% 的立法议程,公众则控制另外 50% 的立法议程。

“公众提案队列” 是让立法发生的更广泛手段。任何 Kusama 用户都可以通过抵押极少量的 KSM 来向此队列添加议案,或者朝一个已有的提案抵押来 “附议” 它。当轮到从公共提案队列选出提案时,token 抵押数最多的提案会进入投票环节。

如上所述,公投议院的计票机制是正常的 “正向投票率偏差”。例外的情况是:当超过四分之三的理事会成员投票支持一项提案; 在这种情况下,投票是一个没有参考投票率的简单多数票制。当(且仅当)理事会一致批准时,则使用 “默认票” 制,即负向投票偏差作为计票方法。

快速受理

Kusama 包含了允许其治理系统处理需要快速进行立法变更的意外情况的逻辑。这种立法 “短路” 允许立即提出议案,与正常的月度提案同时进行公投。

如果一项立法得到理事会绝大多数(超过四分之三)的批准和技术委员会三分之二的批准,则可以进入快速受理。在这里,它将立即被提交至公投议院进行投票,投票期较正常情况(3天)大大缩短,并接近零颁布期。

在这种情况下,审批机制与其他情况相同(要么是不管投票率的简单多数票制,或者理事会一致同意的 “默认票” 制)。这种机制预计足以满足非争议性的 bug 修复和技术升级,但考虑到技术委员会的批准要求,对于具有政治敏感性或战略重要性的紧急情况可能无效。

后创世期治理

在 Kusama 上线后,还计划新增两个治理机制(如果试验进展顺利,还可以在创世初的 Polkadot 主网中添加):
一个是 Oracle 委员会,另一个是自发主体委员会。

Oracle 委员会

Oracle 委员会是一个小组,与技术委员会不同,Oracle 委员会的成员资格由成员自己根据一套自然语言规则控制,这有点像宪法。Oracle 委员会成员会被询问、要求支付(代币)来确定投票。他们会做客观的是真是假的评估和陈述,并提供相应的答案。基本的原则就是,他们不会使用任何形式的主观判断或意见。

Oracle 委员会成员资格规则很简单:

  1. 应有特定数量的成员(最初为 13 个,随着时间的推移扩展到 101 个)。
  2. 成员资格应来自广泛的国家,没有哪个单一国家的成员超过 10% 的席位。
  3. 国家的确认应与其新闻自由指数按比例成反比。这有助于最大限度地减少国家行为者强迫或胁迫成员不诚实行为的可能性。
  4. 成员应来自两个专业学科之一:法律界和学术界。如果提供了好的立论并且涵盖了下一点,则可以扩展该集合。
  5. 在所有情况下,应使用评估特定管辖区专业成就的最重要的客观方法。对于学者来说,这将是高质量文献的引用。对于法律专业人士而言,它将赢得一些新的先例。
  6. 成员资格每月重新评估一次,届时将从新候选人和希望再次当选的现任成员中选出最佳成员。
  7. 当且仅当大多数其他成员认为他们无法顺利履行其职责时,某个成员才会在当期被禁用。
  8. 如果四分之三的人同意 “该成员以恶意,粗心或道德的方式行事,由于他们自己的过错提出了不准确 / 错误的陈述”,则该成员会被列入黑名单。
  9. 候选人通常会保持匿名,但会向当前的成员们提供 KYC 信息。
  10. 一旦离开委员会,成员将被取消匿名。

Kusama 网络进展(持续更新)

2019/11/3:
验证人已增加到 100 个

2019/10/29:
Kusama 网络成功地转换到 POS !

2019/10/24:
Kusama 由 PoA 转为 PoS 网络,波卡 v0.6.3 版本也将在本周一或周二发布。
这次升级意味着 Kusama 网络的创世治理,也意味着 Kusama 网络从中心化的 PoA 网络转换为去中心化的 PoS 网络,整个网络的治理和转账也会同时生效,也就是 Kusama 的 PoS 网络正式上线。

2019/9/27:
Kusama 网络升级到 CC2

2019/9/5:
Kusama区块浏览器
https://polkascan.io/pre/kusama/dashboard
http://boka.network/#/Kusama

2019/9/4:
已经有29个节点申请成为验证节点
按计划,Kusama会在有50个以上验证节点申请后,从POA进入到POS阶段

2019/9/1:
进行链上抵押,申请成为后续节点操作教程:
https://guide.kusama.network/en/latest/try/validate/

注意:在目前Kusama网络,Stash和Controller可以用同一个地址,所以即使你只有一个地址有映射的KSM,也可以申请成为验证节点

2019/8/31:
已经有25个节点申请成为验证节点

2019/8/24:
DOT 映射领取 KSM 教程:
https://guide.kusama.network/en/latest/start/dot-holders/
http://blog.mathwallet.net/?p=2162

2019/8/23:
Kusama 网络通过 POA 共识启动

节点浏览器地址: https://telemetry.polkadot.io/#list/Kusama%20CC1

Gavin 发布 Kusama 规划和治理: https://medium.com/@gavofyork/kusama-rollout-and-governance-31eb18041044

目前 Kusama 网络不能进行转账等操作。

每条平行链才10个验证人,波卡网络真的安全吗?

分享者:Alistair Stewart | Web3 基金会首席科学家 、GRANDPA 算法创立者
译者:Charlie Hu | PolkaWorld 超级探员
今天我要分享的主题是:如何在保证Polkadot网络的安全性的同时,可以做到一条新增平行链仅用10个验证者。
Polkadot网络本质上是一个异构多链的区块链网络,未来网络中会有非常多不同共识,不同结构的平行链。每条平行链都有自己特有的数据、P2P网络架构,并通过链接到Polkadot中继链来一起共享安全性。
平行链到中继链上的数据消息传输、中转和验证确认等非常重要的工作职能,都是需要中继链上的验证者来完成的。每个验证者本身不会包含太多的数据,不需要占用网络的太多带宽和资源,以此来保证波卡网络可以不断拓展。
波卡、Cosmos 和 ETH 2.0 的验证人数量比较
当我们来讨论Polkadot网络应该有多少数量的验证人这个话题时,我们可以比较一下其他多链网络的验证人数量和架构情况。
Polkadot的测试网络最初会设置大约250个验证人,然后一直拓展到至少1000个。我们的目标设想是,每个平行链分配10个验证人。Polkadot测试网络刚启动时,并不会有太多的平行链,可能大约只有10条平行链。然而我们会努力拓展开发到100条左右的平行链,每条平行链10个验证人的话,100条平行链就是1000个验证人。
相比较而言,Cosmos网络中的每条链会自己选择100个验证人,有一些验证人可能在多条链中都担任验证人的角色。
而以太坊2.0的架构,则是有1024个分片,每个分片拥有300-1000个验证人,因而这是非常多数量的验证人的需求。以太坊2.0获得这么多的验证人资源,他们的机制是每32个节点产生一个验证人,因此如果我们需要过1000个节点,就需要通过30个验证节点。
为什么要控制验证人数量
我们从通讯和网络限制的角度来分析下,为什么说验证人是稀缺资源,要控制其数量。
我们要了解到区块链网络中的一台机器上可以运行多少个验证人;一台机器可以接入多少个P2P分布式网络;网络拥有多少个连接点和带宽。因此,一个区块链生态中并没有那么多人可以参与来做验证人,本质上验证人是一个稀缺的资源。因此我们才需要在架构设计上去控制验证人的数量。
从Polkadot网络中当个平行链的视角来看,每个平行链中的收集人会来产生平行链的区块,之后数据会提交给验证人来验证,当绝大多数的验证人验证并签名了这个区块的区块头,此平行链的签名验证过的区块头就会进入到中继链的区块。
因此在每个平行链10个验证人这样的分配机制下,我们仅需要5-7个验证人来验证和签署平行链中新产生的区块。
波卡如何向平行链提供安全
然而,因为有很多平行链在不断产生新区块,会有某一些验证人串通作恶,让无效和作恶区块被验证确认写入到Polkadot中继链网络的情况发生。
从Polkadot到白皮书中有介绍,面对这样的潜在作恶的情况,Polkadot是依靠钓鱼人的决策去挖掘和指出那些无效区块来保证Polkadot的网络安全的。
当钓鱼人发现某一个区块是无效的,他们需要质押一些DOT代币并提出这个区块是无效的指令,因而这个区块会需要被再次验证和审核,如果最终此区块被证实是无效的,那么验证人质押的DOT代币会被没收,让钓鱼人获得奖励,反之则钓鱼人质押的DOT代币会被没收。
我们通过这样的机制设计,来确保验证人没有经济动力去验证通过一个无效的区块,也确保钓鱼人有这个经济激励去审查是否有无效区块产生,指出问题,一同来确保Polkadot的网络安全。
问题:数据可用性
然而在这种主链侧链结构的区块出块和验证的机制设计中,会有一个区块数据是否可以被获得的问题(Data Availability Problem)。
比如在比特币网络中,当一个节点挖出了一个区块,其他人并不会发现这个新出的区块的价值,直到他们看到这个区块出现在最长的那条链上面,因而没人会提前对此区块做验证和工作。尽管会有少部分自私挖矿的行为,但不论如何,节点都需要把这个区块传播到最长链上面才可以完成验证。
然而在分片和多链的架构中,当中继链区块中含有这个区块的区块头,即便全节点并没有收到这个区块数据,平行链中产出的一个区块都会被规范化纳入到中继链中。但钓鱼人并没有办法去验证一个他们都从没有见过的区块,验证人那边无法知道平行链的全节点是否已经拥有这个区块数据。
当这种比较尴尬的情况出现时,验证人和钓鱼人谁犯错,如何去判定谁的DOT代币会被没收就会变得很主观,无法推进。这个数据无法获得的问题的源头在于,只有少部分验证人有平行链新产生区块的所有数据,然而从拓展性方面去考察,也只能少量验证人拥有平行链的区块全数据即可推进验证。
解决方案:纠删码
解决这个问题的方案叫做纠删码(Erasure Coding):平行链上的验证人将区块数据通过Erasure Code的方式将数据编码和片段拆分,并将数据片段发送给其他每个验证人。当三分之一的验证人获得了区块编码了的数据片段时,即可重新构建出这个平行链的区块。
这样的设计是为了让区块数据片段可以接入到Polkadot的Grandpa共识。
Grandpa共识机制是一种拜占庭容错的共识算法,也就是说仅在大于三分之二的验证人投票验证通过了之后,才完成最终区块的最终确认。
如果验证人仅对拥有了的Erasure Coding数据片段的平行链区块进行投票,并打入中继链区块中,那么我们可以确认,我们可以获得三分之二的有Erasure Coding数据片段,并足以通过他们来重构平行链产出的区块并进行最终确认,即便另外三分之一的区块是作恶或者数据消失了的。
有效性检查协议
当然在这些区块被重新利用之前,我们需要让这些通过数据片重新构建出来的区块及时被验证。但网络中的很多钓鱼人并没有办法要求所有的验证人提供他们拥有的数据片段,因为这些验证人并没有互相连接,没有权限接入到整个网络。
总结来说,Polkadot的区块有效性检查协议,用钓鱼人来报告区块是否无效,收集人来报告区块数据是否不可用。当有报告产生的时候,额外的验证人会需要取得这个区块,或者通过数据片段来重组出这个区块并再次检查。
这个额外验证人,会通过 VRF (可验证随机函数) 的方式来选出,来确保这个额外验证人跟这个有问题区块的验证人和收集人没有私下关系,通过增加这个额外的随机性来确保再次验证的公正和安全。
如果有任何的验证人认为某个区块是无效的,所有的验证人都需要下载并检查此区块的情况,并没收出了无效区块的验证人的DOT代币。这种情况并不会经常发生,因此这个机制并不会太影响Polkadot网络的拓展性。
后续的研究方向
基于上面介绍的有效性检查协议,后续需要拓展研究的问题就是网络传输这块。如果需要将Erasure Coded的数据片段全部传播(Gossip)到整个区块链网络中,则会消耗大量的网络流量,影响整个网络的可拓展性。我们需要让验证者和验证者之间的数据信息传输足够地有效率,把这个数量拓展上去。
因此,之后需要进一步研究和探索的问题就是:是否可以采用直接连接的方式让验证者之间两两互联?是否可以在平均距离直径为2的网络架构一个验证人Hub来拓展架构?是否可以间接地架构在一个P2P分布式传输网络中?
结论
通过上面介绍的有效性验证协议,只要网络中有足够多的诚实不作恶的钓鱼人和收集人,Polkadot网络就可以确保无效的或者没有数据的区块不会被最终确认验证,并且可以让外部来攻击Polkadot平行链的区块变得很昂贵,贵到比购买一个平行链上的三分之二的权益还要高。
从结果来说,这样的机制设计和协议也可以让Polkadot网络相比其他的多链网络需要更少数量的验证人来达到良好的可拓展性。
如果你希望了解更多的技术和研究资料,可以通过下面web3基金会研究院的链接来获得。
https://research.web3.foundation/en/latest/polkadot/Availability_and_Validity/