00:00
上节课我们是讲到了这个日志过滤这个filter,那现在我们就自己来实现一下这个filter到底怎么用,我们已经看到,其实标准的用法就是我们自己去定义一个filter,对吧。Filter等于WEB3点Eth.filter,然后呢,我们说里边可以给一个字符串,字符串可以是latest,也可以是判定,然后还可以给一个选项,对吧,选项对象,那我们在这里就简单一点,就给一个字符latest,那这样的话我们就先定义了一个这样的filter,对吧?我们可以瞄一眼这个filter到底里边是什么东西。大家可以看到这个里边其实它是会有request manager,然后还会有它的实现implementation,还有options,大家可以看这个latest,这个也是放在options里边的,对吧?啊,另外就是它还有一个单独的filter ID。
01:12
另外当然了,还有call back,咱们没有定义call back对吧?好,这是我们这个filter,那么现在我们同时应该是把这个盖子打开啊。这个是我的干吧,不是啊,这个是盖好,那么接下来我们是要去定义了filter,我们还要去监听,所以我们会定义一个watch,对吧,那么监听到的东西我们会用一个回调把它。输出好,这是我们的这个。
02:06
Filter这样就已经定义好了,那大家在这边可以去。看一看就是我们接下来我们定义的是latest是吧,那应该是必须要有块进来,是不是才能出发,所以我们在这里在启动一个挖矿。好,我们跟踪一下这个进程,所以大家看到这边出块的时候,我们这边是不是就是在不停的有有返回,对吧,大家可以看到就是我们监听到的事件,一旦触发的话,它就会触发我们的回调函数,然后就会把这个结果打印出来,那大家觉得这个打印的结果是什么东西啊?这这是一个什么东西,应该是个哈希是吧?对,看起来就像哈希,谁的哈希?对有有同学说的说的非常好啊,就是这是一个区块的哈希,因为我们前面说了latest这一个参数,它检测的就是最近。
03:20
心境上链的区块对吧,所以说它返回的也就是区块哈希。而且大家知道我们在这个时候只是启动了挖矿,根本就没有交易吧,所以一般情况我们哈希的话不是交易就是区块,那这个时候没有交易,当然只有是区块。好,那么我们把这个还是先先停一下啊,这个刷的太太狠了点,好,那我们这边是看了一下这个latest,那大家可能就会想,如果要是判定的话,它会是什么样的一个情形呢。好,我们把它定义一下,然后我们去握持一下。
04:04
那大家想,这会儿如果我要是在启动挖矿的时候,他这边会有视线输出吗?这边又已经在挖了。哦,这个应该是我们之前定义的那个还没有。没有没有把它给那个清掉啊,Stop,这个大家注意,就是如果我们之前已经定义过filter的话,如果我们不手动去把它清掉,那它是一直留在这里,就相当于他一直挂了一个监听的服务,不停的再去检测我们,呃,区块链上的这种状态变化,那怎么样把它去掉呢?这个里边有一个叫做啊不是啊。点stop stop watching,然后把它停掉就可以了。
05:06
这样的话就不会再去。重新检测了,我们把这个定义另外一个吧,叫FILTER2吧,我们定义一个这个啊,然后我们把FILTER2开始watch。好,接下来开始挖矿。诶,这个居然他又能监听到这个我们的动静。这看起来好像之前的这个没有没有清掉是吧,这样吧,因为前面我们那个给了一个同样的名字,可能会有一点。会有一点问题啊呃,WEB3点对,应该有reset这个方法,好把它reset一下,现在应该没有了吧。
06:13
这个还是定义的啊。嗯,我看一下。Options是判定是吧,好,我们看一下二这两个都是判是吧。在reset之后,应该会把我们的filter都清掉啊,你先试一下。你看这边有没有块出来。好像又受到了阻塞,嗯,这边出块这边没出来对吧。
07:08
这个怎么这么慢。大家。在自己那里应该也可以,也可以尝试这个filter,大家自己能看到它的效果吗?好,这边已经出块,然后这边没有说明我们的这个。秀是已经清掉了啊,好,我们现在重新定义吧。这没什么问题啊。然后我们开始watch。所以大家看现在这边在出块的过程当中,这边好像就没有东西出来了,对吧,是不是这样,对这边就之前的清掉之后我们再。
08:06
检测攀定这个事件的时候,现在就没有区块哈希弹出来了,那怎么样我们才能检测到这个PA定的事件的,前面我们说攀顶,它是针对攀顶状态的事,呃,交易而言的,对吧,所以我们这边是要去提起一个交易的。那我们还是到这里来吧。A send,我们可以send transaction对吧?在这里直接去发起一笔交易,From,这是在盖里边,所以我们不用打WEB3,这个还是比较方便。
09:00
好,就这样吧,哦,又得。他会发现这个经常给解锁账户,这个还是很麻烦的一件事情是吧。我们在启动的时候,启动盖的时候,其实是可以有unlock一个账户的参数的,如果我们在启动的时候直接把它unlock的话,其实就没有这么多这么多事情了,好所以大家可以看到我在这里发送了一个交易之后。我们这里好像就出现了这样的一个一个事件,对吧,这里就弹出来了,所以大家可以看到在这里弹出来这个东西是个什么东西呢?其实就是我们这里发送的交易的哈希,对吧?所以我们在这里可以再看一下,要看它的话,就得用get transaction,我们把这个copy下来看一下,大家说他他是进快了没有啊,大家觉得他进块了没有。
10:19
没有是吗?我们看一下NUMBER141已经进款了。所以它其实就是只要它发出来之后。就会被检测到,那至至于之后进不进块,那他不管了,对吧?对,所以其实我们可以看到就是在这边是一直开着挖矿的一个状态,我们把这个挖矿先删掉。挖矿先停掉,然后我们再重新发一下这个交易,大家可以看到这里又检测到了这一个。
11:00
交易的发生。但事实上,我们现在。这笔交易应该还没有进块,对不对,我们刚刚把挖矿都已经停止了。所以大家可以看到这个block number是now,所以就是说呃,在这个判定这个选项里边,它就是监听我们的交易发布的这个动作的,而并不是看它是否就是到块里边了,检测区块真正出块的这个过程呢,我们直接用latest就可以,所以这是两个基本的filter的选项,好,剩下的一些选项大家可以自己下去,就是就是可以照着文档这个给大家看,就是filter,这里官方文档其实写的很详细啊。大家可以看这里就是它的option的几个参数,可以是有这个from block从哪个块开始,To Block从到哪一块结束啊大家注意就是这两个它默认都是latest,所以说它的默认就是只检测latest这一块,From latest to latest,然后后面还有address,就是它可以用这个地址来做筛选,对吧,过滤,最后还有topics,就是我们定义的这个主题,好,那接下来。
12:31
我们就是日志这一部分,是我们事件监听需要考虑的事情,那我们更重要的是什么呢?我们到现在为止,我们讲了交易,讲了区块,讲了日志的过滤。我们唯独还没有讲合约,那我们接下来看一下。合约相关的东西,那首先呢,我们就会想到我们WEB3上面现在还没有创建一个合约呢,对吧?那我们怎么去创建一个合约呢?创建合约其实有,呃,大家可以看到啊,这里边列出了两种创建一个合约实例的方式。
13:17
那这两种其实是这两种其实是截然不同的,大家可以看第一种方式啊,首先我们是需要就是传入它的abi,我们调用WEB3点Eth.contract这个方法,然后传入API,我们就可以拿到一个相当于在JS里边的。合约实力。但是这个合约实力还没有跟我们的区块链网络里边的真正的合约关联起来。那怎么样能关联起来呢?一种方式是,假如我们已经部署了这个合约,那我们知道他的地址对吧?我们就直接可以拿出这个地址来,然后我们调用这个合约点at方法把地址传进去,这样就初始化了我们这个合约实例。
14:18
所以大家其实也能够想到,就是API决定的,其实是我们的这一个源代码定义出来的那些数据结构,它的那些函数和事件。那我们知道,我们如果要是在remix里边的话,点一次部署就会生成一份合约,它就有一个单独的地址,对吧?同样的一份代码,其实我们可以在以太坊上部署很多次。可以生成完全不同的合约,所以在这里也是我们前边的这个my contract。这个JS里边的合约实力,其实只是abi对应出来的那个抽象的合约实力,那它具体我们对应的是以太坊上的哪个合约呢?那一定要跟他具体的地址关联起来。
15:06
所以大家稍微理解一下这这样的两步啊,它到底为什么会会这么去写,呃,那另外还有一种方式就是假如说我们这个合约还没有部署的,那怎么办呢?那其实也简单,那没有部署的话,我们就部署一个新合约,大家可以看到WEB3里边是给了部署合约的方法的,直接就是用我们前面的这个my contract的这个合约实例点new。后边跟着的参数大家注意,首先前边的是叫constructor parameter。也就是说,这其实就是我们在构造函数里边。传入的参数。假如说我们构造函数一开始就要传入,呃,比方说我们在构建这个car合约的时候,我们一开始就要传入它的一个初始的品牌和价格,那我们在这里就要把这个参数传进去。
16:08
然后后边呢,大家可以看到这就是我们一个交易的对象了,对吧,那里面最关键的当然就是这个data data这里是什么呢。部署合约的时候,这个data是什么呢?但想不到是吧,这个其实就是我们的自建码。所以大家看到在部署合约的过程当中,它的abi和字节码两个都要用到,就是用WEB3去部署合约的时候,这两个都要用。啊,那接下来我们就来自己试一下怎么样部署自己的合约吧,大家来跟我一起做啊。呃,首先我们还是把我们的那个。
17:06
大家还记得我们前面编译了一下我们的子代币的那个合约,对吧,我们到contract下边去,我们看到已经生成了这个API文件和并文件,所以说在这里边其实我们是可以拿到他们两个东西的,我首先拿一下我们这个abi。好,那么我们在这里呢,就先定一下这个abi吧,要不然等一下不好写啊。好,我们定义了一个API,把这个API copy出来,复制到这里。然后呢,大家还记得我们要怎么做吗?我们要调web3.1TH的contract这个方法对吧?对,然后把我们的自己的合约实例弄出来,所以我们玩一个我们可以不叫my contract,我们就叫Co contract,对吧?
18:16
Contract等于WEB3点Eth.contract API对吧,前面我们定义好的。好,这就是我们的coin contract这样一个东西,那接下来,呃,因为那个字节码比较长,我们把这个字节码也定义一下吧,比方说我们定义一个叫code,大家注意啊,我们在这里。可以看到这个我们编译好的字节码是什么,大家可以看到这个是,这就是纯粹的字节码对吧,前面是没有0X。
19:09
但大家注意,我们要传递到这一个交易参数里边的这个字节码,作为我们的贝塔是必须是一个16进制的字符,对吧?字符串那前面一定是要加上0X前缀的。所以它本身确实是16进制的,但是前面没有前缀,所以我们要注意。这里我们定义一个前缀,0X加上。哦,这个好多啊好,这是我们的子间白扣,这是我们子间吧。呃,然后我我们再就就直接把这个都分布了啊,然后我们再定义一个我们。要部署的时候,呃,我们叫。
20:03
Deploy object吧,部署的时候要发送的交易的object deploy transaction object,这是一个什么东西呢?这就是我们说的from,呃,我们就还是从这个ACCOUNTS1里边去,呃,ACCOUNTS0去发。然后贝塔贝塔就是拜扣对吧,好,那接下来我们可能再给一个GA limit啊,GA limit的话,这里就直接给定一个GA就可以,那这个尽量还是要高一点的啊呃,我们给一个300万吧,应该没事,应该差不多啊。到时候我们如果他报盖的问题的话,我们到时候再再来改好,这就是我们定义的一个要部署这一个合约的时候发起的交易的对象。
21:11
我们到时候传的时候就传这个就可以了,对吧?好,我们把这个定义好了,那大家再想想我们当时的那个coin,它的constructor里边有有默认参数吗。大家已经忘了是吧,我们看一下coin,哎,这里面没有把那个弄出来,我们直接看到constructor吧,这这是它API嘛,我们能看到它的参数。Constructor。Inputs什么都没有,所以我们不用传参对吧?那这个就更简单了,好,那接下来我们就真正的定义一个coin contract,这个可能写的有点长啊,大家只要自己知道就可以,我这是方便大家呃,了解我们每一步做的是什么东西。
22:09
好,那如果我们定义了这样一个东西的话,大家看到直接调contract.new就可以了,对吧,然后把我们的那个交易对象传进去,它就会提起一个交易啊,这个时候我们看一下啊,前面我们定义的叫什么叫contract.new我们要传的就是。Deploy transaction object。果然又告诉我们没有解锁unlock。好,买了解锁之后,这里的这笔交易就可以发出来了,诶。
23:04
哦,大家可以看到它的提示是说我们的guess超出了block gas limit。所以就是呃,我们的区块是有一个总的盖厘米的上限的,不能交易太多对吧,所以我们刚刚给的那个有点太大了,小一点吧,他这个例子给的100万看起来还是有道理的,嗯。怎么了?盖前面逗号怎么了?绝对是中文的是吗?不是这个是半角,我加了一个空格对吧?好,我们把它改成100万再试一下。再去部署一下,哎,这一下看起来是成功了,对吧,他返回了一个哈希那大,哎,大家说这个是哈希还是一个什么东西。应该是一个哈希对吧。我们在这边的log里面去看一下,果然大家可以看到这里的log显示submitted contract creation。
24:10
所以是提交了一个合约的创建交易,那大家看他的这个富哈希852848,诶,果然就是我们这里获得的这个东西,所以大家可以看到所谓的这个contract.new其实就是提交了一笔交易,对吧?所以我们后边的那个deploy transaction object确实也就是一个交易对象。只不过那个data。我们要把。我们的字节码要放进去。但是大家记得加那个0X前缀。那现在我们这一个contract instance我们可以看了吗?我们看看啊。整个这个对象都已经生成了,但是呢,大家可以发现它的address是unDeFined。这是为什么呢?
25:04
这合约为什么他没地址啊?哎,对,大家其实一想还是能想到啊,就是我们刚才部署合约也是提交了一笔交易嘛,那如果要是没挖矿的话,那交易自然还是不能上链的,所以我看一下还是要去开启一个挖矿。嗯,我们这个挖矿希望他能快一点好,应该是已经挖出来了,对吧,挖出来我们就把它停了吧,好,现在我们再来看一下。大家可以看到,现在是不是就已经有address了?好呃,大家刚才可能看的不是特别清楚啊,我直接用这个点address给大家看一下,所以大家最后用自己的这个实例合约实例点address就可以获得自己刚刚部署的这个合约的实例。
26:15
好,这就是我们部署合约的过程。
我来说两句