第一次听到 BlockChain (区块链,以下均用中文名称代替)是在2015年8月,觉得这个东西好神奇。在多个论坛上、文章里看到区块链被称为一个划时代的技术,甚至有呼声说这是一个新的范式,会颠覆人类未来在很多领域的协作模式。听到很多人说区块链有很多有趣的优点,如去中心化、开放性、自治性、安全性、匿名性,作为一个资深理工科女汉子,我一直很好奇,这个东西到底是如何实现的呢?
近期翻阅了《区块链社会》、《区块链:值互联网的基石》、《区块链技术指南》、《区块链与新经济》、《Bitcoin: A Peer-to-Peer Electronic Cash System》,试图去按照我的思维了解,what is Block Chain ?
学习之前,我的疑惑主要集中在信息同步、共识机制上,比如:
1) 计算当前 block 的 hash256 的计算难度是如何确定的?
2) 在分布式架构下,由于存在很多不确定因素导致每个节点收到的交易信息不同步,那么每个 block 中存放哪些交易,是如何确定的?
3) 分布式架构下是否存在弱中心节点?如果存在,它的作用是什么?
4) 在版本迭代的时候,多种 bitcoin 账户,如何更新版本呢?
5) 现存的 bit coin 交易所跟区块链之间是什么关系?
2008年,中本聪(据说是个天才)发表了一篇论文《Bitcoin: A Peer-to-Peer Electronic Cash System》,建设性的提出了 BitCoin 的概念,而实现机制中提出了 Block 和 Chain 的概念,后来者将 Block 和 Chain合并起来,称实现 BitCoin 的技术为 BlockChian (区块链)。
首先,这个东西不是一个新技术,更加确切的说是一种解决方案。互联网上的电子交易,基本都需要借助一个第三方的机构来做中介。天才提出可以不需要中介的解决方案,先看看天才对于“双花”的解决思路。
1、交易
定义数据货币为一个交易链,每一位所有者首先对前一次交易内容和下一位所有者的公钥的合并字符串进行哈希散列, 然后用自己的私钥对这个哈希散列进行数字签名,并将这个签名结果附加在此电 子货币的末尾,这样电子货币就发送给了下一 位所有者。收款人用发送者的共 钥对签名进行检验,就可确认该电子货币的所有权转移。
我们需要收款人能够确保接收到的电子货币没有被前一位拥有者签名转让过,否则只有第一 次转让才是有效的,之后属于双重支付,都是无效的。确保一枚电 子货币没有被转让过,唯一的方法就是获悉之前发生过的所有转让交易。在造币 厂模型里面,造厂获悉所有的转让交易,并决定了交易的先后次序。可是如 果想要去除可信中介机构,就只能公开所有的转让交易信息,我们需要整个系 统的所有参与者,都拥有一份公认的转让交易历史序列。每次交易中,收款人 都需要确认多数节点都认可该币没有被前一位所有者支付过。
2、时间戳服务器
时间戳服务器对区块实施哈希散列,并将该散列值进行广播,该机制通过广播区块的哈希散列能够证实区块在 时确实存在,否则当时就不会 存在它的哈希散列值。每个区块都会拥有一个由前一个区块生 成的哈希散列值, 这样后面的区块都对前面区块进行增强,从而形成了一个链条。
3、工作量证明
工作量证明机制在前述对区块进行哈希散列的同时,增加了搜索 一个特定值的额外要 求,比方在使用SHA-256对区块内容进行散列的时候,要求得到的哈希散列值以一个或多个0开始。那么随着0的 数目的增加,找到这个解所需要的平均工作量将呈指数增长,而对检验结果则仅需要一次哈希散列运算。
对于上述时间戳服务器,我们对区块上的一个随机数进行不断加一的递增操 作,直到这个随机数使得该区块的哈希散列值出现了所需个数的0。一旦有节点耗费满足工作量证明的CPU计算量之后,任何节点只有重新完成同等CPU工作量才能修改该区块的信息。进一步的,由于后面的区块是链接在该区块上的,因此要更改该区块中的信息,还需重新完成它后面的所有区块的全部工 作量,工作量大上加大。
同时,该工作量证明机制还解决了少数服从多数的问题。如果决定多数的方式是 基于IP地 址的,即一IP地址一票,那么如果有人拥有大量IP地址,就可以破 坏少数服从多数原则。工作量证明机制的本质是一CPU一票。最长的链包含了 最多的工作 量,代表多数CPU的决定。如果多数CPU被诚实的节点掌握,那么诚实的链条将以最快的速度延长,并超越其他竞争链条。如果想要对现存的区 块进行修改,攻击者必须重新完成生成该区块所需的工作量证明以及之后所有 区块的工作量证明,还得最终赶上并超越诚实节点的工作。我们将在后文证明, 假如攻击者的计算速度 比诚实节点慢,那么攻击者试图追上诚实节点工作的成 功概率随着后续诚实区块的不断增加呈指数化递减。
为了代偿硬件运算速度的增快以及参与节点数量的起伏,工作量证明的难度(the proof-of-work difficulty)采用移动平均法确定,不断调整难度使得平均每小时内生 成区块的速度保持为定值。如果区块生成的速度过快,那么难度就会随之高(为10分钟一个区块)。
4.网络
运行该网络的步骤如下:
1) 新的货币转让交易信息向全网节点广播;
2) 每个节点都将收到的转让交易信息纳入自己正在创建的区块中;
3) 每个节点都尝试为自己创建的区块找到一个具有足够难度的工作量证明;
4) 当一个节点找到了一个工作量证明,它就向全网节点进行广播其创建的区块;
5) 当且仅当包含在该区块中的所有货币转让交易都是有效的且不存在重复支付 问题,节点们才接受该区块;
6) 节点们通过跟在该区块后面创建新的区块,延长区块链来表示他们对该区块的 认可。直接后续新区块将该区块的哈希散列值作为自己的前序区块散列值。
节点们始终都将最长链视为正确的区块链,基于最长链进行工作并不断延伸它。 如果有两个 节点同时广播不同版本的新区块,其他节点接收到它们的次序将不 尽相同。这种情况下,他们会在各自首先收到的区块上进行工作,同时也会保留 另外一个链,以防 后者会变成最长的链。下一个工作量证明被发现后,其中一 条链会正式被确立为较长的链,则工作于另一条分支链上的节点将切换到较长的 链上继续工作。
新交易的广播信息并不需要抵达全部节点。足够多的节点收到新交易信息时,就会有一个节点完成工作量证明并把新交易信息打包进一个区块中。区块广播对消息丢失有容错能力。如果一个节点未接收到 区块,那么它会在收到下一个区 块时立刻发现自己 缺失了之前的区块,从而它会发起下载该区块的请求。
5.激励
每个区块上记录的第一笔转让交易是产生一枚新的电子货币给该区块的创造者。 这样就激励节点们支持网络运行,同时也供了一种发行电子货币的途径。这种持续增加一定数量的新货币的方式,非常类似于耗费资源去挖掘金矿并将黄金带入货币流通的情形。CPU时间和电力消耗就是这里耗费的资源。
另外一个激励措施是交易费。如果一笔交易的输出值小于输入值,那么差额就是交易费,该交易费加入到该区块的激励中。一旦进入流通的电子货币的总额抵达我们设计的上限,那么激励措施就完全转换为依靠交易费,因此本货币系统不会有通货膨胀问题。
激励措施也有助于鼓励节点保持诚实。如果有一个险恶的攻击者能够调集比所有 诚实节点加起来还要多的CPU计算力,那么他就有两个选择:一是将其用于诚实工作并收获新的电子货币,二是将其用于攻击区块链系统。他会发现,按规则老老实实的工作是合算的。因为遵守规则,他就能比其他所有人获得更多的电 子货币,其收益远大于他攻击系统的获益。
6.节约硬盘空间
采用压缩旧区块的方式(这个颠覆了我之前理解的对历史数据的处理方式)。某次转让交易纳入区块链并且之后又产生了足够多的区块,这次交易的有效性即被确认,作为该次交易输入的前次交易的区块内容就可以丢掉,以节省硬盘空间。为了不损害区块的哈希散列值,区块中的转让交易信息以Merkle tree方式进行哈希散列,只有树root纳入了整个区块的哈希散列值。 通过去除梅克尔树的树枝的方法可以压缩旧的区块。Merkle tree内部的随机散列值是不必保存的。
不含交易信息的区块头(Block header)的大小仅有80字节。如果设定区块生成的速率为每10分钟一个,那么每一年产生的数据为4.2MB(80 bytes * 6 * 24 * 365= 4.2MB)。在2008年,一般的PC系统的内存容量为2GB,根据摩尔定律,系统内存将每年增长1.2GB,这样测算即使将全部的区块头存储于内存之中都不是问题。