00:00
上节课我们已经讲了,就是简单投票怎么应用在trouble口上面,那这节课我们的重点就不会放在trouble口了,当然就是说窗口这一部分的部署其实还是一样的,大家想要去新建一个项目目录的话,那可以新建一个项目目录,还是跟昨天一样,Travel on box去下载一个webpad,那如果大家不愿意的话,直接在我们昨天的基础上去改也是可以的。好,接下来我们先来看一看今天我们到底要做一个什么东西。那基于token的投票,我们首先就要先说一下这个代币就是token对吧?代币和支付这个之前其实我们讲到以太坊应用的时候已经给大家讲过,而且我们还给大家看了ERC20的整个的那个协议的内容,对吧?呃,那在这里呢,给大家再多介绍一下在现在的以太坊应用当中可能涉及到的一些代币应用,那本身token其实就是一个合约了,我们都已经看到了这个ERC20标准,所以token的这样的一个合约,它是想要做到什么样的功能呢?主要就是想要在以太坊上构建自己的数字资产,那这个资产就有可能是有可能是黄金,有可能是别的一些东西,比如说像下边大家看到的股票,那这里的几个应用其实都很典型,就现在其实都已经有人在做这些东西,当然了就是可能整个的这种传播度和大家的认可度还没那么。
01:31
高,所以大家也可以想一想,就是以后如果有这些方面的,这个就是创业的方向也好,或者说自己工作之后,在工作当中可能遇到的方向也好,自己也可以想一想,就什么东西可以把它投肯化做成,就是利用我们这样的代币形式,可以起到一些特特别的作用的这样的一些点啊,首先大家看有这个购呃购投Ken,那就是黄金代币,这种代币呢,就相当于是银行它有这个黄金储备,然后就相当于拿着这个黄金储备作为抵押去发对应的token,这其实有点像我们之前说的稳定币对吧,就相当于银行,哎,我有一美元,我就发一个我自己的代币,我相当于是拿这个做做背书的,这是一个应用,这就相当于拿着,这相当于有点像纸黄金的意思了,呃,大家如果熟悉这些金融产品,金融衍生品的话,这就有点纸黄金的意思啊。然后还有一个应。
02:31
更就是股公司股票,公司股票是什么意思呢?就是说公司他去发行一个自己的代币,然后拿着代币去做募资啊,这就是其实大家看这个应用是什么呢?这就相当于是我们ICO对吧,ICO的时候其实就相当于是一个发币的公司,呃,公司他会拿着自己的代币作为股票来分发给其他去做众筹的人,比方说我们自己构建一个自己的币,比方说我们就叫就叫硅谷币,或者叫什么币,对吧,构建了一个这个币之后,我们给别人讲一个故事,那很多公司不都是写白皮书,讲故事嘛,给别人讲一个故事就是说啊,我之后这个项目要做成什么什么样,对吧,我可以做到一个什么什么样的一个区块链项目,我可以把多少多少人加入进来,这个未来有多大多大的潜力,那大家如果其他人听了之后,诶,投资人一听这个项目不错,听起来好像是这么回事。
03:31
觉得能赚钱,那么就会用自己的真正的资产去购买,这个就是发行的ICO的这个姿态币,对吧?发行就购买我们的硅谷币或者是什么币,那这个过程相当于就是购买了一个公司的股权,所以这个过程当中,大家所谓的ICO,它其实是把token当成一个公司股票来用的。本质上金融本质上是这样,本身ICU大家知道这ICU叫全称叫什么?ICU叫initial coin,呃,Offer就是首次首次货币发行,首次代币发行,它的这个名称是从哪儿来的呢?是从这个公司上市发行股票那个IPO来的,IPO的概念是首次公开发行嘛,所以就相当于是把自己公司的股权分发成股票,然后让大家公开去售卖,所以ICO的概念其实就是从这来的。那我们今天想要去给大家讲的这个基于token的投票,其实也有点这个意思,就相当于,呃,你先去,当然这个不是股权啊,但是有点像是投票权,是用这个token去分发下去的,让大家用token去购买,就购买token,获取相应的投票权。
04:53
那当然我们这里边是投票,你如果要是相应的做一些扩展的话,可能也就可以我有投肯就可以去做公司决策,那这个其实就跟公司股东的性质是一样的,这其实是一个典型的应用场景了,那除了像我们前面说的这个黄金代币,还有公司股票之外呢,还有一个典型的应用就是游戏货币,这这个我们其实大家玩游戏的话,可能很熟悉了,对吧,就是传统的游戏行业里边,其实特别是像一些网游什么的游戏,那经常就大家当然一开始可能要充点卡,后来的话,其实在很多游戏里边,他自己就有自己的这个充值的货币,对吧,就相当于我们在游戏里边你花多少人民币兑换多少金币,经常都有这样的玩法,所以这种货币,它其实之前,呃,为什么很多人说这个游戏行业有可能是也是区块链有可能先落地的一个行业呢,就是因为我们大家如果之。
05:54
该玩过游戏,玩过这个网游什么的话,肯定就会有这种感觉,就是你游戏里边那个那那个代币,或者说那个货币,那个金币,对吧,那完全就是游戏公司他他定死的,你根本不知道他什么时候就能就能一下子发多少出来,对吧,他说你什么当天充值最多的人能拿到什么什么奖励,你会发现你充多少钱你都拿不到那个最高的奖励,因为你会觉得总有一个他们公司内部的员工,总有一个这样的人在后台操控,他改个数就能拿到更多的充值,更多的钱,对吧,然后就把你顶掉了,呃所以呃,就是大家在就会发现玩游戏的时候有各种各样的这种这种考虑,就是说你一个中心化的机构,所有的这种所谓的代币,这种金币的发行,你都不公开,我根本不知道你怎么发出来的,那我怎么能信任你这个东西呢,对吧,我充钱真金白银的充进去,然后你那边随便改个数,然后就就就相当于你就。
06:54
把我这个相对应的权限都拿走了,这个肯定大家是会越来越不爽的,所以很多人就会在这方面动脑子,就会觉得,诶我们既然是这个区块链嘛,所有的所有的东西都写在合约里面,所有的货币发行,所有的这个转让都是公开可见的,所以那这个这种情况如果要是用在游戏里边的话,那我之前发行多少代币就相当于历史的,那你这个你拿钱去买,至于我说你一天能充值多少就给你多少奖励,这都是公开可见的,所以这个在信任方面其实是能够解决很大的问题,呃,当然现在很多人在做这个游游戏方面的东西,但是可能也是因为这个性能方面的问题,对吧,所以他真正在游戏里面做应用,现在还是真正的落地还是少啊,这是另外一个应用的领域,呃,接下来还有一个,这个叫做高。
07:54
Token的一个一个项目,它是以太坊里边已已经是一个真实的项目了,就是真实的一个token,它是干什么呢?它是通过租售空闲的CPU来赚取token,所以这个就有点像是,呃,一个一个云服务器,对吧,就好像是一个大的矿场,矿池,你把自己的算力加进去去去分一杯羹,这种感觉一样,有点像这样啊,所以就是很多大家都在想不同的这种创业点,给大家提供一些思路,然后最后还有一个就是所谓的这个忠诚度,或者是这个信誉度之类的东西,这就有点像我们的这个信用积分,芝麻芝麻信用分这样的东西了,因为本身区块链天生就是可以解决信用问题的嘛,所以我们看你可以在一个商店去购物,然后呢,商店可以发行这样的ton来作为一个所谓的忠诚点数,或者说叫一个信用积分,那这样的东西也是可以作为token去进行流转的,因为它可以作为,这就看这个商店可以定义。
08:54
走了对吧,积分你可以兑换别的商品,或者是在利益三方市场去售卖,或者它还可以回收,呃,换成现金,所以这些东西都是token很重要的一些应用场景,当然现在就是可能更多的还是受限于这个性能,受限于这个交易速度,所以所有想到的这些东西还都没有,就是杀手级的应用落地,那以后可能未来呃,两年三年,或者说五年十年,相信这些东西都会就是真正的落地,然后冲击到我们的生活,呃,当然就是这个过程,大家能不能赶上这个,呃,下一波的这个所谓互联网,下一代互联网的潮流,那就看大家愿不愿意投身到这个技术当中去。
09:40
好,我们就是应用先说这些啊呃,下面这里还专门给大家又说了一下ERC20,那这个大家其实都已经很熟悉了,这就是一个代币标准,我们只要是符合这样的ERC20的代币标准的话,所有的token之间转换,互相的这个转换其实是非常容易的,只要大家再写一个互换合约就很容易实现,所以其实现在还有一些。
10:05
呃,一些项目他做什么呢?就是做所谓的钱包,线上钱包和这个交易所,呃,这也是一个创业,就是创新的点,当然就是说做的人很多,真正就是把这些东西做成,做好的还是少,这当然也是,就是大家都没做好,那就也都是机会嘛。也都是大家之后可以去创创业或者说去工作的时候找到的一些点,好,那接下来我们就来说今天的内容啊,今天内容我们主要是要在我们的voting这个投票项目里边包含token,那包含token我们主要是要做什么事情呢?大家看主要就是做这么三件事情,第一个我们之前的数据结构太简单了,我们就定义了一个voter对吧,然后定义了一个它的投票数,那现在我们要用我们的结构体structure来定义更加复杂的数据类型,然后我们把它要存储到区块链上去。另外第二点我们要实现投票的token化表达。
11:08
什么意思呢?呃,其实简单来说就是我们之前是一人一票,那你相当于一个人一个地址,那就相当于是一个一个一个票了,对吧?这个本身我们投票的这个过程当中,票这个概念没有在里面得到实现,就相当于一个地址一票,那我们现在呢,就相当于每个人利用token这样的表达,相当于每个人投票的时候有了权重,大家还记得那个我们一开始官方给的那个ballot,它也是有一个权重的,对吧,它是有一个weight,那我们现实当中这个wait你怎么样去定义呢?官方的那个ballot里边是直接那个owner,或者说那个主席Chairperson,对吧,直接给他定义死的,那我们现实当中可能不应该这么去做,那你怎么样去做呢?我们用token化。就是说你手里有多少通,你就有多少话语权,这跟公司的组织形式很像,很接近,对吧?你手里有多少股权,你在股东会里面就有多少话语权嘛,好,那最后还有一个就是我们要把这个token投票应用和这个以太坊上的支付全部串起来,然后构建一个完整的D啊,当然这个项目其实大家如果已经看完的话,会发现后面其实也还是不大啊,就整个的合约,我们也就是一个合约,然后总共的行数,可能大家可以先瞄一眼啊,这个行数可能也就是个,因为我这个页面比较小吧,大家如果写开的话,可能也就几十行,我不知道有没有100行,可能都没有100行对吧,也就几十行,目测可能也就是四五十行,五六十行,所以这个合约相对来讲还是比较简单。
12:48
那大家这个相当于我们还是属于就是初步上手的一个一个项目,但这个已经不是我们之前的简单投票了,这就相当于真正可以说是一个有实际应用场景的项目,好,那么我们接下来给大家说一下这个项目的一个描述啊呃,就是说我们到底这个基于投粉投票,它是一个什么样的理念,它是一个什么样的项目场景,呃,首先就是说。
13:17
先从普通的选举说起,就像我们这个所谓的这个美国大选啊什么的,一人一票对吧,去首选选这个国家总统,那在这种情况下呢,就跟我们的简单投票是一样的,每个人都有一票,没有权重,没有别的份额,大家就是按人头来算的。那另外还有一种就是我们刚才提到的加权投票,这种英文的名字叫wity的voing,所以就是我们官方示例里边ballad的那个投票项目,每个人有一个位,对吧?啊,这是这个东西,这种东西这种形式经常就会用在这种,呃,公开上市的公司,就所谓这种股份公司里面,经常就会有这样的用法,因为它的所有公司的产权,它的决策权是按股权来划分的,那在这些公司呢,就是股东就用股票来进行投票,比如说你如果有,比方说啊,你有阿里的,就是这里举个例子,你有1万股阿里。
14:17
的股票,那你在阿里的股东会里面就相应的就有1万个投票权,1万个单位的投票权,那假如阿里的总共的股权,它划分为100万份,你的1万票就相当于你有1%的决策权,对吧?你说出来的话,你就比只有100票的那个人,那就要重要得多,所以这就是我们平常这个每个人说出来的话分量不一样啊,所以这是在公司里面,特别是股份公司里面常见的一种投票的方式。好,那我们接下来说一下,就是用一个例子来说一下这个项目细节啊,比如说我们有一个叫做block的上市公司,那我们的这个应用场景是什么呢?就是公司里边有三个职位空闲,分别是总裁、副总裁和部长啊,但是这个没说什么部长是吧,所以我们现在的做法是什么呢?就是三个候选人来竞选这三个职位啊,所以大家就想到啊,我们之前给的。
15:17
那个爱ice Bob,凯瑞对吧?三个候选人过来,然后候选人是定了,但是我们要根据他们得票数来决定最后谁是总裁,谁是副总裁,谁是部长,那这个时候我们就就会发现,我们每个人手里面得的票,手里边拿着票数不同,可能我们就可以给不同的人分配不同的票,对吧。这个时候这个token在这个数量上就会有这样这样的一个应用体现了,比如说大家可以看到啊,就是我们构建一个项目,然后发行一下公司的股票,然后这个股票就相当于是token,对吧,每个人你都可以拿自己的钱去买,认购这个股票,买完了之后,你手里边有的股票数,就是你能给候选人投票的票数,那比如说你现在买了1万股的话,你可以给爱丽丝投5000票,给鲍投3000票,给凯瑞投2000票,那可能你在心里边,你认为我就应该是爱丽丝去当这个总裁,但是呢,其他两个人我觉得他们也还可以,所以我不把票全投给爱ice丝,所以我给其他人也分配一些票,分配到他们啊这些,其实这种方式怎么说呢?大家如果现在看一些娱乐节目,会发现有时候也会出现这种情况,对吧,比方说两个歌手去去PK的时候,说导师里边有十票。
16:43
这个投票权观众是一人一票对吧?导师手里边有十票权,他可以自由分配,我可以给这个八票,给这个两票,也可以给每个人各五票,所以大家会发现这就相当于是一种ton化的一种表达,对吧?在单位的token,每个人手里边你可以有多个token去做分配啊,这是我们这个项目的一个背景和一个细节的描述,那我们具体来讲给大家说一下怎么样去实现呢?那这个实现的方式就是首先我们会创建一个与之前类似的一个窗口项目了啊,而且就是说大家可以看到也会有窗口里边,在migt里边m migrations里边的那些脚本,对吧?我们用到的还是那个deploy contracts2打头的这个脚本,然后我们同样还是要有一个voting.so的so源文件作为我们的合约。
17:39
另外我们还要有index htl做我们的这个,呃,HTML的网页,做我们的前端页面,然后当然了,呃,这里写的是app.js,但这其实是ipad打包之后的,对吧?我们要要去用的其实是index.js,那当然CSS这个是我们的样式文件,大家可以先不管好。接下来呢,我们真正要做的是什么呢?首先初始化的时候我们不能把Alice Bob carry这些就是直接去写死,对吧?所以我们是初始化的时候把它传进去,初始化的时候去把这个选举中竞争的候选者初始化掉,然后我们对于公司要投票的股东。
18:26
我们会先初始化,他们需要持有这个公司的股票,所以我们在初始化的时候呢,也得先发行公司股票,这就相当于我们去构建一个子代币合约一样,我们要定义一个总数,对吧,再定义一个代币总数,然后我们还得定义这个token,我们的token他是不是应该给这个,呃,我们的投票人,也就是说各个股东他们应该可以买这些token,对吧?要不然的话,他们怎么样获取这些投票权呢?所以说我们还得定义怎么样去买,然后我们还应该有函数去查询当前的投票信息,当前每个人有多少票,每个人投给了哪些人,然后他们还剩下多少票,多少token,对吧?所有的这些信息我们都应该能够查询,都应该能够显示出来,呃,所以说为了跟踪我们现在的所有的这些数据啊,我们可能会用到一些mapping,然后还可能会去用到一些结构体。
19:33
好,这是我们一个大概的一个分析和数据结构的一个设计,就是大家在做一个项目的时候,首先应该想我们这个项目应该做成什么样子,我们要解决的应用场景的核心的目的是什么,然后就去想我们怎么样去做,我们要引入什么样的数据结构,对吧,我们要有什么样的函数,什么样的方法,所以这是我们整体的一个思路啊,然后其实我们就可以画画出来这样一个简单的一个流程图,或者一个应用的这个示例图了。
20:03
我们应用的时候是一个什么样的场景呢?首先有一个我们的就是部署合约的一个账户ACCOUNT1,它呢会去发起一个部署交易,我们把合约布到这个区块链上来,部署合约的时候,大家会发现我们就应该定义好我们应该total tokens1共有多少多少票,对吧?有多少个股权,有多少代币,所以这个是我们定义好的,就像我们发行一个子代币的时候,一般情况也是先定义好你初始的那个,呃,大家记得在BC20里面那个叫total supply对吧?你一开始提供的这个代币总数是多少,你不能乱发吗?那接下来大家看到我们还应该定义这个合约里边应该有一个balances。这是什么东西呢?这就是说我们还应该知道当前我们这个合约上面还剩下多少token,对吧?被人买了多少,还剩下多少,这个应该也是得有记录的,要不然别人再来买的时候,我不知道我这里边是不是超过我的提供的总数了,对吧?这个所以一定是要记录下来的,那最后当然了就是还应该有一个以太余额,因为我这个合约应该是需要能够接收以太以太币,然后让大家去购买这个token的,对吧?所以这个过程也是大家应该能够想到的,好,接下来已经部署上去之后,我们的这个合约怎么去用呢?大家就会发现,首先。
21:35
我们的普通账户,我们的股东他想要投票,先拿以泰去买代币,先去买头Ken,所以大家看到我们会定义一个buy这样的一个一个呃函数,一个方法,那这个BY会传递什么东西呢?那当然就会把这个以太余额带过去,对吧?那这个东西它在调这个函数的时候,还应该给什么参数呢?还应该给他想买多少token对不对?
22:03
所以大家注意啊,就这里我们应该是要去定义好的这样的一些东西,大家可能就会想到,我既然有这个buy的这个方法,我可以去拿着以太去买token,那是不是我还得定义这个一个token多少钱啊,是多少以太,对吧,他们之间应该还得有一个兑换,兑换汇率的,所以这个也是我们应该合约里面得实现出来的一个东西。好,呃,那么所有的人都可以去调这个拜这个方法,把一个以太传给这个我们的合约,然后调用合约的拜这个方法,合约就应该给相对应的这个账户里边,那么这里我们接收到以太了。这里balance已经加了,对吧,但是呃,我们就应该把对应的token发给这里的count,对不对,所以我们这里的total token是不变的,这是我们提供的总数,那balance这是余额,当然就得减,对应的就得减,对吧?所以大家其实可以看到这里这个例子里面,它是接收了16个以太这里传进来的。
23:10
这里传进来的哦,一五十对吧,所以然后呢,他返回的是返给他们1600个token,少了1600个token对吧,所以大家能想到这里定义的这个token一个token是多少一台啊,100亿台吗。0.01以太是吧,对,一个以太是100个token对吧,这样的一个汇率。所以大家看,如果大家想把这个改一改,去做一个游戏应用的话,呃,你自己去发这个游戏代币,发金币其实也是一样的,对吧,你肯定得定义一个,你拿以太来买我的这个游戏币,那你定义一个汇率嘛,好,那么接下来大家就会发现你这边已经有了token之后呢,肯定我还有一个关键,最关键的动作就是有了token之后可以去投票了。
24:02
投票的时候跟我们之前一样,你去调一个vote vote for candidate,你要传进去给谁投,然后还得传一个参数,这个时候不是一人一票,所以说你还得跟上,我给他投多少票啊,当然这个投票数不能超过你自己手里边有的票数,对吧?啊,所以大家可以看到这里边这个account里边的他就应该有一些参数,就是我当前手里边已经买了多少token,然后还应该有一个参数记录他给每个人投了多少票,对吧?所以大家可以看到这里边还定义了一个tokens used to candidate,也就是说我为每个候选人投了多少票,这是一个数组。他如果给这个这里是一个Nick啊,给这个Nick投25票的话,我就比方说Nick是第二个候选人,我就零二十五零,这就表示我给三个候选人分别投的票数。啊,所以我们能想到肯定会有这样对应的一些数据结构啊,那投完了之后呢,大家就会发现我们在合约里面应该也得有一个变量,记录当前的这个投票的结果对不对,所以Nick那边的票数我们也得记下来,所以每个候选人都应该对应一个票数,呃,那我们能够想到这个可能我们就用一个mapping去实现就好了,对吧?好,所以这就是我们整个这个项目大概的一个一个流程和我们初始的一个想法,因为这个项目相对来讲还是比较简单,所以说我们就直接往后看吧,如果复杂项目的话,可能我们这个流程图就得画的很细很细,对吧。
25:41
好,接下来我们说一下,就是一些项目准备,那首先还是这个窗口的一个初始化了,那这个跟之前一样,我们就不说了啊,就是首先我们这里给的例子还是按照标准的步骤来创建一个新的目录,比方说叫token base的voting de,然后呢,我们去travel on box,一个wepa,然后看一下里边东西,我们就可以把这个,呃,默认的这个convert lab和ma Co就可以删掉了,对吧,这是我们一开始的一个状态啊。
我来说两句