00:00
好,我们还是打开remix。我们新建一个文件,这个我们就叫做voting吧,因为我这里边本来定义的就是叫这个名字啊,好,那么大家看到我们的,呃,首先我们还是一样的啊prama,嗯,字体字体大一点啊。Prama solidity。呃,我们还是大于0.4.22,这个没关系啊,这边文档里面我看写的是多少啊,它也是4.22。好,Contract,我们定义这样的一个合约。然后在这个合约里边,刚才我们已经说了,首先要传入一组呃,候选人的名单,对吧?好,我们这里是用了BE32定义了一个数组,呃,当然这个应该是public,对吧,大家因为这个可能我们随时都要去查询当前这个数组里面的状况,所以说给了public。
01:20
这个叫candidate。List,这是我们的候选人名单数组,另外就是每个人的得票。这必须是一个mapping对吧?Mapping的话就是每一个候选人他的名字,然后这里边没有用地址,其实大家可以看到,在我们的就是区块链的合约里边,很多情况下都是用地址去指代人的啊,但是这个里边没有啊,这个里边因为我们的候选人就那么几个,可能就不需要那么复杂的去去做这件事情,这个这个名字是叫什么,应该叫一个啊,当然我们这个应该也是一个public对吧?呃,名字我们叫哦,它就叫received,我们。
02:14
直接叫一个得票数,好吧,想不到名字,那就还叫他这个吧。大家在命名这个变量的时候,也是尽量要让这个变量一看就能看懂它什么意思,对吧?要不然的话,以后做开发的时候,别人阅读代码也会是很很痛苦的一件事情。好,那么我们首先来看constructor。这个constructor里边就是要接收一个BY32数组,对吧?这是我们给定的candidate list name。呃,然后传进来的这个candidate list的内容呢,我们就直接给到了candidate list,所以这个非常简单,一个constructor。
03:08
那接下来我们实现我们想要的功能,首先一个是所谓的投票功能,对吧,就先叫vote吧,Vote给谁?Vote呢,肯定还是一个候选人,那我们把这个。Candidate。Public。大家可能想到当时我们首先是有一个require的一个判断的,对吧?呃,这里边的判断主要就是要求这个candidate name1定要是在这个我们的候选人名单里边,那才作数,所以大家其实呃,如果要是说大家还记得我们之前学学过的有一样东西的话,我们这里可以尝试用另外一种东西来实现。
04:07
当时我们学过一个什么叫做函数修饰器,还记得吗?对,Modify。那大家可以看到,既然你这两个都是在一开始的时候要做这件事情,其实我们是可以定义一个modfi的mod fire,比方说我们这个就叫。呃,这个应该叫什么叫叫valid。Candidate对吧?好,我们定义一个这样的mod。然后这样一个modfi,它需要做什么样的事情呢?啊,那我们就想到它肯定是需要去检测在不在我们的这个candidate list name里边,所以这个modfi也是需要一个一个参数的,对吧,三二。
05:02
Candidate。好。接下来我们需要在里边去判断,那么就会定义一个for循环。对吧,呃,那我们可以UT81个,哎,这边是定义的u in8还是什么。它直接是U啊,但是我觉得这个当然了也没关系,应该UT256比UT8也浪费不了太多的空间是吧,这个随随我们自己的这个想法就可以,当然就是I等于零,开始这个大家熟悉的这个编程语言的写法,肯定就会发现它都没没什么大不了的,都一样,Candidate list。点lance。哎,加加,好,那么我们在这里边要判断的是什么呢?是如果说我们看到当前的candidate list I。
06:14
和我们现在的一个东西要相等的话,肯定就是在我们这里边,对吧,Candidate name。如果跟它相等。哦,这里我们就不能去,如果要是modfi的话,那我们可能就呃,就是不能去去返回一个一个true或者false了,对吧,那我们可能需要用一个另外的一个状态变量去表示了,这个确实是会稍微复杂一点啊,比如说我们可以定义一个布尔型的变量,就叫做is。Is valid。
07:03
Valid valid下有点。呃,这这这个没关系啊,我们这is valued应该可以对吧。好,那呃,在这里的话,如果是这样的话,我们就会把is valid制成一个处。呃,当然了,如果说我们一直去查都没有查得到我们的这一个,呃,就是候选人没有在这个候选人名单里边的话,那当然他最后就是一个false了,对吧?那其实默认他的值应该就是false,但是我们这里边肯定是需要去改一下的,要不然这个状态变量就会有问题了,对吧。呃,Is valid等于false。呃,但是大家可以看到,如果我们直接把它放在修饰器里边,用这样一个状态变量的话,其实会会有问题,大家能想到有什么问题吗?
08:11
我们先把这个先写完啊,就是如果要这么写的话,那后边public我们就直接跟上这个validate candidate就可以了,对吧,但是大家注意啊,我们上面这个其实还没写完。大家还记得猫fair必须要有一个什么吗?对,必须要有一个战略服务,所以就是说你在做这个别的操作之前,先把我上面的这一部分内容先做完,对吧,就是这样的一个意思。所以下面是一个占位符,但是我们这种写法肯定是有问题的,呃,为什么呢?是因为我们这里如果要是定义了一个状态变量的话,它对于我们来说其实是一个全局的变量,对不对?那如果要是有这样一个全局的变量的话,我假如两个人同时在调这样的一个vote,或者说我这边有一个人在调vote,下面我们还有一个function,叫做。
09:10
呃,他是要拿到他的所有的那个得票,对吧,所有的得票叫什么叫叫total,他叫什么total boss是吧?Totals。呃,他应该还得传一个那putle bos for啊,所以我们知道后边还会有一个这样的一个方法,那它其实也是要传入一个一个我们的candidate name它的名字,然后来做校验的,如果要是我们同时不同的人都在调这两个方法,都在调用我们这一个mofi的话,那其实这个值其实是不准的,对吧。对,所以大家看到。如果我们到这里,这边改完了之后,我们这里require is valid,如果要是必须等于true,那其实有可能别人改了之后传了一个不符合的值,那它这个地方就变成false,假如刚好在这个地方的话,所以我们可以看到就是,呃,这个过程当中还是有一些就是。
10:15
在整个这个程序设计安全性上是有问题的,所以我们为了就是更加简单一些,有时候其实不一定就是用上这种。看起来特别高大上,特别花哨的东西就管用,对吧?那如果要是这个东西还不如我们正常的这个东西管用的话,那我们就不要mon fair了,我们就把它定义成一个普通的方式不就完了吗?对吧?普通一个方式,那它传入这样一个东西之后就会,呃,它不需要是public对吧,我们直接把它定成internal吧。呃,然后。我们他应该是一个view,可以是一个view类型吧,对他应该没有做更改,对吧。
11:02
好,然后returns一个布尔,那么在下边我们肯定就不能有占位符了。这边随时开着这个状态检测啊。嗯,我这里好像这个编译器会有问题,等一下可能是过不了编译的好,我们先先不管别的,我们先把这个先做完,那就是那呃,Is的这个我们就不是一个状态变量了,我们直接return就可以了,这里return true,下面就return false好。那下面报错了啊。好,我们把这个状态变量删掉,所以这就相当于我们先实现了一个一个内部的函数,去判断它到底是否是在我们的candidate list里面,那有了这个方法之后,我们去做判断的时后,就可以直接调用这个方法,然后把看name传进去,对吧?啊,这个就比较方便一点啊,那我们要求它必须为true,所以说也就是说必须在我们这个看见list里边能够把它查出来,才能够继续进行。
12:27
那接下来,呃,如果说他在里边的话,那我们这个点击就是有效的,他也没有判断到底是谁发起的这个点击,那我们就简单实现吧,因为我们在网页上吧,大家去如果说这个点击还需要去判定别人的这个master ther的话,还涉及到钱包的话,肯定就会比较复杂,所以我们现在直接就这样来做一个操作。那就candidate,我前面定义叫received,然后里边是看点内对吧,加等于一加一票数加一。
13:12
啊,这就是这个简单的一个实现。那下面这个也是一个public方法。呃,这个应该是一个view,对吧,大家看这个方法,我们要筛选当前候选人,他到底有多少票,这个其实不涉及到改动,所以应该是一个public view。呃,所以它还会有一个返回值returns一个,我们定义的是八还是256,看一下啊。有八,所以我们返回一个有影八好。那接下来同样我们会require。Validate这个有自动补全,确实就是方便对吧,明显。
14:08
敲代码的时候,这个效率就会高很多,看name,我不是看name了。我们前面需要去return,然后most received,看内好。大家看这样的话,我们其实就完成了我们基本需要的这些内容啊,这里报了一个错误,看一下。这里的这个mod删掉。好,所以大家看现在我们就已经完成了这个合约啊,大家都已经完成了对吧?好,那么我们现在呢,其实不光是要有这个合约,我们还需要就是真正的构建自己的一个项目,所以大家现在可以在大家习惯是用Vs code是吧,还是。
15:03
我我是听那个其他老师说,呃,左老师他们跟我说是大家好像习惯用Vs code的,所以我还专门又装了一个Vs code,呃,其实我是用的不熟的,但是我觉得这个就没关系,大家其实用什么工具,用什么IDE,这个都是无所谓的东西,对吧,而且对于我们而言,在这里合约的话,其实放在哪里编辑都一样,那最方便的就是remix。但是我们需要把它保存下来,因为有可能会丢掉啊,所以我们在这里建一个文件。这是。这是我刚才就是打开了我们安装了所有的GA,还有WEB3,还有就是sock所有的这些工具的这个文目录下面我们新建一个voting点。把刚才的内容copy过来,好,那我们的合约就已经写完了。
我来说两句