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 包含 ABCD 四笔交易的 Merkle 树
Merkle 树是自底向上创建的, 是一种 Hash 二叉树首先将交易数据输入 SHA256 算法得到每笔交易的 Hash 值 HaHbHcHd, 这四个 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 区块链当前重点应用领域
来源: http://www.jianshu.com/p/a43ea6038f9b