00:00
现在我们做的这件事情呢,是把它编译成API,大家还记得我们一开始的时候,呃,我记得就是我们在给大家介绍整个的合约的流程的时候,是有两条线对吧,有一张图,一种方式编译的时候生成的两两种文件,一个是自解码,那这个就是我们部署到以太访上要用,另外一个是根据它的源码要生成abi,对这个这一套二进制的接口是给我们的应用程序,给WEB3这边用的,对,所以大家现在应该就能想起我们之前说的这些东西到底指的是什么了,好,那刚才。我也把这个找了一个工具转了一下,我们来看一下这个生成的这个API到底是个什么东西吧。呃,简单的一转,大家看它确实就是一个一个Jason对吧,一个Jason文件,所以我们看它里边是一组对象的集合,一个数组对吧?然后里边每一个元素都是一个对象。
01:07
然后里边的某一个对象,我们提出来看一看,我们就看前面的这一个,大家可以看到它里边有几个这样的key,一个是constant,一个inputs,当然有inputs就有outputs,对吧,还有name。还有type,还有pay,还有state,嗯,Mutability,还有这个状态可变性这几个字段,那大家看一下,这就是我们刚才其实都已经把这几个都说到了,对吧,那这里边的type大家有没有看到。所有的这些元素里边type它大部分都是什么,都是方式对吧,有几个方式,我们看第一个方式,第二个方神,第三个方神,第四个还是方神。
02:01
诶,后面没了,那后面我们看看这是什么?对,大家看到constructor,所以这是我们的构造函数,它是单独的一种一种态度,对吧?那最后这个又是什么呢?对,这是个event,所以大家可以看到里边主要包含的其实就是两类东西,一类是事件,一类是函数,那函数里边可能根据不同的类型它又会分,这里的constructor是一种特殊的函数,它单独列出来一种态,那除了这个type之外呢,我们还注意到它还有一个name,对吧。好,那么就着重的再来看看这个name。Minter。第二个names。第三个name。我们再看啊,第四个三。那大家对这个东西有印象吗?方法对,这好像就是我们的方法名是吧,我们看一下,回顾一下我们。
03:07
但是这个可能就看不清楚啊大一点。我们回顾一下当时我们的合约里边所写的内容,首先我们里边的函数就两个,一个M,一个散,对吧,这两个我们都在API里面找到了。一个M,一个send,两个方式,这没什么问题,那另外两个我们看到它还有一个balances,还有一个。还有一个什么,诶,这是哦,移动的啊。好,这是一个meter,还有一个balance,这是我们这里定义的什么呢?诶,这应该是我们这里定义的两个变量,对吧?啊,大家注意啊,这里其实不是变量,为什么为什么我们那里定义了两个变量,它这里显示说它type是方式呢?对对对,大家又想起来了,这就是因为我们这里定义它是一个public类型的变量,对,所以我们在编译的过程当中,编译器会自动的生成一个get函数,对吧?所以就跟它的这个变量名称一样的一个get函数,所以在我们的函数列表里边就会出现对应的函数。
04:27
所以这是大家就把之前我们说到的这些东西全顺起来了,对吧?所以它的四个函数没问题,两个是public变量自动生成的两个函数,还有两个就是我们定义的函数,那另外constructor也是我们这里边有的constructor,对吧?最后还有一个event也是我们定义的event name叫cent,完全没问题,对吧?我们的这个event叫S,好,接下来我们再具体的看一看里边的一些参数。比方说。第一个函数M,这是从我们的定义的状态变量转换过来的,那这个函数里边我们看一下它有什么东西啊,首先constant true。
05:11
这是什么意思?是。常量的意思对吧?大家还记得吗?Constant其实是可以作为函数可变性的一个修饰的,只不过我们没着重讲过,但是当时说了一句constant和view是一样的,对吧?对大家应该有这个印象啊,就是所以这里它是不是一个view呢?这个meter是不是一个view类型的生成,生成的那个get函数是不是应该是一个view类型的呢?对,我们只是get对吧,只是get它不写不改,所以肯定是一个view类型的,所以大家注意这里它就是true。那同样道理,Balances也是true,对不对?好,那我们对应的看一下下边,那大家想一想,下边的这个MT和send会不会是是true?
06:08
应该不行对吧,它里边这个都把这个balances都改了,这不是明显对吧,所以我们可以想象得到在下边的。Meant这个方法里边它的constant就是false,同样下边的sent这个sent这个方法也是false。所以这个是完全符合我们预期的,对吧?好,接下来我们再看一下别的inputs和outputs,这个其实我们大家可以想象得到,这是它的函函数的输入输出参数,对吧?那我们这个meter它本身就是一个就是我们所说的一个get嘛,所以它是没有输入参数的。而它是有一个输出参数要返回它的get是inter是谁对吧?所以我们看到输入是一个空的数组,输出有一个元素。
07:08
然后我们看一下name。是空的,我们没有定义。就是默认返回对吧,然后type是address是一个地址类型的M,好,这是我们输入输出参数也是没有问题的,然后下面这两个其实还是比较好理解的,一个payable,就是它是不是payable类型的呢?那不是false。还有就是它的state mutability,这就是状态可变性,这其实跟前面还是有一点。就是有一点重复的东西在里边的,对吧,他要把这个再明确的说一下,它是什么类型,那我们看到它是view类型。所以这个我们的M。转换过来的这个函数和balance,它其实这些参数都是一样的啊,那balance不一样的一点是什么呢?大家看它的inputs是有一个参数的。
08:01
诶,大家想这个balance,为什么它它有这个输入参数呢。为什么balance有输入参数,诶,对对对,大家想到了balance,当时我们定义的是一个mapping,是一个映射,映射我们说我们能直接把它便利完吗?对,所以我们不可能直接我我直接调balances,我把所有的都拿过来,我们没有这样的方法,对吧?因为它是存储在一个很大很大的空间里面,没办法去便利的,对,但是它public之后,我们要能访问,那我们能访问的是什么呢?对,我们输一个地址,然后拿到它对应的那个值,那个余额,所以我们定义的这个balance的。Balances对应的这个应该是什么样的呢?它其实是我们来写一下啊,其实应该是function balances,大家注意里边应该会有一个输入参数,对吧?对,是一个address。
09:03
呃,这个就不知道了啊,就是我们看一下这边有没有对应的名字。这边诶是这个是吧,也没有对应的名字,所以它都是默认的对吧,就是这里可以可能就是一个address,然后它返回的应该是一个public view类型的,呃,当然它会有返回值对吧,Returns。然后我们这里。Return,我们当前balance里边的address这个值对吧?诶这里有问题啊,我们看一下。我们还是给一个变量。
10:01
Address我们就叫a drr吧,直接给一个这个这个变量类型肯定是不行的,对吧,肯定得给一个名字好,所以我们可以想象到它其实生成了一个get,就是这样这样的一个函数,所以我们在这里,当然了,我们这里是给了它名字的,对吧?那编译器自动帮我们生成的一个函数,它是没有这个名字的,所以呃是跟就是前面我们这个me这个是是一样的一个状态啊,所以我们可以看到它的inputs name是没有的,是空type,是一个address。所以我们输入输入一个地址,然后output拿出一个UNIT256,大家看这里的type,就因为我们知道unit就是UNIT256对吧?编译器编译之后,它还是按照最标准的这种写法来的,U只是UNIT256的别名,只是为了我们平常方便书写来定义出来的,所以我们可以看到就是它所有的这些变量定义,我们都能找到它对应的来源。
11:03
我们最后再说一下这个另外两个函数就都一样啊,就是当然这个大家就看到receiver这我们定义过的name就有了,对吧。我们看一下最后的这个事件吧,事件我们可以看到它有一些特殊的一些参数,比如说这里有一个anonymous anonyymous,这是一个匿名,对匿名这个如果要是有了这个参数的话,那么我们的事件。大家前面跟大家简单的介绍过,事件其实是以太坊日志对日志的一个接口,或者说是日志的。整个架构的一个重要的组成部分,所以大家可以注意,如果他有了anonymous的话,在日志里边这个事件,它的那个事件头第一条那个所谓的topic主题就会为空,就会不写,那个主题是什么呢?是对整个事件。
12:06
做的一个哈希,所以就相当于他没有一个签名一样的东西了,所以就变成了匿名的,但事实上别的一些,就是他触发的那些事件的那个log还是会记上的,只不过是没有整个事件的这个签名了,所以大家可以简单的就是这么理解啊,就是这个事件可以匿名。那同样它也是有input的,这也是我们当时定义过的,对不对,我们当时定义过它的一些,比方说,呃,有一个from,有一个to,有一个amount,对吧?那这里大家看到name和type,这个好理解,这里还有一个index。这是什么意思呢?假如这是表示,就是在我们定义事件的时候,对它的参数是可以有index这个类型来说声明的,声明了之后它就是一个可以索引的一个事件的参数,那如果定义了这个之后,它就会在我们记录log的时候,记录在topics,就是所谓的topics下面,主题下面,那一般没有定义index的事件日志呢,就会在日志里面是写在统一的data下面。
13:20
所以它就相当于在日志里面单独有一个索引的位置,之后我们检索的时候就可以快速检索,那当然了,就是我们如果没有必要的话,也也不要把所有的都建index对吧,那就也是浪费系统资源嘛,所以就是说如果我们确实是希望去之后在日志里面去检索的,就可以建这样的index,当然我们这里都没有建,所以都是false对吧?对,呃,那这个基本上API就是这些东西,大家就已经可以理解这到底是个什么样的东西了啊,我们把这个东西如果要是告诉WEB3。给我们web传进去,那WEB3就可以根据它的这样的接口类型,所有的这些定义,就可以构建出一个对应的JS对象。
14:11
那我们就可以在程序里面用这个JS对象代表我们的合约了。啊,这就是整个WEB3,就是处理我们合约的一个模式和一个原理啊好,那接下来我们再多说一句。大家前面看到我们。我一开始敲这个命令的时候,还敲了另外一个杠杠,对吧,诶大家看一下是不是有help啊,有help大家可以直接。对,大家看这里,除了刚刚version,刚刚help之外,当然这个就是out DR,这是输出到哪个目录对吧,一看就是,还有就是啊,大家看我其实刚才可以指定这个的对吧?Standard Jason其实可以指定这个,我们试一下啊,刚才其实我们明显是可以有更好的办法,Stand。
15:07
你这样试一下,看看它生成的是一个什么东西。Empty。可能是需要把这个删除掉试一下。呃,因为确实这个参数我也没有用过,我们。呃,看起来这个是会有问题啊,我觉得这个有可能它会需要接到后边先把它完成,然后才能standard对吧,不要写错啊。诶,现在还是不行啊,好吧,那看起来不是这么用的啊,我我觉得要这样的话,应该就是在在我们已经把它编译完成之后,或许可以用这个参数来做一个转换,我们看一下啊。
16:17
呃,可以直接获得API是吧?对,因为它肯定是里边内嵌了我们的编译器,所以说肯定是可以可以拿到的。呃,还是格式化好的是吗?好,我们现在是应该已经拿到了这样的一个文件,我们来试一下看能不能。把它做这个的。看一下可不可以这么做。好好吧,这个我们回头再再来去去找这个,就是因为大家可以看它这个参数,意思就是要去打开这个标准Jason input put的这个这个mode对吧?呃,所以可能这个我们用法不对,但是明显是可以有这个选项的啊呃,这个不太重要,所以说我们只是试一试,说一说,那大家看到就是我们主要想说的是除了avi这个参数之外,还有一个参数杠杠B。
17:25
对,大家能想到这个是会干什么吗?对,看一下这个,因为bam其实就是binary的一个简称对吧,就是二进制文件,我们看一下它的介绍就是binary of the contracts in hes,所以大家觉得这个它是啊,16进制的字符对吧,最后变成16进字是字符,大家觉得这个应该就是什么东西啊,我们来试一下杠杠B好点。
18:04
好,我们看看它又生成了一个点并文件,那这个又是一个何方神圣,大家看这是什么东西?看起来像什么东西?这就是我们之前一直在说的资金了,这就是我们最后提交到如果想要部署这个合约,需要提交给以太坊的东西,他拿到这个东西之后,就能帮我们在以太坊上真正把这个合约创建出来,所以大家这就看到了这两为什么说这两个参数重要,就是这就是我们说的编译过程当中,一部分生成自解码,交给以太网区块链上去运行,另一部分生成AABI,生成接口文件,然后由我们的外部应用程序WEB3去调用,这就是这两部分内容。好,那我们这就是讲到这一部分,然后我们就已经把这个编译的过程稍微的熟悉了一下,好,接下来我们继续这部分内容。
19:17
诶,我觉得咱们是不是应该先试一下前面的这些基本的WEB3的操作,大大家web三都装好了是吧。都装好了是吗?好,那我们来试一下吧。之前我们都是在这个,我们都是在这个guest so里边去做的这样的操作,那现在呢,我们就需要看看,如果我们不在pencil里边,他已经给我们内嵌了WEB3,如果我们要自己去引入WEB3的话,应该怎么去做好。接下来我们。我们去打开一个note控制台吧,因为这个note控制台其实就是,呃,大家可以认为就是一个JS的执行环境,对吧?我们如果之后编写好的JS文件是可以直接用note去运行的,那我们只要是在noe控制台里面敲的命令其实都可以,就是保存成JS文件,我们就可以直接去跑了,好,我们打开note控制台。
20:22
在这个控制台里边,我们怎么样去引入一个WEB3对象呢?大家看啊,标准的方法是这样,首先我们定义一个,嗯,WEB3,呃,这个这个大家肯定能想到,对吧,WEB3。好,我们看一下现在这个WEB3是个什么东西,它是比较大的一个东西啊,就是但大家可以看到里边是就是有这个provider的,对吧?好,那接下来我们再定义一个小写的WEB3,这是这是习惯上的一般的写法啊,因为就是引入的这个WEB3的本身,它port出来的这个对象呢,不是我们直接能够去创建provider的时候的那个对象,所以说就是连着写的话会有点长,所以我们一般情况是这么分开去写,就是比较明确一些啊,所以我们在new一个WEB3,然后里边是newweb3.providers。
21:34
点HTTP的,然后就把我们真正要提供的这个地址。写进去这样。好,这就是我们把一个WEB3对象真正的引入进来,创建起来,让大家看,可以看到这就是我们这个WEB3对象已经在这里大家看到很多很多内容,对吧,非常多。
22:06
好。那我们现在来看一下WEB3。呃,我先检测一下它是是否连接上啊,诶大家可以看到是false,知道是什么原因吗?我们如果想要去连接localhos box45,我们一定要本地起一个,对,所以我们刚确实是起了一个,起了一个节点的对吧,但是大家应该还想的起来,我当时是没有敲杠杠RPC的,对吧?所以这个肯定会有问题啊,所以我们加上杠杠RPC。好,现在又起来了,我们现在再去连一下看看。现在是数。好。那我们在WEB3里边还能看一些别的东西,比如说我可以看WEB3的version web3version大家看一下啊。
23:06
这里面有一个API。D0.20.1,所以大家可以看到,呃,至少我这边啊,我为什么推荐大家还是装的这个Y3的版本是0.20.1呢?因为我们现在直接去安装的以太坊的版本,就我们盖的版本可能就是0.2几的这个状态,因为1.0还没有发布嘛,所以它内嵌的WEB3就是版本稍微比较低一些的,所以为了符合我们平常这个操作习惯,如果大家装了1.0之后,有可能就会发现我们自己写node程序,写JS的时候,跟我们在平常我们起这个盖控制台的时候,有可能说命运就不一样了,所以这个可能大家会就会有一点困惑,有一点这个就是混淆,到时候就容易乱,所以为了让大家这个环境都一样,所以说我这里边推荐大家是用这个版本。
我来说两句