00:00
好,那我们上节课已经写完了合约。现在呢,我们可以把这个合约直接就放到呃,这个自己的IDE,或者自己方便的一个编辑器里边,当然在这里可能会有这种就是报语法错或者怎么样,因为本身这个IDE可能还有一些别的插件,我是还没有找到啊,就大家如果要是想去找一些别的插件的话,就看看能不能有检查solidity语法的一些插件。呃,因为我这里只是装了一个插件,它也只能是去把这些小的关键字什么的,可以去高亮做一个高亮显示,语法方面的话好像还是还是不行,所以大家可以去,如果有好的工具也可以就是一起来推荐一下,大家可以共同去交流一下,那这一块的话,我们就把我们的原文件已经放在了这里,接下来我们看一下下一步会去做什么事情,那有了原文件,接下来我们肯定就是做编译和部署了,对吧。
01:05
好,那我们接下来看下一步编译合约这一部分,呃,前面这一个当然就是主要是说这个,呃,我们分析这个合约的代码大家应该都很清楚了,我们不用再详细看了。我们之前做合约编译的时候,要不就是大家在remix里面,它自动就帮我们做编译了,要么就是我们自己用soap工具,呃,大家在命令行里面敲so杠杠呃并或者是杠杠API,然后加上我们的合约名称,就可以把它编译出来。那现在大家想,如果说我们想要把它再自动化一些的话,呃,不能说自动化,就是我们在显得更专业一些,我们在一个页面就能把这些事情做完的话,那可能就需要,呃,大家看啊,就是在这里都是在这个node控制台里面去做这些事情,那他是怎么做的呢?我们可以先大致的看一下,这是编译,编译的过程其实跟我们之前。
02:13
的过程是差不多的。只不过我们如果在note里边已经安装了so的话,我们是可以直接引入这个模块。引入这个模块的作用。那之后我们编译的这个代码就直接可以so.com。就可以直接用这种方式把它搞定了,所以这个确实会比较方便,对吧,我们直接就可以拿到它的,呃,就是编译之后的代码,大家可以想就是编译之后的代码到底是什么呢?好,我们接下来先看一看它到底会生成一个什么样的东西吧。那这个我们还是进入到这个控制台里面来,我这个应该是在这个目录下边。
03:05
好,现在可以看到我们刚刚新建的这个合约文件啊。好,接下来我们先进入到note控制台里面,我们之前应该是都已经安装过,你先出去看一下啊。大家看自己安装过的哪些包,其实是可以用这个NTM Miss的这个命令去看的,这是我们安装的WEB3,再看一下我们安装有没有安装,So,好,看到我这里边的版本是4.25,编译器版本4.25。所以大家大家一定要注意一下这个编译器版本,如果要是用5.0的话,可能有一些会跑不起来,好,那我们现在进入到note里边。同样,我们既然要用WEB3模块嘛,那肯定一上来之后还是WEB3,等于REQUIRE3。
04:11
好,那接下来大家应该很熟悉了,我们可以看到就是,呃,就是我们这里用到的也是HTP的provider,而且它是就是8545端口,这为什么呢?因为我们启动了GA纳之后,它其实在我们本地启动的也是一个HDHTTP的provider这样的一个,大家可以认为是一个服务器,一个server。所以说这个都不需要,像我们在那个配我们自己的思恋的时候,还有刚刚RPC或者是配别的这个我们直接用就可以了,大家尽管非常熟悉了啊,我前面还是标准的把腕打上啊,尽管已经非常熟悉了,但是在这个控制台里边还是要再打一遍的,因为这个里边我们没有脚本啊,Providers htp。
05:15
Logo host 8545,好,这样我们就定义了在no的环境里边的WEB3对象。呃,接下来我们还是看一下,就是是不是能拿连上我们的那个该对吧,比方说is connected,我们看一下,诶,False,看一下我那边是不是没有起来啊,我已经把这个关掉了,所以说没有起来啊,所以大家如果连一下发现没起来的话,那我们怎么去起之前已经装好的这个GA纳SH呢?大家还是到这个目录下边来,还记得我们那个命令吗?就带着。
06:04
路径的命令对吧,呃,不是这个这个number啊,是隐藏文件,所以是点并点C,然后把它写起来。诶,现在提起来了,他每次启动的时候应该都是会重新创建十个账户,所以前一次和下一次应该是不一样,这也就是说每一次启动相当于我们都启起的是一个完全干净的全新的测试环境,就是方便大家测试用的。所以它是test test rpc嘛,好,我们把它最小化,这边再来测一下看看,现在是出了,那我们拿一下WEB3点Eth.account。诶,十个应该都拿到对吧,大家看一下对照一下可以,所以这个没有问题,我们都已经连上,那接下来我们就开始编译了。
07:00
编译的时候,我们首先需要去拿到我们的源代码。来在这个里边直接做编译啊,我们先把那个so先定义出来吧,你先把一个so对吧,块so这个so应该是有的吧,点我们可以看到下面有compile这个选项对吧。所以大家看到这个就应该是真正的已经引入进来这个so对象,那接下来我们编译的时候怎么编译呢?肯定就是要把我们的源代码传进来,那我们的源代码怎么样?呃,就是传进来呢,我们可以定义一个source code这样的一个变量,那source code等于我们就要从文件里面去读了,FS就是就是note里边的这个文件系统,对吧?我看一下对它默认note环境里面默认是有FS这个对象的啊,所以我们可以FSRA的file,呃,我我们用这个同步的方式,因为我们要等它完全读完对吧?Think方式red fair think,然后我们的名字应该就叫做voting.soll。
08:30
呃,那这个读完了之后,我们把它转成一个string。诶。哦,这个居然是有这个的一个限制啊,这个就这个就比较尴尬了,我在外面看看能不能改一下,需要重新的开一个说明,我们刚才的那个文件是没有读取权限的。
09:04
好,大家看我这个刚刚新建的这个voting.so居然是什么权限都没有,所以大家会改权限吧,对,Mode。大家直接777了,777还是比较危险啊,我们666就可以了,不喜欢666是吧?OK,好,现在大家看一下,我们有读写权限就可以了,好把它读进来,那我们可以看一下这个source code是什么样啊,大家看我们已经把所有的这些都已经读进来了啊,因为我们当时是在这个Windows环境下编辑的,所以大家看到这个回收换行杠二杠N还是很明显啊,所以这个也是经常在一些,这个就是文件的处理里边可能会有坑的地方,当然我们现在没关系啊,这个编译器so,肯定会搞定这件事情的。好,那接下来我们就是编译了,我们已经有了源代码,那当然我们就可以去编译,编译的结果我们叫做compel的code吧。
10:18
其实编译的结果我们先叫这个啊,当然就是用到sock sock点,大家还记得它有什么方法吗?有compel这个方法对吧?Comp,然后我们就把刚才的source code传进去。这个过程就是一个变异的过程了。好,那大家可能就看有些同学可能就想到,诶,那我们这个编译编译出来源代码出来之后,不就应该是自解码吗。那就应该是bit code呀,为什么这里叫一个comp compel code呢?
11:02
咱们看看这个compel code到底是个什么东西哇?看一下这个这个好像很复杂一个东西,这不是自写码对吧,所以大家看啊,它这其实是一个一个GS对象。我们简单的看一下这个大的对象呢,它本身有一个K叫做contract,然后下边是整个的值,是这个contract的内容。这个contracts里面又分成哪些内容呢?首先前面大家可以看到它的K,就是本身它的合约的名称,只不过它的命名方式是一个冒号,加上我们的合约名称,然后还不带后缀。所以是冒号voting。然后里边主要。这就有各种各样的这些这些参数了,对吧,大家可以看到就是有这个操作码呀,Op op codes啊,有这个原数据Meta data呀,呃,还有这个什么gas imitates啊,就是像这个gas的估计量啊,这些东西全都在里面,那在所有的这些参数里边,最重要,也是我们最关心的其实是两个。
12:19
一个大家看到了code啊,这才是我们真正要的字节码,对吧。好,另外一个大家可能也看到了interface对接口,那其实这就是我们的API,大家看着后面这个很像。跟我们很很熟悉对吧,很亲切,所以这是我们定义的abi上面是我们定义就是编译出来的子节码,所以so的这个就是JS的这个库,这个包啊,它引入进来之后,Comba这个动作,它生成的是这么一个很大的一个对象,所有的东西都在里边了,就不需要我们在外面命令行的时候啊,两个杠杠的参数,然后生成两个文件,它这一个大对象就全搞定了。
13:08
好,那接下来我们要做的事情就是要去部署合约了,部署合约呢,我们当然就会,大家还记得我们部署合约需要什么东西吗?API是不是需要?对,Abi是需要的,那字节码是不是需要,对,肯定是需要,所以这两个东西我们就是等一下部署的时候需要的东西啊好,接下来我们做部署还是我们去定义一个abi,那abi这个我们要直接把它copy过来吗?Copy过来就有点对,就有点太弱了,对吧,我们明明它已经是一个对象了,那我们是不是从对象里面就直接能把它拿出来呢?所以我们看啊,这个对象是个什么对象,我们先看一下comba code,它下边是最大的对象是个什么contracts对吧?给大家看这个这个source code,它有可能有可能有多个contract。
14:08
有可能有很多个合约,所以这里它命名的是contract。所以我们这里是只有一个contract contract,然后里边我们要拿什么呢?拿的是冒号voting这个键值对应的内容,对吧?所以怎么拿这个键呢?大家注意加引号,这个键是有引号的对吧?Voting是这样的,看一下,对,就是这样冒号voting,然后这样的话,拿出来的键值里边它又是一个对象,然后有interface,有bad code,那所以我们这里的abi就应该是它下边的inter,诶好,这个它好像不能再去自动补全了,就没有没有找到这个东西,因为它前面有这个,就是就是这样的一个K,好,那我们可以看一下。
15:15
现在的abi是一个什么东西,好,那大家可以看到,这就是我们作为abi,但但是大家看到这个API是一个是一个字符串,对吧,跟我们最后要用的API好像不一样,大家记得当时我们定义API的时候,给的是一个什么东西,对,直接就是方括号括在里边的对吧,直接就是一个对象,就是一个JJS的数组,所以在这里我们还要转一下。呃,那那我们本来前面这个我们重新定义一下吧,Abi,还是刚才这个啊,那就不仅仅要这样,还应该把它对做一个Jason pass,对吧,Jason pass把它括在一起。
16:04
好,这样我们再看一下abi,好,这就是我们真正需要的这一个,这三对象API都放在里面了,而且这个Jason pass之后,我们看到这个也可读性更好多了,比我们当时copy出来的那个好多了啊,我们简单看一下这个里边是不是我们前面定义过的那些函数,首先有一个function,叫做total vote for,这是要去查看。某个人到底得了多少票?然后呢,还有一个function叫做votes received,那这个是因为我们定义了一个public变量对吧,所以说这个也是可以拿出来的,然后下边还有一个叫vote,这是我们投票的那个最关键的那个函数,下边是一个看看list,因为我们定义的也是public,所以说也有一个函数啊,最后还有一个constructor,所以这就是我们定义的五个函数加上public变量,所以就是五个函数,好,那我们现在abi已经有了,那当然有abi的话,我们还得有那个bad code,对吧,我先把它拿出来,Bad code等于其实是同样的这个操作,对吧,Compel code contract contracts。
17:30
然后从这个里边去对拿到,哎,大家区分的清楚,这个就是。我们为什么要用这个中括号吧?呃,大家之前学GS应该都知道对吧,对象的这些操作,所以我们这里是要拿他的这个就是就是这里大家可以看到contracts contracts它的。
18:03
整个的这个value里边的这个内容对吧,然后在呃,而且我们要拿的是一个,就是它的K是一个字符串,所以说要用这种方式去取它的。作为K去取它的值的时候,我们要用中括号把它括起来,因为如果我们直接用点的方式的话,点后面跟一个字符串引号引起来,这个呃,JS不知道你这是在做什么事情的,所以大家注意这个语法就可以,咱简单可以理解成就是在不停的P值,然后取它的对象。就是对象靠对象这种用法,那么它后边的有一个属性啊,这个也是不行啊,BY大写还是小写全小写是吧?诶最上面掰扣对全小写。那大家可以知道这个我们还需要杰森帕吗?不需要是吧,对,大家可以看到这个本来就是一个字符串,所以说对这个就就还好了啊,大家可以想到我们这个东西是不是要要加一个0X呢?
19:15
呃,正常来讲的话,应该还是得加一个0X对吧?呃,我们看一下这边是不是没有加,我看一下。我们的。教案文档里边看一下,这已经过了啊。这里好像是没有加的,我看这里是不是有问题啊。Bad cold。呃,这个不加的话可能会有一点问题,大家等一下可以试一下,我们这里还是先加上啊,或者我们先不加吧,我们看看是不是有问题吧,我们顺便就校验一下啊,这有可能当时我写教案的时候给给疏忽了这一点,所以这里的bad code我们已经定义好了,接下来大家还记得我们就要去创建,先去创建我们的一个。
20:21
合约的一个,呃,我们先创建一个合约对象对吧?Contract voting contract,它等于WEB3点,ETh.contract这里边填什么?对API,我们就是根据abi直接把这个抽象的合约对象创建出来,然后我们再创建一个它的instance对吧?呃,Instance现现在因为我们还没有部署,所以instance可能我们还得稍等一下,我们用交易去把instance创建出来,那现在我们已经有了bad code的话,我们构建一个我们的交易吧,叫呃,还是叫deploy。
21:13
Transaction object对吧。那这样的一个东西,我们来定义一个对象,Data,就是bad code from。呃,这个就是还是我们的web3.1TH点零,呃,Guess我们就给一个稍微大一点的数就行,前面好像300万够了,对吧,300万。好,我们定义了一个deploy transaction object,这为什么会卡到这里?
22:05
他好像是在取这个康林的时候卡到了是吧。我们看一下这边。因为这里只有这里有可能卡到。好,果然这里看到了,好,所以现在这里可以回来看到他已经执行完毕。呃,大家有时候就是这边卡住的时候,大家肯定就会怀疑这个是发出请求去没有响应,所以说我们自然而然就会想到到我们的GA,纳SH那边去看一看它的状况,那边其实大家可以看到love,好,接下来我们定义了这个之后,那我们就要发交易了,对吧,我们怎么样去创建这个交易呢?呃,这个时候我们就可以定义我们的实力了,对吧?合约实力这个我们叫contract instance,还是按照我们习惯来啊。
23:02
它就等于前面我们定义的合约对象叫做voting contract.new这样就是创建一个部署合约的交易对吧?那里边的参数大家要注意了,之前我们是直接就在这里把deploy。Deploy传进去了,现在我们直接传这个行不行?当然也行,那。大家注意,我们部署合约的时候,就相当于没有给构造函数传递出值。对,所以大家注意啊,我们这个构造函数前面大家看构造函数它的input是有一个数组的,而且是一个字符串数组,所以我们在前面应该先把我们的参数传递进去,它是一个数组,在这里我们就随便给几个名字吧,我我就按之前那个写这个教案的时候随便定个名字了啊,就ABC Alice。
24:08
大家可以随便给啊。然后carry,嗯,什么呃是说什么自动转看一下,呃,对,我们可以试一下,我们可以看一看这个是不是可以,因为大家注意到这个这里给的名字其实是一个string,对吧?我们当时部署的那个它里边是为了呃,STEM本身是一个变长数组,那BEST32其实是一个限定长度的数组,所以其实是呃,就是他们的类型其实还是有一些差别的,对吧?那么我们在这里看一下,就是这个是不是可以自动转过去,好呃,接下来我们要做的其实就是提交这个交易了,看一下能不能成功,好,这个看起来我们是已经成功了,对吧。
25:00
在这边看一下。这里有一个transaction,大家可以看到刚刚提交了一个对吧?好,那接下来我们就看一眼transaction instance是不是已经拿到它的address,所以我们看到这就是我们的合约已经成功的部署在了区块链上,当然这个区块链是我们起的本地的一个GA纳,一个模拟的一个区块链啊,它就是非常轻量级,非常方便测试的一个区块链,好,那到这一步为止,我们就已经完成了所有的。编译和部署的过程,那这个过程我们并没有用之前很复杂的这种方式把它copy下来,然后一个一个去敲,而是直接就把它这样弄上去了,所以这样的一个结果也可以就是告诉我们前面这个bad其实0X可以不加,对吧,在部署的时候会自动加上去。
26:00
所以说这个既然成功,那看起来是没什么问题的,呃,当然我们不太确定,就是之后调用是不是成功,如果调用成功的话,那应该就没有任何问题,如果到时候调用出问题的话,我们可能还会翻回来再考虑到是不是这些问题。
我来说两句