00:00
好,那今天下午呢,我们其实就真正的想要去把我们已经就是了解过的,已经学习过的这些内容,包括合约,包括WEB3GS这样的一个接口调用,呃,那当然了,就是我们希望把这些东西做一个综合,然后真正的有一个项目性质的东西来让大家练一练手,那今天下午开始的,我们相当于是要做一个简单的DAPP了,那这样的一个DAPP呢,我们主要的内容是简单投票,简单投票之前我们其实也已经做过,就是大家没有自己写,但是其实已经看过了官方的这个ballad的这个这个合约,对吧,投票的合约,大家可以看到他的那个实现,其实尽管比较简单,但里边考虑的问题还是比较多的,比如说他考虑到了代理的这种情况,那我们现在呢,可能就把它更简化一点,我们要的是就是把所有学。
01:01
多的东西做一个综合,所以今天下午开始我们要做的这个D,主要就是做简单投票,简单说逻辑就是一人一票,然后投给几个候选人,就是所有的候选人,比方说我们要去选一个,呃,什么委员会的一个主席,或者说一个什么样的一个领导,那我们大家就是提出几个候选人,一人一票去选,也不存在代理,也不存在别的情况,也不存在别的一些限制情况,所以这个逻辑呢,就会非常非常简单,所以大家可能会等一下看到我们写的合约可能没有什么难度,但是它的难度可能在于,呃,假如说有的话,有些同学可能会看完这一个文档,会觉得这个完全没难度啊,呃,就是假如说有难度的话,可能更多的是在于我们整个的就是应用和综合的这个过程。一方面就是大。
02:01
大家看到前面我们还会给大家介绍一个叫做点Nash的一个一个小工具吧,呃,我们之前我们所用用到的客户端都是GA,或者是我们自己去去搭建一个思链,对吧?起一个测试环境,那galash这个东西呢,就相当于它是一个非常用的一个模拟工具,或者说一个测试环境,我们用它的话去做测试是非常非常方便的,比我们每次去洗GAGA要方便很多,所以在这里我们也是把它单独拿出来,就是顺便给大家提一句,我们做这么一个小项目的时候,顺便就用了,然后还有后边的话,我们写完合约之后,这是合约代码啊,写完合约之后我们还会做这个编译和部署的过程,这个其实我们前两天大家已经练习过了,那现在呢,我们可能就会又做的更加的。
03:01
应该怎么说就是呃,就是看起来更加标准化一些,我们会从直接从那个文件里边去做编译,然后去做就是里边这个bad code啊,他们的提取,所以整个这个过程大家可能就会有之前的基础,现在应该就会简单很多,那最后呢,我们就是还要在控制台里边,就是假装我们的控制台就是一个呃,我们的D的一个组件,对吧,假如说这就是我们的控制端,然后去跟我们的合约去做一下交互,这个就相当于有一点像测试的一个过程了,最后我们既然是D嘛,那所以我们不能直接把控制台交给交给用户,然后说你去敲这些命令吧,那那肯定不行,对吧?所以我们还会有一部分是网页上的交互,我们自己去手写一个HTML的页面,然后把它上面的这个,呃,JS自己写进去。
04:01
自己去跑起来,然后看看它的效果怎么样,这个如果跑起来的话,大家可以看到其实就是一个完整的D的一个开发流程,所以我们一般情况是什么呢?就是一开始先去确定我们的核心业务逻辑,然后确定哪些部分是要放到链上的,那么这部分核心的业务逻辑呢,我们就会用合约来实现,用solidity写好我们的源码,然后就是编译部署,之后是测试,测试的时候我们可以直接用控制台,这里给给的这个流程是控制台,之后还会给大家讲讲,这个就是我们怎么样去用一些工具,包括我们怎么样去做自动化的测试,就自己可以写脚本,也可以用窗口之类的工具。呃,做完测试之后呢,其实就是说我们整个的就是合约这部分的逻辑基本上就已经通了,那这部分其实在我们的D应用里。
05:01
也相当于是我们的后台,相当于是我们的后端,前端呢,我们单独还要有对应的开发,当然这个里面非常简单,所以说也没有什么,就是页面的布局啊,设计啊,呃,也没有用到前端的框架,就直接手写一个HTML,然后把JS嵌进去就完了,所以这里但是整个的流程我们可以看到,它就是这样去开发的,之后如果我们做自己的项目。自己想开发一个D,那其实可以借鉴这个过程,当然就是之后在在我们讲到一些稍微复杂一些的项目的时候,我们前端的页面可能就会又有更多的内容进去,可能也会用到框架啊,或者是一些其他的工具,那我们就到时候再说,所以这个就是我们的一个上手入门的一个东西。好,那接下来我们就正式开始,呃,介绍一下我们怎么样去做一些准备工作啊,首先前面这些就不说了啊,就是说这个rpc web3GS的这些介绍我们都已经很熟了,首先我们做一下这个开发的准备,还是基于Linux啊,首先我们要安装node和NPM,这个大家都有了,呃,然后呢,比较建议大家就是在我们的项目目录下面先新建一个文件夹,然后在这个文件夹下面NPM。
06:28
然后in I nit对吧,有这个命令,好,我们这里做一下啊,这个很简单,但是大家最好能跟着一起做,我在这里因为npm star的时候需要下载,所以说我是已经下下,呃,已经下好的啊,我这里可以跟大家就是简单的看一下,假如说我已经有了这个文件了,所以说我可以在命令,呃,就是另外建一个文件夹,比方说叫test吧,那么大家随便在自己的项目跟目录下建立一个我们现在的这个项目的文件夹,CD进去,在这个里面大家看下面本来是空的,然后去敲n PM in啊,大家n PM in的时候,它就会有这么多的提示,对吧,就是你初始化整个我们这个包包管理工具的时候。
07:28
弹幕管理有哪些信息,大家可以一路回车下来,那可以看到这样的话,在我们的目录下边就生成了一个叫做package Jason的一个文件,那这个当然就是我们NPM做项目包管理的这样的一个文件了,大家如果想打开看的话,其实可以看到基本信息一些ma data都已经在里面了,就是前面让我们确认的那些信息,所以在这个目录下面我们就可以n PM install,我们要装哪些东西呢?呃,它这里边列出来的就是,当然我们首先要有WE3对吧,这里用到的还是web3.20.1这个版本。
08:09
另外还有它这里边提到了要装sock,呃,大家也可以就是一并把sock也装上啊。呃,还有一个就是我们这里要跟大家说的叫c Li这三个工具,我这里就不敲了啊,因为我已经下好了,大家下,呃敲完这个命令之后应该会看到,或者大家如果觉得三个这个一起敲,自己不知道进度的话,也可以一个一个装,呃,如果外B3这个下的比较慢的话,大家也可以把我们之前已经装好的,我们切到另外一个目录下面去,大家应该之前有装好的对吧?大家之前我们装好的东西在哪里呢?Note module下面这里就是我们之前都装好的东西,大家如果觉得这个拷贝开更快的。
09:09
的话,大家可以把我们之前的就是装过WEB3的那个note modus直接复制过来也是可以的啊,当然我建议大家还是直接装,因为直接装的话不会漏掉一些包,这样可能会更好一点,好,那么现在大家先把这个命令敲完,我们先让它装着,这样大家可以先就是后面WEB3和so应该是大家至少也都有,对吧,我们可以先不装那两个,先把这个呃感纳什C先装上。好,我把这个放大一点啊,该是一个什么东西呢?呃,简单说它就是一个纳史,大家可能没有听过是吧?这个名字好像挺生僻的,但他之前他的前身非常的有名,他的前身是什么呢?是大名鼎鼎的test rpc,我不知道大家听说过这个没有,它的前身叫做test rpc,大家如果要是就是看网上的一些教程,可能会看到就是,呃,有些人文章就会介绍用test rpc,然后来测试自己的呃DAPP或者说是用什么呀,提到的test rpc其实就是我们这里说的gash,呃,它在之前的话就是一个非常方便的,能够起一个模拟的。
10:47
区块链节点相当于就是他自己给我们起了一个呃,GA的杠杠D的环境,大家可以简单这么理解,而且比那个可能就呃更简单,我们起那个的时候,我们还要就是呃配好参数,然后起来之后,里边它只有默认是只有一个账户在挖矿,对吧?那GA纳SH这个环境呢,它默认里边大家如果要骑起来的话,等一会儿我们进去看可以看到啊,就下面这就是进去它骑起来的这个状态,它里边默认就有十个账户,而且它会把所有的私钥都给我们列出来,大家可以直接把这个私钥保存下来,我们甚至就是它生成的这些账户,大家也可以比方说加到ma mask里边啊,或者怎么样都可以做这样的操作,而且它默认的十个账户里边,每个都有100个以态啊,所以就是可以说为为我们测试考虑的非常的周全,非常的周到啊,这也就是为什么平常的。
11:47
这个做测试很多人也就不用GA了,就是尽管现在GA杠到第一位已经很方便了,但是这个可能会更方便,呃,所以是这样的一个状况,而且它可以就是用这个NPM安装的话就非常的简单,可以跟着我们的项目走,我们的项目放在这个目录里边,我们就在这个目录里边包包管理的时候装一个GA纳,那么这个就不会打架,我们如果别的项目还有别的这个GA纳的话,我们指定不同的端口就可以了,对吧?好,大家现在怎么样?呃,是不是比较慢,下载比较慢是吧?装好了吗?呃,大家如果要是已经在装着的话,就先不用管了,大家就先让它装着,我们继续来,来跟大家说这个东西怎么用,好,我把这个还是弄成这个竖着的这个状态啊,全屏吧。
12:47
呃,那大家可以看到在我这里其实已经装好了这个该纳SH,所以我们要用它的时候怎么用呢?呃,这个就是因为它已经装在我们note modus下面,所以我们没有办法把,但大家如果要是直接想把这个加到我,呃,就是默认的这个环境变量pass下面的话也可以啊,那大家可能敲的时候就方便一点,但是不推荐大家把这个node modules这个加到pass变量,所以我们一般调的时候,那就直接对加上目录来调了。
13:23
它下边大家看到。GA纳下边这个应该有一个并in文件啊,啊,不是在这个GA纳这个包里边,因为这是我们安装的源码的包,它会对应生成一个可执行的文件,这个文件是在note modules下面的一个隐藏文件,叫点B,这个下面呢,会看到我们安装好的所有的能用的这些这些命令都已经放在这里了,所以看到有一个GA纳c Li,呃,那我们可以看看它的这个help啊,大家可以看到就是这是它的help,呃,它有各种各样的参数也是可以加的,比如说你看它可以去定义我们的账户,比方说它可以指定一些就是像我们这个生成HD钱包用到的这个种子,对吧?呃,Seed用到seed,然后可以指定network ID。
14:30
也是可以的,GA price GA limit也是可以指定的,所以呃,就是当然了,一开始启动的时候也可以指定portt啊,就是我们到底是8545还是哪里,那不指定的话,默认当然就是8545,所以我们平常启动的时候,其实大家想要细看的话,就慢慢再去看,我们平常启动非常简单,什么参数都不加。C Li,它就起起来了,起起来就是这个这个样子,界面就是这样子,那我这里的版本大家看到是6.1.8,提起来之后,它就会列出十个available count,就是我们可以用的账户,默认已经内嵌在里边生成好的账户,每一个都是100个以态,下面列出来的是它对应每个账户的私钥,非常的直观,非常明显啊,然后下面它还就是对应的生成了一个HTP钱HD钱包,那默认的GA price,大家看这应该是应该是20基尾啊,它这个默认的GA price比较高,所以大家可以想改的话,我们到时候可以改GA limit,这是672万,这都是一些默认的参数,下面大家可以看到它启动之后,Listening on8545 local host8545,对吧,零二。
15:56
其实这个就是我们本地主机的地址,所以大家可以看到这个起起来之后呢,这个页面就我们就得放在这里了,大家看到它是一个启动状态,下面我们进不到命令行去,所以呃,我们把它提起来之后呢,就可以把它最小化,我们就可以做别的操作了,这就相当于我们起来了一个guess杠杠DIV1的一个环境,或者说起来了一个思恋的环境,那当然了,他的行为其实跟呃guess第杠杠div的模式下是比较接近的,就是我们平常的时候根本不用去管它,我们只要一提交交易,它那边就会出块,所以这个行为大家熟悉了,杠刚D的模式我们一点都不陌生啊,好,大家应该都已经安装好了吧,好,那接下来我们就讲我们的合约了啊呃,这一节我们要写的这个合约呢,是。
16:56
一个简单投票的合约,比我们当时的那个ballot合约还要简单,他主要是想想干什么呢,那我们主要就是说有这么几个候选人,这个是我们预先就已经定好的,然后这个合约发布上来之后,就每个人都可以去给他投票,就非常简单的给他去投票,那为了方便测试,我们这里就连就连校验都不做,校验就相当于是谁都可以去投票,而且投票的时候也不做,就是说看这个人到底投过没有啊,这就比ballot里边简单太多了,对吧?Ballot里边必须得定义一个vote,一个一个类型,然后要判断他是不是投过票,他有没有代理,呃,然后投给了谁,投了多少票,这样的一些特点,这里我们考虑的就更简单一些,就非常简单,就是一人一票去投,呃,那我们可以想到里边主要需要的呢,就需要一个构造。
17:56
到函数,这是我们提前需要把要的候选人都初始化进去的,呃,那这个构造函数的参数就应该是一个一个数组了,就是我们初始化的候选人的数组,另外就是最核心的投票合约嘛,最核心的一个就应该是一个投票的方法,Bo的一个方法,那就是投他得的得的票数就会加一,然后最后呢,我们就还得有一个方法是能够随时的拿到当前候选人所得的票数,这个跟我们之前那个ballot可能不太一样,对吧,就是ballot那边的话,他是用其他的一些方式来获取这个,最后他是最后要获取一个winning proposal,因为它是好几个提案吧,最后结束的时候,它是返回一个winning proposal,而我们这里是要把每个候选者得的票都拿到,就是随时去拿到,所以这个大家就看他的这个设计,呃,尽管比较简单,但它。
18:56
想法其实就是让大家之后在网页上显示的时候会方便一点,对不对,就是网页上显示实时的就能够看到当前的这个精选的情况,所以是为了方便这个来做,也做了一个简化,呃,我们简单的过一下这个合约内容,大家可以看到这个合约里边呢。
19:18
大家现在已经不用看那些基本的定义了,对吧,那我们直接上来之后,就先看它定义了哪些状态变量,那我们首先看到第二行有一个这个。呃,Candidate list,也就是我们的候选人的列表,大家知道这个就是我们初始化的时候就要把它放进去的,对吧,这是一个那个候选人列表,然后上边呢,就是一个mapping,这个mapping呢,它是叫做votes received,那这个很简单,从名字就可以看出来,就是每一个候选人的得票数,对吧?所以他的这个mapping呢,他都没有用,就是地址之类的东西,他直接就是拿我们前面传进去的那个candidate list,应该是一个字符串的数组。
20:05
所以它是用的BEST2来保存的,那这个mapping就是一个BA32到U8的一个一个数字。呃,一个一个mapping,一个映射啊,所以非常简单的两个状态变量,那里边的构造函数呢?构造函数就是我们把这个candidates names一个数组传进去,把这个数组给到我们的candidate list。这就是候选人列表。然后下边。主要的方法是这个vote for candidate,就是点一下就给别人投一票,那么我们要要选的肯定就是你到底是给谁投这一下就是只只是算一票对吧,只是加一票,那么我们就把要选的这个candidate传进去。然后呢,他肯定就是首先它需要就是说你传进来的这个看定的值,因为这是一个BEST32嘛,你不能乱乱传,我先得确定你这个是不是在我的候选人列表里面,所以它有一个validate candidate date,如果在列表里边的话,我就直接给它加一。
21:11
这个就非常简单粗暴对吧,就是别的东西都没有考虑啊,啊,那最后返回的时候返回什么呢?同样它也是你要查谁的得票数,你就传谁的进来,同样我也是先校验一下他是。确实在我的候选人列表里边,那么你要的这个,我就从这个most receive的数组里,Mapping里面把它找出来反馈给你。就这么简单,就是相当于就有点像我们一个set一个get对吧,只不过这个set是一个加一。几乎就跟我们一开始做的那个简单存储都类似,当然这里边它是有一个条件限制的,条件是说要做一个,就是是否在这个can list里面,那这个呢,我们单独把它提出来,作为一个函数,大家看到,呃,我们定义这样一个函数,你传一个数值过来,我去遍历一遍,我这里边状态变量。
22:07
状态变量数数组里边,我相当于大家看这个到底是用什么方式去便利呢,其实就是说这个方式其实有点不好啊,这个方式就是因为本身我们的这个。BI32的这个数组其实是一个变长数组,对吧,所以这种方式其实是不是很好的,但是数组的话,它有这样的方式,是因为数组我们知道本来有一个LAS嘛,所以我们现在可以根据它的LAS,然后所以一个一个去去往上叠加,去判断是不是等于当前的这个,如果找到的话,返回处如果。就是没找到的话,最后就是false啊,这就是一个这个判定它是否validate的一个方法啊,所以大家可以照着这个先参考一下。
我来说两句