第三届Substrate Hackathon 挑战赛完整复盘
Parity 科技公司研发的 Substrate 框架,让我们拥有了可以几乎不受限制的快速的开发出一个完整、高性能、安全的区块链项目。
今年6月份,一块链习与 Polkadot 社区大使陈锡亮老师倾力打造了《Substrate快速入门与实战开发》课程。
同学们平常会在班级群将学习中遇到的难题或不解向老师、助教提问、讨论。
每周六晚 8 点,都会进行《Substrate 快速入门与开发实战》开发课的内容知识拓展——作业点评会,助教们会从解题思路、以及本组学员的作业问题分析每一课的知识点。
第三届Substrate Hackathon挑战赛也在上周结束, BitDAO、 Peppa 和 WhatSubs三组团队在最后的挑战赛中运用学习成果激发新灵感,交上了他们最后的答卷。
在结业仪式上,陈锡亮老师也对三组团队的作品一一做了点评并给出了改进建议。
01
Q:村上香菜子@电商:我有个问题,offchain worker说是在每次区块导入后执行。这里的区块导入是指什么意思?
A:陈锡亮@讲师:同步并且验证后。
Q:村上香菜子@电商:我其实还是不是很明白offchain worker的工作原理。
举个例子,比如说这条链上有好几个Dapp,每一个Dapp都可以调用这个offchain worker吗?如果是的,工作机制是怎么样的?还是说 offchain只能是这条链的开发者才能使用的?
A:Ratentlan@程序员:offchain worker 定义在 decl_module!每个模块都可以调用。
Q:村上香菜子@电商:那在每次区块同步并且验证后执行是什么意思?是链上每产生一个新的区块,我的offchain woker就出来工作一圈,是吗?
A:Ratentlan@程序员:每次区块链增加一个区块后, 都触发一次每个在使用的模块的worker。
A:陈锡亮@讲师:offchain worker会被所有全节点执行,所以需要逻辑限制避免不必要的工作,最简单的就是限制只由验证人执行,甚至只由当前出块验证人执行。
02
Q:村上香菜子@电商:on_finalize它是新的区块产生的时候触发的吗?具体是什么时间点?onchain和offchain执行的具体区别是什么呢?
A:Ratentlan@程序员:1 on_initialize > 各种交易 > on_finalize > 得到块 > 导入块(验证块) > worker
2 收到块 > 导入块(验证块) > worker
A:陈锡亮@讲师:on initialize / finalize是on chain执行,类似系统发送的交易,节点必须执行不然无法达成共识。
offchain worker 和比如链下起的监视器没有本质上的区别,只能修改本地状态,不能修改链上状态,可以通过发送交易修改链上状态。
offchain worker节点可以选择不执行,当前可能会有相关的逻辑检测和惩罚,这个就需要链自己写了。
Q:村上香菜子@电商:我明白了offchain worker只能修改线下状态,而on finalize可以修改线上状态。那这个on finalize是不是也跟offchain worker一样,每个应用都可以设置?
如果是的话,快要出块的时候,是谁负责通知所有应用的 on finalize赶紧工作?不然会影响出块?还是说 on_finalize只能是由出块的节点来执行结果?然后通知大家?
A:陈锡亮@讲师:链上逻辑是所有节点同步区块的时候都会执行的,也是出块节点执行打包区块的步骤之一。
链上逻辑规定了执行完所有交易后需要再执行这个逻辑,如果没有的话状态就会不一致,无法达成共识,要么节点无法同步,要么出块非法。
Q:村上香菜子@电商:是所有的DAPP都可以设置有on_finalize的功能吗?每次某个节点同步新的块的时候,就要把所有DAPP的on_finalize的功能执行一遍是吗?
A:陈锡亮@讲师:差不多。每个模块都可以有自己的on initialize finalize. 这个是链上逻辑的一部分。
03
Q:alan poon@社群成员:rpc chain_getBlockHash 是不是return state digest?
A:黄志光@助教:getBlockHash是根据区块编号获取区块Hash,然后再用调用getBlock传入Hash获取到digest。
04
Q:alan poon @社群成员:substrate 是怎么discover peer 的?
A:陈锡亮@讲师:libp2p提供的几种方法,Kademlia DHT,mDNS。
Q:晓聪@程序员:方法是什么原理呢?
A:陈锡亮@讲师:DHT (Distributed hash table) 是一个很常见的p2p协议中用到的算法,比如BT下载就有用到,具体细节搜一下网上文献很多。
https://docs.rs/libp2p-kad/0.14.0-alpha.1/libp2p_kad/
05
Q:朱强@区块链从业者:polkadot 或者 kusama有没有 jrpc的接口(而不是使用 polkadot.js )可以让前端调用?没有找到文档呢。
A:陈锡亮@讲师:polkadot.js本身就是用的json rpc的接口。在polkadot js apps里面可以检查元素,网络,查看ws发送的消息。
不过这个接口太底层了,一般情况下还是需要polkadot js来处理编码metadata 等的。
Q:朱强@区块链从业者:了解,如果需要在移动端(ios, android)去连接节点,还是推荐使用polkadot js吗?或者有没有java或者 objective c的库实现了类似polkadot js的功能呢。
A:陈锡亮@讲师:他们用的ReactNative,也是用的polkadot.js。
06
Q:朱强@区块链从业者:什么样的场景会有dapp定制开发自己的parachain?
使用substrate和rust,学习和开发成本比使用evm和solidity的成本高不少,比如做一个加密猫的dapp,使用一个和以太坊同构的子链加入到relaychain中,从上述角度上看,不是一个更好的方案吗?
A:陈锡亮@讲师:依赖于智能合约链的智能合约可能类似于部署一个服务到共享的公有云里面,你会受到平台的限制。
在性能方面需要和其他的服务竞争,经济模型上很难独立因为有平台费要出,但可能会便宜,平台也能提供一些额外的服务。
平行链就更类似于部署在自己的私有云里面,更加自由,没有其他服务和你竞争资源,没有平台费用,当然就需要你自己维护这个平台。
07
Q:WYF@副班长:我按照
https://github.com/paritytech/substrate/pull/3821/files,启动链时加了-lruntime=debug 也没有显示日志
debug::RuntimeLogger::init();
debug::info!(">>>>>>>>>>>>>>header: {:?}", header);
不知道老师有试过么?
A:陈锡亮@讲师:应该是没问题的,im online 模块里面代码可以参考下。
作业
&
点评
周洋助教
作业要求
手动实现 Kitty 和 LinkedItem 的 Encode 和 Decode
fn encode_to<T: Output>(&self, dest: &mut T)
fn decode<I: Input>(input: &mut I) -> Option<Self>
本次作业可以让我们学习一下 parity-codec 的 Encode 及 Decode trait。这是 substrate 中重要的基础设施。
本组共有 2 位同学提交了第 7 课作业,完成的很好,我们一起来看一下沈国晔的作业:
可以看到方法的实现直接使用了 parity-codec 提供的接口,那么我们看一下官方提供了什么接口:
那么只需在 encode_to 时使用 Output 的 push 方法。decode 的时候使用 Decode::decode 方法即可完成作业。
最后别忘了实现一下 EncodeLike trait。
结业挑战
&
点评
陈锡亮讲师
用第八课的代码为基础,为 Substrate Kitties 添加新功能。
以下几个题目任选其一
使用ORML中的拍卖模块实现拍卖小猫功能
https://github.com/laminar-protocol/open-runtime-module-library/blob/master/traits/src/auction.rs
https://github.com/laminar-protocol/open-runtime-module-library/blob/master/auction/src/lib.rs
注:可以参考 Acala 项目代码熟悉如何使用 orml-auction 模块
集成ORML中的预言机模块实现新功能
新功能可以比如是读取BTC价钱写入链上,创建小猫需要付出这个数值的原生代币,或其他使用链下数据的功能
https://github.com/laminar-protocol/open-runtime-module-library/blob/master/oracle/src/lib.rs
注:可以参考 Acala 项目代码熟悉如何使用 orml-oracle 模块
添加战斗功能
用户可以下注赌斗小猫
添加年龄功能
只有年龄在一定数值内的小猫才能参与繁殖
年龄太大的会死亡
任意其他有趣的功能
这次结课项目大家的实现都比较完整,都达到了课题的要求,甚至有的还有所超出。我们的目的主要是学习掌握 Substrate 开发技巧,所以我这边还要给大家挑错提点意见。
- BitDAO
- https://github.com/SubstrateCourse-Term3/BitDAO
- 实现了一个比较完善的战斗系统,内容丰富
- 代码风格可以提高
- 运算上可以优化调整,有些有溢出的风险,有些有不必要的溢出检测
- 代码逻辑很多地方可以优化
- 使用offchain worker随机给猫侠攻击力的机制不错,不过有作弊的可能性
- 战斗结果可以提前预测,可以添加点随机性增加游戏性
- Peppa
- https://github.com/SubstrateCourse-Term3/peppa
- 实现了小猫年龄的功能,逻辑合理
- init函数可以用config或者on_initialize代替
- Owner可以改成root,更好与治理模块配合
- WhatSubs
- https://github.com/SubstrateCourse-Term3/WhatSubs
- 实现了小猫年龄的功能,实现比较完善
- 重用性较好,不同参数都可以配置
- 小猫死亡后不应该减去KittiesCount,不然会导致重复的KittyId
- MinHeap 和 MinHeapKAry 虽然没用到,但还是实现的挺不错的
最后获得冠军的是 Whatsubs 团队,恭喜他们获得最佳团队奖!
更多阅读:
| Subdev 讨论 | 同学们设计的加密猫进阶到模块V4了
| Subdev 分享 | 手把手:用RUST语言开发RSA算法模拟
扫码关注公众号,回复“1”加入开发者社群