区块链
什么是区块链?从科技层面来看,区块链涉及数学、密码学、互联网和计算机编程等很多科学技术问题。从应用视角来看,简单来说,区块链是一个分布式的共享账本和数据库,具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。这些特点保证了区块链的“诚实”与“透明”,为区块链创造信任奠定基础。而区块链丰富的应用场景,基本上都基于区块链能够解决信息不对称问题,实现多个主体之间的协作信任与一致行动。区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。
梅兰妮·斯万,她提出了被广泛引述的一种阶段划分:区块链 1.0 是货币、区块链 2.0 是合约、区块链 3.0 是应用。
区块链1.0——比特币系统
区块链起源于比特币,2008年11月1日,一位自称中本聪(Satoshi Nakamoto)的人发表了《比特币:一种点对点的电子现金系统》一文,阐述了基于P2P网络技术、加密技术、时间戳技术、区块链技术等的电子现金系统的构架理念,这标志着比特币的诞生。两个月后理论步入实践,2009年1月3日第一个序号为0的创世区块诞生。几天后2009年1月9日出现序号为1的区块,并与序号为0的创世区块相连接形成了链,标志着区块链的诞生。区块链是一种源自于“比特币”的底层技术。换句话说,比特币是区块链技术的第一个大获成功的应用。
- 比特币的出现是源于技术极客想解决的一个技术难题:“在数字世界中,如何创造一种具有现金特性的事物?”。“比特币:一个点对点电子现金系统”这个标题体现出了中本聪想解决的难题:他想创造在数字世界中可用的电子现金,它可以点对点也就是个人对个人交易,交易中不需要任何中介参与。
- 数字世界中,当一个人要把现金转给另一个人时,必须要有中介机构的参与。比如,我们通过支付宝转账的过程是:支付宝在一个人的账户记录里减掉一定金额,在另一个人的账户记录中增加一定金额。如何创建一个无须中介或者说去中心化的数字现金,一直是一个难题。由于数字文件可以完美复制,如果没有一个中心化数据库做记录,那如何避免一个人把一笔钱花两次?这就是所谓的双重支付或双花问题(double spending)。在比特币出现之前,我们熟悉的主要电子现金系统(如PayPal、支付宝等)都是依靠中心化数据库来避免双花问题。
- 中本聪借鉴和综合前人的成果,加上自己的独特创新,创造了比特币这个点对点电子现金系统,在无须中介的情况下解决了双花问题。特别地,比特币这个电子现金系统是同时去中介化和去中心化的: 个人与个人之间的电子现金无须可信第三方中介的介入,这是去中介化。这个电子现金的货币发行也不需要一个中心化机构,而是由代码与社区共识完成,这是去中心化。
- 比特币并不具备现在各国法定货币的特征,它只是一种数字形式的特殊商品。比特币现在的市场价格和暴涨暴跌也影响着人们对它的看法,把它类比为黄金等投资商品。比特币虽然从来都不是货币,但逐渐地有了价值与价格。比特币的价格在自由市场交易中被确定,又持续、反复地大幅波动。
- 比特币系统包括三层
- 最上一层是比特币这种电子现金。这是整个系统的应用层。
- 中间一层的功能是发行比特币与处理用户间的比特币转移。这一层也叫比特币协议(bitcoin protocol),是整个系统的应用协议层。
- 最底层是比特币的分布式账本和去中心网络。这一层也被称为比特币区块链(bitcoin blockchain),是整个系统的通用协议层。
- 比特币系统实现的去中心化的点对点电子现金,其发行与转账靠的是中间的比特币协议层。来深入看看名为“比特币协议”的这一层。比特币系统架构图又常被进一步细分为五层,它对应的是比特币协议和比特币区块链两个部分。在这个五层架构中,比特币协议层被细分为:应用层、激励层和共识层。
- 比特币系统设计的五个要点:比特币的区块链系统是由分布式账本(即狭义的区块链)和去中心网络(点对点网络)组成的,形成链条的方式是工作量证明共识机制。最长链是由网络中的算力共同决定的,因而它是可信的,节点离开和加入依据的是最长链是可信的这一原则。这些组合起来形成了比特币系统。
- 分布式账本:比特币的区块链是基于工作量证明形成的带时间戳、存储数据的数据块和由哈希指针连接成的链条。这个链条或者说账本以分布式的方式存储在比特币网络的各个节点上,因而也被称为分布式账本。
- 工作量证明:比特币网络中的节点按照规则进行加密哈希计算,以竞争获得生成新区块的权利。节点在竞争获胜后就获得记账权,它生成区块成为最新区块后,就获得与新区块对应的挖矿奖励。工作量证明也是区块链账本的安全机制。如果不重做“工作量证明”所需的大量计算则此链条不可修改,这一共识机制保证了区块链上的数据的可靠性。
- 最长链原则:在任何时刻,最长的链条是所有人都接受的最终记录。由于最长链是由网络中的主要算力完成的,因而只要它们不都与攻击者合作,那么它们生成的最长链就是可信的。
- 通证经济专家孟岩曾撰写一篇文章,标题是“其实没有什么比特币,只有UTXO”,这个标题指出了,对于计算机来说比特币是什么——比特币是区块链账本上的交易输出。
来看一个两个人进行转账交易的过程,以深入理解UTXO:假设我有 8 个比特币,这其实意味着,之前有一个交易把这些比特币转入我的地址,这个交易的输出(即 8 个比特币)未被使用,我拥有了这 8 个比特币。现在,我要发起一个转账交易,这个交易中的输入是让我拥有这些比特币的上一个交易。我要转账给你,我做的是,对让我拥有这些 8 个比特币的上一个交易进行签名,把这一新转账交易的输出地址设为你的钱包地址。这样,我就发起了一个转账支付交易。等矿工将这一交易打包进新的区块,转账交易完成,这 8 个比特币就属于你了。你拥有的是你我这个交易的未使用的交易输出。
以上两个人的转账交易过程是:我用私钥(从一个输出是我的地址的交易中)取出比特币,并用私钥对从我的地址转到你的地址的新交易进行签名。一旦交易完成,这些比特币就转到你的钱包地址中去。你的钱包中新交易的未使用交易输出,只有你的私钥才可以打开。
从以上讨论中我们可以看到,的确不存在比特币,只有未使用的交易输出(UTXO)。每一笔比特币都源自上一个交易,可以一直向上追溯上去。而一直向上追溯,在每一笔比特币的源头,都有一种特殊的交易,即比特币矿工因挖矿获得奖励的创币交易,每一个比特币都是通过挖矿被创造出来的。假设我作为比特币矿工挖矿成功赢得了 25 个比特币,那么这个特殊交易是,它的输入是 0,而输出是 25 个比特币进到矿工的钱包地址中。
-
比特币区块链的数据结构中包括两种哈希指针,它们均是不可篡改特性的数据结构基础。一个是形成“区块+链”(block+chain)的链状数据结构,另一个是哈希指针形成的梅克尔树(一个区块中的数据是被打包进这个区块的一系列交易。这些交易按照既定的规则被打包形成特定的二叉树数据结构——梅克尔树)。链状数据结构使得对某一区块内的数据的修改很容易被发现;梅克尔树的结构起类似作用,使得对其中的任何交易数据的修改很容易被发现。
-
矿工挖矿是什么意思?
- 挖矿节点计算机在挖矿时要做两个任务: 第一个任务是把比特币网络中未确认的交易按梅克尔树组装成候选区块,未被纳入的交易则往下顺延。
在创建候选区块时,除了普通的交易之外,矿工在其中增加一个特殊的交易:币基交易(coinbase transaction)。如果挖矿成功,则币基交易会凭空转出新区块的奖励比特币到矿工的钱包地址中,从而发行这些比特币出来。这个特殊交易也被叫作“创币交易”,新的比特币是在这一交易中被创造出来的。挖矿节点计算机的第二个任务是真正的挖矿,即进行加密哈希计算,解决一个计算难题,进行算力竞争。在众多争夺记账权的节点中,谁最先完成这个计算,它打包的区块就被加到了区块链的最后,成为最新的区块。率先完成计算的矿工会赢得新区块的挖矿奖励。最初,成功挖出一个区块,矿工可以获得 50 个比特币的奖励,按规则,这个挖矿奖励每四年减半一次,分别为 25 个、12.5 个,以此类推。 - 比特币矿工挖矿是在做什么?在候选区块的头部有一个 32 位的随机数区域,矿工需要反复调整随机数并计算,目标是让整个区块的哈希值小于一个“目标值”。如果试过所有的 32 位随机数可能性后,计算仍未能成功,那么就要改变币基(coinbase)的一个随机数,接着进行反复计算。这个计算是加密哈希计算(对比特币来说是 SHA-256),除了反复计算别无他法。有意思的是,这种挖矿计算是非对称的,你挖矿需要经过 2 的 68 次方个哈希计算,而我要验证你的确找到有效的随机数,只需要一次就可以。第一个完成这个计算难题的节点所打包的区块就成为有效区块,它向全网广播告知自己已经完成,由其他节点确认后(即有别的挖矿节点在这个区块的基础上进行下一个区块的挖矿,生成新的区块)。在等待 6 个区块后,该挖矿节点就可以获得这次比特币奖励。比特币的去中心网络能够长期运行下来,现在有 1 万多个全节点,正是因为有这样的挖矿奖励机制。出于对自己的利益考虑的矿工运维着这个不属于任何人、完全去中心化的网络。
- 再向外看,比特币的挖矿机制在加入挖矿的计算机的算力不断增加的情况下,这个挖矿机制是如何保持稳定的?参与挖矿竞争的计算算力越来越大。相应地,比特币系统有这样一个对应的机制设计:随着算力的增长,调整目标值的难度使得挖出一个区块的时间始终是 10 分钟左右。这形成了一种动态的平衡,维持区块链网络经济激励的有效与稳定。这个决定难度的公式非常简单明了,每挖出 2016 个区块,也就是经过约两个星期,挖矿难度会进行一次调整,该公式是:下一个难度 = 上一个难度 × 2016 × 10分钟 / 产生2016个区块所需的时间。
- 挖矿节点计算机在挖矿时要做两个任务: 第一个任务是把比特币网络中未确认的交易按梅克尔树组装成候选区块,未被纳入的交易则往下顺延。
区块链2.0 —— 以太坊
维塔利克认为,比特币系统的主要设计 UTXO(未使用的交易输出)和其对应的脚本语言有缺陷,他总结认为它有以下四点不足: 缺少图灵完备性(lack of turing-completeness),尽管比特币的脚本语言可以支持多种计算,但是它不能支持所有的计算;价值盲(value-blindness)。UTXO 脚本不能为账户的取款额度提供精细的控制;缺少状态(lack of state),UTXO 只能是已花费或者未花费状态,这意味着 UTXO 只能用于建立简单的、一次性的合约。区块链盲(blockchain-blindness),UTXO 看不到区块链的数据,比如区块头部的随机数、时间戳和上一个区块数据的哈希值。维塔利克得出了自己的结论,他认为应当开发一个“下一代智能合约和去中心化应用平台”。他把自己将要开发的系统命名为“以太坊”。
- 以太坊的最初设计目标是建立一个智能合约和去中心化应用平台,它和比特币区块链的最大不同是,它包括了一个图灵完备的编程语言(Solidity)。利用 Solidity,我们可以在以太坊上更方便地编写“智能合约”,以太坊也提供了一个代码运行环境——以太坊虚拟机(EVM)。有了这些,在以太坊区块链上,逻辑上我们就可以开发去中心化应用(decentralized application)了。
尼克·萨博最早于 1994 年提出了智能合约。他定义道:“一个智能合约是,一个计算机化的交易协议,它执行一个合约的条款。”
交易协议中的“协议”二字指的是计算机协议。尼克·萨博说:“智能合约的设计目标是,执行一般的合同条件,最大限度地减少恶意和意外的状况,最大限度地减少使用信任中介。”他认为,我们需要一个这样的计算机协议:它能够完全保证,如果付款了,商品会被发送,或者商品寄出去了,就会收到钱。在现实生活中,我们有很多办法来实现这一点。而计算机科学家的目标是,用事先确定的代码自动执行合约条款,无须人工干预和第三方中介。
智能合约中的“智能”可以理解为,按条件自动执行,无须人的干预,是自动的或自治的。 智能合约贴切的形象类比,是我们在说起计算机术语“有限状态机”或“状态机”时常用的自动可乐售卖机: 我们向可乐售卖机投入硬币,按一下出可乐的按钮。售卖机将一听可乐从出货口放出来。售货机恢复到最初的状态。
- 以太坊的智能合约设计很简明。 任何人都可以在以太坊区块链上开发智能合约,这些智能合约的代码是存在于以太坊的账户中的,这类存有代码的账户叫合约账户。对应地,由密钥控制的账户可称为外部账户。以太坊的智能合约程序,是在以太坊虚拟机(Ethereum Virtual Machine,EVM)上运行的。合约账户不能自己启动运行自己的智能合约。要运行一个智能合约,需要由外部账户对合约账户发起交易,从而启动其中的代码的执行。
- ERC20 通证标准(ERC20 Token Standard)是通过以太坊创建通证时的一种规范。按照 ERC20 的规范可以编写一个智能合约,创建“可互换通证”。它并非强制要求,但遵循这个标准,所创建的通证可以与众多交易所、钱包等进行交互,它现在已被行业普遍接受。
- 通证是区块链上可流通的加密数字权益证明。通证的用途就是将资产表示为链上的“数字资产”。
- 与比特币一样,以太坊的区块中存储的也是交易(transaction),它包括的字段主要有:接受者(接受的账户)、发送者的签名、发送者发给接受者的以太币金额等。与比特币的区块中存储的是交易不同,以太坊的区块中以梅克尔帕特里夏树(Merkle Patricia Tree,MPT)形式存储的是相应的以太坊账户的状态。以太坊的交易是所谓的状态转换函数,一个交易触发它的执行,它将相应的账户从一个状态转变成新状态,然后新状态被存储在区块链的数据区块中。
区块链3.0
从应用角度,业内普遍将区块链发展分为区块链1.0、2.0和3.0阶段。2008—2013年为区块链1.0阶段,是以比特币为代表的数字货币应用,其场景包括支付、流通等货币职能,经济形态以比特币及其产业生态为主。2013年,以以太坊为代表的区块链2.0应用加入智能合约功能,使得区块链从最初的货币体系拓展到股权、债权和产权的登记、转让,证券和金融合约的交易、执行,甚至博彩和防伪等金融领域。伴随可扩展性和效率的提高,区块链应用范围将超越金融范畴,拓展到身份认证、公证、审计、域名、物流、医疗、能源、签证等领域,成为未来社会的一种最底层的协议,届时区块链将进入3.0时代。