00:00
好,大家可以看到,现在我们这个合约就已经布在区块链上了,那接下来大家应该能够想到我们接下来要做的是什么呢?合约布上去了,应该我们还得能够调用合约,对吧?那下一个话题就是我们所谓的调用合约,那怎么样调用合约呢?那其实大家可以看到调用合约的方式非常简单,我们前面不是已经有了my contract instance吗?那么我就直接点my method,这是这是我们自己的合约,合约名称,呃,就是合约里边的函数名称,所以就是直接点这个函数名称,然后后边跟上参数,当然还可以有选项,就是我们可以跟上一个transaction object,就是说我们还可以同时转账,对吧,可以把以太转过去,另外还可以有default block,最后还可以跟上一个回调函数啊,那当然了,就是如果我们什么都不跟的话,相当于它还是一个同步的方式去调用的,其实这个不是特别推荐啊,就最好的话,我们还是用异步的方式,刚才我在这里部署这个合约的时候,可能都是用同步方式的,那大家如果要是说我们真正之后在自己在这个项目脚本里面去做这些事情,可能都需要用异步的方式去处理啊。
01:35
大家可以看到,就是合约函数的调用其实是有三种情况,一种就是直接在我们刚刚建立的这个合约实例上面,后边直接跟我们的函数名点my message,第二种情况呢,是点my method之后点call,第三种情况是点my method之后点send transaction。所以这三种有什么区别呢?其实主要是后两种的区别,就是call和transaction的区别。
02:14
那call主要就是它是以相当于就是指定了显示的以消息调用的形式去调这个函数,那什么样的情况,我们一般认为是消息调,就是简单的消息调用呢?那其实就是我们所说的不需要发送交易的这种情况,一般情况那就是我们用这种方式去调就可以,那什么情况下我们send transaction呢?那就是我们说的会有状态的更改,或者是要去转转B,那这种状况下我们需要去调这个set transaction。那上面这个直接点method,这不是最简单吗?啊,这种方式它其实是自动按照函数类型去决定是send transaction还是call,那大家就应该能够想到,我们在abi里边不是就能看到每个function type吗?那个type里边为什么它会有那么多函数状态可变性的限制对吧?就是它是不是constant,呃,它它是不是payable的,它是不是就是还有一个state,呃呃,Mut对吧,就是状态函数状态可变性有好几个参数去指定,指定这些,所以它其实都是在这个时候会根据这些类型去自动判断调用哪个方法,呃,那在这里的话,我们就来实际的看一看我们自己的这个合约,大家还记得我们这个合约里边有什么函数吗?我们一开始能。
03:53
叫什么?我们瞄一下应该是好像有一个名特是吧,大家看这个M特,它是一个谬型的函数,那我们这里应该是直接可以调对吧,也不用去,呃发币或者是怎么样对不对?好,我们直接my contract instance,第2WINTER可以这样对吧?大家说这个应该是call还是set transaction啊,或者我们先不管了,我们就直接这么调,看看它能不能就是自动给我们完成这些事情,后边他要的是它的这个parameter对吧,就是它的这个参数,那我们这个里边好像也没什么参数啊,那我们直接就这么先敲一下看看吧。
04:49
诶大家看直接就成功了,所以大家可以看到这样的一个操作,它其实在我们这里。
05:00
大家看在我们这里发送交易了吗?刚刚我们这个操作这是一个同步操作是吧,当然我们也可以异步啊呃,如果要异步的话,那就是给另一个回调对分点把它打出来。诶,大家看他直接就返回了,我们这边log好像什么反应都没有对吧?诶大家大家应该知道这个返回的是它的这个me地址对吧,我们可以看一下,就是它的me特肯定就是我们前面的发布的那个ACCOUNTS0嘛,我们看看是不是啊,ACCOUNT0应该是一个对不对,所以大家可以看到在这个查询的过程当中,它根本就没有提交交易,那刚才如果我们要调的话。
06:04
就是假如说我们不让他自己去判断的话,我们自己调应该是用靠对不对,应该是用号去调这个方法,所以呃,这就是简单的消息调用,它不会涉及到我们状态的更改,也不发B,那它自然就是没有发起交易,直接查询我们本地的这个数据就可以了,好,直接查询链上数据就可以啊,那接下来我们去在这个同时,他不是说还可以传一个交易参数,对吧,大家还记得吗?是不是好,那我们看看。能不能给他传一个交易参数啊,那就from ET web3点ETH点胖零,大家先猜一下这个能不能成功,大家觉得这个能不能成功,好我们试一下吧,那就哎,大家看这个怎么就返回一个0X,其实他就没成功对吧?对,其实就没成功,所以大家其实可以想到就是我们当时的这个M特,其实只是它自动给我们生成的一个get函数。
07:48
对吧,是我们自己定义了一个public类型的me特尔变量,然后它给我们自动生成的一个特函数,所以它有一个view的修饰符,是不能去更改状态的,所以我们这个时候如果要去发交易的话,那其实就根本没有用,根本没有效果好那。
08:08
那我们别的方法是不是可以去调用一下呢?大家还记得有一个除了M特还有一个M函数,对吧?我们再再看一下那个M函数,Min函数是可以助B的一个函数,这个它的参数是一个receiver,一个amount,也就是说发给谁,然后给他发多少,好,那这个大家就会看到,我们先去掉这个交易对象,那我们其实是要有参数的,对吧?第一个首先是一个是一个地址,是一个receiver,那我们就给一个web3.1th.ACCOUNT0,先给自己发吧。
09:08
因为他自己还没有呢,对吧,然后我们给数量给一个多给点300万,后面再给一个回调,好我们看一下给大家看。他说这是一个invalid的address,这是一个非法的地址,这是为什么呢?我们之前的那个合约大家还留着吗?我需我们需要去确认一下合约里边写的。Address receiver,这个应该没什么问题对吧。啊,这个应该是上面这个address receiver。
10:02
对,这个应该是没什么问题,对吧,但是大家可以看到,就是我们这个交易其实是必须要有一个from对象的web3.eth。零。好,所以大家看到刚才它提示的这个invalid dress,其实是说他不知道谁来发。对吧,是因为我们这个过程当中必须要提供一个调用者,那我们默认的这里边是没有调用者的,所以说我们必须把这个from参数要传进去,那大家可以看到它直接就给我们返回了,返回了一个大,大家觉得这个应该是一个什么?对,这个我们看看这边的log,大家可以看到submitted transaction,所以579936这个应该就是我们的交易,哈希,对吧?对,所以这是刚才我们的这个操作,其实就是send transaction了,对吧,这是我们真正的一个交易,因为在这个挖币的过程当中,就是铸币的这个过程当中是要更改我们的状态变量的,那一定是需要用一个交易来发起的,所以我们这里去挖矿。
11:41
让这里尽块好啊,这个确实是会很麻烦啊,用我们那个div的方式肯定就会方便很多,好那大家肯定就想到,那我们就查一下吧,我们还有一个叫做balance对吧。
12:12
所以大家可以看到,呃,六次方,所以就是300万对不对啊,我们这是没有two string啊,所以前面我们直接给自己注了300万的币,转了300万的币,那现在他的账户里边就有300万,所以这是符合我们预期的,大家都可以在这里直接调用我们合约的函数去做一些操作。
我来说两句