00:00
C20代币合约最终形成了现在这个样子,其实也是经过就是长时间的这种发展变化,一点一点大家总结出来的,就像一开始大家也没有把这些东西就是想的那么清楚,可能大家也就是你定义一个name,定义一个single,直接写死在里面就好了。但后来大家发现,诶,我可以把这些东西提出来,提炼一个标准,我在初始化的时候把它传进去。呃,另外就可能还有就是有一些安全性上的考虑,在这里大家也可以看到就是。它有一些地方为什么那么复杂呢?其实都是。都是在发展变化的过程当中遇到过,遇到过各种各样的问题,所以之后才会有各种各样的这种安全性的考量。好,我们继续来看上节课,我们看到已经把这个construction看完了,对吧?我们已经看到了它里边初始化的时候要提供三个参数,它的初始化数量总数。
01:07
然后它的name和symbol初始化的时候呢,就把这些都附到本身的这个状态变量里面来,那接下来我们就来看它下面是一个transfer。呃,Transfer这个方法呢,它前面加了一个小小杠。这个一般情况都会表示这种内部的一个函数,对吧,所以大家看前面的注释也能看到它这个说的就是内部的transfer。只能在内部调用,只能在这个合约里边去调用。大家可以看到它后面就不是public。这里是它的一个类型。所以就是这个方法是在外部不可见,那外部如果要transfer的时候,怎么去transfer呢?我们直接拖到下面来,我们可以看到这里有一个真正的transfer函数。这个是public的,而且会返回一个布尔型的success。
02:05
这跟我们前面那个简版的实现是一样的,对吧,Transfer返回一个success。啊,他要做的呢,是调用了内部的函数,然后返回出。那所以这个实现的这么简单的重要的逻辑就都在内部的transfer里面。好,我们翻回头来看它内部的串词本到底做了什么?这个看起来好像还很复杂,但其实也没有啊,它就是每一句都有一个注释。说明的很详细,所以大家看起来好像很复杂。好,我们看一下。首先它require,首先我们看它参数啊,参数简单,一个from,一个to,一个value。首先它require to。不等于0X0。这是什么意思?也就是说,不能往零地址去转B。
03:06
所以大家可以看它上面的这个注释说的啊。就是防止向零地址转币。用倍来instead,所以它的意思就是说零地址是专门用来销毁币的,专门用来去。燃烧币对吧,所以我们要是transfer的话,你就是转币,不要去用transfer方法去去燃烧币啊,这这其实这都是规范化的一些做法啊,就最早的时候是根本没有泵这样的方法,都是大家直接你调一个穿刺per,直接往零地址上发的,就说我燃烧了这个币了,那确实大家也认可,但是这个确实就是可能不是那么的公开透明,所以要有一个更直观的一个泵掉出来。好,下面我们来看下面这个就好理解了,Require balance of from要大于等于value,你得有这么多value你才能给别人转啊,这我们也已经实现过啊。
04:06
然后下一个就是刚才我们新加的那一个要求require balance of two加上value要大于等于balance of two。这就是说的防止加法溢出对。大家注意看这个,呃,然后我们再看下面。他有一个。Previous balances,这是个什么东西呢?他说是,这就是以前的这个余额,余额数量对吧。以前的余额数量等于balance of加上balance of two。他把from和to加在了一起。这是要做什么呢?好,我们不知道,我们再往下面看。Balance of from减等于value balance of to加等于value,这没什么问题,都实现过对吧,标准的实现,然后下面它了一个transfer事件,这个都是我们已经做过的事情,这个我们就不看了,看最后。
05:11
Assert它断言我们前面说过,Assert要求的是它后面的一定要为真,对吧,就是如果不是真的话,那就是程序出错了,程序有毛病了,而不是说像require那样,就是你确实有可能是假的,是假的话说明你输入非法。我们看ser了一个什么事情,他说balance of from加balance of to要等于previous balance。也就是说他是要在这个转账之前记录一下他俩的总和,转账完了之后要确保这个总和跟之前是一样的,对,保证这个原子性,你不要在中间出现什么幺蛾子,对吧,然后就是这在安全性上也是一个完全的保证,就是之前你们俩总共这么多钱,就你们俩中间转,那你们组合绝对不能变啊,所以最后我assert你们的组合没有变。
06:11
如果出错,整个这个交易回过。所以这就是他他这里的这个安全性保证,这都是就是经历过遇到遇到过坑之后的这些调整,大家可以看到现在一个完善的一个安全的合约是要怎么样去写,加各种各样的这种条件判断,尽管是这么简单,在我们看起来就应该是三两行应该搞定的一个一个方法,他加了这么多。好在下面我们再看一个,他还提供了一个方法,叫做transfer from,这个其实比较简单,就是我们看一下他是要做什么事情。呃,它上面其实应该有这个注释啊,他说transfer opens from other addresses,就是说就是说我要调transfer方法之前的这个transfer肯定就是谁调谁就给别人转嘛,对吧,这肯定就是me ther,是这个from。
07:09
这里的transfer from是说我调这个方法,我可以不用自己给别人转。我直接要求从别人的一个账户里边转出去,转给另外一个人。然后有一个value。那这个是什么呢?这就涉及到我们所说的授权了,你允许别人给别人多少额度,然后别人就可以从你这里转这个额度出去,转给任意的人。那,那这就是这样一个方法,Transfer from。好,我们看一下。首先它require value要小于等于allowance的from the me。这个allowance因为它比较复杂,所以可能会有点麻烦啊,我们再回头想一想,Allowance是一个什么样的数据结构?对,Allowance,它是一个address对应到的一个mapping。
08:05
就是它的key是address一个地址,然后它的值是一个mapping,是一个映射,那它的这个值映射是什么呢?这个映射里面就保存了又是一个地址到一个UEL256的一个类型。所以这是它里边保存的每一个地址给的额度。所有把其他所有人的地址都给一个额度,总共合起来的这一个总的映射,那就是我这个地址给出的所有的。额度。所以是这样一个关系啊好。就是一旦涉及到比较复杂一点的数据结构,可能大家就会觉得有点绕,但是呃,这个没关系,我们也只是通过这个来看一看,不是现在就要求我们写出这样级别的合约,对吧,我们肯定也是一点一点练的。
09:01
就说。呃,对。就是初始化我们看到就是是在constructor里面去做的嘛,对吧,所以constructor里边传进来的参数,那就是我们在deploy的时候要传的参数。那个允许别人授权,那个授权初始化的时候,咱们没有做啊对。所以肯定后面是有调用函数对吧,才会去授权给别人的,所以我们等一下再看。Transfer from,所以我们这里首先就是要理解这个allowance,然后from后面的master是什么意思。首先我们知道allowance。这是一个地址到。Map的一个一个映射对吧?好,那么我们看,那么它下面的from。这其实就是说from的这个地址,他给别人的所有的额度对不对啊,所以前面这一部分allowance from,这就是。
10:07
From的这个地址给出来的所有额度,那下面用mes ther,那其实就是from的这一个。人给到message点三的额度对吧。因为它下面又是一个地址到有的一个映射嘛,所以它调用了两次。呃,但大家如果要是觉得比较复杂的话,就是,那就是大概知道它是什么东西就可以,要是觉得想不明白的话啊。所以我们可以看到后面这一个,就是从from这个地址里面给到这个我们现在调用者的一个额度,所以我们要判断它是否比现在要转的这个value要大呢?如果要是小的话,那你就不能转,你不能超出给你的额度嘛,所以他必须要要求Y6小于等于这个额度,好,那如果要是满足的话,那也没什么问题,就直接额度减掉。
11:06
减掉要转的这个Y流,你的额度就变小了,剩下的没有那么多了,但是剩下的还是可用的,所以说是减等于。接下来就是transfer,再调我们这个内部的transfer方法,From to value转过去return true就完了。这其实就顺下来的话,其实还好对吧。接下来我们就看看这个S是怎么回事啊。好,它有一个方法叫做approve。Approve就是通过授权对吧,就是这样的一个意思,所以说他是授权什么呢?就会授权一个。Spend,然后给一个value。那这两个数,这肯这肯定就是就是授权给谁,然后给多少额度啊好我们看一下啊,它会返回一个一个布尔型的success。
12:00
下面就是直接改这个laws这个我们的这个状态变量了,它里边的message sender。那这个laws下面的VE,这就表明是这个调用者的所有的授权额度,对吧。然后。那就说明是给到这个人的额度。好等于value直接设设置了这个这个value。好,所以这其实就是这么简单的一句,就把这个值设定进来了。把这个额度确定,然后啊,这只是一个事件的一个发布啊,发布了这个输入口的这个事件,让大家能看到谁给谁发布了多少额度。其实很简单,就是更改了我们这个allowance里面的一个值。那在下面就还有一个叫做approve and Co。那这个呢,就可能就就会稍微复杂一点,就涉及到我们上面定义的那个接口了。
13:01
这个可能会比较比较麻烦啊,我们看一下这个上面上面它的这个注释。他是说。它可以set allowance for other。地址。And notify。然后他说这个。允许这个spend去去花费。不超过value的token。就是代替代表你取化费。然后呃,拼the contract这个。好,我们看一下它代码是怎么实现的啊,它里边其实就传入了一个SP,然后传入了一个value,然后它还有一个X data,那这个其实就是有点像复言什么的之类的东西了,对吧?呃,它最终也是要返回一个布尔型的success。
14:04
它定义了一个token。Recipient这样的一个。那这个是前面定义的这个接口,对吧,大家还有印象吧,这个接口它等于。把这个spend传进去。所以这个就相当于是什么呢,就说这个。大家可以看到啊,就是可以看到这个spender是要有这个receive方法的。这个大家其实就是大概看一看就行,可能这块有点有点绕,我觉得这个不用纠结太多啊,简单大家理解一下就可以。然后大家可以看到,就是它是如果说。如果说approve调用上面的这个授权方法。
15:02
成功的话。那么下边就点receive approval调用我们上面接口里面的那个方法。所以他他管这个叫做approve and call。所以就是说还有一个,还有一个返回,相当于是说我告诉你,我已经收到这样一个状态,大家知道这个就行可以了。啊,最后我们看一下他怎么样去这个销毁token啊。那就是前面所说的或这个方法,或这个方法他要做什么事情呢?我们看一下啊。呃,它就传入一个value。就直接就传出一个value,那人快。调用方法,人的余额要大于等于Y6,你要没这么多的话,肯定就不要不要去销毁了,对吧。然后如果要是满足条件,直接减。减掉value余额减掉value,然后total supply要减掉value。
16:05
这就是真正意义上的销毁。对吧,连提供的总数都都减少了。呃,然后去。触发一个泵的事件。返回一个处,那这个就很简单对吧。那当然了,它最下面还提供了一个be from,就是说假如你有别人的授权的话。那我还可以代替别人去把别人的销毁掉?呃,所以就是只要这个这个授权还是很厉害的,对吧,就是你给了别人授权,那就相当于这个钱就是别人随便都可以用的,就有绝对的所有权,可以直接花掉,可以直接转给别人,也可以直接给你烧掉,给你毁掉,呃,所以这就是这样的一个一个东西啊。大家想要细看的话,可以再细细的琢磨琢磨,他每一步到底是怎么实现。这就是我们所说的经常所听到的ERC20代币的协议,合约的协议,大家可以看到整个还是有一点复杂的,对吧。
17:09
光这个word里也贴了好几页啊好,那我们这个也是先只做一个了解,因为这个毕竟不是让我们要把它完整的敲出来,大家感兴趣的话可以手敲。就是把它抄出来之后,自己可能的感觉就是理解就会更深刻一些,有时间大家完全可以做这件事情了。好,那么我们现在就就不花时间来做这件事情了。呃,在这里我们专门是还是说一下这个event事件的这个东西。就是说event这个关键字是会触发一个事件的,他在呃是在这说的是我们前面这一个子货币的这个方法啊,他在最后这个it s的时候会被触发。这里大家注意这个一米的关键字,这个关键字。在呃。
18:01
我我记不太准确是4.21还是4.20之前啊,就是是没有这个关键字,所以大家在编译的时候可能也要注意,有时候可能会报错。如果大家的那个编译器版本不太对的话,而在之后的版本呢,是就是要求要加上limit的,你如果不加的话。应该是会报warning啊,咱们试一下。我们在这里看一下。好,现在就是没有任何的问题的,我们把这个删掉,大家可以看到,对,这里会放一个warning。汪敏说,当你去触发这个事件的时候,Withoutit前缀。你如果要是没有这个一米的前缀的话。呃,Depreated就是将要被废弃了,这种调用方式将要被废弃了,所以大家可以看到,因为现在这个solidity,还有整个这个以太坊社区发展比较快,所以说它这个版本之间的这种兼容,还有这些更新换代其实还是很快的。
19:11
特别是大家看到现在我们用的稳定版本是4.25,现在已经有这个5.0的这个发布了,但是它还没有出这个stable,就是稳定版的编译器,所以我们现在一般不用5.0,如果出了5.0的话。可能很多之前这些就是我们现在如果不这么用,用老办法还能用对吧。5.0之后,可能之前很多废弃的用法就就会报错了,就会有问题,所以说我们现在最好都是按比较新的这种方法来做调用。当然就是如果大家用的编辑器刚好就是比较老的版本的话,这么用了之后报错了,那那大家可以去替换一下编辑器版本,或者说大家就就凑合一下把这个删掉也是可以的啊,这只是跟大家多说一句。
20:06
好,那么呃,触发这个三的事件的话,就是用这个it把参数要传进去,Mess sender receiver amount都是这样做的,下面我们说一下这个事件的监听,呃,前面大家也也提到,就是这个事件到底是一个什么样的机制呢?我们前面说了就是它其实是EVM里面的一个log机制。就本身它其实就是去写log而已,但是这个log呢,我们在用一些别的接口的时候,比如说WEB3的一些接口,它是可以去监听到这个log。呃,大家可以简单的理解成就是那边出只要出一个块,我这边。就有一个监听,去监听器去把那个块的信息拿过来去做做这个处理,一旦看到这个块里边有这样的一个log,呃呃,或者说不能说块里面有log啊,就是说跟块里面它的交易相应的那些log里边有这样的一个事件,我就要把它提炼出来,然后触发一个监听的事件。
21:10
所以大家可以看到这里边是一个JS的代码啊,当然这个代码不是直接能跑的,因为前面这个靠影咱们都没看到定义对吧。这个call其实就是说,假如说我们现在已经有了一个JS,前面已经完成了所有的这些东西。然后我们。已经有了这样的一个Co对象,它是什么呢?它就指代我们刚才在区块链上部署的那个合约,Co合约,那现在我们已经作为JS里边的一个对象在用了,那怎么样去监听他的事件呢?我们看到他直接点sent。然后点watch就可以。这就是在用JS里面去鉴定这个世界,那watch后面里边给到的参数,这前面是一个参数,什么都没有给,然后后边就会有一个回调,我们看到这个方式啊,会有一个回调。
22:03
Error result,当然我们也可以用呃,别的方式,就比如说promise啊,或者是其他的一些方式去去做这个。呃,结果的处理,如果是呃不是error的话,那我们就把这个打出来,对吧,就可以拿到result里边的amount。还有result里边的from,还有result里面的to。然后我们还可以就是把这个我们看到co.balances点靠那就是调用这个合约里面的balances,它的公共的public的这个状态变量,对吧,然后靠它的这个地址。我们可以看到这种写法啊。就就会把他的这个余额拿出来,然后打印在这里面。啊,这只只是一个一个就是大概是这样的一个意思,具体我们会在后边讲了WEB3JS之后,然后去跟大家去具体的实现一些这些事件监听呀,还有就是。
23:01
用GS的接口去做转币发币啊,就就做一些这些事情,当然可能我们不会做太复杂的事情啊,就是更复杂的事情大家可以自己去做。好,这就是我们整个货币的这一块,我们把这块讲的比较多,主要也就是希望用这样一个典型的案例。给大家把整个这个sity里边的所有的语法,所有的结构,所有的用法,包括一些安全性的考虑,都给大家融合在一起去去做一个讲解,呃,更何况就是货币这一块,现实当中真的是有很多很多应用,那所有的ICO的代币在以太网上发发发行的代币几乎都在之前,几乎都是ERC20的代币。所以刚才我们看的那一套协议的标准,那所有的。代币都是要满足的,它都有那么几个固定的状态变量。那当然了,有一些代币他可能弄得比较简单,可能就没有实现,比方说燃烧代币啊,就是销毁代币啊,或者说没有实现给别人授权的那种allowance的这种approve的这种实现呀,可能他不缺少这些,但是他都是符合EC20标准的,大家感兴趣可以去,要不我们直接就去看一个吧。
24:21
要不然这个可能跟实际还是离得有点远啊,好,我们进1STAR上去看一下。现在网络比较差。OK,我们看一下token。EC20TOPS。好,我们就看这个BNB吧,它不是这个市值很高。
25:13
哦,今天下午好像这个网络确实是。哎哟,这种状态居然还在loading。好吧,那那我们先啊。打开这个合约地址,我们看一下它里边的code是不是跟我们刚刚看过的这些东西会会比较接近。诶,大家看到啊,这里它是首先。又用了一个。这相当于是它作为这个库来用,当然它这里没有定义library啊,呃,但它其实就是定义了,就是把我们安全的一些数学方法全部提炼出来,不要再自己去做那些加加减减的校验,所以这也是后来的一个东西啊。
26:05
就是比我们刚才看的那个ERC20协议的版本还要后来的东西叫叫C。就是有一个标准的数学方法,安全的数学方法的库,我们可以直接去调用它们里面的方法,那这里边简单说就是加减乘除了,对吧,这是一个比较安全的乘,比较安全的除。减和加。所以大家可以看到他的这个家要求是什么呢?A加B要求是什么呢?就是加起来之后,C要大于等于AC要大于等于B,就是这样一个要求,这是比较安全的。呃,前面减的话呢,就是B小等于A,然后A减B。就是这样。好,我们可以看到它首先这个BB。Is save me。
27:00
它是继承,对继承了这一个CS里边,它既然是继承了CS,那就能用它所有的这些方法,那我们看到CS其实就没有自己的状态变量,就是几个通用的方法,那当然就是它一继承就都可以用了,所以只是为了用它的几个方法啊。大家可以看到它定义的这个几个状态变量内。Symbol。Decimal for the supply。但是他还多了一个,他多了一个叫owner的东西,那这个owner其实就是。我们前面看到的一开始给,对对,就像我们给的那个呃,M特一样,或者说就是像我们后面ERC20代币里边一开始把那个total supply给到的那个地址一样,他专门定义了一个owner,呃,这个当然是可以的啊。你们看,它也是定义了balance。然后allowance,它还多定义了一个叫做free。就是它还可以冻结,所以这也是他根据自己的需求多出来的一些东西。大家可以看。
28:02
呃,定义了这么多方法,它就多了一个freeze,还多了一个onre,就是既然可以冻结,就还可以解冻。然后这是它的构造函数。构造函数里边要传进这几个东西。呃,他是把这个decimal UN l,呃,UNL传进去的,他不是直接写死的18对吧。我们看下面,它就是很简单的一个transfer。他这个都没有我们看到的那个实现的复杂,对吧。然后一个approve。然后。一个蹦儿。这就是我们看到的那几个方法。当然它下面自己还实现了一个freeze on freeze,还有一个withdraw eer,就是它里边还可以提以态,就是它自己设定的一些,这个就是比较特殊的一些方法,所以大家可以看到,一开始我们就看嘛,它只有100多行的一个。
29:01
一个合约,然后它的这个B它就就能那么高,所以而且甚至我们可以看到它里边大部分东西跟我们的EC20待率不就基本上就一样,对吧,就就是抄过来就可以了,它这个还不是去直接调用,去继承ERC20代币,它其实就是把那个代代码复用了一下,对。所以大家可以看到这个就是实现的都是ERC20的标准,但是大家就是怎么用都可以,就是这样的一种用法啊,大家如果看懂这个的话之后,其实至少自己去。如果以后有相关的工作要求说,诶,你帮我们ICO发个币吧,这这个肯定是没问题的,对吧,随便拿着这个来抄一下,就就就能发个一个币,所以很简单。好,那接下来我们就来看一看,好,这是就是我又把这个又贴了一遍,就是我们再回过头来回顾一下,我们一开始实现的这个简单的这个。
30:05
代币合约我们已经讲过那么复杂的合约之后,回头再看这个合约就非常简单了,对吧?我们定义了一个一个铸币者,然后最关键的就是定义这一个映射结构,这里面保存了每一个人他的代币数量余额。这是很重要的一个结构,然后我们还定义了一个事件,就是在转账的时候触发这个事件,那它的构造函数里边呢,我们这里是定义了铸币者是谁,那标准的代币协议里边都是在构造函数里边传进去给他多少,初始的提供那个总数是多少,对吧?当然了,就是我们要是ERC20的代币,就还有代币名称和代币符号。那后面我们就既然有铸币者,我们就有一个铸币方法,然后还有一个我们散的方法,也是我们也就是相当于我们ERC20代币里边的transfer方法。那它的时间都是一样的,当然我们这边少了一些安全性的这些考量。
31:06
那大家如果要是出于安全性的考虑的话,就学习一下标准的ERC20代币合约。好。好,那最后我们就来看一看这个ballot吧,就是一个简单的投票合约。那我们不光。以太网上的智能合约显然就是他,他做这个代币是最方便的,大家一看那个之后呢,就都是标准的一套体系就出来了,呃,那但是呢,我们在以太坊上能做的事情远远不仅仅是发一个币而已。我们还能做什么呢?投票就是一个非常直观,也是非常。就是非常符合智能合约定义标准的一个应用场景。呃,大家可以看一下,就是首先想一想我们这个投票。主要是干什么?那正常的一个一个应用应用场景,那肯定就是说大家投票去选举嘛,选一个什么样的人,大家一人一票去去投那。
32:08
更多的一个应用场景是什么呢?他可能是会就是呃。就是需要有一些委托投票。比如就是说我不光是自己可以投,我还可以委托给别人有我的这个权限,这就有点像我们ERC20代币里边的那种,就是授权。所以这相当于也是一种类似的东西,我们可以委托别人去投票。所以大家可以看到,这里面列出来就是投票,主要问题是你怎样将投票权分配给正确的人。然后呢,怎怎样防止这个投票被操纵,就是他投票是不是真正是自己投出来的。然后你是不是真正的把该投票的那些人给到他这些票。这是比较重要的一点啊,所以大家可以看到在这个里边。
33:02
选票票这个东西似乎也就有了一点跟代币相关的性质。所以类似于这样的东西,我们都可以用类似的合约来实现。好,那接下来呃,他的这个实现呢,就是下面这个简单的一个想法啊,就是我们为为每个投票表决都创建一份合约,所以我们要创建的也是一份就是通用的合约,然后我们要在它调用的过程当中。每次有一个投票,我们就调用一次这个合约,创建一个新的一个合约实例。是这样的,所以大家可以想到这个初始化的时候,我们应该去给他什么东西啊。呃,然后就是说谁去发布这个东西,那就是。谁就是合约的创造者,也就是这个投票委员会的主席。那他可以给每个,他有权利给每个地址投票权啊,这是一个基本的考量,然后呢,每个人地址后面的人,那就是每个人都可以选择自己投票,也可以选择把自己的票委托给信任的人。
34:16
这就是我们所说的委托投票的机制,这个ballot他说是一个简单投票,其实听起来好像还不简单对吧?呃,最后还有就是投票还要设置一个投票结束,结束时间,结束的时候呢,定义一个方法,定义一个函数,它返回获得最多投票的提案。这个我们把这个方法叫做proposal。整个是到底什么意思,我们这么空说确实是没有用啊,我们直接来看代码吧。这个代码其实我们不用敲啊,大家可能很熟悉,有些同学是不是看过。我们一进来的时候。
35:00
进到remix的时候,大家应该就见过这个合约,对吧?当时我们说它稍微有点复杂,我们没看。那现在我觉得我们应该有这个实力,也有这个动力去把它看一看,我们现在ERC20代币合约都看过了,肯定这个还是可以去了解一下的啊。好,那我们就来看看它的代码吧,代码尽管好像有点长,它也没长过那个C20嘛,所以我们就一点一点看吧。首先肯定是看前面的状态变量定义,但是有点累了吗?呃,我看好像如果要是我们一直这么讲,讲的有点要不大家先自己看一看,还是还是说我们等一下,还是自己来敲一遍这个代码。等一下还是还是我们自己敲一遍这个代码是吧?行,那我们就先来过一遍啊,我大概说一下这个代码结构是什么样,等一下我们自己实现,大家尽量可以不看它,然后我们再自己打开一个页面,自己先敲,敲到敲到觉得想不起来该怎么做的时候,我们再翻回来看一看,看看能不能把它实现出来,这个如果自己单独实现出来,呃,我觉得我们其实已经就是有很不错的实例,能够写一个相对复杂一点的。
36:23
呃,一个一个合约了,对吧,尽管这也只是一个简单。呃,那那可以,那我们就先运行一下吧,这个比较简单啊。对,大家如果要是直接看它的这个呃代码的话,可能大家会觉得有点有点完全不理解,那那我们运行一下,看看它这有些什么东西。运行之后,这里边出来的就是它的几个方法对吧,一个叫做delegate delegate是。代理的意思。是吧,所以这就是委托委托代理。
37:00
代理这个方法。它的作用是什么呢?就是你可以把自己的投票权。委托给另外一个人。可以让别人代代替你去投票。然后呢,还有一个方法叫give right to won't。那这是给人分配票,给人分配投票权,那这肯定就是只有主席才有这个权利了,对吧?好,我们看在上面。Give right to vote,这个比较简单,大家一看他就message,一定要等于Chairperson嘛,对吧,就主席嘛。它是叫Chairperson是吧,就是如果你这个不等于的话,它就return,大家可以看它这个都是很老的写法,都没有用require之类的东西。所以我们等一下可以自己把它改一改,按照我们就是学习比较新的这个方法来把它改一改。如果大家。不想用require的话,也可以用if,这肯定是可以的。
38:00
然后下面有一个vote vote,那就是投票了。我去投,投给谁,这里他投票的对象应该不是人啊,他投票的对象是proposal,就是提案。这就好比是我们在这个就是所谓的议会啊,或者说是我们大家一起想要去做一个什么决定的时候。我们那个假如说我们整个那个学业结束之后,我们大家想要去一起去做一个什么活动,有几个提议,一个是去聚餐,一个是去那个什么郊游,对吧,这就是不同的提议,到时候我们大家投哪个。可以把票投到不同的提议上,所以它整个的这个架构是这样。所以vote这一个。这个方法。它主要就是哦,后面to。就是你给哪个提议投票。就调用这个方法。呃,当然了,最后就是有一个winning proposal,就是最后获胜的,这个proposal是谁?
39:01
是,是哪个提案?所以说这就是我们这个投票的这个简单的一个架构。大家可以先在这里玩一玩,看看输入什么样的参数,能把这个就是可能能帮对对大家有有理解这个程序有所帮助吧。
我来说两句