00:00
好,那么我们现在就是手敲一下吧,这个我也不一定能能直接能把它敲下来,所以我们就是哪儿不会了,我们就就就再翻回来看呗,对吧,那我们就就还是叫balance吧二好了,好,Ma solidity,这是一样的啊,大家可以跟着我一起敲大于零点啊,4.22还是用这个好,接下来contract。好,我们定义这样的一个投票的合约,那这样一个投票合约,大家可以看到我们一开始想要定义的数据结构有哪些呢?我们首先要定义一个vote是吧?Vote大家还记得我们需要它的哪几个哪几个东西吗?呃,首先要它要有一个权重对吧?好,对UT吧。
01:14
叫wait,哎呀,Wait体的东西,Wait吧,这叫wait,对。然后他应该有一个标志位,标记他是否已经投过票对吧?沃尔型的,呃,叫voted,咱们就跟尽量跟他先弄的一样吧,这是他是否投过票,然后还有一个是他投票投给了谁?这个unit,呃,当然那个为了防止这个,我记得好像本来它的代码是UNIT8对吧?因为你的方案是肯定没有那么多,所以大家如果要是有性能上的考虑的话,也可以学它,给个有的八也是可以的。呃,What,这投给了谁?
02:02
最后还有一个。就是他把自己的这个对票代托委托给了谁de理gate代理gate么写?Delegate是这样吗?是吧?好,这就是我们基本的这个motor的这个数据结构,那接下来有了vote之后,我们还有还有提案,那接下来呃,我我们就先直接学它啊,就是还是把提案做成一个一个一个structure吧,比方说我们的提案可以有。就是叫做proposal,这个这是不好写啊,好,它里边应该是有一个叫做vote count,对吧?对,就是这个提案得了多少票,这是这样的一个一个数据结构,一个结构体,呃,那基本的这两个结构体是有了,接下来我们要有一个主席,那是address,对,Public public chair。
03:15
Person,好,我们定义一个主题,接下来我们还应该得定义一个,呃,我们还还应该定义什么?我们应该还需要定义一个一个proposal,对吧?我们需要有一个可变的,就是可变长度的数组来保存我们当前所有的proposal。所以在这里大家看怎么样定义一个变长数组,Proposal的类型的数组后面跟一个方括号。然后我们把它叫做。
04:00
这样的一个数据类型。好,另外应该我们还有一个最关键的没有,对吧,最关键的就是投票,呃,不是,是我们的地址跟我们的vote应该是有一个关系的,有一个一一对应的关系,大家还记得吗?这个关系应该是一个mapping对吧?Mapping从一个address到。我们的vote这个数据结构的一个对应关系,那我们把这个叫做voters,好,这我们就有了,有了主席,有了提案,然后还有了voters。这个大家再回忆一下,是不是我们所有的数据结构已经齐了,好好像是好像是有了是吧。好,那我们就到时候看吧,缺什么我们到时候补什么,好数结构都齐了之后,我们创建一个。
05:01
Constructor constructor里边我们要传进来一个U类型的,就是一共有多少个提案对吧?呃,那那个他他当时叫什么名字,我记不太清楚了,我们就随便叫一个吧,就是就是number。Proposal。怎么写好在这一在在这一个就是初始化的方法里边,我们在做这个构造函,在在这个函数里边,我们主要做哪几件事情呢?主要是先要把Chairperson附一下。Chairperson等于message点三对,这个肯定要有,对吧,然后我们还记得应该是给Chairperson要有一个投票的权利,对吧?所以我们应该是votes Chairperson。
06:12
点wait等于一付给他投票的权利。呃,然后初始化的时候还有一个什么事情呢,想一想好像有点记不得了是吧,初始化除了给这个。啊,对,还有很重要的一个就是我们传进来的这个数量,对吧,是不是对传进来的这个数量,我们要定义我们的这一个数组的长度,这样就可以用它的下标去指代我们的所有提案了,所以我们在这里要有一个proposals点。等于numbers,好,这就是我们的constructor,好,接下来我们来弄一个function,接下来我们是叫。
07:14
呃,首先是主席有权利给别人那个投票的权利对吧?呃,具体他的那个名字叫什么我有点忘了啊K,给权利,给权利,Give right,对吧,Give right to,就就就是这样吧,Give right give right to right to vote,对,好,那肯定我们就得指定他到底是给谁那address一个vote。好,这是一个public的类型的函数,谁都可以调,但是我们里边肯定要限定,不是啊,Require require message,第二,Send,我们要让它等于person是不是,嗯。
08:11
Require不等于吗?想一想他当时的判断是,如果不等于的话,Return,对吧?我们现在是没有用它的if,我们用require。对,所以是一定要等于对吧,五块二的意思是要求嘛,要求它等于。呃,还有一个就是我们要require,呃,不是不是vote啊,应该是叫voters。Voters vote,第二对,是否投过了,应该叫的。好,Require,它应该是等于什么,是等于true还是false?对,应该是要要他等于false,好,那接下来我们已经确定了这个是主席来发起的,然后这个人也确实没投过票,那么接下来就可以给他这个投票的权利了,对吧?好,那投票权利应该就是把他的wait加上一是不是。
09:31
其实这里咱们还可以加一句啊,就是就我们说的require votes点对。呃,等于零对吧,就是只有在他确实这里少东西了啊,只有在他确实还。还没有投票权利的时候,我们再做后面的事情,如果要已经有的话,那就算了,省得费事了,对吧?好,那接下来。
10:15
我们就直接付给他投票的权利,Voters vote.wait等于一好,这样我们是不是就已经把这个投票权利给他了?好,这是这一部分内容,接下来我们就是最麻烦的一个啊,哎,这个还是挺挺烦的,我估计不太不太好想我们看看啊,Function是代理的那个对吧,Delegate,呃,就就算delegate吗?Delegate address,呃,To对吧,然后哈,好。
11:01
那么在这个过程当中,我们得先大家还记得他一开始是做了什么事情。是要先把。呃,这个真真是有点想不起来了,我们瞄眼这个。是是在这个里面好,嗯,没有切换别的页面好,还是看一下吧,这个确实有点复杂。哦,他一开始是先把这个message sender的这个。呃,地址。对应的那个water先拿出来,把这个变量先存起来,对吧。然后他是去去做这个,就是判断他是不是已经投过票,如果要是投过票的话,那就那就别这么弄了,然后再去判断这个voters库里面的东西,好,那我们就先照着它这个来吧,我们定义一个vote,然后这个voter叫做ther,呃,当然它这里是不是还给了一个一个那个存储的位置啊,必须要存储在story这里面,对吧,我这里可以告诉大家,就是如果我们不写的话,默认它就是存在story这里面的,就是在这里,在所有的函数里边这些临时变量,假如说它是结构体这样的类型的话。
12:31
如果什么都不写,默认它是在story vote standard等于votes message,对,Center对吧,我们这样给大家看这个,我这儿因为没有写它的那个类型,所以就报包ing。大家看,呃,变量is declared as a storage point对吧,我定义当成是一个storage类型的指针,他说你需要显示的,显示的用这个storage keyword图。
13:13
就是取消到这个warning,所以大家可以看到它为什么要这么写,是为了不要让出这个warning啊,好,我们把这个写一下story ther,诶怎么还有一个啊,他是说没有用啊,这个standard定义了之后没有用,这个我们不管啊。这里的warning是啊,他说这个函数参数没有用,这个都不用管好,那么我们定义了这个vote之后,先要看他是否投过票,投过票就不能再找人给代理了,投过票就是代理,相当于也跟投票是一个性质,所以说我们要require require什么呢?Ther点。Wantedd。
14:06
呃,应该是应该这样啊,我们可以直接这样对不对对吧,就像我们前面这个的这个等于false require,其实我们也可以require非对吧。这个是不是会比较简单一些啊。我们要求它是false,是不是就是要求非它对吧,所以大家大家。这个是经常,我们会经常会这么写的,就是非voted,那就是要求voted等于false,好,这是vote体的这一步,然后呃,我们应该还会要求什么呢?我们要求我们应该直接要求一下这个require require一下这个to,它不能等于。
15:06
不能等于MESSAGE3对不对。我们应该有一个这样的要求,好。对,然后接下来大家记得就有一个while循环了,对吧?Well,呃,Well,这个应该是votes,大家还记得怎么写吗?Votes to,这个是把它在voters里边对应的那个voter对象先拿出来对吧?Voter的对象,它的delegate不能等于。零地址address,对,大家看这里是要把零做一个显示的类型转换,就是我们不能在这里直接写一个数,是要把它用address这个关键词做一个显示的类型转换表示,把它转成address类型,因为这是这是我们在solid里面特殊的一个,呃,就是我们的数据类型,所以说大家一定要注意这个转换不能不能随便的去转啊。
16:23
好。呃,接下来它不等于零是不是就可以了呢,还要不等于三点对吧,但是我们前面已经判断了一次,然后。是不是我们中间可以不做判断,最后再判断一次就可以。大家说可以这样吧,就是我委托给别人,然后别人委托给另外第三个人,第三个人。第三个人再委托回给我是吧,是有可能出现这种情况的是吧?啊对,所以我们在里面还是得判断一下。
17:09
Well,不等于,这个应该是起是吧,且vote two.delegate不等于message点三。好好,那么如果要是这样的话,大家记得我们是要求在这种情况下我们会怎么样呢?会把to迭代一次对吧,所以才会循环起来to等于votes to这样对吧?是这样,哎呀,终于把这个弄完了,这个是挺绕的啊,大家跟着这个思路,咱们一边敲的时候,一边确实是能梳理清楚这个思路的,所以大家跟着把这个思路来弄一下,好接下来的话,那就是已经确定是他没跑了,那我们好大大家还得记得就是最后再确认一下这个。
18:23
呃,Require,其实这个我们写的有点麻烦了啊,前面是不是我们没有必要写那一次对吧?Message点三不能等于点三,我把这个删了吧,好。我们还是要求他不能等于MESSAGE3呃,TH,然后这样的话,我们就确实确定这个to到底是谁了,那这个时候我们就可以3.mo,它就可以投了,是吧,这个就可以等于出了,然后3.delegate等于two,好,呃,接下来我们是注意这个还不算委托结束,我们还得注意,就是委托人那边它的权重还得变,对吧,因为他要把这边的票加上的,所以我们应该记得他是还定义了一个临时的变量water storage,呃,他给的呀,不记得了啊。
19:37
我们给个什么名字就叫就叫delegate delegate吧。delegate to等于。Vote,好,我们把这个地址从voters里边对应的那个vote数结构取出来,把它对应的那个vote全部都拿出来,然后我们就可以判断if,呃,如果说这个delegate to。
20:19
第二,他如果已经投过的话。应该这样就可以了,对吧,不用判断它等于数,如果他已经投过的话,那怎么办呢?那我们就直接把他投的那个proposal数量再加上就完了,对吧,反正他还是投过,也不用再加他他的权重了,直接给加票,就那他投过的那个proposal应该是哪个呢。对,他投的那应该是daddy get to点won't是他投的那个句号对吧,那对应的那个proposal,那应该是叫S,咱们得从这个里面去拿点。
21:18
应该是这样是不是对吧?这个里边它有一个叫做vote count的乘圆,大家还记得吧,标志它的数量对吧,所以我们要把这个呃加等于啊3.weight咱们是直接加了他的权重对吧,假如说它的权重比例大的话,有人委托到的话,所有的都统一就委托过来了,统一票就加上好,那然后我们else。Else,那就是假如说他没投过票,没投过票的话,那我们就要把delegate to.wait加等于三的点wait,是不是这样就可以了,大家再再回顾一下我们这个degate delicate这个方法确实是比较费劲。
22:18
这确实会比较绕一点啊,好,大家看我们已经实现了这边基本的功能了,那接下来我们还记得还有两个方法,一个方法是投票。对吧,Function vote vote,那肯定就是,呃,不是啊,Vote应该是一个人提议出来之后,他要投给谁,所以是,呃,应该是一个UN的proposal proposal,呃,这个当然也是一个public了,我们把它写到这里,这个时候我们应该先把这个TH还是先拿出来,对吧,Vote storage。
23:08
等于water message点三。他既然要投票,那我们肯定得快啊,他不能投过呀,3.vote的,我们就require非。三点就表明他没有投过票对吧。啊,那接下来他既然没有投过,那就可以直接投喽,那就是3.voted,现在就可以等于了,然后三点他投给谁就等于proposal。
24:09
最后这个。诶,这为什么报了错误,看看啊。哦,这个是一个1256是吧。有一米八是不是我们定义的是这里啊,最后我们还记得就是这个人投票投完了,把vote这边的信息要改变,那我们的提案那边的信息也得改变呀,票数得加上,所以大大家忘记的话,可以照着上面这个看啊,这个我们proposals。对应的proposal。这是它的序号嘛,对吧,Proposal proposal,它的加等于三点还是加wait对吧?哦,已经五点了,我我们要花点时间把它弄完吗?就剩最后一个了,弄完吧,可以吧,我们稍微拖一点时间啊好,最后一个function,最后就是叫什么winning winning proposal。
25:21
Proposal,好,这个就不需要什么参数了,而且这个应该是一个只读的对吧,可以加一个public view,它这个应该会有return的,我们returns一个东西,Returns一个应该是一个,呃,就是它的数嘛,对吧,所以是U8,我们叫winning proposal。诶,它跟这个方法名可以叫的一样,可以好,那么这个winning proposal应该是怎么样去选取呢?那我们就是去便利一趟喽,对吧,For,呃,You proposal,我们就好,就就pro吧,Pro等于零。
26:21
然后这个语法都是一样的啊,Prop小于proposals.LA对吧,然后我们prop加加这个大家习惯写这这种for循环语法的话,这个就就很简单了啊呃,那就是那当然了,我们就要判断,如果说它比现在最大的大的话,哦,那前面我们少定义了一个东西啊,少定义了一个什么,呃,就是U当前的这个,呃,我们。不应该叫叫这个是吧,应该叫winning proposal。
27:04
我们叫winning count吧,Win count等于零,好,然后这里就是if,我们现在当前选择的这个proposal.what count对吧?看他的票数,它的票数如果要是大于我们现在的winning的话,那么。我们就把winning变成他proposal pro.vote好直接把它付过来,然后我们的winning proposal就改变,就是变成当前的这个pro,所以就是这样对吧?诶对,画了一个错,好又是这个UN256,我们的这里得给一个八对吧?好OK,这里报了一个什么包,你们看一下shadow。
28:22
呃,Declare啊,所以我们这个给同样的这个名字还是有一点风险啊,所以我们还是不要不要给同样的名字,我们叫一个叫叫一个什么东西吧,下划线哦哦,加下划线这个还是可以的啊,我们前面或者后面加都可以,它是不是就是这么加的哦,行,我们加一个下划线把它搞定。好。这个war就没了对吧,好大家看这我们就诶这里为什么有一个看然no visibility,我们把它定义成public,好现在我们这一个完整的。
29:06
投票合约就完成了,我们自己手写过了一遍。
我来说两句