记账是我们日常生活所必不可少的一项基本工作,同时记账工作也隐藏在我们生活的方方面面,小到交一笔水电费,大到企业中复杂的会计核算,传统的记账方式离不开人和中心化的计算模式。
随着计算机网络社会的发展,我们每天更是会和无数的陌生对象建立记账交互。各类中介帮助我们很好的完成了这些工作,当然,我们理所当然的为中介提供的信用服务支付了一部分费用。
这类中介包括银行,支付宝、微信等第三方支付渠道。
中心化的记账体系给我们提供了极大的便利,我们只需要不断的为这些中介付出我们的时间,购买他们的服务,使用他们的产品,并且信任他们就可以了。
当我们和银行进行交互时,我们付出了廉价的资金,使得银行通过我们存储的资金获得利息差。
当我们和支付宝打交道时,我们不知不觉将所有的理财需求,购物需求,生活需求都交给了他,并且交付给了他们珍贵的数据记录。
我们并不能否认这种第三方的金融中介为我们提供了极大的便利,但是,对于完全的信任、更低的费用、更大的匿名性的需求,一直存在于我们的底层诉求当中。
区块链账本技术
区块链就是在这种背景下孕育而生,它提供了一种新型的记账方式,通过计算机科学,博弈论,密码学等学科的交互,产生了一种去信任的、匿名性的、低费用的交互模式。
区别于传统的中心化的记账手段,区块链账本技术实现了节点共同参与记账,记账结果可追溯,匿名性等功能,从而为我们提供了一种新的解决方案。
举个简单的例子:
传统的记账模式,例如,你去银行存取钱,你将银行卡交给银行柜员,告诉他要取100元,银行柜员接过你的银行卡,刷入你的银行卡信息进入你的账户系统,执行取款操作,你的账户中就会减去100元,同时付出100元现金。
在这个过程中,银行柜员凭借着银行中心化的信用完成整个记账。银行柜员因为帮你执行了记账工作,得到他的报酬,并以工资的形式进行激励。
分布式记账是一种去中心化的记账方式,同样,我们可以理解你进入一个没有信用背书的银行,但是这个银行有很多柜员,你告诉这个银行系统需要取100元现金。
系统会按照一定的共识算法来指定某一个柜员进行记账,柜员在记账完成后,将结果信息告诉其他的所有柜员,最后进行同步确认,那么每一个柜员都会有一个账本记录了你的支取信息,而那个实际记账的人获取记账酬劳,并用系统内的通证对他进行奖励。
当柜员的数量足够多时,篡改账本信息将变得不可能,因此,在这个过程中就完成了分布式记账。
那么当信用环节得以解决,很多由于中介环节产生的费用都可以通过区块链的技术降低,甚至消除。
共识算法
在区块链的记账体系中,共识算法是核心部分,是参与该区块链体系中的所有节点都默认遵守的一种规则。是区块链系统中的节点之所以能够共同维护整套账本体系的基础。
也就是说,共识算法决定了谁来进行记账,谁来进行验证,从而保证记账结果的准确性。
我们可以从上文的例子中看到,当我们将取钱的指令输入到系统中后,系统会按照一定的共识算法来决定谁来进行记账,那么问题来了,我们该如何设定这个算法,从而保证所有节点的公平,进而使得更多人愿意来进行参与记账呢?
截至到目前为止,应用的比较成功的共识算法无外乎是POW、POS、DPOS、PBFT等。但是不管哪种算法,都并不是那么完美。
各类共识算法
POW(Proof of Work)——工作量证明
这是一种根据你的工作量来决定,你是否能够被选中进行记账的共识算法。而所谓的争夺记账权,便是在这种共识算法中产生的概念。
简单来说,当我们向系统提交取钱指令后,系统会为区块链节点出一道十分难解的密码题,只有解出题目后方能获得记账权。
再举个简单的例子,在一个500人的微信群里,有一部分人会不定时的发布附带解题条件的任务红包,剩余的人会不停的抢红包,那么决定谁能抢到红包的条件便会有,网速是否足够快,设备性能是否足够好,答题速度是否足够快,当然,不停的开着手机还会浪费电。
对于正常的POW共识算法的区块链网络,由此而产生的便是计算机算力的比拼,资源的比拼,从经济学的角度来看,只要回报足够,这种共识算法是十分合理的。
但是,POW算法的最大的弊病便是效率极度低下和无尽的资源浪费,无法满足大规模商用的基本要求。
POS(Proof of Stake)——股权证明
这是一种根据你的持币数量来决定,你是否能持续获取记账资格的共识算法。当你的持币量越多,成为记账节点的概率就越大。
这种共识算法还类似于财产储存在银行,这种模式会根据你持有数字货币的量和时间,分配给你相应的利息。
在股权证明POS模式下,有一个名词叫币龄,每个币每天产生1币龄,比如你持有300个币,总共持有了10天,那么,此时你的币龄就为3000。
POS算法下,当我们的币龄越大,成功抢到记账权的概率就越大,而每当成功记账后,币龄将进行清空。
这种共识算法虽然避免了资源的浪费,但是PoS也存在明显的缺陷:
当持币量越多,持有时间越长,币龄就越高,越容易挖到区块获取记账权并得到激励,持币少的人基本上没有机会,这样整个系统中,权重大的节点,话语权将极大,埋下中心化的隐患。
DPOS(Delegated Proof of Stake)——委任权益证明
这是一种类似人民代表大会的制度,起初由所有节点投票,选出一定量的超级节点,所有的超级节点权力相同,并且轮流行使记账义务。
如果代表不能履行他们的职责(当轮到他们时,没能生成区块),他们会被除名,网络会选出新的超级节点来取代他们。
这种共识算法极度的中心化,特别容易滋生腐败行为,因而背离了区块链的去中心化的思想。
那么,是否存在某种共识算法,即能保证效率与公平,又能实现去中心化的效果呢?
我们可以看到,无论是何种共识算法,他们所要解决的问题都是选出一部分或一个节点来参与共识或者进行记账工作,从上面的三个共识算法中可以看到,这个过程会因设备配置情况、持币情况、信用状况等不同因素所影响。
某些算法耗费的过度的资源,某些算法牺牲了一定的公平,某些算法容易滋生腐败。
经过本人的研究和发现,VRF(可验证随机函数)和区块链共识算法的结合能很好的解决部分问题。
VRF(可验证随机函数)
这里我不用过于专业和严谨的方式来表述,只希望大家能看懂和理解。
简单来说,VRF是一种帮助进行随机选择节点的工具,他是一个黑箱子,当你往黑箱子里仍进去一个东西,黑箱子会随机生成一个结果。
例如你往黑箱子里扔进去一个苹果和一个香蕉,他会生成一杯草莓牛奶。
当你往里扔进去不同的东西,结果一定是不同的。而扔进去相同的东西,结果一定是相同的。
当然,结果会均匀的分布在一定的范围内,也就说,输出的结果在一定的值域范围内。
那么,我们如何将VRF运用到共识验证当中去呢?
VRF的方式是,让各个节点轮流往这个函数(黑箱子)里填入输入值,输入值为自己的私钥和一个全网都知道的随机数。如果输出结果大于某个数(阙值)。那么就由该节点进行记账。
例如,参与竞争记账的节点有100个,并假设本轮为第5轮记账,那么每个节点轮流开始往VRF函数中输入自己的私钥和一个全网都知道的随机数,比如是5。并规定,谁先由VRF产生的随机数大于10,就是本轮的区块打包者。
假如前20个节点的输出值都小于10,而第21个节点的输出值是11,那么21号节点便获取了本轮的区块打包权利。
说到这里,便会出现一个新的问题,只有第21节点知道自己生成的随机数是大与10的,其他节点并不知道。那又该如何验证并让所有节点都认可这个随机结果呢?
这就是VRF区别于一般的随机预言机的地方,它多了一个非交互的零知识证明。
当第21节点确认自己是区块打包者时,他除了需要将随机结果进行广播外,还需要广播一个零知识证明,以便表明这个随机数的确是由他生成的。
说到这里,可能大家又有点迷糊了。我们再来理清下思路。
正常情况下,如果我们需要验证结果是否是某个人生成的,是需要将他的私钥和公开的随机数填入VRF中,通过输出结果来判定的。
但是,显而易见,私钥是不可以告诉别人的。那么,我们来看看,零知识证明是如何帮助节点进行验证的?
零知识证明
零知识证明(Zero—Knowledge Proof),是指证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。
在上面的例子中,第21号节点即是证明者,而其他节点就是验证者,而零知识证明便可以使得第21号节点在不透露自己私钥的情况下,使得其他节点相信他就是指定随机数的生成者。
首先,我们举个简单的例子来说一下什么是零知识证明。
北京市的某区块链小学六年级一班的正在上体育课,可是足球被锁在了教室里,小明在锁教室门后,没有将钥匙带在身上,而是将钥匙放在了一个谁都不知道的地方。
同学们喊着说谁把钥匙拿出来,打开教室的门。
小明如何不拿出钥匙便能证明钥匙在他那呢?(假设钥匙有且只有一把)
很简单,小明只需要去将足球取出来就可以了。
而这个足球便是零知识证明。
由于在VRF(可验证随机函数)中,每个节点起初会根据要求生成一组包含公钥和私钥的密钥对,他们有着一一对应的关系,私钥是VRF输入值的一部分。
公钥是密钥对中公开的部分,私钥则是非公开的部分。公钥能加密可以用相应的私钥解密的数据。
每个人都可以获取你的公钥,并对任何数据进行加密。但是加密后的数据只有私钥可以进行解密。
那么,我们可以试想一种零知识证明的场景,上文中的第21号节点,即区块打包者,将一组数据公布出来,让所有人可见,而自己不看。随后,通过自己的公钥对该数据进行加密,从而得到一个新的数据。
此时,第21号节点只需要用自己的私钥进行解密,并将加密内容再次公布,即可让所有验证者信服了。
当然,真实的场景或许并不是如此,这里只是为了让大家更清楚的理解。
总的来说,VRF(可验证随机函数)一共包含了四个部分:
1、节点首先生成一组包含公钥和私钥的秘钥对。
2、通过私钥生成随机数,并确定区块打包节点。
3、区块打包节点广播随机数和零知识证明。
4、其他节点进行验证。
VRF的目的是要生成一个真正随机而且无法被预测的值,从而尽可能的保证安全性。简单的随机抽取很容易受到女巫攻击,攻击者可以廉价找大量的傀儡机来增加自己抽中的概率。
这么看来,VRF对于共识算法的优化的确有很大的帮助,并在安全性、能耗、效率方面着实取得了一定的突破。