00:00
本来我们是要把所有的这些讲过的这些,呃,接口调用我们要结合在一起,用脚本来实现功能,昨天我们只实现了一个最简单的功能,就是直接转以态,对吧,大家可能会觉得所有的这个接口调用里边。如果说你只是转账的话,其实这个交易还不不算很复杂,对吧,真正复杂的可能是和合约相关的一些接口,可能会大家觉得稍微有点复杂,好,那我们接下来就一起在实现一个跟合约相关的一个脚本。我们想实现一个什么样的脚本呢?我们想实现的是一个。比如说我们前面已经实现了一个,呃,就是自己的子代币的合约,而且我们都已经编译完了,对吧,那今天我们就试图,昨天我们已经把它部署到这个链上去了,嗯,那今天我们就试图要写一个脚本,我们要能够自动化的,就像昨天我们写的转以态的那个脚本一样。
01:03
自动化的调用我们的合约,给另外一个账户转我们的合约里边的代币。也就是说,我现在调这个脚本,转的不是以太,转的是我们自己的币。也就是说,那那大家如果要之后进到一些公司里边,他可能做了ICO,或者说即使没有I,他也自己发生,就是发行了自己的代币,对吧?那这个都很容易,如果他没有发行,大家去了之后也可以给他帮他发一个,但大家肯定知道这个很很简单就能发出来,对吧?那之后肯定你发出来之后就要有需求了,你一开始设置的肯定是所有的代币都在你自己手里边,或者像我们那个子代币一样,就是你有权限,你可以随时铸币。那你一定要有方法去给别人转币啊,那别人ICO买了你的这个币,给你打了以太坊或者呃,打了以太币或者是打了这个比特币之后,你得打给别人你自己的代币嘛,那你的代币怎么样打给别人呢?大家可能想到我用钱包去给他转吧。
02:07
但是用钱包给他转的时候,大家注意也是要提起交易是要给那个数据的,对吧,那我们最后相当于还是得自己实现调用我们的那个就是S函数才能够把这个B转过去的,那大家说那我们现在用什么样的方式给别人转呢?可能我们用remix里面把它部署了之后去点,对吧,但这个好像就不太感觉就不太靠谱。或者另外就是假如说即使我们remix环境很稳定,我们点的也也没什么问题,或者说甚至我们都有一个钱包实现了这样的一个功能。还有一个问题就是说,有可能我们。以后的需求是一下子我们的投资人来了1000个,一个地址列表。啊,然后这个部门老大给你一个任务,好,你把这1000个人每个人发1万个币,好我们自己的币给他打,打过去,那难道我们在remix上一直点,一直点复制一个地址,写一个地址,复制一个地址,难道我们点上1万次吗?然后去确认交易吗?对,这个肯定就是会有问题的,呃,那当然就是至于这个1万次,大家已经想到,像这种事情肯定我们就是用脚本去自动化处理,比较简单,呃,那至于这个就是1万次的这个事情呢,我们在这里就不详细说了,这其实就是一个文件读取的问题,对吧?我们把所有人的这个地址都存在一个文件里面。
03:34
然后我们用这个note里边的文件读取,一行一行读出来,把这个地址一行一行提取出来,作为我们的这个to的那个地址就可以了,那我们在这里呢,还是就是就不先不做这个扩展,我们只是给大家就是看怎么样给以某一个地址,用脚本自动化的画币,我们调一下这个就能把我们的磁带币发过去,好,那其实这个就跟昨天的我们写的这个转以它一开始就很很类似了,对吧,我这里就不用Vs code或者别的了,因为我们这个脚本非常简单,我直接就用这个记事本notepad。
04:12
呃,当然我这个是note加加啊,就是它编辑起来还稍微方便一点,来我们就开始写了,首先还是我们要定义WEB3对吧,我们首先require一个WEB3。这个大家写熟了就都完全一样,就是直接快速的把它过了就可以了,但是大家这个一定要手敲,最好不要复制粘贴,因为复制粘贴习惯之后,大家手敲的时候就会发现一敲就错,一敲就错,而且是自己不容易发现错在哪。好你有一个WEB3。点providers.http provider好,里边我们要提供我们的。
05:04
真正的provider对吧,8545好。这是我们的provider坚持力。然后大家就想到了,那我们昨天提供的,那呃,我我们先先不讲那个边边角角的东西啊,我们就还是直接定义定义词好了,我们就from。呃,这个就跟昨天的转以态是一样的,对吧,同样是转币嘛,都要有front front to和一个value,一个mount,我们把from定义成定义成我们的COUNT0,然后。To,我们先写死,直接给定ACCOUNT1ACCOUNT啊,这个注意。因为这里边不像remix有有这个编译的提醒,所以大家一定小心一点,呃,这个我我即使写的比较多,也经常会犯这样的错误,好,我们先定义基本的这么几个参数,就是我们写死在这里,Value我们给一个,这里我们不要给value了,因为value我们容易想到,因为转以态的时候,那个东西叫value对吧,我们这里既然是转自己的币,那不要叫value了,我们直接给一个叫among好了。
06:27
呃,这个我们就随便给一个吧,给个5万,好,我们先把这个写死,当然大家知道之后,我们想要从外部输入的话,我们像昨天一样,从这个命令行里边去提取出来,把它的参数提取出来就可以了,对吧?好,我们先那些东西不重要,边边角角的东西,我们先实现核心的功能,那接下来我们的核心功能是什么呢?我们要从合约里边转子代币,那就想到了这个,我们就不是简单的,呃,就是WEB3点,ETH点,呃,Sand transaction,然后把那个value塞进去就可以了,这这肯定不能那么转,那么转就是转以态,那我们现在是要转我们自己的子货币,肯定就要调用到我们合约里边的转币方法,大家还记得我们合约里边转币方法是什么吗?
07:17
来,我们再去看一眼啊,诶,我这里好像没有留着了啊。把我们的那个合约代币再copy过来,然后这个意思就是这点不方便,大家如果就是想要下它那个桌面版的话,也可以下它桌面版,那个好处就是文件可以自己存着,对吧,因为这个remix经常我就是刷新之后,大家发现之前的文件都丢掉了,呃,我看一下我们这个。我就把它放在contract下面了。
08:00
No co.so好,我们就直接在这看吧,不用copy到remix里边了,这个应该看得到是吧,放大一点啊。视图。蠢臭。加number加。好吧,这个好像没什么用。好,大家可以看到我们本来的这个代币合约里边有一个铸币方法,还有一个散方法,所以其实我们现在要调的就是这个散方法,它不就是给我们指定的一个地址去发币吗?所以呃,这就是我们的这一个合约的这个,呃调用的模式,那大家可以想到,我们既然是要调这个合约的方法,我们现在是不是还没有合约啊。
09:02
那我们的这个合约怎么样去指定呢?那大家应该想起来,我们昨天讲到合约的时候,对,就是怎么样在我们的WEB3,就是JS脚本里边能够识别到,就是真正的跟我们区块链上的合约能挂起钩来呢?首先要用到abi,对吧,要不然我们不知道它这个合约它的数据结构是什么样的,所以我们在这里先把abi先拿回来。Abi,呃,这个的话,那其实没有什么别的,我们直接把它copy过来就可以了,这个copy过来可能会比较比较大啊。这个我们直接就把它CTRL过CTRLC过来。当然这个会比较大,大家就是直接把它copy过来之后,可能后面会有点不容易读取,这个我们之后再去讲,就是我们怎么样更方便去读取这样的一个东西,不要把它直接hard扣,就是硬编码都写到这里边啊,现在我们不管,我们只要有这个API,我们就可以创建对应的JS对象,对吧?好,那大家应该记得,有了API之后,我们就可以比如说我们的poem contract,我们定义一个这样的JS对象,它就可以new web3点Eth.contract大家还记得这个命令吧?
10:36
它后边里边的参数直接给定这个avi,那么相当于我们的这个Co contract这一个JS对象就已经绑定了我们的源码,我们源码里边提供的这些数据类型他已经知道了,所以他也知道我们之后会有什么样的操作,会有什么样的数据类型都清楚了,这是绑定了我们的源码,但是哦,就是我没有存它啊。
11:04
无限不存,但是我们在使用它的时候,大家注意区块链上我们一份源码其实是不唯一的它,因为它部署之后就会得到不同的地址,所以我们真正在跟区块链交互的时候,我们的合约实力其实不是唯一的那份源码,而是说他部署之后,部署到哪个地址上,那个才是我们真正要调用的实例,所以我们有了这个源码的合约对象之之后,这个可以认为是一个抽象的合约对象,对吧?那我们还要把它实例化,怎么样实例化呢?这个时候我们就需要提供我们的合约的地址,对吧,Address contract address,那这个的话,大家如果昨天已经部署完了之后,应该是能拿到这个地址的,不知道大家这个copy下来没有,我当时是偷偷的copy下来了啊。
12:05
大家如果要是没有copy的话,到时候我们就只能是重新,大家如果找不到,就只能重新再部署一遍了,部署一份新的了,对吧?好,我们先把这个copy下来。Contract,我们昨天已经部署了,所以在这里我们地址是已经知道的,这就是我们提到的,可以用另外一种方式去把它实例化,一种方式就是我们昨天说的。你是新的还没有部署,那我们直接去部署一遍,它就实例化,然后我们拿到地址,那如果我们已经部署了之后,难道我们每次都要重新部署吗?显然是不必要的,那我们在这里可以直接contract instance把它实例化,实例化的方法是at。昨天其实提到过一句啊,但是我们可能没用at什么呢,就at我们的contract。Address。
13:01
就是这样的几行命令,我们就实现了在JS里边去实例化一个我们的合约对象,而它所有的这些数据类型和对应的这些操作都在API里面定义好了之后,我们就可以用这个实例对合约的实例去做我们想要做的操作。好,那接下来怎么样操作呢?大家可能就就已经想到了,我们讲过这个,昨天讲过合约的调用对吧,合约调用的时候直接就是contract instance,它这个实例点加上它的方法名对吧,那我们的方法名是send。所以我们直接这样调用一下,那send的参数是什么呢?呃,大家肯定记得我们的参数是一个叫做receiver,对吧?给谁发,那我们这里的receiver应该就是to了,还有一个叫做还有一个叫mount,对吧?那肯定就是要发的数量了,这里把amount点进去。
14:06
另外这里大家要注意,我们这里是不是没有指定谁给他发呀,对,所以大家要注意啊,那我们在脚本调用的时候,一定要指定它的发送者是谁,所以我们这里把from给过来。当然大家这里后面这就是我们所说的一个交易对象,里边有from就还可以有to对吧,那大家说如果我这里要写to的话,应该是谁什么呀?这里还可以写to吗?没必要诶,为什么没必要兔谁啊?我现在是前面有,呃,说这里有杠兔了是吧?这里的to跟后面咱们写的兔一样吗?大家想一下。前面的这个to是。
15:00
我们调合约的散的方法的时候,说给谁转我们的,我们的子代币对吧?那这个to应该是什么?对,这个to应该是我们的本身这个交易要发给谁,我们其实是发给合约的,对不对?所以大家这里如果要写to的话,它其实是应该是我们的合约地址,大家这里要注意,那大家说为什么这里其实没必要,因为我们都已经定义了合约对象了,对吧?我们的合约实例都已经创建好了,它的地址已经包含在里边了,所以这里我们默认是不需要加to的,当然我们这里还可以加value,那这个value是我们前面的这个want吗?对,也不是这个加了value之后它是一个什么?对,是我们要给合约地址转的以太的这笔账,对吧?所以大家要搞清楚啊,后边就是我们的交易对象,而前边是我们的这一个调用合约函数的参数,这两个是完全不同的东西,后边涉及到的就是我们交易本身的东西,它的value就是以态,而前边这个呢,这个忘了,这就随便定义了,这是跟我们合约相关,对吧?在这里我们的子代币合约,所以它是我们自己的那个代币的数量。
16:18
来搞清楚这个事情,当然我这里不能给value流,因为我们的那个合约不是它没有定义pay的,呃,这个回退函数对吧,或者说我们的这个send函数本身也不是一个PA,因为这里调用的是send嘛,所以跟回退函数其实还没关系,那我们send如果要能发value,能发以态过去的话,那必须send函数是payable的,但我们之前好像send函数,但忘记了啊,看一下send不是payable,那肯定你加VALUE6是就不成立的,所以这里我们就没有value啊。好,那么我们指定了from之后,知道它从谁发出来,然后也有了函数参数,也有了这个交易的对象,那这个基本上该有的东西都有了,那最后就还应该有一个。
17:08
我们怎么拿到它的结果呢?加一个最后的回调对吧?啊,这个回调的话呢,大家还是一样的写法啊,就是简单处理,大家如果想去做详细处理的话,可以再把这个回调做一些扩充,好呃,那么我们就简单写了,那就是if error,我们就点log。呃,比方说我们报一个error,把error打印出来放在后边。Else的话,我们那就pencil就没错,那我们就把result打印出来。好,这就是我们一个,呃,我先把它保存到外面,我叫这个我们叫做呃啊,我们就叫三吧,大家看过之前其实已经实现过啊。
18:10
我们后面不要加script,这个就叫JS可以对吧?好,我们把它存一下,所以大家看,这样我们就实现了一个最基本的利用合约调用我们合约里边S函数来转子代币的一个过程。我们现在已经做完了,那就来实现一下,那大家知道我们要想去真正调用它的话,呃,现在直接去调用可以吗?对大家肯定想到了,就是我们在这个里边,我现在如果去闹这个刚才叫什么。诶,我这里好像没有看到这个文件啊。他有可能是BA没有刷新,这边把BA都退掉看一下。
19:09
应该没有进错吧。诶,这个很奇怪啊,为什么我在这里看不到这个东西呢,我把它关掉一下。三炮应该是有的,对吧。嗯,这个有时候就是在这个本身Windows里边的。Linu自虚拟机可能确实有时候会遇到一些奇怪的状况。然后还是没有这个,这个确实很很诡异啊,那我们自己重新创建一个吧,这叫3co.JS。
20:01
好好,刚才我们好像都已经给关掉了是吧。我们去打开啊,这个这个目录可能会比较深啊,大家有同学也用这个WIN10系统,然后自带的虚拟机吗?大家都在用是吗?大家知道那个就是大家如果在Linux系统里边的默认自己的那个就是主目录下跟目录下面,它的目录在Windows里面怎么找嘛?Windows里面的路径在哪里吗?最近使用第一个就是什么。那要关了之后重开一下是吧,这个是吧,大家可以看到后面这个路径啊。
21:00
它是很深的一个路径,所以大家如果要想要去找自己的那个Linux子系统下面的文件到底在哪的话,可以用这种方式。No。啊,这个我打开的话就是用这个对web,呃,Web storm,这个我本来默认的这个打开方式web storm。哎哟,好慢呐。不该打他啊,好,我们把这个copy一下。大家平常前端开发的工具都是Vs code的是吗?
22:04
啊,还有别的是吧,Web啊也会用web这个我觉得工具其实没关系,大家有一个趁手用的舒服的工具就可以。好,我们在这里把它copy一下。嗯,好吧,他现在说这个。又不能把它。所以它其实应该里边是有这个文件的,我说里边但可能会有一点问题,你觉得是隐藏了是吧。这个确实是比较诡异的一个问题。应该隐藏的里面也没有,对吧?这个状况确实很灵异,我们明明创建了这样一个文件啊,没关系啊,那我们在创建一个不同名字的文件吧,刚才我们叫呃,Send po,我们现在要不叫一个呃,Send send money是send token吧,我们其实可以知道这个就相当于是一个token,对吧?好,我们VI一个这个文件,然后。
23:23
把我们这边的内容复制过来。好,现在我们这里应该就多了一个s token.js那么现在直接去node这个s token的话肯定是不成的,对吧,大家应该能够想到就是,呃,就是我们这里边的所有的东西,该有的这个web三都还没启动,所以说现在肯定是调用不成,我们先去起一下我们自己的撕链,这个大家现在操作应该都已经很熟了,对吧。我这里边跟大家说一个,哎哟,这里面是不是起的呢。
24:02
没在起,似乎我这里是在起的。呃,刚才我是做了一个这个沙进程的一个操作。好,那大家看一下,我们之前一般启动的时候都是把它直接进入到控制台了,那进入到控制台其实我们是想做操作的,但是呢,我们就必须得再打开一个这个办事窗口,大家可以看到我昨天在操作的时候,那个窗口都已经太多了,对吧,切过来切过去都手忙脚乱,所以如果说大家希望我也没打算要开控制台,我直接在外边打这个就是note的控制台去去操作就可以了,我不用开盖的控制台,那我们怎么样可以把它让它去静默启动,然后用不用占用我们一个bash窗口呢?大家可以用这种方式啊,就首先我们不要让它这个挂起,就是no hug加一个这个,然后guess,这还是同样的命令,Get Di。
25:10
然后我们启动的时候大家注意啊,Network id15杠杠RPC,然后这里我们就不要pencil so了,对吧,直接。我们把这个输出到log里边,然后后边我们可以让他直接在后台启动就可以,不要在前台挂起。所以大家大家如果熟悉这个shell操作的话,应该也知道这个这个命令啊,后面加一个这个方式,所以大家看到它启动了一个一个对进程678,我们如果用查看一下这个当前的进程的话,就是PID为678的这个进程,就是刚刚我们启动的GA的这个进程。大家可以看到,那我们现在kill一下output,我们在这里就可以看到,刚才已经提起来了,对吧,就是我们时间上再确认一下,应该就是刚才,那大家可以,呃,有些同学可能就说,那我这会儿这么起了之后,我都不知道里边发生了什么事情,我只能去看log了,那我怎么样进到里边呢?我们这样起来之后还可以进去,我们用另外一个命令叫做GA attach attach后面跟什么呢?跟的就是我们的PROVIDER8545。
26:32
大家看这样就进入到我们刚才的启动的这一个运营行,就是控制台里面,相当于又把它的控制台进入进来了。呃,这个就是多给大家介绍一个比较好用的这种这种方式,呃,那我们在里面先看一下吧,是不是我们昨天起的那个啊,我昨天开了挖矿没关啊,挖了好多了,呃,809,这这至少是我们自己已经挖出挖出块的这个链对吧,是我们自己的链,那这个没问题,在这里面大家可以随便退,不会造成大家记得之前我们的控制台如果exit退出来的话。
27:07
我们的节点相当于就关闭了,对吧,我们如果看log的话,就会发现这边就会显示是close的一个状态,那现在如果我们用attach这种金曲的话,进取输一个命令出来,其实它还是起的没有关闭,所以这个可能会更加的方便,更加的就是方便我们操作一点,但这个是属于这个进阶操作了啊,另外呢,可以看到就是我们这里还有一个除了htv andpoint,还有一个IPC的endpoint,对吧。也就是说,我们除了用HTTP的访问方式,提供一个http local host 8545这样的一个provider,也可以用IPC的访问方式,那怎么样用IPC的访问方式呢?大家应该能够想到啊,也是gas attach,那我们后面跟的是什么呢?大家看就是后边IPC的这个这样的一个URL。
28:03
所以他最后跟踪的就是我们那个ga.ipc那个文件,对吧,那个IPC的attach attach点,所以我们这里把这个路径敲一下,Home open to project my chain下面的点IPC,好,大家可以看到进来是完全一样,对吧,看一下block number还是一样。所以这就是呃,给大家讲,可以有不同的这种连接方式,我们在启动的时候默认是有IPC的方式的。大家其实可以就甚至可以想到我们在这里边提供provider的时候,甚至可以不用HTP的形式,对吧,我们可以直接用IPC的方式,但是如果我们用IPC的方式的话,大家想可能会有什么样的限制?大家看这个路径,就我们只能在本地机器上去访问了,如果你要是访问自己的远程的一台机器的话,那你还得就是加上这个远程机器,可能得用这个SSH啊,或者别的方式去去做这种连接,那IPC的话,有可能你是没办法去直接访问到这个点的,所以这是IPC这个,因为它是进程前通信嘛,默认就是在本机上啊,这是给大家多讲一点这几个。
29:25
就是IPCRPC的这种调用好,那么我们这里已经启动了这个链之后,我们这个窗口就直接来跟踪我们的log好了,那现在我们就可以去调用我们的这个。脚本对吧。Poke。好,我们转一下,诶大家看又报错了,看一下啊,诶为什么send transaction呢?我们哪里算transaction。
30:02
大家看一下他的这个报错信息。Is not a sanction,所以好像我们的这个没有没有写对是吧。我们重新检查一下。Constance。到这里的合约,其实我们是不用拗的,对吧,但大家应该记得我们昨天说的这一个指定这个API的这个地方对吧?对大家看的非常细啊,非常棒,就是指定我们合约的APIAPI,然后去创建我们一个抽象的合约对象的候,其实是不用new的,因为new这个方法的话,一般情况大家是要去,就是真正的创建实例的时候才会去new对吧?啊,这里其实是不用拗的啊好。
31:12
缓存好,这里是有问题的,这里是我们的3CO,所以我们还得把三通打开去看一下。这里有拗。好。好,我们再跑一下试试,哎,大家是不是在跑之前其实想确认一下他到底到底有多少对吧。那我们还是先attach进去看一下吧,呃,这个要看的话可能还是有点麻烦,因为要看的话我们就还得去创建合约的,呃,这个对象对吧,大家应该还记得,所以。
32:03
我们还是啊,把这个复制一下就稍微有点麻烦。好定义一个API,因为我们在GA里边的操作,其实跟我们的note里边操作其实就完全一样,诶看到就这个没有什么特殊的地方。只不过就是相当于把我们在控制台里边的每一步操作,我们把它序列化,然后把它整合在一起。好。再定义一个contract,然后我们让他艾这个。好,现在的话,我们看一下定义的contract instance,应该已经有这个东西了,对吧,这就是我们的合约对象。好,那么接下来我们大家应该记得我们的contract instance里边可以调一个方法叫balances,对吧,Balances ETH点2COUNT0,好,我们看一下,好,现在它有215万,嗯,那我们转这个,我们是给康一转的是吧?
33:14
啊,康一里面也有,他有60万,好,我们先看一下他的余额。好。那接下来我们直接发一个交易。又错了啊,诶大家这个错就就想起来了,对吧,这个错这个又是我们又是需要这个password啊,这个确实还是有点麻烦啊好,我们。Personal。点unlock account。单说我们应该解锁哪个账户,对解锁零,为什么解锁零,是因为我们是从零给出给给一转币吗?这里我们给零主要是因为我们这里写的交易的发起方from是是我们这里的COS0,对吧,大家明确一下,这个好胖。
34:14
好,这里处我们继续调用一下,看一下,诶这里生成了一个交易卡西,说明我们这个转账应该是已经生效了,对吧,那这这里大家肯定就会想到我这里查这个,诶一看没变呢,为什么。对,没挖矿这个确实还是烦大家,如果要是自己启动的是一个我们的第一的这个这个节点的话,那肯定就可以直接就可以挖出来了,对吧?哦,在这里就是还会比较麻烦的一点,就是我们如果不不看着log的话,还有点不清楚他现在到底到多少了,我们一开始是814吗。809哦,所以现在都已经挖出来了是吧?好,那我们就先把它停掉,现在我们再来确认一下他们俩的余额,大家可以看到balance里边和COUNT1哦,多了5万,因为我们是写死的给5万对吧,那个COS0呢。
35:19
哦,原先是215万,现在少了5万,所以没问题,我们这个转账已经成功了,所以这就是我们这个用合约调用合约里边的转币这样一个方法。
我来说两句