Sub Dev 讨论 | 给Substrate 填坑
一块链习是首家区块链技术学习社区,提供最系统的区块链技术课程学习,定期出品有深度的技术观察 + 评论。
《从0到一学会Substrate 区块链应用开发》由一块链习和Parity官方联合出品,专为区块链技术爱好者量身打造,并由 王大锤,陈锡亮,孙凯超,朱振明四位老师联合授课。
目前第一期课程已经进行到第三周,同学们会在班级群讨论学习中遇到的难题或不解。另外每周日上午 10 点,都会进行课程内容知识拓展——作业点评会和在线答疑。
现在将第四周班级群日常优质的讨论内容和程剑宇助教对第六课的作业点评分享给大家。
01
村上香菜子-学员:老师,请问视频里提到的sp-std,当时说:把std曝露在WASM环境里。这个是什么意思?是指non-std环境可以使用std提供的方法吗?
陈锡亮-讲师:准确的说是提供一部分std下常用的库,std中还是很多不能用,比如随机数.不过有些比如vec, btreemap 就可以用。
村上香菜子-学员:sp-std其实就是std的替身对吗?那当中的sp是什么的缩写?
陈锡亮-讲师:substrate primitives 。
村上香菜子-学员:这个前缀是有什么具体的含义吗?
冯力全-助教:substrate 里面的一些原语,最基本的一些构件。
02
放课后の中本葱-学员:trie 不是一种树状数据结构么?在substrate 里是指数据库么?
陈威-学员:trie后面是kvdb。trie可以看作map用。sub里面直接用trie这个就是它的db. Kaichao 写了个文章在知乎。讲清楚这个事情。
https://zhuanlan.zhihu.com/substrate
03
陈锡亮-讲师:
Substrate 最大的几个大坑之一终于被填的七七八八了 https://github.com/paritytech/substrate/pull/6269
程剑宇-助教:比较关心transaction pool的,丢交易的那个....
陈锡亮-讲师:
https://github.com/paritytech/substrate/pull/6123 这个应该修好了,不过我们公共测试网还没更新没试过。
04
朱强-学员:请问用polkadot.js连接节点的时候,这些节点的endpoint的地址在哪里可以查到呢?
kaichao-讲师:inspect network, 刷新页面,搜 ws。
陈锡亮-讲师:
点开custom endpoint就能看到了。
05
昊暠skyh-学员:用一个新账号去发起交易是不是会失败,必须要先转账吧,有没有不用转账的呢?
如果需要模拟一个不需要手续费的链,哪些形式比较好呢?一个weght=0的交易,一次交易最小费用是多少?
现在交易都看不到交易费用,能不能像联盟链或者eos那样做无交易费的交易呢?只在系统内执行不需要交易费。
陈锡亮-讲师:unsigned transaction 是不要手续费的。
斌·Amadeus-学员:交易费可以设置的,联盟链用的话,也可以为0。
陈威-学员:联盟链可以这样#[weight = (100_000, DispatchClass::Normal, frame_support::weights::Pays::No)]
第六课重点
链上升级; 延续了之前CryptoKitty的项目,实现了双向链表; 讲解了资产模块。
insert_owned_kitty transfer owned_kitties_can_remove_values
01.insert_owned_kitty
insert_owned_kitty
。这里是需要实现将一只小猫插入到所属的主人账户下,根据题意知道需要附加到名为OwnedKitties的storage里。其实就使用一下append就好了。fn insert_owned_kitty(owner: &T::AccountId, kitty_id: T::KittyIndex) {
// 作业
OwnedKitties::<T>::append(owner, kitty_id);
}
02.transfer
首先验证签名,ensure_signed 验证小猫是否属于sender,如果不是,则报错 如果是,则删除小猫对于当前sender的归属并且在新的账号下添加该小猫
/// Transfer a kitty to new owner
#[weight = 0]
pub fn transfer(origin, to: T::AccountId, kitty_id: T::KittyIndex) {
// 作业
let sender = ensure_signed(origin)?;
ensure!(<OwnedKitties<T>>::contains_key((&sender, Some(kitty_id))), Error::<T>::RequireOwner);
<OwnedKitties<T>>::remove(&sender, kitty_id);
<OwnedKitties<T>>::append(&to, kitty_id);
}
03.owned_kitties_can_remove_values
owned_kitties_can_remove_values
,即测试OnwerKitty的storage里是否能正常处理删除操作。其实这里参考之前的owned_kitties_can_append_values
应该比较容易实现,参考代码如下:[test]
fn owned_kitties_can_remove_values() {
new_test_ext().execute_with(|| {
OwnedKittiesTest::append(&0, 1);
OwnedKittiesTest::append(&0, 2);
OwnedKittiesTest::append(&0, 3);
OwnedKittiesTest::remove(&0, 2);
assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem {
prev: Some(3),
next: Some(1),
}));
assert_eq!(OwnedKittiesTest::get(&(0, Some(1))), Some(KittyLinkedItem {
prev: None,
next: Some(3),
}));
assert_eq!(OwnedKittiesTest::get(&(0, Some(2))), None);
assert_eq!(OwnedKittiesTest::get(&(0, Some(3))), Some(KittyLinkedItem {
prev: Some(1),
next: None,
}));
OwnedKittiesTest::remove(&0, 1);
assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem {
prev: Some(3),
next: Some(3),
}));
assert_eq!(OwnedKittiesTest::get(&(0, Some(1))), None);
assert_eq!(OwnedKittiesTest::get(&(0, Some(2))), None);
assert_eq!(OwnedKittiesTest::get(&(0, Some(3))), Some(KittyLinkedItem {
prev: None,
next: None,
}));
OwnedKittiesTest::remove(&0, 3);
assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem {
prev: None,
next: None,
}));
assert_eq!(OwnedKittiesTest::get(&(0, Some(1))), None);
assert_eq!(OwnedKittiesTest::get(&(0, Some(2))), None);
assert_eq!(OwnedKittiesTest::get(&(0, Some(2))), None);
});
}
这是由一块链习和Parity出品,专为区块链技术爱好者量身打造的Substrate技术开发体验课。
课程采用班级群+小组学习制模式进行。由课程导师+助教+班长共同为用户提供服务,采用 15 人左右小组学习制,每位助教定向辅导一个小组并进行定向作业辅导、答疑等,确保更好的学习效果。
除了四位讲师,还有6位助教加入课程。所有助教均有一线区块链公司技术相关背景,并有Substrate技术实战经验,确保每一位开发者都能够得到更专业有效的指导。
第一期课程报名开启一周,100个席位全部抢占完。
第二期课程报名通道提前开放,已经有开发者率先占座。席位有限,报名请抓紧!
欢迎扫码了解更多和课程报名!
扫码关注公众号,回复“1”加入开发者社群