区块链简介二

Posted by xuguangjin on January 22, 2018

共识算法

君子和而不同,小人同而不和

共识机制的源头可以用两个传统问题来区别,一类是“类两军问题”,一个是我们之前讨论过的“拜占庭将军问题”。两者的本质区别在于,拜占庭里存在作恶问题,而两军问题是单纯的共识问题

  • 类两军问题:古代有两个相距很远的军队要传递信息,蓝军派遣一个信使去跟红军说:有本事把意大利炮拿过来!红军收到后回复蓝军说:收到指令。蓝军要给出确认答复:知道你收到指令了!红军继续给出答复:知道你知道我知道指令了!
  • 拜占庭将军问题:略

PoW作为比特币里最经典的设计,过去已经描述,本次暂且不表。下面我们只介绍两个共识算法,PoS(Proof of Stake)和Paxos。

Paxos

Paxos 问题是指分布式的系统中存在故障(fault),但不存在恶意(corrupt)节点场景(即可能消息丢失或重复,但无错误消息)下的共识达成(Consensus)问题。因为最早是 Leslie Lamport 用 Paxon 岛的故事模型来进行描述而命名。Paxos 被广泛应用在ZooKeeper 等系统中Lamport 因此获得了 2013 年度图灵奖。

故事背景是古希腊 Paxon 岛上的多个法官在一个大厅内对一个议案进行表决,如何达成统一的结果。他们之间通过服务人员来传递纸条,但法官可能离开或进入大厅,服务人员可能偷懒去睡觉。简单的描述,问题就是

  • 我们要通过民主方式做决议
  • 提议的人可能故障不干活,投票的人也可能出故障不干活
  • 如何在存在故障的情况下,只要51%的人在干活,就能做出最终决议

两阶段的提交

  • 准备阶段:提案者发送自己计划提交的提案的编号到多个接受者,试探是否可以锁定多数接受者的支持。接受者时刻保留收到过提案的最大编号和接受的最大提案。如果收到的提案号比目前保留的最大提案号还大,则返回自己已接受的提案值(如果还未接受过任何提案,则为空)给提案者,更新当前最大提案号,并说明不再接受小于最大提案号的提案。
  • 提交阶段:提案者如果收到大多数的回复(表示大部分人听到它的请求),则可准备发出带有刚才提案号的接受消息。如果收到的回复中不带有新的提案,说明锁定成功,则使用自己的提案内容;如果返回中有提案内容,则替换提案值为返回中编号最大的提案值。如果没收到足够多的回复,则需要再次发出请求。接受者收到接受消息后,如果发现提案号不小于已接受的最大提案号,则接受该提案,并更新接受的最大提案。
  • 一旦多数接受了共同的提案值,则形成决议,成为最终确认的提案。

PoS

权益证明(Proof of Stake,简称PoS)由Quantum Mechanic 2011年在比特币论坛讲座上首先提出,后经Peercoin(点点币)和NXT(未来币)以不同思路实现。 PoS的主要理念是节点记账权的获得难度与节点持有的权益成反比,相比PoW,其在一定程度上减少了数学运算带来的资源消耗,性能也得到了相应的提升,但依然是基于哈希运算,竞争获取记账权的方式,可监管性弱。该共识机制的容错性和PoW相同。它是PoW的一种升级,根据每个节点所占代币的比例和时间,等比例地降低挖矿难度,从而加快找到随机数的速度。

PoS的优点:在一定程度上缩短了共识达成的时间;不再需要大量消耗能源去挖矿。 PoS的缺点:还是需要挖矿,本质上没有解决商业应用的痛点

小结

直接说结论,第二代区块链无论如何改进,都无法逃脱PoW的根基带来的宿命。PoW带来的资源浪费是致命且不可或缺的,没有资源浪费就没有稳定性,存在资源浪费就会带来效率问题(需要长时间等待达成共识,且存在海量重复运算或无效运算)。

本节内容引用

《区块链技术指南》

《区块链数字货币的9种共识机制比较》 作者:刘杨,来源:知乎,著作权归作者所有。

零知识证明

知之为知之,不知为不知,是知也

之前我们也提到过merkle tree,也算是一种零知识证明,用途是不拿到所有区块的情况下证明某一个区块的有效性。在以太坊中,区块的组合方式进行了更为优化的处理,在更大的程度上降低了客户端对区块的需求。

本次要讨论的内容,是由zcash首创的、以匿名为目的的零知识证明。比特币的存储本质上是公开账本,任何人都可以通过这个账本追溯到任意比特币的全部历史流向,所以理论上,比特币的匿名性稍微存在一点点问题,如果一定要刨根问底,再配合上ip地址,理论上可以追溯的比特币的真实持有者(前提是有一定的交易流通行为,中本聪这种0交易者不可追)。

“零知识证明”的定义是:证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。比如,A要向B证明自己拥有某个房间的钥匙,假设该房间只能用钥匙打开锁,而其他任何方法都打不开。这时有2个方法:

  • A把钥匙出示给B,B用这把钥匙打开该房间的锁,从而证明A拥有该房间的正确的钥匙。
  • B确定该房间内有某一物体,A用自己拥有的钥匙打开该房间的门,然后把物体拿出来出示给B,从而证明自己确实拥有该房间的钥匙

后面这个方法属于零知识证明。好处在于在整个证明的过程中,B始终不能看到钥匙的样子,从而避免了钥匙的泄露。回到比特币的例子上,比特币的转账的过程中一直写清了币的来源是谁,如果把这个来源给混淆掉,那么我们就能够实现更高级别上的匿名。zcash的做法描述如下: Alice拥有一张1ZEC的支票,要转账给Bob时,先给Bob新建一张1ZEC的支票,然后在一张约定有效的作废列表中,记录下Alice的发票的代号,证明Alice的支票已经失效。整个交易过程中,Bob并没有见过Alice的支票,但是还是实现了资产所有权的转移。在整个交易系统中,Alice和Bob的交易还有其他见证者,即负责记录交易信息的矿工。同样道理,矿工也不必看到Alice的支票,只要能确定代号为r1的支票已经作废了就行。

本节内容引用

《不是程序员也能看懂的ZCash零知识证明》

闪电网络

初,达与亮书曰:“宛去洛八百里,去吾一千二百里,闻吾举事,当表上天子,比相反覆,一月间也,则吾城已固,诸军足办。则吾所在深险,司马公必不自来;诸将来,吾无患矣。”及兵到,达又告亮曰:“吾举事,八日而兵至城下,何其神速也!”

比特币的交易网络最为人诟病的一点便是交易性能:全网每秒 7 笔的交易速度,远低于传统的金融交易系统;同时,等待 6 个块的可信确认导致约 1 个小时的最终确认时间。闪电网络的主要思路十分简单 – 将大量交易放到比特币区块链之外进行。该设计最早是 2015 年 2 月在论文《The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments》中提出。

比特币的区块链机制自身提供了很好的可信保障,但是很慢;另一方面考虑,对于大量的小额交易来说,是否真实需要这么高的可信性?闪电网络通过智能合约来完善链下的交易渠道。核心的概念主要有两个:RSMC(Recoverable Sequence Maturity Contract)和 HTLC(Hashed Timelock Contract)。前者解决了链下交易的确认问题,后者解决了支付通道的问题。

RSMC

Recoverable Sequence Maturity Contract,中文可以翻译为“可撤销的顺序成熟度合同”。这个词很绕,其实主要原理很简单,就是类似准备金机制。

我们先假定交易双方之间存在一个“微支付通道”(资金池)。双方都预存一部分资金到“微支付通道”里,之后每次交易,就对交易后的资金分配方案共同进行确认,同时签字作废旧的版本。当需要提现时,将最终交易结果写到区块链网络中,被最终确认。可以看到,只有在提现时候才需要通过区块链。

任何一个版本的方案都需要经过双方的签名认证才合法。任何一方在任何时候都可以提出提现,提现需要提供一个双方都签名过的资金分配方案(意味着肯定是某次交易后的结果)。在一定时间内,如果另外一方提出证明表明这个方案其实之前被作废了(非最新的交易结果),则资金罚没给质疑成功方。这就确保了没人会拿一个旧的交易结果来提现。

另外,即使双方都确认了某次提现,首先提出提现一方的资金到账时间要晚于对方,这就鼓励大家尽量都在链外完成交易。

HTLC

微支付通道是通过 Hashed Timelock Contract 来实现的,中文意思是“哈希的带时钟的合约”。这个其实就是限时转账。理解起来其实也很简单,通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,如果在一定时间内有人能提出一个字符串,使得它哈希后的值跟已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。

不太恰当的例子,约定一定时间内,有人知道了某个暗语(可以生成匹配的哈希值),就可以拿到这个指定的资金。

推广一步,甲想转账给丙,丙先发给甲一个哈希值。甲可以先跟乙签订一个合同,如果你在一定时间内能告诉我一个暗语,我就给你多少钱。乙于是跑去跟丙签订一个合同,如果你告诉我那个暗语,我就给你多少钱。丙于是告诉乙暗语,拿到乙的钱,乙又从甲拿到钱。最终达到结果是甲转账给丙。这样甲和丙之间似乎构成了一条完整的虚拟的“支付通道”。

HTLC 的机制可以扩展到多个人,大家可以想象一下,想象出来了就理解了闪电网络。

小结

RSMC 保障了两个人之间的直接交易可以在链下完成,HTLC 保障了任意两个人之间的转账都可以通过一条“支付”通道来完成。整合这两种机制,就可以实现任意两个人之间的交易都可以在链下完成了。在整个交易中,智能合约起到了中介的重要角色,而区块链则确保最终的交易结果被确认。

本节内容引用

《区块链技术指南·闪电网络》

智能合约

帝又遣爽所信殿中校尉尹大目谕爽,指洛水为誓,爽意信之。……既而有司劾黄门张当,并发爽与何晏等反事,乃收爽兄弟及其党等诛之。

人类发展历史上,一个永恒贯穿而又挥之不去的阴影就是信任问题。法律、合约都是用来应对信任问题的解决手段。法律是一个社会体的共同合约,私人间、公司间的合同则是小范围内的私下约定(当然也需要在法律范围内)。即使有了法律和合同,我们还是会遇到用法律解决问题的种种困境,因为总会有人想去逃避义务和责任。 如果说比特币的理想状态是一个永远不会随意发行的货币,那么以太坊的愿景就是一个智能化的合约平台,理想状态就是:通过智能合约,把契约变成代码。以太坊官方的白皮书里提到了这样两种应用场景:

  • 保险:一个人可以很容易地以天气情况而不是任何价格指数作为数据输入来创建一个金融衍生品合约。如果一个爱荷华的农民购买了一个基于爱荷华的降雨情况进行反向赔付的金融衍生品,那么如果遇到干旱,该农民将自动地收到赔付资金而如果有足量的降雨他会很开心因为他的作物收成会很好。
  • 博彩:任意数量的点对点赌博协议都可以搬到以太坊的区块链上,例如Frank Stajano和Richard Clayton的Cyberdice。 最简单的赌博协议事实上是这样一个简单的合约,它用来赌下一个区块的哈稀值与猜测值之间的差额, 据此可以创建更复杂的赌博协议,以实现近乎零费用和无欺骗的赌博服务。

按照这种描述,加上以太坊solidity语言的强大,能够构建出一个依靠计算机程序(代码公开)且不受人类感性乃至私心影响的合约体系,看起来一切都非常美好。

  • 保险尤其是中国保险,经常被诟病存在欺诈问题而让普通人退避三舍。如果保险合同能够按照代码说的去严格执行,看起来就不会被骗了。
  • 博彩可能是地球上唯一一个永远不会让用户开心的离开的行业,显然博彩里存在各种猫腻来欺骗用户,导致用户一输再输。

但是,用了以太坊的智能合约,真的会解决上面的问题吗?

在可预见的未来,代码一定会逐步进入法律和合同领域,让法律和合同的执行更有效率(其实现在已经进入了)。但那一定不会是以太坊现在的样子。

本节引用内容

What is Ethereum?

《什么是以太坊——一个从法律角度的理解》

样例一:以德(etherDelta)

万物皆可萌

以德(EtherDelta)是基于太坊智能合约的交易系统。特点是分布式,去中心化,不需登录,全球任何角落都能安全使用。其核心交易相关的代码总计312行,其中还包括几十行的注释。代码在此

以德流程图

样例二:瑞波(ripple)

创业,就是要做一头站在风口上的猪,风口站对了,猪也可以飞起来

其实瑞波的技术解决方案与区块链完全不想关,但他们发行了瑞波币,瑞波币目前总市值3900亿人民币,略高于A股的美的集团和浦发银行(3800亿)。

样例三:BloodCoin 献血系统的区块链+发币改造

道之以政,齐之以刑,民免而无耻;道之以德,齐之以礼,有耻且格。

该脑洞来自知乎的司马懿的回答

当前无偿献血系统的问题:

  • 宣传不足导致献血意愿不足,无偿导致献血意愿不足,血库长期缺血
  • 急需用血时,需要找人以互助献血的形式取得血液,包括献血者本人也是如此
  • 互助献血的形式,一定程度上还是可以让血贩子有机可乘
  • 民众对血站不信任,认为内部可能存在腐败。

目标:以区块链为底层基础,设计一套可信任、有一定程度回报的献血系统。 设计理念

  • 所有献血、用血全部使用区块链记录,每一滴血都有迹可循。保证血液的保存流程、流通流程、销毁流程没有问题,或者问题程度在一定指标之下。
  • 对献血者,按照献血量的80%的比例(该比例可协商)进行发BloodCoin(简称blc),币直接打入献血者的钱包地址。但与其他币不同的是,blc会按照时间衰减,我们暂定假设以5年作为半衰期,每5年blc会减半。(献血带来的贡献会伴随时间流逝而衰减)
  • blc可按币值去血库1:1获取血液,衰减后的blc按照衰减后的币值1:1兑换血液。
  • 血库强制按照当前流通的blc总量预留血液,不能使血液储存量小于blc总量。
  • blc上交易所自由流通,价格直接由市场决定。blc的拥有者也可以直接将其赠送给任何人。(献血者亲友可直接受益,对于不想献血或不适合献血的人,blc也可以通过市场购买)
  • 需要用血时,若血库blc总市值外的余量,则直接使用余量。若无余量,则必须使用blc兑换血液。
  • 区块链可采用联盟链,区块链运行所需的服务器费用,可由社会赞助,赞助者可获得一定blc回报(赞助人过多则降低blc回报数量,直至服务器总量降低到合理范围内)