00:00
首先我们现在这个转币是写死的,大家可以像我们昨天给人发以太那样,直接把它变成那个,就是不要写死在里边,用这个一开始传入参数的方式去给别人发笔,可以这样对吧?呃,大家昨天可能我们没时间没来及跟大家说这个写出来的那一段代码是什么意思,大家还记得我们昨天是怎么做的吗?我们是定义了一个argument,让它等于process点阿v.SLICE2大这句话是什么意思?截取对,Sle是那个,就是要截取后面一部分对吧?从哪个呃,一个数组截取数组的方法,从哪个元素开始截取后面的部分,那前面这个是什么意思呢?顾名思义这个其实这是一个note里面关键字process,其实就是当前进程,那大家应该能够想到,其实就是我们执行的时候传递进去的所有的这个进程上面的所有的参数。
01:15
那它会把当前的这个所有的AV指的就是所有参数构成的一个序列构成的一个向量。那对于我们来讲就相当于是一个数组了,所以我们在外面去打node s point.js,然后后面跟上一个地址,跟上一个数量,这个对于我们的process.av来讲,其实是有四个元素的,第一个是note,第二个是我们的脚本名称,第三个才是地址和后面我们的数量,所以我们在这里arguments就是把我们前面的截掉,然后直接从二开始选取0123嘛,所以从第二个所谓的就是编号是二的,也就是第三个元素开始截取,我们把后面自己传入的东西拿出来,那之后的处理呢,就比较就是我们为了安全性的考虑,可能判断一下,如果说这个arguments就没有拿到,或者说。
02:15
他给我的长度不等于二的话,我们就会认为它有问题,我们就不能继续进行了。我们consult.log一个错误。呃,我们就叫perter。Parameter that must be,就相当于我们必须要两个两个两两个变量对吧,两个参数。他说米特是不是写错了这样啊,然后这就是一个最基本的一个,就是输入参数检查的一个过程,呃,那我们在后边就可以把这个from,我们就不要变了啊。
03:08
From可以写死,当然大家如果想加的话,也可以再加一个参数吧,From也去指定,就相当于我们可以任意指定呃,从哪个地址到哪个地址的转账,那这里的话我们就把to叫成arguments的零,那同样amount就叫做argument的一,好这样的话我们就实现了从外边来传入,通过传入参数的方式指定给谁转,转多少。呃,大家肯定还记,呃,就是我们昨天在做的时候呢,每一次转账的时候,包括刚才在转账的时候,每一次调用都会遇到一个错误提醒我们在外面再试一下,大家很熟悉对吧?就每次上来之后都要说你需要去unlock,大家肯定就想到了这个,我也每次都是到这里边去输一个personal.unlock来解锁的,对吧,我能不能在这里面写死。
04:10
哎,那我们就来试一试啊。答案当然是可以的,因为它本身也仅仅是我们,呃,作为这个盖客户端来讲,它仅仅是一个命令而已,它既然是命令,那其实就是调用了我们以太坊开放出来的接口,发送了RPC3RPC的命令,那只要是这种模式,其实我们在脚本里边做跟在盖客户端做其实没有任何的区别,对吧?盖客户端可以做,我们这里也可以做,只不过我们这里做的时候可能就没有办法说直接让他有一个交互性的提示说输入密码。呃,这个我们要还要想做成交互式的话,可能就稍微麻烦一点,我们在这里就还得有那个交互的提醒和界面,那个我们先不做,我们就直接一条命令把它解锁,但我们知道在guess客户端里边,如果我们想直接解锁的话,我们平常如果要personal.unlock count什么参数都不给的时候,诶。
05:16
什么参数都不给肯定不行啊,我们至少要告诉他我们要解锁十对吧?personal.unlock account p account,零。我们如果不给别的参数的时候,他会提醒我们去输入密码,那大家就想到,如果说我们后边是不是可以直接给他提供一个密码,对提,如果我们后边直接提供密码的时候,他其实就会直接去解锁,当然我这里是提供错了,大家记得我是123456,所以我们在这里试一下是不是可以用这样的方式。去做一做我们想要做的这个解锁账户的事情呢?好,那我们在WEB3里边同样有personal这个对象,我们先在这个就是note里边来看一下吧,大家如果已经忘记的话,我快速的把这个先敲上啊,快。
06:22
WEB3,然后好,大家看我就直接不写Y了,这个是JS里面是允许这样的,对吧,直接不声明变量直接用,相当于是一个全局变量,呃636PROVIDERs.http provider这个可能大家会写习惯了之后就觉得这个很很烦啊,所以大家可以看到我们的这个脚本化自动化其实还是有必要的,对吧。
07:02
哎,哪里又错了。Providers经常出这个问题三我们现在来看一下,看看它有哪些对象,我们昨天主要给大家讲的是它的这个,就是一些工具类,还有就是ETH,还有这个点net,对吧,所以大家可以看这里边它本身就是有personal。DA。Unlock靠,所以然它本来就有这个方法,好,那我们既然有这个方法,我们就在这儿先试一下吧,我们不是说脚本,其实就是这里命令的一个一个提炼一个整合嘛,那所以我们是不是在这里直接解锁就可以解锁掉呢?其实大家如果要是有印象的话,我们昨天就试过这件事情,对吧?大家还记得我们能解锁成功吗?我就直接先这么说一下试试看,哎,报错。
08:02
Method personal unlock account does not exist或者is not available,这是什么意思?说明这里它的这个personal_unlock count,这其实大家应该有印象,这种格式就是我们做JRPC调用的时候发送的那个方法名称,对吧?Method的那个字段填的就是这样的形式。那这样的东西它为什么说不存在呢,不可用呢?大家可能会想,诶,是不是我们直接给上密码,他就他就好了,但其实肯定不可能,对吧,因为他说的是这个命令,就不存在我们这么说他还报一样的错。这个原因在于昨天我们遇到这个问题,因为不影响我们昨天的课,所以我就直接跳过去了,没有跟大家说遇到这样的问题我们怎么去处理呢?它是说明就是对于WEB3而言,Personal和ETH其实是不同的模块。那不同的模块在我们最初去指定的时候,对是否提供这个模块的API,是否提供它这个对应接口的命令是需要我们去指定的,ETH是我们启动的时候默认就有的,所以我们从来没有做过这件事情,但是personal你如果想用的话,WE3就认为啊,或者是我们这边的节点就会认为不好意思,我没有开放这个接口给你,你不能随便用personal这么危险的涉及到账户安全的东西来操作,所以大家注意啊,这里我们就要在这个控制台这里把它出去,那当然我们这里是用这个。
09:41
就是静默的方式去启动的,所以我们退出来他还没有停,我们直接就把它Q掉啊678对吧,好,我们确认一下它干掉了,好,那现在我们就重新来启动一下,我们还是用同样这种静默启动的方式,No Hu guess杠杠data DR点杠杠前面都一样,对吧,Network id15。
10:13
杠杠RPC这里大家注意盖启动的时候还有另外一个参数,叫做杠杠rpca API,这是我们提供的对于RPC而言可用的API,那么它里边可以给什么呢?就给像e PH personal这样的东西,给一个字符串逗号隔开就可以了,就表明我们想要开启的API,但是它还有别的net,呃,包括这个DB,包括admin这些是都可以给的,当然我们一般情况为了安全考虑,它默认能够提供的就是ETH net DB这些是它是可以去DB好像也不能啊,就ETH net这是肯定可以的,默认就开启的,但是personal admin这些一定是需要去手动指定,然后打开这些API功能啊,我们这里用到的没没。
11:13
这么多啊,我们就把personal打开看一下效果就可以了,好,然后2OUTPUT,呃,Log,然后我们让它在后台启动,好,现在这个已经起起来了,我们get attach一下,呃,我就用HTP的方式吧,Local host8545。好,我们现在在这里进来,然后我们在这里去调一下试试啊,现在这个方式已经是有了personal这个,呃,这里启用了personal API,所以我们这里边应该可以调这个命令了,对吧,我们预期是这样的,现在看一下。鼠标没过来吗?
12:05
哎,所以大家可以看这里。哎,他是返回了一个好来,他说的是无法用这个key去,就无法用给定的这个pass phrase给定的这个密码去加解锁我们的key,这就说明我们不能直接用交互式的那种方式去做了,对吧,所以我们只有在这里直接给定。把密码输进去。大家可以看到这里会返回出,所以这个时候就代表我们在我们的noe命令行里边完成了这一项,就是解锁的任务,那大家肯定就想到,既然我们能在noe命令行里面解锁,那我们就能在脚本里面解锁,对吧?所以它是完全一样的,好,我们所以它的问题不在于我们的这个命令输错了,而在于这边我们要开启对应的这个API的功能,所以大家这个注意一下,就我记得一开始讲这个GA的时候,很多同学好像就就说这个GA好像就是什么什么用都没有啊,好像对吧,就是一条启动命令,很简单,但是其实大家如果自己去敲guest help的时候,刚刚help的时候就会发现它有很多很多可以配置的选项,它能够实现的功能其实很庞大。
13:27
呃,咱们现在接触到的其实也只是冰山一角,但是我们日常用的就是这些啊,用到什么咱们再去查,再去再去找就可以了,好,那接下来我们怎么样用呢?WEB3点点,Onlock account。然后传入我们要解锁哪个啊,我们这里就不用直接写是哪个,我们直接写from就可以对吧,因为我们前面已经定义了from,然后我们后边要操作的这个肯定就是从from这个地址去发送交易,所以我们要发送交易的那个账户就是我们要解锁的账户,所以我们直接就传这个from。
14:12
然后后边呃,这里我们就直接写死了啊,啊,大家如果大家可以看到这种方式,其实为什么不提倡,就是这种不安全,我们把密码直接就写死在这个脚本里面,别人一获取到你这个脚本内容,什么都明明白白的了,当然如果大家要是就是还想这个有一些别的交互方式的话,那我们可以就是说,比如说我再有一个就是直接控制台输入的一个界面,对吧,然后再读入当前的输入,再去存这个密码,然后存成变量之后在这里去用,这当然是更安全的方式啊,大家可以就是想要安全性的实现,自己再去完善,我们这里是只讲功能,不讲这种安全性的应用,好,那么我们把这一个传进去之后,大家就会发现,其实我们就已经实现了这个账户的解锁,接下来如果再去调这个就可以了,那其实如果我们这么去做的话,大家可能就会发现它其实也有问题。
15:12
就是说我们这里的解锁,假如解锁失败的话,呃,那还比较,呃,就是假如解锁成功的话,那是比较正常,我们直接就执行下面的这一个语句,对吧,那如果要是解锁失败了呢。就是我们好歹应该还是要处理一下的,对吧,所以最正常的这个顺序的话,那大家应该在这里边还是养成好习惯,就加一个回调,就像这样的东西,我们还是加一个回调处理一下会比较好。所以如果要是error的话,我们就cons.log当然大家看到就是本身WEB3的这个它的模块通用的这种错误处理还是比较好的,因为我们遇到错的时候它都能直接弹出来啊,这个相对还比较好,但是我们在自己的脚本里边可能就会有问题,大家如果不把它打印出来的话,有可能我们不知道它这个出出错出在哪儿了,我们还是把它打印出来啊,然后else这里。
16:26
就多说一下,那其实我们可以看到,如果我们上边用到了回调函数的话,那么上边的执行就已经不是一个同步的调用了,对吧?那如果上面我们else直接也是打一个result的话,大家觉得我们这个脚本就会有什么问题。报错会报错是吧,他有可能会出现,我们既然是上面和下面都是异步调用,那是不是我在调了这个解锁账户之后,我可能先不等就不等它解锁返回是否成功,我下边就直接发了。
17:12
是不是有可能这样?我们现在本地测试可能没什么问题,因为我们这个解锁的很快对吧,几乎是瞬间就就返回这个结果的,所以有可能大家觉得诶好像也没什么问题啊,但是同步异步的问题一定要注意,这里我们他们俩其实是有执行顺序的。对,如果说我们这里要去处理的话,我们其实就应该用promise的方式去用点赞去处理,那或者0.20.1里边没有提供点赞的方式,那我们应该把下面的这一部分全部放到它的回调里面去,对吧?所以else,这里我们去把这一部分内容全部copy过来,当然这就涉及到我们。
18:00
大家可能就是也比较熟悉的一个一个让大家搞这个前端应用或者前端开发的时候,很痛苦的一个就是很容易出现回调地域对吧,就是一重一重的回调,一重一重的回调,因为他们互相之间是有这个先后关系,顺序关系的,所以大家就看到这也就是为什么1.0会把它改成promise的链式调用,那那个就方便多了,大家可以想到,假如说我们这里写的是一个1.0版本的一个脚本的话,那我们可能就是WEB3点personal.unlock account,然后我们这里前面的参数不说之后我们就直接点赞,对吧,然后在里边去处理我们下面这个函数就可以了。所以这个就看起来就会就会就是平易近人,更平易近人一些,更好理解一些,代码可读性更好,我们现在只有两重,大家一个回调,这个可能还看起来没什么问题,你在外面这个unlock嘛,然后错误处理,然后去就是instance send调用这个方法,但是如果要是后面更多呢,你send完了之后,我们还有一个请求呢,对吧,还要再去做个查询呢,查询完了之后还要再去发一笔呢,那就那这个业务逻辑我们可能就已经是不可读了,完全不可读了,回调地域,呃,所以这里边我们没有用这个1.0的这种模式,所以它的返回还就就必须是用回调的方式,它的返回还不是一个promise,所以说我们这里就就还是用这种方式来实现,好,那给大家扩充了这一部分之后,大家可以再来实现一下,我们看这里我已经做了这件事情,那我们其实是可以退出来。
19:48
看一下了对吧,退出来,我直接去散的头,我直接这么去发,大家说这个会不会报错,大家看一下,诶直接报错了。
20:03
诶,这里报的错,还是这个password。Onlo是吧,他的这个好,我这里改的是我这里的三,所以这个就比较他这个看不到我的那个文件,确实是比较难受,我们还得改两个地方,那把都删了吧。怎么会这样?好好保存之后我们弄的token,所以大家看直接就会报错,因为我们后面没跟参数对吧?对我们有了这个错误处理之后,就会稍微靠谱那么一点点,我们这里看一下eth.com是什么吧,那我们two就给第三个转一笔吧。
21:08
好,转一个6万,我们在这里还是来看一下,就是我这里的instance不知道还有没有啊,这里已经没有定义了,所以我们刚才已经是退出重启的意思,对吧,所以这个就会比较麻烦一点,我们还是把这个重新定义一下abi。然后contract,然后dress,然后我们这个地方。instance.address哎,我们看现在好像还没有哦,有了点address现在是有的,所以我们现在可以调用它的查询balance方法。
22:13
看看哎,他中间为什么会隔这么远啊,比较诡异,呃,现在他的balance是215万,然后我们的这个ACCOUNT2里边是20万,好,我们现在要转6万试试啊。诶,直接生成一个哈希,没有提示我们再输入输入密码对吧,所以我们刚才那个unlock生效好再回过来啊,现在大家肯定想到肯定不行,因为我这里不是DV模式,所以还得先挖矿。Minor not,这个是因为我在外面没有定义啊,这个这个就比较尴尬了啊,我进来之后可能还得再重新弄,但是这个大家就可以自己去校验了,对吧?我在这里不要浪费大家太多的时间,因为大家想到minor本来是我们那个API,本身是要提供的一个东西,大家注意我刚才启动的时候没有提供V对吧,所以它在里边就禁用了这个V的这个操作。
23:22
呃,所以呃,这些东西都是大家可以一点一点去总结去做的啊。
我来说两句