[NOTE] 区块链漫谈

谈到区块链技术,有个绕不过的东西,那就是比特币。比特币被称为“分布式的账单”,这是区别于银行而言的。传统货币中是有银行这个中心存在的,银行通过印发钞票、增减债券、修改准备金等金融手段调控货币,使其稳定。银行作为一个受信任的第三方,保有交易双方的交易信息,也就是其账本。

而中本聪提出比特币白皮书的提出是有一个背景的,那就是08年的金融危机,金融危机后来被认为是银行、评级机构对信用的滥用导致的。这也引发了人们的担忧:当有一天,银行变得“不靠谱”的时候,我们手上的货币还能靠谱吗?

比特币的原理

上述细节可能不是比特币诞生的直接原因,但它一定是原因之一。

白皮书从一开始就给了比特币一个定义”A Peer-to-Peer Electronic Cash System”,因此比特币的设计中,是不存在“中心”这个概念的,我们且先不太其实现的具体原理,先解决下面的两个问题:

  • 没有“中心”,那么账本由谁来记呢?——可以是每个人

  • 账本保存在哪呢?——每个人都会保存一个账本的副本,即区块链

1.账本的记录

在白皮书中,所有的交易信息都是保存在区块链上的,当有新的交易信息需要记录时,便会将所有新产生的交易信息记录到一个新的上,将这个接到的后端。

这个时候我们得明确一点,bitcoin中是不存在余额这个概念的,要是有天我想数数我有多少钱,那真得好好数数了——从链头开始,查看所有自己的收入和支出,最后得到的结果,就是自己的“余额”。这么一说来,保存一份账本也是很有必要的了(具体原因后面会说明)。

这两个问题是解决了,但同时引来了更多的问题。

2.为什么要记账?

对人来说,记账不是一件轻松的活,而对于计算机来说,记账是要消耗它的算力、电力的,那么假若你是个比特币的用户,你为什么要费心力给别人的交易“记账”呢?

因为有奖励

image1.png

奖励分为两个部分:交易额一定比例的手续费;打包奖励。

  • 手续费:“既然都是革命性的货币了,怎么还收手续费?”——手续费远低于银行
  • 打包奖励:
    • 打包是什么?——交易信息会以广播的形式发出,对于一个用户(计算机)来说,它会尝试将它所收到的交易信息都整合到一起,并尝试“打包”,接到链的末端。
    • 奖励金额:白皮书中约定,10分钟打包一次,每个打包者奖励50BTC,每四年奖励减半(这是为了约束最后的BTC的总数接近一个定值:210,000,000)

问题又来了,打包有奖励,那岂不是“人人喊打”?

3.打包的约束——工作量证明(Proof of Work, PoW)

显然,包是只能一个人打的,这样才能保证区块正常运行下去。因此所有分布式节点都需要达成一个共识,即当一个节点收到了其他节点打包完成的信息的时候,这个节点就会放弃当前的打包操作,转而去打下一个包。

但这样依然很难避免这样一种情况:多个节点”同时“打好了包(此处同时不一定是同一时刻,由于网络延迟的原因,很可能一个节点完成打包操作后,才收到其他节点早已完成打包的信息)。

为了尽量避免这种情况的发生,中本聪的做法是将打包这个过程拉长,这样做确实能有效的降低重复打包的现象,具体做法是:

我们将:1.记录前块信息的“头部”;2.记录交易信息的“账单”;3.时间戳;4.一串随机数 组合成一个,对这个进行两次SHA256的哈希运算,最终的到一个256位的hash值。

block_example.png

按照约定,如果这个256位的hash值的前n位为0,那么我们就会认可这个可以接在链上,即具备了打包资格。由于sha256的不可逆性,所有节点只能通过修改随机数的值,一个一个去尝试,看得到的结果是否能满足条件(根据时间戳的不同,各节点开始计算的值也不同),这个过程,也被称为挖矿

前面我们也提到,白皮书中计划是每10分钟打一个包,那么如何实现呢?

对于256位的hash值来说,我们可以认为每一位上出现0的几率是50%,那么hash值的前n位为0的几率就是1/(2^n),假设算力恒定,显然n越大,计算出符合条件的结果的时间就越长。那么回到现实情况,参与BTC运算的算力一直在增长,我们就可以增加n的大小,使每个包的产出时间在概率上恒定于10分钟。

如果你还没有充分理解的话,我们一起来做道计算题:

1
2
3
假设一共有2w台矿机参与运算,每台矿机的算力为14Tbps,此时要控制为10分钟打包一次,需要将n设置为多少?

20000*14*10^12*600=1.68e20 约为 2^67

尽管有PoW算法的保障,但仍然不能排除同时打包的情况的发生。同时打包的两个节点,会分别向周围的节点分发自己的那个包,这个时候,宏观上就会发生区块链链路分叉的情况,面对这种情况,我们又该如何处理呢?请继续看下文。


##区块链中的安全机制

在BTC中,不管是将交易信息广播给其他节点,还是将打包的块分发,都需要处理一个问题:如何防伪?怎样确保信息传输的过程中没有收到篡改?

解决这个问题的方法是:电子签名

1.电子签名

计算机网络中电子签名的应用范围十分广泛,相信你对电子签名已经有了一定的认知了,所以先略过。

2.溯源

前文已经提到,用户拥有比特币的数量不是按照余额来计算,所以当要验证用户是否有能力支付对应金额的比特币时,其他用户就需要“查账”,包括:打包收益、交易支出、交易收入。一旦发现该用户并不具备支付能力时,这个交易信息就会被驳回,不会被分布式中的节点所承认。

3.双重支付问题

在溯源问题中我们提到,节点接收交易信息的时候并不是无脑接受的,它会校验交易是否合法。

那么考虑这样一种情况,A只剩下5 BTC,此时它同时向B和C转帐5 BTC,由于B和C分别在不同的地方,它们对交易的校验都是通过的,这就是双重支付问题。

image2.png

此时,B和C处会存在一个竞争,由于交易信息会被分别广播到B和C周边的节点,此时那边的节点先完成打包的计算,那么该处对应的交易才完成,另外一个尚未完成的交易将会被废弃。

4.最长链原则

继续双重支付中的问题,若是B和C两处的节点同时完成打包操作呢?

此时,两边不同版本的区块链版本分别向全网扩散,此时从宏观上来看,区块链就发生了分支的现象,此时参与运算的节点们会分为三派,一派我们称为A分支,另一派我们称为C分支,那还剩一派呢?它们还没来得及接受A或C的分支。

image3-1.png

那么如何解决这种冲突呢?节点们此时会分别在B和C中继续打包,优先打出下一个包的分支同样也会将它们的链广播出去,当某个节点接收到的链与它自己的链处于两个不同分支的时候,它会选择信任更长的那条链,并将继续在更长的那条链上运算下去,而这就是所谓的最长链原则

image3-2.png

为什么节点们会选择更长的那条链呢?

结合之前双重支付的问题,一旦一条支链被废弃,那么这条支链上所有的打包收益也将被废弃。节点们自然不会愿意做无用功,所以在计算下一个块的时候,它们会选择更长的那条链,接在后面进行计算。

5.防篡改

先给结论,比特币防篡改的机制其实很简单,就是基于PoW算法的算力约束。也就是说,当某一方想要恶意篡改区块链之中的交易信息的时候,他需要拥有超过全网50%的算力。50%从何而来呢?许多文章对这个地方都语焉不详,其实这个依然是基于最长链原则的。

image4.png

假如用户A想要篡改某个块之后的内容,他需要做的事情,是在该链之后创建出一条链,并使这条链的长度最终超过“主链”,成为新的主链。

image5.png

这样,其他用户也将认可这条“伪造的链路”,并在其后进行运算。

但比特币社区到目前并没有实际发生过51%攻击的事件,一是由于其用户数量庞大,算力规模巨大导致的;二是由于在有绝对算力优势的情况下,在主链后面进行打包会是一个更有价值的行为。


共识层算法改进

在一个分布式的系统中,最为关键核心的问题是同步,也就是数据的一致性,诚然PoW算法的确在一个强分布式的系统(我自己的称谓never mind)中为同步数据提供了一个很好的解决方法,但是它带来的消耗是在太高了。

image6.png

一直到2019年的7月份,参与比特币运算的总算力已经达到了10^20bps的数量级了,这背后所代表的财力、物力的消耗非常恐怖。

1.消耗改进:PoS(Proof of Stake)

PoS算法中提出了Stake这样一个概念用来取代算力(Work),Stake可以是持币的数量、持币的价值甚至是持币的时间。所持有的资产将作为保证金参与打包的竞争,这个有点像股份制的公司,所持有的股份越多,分红越多。

对于产生恶意行为的用户,他的保证金将被没收。

PoS算法一定程度上解决了PoW算法中消耗过大的问题,但PoS算法同样也存在着自己的缺陷:

  • 无权益问题:被废弃分支的奖励依然会被认可
  • 被动中心化:按保证金分红,富者越富
  • 早期危险:早期币值低,只需要付出可接受的代价就能超过51%的币值

2.性能改进:更高效的拓扑结构

由于区块链单链的限制,导致打包操作只能串行地处理,这样效率过低,且会带来性能浪费(打包失败者的运算将被浪费), Parallel execution of blockchain transactions 中提出了一种更高效的DAG结构。

除此之外,关于共识层算法也有很多的相关研究,如委托股权证明(Delegated Proof of Stake, DPoS),活跃度证明(Proof of Activity, PoA)消耗证明(Proof of Burn, PoB)等。


块空间不足问题

我们知道,在很长一段时间,区块链的大小都是限制为1M的。其实最早中本聪创建比特币时,是没有区块大小限制的,但由于一个数据结构的限制,区块最大能达到33M,而不是现在的1M。但最早的时候比特币很便宜,只要花很少的钱,比如几美元,就可以发出非常多的垃圾交易,恶意地把区块数据撑大,撑满你的硬盘。所以中本聪加了一个1M区块限制,中本聪加的这个限制是临时的,并给出了未来扩容的安排。

预期设计的更大的区块限制可以分阶段执行:

  • 当 区块高度(blocknumber) > 115000 时
  • 区块上限(maxblocksize)=更大的限制

随着用户数量的增多,交易频次的增长,在2017年,区块的大小已经不能满足需求了,但此时区块链的扩容却没有中本聪的计划走下去,这其中曲折也很有意思。

最早的比特币是由中本聪开发的,中本聪隐退后,比特币的开发维护任务由中本聪传给了加文(Gavin),加文(Gavin)觉得自己独裁不好,又把代码权限分权给了其它4名开发,后来又有其它开发加入,发展成现在的Core开发团队。

但后来,Core开发团队内部关于要不要按中本聪的计划,移走1M限制,产生了分歧。多数开发人员觉得不应该移除这个限制,部分觉得应该移除这个限制。

矛盾激化的结果,就是Gavin,Jeff等支持移除1M限制的开发人员,被赶出Core团队,被删除了代码权限。然后这些开发人员,包括一些新的,支持移除1M限制的开发人员,建立了XT、Classic、BU等开发团队。

我们说的这些开发团队的关系,很类似于一个国家里多政党的关系,互相竞争,并且说服用户选举他们作为执政党。也就是说就比特币的扩容,其实很早之前,比特币的核心开发团队就已经在争议了,也经过了比较激烈的人事斗争。我们理解其实这些核心开发者也是为了比特币的发展好。

双方的观点

Core:不希望移除1M限制

  • 这是个硬分叉,Core认为这样的硬分叉有分裂比特币的风险

    首先科普下什么是硬分叉和软分叉

    硬分叉是一个和软分叉相对应的概念,当比特币系统升级时,如果这个升级是向前兼容的,用户不需要升级自己的钱包也能继续用下去,这个升级就叫软分叉。

    对应的,如果用户需要升级钱包才能继续用下去,这个升级就叫硬分叉。(这不是一个严格的定义,但是比较容易理解的定义)

    硬分叉的风险在于,如果有用户没升级自己的钱包,那他就留在了旧版本的比特币上,他会发现自己的比特币,和别人升级了钱包的比特币不一样,是不兼容的,一个是旧版比特币,一个是新版比特币,如果有用户坚持在旧版上不升级,就产生了两个比特币,系统就会产生混乱,这是Core认为的第一个风险。

  • Core认为如果移除这个1M的限制,以后的区块会越来越大,2,4,8,16,太大区块会导致普通人的电脑无法运行完整版的钱包,这种完整版的钱包称为全节点。Core认为如果个人不能运行全节点,而只有公司和机构能运行全节点,会导致比特币的中心化。

  • Core认为我们现在有一些比中本聪更先进的技术方案,通过第二层网络(比如闪电网络)对比特币的交易进行分层,大部分低价值交易走第二层网络,只有少数的高价值结算交易走主链这个第一层网络。

闪电网络

闪电网络是怎么运行的呢?它类似于牌局里的记账员。比如说有几个人在打牌,他们并不会每打一圈就我给你五块钱,你给我十块钱,而是会先记账,等打完很多圈以后,再一起算账,只付一次钱。

闪电网络类似于这种思路,比如说有人要经常向交易所充值和提现,那他就可以用闪电网络,和交易所之间打开一个结算通道,他向交易所充10BTC,并不是充到交易所的地址上,而是充到这个结算通道中,然后比如提现1BTC也不是提现到他的地址,而是和交易所把通道里的钱重新划分一下,本来10个比特币都是交易所的,现在1个比特币归他,9个比特币归交易所,这样他可以和交易所发生很多笔充值提现,却不打币到地址。就和打了很多圈牌都记账,不实际转钱一样,直到他需要关闭这个结算通道时,他再和交易所结算清账目,把属于自己的币提到自己地址。

如果有两个用户都和交易所建立和结算通道,那他们就可以以交易所为中间人进行转账,交易所会帮助他们结算相应的金额。

这就是闪电网络,闪电网络在主链第一层网络的基础上,建立了一个第二层网络,大部分交易都走第二层网络,而不进入第一层网络。有点类似于一个高架桥和地面道路的关系。

扩容派

1.闪电网络架构上虽然存在优势,但中本聪架构已经被市场证明稳定运行了8年,金融系统应该保持稳定,没有特别需要,不应修改现在的架构。

从金融系统的角度考虑,搞第二层网络可以,但要保证第一层网络可以用,不能把第一层网络限制住1M,否则会产生灾难性后果。科技史上发生过一次非常类似的灾难:摩托罗拉的铱星系统。摩托罗拉的技术人员认为地面基站太Low了,说我们要搞个绝对牛逼高大上的卫星通讯网络,结果铱星系统开发了几年,烧掉了摩托罗拉的50亿美元(1997年的美元)后,仅仅运营了3个月就倒闭了,并且直接拖死了摩托罗拉。技术上看起来先进的架构未必比傻大黑粗的架构好。

2.第二层网络存在中心化隐患(具体解释),闪电网络的关键节点有点类似于支付宝(但不能偷钱和造假币),运营闪电网络的公司,可能被政府监管,关闭。

3.通过白皮书第7章删除历史数据等方式,大区块不会导致节点门槛提高。技术发展超过交易发展,20年内摩尔定律(每年CPU+60%)+尼尔森定律(每年带宽+50%),现在的网络和硬件可以承受20M的区块,足够10年使用。

两派的核心分歧

扩容派认为应该重点关注比特币的使用人数,只有更多的人使用,才能保护比特币,这种保护是多个方面的,既是因为PoW共识机制,同样当更多的人能从区块链的系统中获益后,他们才会自发地拥护和发展区块链。

另外适当的中心化也是可以接受的,例如中本聪认为个人用轻钱包即可,没有必要用全节点。

同时这派的观点也涉及到了比特币的终极目的:作为法币的竞争货币,这个理论是哈耶克提出来的,哈耶克是1974年诺贝尔经济学奖得主,他认为政府不可能抑制住滥发法币的冲动,最好的办法就是竞争。商品的竞争能产生更好的商品,货币也应该竞争,货币的竞争也能产生更好的,币值稳定的货币。在法币过分通胀时,比特币作为法币的竞争货币,保护人民不受法币剥削,并通过竞争,抑制法币的通胀。

Core派则认为比特币的终极目的是实现一个终极自由的货币,能够保护个人的财产安全,从这点上看,和扩容派似乎有点殊途同归,但是,Core派则显得更为极端:

Core派不是很关心比特币的交易拥堵或用户发展,出世派关心比特币是否符合自己心目中“终极自由货币”的标准,认为“终极自由货币”,是吸引用户来用的最高吸引力。

且,Core派不能接受一点中心化,认为要保证人人都可以运行全节点,并希望进一步增强比特币的相关属性,例如完全匿名性。

双方的妥协与彻底分裂

香港共识:双方的最后一次妥协,双方同意妥协到 隔离见证+硬分叉2M,矿业不运行Classic(简单2M方案)

对扩容派来说,2M可以缓解目前拥堵的交易。对Core来说,2M不算太大(隔离见证实际也达到2M),所以他们并不反对隔离见证和能增加用户的LN,但扩容派反对Core路线图的第一步:软分叉隔离见证

Core主要的几个开发回去后遭到其他人的反对(因为这是个妥协的方案),连相应代码都未开发,香港共识流产

那么之后呢?

扩容方转而支持BU一劳永逸解决区块大小的方案(BU:51%的矿池投票决定区块大小)——Core反对:扩容是矿业企图控制比特币,这将破坏比特币的开发(如闪电网络没有隔离见证只能非常不优雅地运行)——扩容反对Core的反对:Core的多名开发都受BlockStream公司雇佣,BS为了推行闪电网络,利用Core的出世倾向,锁死主链到1M(Core早期并没有1M那么极端,是不极端的Core开发都被踢出去了)。

反复吵架之下,一方面是区块拥堵加剧,另一方面是其他货币如ETH的高速发展。

以比特币为代表的区块链技术仍在曲折前进,区块链先天具有跨界的优势,在金融、物流、零售等方面都具有很多优点。文章到这已经接近尾声,但区块链的故事还在继续书写…