00:00
上节课我们给大家介绍的是编译脚本,我们已经呃尽管是就是很短很简单的一个编译脚本,但是我们大家可以看到我们是改了好几个版本,就是不同的阶段有不同的考虑,我们对它做了尽可能的完善和细化,所以现在我们的这个编译脚本其实可以说已经是相对来讲比较正规,或者说是呃比较能够作为真正的应用来用的一个脚本了,所以以后大家如果要是想去快速的编译自己的合约的话,就可以直接掉它。啊,那这个东西可能对于大家来说还不是特别的实用,因为可能觉得我们直接用so命令行去杠杠B杠杠API,直接得到它的API和这个资金码,可能还更直接一点,更直观一点,对吧,这个存出来那么大一个对象,这个到底有什么用呢?呃,那我们知道编译其实是为了后边的部署来服务的,所以接下来我们已经完成了自动的编译过程,接下来我们就来再做一个自动的部署过程,那大家其实之前已经对这个部署流程比较熟悉了,所以呃,我们在这里呢,就先多说一点,就是大家需要注意的地方,我们平常在做这个。
01:24
合约的部署的时候主要需要注意哪些地方呢?首先我们需要注意部署的时候的必要条件。因为我们现在。往往都是用自己的思链,或者说大家起了,特别是现像,现在如果是起了这个garage的话,那么大家平常其实很多东西根本不去考虑了,因为他完全帮我们全搞定了,我们可能主要就是他每次启动的时候,我们得重新部署,主要是这个过程比较麻烦,但事实上我们之后如果再做开发或者测试。我们想要去部署合约的时候,这两点是一定要考虑到的,就一个是我们以太坊节点的通信设置,通信连接,这个很多同学其实,呃,因为大家可能是部署的环境在自己的云服务器上,或者是在自己的虚拟虚虚机里边,就是可能都会遇到各种各样这种网络通信的问题,这个大家遇到问题的话一定要注意,就是我们现在的状态往往都是直接连local host的8545,但这不应该是我们之后开发的一个常态,这只是,呃,这是不应该是大家之后做测试或者说产品发布的一个常态,我们开发当然是可以local host,呃,这跟我们做传统的这个前后端开发其实是一样的,对吧,就是自己测的时候自己开发没问题,但真实的环境肯定不是这样的,所以我们一定要有这样的概念,就是说我们随时可以切换网络。
02:59
我们现在是用了garage,那或者是我们自己起了一个四链访问logo host8545,如果有需要,我们随时可以把它切到本地启动的一个测试网络节点上,首先我们可以不是思链,不是garage,可以是一个测试网络,那同样如果我们本地部署了呃全节点的话,我们还可以直接去连到主网上。
03:25
那我们本地如果大家机器性能足够强,本地起一个全节点,那就相当于我们连上去之后,我们直接就可以当生产环境去部署了啊,所以这是我们在这个不同的阶段可以做的不同的事情,就是在我们的开发阶段,用garage或者是自己的思链,刚刚第一模式起一个思链去部署,在正式的产品测试阶段,那我们应该把它部署到测试网络riby或者是RO上面去。如果是真正的产品发布阶段,那我们就要把它发布到主网上了。
04:01
那所有的这些过程,如果说我们都能本地搞定的话,那当然是没问题,我们直接local host8545都是可以的,因为我们的服务所有的就是本地提供的,对吧,有一个全节点,那就没问题。但与此同时,我们还应该知道,首先我们是可以连接不同的以太坊网络,其次我们的连接网络的这个以太坊节点可以是本地,也可以是远程,可以是任何的一台机器,当然就是如果要是大家不在远程的话,那大家就会看到可能会有各种各样的限制了,对吧?大家的IP要去配好,就不能是local host。呃,不能是127.0.0.1,那有可能还会有这个端口的不同,大家可以指定端口,或者有可能大家还会发现,就是我们在搭建了这个外部应用的时候,我们会有前端前后端的这种访问,那有可能会有跨域的问题,在涉及到这些节点的时候,还要去配它的这种跨域设置,所以这都是大家有可能会遇到的问题,这里就是,呃,先给大家做一个强调,不要觉得我们现在的这种方式很简单,大家就就觉得这个东西啊,都不用管,GALA都搞定了,但它只是一个测试环境,本地的测试环境。另外一个大家其实也都知道,但是很容易忽略的一点就是我们部署的时候一定是要有,就是发起部署交易的账户一定是余额大于零的,我们现在测试的时候,GALA上面默认都是都有100个以太对吧,所以大家现在从来都不管这件事情了。
05:43
之前为什么我们在讲呃,Gar之前要给大家先介绍GA,那GA的时候大家就会发现遇到很多很多问题,对吧,经常就起不来,经常就发不出去,经常就报错,但那个时候大家其实对这些就已经有了全面的了解,但大家不要因为现在我们用起来这种简单方便的工具了,然后就忘了这件事情,当我们真正去部署到robson或者RI的时候,大家就会发现你里边账户没钱,自己直接去部署,然后发现查这个错误半天查不出来,诶,为什么我总是部署不不成功的?呃,可能不是我们脚本的问题,可能不是我们部署策略的问题,而是就是本身账户里面没钱,呃,这个就是大家需要注意的一点。好了,接下来我们就说我们这一次这个部署脚本的一个。
06:33
呃,撰写啊,首先我们是说一下,就是我们的这个版本,依赖前面已经给大家提到了一句,就是因为大家对这个0.20.1这个版本已经很熟悉了,那部署编译部署的过程其实就那么几句,大家其实直接把它整出来就可以,那我们在这里呢,就专门用了一个。1.0.0的版本来给大家做一个例子,那11.0.0还有一个好处呢,就是因为它是都是promise对吧,所以promise它结合EST里边是有一个thinkwa这个方法对吧?大家知道,所以结合起来使用的话,那在这个部署的过程当中,如果我们有各种各样的调用,好几次调用的话,就会代码看起来非常的清晰,也非常的直观,如果我们要用0.20.1的话,如果大家好几次调用好几个请求,那有可能就回调套回调,再套回调,这这个就是回到地狱了,对吧?所以我们在这里就是选用了1.0.0的版本,那大家如果现在没有1.0.0的版本的话,那可能本地就要安装一下这个依赖,如果大家已经有的话,那可以用自己就是呃,装好的这个1.0.0的版本,那当然这个就是n PM install web3后面如果不指定版本的话,大家知道现在默认装的就是1.0.0的。
07:54
贝塔对吧,好,那么。
08:00
依赖安装这里就说到这儿,大家下来之后自己弄啊,就是网络的问题,我们肯定这会儿就不去解决这个了,接下来就是我们的这个部署脚本,部署脚本大家可以看到这个非常简单啊,这个比编辑脚本还还简单,对吧,因为其实就是我们。我们熟悉的这些东西,好,那么我们现在来具体的来写一下吧,好呃,我们的一个部署脚本,那大家会想到,首先编译脚本里面可以不引入WEB3。因为我们知道只要有so就能编译,有源码有so就能编译,那呃部署脚本的话,肯定是必须要依赖WEB3的,对吧?所以我们一上来啊,这里还是用这个ES6的风格上来看的啊,WEB3等于require web3好,然后接下来我们当然知道这个WEB3,我们再把它定义出来,对吧,你一个WEB3NEW we web3点providers.http provider啊大家不要写习惯了,就是以后永远这里都写这个http provider,然后后面是htp local host,呃,8545,就是这是根据我们的需求来的,对吧,这这端。
09:37
口和域,我们的这个主机host的名称都是可以改的,好,如果大家现在已经是部署在自己的云节点上,大家就会发现连接的其实就不是log host,好,呃,那接下来除了这个WEB3之外,同样我们因为涉及到就是呃,会涉及到我们一些内容要从文件里面去做读取,对吧?那我们同样也是需要去引入FS这个这个东西的。
10:06
我们应该是去把FS,我们这个应该还是用这个刚才的那个FX一块X,好,那接下来我们就按照我们的步骤来,首先我们就应该是读取API和back code对吧。那这个东西在我们已经把我们刚才有了编译脚本之后,已经是把我们编译的结果都放在一个Jason对象里了,对吧?那现在这个写法就会非常的简单,比方说我们可以这样啊,用一个这样abi,然后bad code,呃,这个括号的这种这种写法大家可能会会去发现它其实是一种,呃,就是这应该是ES6里面的一个写法啊,就是我们直接可以从一个地方去把拿出来它export出来的东西直接给到两个变量里面复制,对,然后把它作为一个直接就是画括号,括起括起来就像一个对象一样这样去复制,那当然他这个内容是从哪里拿呢?得从我们的。
11:31
呃,生成的那个Jason文件里面的,所以我们这里还是要先去读文件,呃,我们这样啊。Contract,然后呃,我们不应该是contract pass,我们这个应该叫什么叫这叫pass吧,呃,我们这里应该还得pass,对吧,Pass pass。
12:09
Require pass,好,那么pass.resolve我们去拼一个路径出来,呃,首先这个还是DR name对吧,当前路径,然后我们的脚本的当前路径,那么要找到compel的下面的那个Jason,那应该还得拼一个点点对吧,就是返回到上级目录,然后comp的应该就是叫compel,对吧?我们这个先直接写死吧,我们现在是car.jason那这个也写死,看Jason。其实我们可以啊,就就先这么写吧。
13:00
好,这个是fair pass,然后呢,我们可以直接用这个note require的方式,这个就像就是把它export出来的一个对象一样,对吧,让大家知道这个Jason的本身它就是一个对象,所以我们require这个Jason文件的话,其实就是可以把它里边的对象内容直接拿出来。好,呃,Require fair pass,呃,这里面会不应该保存啊?这里面会有一个问题,就是大家还记得我们当时的那个Jason对象里面存的是什么东西吗?我看一下啊,Compel的Jason,大家看是是这么一串东西啊,哇,这个这个有点太太多了。
14:00
这个可能不是不是很方便看到。大家可以看到啊,我们这里边前面这一部分其实是它的一个点扣三倍里边的东西,对吧,我们要关心的是它的API和bad code。哎,在后面。大家可以看到bad code的话,这个就是我们这里的这个bad code定义是一样的API,这里的话大家注意我们其实这里定义的叫做interface,这里是interface,那我们这里如果要是说直接去把这里定义成abi的话,那能把它拿出来吗?啊,这个会有问题就拿不出来对吧?所以大家这里的名称一定是得一样的,所以这里是得要interface,这个不能自已定义,所以bad code大家也不要自己想当然自己给一个大写啊或者怎么样,就是要这个里边本身的那个字段名才可以好,所以我们把这两个变量拿出来,所以之前我们要直接那个abi等于一串复制过来,Bad code等于一串复制过来,现在不用了,现在我们直接这么一条命令搞定,好一条命令搞定啊,然后我们接下来就可以去发请求了,对吧?发请求的这一部分呢,我们用到我们用一个这个ES7里面的一个黑魔法,就是这个think对吧?好大大家了解这个think吗?之前学过是吧?呃,学过的话我们就不细讲了,好,那么我们在这里大家可以看到a think的话,后边是要直接去有一个执行的,对吧。
15:49
我们先把这个写好,然后a think里边的函数体,那就是这样的一个,就是里边可以去具体去一条一条执行的过程,对吧?好,我们首先去把这个里边的账户先拿一下吧。
16:08
就是我们先let counts去取一下我们当前所有的账户,对吧?这是为什么呢?是我们保存了之后之后就不需要每一次都web3.1th.ACCOUNT0去去取这个账户了,对吧?因为大家知道我们每次调WEB3点Eth.account的时候,其实我们是要发一个同步请求的,对吧。本来是要发一个同步请求的,但是在呃,1.0.0里边呢,它所有的这种消息调用又都是异步的,所以我们可能会遇到就是需要处理其他的一些问题,所以我们不如前面先把它拿出来,Accounts,呃,这我们就把所有的都都拿出来就可以了,当然这是一个异步的方法,所以我们要wait对吧,I think wait,好,呃,Accounts这个好像1.0.0,我看一下1.0 1.0.0里边好像没有这个直接accounts的这种这种写法。
17:13
看看一眼啊,有点忘记了哦,这里是用的get account,所以大家注意这个不能直接点account去去哪,嗯,那我们这里就get account get account这是一个异步方法,所以我们用了wait,然后把它拿出来,那接下来的话,呃,当然就是说。我们已经拿到了accounts的话,其实这里边我们要用的其实就是ACCOUNT0去去发我们的这个交易对吧?好,那接下来我们就先不管了,我们接下来let一个result。等于呃,大家这个就就会想到我们接下来其实就可以直接去部署了,对吧,我们有了,按照我们之前的流程的话,是先根据用这个API先去创建一个抽象的合约对象,然后我们就去把这个bad code去构建一个交易对象。
18:19
然后呢,我们就直接点new抽象的合约,点new把这个交易对象发送出去,然后就创建出来我们的一个,呃,就是合约实例对吧,那现在大家看一下这个我们应该怎么样去做,我们这里的做法是大家看一点,我得再看一眼啊,1.0.0里面的做法会不太一样。大家会看到啊,这里cons.log我们就先不看啊。我们这里要做的,大家可以看到它的做法是直接去new,然后WEB3点Eth.contract这样就直接是创建一个新的合约,大家可以看到这个状态啊,然后里边给的东西是我们的API。
19:09
啊,当然这个里边interface拿出来之后,还是一个序列化之后的东西,所以要Jason pass,对吧,把它变成我们真正可用的一个Jason对象,放到这个contract后面,给个参数里面,然后它的部署操作是什么呢?直接链式调用,点deploy。然后后面跟上我们的交易对象。大家可以看到它这里是直接就分开了deploy这个这个方法后面的参数呢,可以给一个arguments,这就很明确,这是我们的构造函数部署的时候构造函数的参数,然后还有data,这是我们的bad code。然后呢,就是点这个点散后面是我们的,就是交易对象里面的别的东西,就是from谁,然后guess什么东西,所以他这样的写法其实对于我们来讲似乎就更直观一些,就是他要做一个部署操作,然后部署操作,部署什么东西呢?有data,有argument。
20:11
然后send的时候,这就是交易相关的from To Ga这些东西value对吧,所以这看起来就更直观一些,当然这个可能跟我们之前的理解的过程就会有一些差别,所以这里只是告诉大家,呃,就是1.0.0里面是怎么写的,这里大家稍微注意一下啊,我们之前的这个web3.1我们创建。抽象合约对象的时候用的是web3.17.contract那个contract是小写的contract。所以大家如果要在1.0.0里边自己去敲这个web3.1TH,敲小写的contract他找不到,但是它有一个大写的contract的方法,所以这个concept的方法就是new一个这个concept,那这就是相当于它的部署合约的方法,好我们在这里把这个实现一下啊。
21:04
呃,当然它这里是用用用了是吧,我们这里用let应该也是一样的,呃,Result等于,呃,当然了,这个也是一个异步请求,所以我们要wa对吧,Wa new,一个WEB3点Eth.contract呃,这样对吧,然后这里我们Jason pass,把我们前面的这个interface传进来,好。那大家这里可以看到,就是接下来我们就用链式调用了,对吧,点deploy这个后边我们可以把data指定by code传进来,另外还可以传arguments。
22:02
给我们这个是我们给定的constructor里面的参数,那这个我们是car这个合约,那当然就是我们可以给一个比如说宝马对吧,BMW,但是大家注意啊,这个arguments应该是一个数组对吧。所以我们不能直接一个就就给过来,所以即使是一个我们也要把它当成数组传进去,当然里边的值可能只有一个,好,那么接下来这个调用完了之后,我们就点散了啊,From啊,大家前面已经有这个COUNTS0了,对吧,我们直接把它拿出来啊COUNTS0,呃,Two two是谁?那肯定兔是零,地址我们这里不用写guess,呃,这个随便给一个啊。500万应该够了,好,那这样的一个散散,我们就完成了这个具体的部署,所以大家可以看到,呃,在这个过程当中,其实就用这这样的链式调用,把我们整个合约的部署集中在这么一行里面,大家如果觉得不不习惯这样就是点这样去写的话,如果变成习惯是就往后面接的话也是可以的,电视要直接接在后面,但那种可读性不太好。
23:20
我们用点的这种方式就可以知道第一步做什么,第二步做什么,对吧?所以一般情况练式就要用是这样来写的,大家可以经炒到这样的编程风格啊,当然这个对齐的话,呃,有些人习惯可能是就是从从这里去对齐,呃有些人习惯是跟后面的这个这个方法去对齐,这个大家看自己的编程习惯啊,好,那这个就已经完成了,所以我们现在可以把这个copy下来去看一下啊,当然这里我们没有打印结果,所以说呃,我们还是应该去去把这个cons出来的,对吧,要不然我们根本不知道发生了什么事情,Pencillo,我们至少要把这个result打印出来吧,对吧?Result,好,Result啊,这个我就先不保存了,我们还是把内容复制到后边去。
24:24
呃,在这个scripts下面,我们再新建一个叫做deploy的某点JS的文件。然后好,我们把它copy过来,好,现在我们去deploy一下,看看效果怎么样。当然,Deploy。之前我们首先要确定自己的我们的节点是不是启动了,对吧,所以大家看一下这里啊,我们这里是启动的,大家已经看到这一个交易出来了,对不对,Contract created,这显然就是刚才我们的这个交易,然后这个。
25:17
这应该就是我们的合约地址,生成的合约地址对吧,2A15这个上面是交易哈希,那这个看的非常明显,2A1果然address是这个。那这里大家可以看到。输出的就是我们整个的这个交易结果。也就是说我们前面在deploy1.js里边。用这个异步调用send完了之后拿回的返回返回值,这个时候大家就可以看到,这就是我们一个很基本很简单的一个部署的一个脚本啊。
我来说两句