一文看懂比特币与区块链:从原理到应用

96
longlee
2018.02.11 23:03 字数 14652

1 货币的演变——从贝壳到比特币

当社会分工产生之后,人类就产生了商品交换的需求。在货币被发明之前,人类是以以物换物的方式进行的。但显然以物换物存在着商品价值无法精确衡量,效率低下的问题。试想一下,老王扛着一只羊走了一公里山路到老张家里想换几只鸡好过年,但是换6只鸡老王觉得亏,换7只老张又不干。于是人类发明了货币,作为一般等价物,货币可以对商品价值进行精确度量,利于提高商品交换的效率,老王也再也不用扛着羊走山路了,拿着货币去买就好。但是最早的货币是实物货币,也就是贝壳、金、银、铜这些东西。能充当实物货币的东西都具有一定的稀缺性,即一般人不是那么容易就能搜寻或挖掘到很多的,存量有限。后来随着社会经济的发展,交易越来越频繁,人们发现实物货币也存在着很多的弊端。比如易损耗,保存、携带都很不方便、不安全。于是纸币就被发明出来了。纸币最早在我国北宋年间就出现了,被称为“交子”,由官方发行。相较于实物货币本身具有收藏价值,纸质货币本身只是一张纸,并没有什么价值,它的价值完全依赖于发行该纸币的政府的信用。因为人们预期拿着这张纸是可以从政府那里换到金子银子的。看上去这并没有什么问题,但是一旦政府失信,纸币也就形同废纸。政府失信的事在历史不是没有发生过,比如清朝国库存银紧张时,民众手里的银票就只能打折换银子,再比如民国后期,政府疯狂印刷金圆券,物价飞涨,民众手里的纸币飞速贬值。政府在法定货币上的失信相当于掠夺了民众手里的财富。

现代社会,是不是所有的财富都需要印刷成纸币在社会上流通呢?也不是,纸币所代表的财富只占社会总财富很小的一部分,国家发行纸币的总量只要满足市场交易的需要即可,大部分财富是以数字货币的形式存在,每个人的财富只是一串数字,这些数字统统记录在银行的账本上,当然银行的账本现在表现就是计算机里的数据库。在这种情况下,假设小李从苏宁买了台价值3000元的空调,收银的时候只要将小李的银行账户余额C(小李)-3000,再将苏宁的银行账户余额C(苏宁)+3000就可以了。当然现在也可能需要支付宝或者银联等第三方支付提供商做中介完成这笔交易。银行在修改余额即账本数据的时候,需要做一些检查,首先需要小李提供账户密码,用以证明小李对账户余额具有使用权,接着银行还要检查小李的账户余额是否大于等于3000,如果余额不足返回交易失败提示。整个交易过程中,银行作为第三方机构,独立完成了这次交易支付。由于我们国家的国有银行有政府做信用背书,所以小李和苏宁都选择相信银行不会有欺诈行为。但是不是就完全没有风险了呢?并不是。即使银行不会主观上产生欺诈的想法,但同样存在记账错误,或是外来恶意攻击的风险。一旦银行的账本数据发生错误或被恶意篡改,小李和苏宁将没有办法证明自己所拥有的准确的财富。

2009年,中本聪在网上发表了比特币白皮书《比特币:⼀个点对点的电子现金系统》,宣告了比特币的诞生。由于刻意隐藏,至今没有人知道中本聪的真实身份,但是比特币确是一个天才式的创造。比特币参考了在它之前被发明的数十种加密数字货币所取得的成果,这些货币由于各种原因都失败了,一个主要的原因是无法解决“双重支付”问题,所谓“双重支付”是指同一笔货币被重复支付给不同的账户。中本聪认为之前的加密数字货币之所以失败,主要是因为它们都不同程度上存在一个中心机构,一旦这个中心机构失效,整个加密货币系统就崩溃了。所以比特币被设计成一个去中心化的系统,它运用分布式账本和特有的共识机制解决了“双重支付”问题。

2 比特币与区块链的基本原理

2.1 比特币简介

之前已经介绍过,数字货币的本质就是一个账本。当有交易发生,资金所有权发生转移(或称价值转移),就通过在这个账本上记账来体现。传统货币金融系统,央行承担货币发行的职责,商业银行承担放贷和吸储的职责,每笔交易记录、每个账户余额都存在银行的账本上,银行此时是作为一个中心机构。比特币系统完全运行在互联网上,并没有一个中心机构替用户保存账本。相反,每一个持有比特币、运用比特币完成交易的节点(完全节点)都会在本地保存一份账本,并从网络上接收新的交易数据对自己的账本进行更新。所以说,不同于传统货币交易账本由银行私密保存,比特币的账本是公开的,分布式存储在每一个参与交易的节点上。

比特币系统是一种P2P网络系统,网络中并不存在任何中心节点,所有P2P网络中的节点地位都是相等的,每个节点从网络接收资源和服务的同时也向网络中的其它节点提供资源和服务。想加入比特币网络也很简单,从比特币官方网站下载比特币客户端并安装到自己的计算机,保证本地存储系统有足够的空间来存储公共账本数据,运行比特币客户端并联入互联网,客户端端口会自动连接到若干现有节点,此时这台计算机就可以作为比特币网络中的一个节点存在了。初始加入的比特币节点可以从其它节点接收账本数据并保存下来。比特币网络中的节点时时刻刻都是在动态变化的,一个节点可以随时选择退出,重新加入时只需要连接其它节点并接收它离开期间新增的交易数据就可以。

虽然每个节点都保存有比特币交易账本,但为了保持所有账本副本的一致性,每笔交易只能安排一个节点记账,其它节点同步新增的交易数据。那到底哪个节点拥有记账的资格呢?比特币系统采用了竞争记账的机制。所有节点共同参与一个解方程大赛,由于这个方程解空间巨大且无任何求解的规律可言,每个参与竞赛的节点只能采用随机尝试的办法搜索方程的解。这样一来,解方程大赛就变成了对各节点计算机运算能力的一场考验,拥有最强大运算能力的节点显然可能更快找到解。一旦某个节点率先找到一个满足要求的解,它就抢到了本次竞赛的记账权。这样的解方程竞赛大约每10分钟在全网举行一次,抢到记账权的节点迅速将过去10分钟全网发生的交易数据记录到一个新的区块(区块链的基本单位,可以看成是一个具有特定数据结构的文件),并将这个区块马上向全网分发,网上的其它节点接收到这个区块时,它就意识到本次解方程大赛已经结束了,进而马上停止本轮的解方程竞赛,同时开始下一轮解方程大赛。

比特币交易的过程完全是匿名的。比特币客户端有钱包的功能,比特币钱包并不存储货币,存储的是地址和私钥。根据非对称加密的原理,一对非对称密钥分为公钥和私钥,私钥私密保存,公钥可以公开出来,其它节点想给当前节点加密发送消息时,可以用公钥对消息进行加密,只有拥有私钥的节点才能对消息解密,这样就保证了信息传输不会被泄漏。在比特币网络,每个节点的私钥由钱包加密存储,用户也可以备份成其他形式存储。公钥经双Hash运算得到的字符串,被称为地址,其实就是另一种形式的公钥。一个比特币地址和它对应的私钥就可以看成一个账户,地址可以看做用户名,私钥看做账户密码。拥有私钥的人就拥有这个地址上的所有资金。比特币的账本数据中并不存在账户余额的概念。事实上账本数据中如果用余额字段来表示每个节点拥有的资产,那么余额字段的数据是很容易被恶意篡改的。既然没有余额数据,那么交易时就没有办法通过对相关节点余额字段的修改实现。事实上,比特币交易中“花费”的是在交易中生成的“未使用的交易输出(UTXO)”。每一笔交易转账相当于将一笔钱注册到新的地址上。比特币地址并没有余额,有的是遍布在账本里所有注册在这个地址上的UTXO。相当于这个地址所拥有的资金分布在一笔笔交易记录中。比特币客户端显示的账户余额其实是对账本数据中隶属于当前节点的UTXO逐一统计得到的结果。

2.2 比特币交易

比特币将货币、交易、账本全都变成了一种数据结构,所以看一下一笔交易的数据结构你会更理解。

表2-1 交易结构

如表2-1所示,一笔交易可以包含多个输入并形成多个输出。尚未被“花费”的交易输出即UTXO(unspent transaction output),所谓“花费”指将这笔钱注册到其它地址(资金所有权转移)。时间戳标记这笔交易发生的时间。再来看一下交易输出(表2-2)和输入(表2-3)的数据结构。

表2-2 交易输出结构

交易输出的数据结构很简单,主要就是资金总量和锁定脚本。资金总量表明了转账了多少钱。锁定脚本其实表明了这笔钱的所有权。锁定脚本里包含的最重要的内容是转账的目标地址,之前我们也介绍过,比特币地址其实就是公钥转换得到的。交易输出里包含了目标地址相当于用公钥给这笔钱(交易输出)上了一把锁,只有唯一那个有对应钥匙(私钥)的用户才可以使用它。

交易输入的数据结构如表2-3,主要包括指向UTXO的指针和解锁脚本。注意到,比特币账本里只有交易输出才记录了资金,交易输入只是使用资金时用的那把钥匙。其中指向UTXO的指针字段表明要“花费”哪个UTXO。解锁脚本包含了用户的私钥,正确的私钥可以解密UTXO锁定脚本中的公钥加密。解锁脚本和锁定脚本一起运行就可以正确使用UTXO完成交易了。

表2-3 交易输入结构

现在小李从苏宁购买了一台空调,需要支付0.15比特币,小李的比特币客户端里的钱包模块会从所有注册在小李地址上的UTXO中选出一个数额最合适的,假设最合适的UTXO的面值是0.2比特币。现在,小李的钱包就会创建一笔新的交易,输入就是面值0.2比特币的UTXO,生成一笔0.15比特币的输出(一个UTXO),输出锁定脚本包含苏宁的地址。与此同时生成一笔地址为自己的输出0.04比特币(另一个UTXO),也就是找零。但是这里0.2-0.15-0.04=0.01,剩余的0.01比特币作为交易费用,用来奖励承担记账工作的节点,赢得记账权的节点会自动收集的。

2.2.1 交易周期

一笔比特币交易的生命周期从它被创建的那一刻开始,节点会将这笔交易在比特币网络上广播,收到这笔交易数据的节点会对交易有效性进行独立检验。检验内容包括语法和数据格式是否有误、交易输入和输出是否为空等等。通过独立验证的交易会被放入节点自己的交易池,同时继续向其它节点广播,没有通过检验的交易直接被拒绝并不再广播。等到这笔交易被网络上的大部分节点验证,可能耗时不到一秒钟,交易会最终被一个挖矿节点验证并记录到区块链上一个还记录有很多其他交易的区块上(挖矿节点:参与解方程大赛并取得当次记账权的节点)。此时这笔交易的交易输出(UTXO)还不能被使用,等到区块链中在这个区块之上又生成足够多的区块,交易才成为区块链总账簿的一部分,这时交易输出UTXO就可以被新的资金拥有者在下一笔交易中使用了,这样就进入下一个交易周期了。

2.3 比特币网络与节点

比特币运行在互联网上并采用P2P协议,P2P网络又称对等网络,网络中每个节点的地位都是相等的。比特币设计的核心原则是去中心化,采用P2P网络很好的体现了这个核心原则。虽然比特币网络中每个节点的地位相等,但不同节点的功能还是不一样的。但是,任何节点都包含四个基本功能中的一个或者多个:钱包、矿工、完整区块链、网络路由节点。

所有节点都是网络路由节点,可以对新创建的交易和区块进行验证,对通过验证的交易和区块进行转发。

一个具备全部四个功能的节点被称为全节点。全节点在本地存储完整的区块链数据(账本),可以独立的对交易和区块数据进行验证而不需要依赖于其他节点。

图2-1 全节点

全节点同时具备挖矿功能,即参加算力竞赛(解方程大赛)来赢得记账权的能力。之所以称竞争记账权的行为为“挖矿”。这是为了类比于传统实物货币(金、银)的挖掘开采行为。每个在算力竞赛中获胜的节点能够获得一定数量的比特币做奖励,目前是12.5个比特币,奖励的数量大约每4年会减少一半。除全节点之外,也有单独的挖矿节点。

全节点同时具备钱包功能。钱包是用来生成并保存地址和私钥,同时创建交易的模块。

相比于全节点,有些节点只存储了部分区块链数据,它通过“简易支付验证(SPV)”的方式来完成交易验证,称为SPV节点或轻量级节点。SPV节点一般具备网络路由节点和钱包功能。为了让智能手机这种资源有限的终端具备比特币交易的能力,SPV节点现在越来越普遍。

2.4 比特币区块链

区块链的英文名字 Block Chain 更容易理解。Block其实是一个常用的数据量大小的度量单位。比如在Linux/Unix系统里有一个数据块(Data Block)的概念,数据块是文件系统读写的最小单元,在Linux/Unix系统中是512个字节,一个文件所占大小就是数据块的整数倍。又比如在Google分布式文件系统HDFS中,也有一个块(Block)的概念,也是数据存储的一个基本单元,不同之处在于HDFS为了提高大数据的效率和集群的吞吐量,将一个块的大小设置成64MB。所以区块链里的“区块”也是指一个数据单元,而“链”其实就是将很多数据单元(区块)一个个串联起来,就像一个链表。但是链表是通过指针将数据串联起来的,而区块链是通过在每个区块中存储前一个区块的唯一标识符来链接的。具体可以看区块和区块头的数据结构。

表2-4 区块结构

一个区块主要分为两部分:区块头和交易数据。区块头里记录的是这个区块的元数据,具体见区块头数据结构表2-5。交易数据部分记录了从上一个区块被挖出到当前区块被挖出的约10分钟时间内,全网发生的所有比特币交易。比特币系统中一个区块大小并没有严格限制,区块头的大小固定是80个字节,平均每个交易至少是250个字节,而平均每个区块至少包含超过500个交易。交易的数据结构之前已经介绍过,下面来看一下区块头的数据结构。

表2-5 区块头结构

 “父区块哈希值”字段存储了前一个区块数据的Hash值,严格来说,并不是整个区块数据的Hash值,而是区块头数据的Hash值。其实是运用SHA256算法对区块头数据做两次Hash运算得出的。由于每个区块头数据具有唯一性,它的Hash值基本可以作为区块的主标识符。所以将前一个区块(父区块)的标识符存在当前区块的区块头里,也就相当于将这两个区块连接了起来。

“Merkle根”字段相当于是区块内所有交易数据的一个数字指纹,要得到Merkle根先要创建一棵Merkle树。假设现在有A,B,C,D四笔交易,创建的Merkle树图2-2。

图2-2 包含A、B、C、D四笔交易的Merkle树

Merkle树是自底向上创建的,是一种Hash二叉树。首先将交易数据输入SHA256算法得到每笔交易的Hash值Ha、Hb、Hc、Hd,这四个Hash值作为叶子节点,将叶子节点Hash值两两连接起来继续输入SHA256算法可以得到上一层节点的Hash值,计算示例如下。如果叶子节点个数为奇数,将最后一个节点复制一份。

Ha=SHA256(SHA256(交易A))

Hab=SHA256(SHA256(Ha+Hb))

如此循环进行,直到只剩一个节点,也就是Merkle树根。考虑到SHA256算法的特性,Merkle根可以看成是所有交易数据的一个归纳,也可以看成是所有交易数据的数字指纹,因为即使任意交易数据被微小篡改,它生成的Hash值也会有很大变化,而叶子节点Hash值的变化,又会影响从该叶子节点连接到Merkle根的路径上所有节点Hash值的变化,最终使Merkle根产生很大的变化。因此Merkle根可以唯一标识一批交易数据,也可以验证一批交易数据是否被篡改过。由于SHA256算法输出固定是32个字节,所以Merkle树中所有节点包括Merkle树根的值都固定是32个字节。Merkle树在比特币系统中的一个主要用处是可以高效的验证一笔交易是否存在于区块中。假设某区块记录了N笔交易,利用Merkle树可以最多计算2*log2(N)次就可以判断一笔交易是否存在于这个区块中。

区块头数据结构中的“难度目标”字段是用来动态调节挖矿难度的,约两周时间会调整一次,为了保证能够在大概在10分钟左右的时间挖出一个区块(解出方程)。Nonce字段也是在挖矿(解方程大赛)时用到的,Nonce字段的值作为方程未知变量的一部分,不断修改Nonce字段值以获得满足难度目标的解。

区块链就是就是将包含交易信息的区块从后往前依次连接起来的数据结构。它可以存储在文件系统,也可以存储在一个简单数据库。区块链可以被视为一个垂直的栈,第一个区块(创世区块)作为栈的底部,后续创建的区块依次向上叠加,这样就可以用一些术语,“高度”来表示当前区块离第一个区块之间的距离,用“顶部”表示最新生成的区块,用“深度”表示当前区块距离顶部区块的距离。

每个区块的区块头数据经SHA256算法得到区块Hash值,每个区块的区块Hash值并不存在于自身数据当中,而是在创建它的子区块(栈内上一层区块)时临时计算得出并存储在子区块“父区块哈希值”字段中。由于区块Hash值可以在区块链中唯一识别出一个区块,因此通过“父区块哈希值”就可以引用前一个区块。这样就通过“父区块哈希值”字段将每个区块依次链接起来形成了一条一直可以追溯到首区块(创世区块)的链条,见图2-3。每个区块都只有一个父区块,但可能存在多个子区块,这被称为“区块链分叉”。这种情况只在两个矿工几乎同时挖掘出新区块时才可能出现,但也只是暂时存在,很快区块链系统就会选出工作量最大的链条作为主链。

图2-3 区块通过引⽤⽗区块的区块头哈希值的⽅式,以链条的形式进⾏相连

区块哈希值虽然只是区块头数据的Hash值,但是区块头中包含的Merkle根字段是对所有交易数据的一个概括。上面介绍过,任何对交易数据的微篡改都会导致Merkle根发生很大变化,进而导致区块哈希值也发生变化。由于子区块会存储父区块的区块哈希值,所以如果父区块任意数据有变动,就会导致子区块数据产生变动,而子区块数据变动又会导致孙区块值发生变动,等等以此类推。很明显,对区块链中任意区块数据的篡改都会导致它后续所有区块的数据发生变动,除非将后续所有区块都重新生成,否则无法修改区块链中的数据。而重新生成区块面临着巨大的工作量(解出每个区块中的方程),当区块的“深度”到达6时,由于巨大的工作量导致实际上想篡改这个区块的数据已经变得不可能。这种区块链历史数据不可更改的特性是区块链可信的一个关键原因。同时,这也是比特币安全性的一个关键原因。

2.5 比特币挖矿

将比特币网络中节点之间竞争记账权的行为称为“挖矿”。“挖矿”是比特币系统中一个非常聪明的设计,它同时实现了三个目标:

(1)一种激励机制,使得比特币节点有动力去记录交易数据。

(2)实现了新币发行。

(3)通过工作量证明算法(解方程大赛)使得区块链历史数据实际上不可更改。

之前说节点之间竞争记账权其实是在参加每10分钟一场在全网举行的解方程大赛。每场竞赛的获胜者将获得本轮记账权,有权创建一个新区块并将前10分钟全网发生的比特币交易记录到新区块。解方程大赛的规则被一个称为“工作量证明(Proof of Work)”的算法所定义。工作量证明算法定义每轮竞赛中所有挖矿节点独立求解一道包含Hash函数的方程,谁先求出满足难度目标的解,谁就获胜。

什么方程?Hash(区块头数据)=满足难度目标的哈希值。

其实就是通过不断修改区块头中的Nonce字段值(通常是递增1),使得区块头哈希值满足难度目标。难度目标就是区块头“难度目标”字段值。这个难度目标字段值通常类似于:哈希函数的输出值十六进制表示以0开头。从概率角度看,平均随机尝试16次可以得到一个满足难度目标的解(十六进制数字取值0到F)。从数字角度看,要找一个输出小于0x10000000......0的输入。显然,这个字段的值可以看成一个难度阈值。如果将难度阈值继续降低,要找到一个满足要求的解会变得越来越困难。2014年的时候,一个矿工平均要尝试10^15次才能找到一个合适的Nonce使得区块头信息哈希值足够小。这几年随着计算机运算能力的快速进步,挖矿设备越来越专业,难度阈值也设置的越来越小,才能保证全网10分钟左右挖出一个新区块。难度目标的调整是依据最新的2016个区块(约两周时间)与20160分钟的比较得出的。

挖矿过程中,每次尝试虽然是Nonce值递增,但其实是在随机尝试。这是由哈希函数的三个性质决定的:

(1)不可逆。不可能根据哈希函数的输出值反推出输入值。

(2)抗碰撞。两个不同的输入值得到相同哈希输出的可能性极低。

(3)高灵敏。当输入有微小变化时哈希值输出都会产生巨大的变化。

以上三个性质保证在搜索解时,没有办法用前面的前一步经验来指导后续的搜索,只能一直处于随机搜索的状态。这保证了想参与挖矿或者说在工作量证明中获胜的节点唯一的选择就是不断提高自己的算力,而没有任何其它的“捷径”,而这点正是区块链安全性的基石。

挖矿是比特币系统运行的核心环节,但是参与挖矿的节点需要投入大量的资源,包括挖矿设备和电力消耗。显然如果没有激励机制,节点是没有动力去挖矿的。比特币的设计是,节点挖出一个新区块以后,它记录的第一笔交易并不是从全网接收到的交易,而是自己创建的一笔特殊交易——创币交易或者称coinbase交易。假设A节点挖出了一个新区块,它创建的创币交易内容类似于“向A节点的地址支付12.5个比特币”。这12.5个全新的比特币是之前不存在于区块链账本中的增量,也是作为对挖矿节点的奖励。创币交易的特殊在于不消耗UTXO,即没有交易输入只有交易输出。所以给挖出新区块的节点的奖励包括两部分:新币奖励和交易费用。目前矿工获得的主要收益还是新币奖励为主,交易费用占比还比较小。

可以看出,挖矿设计的高明之处在于它不仅是一种激励记账的机制,同时解决了加密数字货币新币发行的难题。从2009年1月每个区块奖励50个比特币开始,每四年奖励的比特币数量减少一半(准确地说是210,000个区块),直到2100万比特币全部发行完毕(大约2140年),目前每个新区块奖励12.5个比特币。可以看出,比特币是一种总量有限的紧缩货币。

2.6 去中心化共识机制

一种货币体系很重要的组成部分就是要有一份所有参与者一致信任的账本。这在传统货币体系中很容易实现,银行作为货币体系的中心结构,保存这样一份账本并在新交易发生时维持对账本的更新。但比特币网络是由分布在互联网上的数以万计的节点组成,并没有中心机构来保存账本,那么那么多节点之间如何形成一份一致认可的账本?中本聪的一个主要创新就在于设计了一种去中心化共识机制,解决了古老的“拜占庭将军难题”,即如何在不可信的环境中在异步节点之间达成共识。共识是网络中数以万计的独立节点遵守了简单的规则,独立异步地交互形成的产物,主要包括以下四个方面:

(1)每个节点对接收到的交易的有效性进行独立检验

(2)每个节点通过工作量证明算法竞争记账权并对近期的交易独立打包记录到新区块

(3)每个节点对接收到的新区块进行独立检验并组装到区块链

(4)每个节点独立地选择区块链,在工作量证明机制下选择累计工作量最大的区块链

节点对交易数据的独立检验所遵循的规则都是统一规定好的,可能的诈骗、错误等无效交易无法在网络中继续传播。

工作量证明算法一方面实现了比特币账本不会被中心节点所控制,另一方面实现区块链历史数据实际不可更改。这两点之前已经介绍过。

每个完全节点独立保存并更新区块链。所以当节点从网络接收到一个新区块时,它要检验并决定是否组装到本地的区块链上。检验的内容包括:

(1)区块的数据结构语法上有效

(2)区块头的哈希值小于目标难度(确认包含足够的工作量证明)

(3)第⼀个交易(有且只有第⼀个)是创币交易

(4)使用检查清单验证区块内的交易并确保它们的有效性。

。。。。。。

每个节点对每个新区块的独立检验确保了矿工无法欺诈。假设一个欺诈矿工创建一笔交易向自己支付一大笔比特币。接收到这个区块的节点基于相同的检验规则将很快能发现,从而选择拒绝这个新区块,这样这个欺诈矿工不仅不会得到额外的钱,反而会浪费挖矿耗费的大量投入。

去中心化共识会遇到的一个情况就是区块链“分叉”。当两个节点几乎同时挖出新区块时。由于互相都没有收到对方的新区块,所以它们会将自己挖出的新区块广播出去。网络上的其它节点就可能在几乎同时接收到两个新区块,而且都可以有效的组装到现有区块链上。这个时候节点会把两个区块都保存下来,形成区块链的两条分叉。“分叉”只是暂时现象,解决办法就是看这两条分叉谁的工作量累计的更快,节点独立地选择累计工作量最大的链作为主链。当所有节点都独立选择最长的链作为区块链主链时,很快全网节点就会重新达成共识。

去中心化共识唯一的隐患是可能遭受“共识攻击”,典型的是“51%攻击”。之前介绍过,工作量证明算法使得区块链历史数据实际上不可更改,因为区块的生成需要巨大的工作量,背后需要巨大的算力支撑。但是一旦网络中有超过一半的算力被攻击者掌控,它就可能篡改交易数据。针对记录目标交易的区块,攻击者重新构造一个新区块,并故意与之形成分叉,在新区块中,攻击者可以重新生成一笔与目标交易数额相等但支付地址不同的交易,如果支付地址改为自己掌握的节点地址就可以把这笔钱转给自己。在后续的累计工作量竞赛中,攻击者利用自己掌握的超过一半算力获胜,进而使得故意分叉的链条成为全网的主链,最终实现交易欺诈。所以为了保证大额交易安全,建议在大宗商品交易用比特币支付时,接收方要等到记录此交易的区块深度超过6时,再进行商品交付。

3 区块链的应用与发展

区块链是比特币的底层技术之一,比特币是区块链的一个应用,也是目前为止区块链最成功的应用。在比特币里,区块链被看成是一个分布式的公开账本。区块链可以存储账本,当然也可以存储其它数据,比如合约、证书、法律文件等等,所以本质上区块链是一个分布式数据库,可以应用在很多领域。但是并不是说区块链只是一个数据库,相反区块链数据存储成flat file和Google的LevelDB数据库,都不是区块链的创新点。区块链的核心创新点是去中心化共识机制。区块链为了实现去中心化共识机制用到了很多的技术,包括P2P协议、非对称加密技术、哈希加密技术、时间戳、Merkle树、UTXO、工作量证明算法(PoW)等。所以,可以将区块链技术看成是一个技术集合。

区块链脱胎于比特币,早期大家的关注点主要是以比特币为代表的加密数字货币,这两年大家越来越关注区块链技术在各个领域的应用。很多人认为,区块链的现状就像早期的互联网,区块链技术给人类社会带来的影响将不亚于互联网。所以我们讲区块链不仅仅是指比特币里的区块链技术,还包括很多在它之上的创新和发展。

比特币的区块链技术在应用时存在的四个主要问题是:

(1)脚本语言太复杂,开发难度大。

(2)生态系统基础比较差。既没有完善的开发工具,也没有文档和教程。

(3)脚本语言并非图灵完备。图灵完备指一切可计算的问题都可以用该语言描述并计算。由于没有图灵完备,限制了比特币脚本语言的用途,没有办法开发更高级的应用,例如没有办法实现去中心化的交易所。

(4)比特币区块链协议的扩展性不足。比特币系统中只有一种符号——比特币,没有办法用户自定义其它的符号,比如公司的股票、债券等,这使比特币失去了在其它领域应用的可能性。

(5)工作量证明算法耗费耗费大量的设备和电力资源。

2013年一位叫做 Vitalik Buterin 的俄罗斯少年发表了以太坊白皮书——《以太坊:下一代智能合约和去中心化应用平台》。以太坊解决了比特币区块链扩展性不足,智能记录交易不能记录其它数据的问题。此外,以太坊通过其丰富的编程语言和完善的开发工具,解决了针对开发者不友好的问题,它让任何人都能很轻松的在以太坊上建立新的协议和智能合约。目前,以太坊已经成为应用最广泛的区块链技术。

除以太坊之外,还有很多的区块链项目出现。这里将目前有影响力的区块链项目做一个分类,大致可以分为四类:数字资产;智能合约平台;全球支付与结算;平台类的应用服务。

3.1 数字资产

数字资产分为一般数字资产和主打匿名应用的匿名数字资产。

一般数字资产包括比特币、莱特币、新经币(NEM),Decred,狗狗币Dogecoin等。以比特币为代表它们要解决的就是跨中心情况下的支付问题。跟比特币比较起来,其它代币原理类似,但针对自己的使用场景有一些改进。

莱特币的交易确认时间是2.5分钟,也就是每2.5分钟有一个区块被挖出,相较于比特币的10分钟,确认时间大大缩短,交易效率更高。

新经币的共识机制是重要性证明(Proof of Importance),根据交易量、活跃度等维度而不仅仅是根据工作量来决定区块链的记账权。

Decred强调社区投入、公开治理以及可持续挖矿。它的特点是共识机制采用工作量证明PoW和权益证明PoS结合的方式。相比于工作量证明算法,权益证明算法不要求挖矿节点完成大量的计算工作,而是节点能够对一定数量的钱展示所有权。权益证明由于不需要挖矿,避免了类似工作量证明算法消耗大量设备和电力的问题,所以受到广泛关注。

狗狗币是结合Doge文化发展起来的,有自己独特的社区文化,具有交易便捷、转账速度快、确认时间短等特点,在小费、慈善等场景应用的活跃度很高。

匿名数字资产要解决的是如何在保护隐私的情况下完成支付的问题。我们知道比特币匿名机制在于你无法知道比特币地址背后所有者的真实身份,但是比特币区块链是公开账本,每个地址的交易数据都是完全公开的。尤其是当用户在比特币交易网站注册时,往往会填写身份信息,这样就可能暴露用户身份信息。匿名数字资产比较知名的有达世币Dash、门罗币Monero以及采用零知识证明的零币Zcash等。

达世币的匿名性通过“混币”的机制实现。原理是先将不同人的币先混在一起,再将各自拥有的份额拿回去,这样就无法知道转账人了。

门罗币采用“环形签名”的机制实现匿名。网络首先将转账者的密钥对和另外一个密钥对集合混在一起得到一个新集合,然后用集合中的私钥逐一签名。其它节点用公钥解密的时候就不确定到底哪个签名是转账者的签名。

零币特色是采用了零知识证明机制实现匿名。原理类似于我们入住酒店时,不需要向前台提供全部个人身份信息,而是公安系统提供一个接口,我们把信息提供给公安系统的接口,公安系统验证身份之后返回结果就可以了。这样就实现了对酒店前台的匿名效果。

目前,全球数字资产超过1000种,充当的都是一般货币的功能,用于交易支付。目前也遇到应用场景有限、自身价值波动过大等问题。

3.2 智能合约平台

智能合约就是在区块链上运行的计算机程序。当满足程序中预先设定的触发条件时,智能合约自动执行。触发条件可以是时间、事件或者交易等。由于区块链历史数据的不可更改特性,智能合约一旦在区块链上注册之后,就不能更改,无法违约。例如,房屋租赁合同协议的智能合约,注册之后,当业主收到定金时会触发执行,自动将房屋的钥匙密钥发送到房客的账户。到了租金交付时间,合约会自动从房客的账户向业主转账预先商定的租金。

再举一个智能合约应用在航班延误险的例子。我们经常坐飞机会买飞机延误险,但是真的延误之后,你还要打电话咨询、在线下开证明、找保险公司,才能执行完你的飞机延误险赔付。如果有智能合约,在区块链上注册好合约以后,连接到航班数据,就能确保航空公司在航班延误之后自动给你赔付了。

比特币区块链可以看做区块链1.0。但比特币区块链因为不是图灵完备的。图灵完备是指一切可计算的问题都能计算,这样的虚拟机或者编程语言就是图灵完备的。比特币区块链不能支持所有种类的计算,无法为账户取款额度提供精细的控制,缺少更丰富的状态记录,导致比特币区块链的扩展性比较差,不能应用在除比特币以外的其它应用上,无法支持复杂的智能合约。

智能合约的区块链平台被称为区块链2.0,代表项目是以太坊。针对比特币区块链扩展性差、缺少图灵完备等特点,以太坊建立了一个可编程、图灵完备的区块链平台。在这个平台上,你可以通过编写简单的程序方便的实现数字资产的生产,对链上运行的各类数字资产的精确控制,比如这个资产是待支付还是被锁定还是有额度限制、和其他资产的自动兑换等等。同时,你也可以开发很多的智能合约,来实现非区块链资产的功能,比如投票、对赌、条件合同等。因为要支持智能合约,以太坊上有两类账户地址。一种是普通账户,和比特币账户地址差不多,一种是合约账户,主要用于智能合约。简单点说,以太坊就是区块链加智能合约。

由于以太坊有着强大的可扩展性和完善的生态支持,在区块链的应用开发上,很多开发者和企业都选择了以太坊区块链作为他们的底层技术平台。

接触过以太坊的人都知道,除了以太坊之外,还有一个以太坊经典,那么这两者是什么关系呢?2016年7月份,由于以太坊网络上,价值6000万美元的以太币(以太坊网络上使用的代币)被黑客盗取,为了追回被盗资金,以太坊创始人Vitalik组织并主导了一次硬分叉,通过在新的链上改写了被黑客篡改的交易记录实现资金追回。这次硬分叉将以太坊区块链分成了两条区块链,由Vitalik主导、接受升级的区块链称为以太坊,它的代币简称ETH(Ethereum,ETH),不接受这次升级的区块链称为以太坊经典,它的代币简称ETC(Ethereum Classic,ETC)。

以太币是以太坊网络上使用的代币,是以太坊内置的区块链资产,类似比特币。但是以太币的主要目的并不是交易支付,而是用于支付智能合约运行的费用。智能合约的运行需要付费,相当于设定了一个门槛,这个门槛对于真的想做应用的用户来说比较低,但对于大量运行垃圾智能合约项目和攻击者来说就是比较大的负担,因此可以有效防止恶意攻击,确保区块链的稳定安全。

3.3 全球支付与结算

目前用于全球支付与结算的区块链项目较为成功的是Ripple和Tether。以Ripple为例来介绍一下。

瑞波Ripple是目前区块链金融领域比较成功的项目之一,支持全球不同网络、不同币种之间即时、低成本的国际支付。银行等机构用户都可以利用瑞波在不同网络之间发送实时的国际付款。与其他区块链项目都由开发者组织进行维护相比,瑞波的运行维护全都由一家叫Ripple Labs的公司负责。瑞波公司是一家组织严格,完全按照法律法规注册的公司,并且获得了很多大公司、投资机构、银行的投资,包括Google、埃森哲、渣打银行等。这种特点也与瑞波公司的目标客户有关。瑞波区块链不向个人开发者开放,主要面向机构客户特别是银行、支付机构等,支持机构客户实现快速、低成本的跨境汇款。瑞波公司大量与银行等支付机构合作,推动瑞波的应用落地。例如2017年7月,日本和泰国之间首个基于瑞波区块链的即时汇款服务正式开始。这项区块链服务能实现个人资金从日元到泰铢的转移,经过2至5秒就能存到收款方的账户上,而现在两国之间常规的汇款都需要花上两个工作日的时间。

瑞波区块链实现跨境支付主要通过内置的代币瑞波币作为中介来实现,瑞波币可以兑换多种法币。瑞波币的发行并不是通过挖矿来实现的,而是通过业务开发交易来分发瑞波币,奖励那些更小差价的流动性提供商,另外向那些有兴趣投资瑞波币的机构销售瑞波币。如果没有挖矿,瑞波币是如何实现交易确认和记账的呢?答案是协议共识机制。不同于工作量证明算法需要网络上巨大的算力维持,瑞波区块链将网络上的节点分为普通节点和验证节点,协议共识机制规定一笔交易只需要验证节点的投票就能完成验证和确认。因此瑞波交易确认的时间非常短。

瑞波币被人诟病的一点是它的中心化运作,即由瑞波公司完全负责。而且,瑞波公司目前持有约三分之二的瑞波币,完全有能力操纵瑞波币的价格,这也是瑞波的一个隐患。当然,瑞波公司也一再发表声明,等瑞波发展成熟之后,会逐渐退出中心化团队的影响,比如去掉验证节点,使瑞波真正成为一个去中心化的区块链网络。

3.4 平台类应用

平台类应用大多是基于以太坊设计并运行的区块链项目,可以看出以太坊的可扩展性,即通过编程可以在它上面实现很多应用。这里介绍三个平台类应用:市场预测平台Augur,计算资源交易平台Golem,数字代币化平台DigixDAO。

市场预测平台Augur是以太坊上的第一个应用。用户基于数据对未来事件的结果进行预测,预测正确的用户会获得奖励,预测错误的用户会失去“投注”。用户参与预测之前,先要“下注”,即进行资金充值,Augur会将钱存进智能合约中,等到结果出来之后,合约自动执行,可以有效防止用户赖账和中心节点作弊风险。任何用户都可以创建一个市场问题或者选择参与某个市场问题。事件结果来自于所有持有代币的人共同决定。注意Augur的代币叫REP,并不是以太币,用户可以用以太币购买REP。

计算交易平台Golem允许用户通过网络交易计算资源,可以把它看做是目前共享经济的一个案例。两类用户:一类为算力资源卖家,另一类为买家。买家创建任务并将任务上传到网络。Golem的代币是GNT,用于买方购买算力时支付酬劳。

数字代币化平台DigixDAO是一个基于以太坊区块链构建的资产代币化平台。DigixDAO的一大贡献是在区块链虚拟资产和黄金之类的实物资产之间建立了一种对应关系,为实物资产的代币化和文档化提供了思路,为之后其它实体资产上链提供了一个范例。DigixDAO中的名词“上链”,也就是实物资产上到区块链上,变成区块链资产。上链显然是区块链项目能够与其它领域结合、落地到真实场景的必经步骤。那DigixDAO是如何将实体资产上链的呢?主要是设计了一个证明资产存在和所有权的制度,并且证明记录会通过星际文件系统(目标取代HTTP协议的P2P分布式文件系统)和以太坊永久性地发布和保护。DigixDAO独创了PoA资产证明(Proof of Assets, PoA)。

可以通过DigixDAO的铸币来认识PoA。比如现在要对黄金上链,一克黄金的价值,由黄金供应商、托管商、审计商之类的“监管链”参与者通过连续数字签名进行认证,将这一克黄金的信息注册成资产证明(PoA)资产卡,永久性地上传到去中心化数据库中。PoA卡被保存在以太坊钱包里,当PoA资产卡被发送到铸币智能合约时,DigixDAO的代币DGX就生成了。每个DGX代币代表1克被伦敦金银市场协会认可的金条黄金。这就是DigixDAO的铸币过程。

4 总结

区块链技术的核心是它能解决去中心化条件下的信任问题。并不是所有的行业都适合应用区块链,区块链也不能包治百病。非常适合区块链技术应用的领域有以下特征:(1)目前没有一个信任中心;(2)建立一个信任中心的成本非常高;(3)需要有显示映射机制保障实施。

由于很多消耗了大量时间和资源成本的社会机制,都是为了在参与方之间建立信任关系,而区块链可以让人们在相互无信任的情况下,无地域限制地进行大规模协作。显然,区块链给社会带来了一种新的提升效率和降低成本的技术手段。目前,虽然大家对以比特币为代表的加密数字货币的未来看法不一,但对区块链的未来大家却一致看好,认为区块链是一项革命性的技术。

目前区块链在各行业的应用已经逐步展开,重点应用领域如图4-1所示。在具体的行业应用中,区块链能产生明显效益的地方在于优化业务流程、降低运营成本、提升协作效率。

图4-1 区块链当前重点应用领域  
区块链
Web note ad 1