Sub Dev 讨论 | 备战 Hackusama
一块链习是首家区块链技术学习社区,提供最系统的区块链技术课程学习,定期出品有深度的技术观察 + 评论。
《从0到一学会Substrate 区块链应用开发》由一块链习和Parity官方联合出品,专为区块链技术爱好者量身打造,并由 王大锤,陈锡亮,孙凯超,朱振明四位老师联合授课。
目前第一期课程已经进行到第六周,同学们会在班级群讨论学习中遇到的难题或不解。另外每周日上午 10 点,都会进行课程内容知识拓展——作业点评会和在线答疑。
现在将第五周班级群日常优质的讨论内容和洋芋助教对第七、八课的作业点评分享给大家。
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::BlockNumber
和u64
转换,这是通过core::TryInto。
decl_storage! {
trait Store for Module<T: Trait> as TemplateModule {
Numbers get(fn numbers): map hasher(blake2_128_concat) u64 => u64;
}
}
Numbers::insert(index, number);
Self::deposit_event(RawEvent::NumberAppended(who, index, 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));
...
}
}
let results = signer.send_signed_transaction(|_acct| {
// We are just submitting the current block number back on-chain
Call::save_number(index, new)
});
Self::submit_number(block_number);
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
这是由一块链习和Parity出品,专为区块链技术爱好者量身打造的Substrate技术开发体验课。
课程采用班级群+小组学习制模式进行。由课程导师+助教+班长共同为用户提供服务,采用 15 人左右小组学习制,每位助教定向辅导一个小组并进行定向作业辅导、答疑等,确保更好的学习效果。
除了四位讲师,还有6位助教加入课程。所有助教均有一线区块链公司技术相关背景,并有Substrate技术实战经验,确保每一位开发者都能够得到更专业有效的指导。
第一期课程报名开启一周,100个席位全部抢占完。
第二期课程报名通道提前开放,已经有开发者率先占座。席位有限,报名请抓紧!
欢迎扫码了解更多和课程报名!
扫码关注公众号,回复“1”加入开发者社群