00:00
好,大家现在可以跟我一起打开,我们刚刚就是下好的这个travel box的目录,大家可以看到这个目录里边,呃,首先有一个APP这个文件夹对吧。呃,大家如果要是熟悉外pad或者是熟悉前端的这个应用的话,就会知道这个里边其实主要要放的就是我们前端网页的一些文件,包括静态文件,还有JS文件都会放在这个里面,对吧?好,然后下面有一个build build下边那大家肯定就想到了,这个下面肯定就是我们在构建整个web项目的时候,它会把输出的文件都放到这里,对吧?所以大家可以在这里边又看到app.js index HTML这样的东西。然后下边我们再看一下这个contract,这里放的就是合约对不对,大家能够看到下边是有一个叫做con的一个合约,对吧。
01:00
然后还有一个叫做convert,呃,Convert live的一个合约,对吧,这是它里边默认的有的两个合约,这个其实是一个示例程序了,因为我们知道在这个,呃,整个这个以太坊的官方,它其实就有一个ma Co的一个示例嘛,我们一开始再去到那个以太坊官官方网站上也是可以看到这个事例的,所以这个东西大家不用不用管啊,就把它当成一个示例文件,等一下我们把它删掉就可以了。然后这里要说的是还有一个文件叫做migrations。这个合约是用来干什么的呢?它主要的作用是让我们在真正部署我们的合约要放到区块链上的时候,它就会起到作用,那这个主要他他干的事情是什么?我们先看一下啊,大家来分析一下这个合约的用途是什么,我这个应该可以调大字体的是吧?
02:05
CTRL加滚轮是吧,貌似不可以,我看一下刚刚好像看到有那个快捷键啊。刚才这appearance。苏,Out。大家可以看一下这个合约,这个合约里边它名字叫migrations,然后里边呢,定义了一个address类型的owner啊这个比较简单对吧,然后有一个UN类型的叫last complete complete migration,那那这个看起来是个编号对吧,是上一次完成的迁移的一个编号。那是什么东西?我们可能现在不太了解,我们先把它放着吧,反正就是一个address,一个unit,呃,下面我们来看它定义了一个函数修饰符,或者叫函数修饰器,对吧,这个叫,呃,这是一个限制,对吧?Restricted,那它的限制是什么呢?
03:15
哦,If me3等于owner,然后继续执行,这是它的那个占位符对吧。言下之意就是说,如果要是你不是owner的话,调用,那后面就不能执行,是这个意思对吧?大家应该看得懂这个这个modfi吧?好,那接下来我们看function migrations,这是一个public类型的函数,然后哦,大家看到这个其实是我们以前版本的一个写法,对吧?因为本身合约的名称是不是就叫migration。所以这个写法是表明这个函数是一个构造函数,对,这是以前的写法,大家看它的这个版本是,就是大于4.17就可以对吧?所以在这个里面大家可以看到构造函数里边owner就直接等于mes center,这个很简单啊,我们很熟悉对吧?接下来看下边它又定义了一个叫做set complete的这样一个方法。
04:13
这个方法它会传进来一个一个数,叫complete。然后呢,他用restricted这一个函数修饰器把它修饰了,所以这个方法它要求是mes center1定要等于owner的,对吧,然后接下来他做了什么事情呢?就是last complete migration这一个状态变量,把把这个complete传进来的这个值付给了他啊,所以这个也很简单,他就是把这个数了一下,对吧。好,那到这里大家其实就已经可以想到了,他是要做一个大概要做一个什么样的事情啊。这个合约大概要做一个什么样的事情?
05:01
它其实要做的就是我们内部的一个,大家可以理解成一个版本管理,是不是它会记录我们每一次的这个migration迁移的这个动作,前面我们说了migration它就相当于是一个部署动作,对吧?我们可以认为这个这里的migration就是大家所认为的部署,那在这里每一次migration它都会记录下来,然后在插内部会给一个唯一的编号来来记录,那么这个编号呢,在我们这里就是last completed migration这个编号我们记录下来之后,大家会发现我们每一次更改,每一次set,它是不是都会存在我们区块链记录里面啊。所以这就相当于把我们整个合约迁移的历史过程也都保存了下来,相当于窗口自动帮我们做了一个历史版本的一个校验和保存好,那么下面还有一个函数,还有一个函数,这个叫做upgrade升级,它会传入一个new address,然后当然了也会限制说这个必须得是special center等于owner,对吧?下面他做的事情是什么呢?他做的事情是,呃,定义了一个upgraded。
06:20
叫做upgraded的一个migration,也就是说他定义了这样的一个合约,也就是当前自己这个类型的一个合约,对吧,然后呢,就是指向了当前这个new address。所以就是说这个时候相当于我会传进去一个dress,然后把它当成一个我当前这个合约的地址来用。也就是说我现在这个合约要升级了,对不对,它是这样的一个意思啊,然后升级的时候呢,还要把之前的状态变量还得保存下来,所以他会直接调set complete的这个方法,把当前的last complete migration传进去。
07:06
所以大家可以理解就是这是一个自己自身合约的一个升级方法,那上面这里呢,其实很简单,就是把它的这个,呃,当前部署过的这个历史的版本号作为一个状态变量存进去,每一次新的部署它肯定都会重新,就是把这个版本号塞进去,对吧?大家能够想到这肯定就是窗户内部给我们做的这件事情,好那大概就是这样的一个合约,非常简单对吧,一共才20号,20多号,好呃,那这个合约的主要的目的是什么呢?大家可以看一看它到底在什么地方去去调用,那调用的这个脚本它会放在migration这个目录下面,这个下面大家看到有两个JS脚本,对吧。JS文件,那我们首先看一下这个initial migration。
08:01
Initial migration里面非常简单,一个r migrations等于artifacts.require然后把我们刚才那个合约文件进来了,对吧?那这个写法呢?这又是传这个框架,它特自己定义好的一个写法,Artificial artifacts.require大家可以认为这个就像我们note里面直接require一个一个文件,一个模块一样,这是trouble里面定义的关键词,这个大家可以不去管太多啊,所以它其实就是说把我们migration这个合约文件直接引进来了,对吧?然后他做了一个什么事情呢?module.export就把后边的这个函数暴露出来,这个函数是什么呢?它会传进来一个deployer。然后调用deploy的deploy方法去把我们这个migrations这个合约做一个做一个deploy,那大家能够想到是不是这个过程其实就是把这个合约进行部署的一个过程啊。
09:10
大家应该能够想到啊,就是这个deployer这的这个写法,这都是查框架里边给我们写好的,都是他定义好的一些方法,所以我们想要去部署一个文件的时候,照着他的这个模式写就可以了。那这是第一个文件,大家看到它的这个命名的方法都很特别,对吧,前面必须是一下划线,然后引一手,这是它的这个,呃,后边相当于是这个文件的一个描述,后边可以随便给,但是前边这个数字必须给定,而且必须是这样的格式,就是一下划线这样的格式。那整个的T他在做migrant的时候,它会检测我们当前migrations这个文件夹,然后依次按照我们的编号去执行这里的JS脚本,那大家可以看到这里的一就是把migrations这个合约部署了,对吧?然后下边就是二,大家看这个定义的是deploy contract,那肯定前面这个是一个initial手,是一个初始化对吧?然后下边这个才是正经的部署合约,大家看这里边写好的这个部署合约它怎么部署?
10:24
哎,同样我们在这个合约里面不是有一个叫convert LA吗?还有一个叫ma吗?他就把这两个合约文件同样用artifact.require require进来,同样定义了两个变量放在这里,对吧?然后大家看下边xports,直接就是deploy,然后deployer.deploy,这个convert lab,当然它下面还做了一个link,那大家想到这是一个库对吧?Like嘛,这是一个库,所以它可以瞄一眼这个定义啊,它定义的是library对不对,不是contract,这是一个library,这个我们没详细给大家讲,但是大家可以想象的到,跟我们在就是包括C语言,包括其他语言里面的库应该是一样的,对吧?就可以直接去连,就是链接上去,所以这个link其实也是链接的意思,所以它这里做的其实就是编译这个库,然后把这个库跟这个ma Co,然后再链接在一起,然后再把ma Co也deploy一下。所以这个。
11:25
非常直白的这个脚本对吧?所以这就是trouble给我们都已经定义好的一些方法,大家在去deploy自己文件的时候,怎么去deploy呢?其实很简单,就照着他这个抄就行了,大家如果要没有用到库的话,我们直接就deploy.deploy然后把自己的那个文件放进去就可以了,好,这是这个,呃,就是migrations下面的这个脚本,然后接下来我们再看看别的啊,看一下test。Test下边呢,大家可以看到这就是我们的测试脚本了,对吧?这里写了一个测试合约,呃,Test,然后这里还写了一个JS的测试脚本,但看到这个写法大家觉得熟吗?这个。
12:11
这个写法它是contract,然后下边it。这个这个是不是很熟,之前我们是不是用过类似的这种,这个是什么呀,这什么什么里边用到这个,我们之前讲讲讲过这个自动化测试的时候,我们用到了一个前端的测试框架叫moa,所以travel里边它自己也集成了moa框架,所以大家看到它的这个用法就跟我们那个mota的用法是一样的,但是它前面不是describe了,对吧,它自己又包了一层,又把它集集集成了一下,所以它前面这个大家更很容易读,就是哪个哪个合约,然后下面去给它eat应该怎么样去构建它的测试用例,所以这个大家先瞄一眼啊,这个其实就非常非常简单,我们已经有了之前这个Mo的基础,这个就很简单了啊,好,这是test的这一部分,接下来我们看几个配置文件,呃,这些点这个bubble什么的,这些大家不用管啊,E link is linkt这个这些不用管,这些都是就是。
13:17
一些别的一些组件也都是隐藏文件,对吧,大家可以暂时不管,然后Jason大家首先这个是我们NPM的那个那个配置文件对吧?呃,这个里边就写了,这里边已经有的,这个大家看到DV dependences依赖的一些包,所以大家想到为什么写那个我们下载的时候那么慢吗?你看他下载这么多东西呢,对吧。所以大家可以看到它这里面下载的就是WEB3是这个版本对吧,是0.20以上,所以它用到的就是当前是这个版本的WEB3,所以我们的当前的这个这个项目里面也是这样的一个WEB3的环境,好接下来我们看一下这个差副点GS,下面还有一个差副点GS,大家看到吗?
14:04
这个里边大家一点进去就看到了,首先他先require了一个叫呃,B bubble,这个大家可以先不管啊,这个bubble是一个呃,就是ES6的一个转码工具,大家可以不管,下面我们看一下它modu.exports这相当于是一个配置文件,对吧?大家看JS格式的一个配置文件,它下面定义了什么呢?定义了networks。所以它是定义我们的网络环境,也就是说在里边要去连接哪个以太网节节点要去连接什么样的测试网络,这个我们都在里面可以配,它默认配的,你看它默默认配的是GA对吧,然后下面POST127.0.1port,它设置的是7545,然后下面有个network ID给的是芯。大家可以想到了,就是我们要用它的话,是不是得改一改这些东西啊,所以post的话,当前我们的logo host可以不改,对吧?P27.0.1,那port我们肯定要改成8545 network ID这个可以不改,那它后面有一个这个注释啊,他说match and network ID,也就是说你给芯的话,那就相当于所有的network ID都可以啊,那我们本地起了一个network id15的,他肯定检测到。
15:27
在这里要注意,就是我们用的时候,它默认里边内嵌can,我们这里是不用的,我们这里用这个。哎呀,这个拼的时候总是有问题啊,Development,大家把这个改成development,那改成development之后,大家看一下就会有什么样的效果呢?呃,首先我们先不改试一下啊改那。好,那我们退出来到我的这个目录是叫做travel simple vote啊好,那么我在里边假如说直接去启动,我可以启动一个travel cons,这个travel conso是什么意思呢?就是可以直接链接到我们当前当前配置好的这个网络环境当当中去,好我们取一下看看。
16:32
呃,大家可以看到当前没有检测到可用的这个网络,对吧,他推荐说你用穿Le develop去连接吧,或者你自己链接写这个穿点JS的配置去把你的network加进去,所以我们这里边没有内嵌这个纳,我们要去把development写进去,这个写进去之后我再去插console的时候。
17:00
它就会自动检测我们已经启动的给纳,呃,我们已经启动的这个local host of45端口上的这一个节点,那大家看一下它到底起的是不是呢?WEB3Eth.drop number,我们看一下A809,这个是我那边思链配置的那一个,就是现在的区块高度,对吧?大家应该还有印象,所以在这里就相当于已经访问好了我刚才配置好的那个丝链的环境。那这是这个T的网络配置,所以我们自己配置好的丝链一定要在这里去做一个更改。好,最后还有一个配置文件是外派的配置文件,外派点con.js对吧,这个我们不用改,大家瞄一眼就可以,这个上面是什什么东西呢?简单说一下,大家可以看到啊,这个wepa对我们的包管理,它是怎么管理的呢?也是JS的这个呃文文件的这个风格,Modeldu的exports对吧?它port出来的是一个大的对象。
18:01
这个对象里边entry是。app.stricts.index.js所以大家就要注意了,我们这里边真正打包,到时候大家写这个web应用的时候,我们真正的这个JS文件要改的是哪个呢?是这里的这个index.js对吧?Apps下边的index.j然后大家看它output,这是安全对吧?Output它会输出到build下面的app.js。啊,所以大家看到它的打包的过程是怎么样的呢?我们这里配好了,它会把我们的这个index.js用onepad做一个打包,然后输出到build的下面的app.js所以这里的这个app.js不是我们自己去编辑的,是它自动给我们生成的,关pad打包的时候给我们生成的啊,所以大家可以看啊,这里的这个ap.gs其实是不可读的,对吧?做做了压缩之后的一个东西,所以这个东西不需要我们去改啊。
19:08
好one点,可能这个这个里边大家主要就是看一下这里就可以。我们先把这个关掉,我们现在大家要去改的呢,就是这个点JS把这个配置文件先改完好,接下来我们看一下。啊,我们现在就需要来创建我们自己的这一个,创建我们自己的这个呃项目了,对吧,首先我们已经有了这个他给的这个ma Co的这个项目,那我们肯定就是先要改吧改吧,对吧,或者是把他有的这些东西先删掉,那大家可以看到我们其实是可以啊,这个也是点exit啊。我们在contracts下面的这个这个文件,大家可以看到这里的ma po和这个cover live其实是我们没必要用的,对吧,因为这两个明显是他自己后来加的这个示例文件,我们默认的其实只需要这个migrations就可以,好,那么我们这里先把这个这两个先删掉了,省得影响我们这个好,删掉了之后只剩下了一个migrations点。
20:28
呃,So,那么我们这里就可以再创建一个我们自己的合约文件,对吧,比方说voting.so这个合约文件我们之前都已经写好了,我这里就不再不再去重新敲一遍了,对吧?呃,大家当然如果想要去重新敲的话,也可以重新敲啊,我这里就直接复制了,复制粘贴好,那么在这里就把我们自己的之前简单的这个投票合约就放到了里边,那接下来。
21:03
我们的合约已经有了,接下来还要做什么事情呢?但这这个目录有点看不清楚是吧。大家应该还记得,我们在这个另外一个目录下边,叫做migrations下边。它有一个initial migration,还有一个deploy contract对吧,那这个合约这个脚本deploy contract,那我们现在肯定就不是去部署他给我们的那个ma那个合约了,对吧,我们肯定要改成我们自己的,对不对?好,我们再大家打开这个编辑器,我们改一下啊。文件的名字可以不改,我们在这里,那大家其实能够想到是不是直接改成我们的就可以了。
22:01
那前面同样我们定义一个voing,对吧?变量名定义一个voting,好,接下来这两行都可以删了,同样大家可以想到我们是不是deploy.deploy voting就完了,对,所以这就是我们这个在这个部署过程当中的一个东西,但是大家要注意啊,大家还记得我们的这个voting。啊,直接在这个Vs code里面可以看到啊,咱们定义的这个voting,大家是不是还记得它好像还是有这个constructor是有纯餐的呀。对不对对,所以咱们在进行deploy的时候,是不是也得把这个参数传进去呢?好,所以我们这里要注意啊,可以在直接在这个deploy方法里边,直接后边传参。
23:02
传入的参数就是我们的参数,那当时我们的参数是爱丽丝是吧,我有点忘记了啊,当时用的是什么来着。Migration,好,这个爱丽鲍Perry对吧,好。我们还是用这个单引号,单引号会靠谱一点,其实双引号也没事啊,报我们就照着这个敲吧,然后大家看到我们后边还可以指定一个选项,这个是什么呢?在末尾我们可以把交易的那个对象体传进去,也就是说我们可以指定它的GA GA price,大家可以看,我们这里边给了一个GA是20 29万,这个不一定能搞得定啊,我可以给多一点,给100万吧,好盖100万。
24:04
这样大家可以看到改完了之后,我们这里的这一个部署脚本就不会再去部署这个原来他给我们写好的那些东西了,对吧,就是我们改完了之后的voting脚本就会就会部署上去了,没的票好呃,没有参,没有参数的话,你就直接就像他刚才的ma一样,我现在是删掉了,你还记得刚才他怎么写吗?要不要给盖也可以给,也可以不给,不给的话他用这个窗口里面默认的一个值。那那假设如果我的函数,函数里面有几个参数,几个参数的话,就在后边逗号隔开一个一个给就可以,就是它只是最后一个,我们要给的是就是要给的这一个交易的对象体是必须要放到最后一个,然后中间可以是我们的所有的这个参数,当然就是咱们参数要要给对啊,你要是那个数量和类型不对的话,肯定会有问题,好这就是,那大家其实可以想象得到这个过程当中,呃,我我我们还是先过一遍,就是窗口上面的这个这个部署的流程啊,然后我们再去瞄一眼,看一下这个build下边,Build下边除了我们说他这个打包的这个JS文件和HTML文件,这是网页相关的,对吧,还有一个目录没说,还有一个目录叫什么呢?
25:32
叫下面还有一个。然后大家看一下这个下面都是Jason文件,诶这个大家是不是觉得有点熟悉啊,比如说我们点开这个me po,大家看这个Jason文件里面都是什么东西啊,对,这不就是我们的那个API吗。所以大家应该能够想到,这应该是我们编译输出的一个东西,对吧?对,所以这个construct其实我们也也是可以把它删掉的,我们直接到build下边去,我们把constructs下边的啊,就直接都删掉了,就直接把它都删了,因为大家想到这些文件肯定是我们编译都可以生成的,对吧?好,那么我们现在就就完成了,就是它这里边,之前这个项目里面已经有的跟ma data相关的这些东西,我们都已经清理干净了,现在就相当于我们已经改造成了一个我们自己的项目,好那么接下来用我们怎么样去做这个编译和部署呢?来看一下,非常简单,Travelle hotel。
26:41
直接调这个命令,那这个命令大家可以看到,它其实做的就是comp compelling contracts下边的migration so compiling contract下面的voting so,对吧?啊,当然这里好像报错了是不是哦,因为我们用到了这个migrations下面,它这里用到的是之前的那种写法,对吧?没有用constructor,对,所以版本的问题对吧,他说这个use constructor inside,它会报这个,但是这个不影响我们,对吧,大家可以看到。
27:19
我们这个build下边的construct已经生成,又重新生成了migration.js和voting.jason对吧?好,我们看一下这个voting.jason是什么东西啊,这个大家看不清楚啊,我们到这儿来看看。Build下边。诶,大家可以看到这个voting.jason对吧?诶,这就是我们的编译好的那些东西对吧?Abi都放在这儿了,大家再往下看,看看他还有什么东西啊,刚才好像晃了一眼,有一个东西没有看到。诶。大家可以看这是什么东西,By code deployed by code source map source south pass,这是不是跟我们当时用so直接我们自己写那个编译脚本的时候输出的差不多对吧?只不过他可能单独还定义了一些像什么code啊什么的,他还做了一些更改,所以大家可以想象得到这个trouble它底层的这个编译命令是不是就有点类似于我们自己写的那个脚本,对,其实trouble它就是写了一个编译脚本,给我们做了这些事情,生成了一个Jason而已,这些事情我们之前都做过对吧?好,那接下来我们看到这个编译这一步已经通过,那接下来就是部署了,对吧?那travel里面部署的动作是什么呢?Travel当然大家可以deploy,对吧?平常这个大家还是再看一下它的这个命令啊。
28:54
能够想到肯定我们直直观的印象是这个deploy,但是大家看到deploy它是什么呢?它是migrate的一个别名。
29:05
所以如果大家习惯用deploy的话,就deploy也可以,但是更常见的命令是上面这个migrate。大家可以看到migr是什么呢?Run migrations to deploy contract,所以就是说它会去运行这个迁移,然后就是其实它起到的效果是什么?就是部署我们的合约,对,大家可以认为这里的这个迁移migration就是部署好,那么我们就travel migrate my。个应该没东西是吧,听错。我们看一下它的效果会是什么样子。好,大家可以看到,诶,这里忘了王啊。呃,大家可以看到这里它其实就是,呃,用到了我们当前配置好的这个网络,对吧?因为大家可以想到编译的过程当中不需要连接我们的以太坊网络,以太网节点,对吧?自己就能编译好,但是部署一定是要去连接以太网网络,你们看一下这个错吧,Error and county network states啊,大家已经看到下面这个error了,对吧?因为我们现在连接到的是我们自己的思链,我们思恋上那个账户没有解锁对吧?所以这个就是思恋上这一点是确实不太舒服的一点。
30:33
好,那么。Cons里面去去看吧,大家看一下troubleo是不是可以直接去。去处理这件事情啊。哎,这个传品测这么慢,我们那个节点应该是对吧?哎,好,进来了啊,大家还记得我们解锁的那个命令是什么吗?对personal哎,我们先看一下这个we,这个ETH,看看有没有啊,没有必须得外B3.eth啊呃,我们先看一下counts。
31:16
诶,大家可以看到这里是我已经定义好的三个账户对吧,那我估计这个personal也得用web3.personal啊,刚才好像他没有自动补全对吧,Unlock account。那WEB3点Eth.ACCOUNT0,呃,我们定应该是123456对吧,定一个大点的时间吧,省得我们总要去写。好,现在是出了,我们出来,然后再去migrate一下。诶,好像又error了,好,这里报的error是。
32:02
超出了block gas limit,所以是我们给的那个gas limit gas太多了,对吧,对吧,它是超出了block limit,所以这个我们还得对,要改这个部署合约的这个脚本对吧?对,这个里边盖给太大了啊,我们先直接删了试试看,用它默认的试试看啊。好,这样删了的话,应该就用里边给我们的默认值对不对,好。诶,这个还是超过了,所以本身它默认的这个值居然都能超过啊,我们的这个block盖厘米到底是得有多小,把穿点JS这里去加一个GA的限制。好,我们再trouble一下。
33:11
这我们看一下这个当前给的这个是一个10万对吧,看这勾勾。也稍微有点慢啊,我们去到我们的那个log那里去看一下对吧?MY哦,大家知道为什么吗?为什么他会卡在这里吗?我们看这个log这里,他提交了这个contract creation,但是好像没有执行对吧,没有没有出块。为什么呢?因为没挖矿对吧,对啊,所以我们这里这个就会比较麻烦,我们还得去启动一个挖矿的进程,Local host85好,我们在这儿start。
34:14
好,我们先退出来看一下,看看这边哦,我后面多加了一个U是吧。嗯,大家可以看到现在是在启动这个挖矿的程序,对吧。嗯,这个好像稍微有点慢,现在还挖不出来。所以大家在这个部署的过程当中,可能也是得就是频繁的去试一试,包括像咱们的这个GA limit,还有这个,呃,就是我们一开始给的这个gas,经常就是如果说我们在没有配的时候,它默认给定的那个block gas limit可能往往都是比较小的,那这种情况下可能就是会会稍微会比较麻烦一点,大家就需要去给它设置大一点。
35:14
啊,大家可以看到这里已经成功的部署了,这里部署的是我们前面的第一个对不对,大家看这里的这个过程啊,它是running migration1先执行这个脚本对不对,然后deploy的,好,我们看一下啊,这里又搞错了,好,这是又小了,对吧,大家看到这个please check your GA amount,所以我们给的这个明显是又小了,好这个我们再再换一个。我们还是给到二九吧,好,那边挖矿我们就一直起着。
36:00
诶,大家可以看到第二次的时候,他就不再去跑第一个脚本了,对不对,这居然还是小,我们直接把它删掉试试,如果删掉的话,应该就是用我们已经指定好的这个。呃,Get,呃,Get limit来来去传传递的啊,所以我们看一下诶,大家可以看到这一次成功了,呃,所以这个东西有时候就是自己去试一试,因为我们也没有去专门的估计过这个部署的合约,这个过程到底消耗多少盖对吧?所以如果我们想要让他成功的话,就一遍一遍去试,呃,大家可以看到后边两次我们再重新去做migratet的时候。他好像没有去按照第一次的这个进程去执行我们第一个initial migration对吧,所以大家可以看到前面的这个,为什么它叫做initial呢,初始化呢,它其实执行过一次之后,之后其实就不执行了,对吧。
37:08
所以大家可以看到,就是每一次trouble给我们在做这个migrate的过程当中,他其实是会去检测我们当前合约是不是已经部署上去了,如果已经部署上去了的话,他其实就不会再去做重新的迁移部署。只有当我们这个合约还没有部署成功,对吧,那他就会再去重新部署,大家看我们这已经部署成功之后,如果我再去migrate一下,大家看有没有什么效果啊,它会出现什么样的状况。大家猜会怎么样?好,大家看,直接什么都没执行,所以相当于窗口是利用它里边的一些就是文件版本的控制,检测我们文件有没有改动,检测我们的合约有没有改动,如果要是没改动的话,已经部署之后的合约,他直接就不再部署了,所以这个就避免了我们大家你本来没有改动,你还一遍又一遍的往这个网络上去发送,对吧?你部署上去之后,相当于还是一样的东西,只不过你又是消耗了GA,然后重新生成了一个地址而已,所以它避免了我们做这种无用的功夫。
38:23
窗口对这个做了一些优化对吧,那大家现在看一看,它部署完成之后,我们看看migrations,这个是我们的脚本对吧?这个下面是我们脚本,那部署完成之后在我们的这个区块链上。哦,这个它还在一直挖矿啊,我们这个可能已经有点看不到,当时的这个大家可以看到这里就能看到。我们当时部署的合约的这一个地址对吧?啊,所以大家就可以看到这个东西了,整个的这个过程当中就两步,就非常简单对吧?大家在那个合合约这个contracts下面把合约改了,把合约放进去,然后travelle comp,直接这么一句搞定,它就会生成Jason文件,放到我们的build下面的comps文件夹下面去,就跟我们的compile编译脚本一样,对不对?然后大家如果要部署的时候,只要确保自己的思链或者是GA纳SH已经启动,就直接运行conr migratet,它就会从我们的build下边生成的Jason文件里边拿出对应的abi,拿出对应的bad code,自动连接网络给我们发布到区块链上。
39:45
那大家可以想象这个migrate这个过程是不是其实也就相当于我们之前的部署脚本啊。啊,所以我们之前是大家已经用NPM管理了之后,对吧,N PM compare run compare n PM run deploy,那现在只不过改成comp就可以了。
我来说两句