00:00
我们把刚才这个先改了啊,B的in点对吧。嗯,这个为什么变大写,这里也改过来的,In点好,呃,然后大家会发现我们上节课讲到这儿的时候,应该还有一个函数还没实现呢,对吧,大家会发现这里还有一个地方报错呢,String to in,我们要写这么一个函数,我们先把这个实现一下。这个是函数这里定义的吧。好,我们跟在后面写啊,Function string to,那这个输入就应该输入一个,输入一个string对不对,好,就输入一个string s,那大家会想到这是一个public类型啊,这这不应该是public,我们不应该在外面调对吧?那这个其实是可以是internal或者private,我们直接定义成private好了,好,它是private类型,而且大家发现这就是一个字符串转这个unit对吧?那是不是根本不改变我们的状态变量啊,对,确定的输入就有确定的输出,这其实是一个Q纯函数对不对,对的,所以大家搞清楚它的这个呃,函数类型,好,那么接下来我们returns,它肯定要return一个。
01:39
他应该要return一个string to吧,好啊,那我们现在看一下这个应该怎么去处理呢?那大家就会想到啊,这样的一个S是一个string,我们首先是不是应该把它变成字节啊,按字节去保存对吧。
02:05
呃,然后每一个字节就对应的啊,01234这样的一个数字字符对不对,然后我们可以它在字节里面保存的时候,一个数字在在这个一个字节里面保存的时候,它应该是什么样的形式呢?应该是阿嘛,对不对。呃,大家应该有这个概念对吧,如果要是以前学过这个类似的这种,呃,就像C语言里边的,呃,IOTA或者是AOTA对吧,这样的函数,大家应该有这个有有这个印象啊,所以我们这里就是简单给大家实现一下这个相当于工具词句函数一样的一个东西。所以我们首先。把这个我们先定义一个by memory类型对吧?这个我们不需要去storage,那就写到我们状态变量,就是存储空间去了一个memory类型的BYS,那我们就定义一个BY啊,就这个不要关键词啊,我们就定义一个B好了,然后它等于什么呢?我们把S做一个强制类型转换。
03:18
把它转换成数字符数组对吧?都转换成字节数组,所以这样的话就S整个这个就变成了一个一个数字作为一个字节,一个字节的存储,那么它对应的存储形式是什么呢?二进制是什么呢?就是它的S,好呃,那么我们接下来。肯定就是要遍历这一个字节数组了,对不对,对吧,B里边的所有的数组就进行遍历啊u unit特I等于零,我们就是一位一位把它解析出来对不对?每一位的数字都把它解析出来,I小于b.length。
04:04
嗨,佳佳对吧。好,那么我们这里就首先判断一下它是不是数字对不对,所以我们首先要看BI它的范围,呃,数字的范围,阿斯玛的范围是什么呢?它应该是大于等于,看一下啊,是47还是48来着。48 48是零,57是九,对吧,这是,呃,大家应该对阿斯克玛还是很熟的吧。呃,大家不熟的话,自己去查一下码,我们看现在网络给力不给力,给力的话给大家看一眼,这随便找一个大家应该就能看得到啊。随便点一个看看。好,大家可以看到,这就是我们所所说的阿斯玛对不对啊,如果要是这里,大家看,如果要去显示数字的话,零对应的16进制是48对吧,然后九对应的16进制是。
05:10
五啊啊,这十进制我说错了啊,对应的十进制数字是57,那如果是它最终的这个字节里边的存储形式是什么呢?就00111001,也就是16进制的三九对吧?在大家把这个搞清楚就可以,所以是48~57的这个范围是我们的数字对吧?好,所以它应该大于等于48,而且小于等于57,那只要在这个范围内,那就应该是是我们的数字对吧?好,那么啊,这个时候我们是不是应该得得。定义一个变量去保存一下这个值,对吧?定义一个result吧,Result初始的时候等于零,我们不是要转换成把一个string转换成一个U吗?那这个时候肯定就是要有一个U的值来保存最终的这个状态,对吧?到底转换出来是什么?好,那么我们就会发现这里的BI,我们就可以让result把它给到result了,对吧?大家要注意啊,这里怎么算呢?之前的result。
06:25
我们这里是一位一位的,看这个数这个字符串的对吧,假如是1233个字符的一个数字符串的话,我们先读进来的应该是一对吧。然后读进来的是二,读进来二的时候,一是不是应该得乘以十啊,之前的一就变成高位了,对吧,就得往就相当于对于十进制来讲得得乘以十,所以大家注意看这里的写法啊,Result乘以十。之前我们的结果乘以十,然后再加上我们新加进来的这个数字,对不对,那新加进来的这个数字本来它是BI,那我们把它强制类型转换成U,那么这个时候是不是就是它的阿斯托马值的那个十进制啊?
07:17
对吧,然后我们它具体代表的数字是不是得减去零代表的那个48。大家想一下这个过程啊,这个过程应该没问题吧,大家想一下,我们把后面这一部分还是括起来吧,为什么要单独讲这一部分呢?因为这一部分其实是一个经典的算法。大家之后对吧,之后如果要去面试的时候,其实很容易被人要求说来你写一个字符串转换成数字,转换成整形的一个一个一个函数,那那这个怎么写呢?大家熟练熟练可以写。这个其实是常见的一个面试题啊,好,那大家可以看到这个过程当中啊,当然这个还没完,就是我们一遍一遍的把每一位都加到这个result上来,最后我们是不是要把这个result还得返回啊,要不然就白加了对吧?Result,好这样就实现了这个从字符串转换成整形变量的一个过程。
08:21
啊,再跟大家再顺一遍,大家可能这里还有warning啊,看一下assignment operator must have exactly single place,还是说需要有是吧,那应该是这里了,对吧。对,果然他这个要求太严格了啊,他居然要求这里还得空格,空一个格好吧,呃,这个其实没关系,不影响我们编译的,对吧?呃,我们再跟大家梳理一下这个这个过程,这个过程它是怎么算的呢?首先我们把这个string类型的S转换成了一个字字节数组。
09:09
那大家就会想到,假如说我们这里是一个123这样的一个字符串的话,就会发现现在是不是就变成了一个,它是一个代词,对吧?那。是不是就成了B0?变成了一,那大家能想到就是123这样一个存储的话,它肯定就是B0变成一,B1变成二,B2变成三,对吧?对于B这个字节数组是不是就是这样的一个存储,所以我们在下边要转换它的时候,是不是就一个一个的读入这个123这三个数啊。读到最高位的时候,首先我们看I等于零的时候,等于零的时候,B0是一对吧,那我们就当,呃,目前这个result result还是零对吧?零乘以十,那不管还是零,那我们其实就是把B0里面的这个一要转换成数字一,对不对,那么这里边存储的这个它是按字节来存储的话,对这个一它存储的是阿斯码,阿斯码是多少呢?对,大家看到这里是四九对不对?所以我们就把它做一个U的强制类型转换。
10:31
强制数据类型转换转成49。整形49减48是不是就是一。所以现在的result就是一对不对,然后第一位读完了,反过来for循环,下一位是不是二了。拿到这个二之后,我们发现现在的result是一对吧?对,那二是它后面一位,我们是不是要把一乘以十。变成十,然后再加上二,本身的阿斯格玛是50对吧,50强身型转换之后减48是二,所以加起来就是12对不对。
11:09
所以这里的一、二前两位就转成了12,保存到result里边,同样第三位三再来的时候,我们把12乘以十变成123,对应的阿玛是51减48是三,加起来123,那就把这样的一、二、三三个字符就转成了我们的数字123,对吧?好,大家再再理解一下这个过程啊,好,我们也只是因为我们不是专门讲这个算法,所以说就是提到这里的时候以后可能对大家有用,我们就专门的把这展开讲一讲,好我们这个就相当于把前面的这一部分完整的都做完了,对吧?嗯,那大家看到就是我们有这个报价,然后有揭示报价,这个过程当中还用到了这样的一个工具函数,大家把这个基础的知识还是要打的扎实一些,好那除了这部分内容呢,接下来大家会发现我们还应该有一些,呃,这里这个教案里边也说了,对吧?我们还应该有一些get,是不是就是还应该有一些给我们的页面提供信息的一些函数,对吧?就是查询的函数,我们需要查询什么函信息呢?我们肯定需要查询。
12:27
呃,当前最高报价人的这个信息,那可能我们就涉及到他的他的地址到底是谁,然后涉及到他的高最高的这个报价是多少,然后还有一个second highest speed也得反馈,为什么呢?这是当前它实际应该要付的价格,对吧?所以这些可能都是大家关心的都应该返回的内容,另外就是当前的total币子这个也应该返回,对吧?当前有多少人去竞价啊,这这大家能想到都是一些常规的一些返回的数值,我们在网页上一定是有用的。
13:03
好,那接下来我们把这两个函数一起敲一下,首先function,大家想到有一个叫highest,叫什么来着?Highest bitter INF对吧?Highest bitter INF,这个如果要传传这个值的话,大家传参传什么?呃,对,就是根据一个产品对吧,这个产品当前的最高竞价人是谁?所以我们穿一个product ID,好,那接下来这是一个public类,Public类型,然后大家会想到他是不是不改,我们的状态是查对吧?所以是一个view类型,好,那接下来既然是查的话,这一定是要有返回值的,那我们返回什么样的东西呢?前面我们想到了要这个最高报价人的地址,然后还有他最高报价的那个数,对吧,最高报价还有第二高报价对不对?好,我们把这几个都返回。
14:07
好,那么同样的状态大家就能想到了,我们现在是不是根据这个product ID先得把那个对应的那个产品信息先拿出来啊,又来了,对吧,那这里应该是storage还是memory?对不改光查那memory就可以了,对吧?Memory product等于大家还记得吗?Stores对吧?又来了,又又是一大串,然后product ID in store对吧?然后这里在product ID把它传进去。啊,这个对应的是里边这个对应的是他的那个商家地址,对吧,我们先把这个先拿出来,然后stores里边商家地址对应的这个mapping呢,又是他上架的所有产品的信息,我们再根据他的产品ID再把它拿出来,好这就是对应的这个产品。
15:08
已经写了好几遍了,大家应该也比较熟了,对吧,那接下来我们就直接return就好了,对不对?Return它的三个属性什么东西呢?Product点呃,我们当时是叫什么叫叫highest v对吧?Highest v这是一个地址给他返回,然后product.highest feed就是最高竞价,然后product。点second highest b啊这三个数返回我们这个简单的查询就完成了对吧?好,那同样的还有一个方式叫做叫什么来着啊,偷币子对吧?就是查询当前有多少人竞价,那大家会想到同样的是不是也是针对一个产品来查的,所以还是product ID对吧?大家就会发现这个就完全类似,我们就快速敲一遍就可以了,Returns这个是不是直接返回一个unit就可以了,所以同样它也是view对吧?Public view类型啊,最后返回一个unit,那大家会发现这个处理是完全类似的啊,Memory类型,然后定义一个product从哪里去拿呢?从stores里边对应的商家那里去拿对吧?那商家怎么查,就是product ID store这是一个。
16:38
ID到商家地址的一个mapping,我们通过这个拿出商家地址这一部分商家地址,然后stores里边它又是一个商家地址到产品的一个mapping,所以我们根据这个商家地址拿出来的就是它的一组产品,那里边的某一个,那肯定我们又要把这个product ID传进去,就完全一样的这种处理啊,那return这个大家当然知道了,就是product.total b对吧,那这个就非常简单,好,那么到此为止,我们就已经把这一部分竞价和揭示报价,以及之后的这种查询我们都已经完成了,这相当于已经是我们的核心业务逻辑,已经在我们的合约里边实现了,大家可以看到,写到这儿为止也就100来行的一个合约,对吧,其实也并不大,但是里边它复杂,复杂在一些数据结构的定义。还有。
17:38
一些这些复杂逻辑的处理,对吧?大家一定要把这些东西搞清楚,因为它本身的代码还是比较精简的,大家看到没有太多废话,也没有太多就是多余的冗余变量定义对吧?呃,包括大家看到这里赋值的时候,都是能不用增加别的变量就就不增加,都直接就在这里就给出来了,所以这个过程大家还是要理清楚这个逻辑的。好我们现在既然已经做完了,那接下来我们来大家是要先敲一下这个代码吗?还是我们直接先看控制台交互吧。
18:14
大家感觉是是不是想先捋一下这个流程。就先交互行,那我们先交互吧,就全做完了之后,接下来可能给大家一个小时时间,大家自己就就完完全就自己动手做对吧,省得我一遍一遍打,打断大家的这个状态,好,那么我们这里还是同样的这个动作,对吧?Comp先去编译一下啊,他这个不要又出现不能编译的状态啊。还是不行啊哦,这个确实是有问题。所以每次发现他不能编译的时候,我会跑到这个里边来,稍微对他做一点改动。然后似乎他就能认得我这一次的修改了,好,现在再编译了,我看一下应该不会有。
19:08
好,这个主要是报煞三的这个问题对吧?还是说这个最好是用,呃,CA256,那这个我们现在先不管啊,因为我们就是要保持简单的这个杀三两边一致嘛,呃,我们看到WE3那边简单的提供了一个杀三方法,所以我们用这个比较方便,大家如果想要去把这些warning都去掉的话,呃,就是像这个沙三,它不是说这已经deprecated,就是已经要废弃了嘛,所以大家如果要是为了自己之后的这个考虑的话,大家就把它改用这个,呃,CASH256对吧?好,那么接下来我们就还是把它做一个,呃,我的这个迁移,迁移的话,其实我们可以杠杠reet,他就不需要考虑太多了,对吧?
20:01
我们在这里看一下啊。嗯,相对来讲还是时间有点长,大家如果要是嫌这个GA纳GALA其实已经比较快了,如果大家还想更快一点的话,那应该是差develop会更快一点,因为它就完全内嵌在里面嘛,这个交互都不需要再去通信,好,那么我们现在都已经把这个重新部署好了,部署好了之后呢,我们现在就启动travel pencil。进到里边来,我们去做一些简单的交互,对吧。好,同样在现在的这个travel pencil pencil里面,呃,大家会记得我们一开始是为了方便这个敲一些这个变量,所以说我们一开始就先做了定义的,对吧?比方说我们定义过一个AMOUNT1把它叫做web3.1TH点啊,搞错了啊,WEB3点兔尾对吧,一以态,好,这是我们定义的这个就是一个以态的这个数量,然后大家还记得我们当时定义过一个current time,对吧,Current time是就要用到这个,那大家还记得当时怎么写的吧?对,四舍五入对吧?然后你用一个data还要除1000,因为它是一个毫秒,我们要的是一个秒,对吧,这个时间戳拿到现在的时间戳,呃,拿到这些之后,那我们是不是要想测试。
21:42
还我这是重新部署了,所以还得重新去把我们的那个产品先建立一下,对吧,啊这个e commerce store deploy的点赞,拿到这个合约实力,我们就可以直接调用爱叫什么来着,Product对吧,叫什么来着。
22:10
ADD to store。那里边这个参数就就会比较复杂了,对吧,这等一下我直接从那边去copy吧,好,我们直接到课件里面来copy一下。这个控制台交互对吧。好在这儿啊。这个数据太长,这个要是一个一个线敲就太烦了。好,我们大家看到现在已经可以拿到它了,对吧,然后我们可以直接去查一下。大家还记得当时我们还定义了一个叫get product的一个函数,对不对,那后面跟着的是不是就应该是它的产品编号啊,这就是刚才我们上传的这个IPHONE6对吧?啊,那如果要是大家还想查别的的话,二那现在是没有的,全是空的对吧?好,那接下来我们真正要测的其实是就是B的这个定价的这个过程,对吧。
23:23
那这个过程呢,大家会注意,我们其实是需要把定价的这一个字符串先把它做哈希计算算出来的,那这个过程大家看到这里给的例子是用这个JSUQ这个包里边的杀三方法,我们如果想泛懒的话,我觉得直接用WEB3的沙S也是可以的,因为我目前看应该是没有什么区别,好那么呃,大家可以看这个两个以态它怎么表达啊,就直接这么乘就完了,所以这是一个大家就是测试的时候可以取巧的一个办法。好那么我们这里就来定义一下这个,就像它一样定义吧,S它叫的对吧的等于。
24:10
呃,我们这里就直接用WEB3点S3对吧?呃,然后里边我们就可以直接把这个比方说我们还是给两个以态。二乘以AMOUNT1,然后我们加上一个字符串,那比如说它这里边SECRET1对吧,我们加一个,这就当当等于是我们的密码了,大家可以看一下这个等于多少啊,这个算出来是这么一串哈希。这就是我们的这个加密的信息,好,那接下来呃,我们还是这个,按他的这个要求,我们其实是应该有两个人去。去做这样的竞价的,对吧?啊,这个过程还是稍微复杂一点,好吧,我们看一下吧,呃,首先这个里边我们。
25:06
所以我们这里可能要用到这个两个账户,一个Eth.ACCOUNTS0,一个ETH点一对吧,呃,然后我们这里可以先先来查一下WEB3点。ETh.get balance,呃,抗零,我们先看一下它有多少啊,这个大家可以看到还是比较多的啊。From对吧,这个确实是平常想看的时候还是比较麻烦,这个图好我们看一下99点多以态,这是我们的零对吧,然后我们看一下一一里边是100个仪态,好我们现在知道了,那。
26:07
现在我们已经定义了一串这个数字,那是不是现在我们就应该去做一个做一个竞价对吧?好,那么我们现在。呃呃,那我们竞价的时候可以直接调用这个方法了,对吧,Deploy的点the,哎,我们竞价的方法叫什么忘记了是吧?对,我们应该就叫B对吧?对,然后他给的参数是product ID和这个我们加密之后的那个就是哈希对吧?所以我们这里其实就是BD,然后给什么呢?ID,我们现在只有一个产品,ID应该是一对吧。然后我们是不是就可以给这个SBI对吧,把这个纯进来啊,就可以去做这样的一个竞价,那竞价的这个过程当中,大家会发现我们是不是还应该传一些别的东西呢。
27:14
对,我们是不是还得把这个以太的余额传进去,就是要发送的以太要传进去啊对,那大家就会想到我们还有一个from对吧,From谁呢?我们这里先from web3点Eth.ACCOUNT0。然后还会有一个value对吧。呃,Value,我们这里给几个以态呢?大家会发现我们这里的进价是两个以态对吧?那我这里给我可以给一个不一样的,比方说我给三个以态,这是可以的,对吧,那我就三乘以AMOUNT1好,这样的话我就完成了这一次竞价,对吧?那之后我们可以点赞把它pencil点打印出来。
28:02
看一下没有返回,诶大家看到这里边直接re了对吧。诶,那大家说这个为什么会rewards呢。呃,但是我们这里其实即使是也应该拿到它的返回的,对吧,我们看一下。爱点的。o.log这应该没有问题,对吧,你看一下这个这里是怎么样去竞价的B的。b.then。啊,它这里是直接是COS1对吧,但这个其实应该是一样的,我们其实没有什么区别对吧?呃,这个过程当中。
29:02
呃,都是在reward,但是我们拿不到这个他返回的消息的话,这个确实是会比较难以判定一些,大家猜这个有可能是什么问题。这里。Revert,其实一般情况来讲,都是我们在发送交易的时候。出了问题,或者是交易执行过程当中,合约代码执行过程当中,我们的判定条件不满足的时候,有可能会出现问题,对吧?所以我们这里大家可以回过头来看一眼啊,就是我们对大家会想到这里我们其实是有各种各样的require条件的,对吧。那大家会想到我们一开始的条件,是不是就要求它要大于等于start time,还要小于等于end time啊?所以这个an time我们看看啊,因为当时我是直接copy过来的,这里an time给的是多少200秒,哦对,这里直接加200,那两百秒其实也就三分钟对吧,那三分钟我们刚才磨蹭半天应该是过了,所以现在这个就就无效了,对吧,所以就竞价成功不了了,好,那么我们现在就把上面再重新改一下了,哎呀,这个就有点麻烦了。
30:27
对,我们还得重新去去给这个对吧,Current time重新来定义一下,好,这是current time对吧?然后我们定义这个的时候就还是200秒吧,现在我们直接复制这个上面命令应该快对吧,2000的话,那我们等这个揭示报价就会比较久啊,那也可以吧,我们就2000吧,那就等下节课再解释报价对吧?好,那这个会比较比较保险对吧?好,那么我们把这个完成了之后。
31:04
另外还有这个,这个应该是一样的,对吧,我们还把这个拿到,然后我们就可以去B的了,呃,现在我们给一个这个你看一下。诶,这里还是了是吧,IDIDID12对吧,非常好。对,因为刚才我们又提交了一个对吧,所以ID12好,现在我们拿到这个正常的返回了,所以大家可以看到就是呃。这个相当于我们已经正常的提交了一次竞价,对吧?好,那根据我们这个竞价的要求的话,那可能我们还得再提一个是不是,那我们比方说还有第二个人啊,我们给他的竞价是三个三个以太。然后我们定义一个SECRET2,那这个是现在它的这个字符串对吧?好,那么我们B的时候还是B的二对吧。
32:08
呃,然后这个得换一个count了,对不对,我们用ACCOUNTS1来去做第二次竞价,模拟另外一个用户对吧?然后VALUE6这里单说给多少吧,还是三,还是说我们给大点给个五,呃三吧,六三是吧?哦,行,那大家等一下自己测的时候可以多给几种情况对吧?我这里测的可能比较简单,好那么我们再去竞价一个,诶好又得到返回了,所以现在竞价其实我们就都已经做完了,对吧,那竞价的时候,竞价完了之后,我们再去看一下他们余额还有多少吧。这是一的对吧。诶变96.99了,因为它是发送了三个以态对不对,然后还带上盖,所以比比97稍微小一点,很符合我们的这个预期,对吧,那大家说零呢,零它进价不是两个以态吗?是不是它应该是97点多。
33:12
我们看一下哎,他也是96点多,而且小的好像还更多呢啊,他之前发过,他本来是99点多对吧?哎,但是那那他如果是发两个的话,99点多不也应该是97点多吗。但大家还记得当时他发的是多少,我我们看一下啊,看一下这上面是刚提交的这个交易对吧?康ACCOUNT0的提交的这个交易,它是这里定义的是对,大家注意啊,这里的value才是它真正发的以态对不对,只不过是前边他去做这个加密的时候,他报价的这个数给的是两个对,所以它的报价是两个,但是真正作为抵押交过去的一态是三个。
34:05
所以那到时候他如果竞价失败的话,应该返回两个还是三个,对得把三个都返回来,如果返回两个就不对了,对吧?好,那么呃,好,现在44了,那我估计现在我们如果去揭示报价可能会有问题,对吧?我们试一下吧,揭示报价叫review BI对吧?Review b还有哪几个参数来着?Review b的有一个ID,还有一个amount,还有一个对吧,好,那么所以我们。给一个ID啊呃,这是ID就是二,然后amount这个如果我们是零的话,他当时给的是是二来着,对吧,没记错吧,二乘以amount,然后我们是不是要把它string啊,因为我们定义的那边是要string的,对吧,这是方便web那边传过来,Web那边传过来都是string好。
35:17
呃,这一部分,然后后边还有一个参数应该是。他的那个密码对吧,你当时的密码叫什么来着啊,叫SECRET1好。那这个value就不要再发了,对吧,这个发就肯定不对了,因为我那个不是好再点了看一下,那大家看又re了。呃,这个大家其实能想到,就是我们现在时间应该还不到呢,对吧?呃,因为呃前边我们可以看一下这个,大家如果get这个信息的话,就是啊,诶我们的get呢,Get product。
36:06
看一下他的信息。他的信息这个结束的时间是1541747,对吧,我们看一下当前的时间,你有一个date除以1000。1574,现在是59745975,所以还差得远,对吧,这个是747624才结束啊,所以呃,大家给的这个2000秒可能还是稍微长了一点,所以可能得等到下节课还还比较长的时间才能够证实了,好那么这其实就是一个简单的一个控制台交互,但是这个过程其实还是有点复杂的,对吧,大家就是把这个过程捋清,我这里边可能演示的比较快,大家等一下。
37:00
呃,就是自己去把代码实现,然后测试的时候要多试几种情况,然后考虑清楚他到底是怎么回事。
我来说两句