查看原文
其他

Sub Dev 讨论 | 备战 Hackusama

洋芋 一块Plus社区 2020-11-11

一块链习是首家区块链技术学习社区,提供最系统的区块链技术课程学习,定期出品有深度的技术观察 + 评论。


《从0到一学会Substrate 区块链应用开发》由一块链习和Parity官方联合出品,专为区块链技术爱好者量身打造,并由 王大锤,陈锡亮,孙凯超,朱振明四位老师联合授课



目前第一期课程已经进行到第六周,同学们会在班级群讨论学习中遇到的难题或不解。另外每周日上午 10 点,都会进行课程内容知识拓展——作业点评会和在线答疑。


现在将第五周班级群日常优质的讨论内容和洋芋助教对第七、八课的作业点评分享给大家。


Q&A
社区问答精选


01

WJY-学员:我用offchain-worker去删除链上那些以后使用不到的数据(storage里的), 这个应该没有什么问题吧?或者存在什么隐藏的问题。

 

陈威-学员:没bug应该可以。

 

WJY-学员:比如说我删除大量的过期数据,但是又不想影响链上出块。

 

陈威-学员:就慢慢删除. 别一次发一大堆。

 

WJY-学员:这个用offchain就不需要考虑慢慢删除的问题。

 

kaichao-讲师:通过启动参数pruning可以裁剪历史的区块,数据修改删除放在链上才有意义,offchain worker可以去定时触发这个链上的逻辑。

 

02

陈威-学员:以太坊可以估计合约交易的gas,波卡如何做。

 

程剑宇 - 助教:波卡手续费分的,分四种,然后和weight的设置也有关系。

 

陈威-学员:js上如何做有例子吗?

 

程剑宇 - 助教:前端的话 我能想到的办法就是根据不同操作去单独去提前评估好。

 

陈锡亮-讲师:有个rpc可以查询的,weight配置比较麻烦,要benchmarking,这部分还在完善中。

 

程剑宇 - 助教:感觉那种方式会影响性能吧 智能合约平台可能才需要。

 

陈锡亮-讲师:以太坊都在考虑去掉gas price了。

 

陈威-学员:后面怎么估计手续费?

 

陈锡亮-讲师:eip-1559 是去掉gas price,weight其实就是gas limit,不过不需要用户自己定

 

03

fio啊-学员:现在波卡生态做defi的有哪些项目了?

 

Kaichao-讲师:

https://github.com/w3f/General-Grants-Program/blob/master/grants/polkadot_stack.md,搜defi。

 

04

昊暠skyh-学员:

 

有点迷惑,在insert和remove中值会自动转成Option,在contains_key中不会?

 

陈锡亮-讲师:不存在自动转Option这种事情,本来类型就不是Option。

 

05

没得-学员:为啥recipe里的节点跑起来不出块啊?


 

陈威-学员:不知道是不是instantseal。发一笔交易看看。

 

没得-学员:


 

陈锡亮-讲师:这个是类型问题。

 

陈威-学员:const types = {

"Address": "AccountId",

"LookupSource": "AccountId",

};

你最好加上这2个. 还有自己的特殊类型。

 

没得-学员:加上以后可以转账了 而且出了一块。


 

 

作业点评

第七、八课作业


第七课重点

如何重构CryptoKitty项目实现模块接耦目的,并介绍了 Substrate 中跟链上治理相关的一些模块。


作业要求

补完剩下的代码和修复单元测试。


解题思路

实现链表linked_item中的append,remove两个方法。


append是添加kv到链表中,首先构造新的new_head,然后修改原head的pre,最后将kv写入。


remove是删除链表中的kv,主要是分别修改该kv的pre和next存储。


单元测试部分的修改,主要是将原来的替换成重构后的LikedItem所对应的方法。


附加题

阅读并分析 pallet-membership。对于 add_member 代码,涉及到member的查找为O(log(n)),member的添加为O(n),以及membership的更新为O(MP + N),所以总的计算复杂度为:O(MP + N + logN)。


对于 pallet-membership 适合的使用场景,基于我们对 add_member 代码复杂度的分析,其主要适合于 member 数量不多,以及更新频率不高的场景。所以 1,3 适合,但 2 不适合。 


具体分析大家可以参考下这位同学的作业:

https://github.com/SubstrateCourse/team5/tree/zhubaiyuan/lesson7


第八课重点

讲解Off-chain Worker的使用。


作业要求

基于提供的模版实现链下计算阶乘,然后将结果以签名交易的方式存入链上,以及编写相应的单元测试。


解题思路

首先,我们参照课程讲解,引入所需的依赖。这部分和签名交易相关的,和菜谱示例中类似。需要注意的是区块号T::BlockNumberu64 转换,这是通过core::TryInto。


其次,我们定义一个链上存储区块号和结果值的map。
decl_storage! { trait Store for Module<T: Trait> as TemplateModule { Numbers get(fn numbers): map hasher(blake2_128_concat) u64 => u64; }}

接着我们修改函数save_number,实现链上存储的我们定义的Numbers,同时我们可以在decl_event!中定义一个NumberAppended来记录,示例实现代码如下:
Numbers::insert(index, number);Self::deposit_event(RawEvent::NumberAppended(who, index, number));

然后我们定义一个链下计算和发送签名交易的函数submit_number。它通过获取区块号,计算阶乘。
impl<T: Trait> Module<T> { fn submit_number(block_number: T::BlockNumber) { let index: u64 = block_number().ok().unwrap() as u64; let latest = if index > 0 { Self::numbers((index - 1) as u64) } else { 0 }; let new: u64 = latest.saturating_add((index + 1).saturating_pow(2)); ... }}

提交签名交易,调用我们修改的函数save_number存储结果到链上。
let results = signer.send_signed_transaction(|_acct| { // We are just submitting the current block number back on-chain Call::save_number(index, new)});

最后在函数offchain_worker中调用即可。
Self::submit_number(block_number);

附加题中的单元测试,首先需要模拟提交交易,和runtime创建交易,这主要是在mock.rs中完成。编写测试用例时,我们通过查看交易池和当前链下状态,传递某些参数,确保交易完成并签名。

具体代码实现,大家可以参考:

https://github.com/SubstrateCourse/team5/tree/lester/lesson8

关于这部分大家可以看菜谱书中的相关介绍。
  • off-chain worker,https://substrate.dev/recipes/3-entrees/off-chain-workers/index.html

  • 测试,https://substrate.dev/recipes/3-entrees/testing/off-chain-workers.html


整体而言,由于是基于Substrate开发,所以我们除了需要熟悉Rust外,还要熟悉Substrate中提供的各个组件,这方面大家可以多看一些已有实现的用法。

“疑问有人解答,作业有人讲解批改,这是什么课程?”

这是由一块链习和Parity出品,专为区块链技术爱好者量身打造的Substrate技术开发体验课


课程采用班级群+小组学习制模式进行。由课程导师+助教+班长共同为用户提供服务,采用 15 人左右小组学习制,每位助教定向辅导一个小组并进行定向作业辅导、答疑等,确保更好的学习效果。


除了四位讲师,还有6位助教加入课程。所有助教均有一线区块链公司技术相关背景,并有Substrate技术实战经验,确保每一位开发者都能够得到更专业有效的指导。



第一期课程报名开启一周,100个席位全部抢占完。

第二期课程报名通道提前开放,已经有开发者率先占座。席位有限,报名请抓紧!


欢迎扫码了解更多和课程报名!



更多阅读:
Sub Dev 分享 | 当Substrate遇到传统业务应用
| Sub Dev 周记 |是否相信去中心化的未来
Sub Dev 分享 | Polkadot进入NPoS,质押奖励如何分配

扫码关注公众号,回复“1”加入开发者社群


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

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