MSBD600D:区块链课程笔记

文章目录
  1. 1. 1 区块链介绍
    1. 1.1. 1.1 自己的一些理解
    2. 1.2. 1.2 中心化 vs 分布式系统
  2. 2. 2 货币和通证经济(token economy)
    1. 2.1. 2.1 区块链经济
      1. 2.1.1. 囚徒的困境
      2. 2.1.2. 纳什均衡
      3. 2.1.3. 混乱的代价
      4. 2.1.4. 区块链3.0
    2. 2.2. 2.2 现代货币理论(MMT - Modern Monetary Theory)
    3. 2.3. 2.3 比特币发展史
      1. 2.3.1. 比特币是什么?
      2. 2.3.2. 前比特币时代 ~ 2009年:自由主义者的梦想
      3. 2.3.3. 2009 ~ 2010:比特币开始发展
      4. 2.3.4. 2010 ~ 2012:比特币的丑闻
      5. 2.3.5. 2013 ~ 2016:以太坊涌现
    4. 2.4. 2.4 通证经济(Tokenomics)
      1. 2.4.1. DAO
      2. 2.4.2. Token的应用和价值
    5. 2.5. 2.5 稳定币与币发行
      1. 2.5.1. 稳定币 (stablecoin)
      2. 2.5.2. ICO 与 STO
      3. 2.5.3. ICO、STO和IPO的比较
  3. 3. 3 区块链架构
    1. 3.1. 3.1 P2P Network与比特币网络的节点
    2. 3.2. 3.2 交易(transaction)
      1. 3.2.1. 基于账户的账本vs基于交易的账本(UTXO模型)
      2. 3.2.2. 锁定和解锁脚本
    3. 3.3. 3.3 区块链的结构
    4. 3.4. 3.4 最长链原则与分叉(forking)
  4. 4. 4 共识算法
    1. 4.1. 4.1 分布式系统
      1. 4.1.1. 什么是分布式系统?
      2. 4.1.2. 分布式系统的CAP理论
    2. 4.2. 4.2 拜占庭将军(Byzantine Generals Problem)问题
    3. 4.3. 4.3 PAXOS共识算法
    4. 4.4. 4.4 区块链使用的共识算法
      1. 4.4.1. 工作量证明 (PoW - Prove of Work)
      2. 4.4.2. 权益证明 (PoS - Prove of Stake)
      3. 4.4.3. PoW和PoS的比较
      4. 4.4.4. PBFT

1 区块链介绍

1.1 自己的一些理解

就我目前的认识而言,我会从经济学的角度切入。货币若发行过多或过少会出现通货膨胀或通货紧缩,而这就需要政府这双“有形的手“”和市场这双“无形的手”共同调控金融市场。换言之,货币的流通总量是要和当前贸易情况匹配的,换句话说,货币的流通总量,是和经济情况紧密相连的。货币的流通需要通过调控,来影响市场;而市场也通过各种反馈,迫使管理机构对货币进行调控,以维持货币的稳定性。

但是我们也明白世界上几乎所有的国家都使用法定货币,即由政府依照法律强制发行、强制使用的一般等价物。这就存在一个问题,如果一个国家愿意的话,它可以开动印钞机,源源不断地生产钞票,倘若它面临经济危机,比如债务危机,那它是否可以通过直接印刷钞票来偿还债务呢?这显然是不合理的,难道除了国家垄断货币发行的权利就没有其他的途径了吗?

国家垄断货币发行的权利,这就是中心化的货币体系,世界人都认同美元的价值,而二战以后,确立了以美元为中心的国际货币体系,史称布雷顿森林体系,即使如今该体系早已瓦解,但是美元在世界的认可度仍然很高,华尔街仍是人人向往的金钱之地,不是因为美元这张纸值多少钱,而是人们认可背后的美国政府的地位,要不然你听过津巴布韦币吗,它值几个钱呢?

bank-transfer

国家的监管机构需要参与到这个庞大的金融体系的调控中,央行发行货币、银行负责记账、储蓄、借贷,而在一个流通货币的复杂金融市场中,如果国家在面对危机时的能力不足以应付,那么就会爆发经融危机,其担保的货币和依赖的金融体系都会承受崩溃的巨大压力。

区块链是一种去中心化的技术,它能让全世界的计算机都参与进来,发行数字加密货币只是它的一种应用,而比特币只是其中一种加密货币。全世界的计算机共同计算,构成一个庞大的、多节点的、健壮的金融网络,其中有货币的发行者,也有货币的记账者,他们需要通过参与某种特定的计算,相互竞争而获取发行货币、记账的权利,在赢取报酬的背后,是它们为整个系统贡献了劳动力。

整个系统严格按照算法控制货币的两,对所有人严格公平,某种程度上预防了通货膨胀和通货紧缩的问题。另外,每一笔交易都经过加密,符合密码学的相关原理,经广播后,需要多个节点的确认,才可以确认这笔交易,不可伪造、删除、篡改或者否认,足够安全可信任。

世界范围内,越多的计算机参与到这个过程中,区块链(其对应的货币)的价值认可度就会越高,就像全世界给你做担保,一起承担风险一样,而不会像传统的法定货币局限于某个国家或区域;另外这还会提升整个系统的健壮性,如果你想控制这个系统,你至少需要控制51%的节点,若摧毁这个系统,你需要让所有的节点都遭到破坏,这几乎是不可能的。

1.2 中心化 vs 分布式系统

central-distributed

2 货币和通证经济(token economy)

2.1 区块链经济

囚徒的困境

囚徒的困境描述了这样一个问题,两个囚徒被捕后分别进行审讯

  • 如果两个人都坦白罪证,则都坐8年牢;
  • 如果一种一人坦白另一个没有,则坦白的那个释放,未坦白的判15年牢;
  • 如果两人都不认罪,都判1年牢。

那么请问他们会坦白罪证吗?我们将所有的四种情况都画在下面这张图中:

囚徒的纳什均衡

显然,从总体来看,两人合作都不承认罪证是最优的选择,因为两个人都只用判1年牢,但是,由于两人无法互相沟通,谁也无法保证对方会不会揭发自己,万一自己死不认罪,没准对方释放了,自己还要蹲15年的监狱。两人无法信任对方,所以都会倾向于互相揭发,而不是同守沉默,最后导致两人都判8年的牢。

为什么会出现这样的情况呢?两个囚徒实际上是在互相进行博弈,他们选择坦白罪证,是为了自身利益的最大化,最终导致不合作,也无法取得好的结果。这种僵持的、互相不合作的状态,在博弈论中被称为纳什均衡,也称为非合作博弈均衡。

纳什均衡是我们不希望出现的,因为在博弈中我们更希望每个参与博弈的人,包括我们自己都能够达成共识,互相信任,谋求共同利益的最大化,这样我们才能够持久合作下去,共同发展。

纳什均衡

纳什平衡(Nash equilibrium),又称为非合作博弈均衡,是博弈论的一个重要术语,以约翰·纳什命名。在一个博弈过程中,无论对方的策略选择如何,当事人一方都会选择某个确定的策略,则该策略被称作支配性策略。如果两个博弈的当事人的策略组合分别构成各自的支配性策略,那么这个组合就被定义为纳什平衡。

一个策略组合被称为纳什平衡,当每个博弈者的平衡策略都是为了达到自己期望收益的最大值,与此同时,其他所有博弈者也遵循这样的策略。

混乱的代价

在算法博弈论(Algorithmic Game Theory)中,用混乱的代价(Price of Anarchy)定量地描述了非合作的代价,即衡量了合作与竞争之间的差异。在囚徒的困境的问题中,混乱的代价是无穷大的,必须需要合作。而在互联网中,如果路由器是自私的(selfish routing),即在选择路由时,只考虑自身利益的最大化而不管这样的选择是否会伤害网络邻居,反倒会导致链路的堵塞,T. Roughgarden & E. Tardos (2002)证明了自私路由有Price of Anarchy of 4/3,而分布式路由(distributed routing)能够表现的比中心化路由更好,也就是说互联网在没有中心机构的时候表现的更好。

这也就区块链的理念之一,去中心化和分布式能够构建一个相互信任、合作共赢、混乱代价低的系统。

区块链3.0

区块链经历的三代的发展:

区块链1.0:programmable money => 分布式账本与数字加密货币,比特币为代表

区块链1.0就是大家最熟悉的数字加密货币 + 分布式账本。

比特币是最早诞生的数字加密货币,它并不是线下法定货币的替代物,而是非法定货币当局发行和管理的,完全由互联网基础协议和严格的加密技术保护和支持的、全新的、去中心化的网络货币,由此也形成了一套不同于、也不受制于现实社会法律的新的货币规则和体系,并且可以与法定货币进行买卖或兑换。

而遵循的“人人都是记账员”的理念,只要你有CPU、GPU甚至专门去买矿机,你就可以参与竞争,赢取记账权,获得比特币的奖励,而且别人在你发现的区块上记账也要给你支付比特币。每一条交易记录都会被广播到整个比特币网络中,经过多个节点的确认后,就会被永久地写在区块链里,不可篡改。

区块链2.0:programmable finance => 智能合约,以太坊为代表

区块链2.0是数字货币与智能合约相结合,对金融领域更广泛的场景和流程进行优化的应用。最大的升级之处在于有了智能合约。

智能合约是1990年代由尼克萨博提出的理念,几乎与互联网同龄。由于缺少可信的执行环境,智能合约并没有应用到实际产业中,自比特币诞生后,人们认识到比特币的底层技术区块链天生可以为智能合约提供可信的执行环境。

所谓智能合约,是指以数字化形式定义的一系列承诺,包括合约参与方可以在上面执行这些承诺的协议。智能合约一旦设立指定后,能够无需中介的参与自动执行,并且没有人可以阻止它的运行。可以这样通俗的说,通过智能合约建立起来的合约同时具备两个功能:一是现实产生的合同;一个是不需要第三方的、去中心化的公正、超强行动力的执行者。

区块链3.0:programmable society => EOS为代表

区块链3.0,智能化物联网时代,超出金融领域,为各种行业提供去中心化解决方案。区块链的应用领域扩展到人类生活的方方面面,在各类社会活动中红实现信息的兹证明,不再依靠某个第三人或者机构获取信任或者建立信任,实现信息的共享,包括在司法、医疗、物流等各个领域,区块链技术可以解决信任问题,提高整个系统的运转效率。

2.2 现代货币理论(MMT - Modern Monetary Theory)

  • 主流的经济观点认为,政府的收入来自收税(taxes)和发行国债(debt issuance),而且货币是由政府垄断的
  • 政府可以不通过税和债券获取资金,预支任何东西
  • 不能拖欠本币债务
  • 只有在货币创造和通货膨胀购买方面是有限的,一旦真正的资源被充分利用,通货膨胀就会加速
  • 可以通过税收和债券发行来控制需求拉动型通胀(demand-pull inflation),从而消除流通中的过剩货币
  • 政府赤字对利率的影响

MMT

“US can pay any debt it has because we can alwaysprint money to do that. There is zero probability of default.“ - Alan Greenspan

我们可以看到MMT模型可以形象地用一个洗手盘的模型来阐述,政府的支出就像水龙头,而水就像金钱,水龙头打开,水就会流入经济这个大盆种,税收政策就像洗手盆的阀门,用于调控金钱的从盆中的流出,而税就好似下水道的污水回收,用来回收过剩的金钱,时刻留意通货膨胀的情况的发生。

2.3 比特币发展史

比特币是什么?

比特币(Bitcoin)是

  • 一种数字加密货币。数字加密货币是一种采用了密码学原理来控制单位货币的产生、确保交易安全的交易媒介,并不由一个中央银行管控。涉及计算机科学、密码学原理、经济相关的领域。
  • 一种软件。下载一个比特币的客户端,我们就可以生成一个比特币的钱包账户,每个钱包账户的地址都是唯一的,使用这个地址就可以直接转账和接收比特币了,没有去银行开户那样的繁琐操作。

前比特币时代 ~ 2009年:自由主义者的梦想

随着80 ~ 90年代技术的发展,迎来了密码朋克运动的潮流,人们更加注重保护自己的隐私,尤其不希望政府和相关安全机构的窥探,他们高举自由与人权的旗帜,甚有技术极客运用密码学的理论,尝试构建一个安全、可信的隐私体系。

Privacy is necessary for an open society in the electronic age. Privacy is not secrecy. A private matter is something one doesn’t want the whole world to know, but a secret matter is something one doesn’t want anybody to know. Privacy is the power to selectively reveal oneself to the world. —- 《密码朋克宣言》

现有的金融体制威胁到了个人隐私,人们对政府垄断金融管理体制的愈加不信任,所以先后涌现了许多数字加密货币:DigiCash$\rightarrow$HashCash$\rightarrow$B-money$\rightarrow$直到2008年SATOSHI NAKAMOTO(中本聪)写的的比特币白皮书

2009 ~ 2010:比特币开始发展

  • 比特币最开始是Github上面的一个开源项目,上面有开发者的邮箱地址。中本聪从项目开源以来以前一直都是比特币的开发者成员,直到2010年12月,比特币火爆全球的时候,他却选择销声匿迹,至今都未能确认他的真实身份,这也成了一个比特币历史中的未解之谜
  • 2009年1月3日,第一块区块被创立,这被称为创世区块(genesis block)
  • 2009年1月9日区块链V0.1发布
  • 2009年1月12日,第一次比特币的转账,由Hal Finney完成。

价值四千万美刀的披萨

2010年5月22日, Laszlo Hanyecz用1万比特币买了一个价值25美元的披萨,这是世界上第一个用比特币购买有形资产的例子,而1万比特币如今价值4000万美元。这是比特币第一次拥有价值,在这之前人们挖币纯粹只是爱好,而这一次比特币的使用第一次实现了比特币最初的构想——数字加密货币实际上也能用于购买商品的。所以从某种程度上来说,Laszlo是一个英雄,一个比特币主义者们的英雄。

2010 ~ 2012:比特币的丑闻

早期的比特币是非常不堪的,不仅发生过大规模的黑客攻击,还用于许多非法的交易。比如2014年世界上最大的在线比特币交易平台Mt.Gox有74万4408枚比特币被盗取,最终导致其公司价格暴跌,最终宣布破产。

臭名昭著的暗网Silk Road是一个隐藏了大量毒品交易、性奴、儿童色情以及暗杀等犯罪线索的网络世界,它就使用比特币来交易,由于比特币的匿名性和安全性,这让各国的安全部门追查起来非常头疼。当然最后,美国FBI、国家安全局和缉毒局还是通过蛛丝马迹抓到了网站的创始人罗斯,终身监禁不可保释,并最终关闭了网站。

比特币的兴起和泡沫的破裂

bitcoin-blow

bubble-burst

比特币拓展性的不足

比特币大约每隔10分钟会传建一个区块,而由于区块大小的限制(2010年将其限制为1MB),目前的比特币系统平均每秒处理7笔交易,而相比于我们主流的交易平台,比如Visa能实现2000笔/秒,峰值更是达到56000笔/秒,两者存在着巨大的差异。

2015年就出现过大量交易被堆积的情况,导致网络阻塞,影响了比特币的正常使用。

2013 ~ 2016:以太坊涌现

以太坊(Ethereum)被视为下一代比特币,以太坊是一个图灵完备的协议,它将数字货币作为燃料。简而言之,以太坊是一个有智能合约(Smart Contract)的公共区块链平台。以太坊将交易速度提升到了15笔/秒,但是还是不够快,而运用一些先进的技术,能够将TPS(Transaction Per Second)提高到2000,但是仍然距离商用和日常支付还有很长的距离。

图灵完备是什么呢?

图灵完备就是指程序员编写的各种代码语言,再加上一种运算规则,能再图灵机这种虚拟机中完美的运算,这些编程语言就叫图灵完备。

图灵完备的代表是以太坊,以太坊这个用区块链的方式连接了全球所有的机器,组成了一个强大的硬件基础,在以太坊系统中,设置了虚拟计算程序。以太坊做了一个内置了多种编程语言的区块链协议,这些编程语言都是图灵完备的,可以支持条件分支、循环、跳转、函数调用等复杂的运算逻辑,理论上可以在以太坊区块链上运行任意的应用。

当然也有非图灵完备,比特币就是非图灵完备的,也就是说目前比特币系统上面支持不了开发复杂的应用。

图灵完备有何优缺点?

比特币由于其设计上的非图灵完备性,加上中本聪大幅删减了许多脚本指令,所以其安全性是极高的,从2009年诞生至今8年多的时间里,平安经历了无数次的黑客攻击,从未因比特币区块链和脚本本身的原因出现过资金损失。之前强哥和大家说的交易所的比特币被盗,也并非是比特币本身的代码安全问题,而是交易所的安全问题。比特币这样的非图灵完备的区块链代码协议可以认为是简单、高效、安全

以太坊这样的图灵完备,是一个复杂的开发语言和协议,你可以在我这里根据我提供的语言进行二次开发,实现很多很复杂的功能。但是,很明显,复杂的协议在设计和编码过程中难以避免人工失误,一旦被黑客找到漏洞,损失往往是巨大的。比如去年以太坊Parity钱包被盗十几万个以太币,这就是代码的安全漏洞导致的。

所以说,图灵完备各有优缺点,图灵不完备会更安全些,图灵完备会更智能些。但大多数主流观点还是认为图灵完备的开发语言是未来的主流,因为大家都希望实现的功能很丰富。当然,未来科技发展好了安全也应该会得到更好的保障。

2.4 通证经济(Tokenomics)

DAO

去中心化的自治组织 DAO(Dcententralize Autonomous Oganization) 是随着数字加密货币和区块链技术的普及而流行的概念。

去中心化的组织是最早出现在美国作家奥里.布莱福曼(Oei Brafman)在2007年出版的《海星和蜘蛛》一书中,蜘蛛是中心化(细胞)组织的例子,如果把它的头切掉后(整个组织)就无生存了。海星则是由彼此对等(无中心)的一堆细胞组成,海星撕下的每只触手都可成长为完整的海星。

海星和蜘蛛分别代表现实世界去中心化和中心化的两种组织。海星型组织在遇到挫折和冲突被分解的时候,其组织将变成更小的去中心化组织,继续发挥作用;而蜘蛛型组织在首脑被割掉以后,将无法运作。相比之下,海星型去中心化组织将更具有强大的生命力。

奥里的去中心化组织概念更多的是指人类的相互协作方式。近年来,由于去中心化的区块链技术发展,特别是智能合约的出现,演变出以机器代替人类执行事务的去中心化的自治组织(DAO),而DAO之所以能够成为现实并生根发芽,离不开它最重要的技术基础——区块链。

有了区块链这个去中心化的基础平台,自治组织就可以定义各种组织规则,然后用计算机程序来表达并且在区块链网络上运行,这种区块链上的程序通常称为“智能合约”(Smart Contract)。智能合约中的“合约”是指用计算机代码确定下来的逻辑规则,发布到区块链网络后,形成不可公开更改的契约,所有人都可以监督契约的内容及其执行。而智能合约的,“智能”,是指计算机程序能够根据各种不同的情况,作出不同的响应。

Token的应用和价值

通过下方的表格,我们可以看到数字加密货币只是Token的一种应用,Token是一个更宽泛的概念。token通常翻译成通证,它更广为人知的名字是“代币”,因为这个应用最广为人知,其他的应用比较抽象。实际上,它更准确的翻译是“通证”,代表的是区块链上的一种权益证明,而非货币。

Token的三个要素

  • 一是数字权益证明,通证必须是以数字形式存在的权益凭证,代表一种权利、一种固有和内在的价值;
  • 二是加密,通证的真实性、防篡改性、保护隐私等能力由密码学予以保障;
  • 三是能够在一个网络中流动,从而随时随地可以验证。

tokenomics

guide-for-tokenomics

2.5 稳定币与币发行

稳定币 (stablecoin)

通产认为一个理想的、能够真正成为流通货币的数字加密货币必须具备以下四个条件:

  • 价格稳定 (stable)
  • 可拓展性 (scalablility)
  • 私密性 (pravacy)
  • 去中心化 (decentralized)

实际上比特币只做到后面两条,它不具备非常好的拓展性而且价格波动过大,而以太坊的代币ETH虽然拓展性良好,但是在价格方面还是不够稳定。截至2018年,已经有1600+中数字加密货币,种类之繁多,估计有很多是做什么我们也不清楚。但为了实现最初比特币提出的去中心化的金融体系的愿景,不断涌现许多新的代币,正说明我们正在不断研究和尝试。

有三种稳定币的实现方式

  • 法定资产抵押(Fiat-Collateralized Stablecoins): backed by fiat reserves such as USD (like treasure debt). E.g. Tether (USDT), TrueCoin, TrueUSD
  • 数字资产抵押(Crypto-Collateralized Stablecoins): backed by other reserves of crypto currencies. a bucket of cryptocurrencies account for the price stability (like ABS), e.g. MakerDao, Bitshares, Havven
  • 无需抵押依靠算法(Non-Collateralized Stablecoins): supply is algorithmically governed by its smart contracts which keeps expanding or contracting to keep the price stable (like central bank – algo bank), e.g. Basecoin, Nubits, Caborn

ICO 与 STO

首次币发行(Initial Coin Offering),是一种区块链行业术语,源自股票市场的首次公开发行(IPO - Initial Public Offering)概念,是区块链项目首次发行代币,募集比特币、以太坊等通用数字货币的行为,是为加密数字货币/区块链项目筹措资金的常用方式。

早期参与者可以从中获得初始产生的加密数字货币作为回报。由于代币具有市场价值,可以兑换成法币,从而支持项目的开发成本。 ICO 所发行的代币,可以基于不同的区块链。常见的是基于以太坊(ETH)和比特股(BTS)区块链发行,由区块链提供记账服务和价值共识,实现全球发行和流通。

ICO参与者对于一个项目的成功非常重要,他们会在社区里为该区块链项目进行宣传,使它产生的代币在开始交易前就获得流动性。但ICO的参与者最看重的依然是由项目发展或代币发行后价格升值带来的潜在收益。

而STO (Security Token Offering)称之为证券化通证发行,一开始对于 Security Token ,我是理解成安全通证,但是查阅资料后发现是证券化通证的意思。当ICO出现之初,由于区块链技术的特殊性,政府难以进行有效的监管,所以我们可以认为STO是是各国政府为了监管ICO的一种“应激反应”,是各国政府(特别是美国政府)在不出台新的监管政策的情况下,试图将现有ICO通证市场纳入传统金融监管体系的尝试。

STO is a fundraising tool similar to an ICO, but with certain regulations and the issued security tokens are backed by real assets.

  • Regulated by authorities, embedded into smart contracts.
  • Ensure fractional ownership of real-world assets.
  • Low barrier for entry, global liquidity.

STO指在确定的监管框架下,按照法律法规,行政规章的要求,进行合法合规的通证公开发行。拿这种方式和证券类比的话,购买证券,交易是在纸上签署完成,而STO则是通过区块链交易来确认资产的所有权。可以将现实中已经存在的金融资产或权益进行代币化,例如公司股权、债权、知识产权、信托份额或黄金珠宝等实物资产,都可以转变为链上的数字资产;而且具有传统证券性质例如利润分配、股利分配、投票权、资产抵押担保债券等,通过非公开募集和公开募集方式对外募资。

ICO、STO和IPO的比较

compare-ICO-IPO-STO

3 区块链架构

3.1 P2P Network与比特币网络的节点

P2P-vs-CS

首先我们对比特币网络有一个整体的认识,它是一个P2P(Peer-to-Peer)对等网络,属于覆盖层网络(overlay network)的范畴,即面向应用层,不考虑或很少考虑网络层、物理层的问题。网络中的每一个节点是对等的,既可以从其他节点得到服务,也可以向其他节点提供服务,这种网络拓扑结构是非常稳健的,即使多个节点遭到破坏,也能由其他节点提供服务。与此相对的,是Client-Server Model,即我们常说的C/S架构,由一个server为多个clients提供服务,如果server出现宕机的情况,那么所有需要该server提供服务的clients都会受到影响。

bitcoin-node

而Bitcoin的一个节点由比特币钱包、矿工、存储的完整区块链数据、网络这四部分组成,只有网络是一个节点必需的元素,其余的三个元素可以缺省,但是这也意味着一些功能的缺失,不同元素的组合可以形成不同类型的比特币网络节点。

bitcoin-different-nodes

  • 标准客户端(Reference Client),也称为比特币核心。它包括完整的四部分,通过Bitcoin的官网可以下载,下载软件后需要同步整条区块链的数据,我2020年4月份用的时候,区块链的大小已经达到了284G,有数据预测到2020年,将会达到100TB
  • 完整区块链节点(Full Block Chain Node)。这种类型的节点既没有钱包,也没有挖矿,只是单纯用来存储区块链数据。
  • 矿工(Solo Miner)。这种类型的节点常常部署在专门用于挖矿的矿机上,它拥有挖矿功能和一份完整的区块链数据。
  • SPV(Simple Payment Verification)节点是采用了简单认证机制的节点,也称为轻量级的钱包。简单认证机制是中本聪在论文中随比特币概念一同提出来的,因为完整的区块链需要占用上百G的存储空间,而我们一般的用户,也就是只是想借助比特币网络转转账而已,并不想参与挖矿、记账的活动中。那么节点无需下载所有的区块数据,而只需要加载所有区块头数据(block header的大小为80B),即可验证这笔交易是否曾经被比特币网络认证过。

3.2 交易(transaction)

基于账户的账本vs基于交易的账本(UTXO模型)

我们先回忆一下一个账本是如何记账的,传统的账本一般是基于账户的(account-based),即账户A给账户B转了多少钱。开始Alice获得了25个比特币,然后她将17个比特币转给了Bob,在之后…每一次的转账都会产生一条转账记录,由转账者在记录上签个名,我们要想知道Alice最终拥有多少比特币,我们需要追踪所有的记录。

传统的基于账户的账本

而比特币系统采用的是基于交易的账本(transaction-based ledger),把记录的关注点放在交易本身,即账户A给账户B转账完后,A和B的账户里有多少钱。比如同样Alice给Bob转了17个比特币,是这样记录的:Alice给自己转8个比特币,而Bob则被赋予17个比特币,最后附上Alice的签名。

基于交易的账本

我们分析上图的例子,求一下Alice的余额是多少?由于1[0]=25.0->Alice被使用过了,所以1[0]作废,同样2[1]=8.0->Alice被使用过了,所以2[1]也作废,最终Alice的余额就是2。

通过上面这个例子,我们可以得知,要想获得某个账户余额,在基于账户的账本中,我们需要追踪所有与该账户有关的转账记录,经过加减合并才能获得正确的余额,而基于交易的账本,我们只需要将该账户所有未作废的金额累加起来即可。

随着时间的推移,两者的效率会越来越大,基于账户的账本因为不能丢弃旧数据,会不断膨胀,而基于交易的账本在未来可以裁剪那些已作废的历史数据,也不会丢失信息。

基于交易的账本模型在比特币中有个更专业的说法,叫UTXO,全称为Unspent Transaction Output,即未花费的交易输出,我们再看上面的这个例子,每一条记录都会产生一个输出,而这个Output只有处于未花费的状态时才能作为Input,一旦这个Output被使用过,就会被标记为已花费无法再次使用。

这样的机制其实可以预防 double-spending(双重支付)的攻击,因为UTXO是不可分割的,不能由UTXO拆分出更多UTXO,当一笔交易发送出去后,相应的UTXO被标记为spent,就不能再被使用了,再次执行原交易会由于找不到输入指向未使用过的UTXO了,无法进行交易。

锁定和解锁脚本

在前面我们提出了UTXO的概念,前方的->我们理解成赋予的意思,比如A有100个比特币,她转给B 80个比特币,这笔交易可以描述成,80.0->B, 20->A,系统需要“销毁”原先的100 BTC的资金,并生成只有Bob才能解锁的80 BTC,以及只有A才能解锁的20 BTC。这里我们引入了一个“解锁”的概念,只有财产的所有者解锁资产,然后才能花费资产。

比特币源自于加密货币,因此涉及了大量密码学的知识,除了用到哈希函数,还使用了非对称密码学的概念:

名词 可公开性 用途
Private Key 不可公开 生成数字签名
Public Key 可公开 校验数字签名
Public Key Hash 可公开 收款和解锁

所以,为什么只有A能解锁?

比特币的锁定/解锁脚本

只有通过A提供的PubK做Hash160才能得到PubKHash,才能解开脚本的前半部分,之后再通过sig和PubK校验该签名是否合法,并以此判断是否是A主动发起的操作。完整的校验过程如下:

解锁步骤一

解锁步骤二

3.3 区块链的结构

区块链这个名词起的非常形象,若干的区块以链的形式组合在一起,这就形成了区块链,有点类似于数据结构中的链表的结构。在区块链中,描述一个区块的位置会用Height和Depth,区块的编号从#0开始,#0区块也称为创世区块(genesis block),编号依次加一,如垒砖块一样,越叠越高。高度是从下往上数,深度是从上往下数,均从0开始计数,下图这个例子,Alice’s Transaction所在的块编号为#277316,高度277316,深度2。

block-header

一个区块里面有什么呢?区块头(Block Header)和一个Merkle Tree,区块头中包含前一个区块Header的Hash,一个Nonce(number once)和Merkle Root,而从Merkle Root出发包含了一颗记录所有transaction的树。

Merkle Tree是一种哈希二叉树。叶节点存储的是数据文件,而非叶节点存储的是其子节点的哈希值,这些非叶子节点的Hash被称作路径哈希值(可以据其确定某个叶节点到根节点的路径), 叶节点的Hash值是真实数据的Hash值。因为使用了树形结构, 其查询的时间复杂度为$O(\log n)$,$n$是节点数量。

Merkle-tree

Merkle Tree的一个重要特点就是,当底层数据的任何变动,都会传递到其父节点,一直到树根。这个特性被运用在了区块链transaction的记录中,能够保证这个记录不可篡改。

通过对于交易$TX_A$和$TX_B$生成哈希$H_{AB}$并通过与$H_{CD}$的再次哈希得到树根$H_{ABCD}$,当客户端需要校验交易$TX_C$是否存在于区块时,只需要对该交易做哈希生成$H_C$并依次与$H_D$和$H_{AB}$依次取哈希值,再与树根的哈希值对比,如果一致则说明交易存在于区块中。这样的方式在白皮书中称为“Simplified Payment Verification”(SPV)在算法上优于交易集合的遍历。

同时对于每个区块都需要加盖“时间戳”用以确定某个交易发生在某个时间点之前。

时间和哈希值共同保证了某一笔交易一旦入账则不可更改。

完整的区块链的结构如下图所示

了解完区块链的结构以后,我们就可以很好的理解新的区块是如何产生了的,这其实就是我们经常听到的“挖矿”(Mining)。假设现在我们需要产生一个新的区块,系统会根据现有的算力情况,布置一道难度合适的数学题,谁最先解开这道题,那么它就可以获得这个新区块的记账权,为了保证新区块产生的速度恒定,每次系统都会自动根据前一段时间产生新区块的速度,动态调整题目的难度,大家解题解得快则提高难度,解得慢则降低难度。

需要注意的是,新区块是先产生的,然后大家再去竞争记账权。因为竞争成功后可获得两种类型的奖励:创建新区块的新币奖励和区块中所含交易的矿工费。所以这个过程被形象地称为“挖矿”。比特币协议规定,每四年新币的奖励减半,同时限制比特币的总量为2100万枚,将在2140年比特币将达到2,100万枚。现在产生新区块奖励比特币数量是12.5BTC。

那么这个数学题是怎么样的呢?

本质而言就是一个哈希运算的题目,即通过选取一个合适的nonce的值,使得(prevBlockHash || merkleRoot || nonce)的哈希值要小于一个目标值,即

这个目标值如果有越多的前导0,则难度越大。因为位数一定的情况下,越多leading zeros意味着有越少的解。

find-valid-block

这里的nonce不止存在于Block Header中,创币交易中还有一个nonce。

创币交易(Coinbase Transaction)是每个区块的第一笔交易,跟普通交易不同的是,创币交易没有交易输入,不消耗UTXO。创币交易只包含一个被称作Coinbase的输入,用来创建新的比特币。创币交易有一个输出,支付到这个矿工的比特币地址。

因为Merkle Tree的结构,只要改变创币交易中的nonce,那么这个变动会一直传递到根节点,导致哈希值的改变,所以计算机在解数学题的时候,需要尝试非常多的可能性。但是,验证是非常简单的,只需要代入nonce,即可快速验证最终的哈希是否小于目标值。Work is hard to solve but easy to verify。

既然,比特币网络是一个分布式系统,那么如果同时有两个节点,各自独立计算出了两个合法的的哈希值均满足要求,怎么办?这就就带来了一个新的问题,区块链分叉,下面我们来讨论一下这个问题。

3.4 最长链原则与分叉(forking)

two-find

全网本来都基于蓝色区块链,接下来,全网节点分成2个阵营(红和绿)。

two-groups

当前2个阵营都是合法的,因为他们完全符合区块链延伸的要求,同时两个阵营的区块链长度一致。除非保证两个阵营的算力永久平均分配,否则总有一个阵营抢在另一个阵营前发现工作量证明解并将其传播出去。在这个例子中我们可以打个比方,假如工作在“绿色”区块上的矿工找到了一个“粉色”区块延长了区块链(蓝色-绿色-粉色),他们会立刻传播这个新区块,整个网络会都会认为这个区块是有效的。

chain-extend

所有在上一轮选择“绿色”区块为胜出者的节点会直接将这条链延长一个区块。然而,那些选择“红色”区块为胜出者的节点现在会看到两个链:“蓝色-绿色-粉色”和“蓝色-红色”。如下图所示,这些节点会根据结果将“蓝色-绿色-粉色”这条链设置为主链,将“蓝色-红色”这条链设置为备用链。这些节点接纳了新的更长的链,被迫改变了原有对区块链的观点,这就叫做链的重新共识。因为“红”区块做为父区块已经不在最长链上,导致了他们的候选区块已经成为了“孤块”,所以现在任何原本想要在“蓝色-红色”链上延长区块链的矿工都会停下来。全网将“蓝色-绿色-粉色”这条链识别为主链,“粉色”区块为这条链的最后一个区块。全部矿工立刻将他们产生的候选区块的父区块切换为“粉色”,来延长“蓝色-绿色-粉色”这条链。

longest-chain

4 共识算法

4.1 分布式系统

什么是分布式系统?

distributed-system

分布式系统的CAP理论

CAP

proof-of-CAP

4.2 拜占庭将军(Byzantine Generals Problem)问题

拜占庭将军问题(Byzantine Generals Problem),是由 Leslie Lamport (Writing Collection) 于1982年在论文 Byzantine Generals and Transaction Commit Protocols 中提出的分布式对等网络通信容错问题。

在分布式计算中,不同的计算机通过通讯交换信息达成共识而按照同一套协作策略行动。但有时候,系统中的成员计算机可能出错而发送错误的信息,用于传递信息的通讯网络也可能导致信息损坏,使得网络中不同的成员关于全体协作的策略得出不同结论,从而破坏系统一致性。拜占庭将军问题被认为是容错性问题中最难的问题类型之一。

Lamport在论文中描述了这样一个著名的问题:

一组拜占庭将军分别各率领一支军队共同围困一座城市。为了简化问题,将各支军队的行动策略限定为进攻或撤离两种。因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过投票来达成一致策略,即所有军队一起进攻或所有军队一起撤离。因为各位将军分处城市不同方向,他们只能通过信使互相联系。

在投票过程中每位将军都可以选择进攻或撤退,并通过信使把自己的决定传达给所有将军,这样一来,每位将军都可以根据自己的投票和其他将军的信息来获知总的投票结果,最后决定行动策略。

上述的故事映射到计算机系统里,将军便成了计算机,而信差就是通信系统。

虽然上述的问题涉及了电子化的决策支持与信息安全,却没办法单纯的用密码学与数字签名来解决。因为电路错误仍可能影响整个加密过程,这不是密码学与数字签名算法在解决的问题。因此计算机就有可能将错误的结果提交去,亦可能导致错误的决策。

4.3 PAXOS共识算法

PAXOS是一个解决非拜占庭错误的早期共识算法,非常著名,并且有许多变种。它是由拜占庭将军问题的提出者 Lamport 于1990年提出的,是一种基于消息传递且具有高度容错特性的共识(consensus)算法。

需要注意的是,Paxos常被误称为“一致性算法”。但是“一致性(consistency)”和“共识(consensus)”并不是同一个概念。Paxos是一个共识(consensus)算法。

为描述Paxos算法,Lamport虚拟了一个叫做Paxos的希腊城邦,这个岛按照议会民主制的政治模式制订法律,但是没有人愿意将自己的全部时间和精力放在这种事情上。所以无论是议员,议长或者传递纸条的服务员都不能承诺别人需要时一定会出现,也无法承诺批准决议或者传递消息的时间。但是这里假设没有拜占庭将军问题(Byzantine failure,即虽然有可能一个消息被传递了两次,但是绝对不会出现错误的消息);只要等待足够的时间,消息就会被传到。另外,Paxos岛上的议员是不会反对其他议员提出的决议的。

对应于分布式系统,议员对应于各个节点,制定的法律对应于系统的状态。各个节点需要进入一个一致的状态,例如在独立Cache的对称多处理器系统中,各个处理器读内存的某个字节时,必须读到同样的一个值,否则系统就违背了一致性的要求。一致性要求对应于法律条文只能有一个版本。议员和服务员的不确定性对应于节点和消息传递通道的不可靠性。

4.4 区块链使用的共识算法

工作量证明 (PoW - Prove of Work)

干得越多,获得越多 —— 社会主义制度,按劳分配,多劳多得
可以简单地理解为 One GPU/CPU, One Vote

PoW,就是大家熟悉的挖矿,通过数学运算,计算出一个满足规则的随机数,即获得本次记账权,发出本轮需要记录的数据,全网其它节点验证后一起存储。

例如比特币、莱特币采用的共识算法就是 PoW,专业一点说,矿工们在挖一个新的区块时,必须对SHA-256密码散列函数进行运算,区块中的随机散列值以一个或多个0开始。随着0数目的上升,找到这个解所需要的工作量将呈指数增长,矿工通过反复尝试找到这个解。最先算出正确答案的节点可获得当前区块的记账权,同时获得新发行比特币的奖励。

这就解决了对比特币网络做出贡献节点的奖励问题。POW与最长链机制的结合,又让比特币具备了不可被篡改的特性。在这样的共识机制下,即使是没有中心机构做信用背书的比特币,也同样获得了广泛的信任,有着世界范围内的强大生命力。

优点:

  • 安全性高,针对PoW的攻击少。攻击者至少需要51%以上的算力才能攻击系统。
  • 匿名性

缺点:

  • 能耗高、不环保。挖矿吸引了全球算力的投入,就像美国的淘金热,本来依据算力公平分配奖励的机制,演变为了对矿机算力的大举投入,扭曲了中本聪的设计初衷,消耗了大量的能源。
  • 确认慢。网络性能太低,需要等待多个确认,容易产生分叉,区块的确认共识达成的周期较长(10分钟),现在每秒交易量上限是7笔(visa的平均每秒交易量上万,支付宝峰值接近9万),不适合商业应用。
  • 容易产生分叉
  • 也存在算力集中化的问题,慢慢偏离了原来的去中心轨道

权益证明 (PoS - Prove of Stake)

钱越多,权利越大 —— 资本主义制度,按钱分配,钱生钱
可以简单地理解为 One Coin, One Vote

PoS 试图解决 PoW 机制中大量资源被浪费的情况,这种机制通过计算你持有占总币数的百分比以及占有币数的时间(币龄)来决定记账权。准确来说,你拥有的币越多、币龄越久,那么给你分配的哈希运算的题目就会越简单,你就能越快的解出题目,获得记账权,即节点记账权的获得难度与节点持有的权益成反比。虽然相对于 PoW ,一定程度减少了数学运算带来的资源消耗,性能也得到了相应的提升,但依然是基于哈希运算竞争获取记账权的方式。例如:恒星币,狗狗币等。

在现实世界中 PoS 很普遍,最为熟知的例子就是股票。股票是用来记录股权的证明,股票持有量多的,拥有更高更多的投票权和收益权。

优点:

  • 能耗低、环保
  • 矿工=持币者,两者的动机和利益一致
  • 不分叉

缺点:

  • 安全性逊于PoW,针对PoS的攻击种类多,常见包括贿赂攻击、长程攻击、无利害攻击
  • 非匿名、有许可
  • 安全性假设高。PoW的假设是,有51%的算力是诚实的,Typical PoW 假设至少有2/3(66.7%)的钱控制在诚实(honest)的人手里,而Algorand假设至少80%的钱控制到在非常诚实(strongly honest)的人手里
  • 极端的情况下会带来中心化的结果。借用经济学领域的马太效应,即持有币越多的人会获得更多的币奖励,从而加大贫富差距,最终产生超过50%的中心化节点,被动演化为非预期的中心化的结果。

PoW和PoS的比较

详细的关于PoW和PoS之间的比较,可以阅读一下这篇文章《PoW和PoS的全面比较:各自的优劣在哪?》,是Conflux的杨光在一次沙龙活动上分享,文章很长,但说明的非常详细。

比较项 PoW PoS
投票准入机制 无许可 必须先持币
投票匿名性 匿名投票 公开投票
参与投票的人数 人力、算力无上限 可预估
投票形式 完全并行地计算PoW(确认慢) 广播投票消息
投票结果确认 一个分支上积累的难度优势已经足够大(吞吐量低、不环保) 得到多数比例的投票权的确认
投票(边际)成本 矿机和能源 资本的流动性(存在贿赂攻击、无利害攻击)
先有投票权还是先有候选区块 先有区块,后有投票 先决定投票权(存在长程攻击)
投票行为与投票权的关系 强绑定,获取投票权即投票 不绑定

PBFT