查看原文
其他

Subdev 讨论|从命令频繁报错开始的第一个Substrate 项目

一块链习 一块Plus社区 2020-11-11

Parity 科技公司研发的 Substrate 框架,让我们拥有了可以几乎不受限制的快速的开发出一个完整、高性能、安全的区块链项目。

 

今年6月份,一块链习与 Polkadot 社区大使陈锡亮老师倾力打造了《Substrate快速入门与实战开发》课程。



目前第三期已经开课两周,同学们平常会在班级群将学习中遇到的难题或不解向老师、助教提问、讨论,现在将第一周班级群日常优质的讨论内容分享给大家。具体内容如下:

Q&A


 01 

Q: 高超@高校教师:

              

编译出这个错误怎么回事?

 

A: Ratentlan @程序员: 确保没有SKIP_WASM_BUILD,  你现在需要编译wasm。

              

你这不是相当于

export skip_wasm_build=true 吗.  当然没有 wasm binary 出来了。

 

 

 02 

Q:二向箔@高校教师:

curl https://raw.githubusercontent.com/paritytech/substrate-up/4f3d476d2271a1cae6014a22255d0c7aa85692e7 /substrate-node-new -sSf | sh -s ‹项目名› ‹

 

这命令对吗?怎么报错?

 

A:陈锡亮@讲师 :换bash试试。

 

A:黄志光@助教 :老师的意思是 sh换成bash,curl不要换。

 

 

 03 

 Q:小贾@程序员

               

这里好像没讲,怎么样才能wasm目标使用 release, native目标使用debug呢?

 

还有两个小问题:

1. 看到提到substrate可以支持不同共识机制,这个机制选择是在runtime,还是client呢, 可以选择有pos 和pow混合的机制吗?

2. 那么多币单位是什么意思,1 DEV是最小单位?

 

A:陈锡亮@讲师:

WASM_BUILD_TYPE=release cargo build 就是。你想的话也可以WASM_BUILD_TYPE=release cargo build --debug

 

共识算法是在client实现,runtime负责存储相关的数据,比如pos就是谁压了多少钱,现在有pos, pow,混合的话需要你自己写。DEV 是测试网的货币单位,14个0。

 

 

 04  

Q:Ting A Lin@程序员 : wasm目标使用release, native目标使用debug, 其实我不太理解这句话的意思。

 

A:Ratentlan@程序员: wasm部分用release的方式编译, 提高性能. 不然开发测试的时候, 出块都是问题。native部分用debug的方式编译, 允许调试.  你要不想调试可以都用release的方式。

 

 

 05 

 Q:Ting A Lin@程序员 :有个很傻的问题哦,每次说Native指的是local环境哦,不是 react native 的意思吧?那我也试用这个命令?

 

A:Ratentlan@程序员:你电脑上跑的二进制叫native. wasm解释器也在native里面.。local, dev, 等是substrate链种类, 用于自己测试。react是说的那个 web 框架?跟这个substrate没关系。

 

A:陈锡亮@讲师:native就是编译过的机器码直接跑的。对比下wasm就是解释器里面执行。

 

 

 06 

 Q:小贾@程序员:老师,看了你演示toolbox里面的功能,这个rpc.state.call(method)是能直接调用module里面的dispatchable 函数吗?    但是method:Text 和 data: Bytes该填什么呢,能否举个具体例子一下?

               

A:陈锡亮@讲师:这个rpc是历史遗留的,基本没法用。

 

Q:小贾@程序员:谢谢老师,那请教一下 现在是要如何才能通过哪个rpc调用到module里面的dispatchable函数了?

 

A:陈锡亮@讲师:

author submitExtrinsic 不过这个是底层方法,一般是用extrinsics页面。

 

 

 07 

Q:村上香菜子@程序员:我打 SKIP_WASM_BUILD = cargo check,系统表示 command not found。

 

A:Li Smith@助教: 这样才有效的  SKIP_WASM_BUILD= cargo check 。              

Q:村上香菜子@程序员:

就是这个=号必须挨着前面的SKIP_WASM_BUILD就吗?差别就在这里是不是?确实是有效了,就是=号的位置是吗?

 

A:Li Smith@助教: 是的。

 

A:陈锡亮@讲师:这个是shell里面设置环境变量的语法。

 

 

 08 

Q:村上香菜子@程序员:我刚才跑了一下 SKIP_WASM_BUILD= cargo check ,结果显示 build failed.我需要重新生成一个wasm文件吗?

 

A:Li Smith@助教: 要呀, 运行可以执行 WASM_BUILD_TYPE=release cargo run -- --dev  。

 

Q:村上香菜子@程序员:嗯嗯,好的。

                

在polkadot.js上面,没有看见我的加密猫项目。

 

A:Li Smith@助教 : 加密猫是另外一个前端。加密猫的项目教程在这里 https://substrate.dev/substrate-collectables-workshop/#/zh-cn/README,但是github我找找看。

 

 

 09 

Q:曼曼@程序员:我 cargo run编译出错,还看不到这一步。error:could not compile ‘node-Cli’.

 

A:Li Smith@助教 : error:could not compile ‘node-Cli’.=》看起来像nodejs问题.@曼曼-学员-苏州 前面执行的命令和步骤贴出来看看。

 

Q:曼曼@程序员:

                             

A:Li Smith@助教 : 你在编译substrate的项目吧,不像是substrate应用链的工程文件。

               

             

跑这个指令创建一个应用链的工程curl 

https://raw.githubusercontent.com/paritytech/substrate-up/9c966504b4a60c2e6b9187b118926a12d2da9448/substrate-node-new -sSf | bash -s mysubstrateproject testusername

 

Q:曼曼@程序员:我直接去build和run加密猫那个项目?

 

A:Li Smith@助教 : 我直接去build和run加密猫那个项目?先自己创建一个示例项目来build,作业是提交自己创建的自定义项目。


 

 10 

Q:于超@程序员: 从新项目启动节点测试网络,跟直接cargo run有什么区别?

 

A:周洋@助教: cargo run 是启动项目的一种方式,应该是一个意思。

 

A:陈锡亮@讲师:一个是启动Substrate节点,一个是启动新的项目的节点。

 

 

 11  

Q:晓聪@程序员:为啥少了个.maintain文件?

 

A:陈锡亮@讲师:substrate 项目才有,创建的新项目没有。点开头的文件finder默认不显示,作为隐藏文件处理,命令行里面 ls -a 就能看到。

 

 

 12 

Q:2012@程序员:--dev(单节点)启动的时候,为什么系统一直在出块呢?出的快都是系统自己的测试快吗?

 

A:周洋@助教:是的,--dev 出的块是本地的测试块,供开发时使用。

 


 13 

Q:alan poon@程序员:

https://github.com/kulupu/kulupu 这是PoW substrate, token 叫kulu, 我能写自己的substrate, 用kulu 吗?as balance 交易吗?


A:陈锡亮@讲师:如果你要你的链用其他的链的token的话,需要XCMP的跨链支持。

 


 14 

Q:xuhehui@产品经理: 我先来一个小白的,想问下第二课作业的代码拉下来之后,是要先执行./scripts/init.sh吗?然后执行生成的 build.sh文件吧。运行init.sh时候,在downloading component 'rustc'这一直提示超时。


A:陈锡亮@讲师:如果之前跑过init了,就不用再跑了,没有build.sh文件啊,下载超时是网络原因,可以试试搭梯子。不然也可以关了试试。不过你要之前能编译的话,说明你环境都搭好了,也不用再安装更新了。

 

 

 15 

Q:alan poon@程序员: cumulus, 只是特别register 到polkadot, 是吧?还没有看到能改 cross blockchain's state 的代码。


A:陈锡亮@讲师:parachain to relaychain 的在polkadot有一些了,relaychain to parachain的还没有。

 


 16 

Q:oldlee@项目经理:

              

              

这些语法哪里有介绍呀?看不懂。


A:黄志光@助教:这是宏里面定义的语法,在编译的时候会被展开成标准的rust语法,算是0成本抽象的一个应用。


A:陈锡亮@讲师:decl_xxx 里面的都是自定义语法。


Q:oldlee@项目经理: 所以我应该去找rust有关宏的使用 相关资料,对吧?


A:陈锡亮@讲师:你想学习这个语法的话就直接看substrate 源代码,从例子中学习就好了。

 


 17 

Q:2012@程序员:

               

上图中,当我们在node-template根目录下执行:cargo run -- --dev的时候,一个链就起来了。那么这个过程中,runtime包是否会被编译为wasm?如果编译了,那是怎样加载到链上执行的呢?

 

A:陈锡亮@讲师:是。作为创始区块状态一部分。

 

Q:2012@程序员:哦,就是说每次run的时候都会编译runtime包的,是怎样利用wasm32-unknow-unknow来编译的啊?

 

A:陈锡亮@讲师:cargo 和 rust 工具包负责wasm编译,和一般的rust或c++项目没有太大区别。

 

Q:2012@程序员:在这个目录执行cargo build的时候,编译出来的wasm文件在哪呢?

              

A:陈锡亮@讲师:target目录里面,位置比较不好找,项目跟目录里面有个target。可以用WASM_TARGET_DIRECTORY 指定wasm文件位置,第四节课中我会介绍。

 


 18 

Q:2012@程序员:我们通过node-template生成一个自己的项目后,直接cargo run启动项目。此时,作为链上的一个节点已经具备了区块链的基本功能了,那runtime包的作用是?cargo run的时候应该是没有执行到runtime包里面的代码的。

 

A:陈锡亮@讲师:有执行的啊。

 

Q:2012@程序员:是不是项目启动后,也启动了wasm的解释器,然后runtime的代码被wasm解释器执行的呢?

 

A:陈锡亮@讲师:对。

 

Q:2012@程序员:1.启动wasm解释器的代码大概在哪呢?

2.runtime代码是怎么加载,然后被wasm解释器执行的呢?

 

A:陈锡亮@讲师:

https://github.com/paritytech/substrate/blob/7ba240f1d49d856471ed52ca8200fa37563dc87a/bin/node-template/src/service.rs#L38

https://github.com/paritytech/substrate/blob/7ba240f1d49d856471ed52ca8200fa37563dc87a/client/executor/src/native_executor.rs#L226

https://github.com/paritytech/substrate/blob/7ba240f1d49d856471ed52ca8200fa37563dc87a/client/executor/src/wasm_runtime.rs#L125

也可以试着加断点调试追踪下。

 


 19 

Q:2012@程序员:老师,该怎么理解executor这个包扮演的角色呢?是仅仅作为runtime代码的解释器吗?

              

A:陈锡亮@讲师:就是执行链上逻辑的执行器。


Q:2012@程序员:代码里面,service包和executor包是怎样关联起来的啊?


A:陈锡亮@讲师:service 负责启动各种服务,包括executor。 


Q:2012@程序员:代码里面没找到service初始化executor的地方,也没找到service加载wasm的地方呢。


A:陈锡亮@讲师::service.rs里面有引用。wasm由executor 加载。

 


 20 

Q:2012@程序员: 陈老师,executor是要执行runtime代码的,那runtime代码主要应该包含哪几块内容呢?

比如,达成共识这类操作应该是network包来处理,runtime负责哪些功能呢?

A:陈锡亮@讲师:所有链上状态的修改,比如账户金额,谁当验证人,所有达成共识的状态的修改都是runtime 完成。

 

以上便是第一周优质的讨论内容,在这里已经全部分享给你。想成为他们中的一员吗?更多内容,请关注一块+(微信公众号ID: yikuailianxi),一所开发者的在线学习与技术实战社区。这里有成体系的线上课程,有挑战的线下实战活动,以及有深度的区块链技术观察+评论。



更多阅读:

▎为什么Rust已成为最先进的主流通用语言之一?

Subdev分享|Substrate背后的密码学选择

Subdev周记 |Substrate最吸引开发者们的四大原因



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

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