第1章 区块链之前世今生
1.1 比特币
1.1.1 产生背景
比特币(Bit Coin)的概念最初是由中本聪在2008年发表的论文《比特币:一种点对点的电子现金系统》[1]中提出的。这种电子现金系统起始于按中本聪的思路设计、发布的开源软件及建构于其上的P2P(Peer to Peer)网络。比特币是一种P2P形式下的数字货币。点对点的传输意味着一个去中心化的支付系统。
与大多数货币不同,比特币不依靠特定的货币机构发行,它依据特定算法,通过大量的计算产生。比特币经济是指通过使用整个P2P网络中众多节点构成的分布式数据库来确认并记录所有的交易行为,并使用密码学的设计来确保货币流通中各个环节的安全性。P2P的去中心化特性与算法本身可以确保任何人都无法通过大量制造比特币来人为操控币值。基于密码学的设计可以使比特币只能被真实的拥有者转移或支付,同时确保了货币的所有权与流通交易的匿名性。比特币与其他虚拟货币最大的不同是其总数量非常有限,具有极强的稀缺性。该货币系统曾在4年内只有不超过1050万个,之后的总数量将被永久地限制在2100万个。比特币的特性如图1-1所示。
图1-1 比特币的特性
1.1.2 技术原理
比特币网络通过随机哈希值为全部交易加上时间戳,将它们合并入一个不断延伸的、基于随机哈希值的工作量证明(Proof of Work)链条作为交易记录,除非重新完成全部的工作量证明,否则形成的交易记录将不可更改。最长的链条不仅将被作为观察到的事件序列(Sequence)的证明,而且被看做是来自CPU计算能力最大的池(Pool)。只要大多数的CPU计算能力都没有打算联合起来对全网进行攻击,那么诚实的节点将会生成最长的、超过攻击者的链条。
1 交易
交易是比特币系统中最重要的部分。系统中任何其他部分都是为确保比特币交易可以被生成,能在比特币网络中得以传播和通过验证,并最终被添加至全球比特币交易总账本(比特币区块链)。比特币交易的本质是数据结构,这些数据结构中存放的是货币所有权的流转信息,所有权登记在比特币地址上。表1-1给出了比特币交易记录的详细结构。这些信息是全网公开的,以明文形式存储(比特币系统里的所有数据都是明文),只有当需要转移货币所有权时,才需要用私钥签名来验证。
表1-1 比特币交易记录的结构
一枚电子货币是这样的一串数字签名:每一位所有者通过对前一次交易和下一位拥有者的公钥(Public Key)签署一个随机哈希的数字签名,并将这个签名附加在这枚电子货币的末尾,电子货币就发送给了下一位所有者,而收款人通过对签名进行检验,就能够验证该链条的所有者,具体交易模式如图1-2所示。
图1-2 交易模式
该过程的问题在于,收款人将难以检验之前的某位所有者是否对这枚电子货币进行了双重支付。通常的解决方案是引入可信的第三方权威,或者类似于造币厂的机构,来对每一笔交易进行检验,以防止双重支付。在每一笔交易结束后,这枚电子货币就要被造币厂回收,同时造币厂将发行一枚新的电子货币;而只有造币厂直接发行的电子货币才算作有效,这样就能够防止双重支付。该解决方案的问题在于,整个货币系统的命运完全依赖于运作造币厂的公司,因为每一笔交易都要经过该造币厂的确认,它就像是一家银行。
我们需要收款人能够采取某种方法,来确保之前的所有者没有对更早发生的交易实施签名。从逻辑上看,为了达到目的,实际上需要关注的只是本次交易之前发生的交易,而不需要关注这笔交易发生之后是否会有双重支付的尝试。为了证明某一次交易是不存在的,唯一的方法就是获悉之前发生过的所有交易信息。在造币厂模型里,造币厂获悉所有的交易,并且决定交易完成的先后顺序。如果想要在电子系统中排除第三方中介机构,那么交易信息就应当公开宣布[2]。这就需要整个系统内的所有参与者,都有唯一公认的历史交易序列。收款人需要确保在交易期间绝大多数的节点都认同该交易是首次出现。
2 区块
在比特币网络中,数据以文件的形式被永久记录,这些记录称之为区块。一个区块是一些或所有最新比特币交易的记录集,且未被其他先前的区块记录。可以把区块想象为一个股票交易账本。在绝大多数情况下,新区块一旦被加入到记录的最后(在比特币中的名称为块链),就再也不能改变或删除。每个区块记录了它被创建之前发生的所有事件。
区块主要由两部分构成,即块头和块体。块头用于链接到前面的块并且为区块链数据库提供完整性的保证,块体包含了经过验证的、块创建过程中发生的价值交换的所有记录。具体地讲,每个数据区块包括神奇数、区块大小、区块头部信息、交易计数、交易详情6部分。表1-2描述了数据区块的具体结构[3]。其中,最后一项“交易详情”记录了该区块中的所有交易信息。
表1-2 数据区块的结构
区块头中记录了版本号、父区块哈希值、Merkle根哈希、时间戳、难度目标、随机数(Nonce)等信息,具体的结构如表1-3所示[4]。随机数(Nonce)是一个挖矿难度的答案,该答案对于每个区块都是唯一的。新区块如果没有正确的答案,是不能被发送到网络中的。“挖矿”过程的本质是在竞争中“解决”当前区块,即确认该区块的记账权。每个区块中的数学问题难以解决,但是一旦发现了一个有效解,其他网络节点很容易验证这个解的正确性。对于给定的区块可能有多个有效解,但对于要解决的区块来说只需要一个解。每解决一个区块,都会得到新产生的比特币奖励,因此每个区块包含一个记录,记录中的比特币地址是有权获得比特币奖励的地址。这个记录被称为生产交易或者Coinbase交易,它经常是每个区块的第一笔交易。
表1-3 区块头部的结构
区块哈希值更准确的名称应该是区块头哈希值,通过SHA-256算法对区块头进行二次哈希运算得到。区块哈希值可以唯一、明确地标识一个区块,并且任何节点通过简单地对区块头进行哈希运算都可以独立地获取该区块的哈希值。但是,区块哈希值实际上并不包含在区块的数据结构里,不管该区块是在网络上传输,还是它作为区块链的一部分被存储在某节点的永久性存储设备上时。实际上区块哈希值是当该区块从网络中被接收时,由每个节点计算出来的。区块的哈希值可能会作为区块元数据的一部分被存储在一个独立的数据库表中,以便于索引和更快地从磁盘中检索区块。
由于每一个区块的块头都包含了前一区块的哈希值,这就使得从第一个区块至当前区块连接在一起后形成一条长链,即比特币区块链。第一个区块由中本聪在北京时间2009年1月4日02:15:05创建,该区块也被称为“创世区块”(Genesis Block)[5]。新版本的比特币系统将它设定为0号区块,而旧版本的比特币系统设定它的序号为1。它是比特币区块链里所有区块的共同祖先,这意味着从任一区块循链向前回溯,最终都将到达创世区块。每一个节点都“知道”创世区块的哈希值、结构、被创建的时间和里面的一个交易。因此,每个节点都把该区块作为区块链的首区块,从而构建成了一个安全的、可信的区块链的根。
3 时间戳服务器
比特币的本质是构造了一个永不停息、无坚不摧的时间戳系统。时间戳服务器通过对以区块形式存在的一组数据实施随机哈希运算,并加上时间戳,然后将该随机哈希值进行广播,就像在新闻或世界性新闻网络组的发帖一样[6],如图1-3所示。显然,该时间戳能够证实特定数据必然于某特定时刻是的确存在的,因为只有在该时刻存在了,才能获取相应的随机哈希值。每个时间戳应当将前一个时间戳纳入其随机哈希值中,每一个随后的时间戳都对之前的一个时间戳进行增强,这样就形成了一个链条[7][8][9]。
图1-3 时间戳服务器工作示意图
4 双花问题
加密数字货币和其他数字资产一样,具有无限可复制性的缺陷,例如同一个文件可以通过附件的形式保存并发送任意多次。如果没有一个中心化的机构,人们无法确认一笔数字现金或资产是否已经被花掉或提取。为了解决“双花”问题,可以通过可信赖的第三方机构保留交易总账,从而保证每笔现金或资产只被花费或提取过一次。在区块链中,每一个区块都包含了上一个区块的哈希值,从创始区块开始链接到当前区块,从而形成块链。每一个区块都要确保按照时间顺序在上个区块之后产生,否则前一个区块的哈希值是未知的。同时,由于区块链中所有交易都要进行对外广播,所以只有当包含在最新区块中的所有交易都是独一无二且之前从未发生过,其他节点才会认可该区块。因此在区块链中,要想“双花”会非常困难。
5 拜占庭将军问题
拜占庭将军问题[10]是一个共识问题,其核心描述的是军中可能有叛徒,却要保证进攻的一致。由此引申到计算领域,发展成为一种容错理论。随着比特币的出现和兴起,这个著名的问题又重新进入大众视野。
关于拜占庭将军问题,一个简易的非正式描述如下:拜占庭帝国想要进攻一个强大的敌人,为此派出了10支军队去包围这个敌人。这个敌人虽不比拜占庭帝国强大,但也足以抵御5支常规拜占庭军队的同时袭击。基于一些原因,这10支军队不能集合在一起单点突破,必须在分开的包围状态下同时攻击。他们中的任意一支军队单独进攻都毫无胜算,除非有至少6支军队同时袭击才能攻下敌国。他们分散在敌国的四周,依靠通信兵相互通信来协商进攻意向及进攻时间。困扰拜占庭将军们的问题是,他们不确定军队内部是否有叛徒,而叛徒可能擅自变更进攻意向或者进攻时间。在这种状态下,拜占庭将军们能否找到一种分布式的协议来让他们能够远程协商,从而赢取战斗?
如果每支军队向其他9支军队各派出一名信使,那么就是10支军队每支派出了9名信使,也就是在任何一个时间有总计90次的信息传输。每支军队将分别收到9封信,每一封信可能写着不同的进攻时间。此外,部分军队会答应超过一个的攻击时间,故意背叛发起人,因此他们将重新广播超过一条的信息链。这使得整个系统迅速变质成不可信的信息和攻击时间相互矛盾的纠结体。
比特币通过对这个系统做一个简单的修改并解决了这个问题,它为发送信息加入了成本,这降低了信息传递的速率,并加入了一个随机元素以保证在同一个时间只有一支军队可以进行广播。它加入的成本是“工作量证明”,这是基于计算一个随机哈希的算法。
6 工作量证明
为了在点对点的基础上构建一组分散化的时间戳服务器,仅仅像报纸或世界性新闻网络组一样工作是不够的,我们还需要一个类似于亚当·柏克(Adam Back)提出的哈希现金机制[11]。在进行随机哈希运算时,工作量证明机制引入了对某一个特定值的扫描工作,比如在SHA-256下,随机哈希值以1个或多个0开始。随着0的数目的增加,找到这个解所需要的工作量将呈指数增长,但是检验结果仅需要一次随机哈希运算。
假设在区块中补增一个随机数,这个随机数要能使该给定区块的随机哈希值出现所需的那么多个0。通过反复尝试来找到这个随机数,直到找到为止,这样就构建了一个工作量证明机制。只要该CPU耗费的工作量能够满足该工作量证明机制,那么除非重新完成相当的工作量,否则该区块的信息是不可更改的。由于之后的区块是链接在该区块上的(如图1-4所示),所以想要更改该区块中的信息,就需要重新完成之后所有区块的全部工作量。
图1-4 区块链接示意图
同时,该工作量证明机制还解决了在集体投票表决时,谁是大多数的问题。如果决定大多数的方式是基于IP地址的,一个IP地址一票,那么如果有人拥有分配大量IP地址的权力,则该机制就被破坏了。而工作量证明机制的本质则是一个CPU只能投一票。“大多数”的决定表达为最长的链,因为最长的链包含了最大的工作量。如果大多数的CPU为诚实的节点控制,那么诚实的链条将以最快的速度延长,并超越其他的竞争链条。如果想要对已出现的区块进行修改,攻击者必须重新完成该区块的工作量,外加该区块之后所有区块的工作量,并最终赶上和超越诚实节点的工作量。
另一个问题是,硬件的运算速度在高速增长,且节点参与网络的程度会有所起伏。为了解决这个问题,工作量证明的难度将采用移动平均目标的方法来确定,即难度根据预设的每小时生成区块的平均速度来调整。如果区块生成的速度过快,那么难度就会提高。
7 网络
运行比特币网络的步骤如下:
01新的交易向全网进行广播;
02每一个节点都将收到的交易信息纳入一个区块中;
03每一个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明;
04当一个节点找到了一个工作量证明,它就向全网进行广播;
05当且仅当包含在该区块中的所有交易都有效,且是之前未存在过的,其他节点才认同该区块的有效性;
06其他节点表示它们接受该区块,而表示接受的方法,是在跟随该区块的末尾,制造新的区块以延长该链条,被接受区块的随机哈希值将视为先于新区块的随机哈希值。
节点始终都将最长的链条视为正确的链条,并持续工作和延长它。如果有两个节点同时广播不同版本的新区块,那么其他节点在接收到该区块的时间上将存在先后差别。此时,它们将在率先收到的区块基础上进行工作,但也会保留另外一个链条,以防后者变成最长的链条。该僵局的打破要等到下一个工作量证明被发现,当其中的一条链条被证实为是较长的一条时,在另一条分支链条上工作的节点将转换阵营,开始在较长的链条上工作。
所谓“新的交易要广播”,实际上不需要抵达全部的节点。只要交易信息能够抵达足够多的节点,那么它们将很快被整合进一个区块中。区块的广播对被丢弃的信息是具有容错能力的。如果一个节点没有收到某特定区块,那么该节点将会发现自己缺失了某个区块,也就可以提出下载该区块的请求。
8 激励
系统约定:每个区块的第一笔交易进行特殊化处理,该交易产生一枚由该区块创造者拥有的新的电子货币。这样就增加了节点支持该网络的激励,并在没有中央集权机构发行货币的情况下,提供了一种将电子货币分配到流通领域的方法。这种将一定数量新货币持续增添到货币系统中的方法,与耗费资源去挖掘金矿并将黄金注入到流通领域非常类似。此时,CPU的计算时间和电力消耗就是消费的资源。
另外一个激励的来源则是交易费。如果某笔交易的输出值小于输入值,那么差额就是交易费,该交易费将被增加到该区块的激励中。只要既定数量的电子货币已经进入流通,那么激励机制就可以逐渐转换为完全依靠交易费,本货币系统也就能够免于通货膨胀。
激励系统也有助于鼓励节点保持诚实。如果有一个贪婪的攻击者能够调集比所有诚实节点加起来还要多的CPU计算力,那么他就面临一个选择:要么将其用于诚实工作产生新的电子货币,要么将其用于进行二次支付攻击。这样他就会发现,按照规则行事、诚实工作是更有利可图的。因为该规则能够使他拥有更多的电子货币,而不是破坏这个系统使得其自身财富的有效性受损。
9 回收硬盘空间
如果最近的交易已经被纳入了足够多的区块之中,那么就可以丢弃该交易之前的数据,以回收硬盘空间。为了同时确保不损害区块的随机哈希值,交易信息被随机哈希运算时,构建成一种梅克尔树(Merkle Tree)的形态[12][13],使得只有树根被纳入区块的随机哈希值,如图1-5所示。通过将该树的分支拔除的方法,老区块就能被压缩,而该树内部的随机哈希值是不必保存的。
图1-5 梅克尔树
不含交易信息的区块头(Block Header)大小仅有80字节。如果设定区块生成的速率为每10分钟一个,那么每一年产生的数据为4.2MB(80bytes× 6×24×365=4.2MB)。2008年,PC系统通常的内存容量为2GB,按照摩尔定律的预言,即使将全部的区块头存储于内存之中都不是问题。
10 简化的支付确认
在不运行完整网络节点的情况下,系统也能够对支付进行检验。一个用户需要保留最长工作量证明链条的区块头的副本,它可以不断向网络发起询问,直到它确信自己拥有最长的链条,并能够通过梅克尔树的分支通向它被加上时间戳并纳入区块的那次交易。节点想要自行检验该交易的有效性原本是不可能的,但通过追溯到链条的某个位置,它就能看到某个节点曾经接受过它,并且于其后追加的区块也可进一步证明全网曾经接受了它。图1-6为最长工作量证明的示意图。
图1-6 最长工作量证明示意图
最长的工作量证明链
此时,只要诚实的节点控制了网络,检验机制就是可靠的。但是,当全网被一个计算力占优的攻击者攻击时,将变得较为脆弱,因为网络节点能够自行确认交易的有效性,只要攻击者能够持续地保持计算力优势,简化的机制会被攻击者伪造的(Fabricated)交易欺骗。一个可行的策略是,只要发现了一个无效的区块,就立刻发出警报,收到警报的用户将立刻开始下载被警告有问题的区块或交易的完整信息,以便对信息的不一致进行判定。对于日常会发生大量收付业务的商业机构,可能仍会希望运行他们自己的完整节点,以保持较大的独立完全性和检验的快速性。
11 价值的组合与分割
虽然可以对单个电子货币进行处理,但是对于每一枚电子货币单独发起一次交易是一种笨拙的办法。为了使价值易于组合与分割,交易被设计为可以纳入多个输入和输出,如图1-7所示。一般而言是某次价值较大的前次交易构成的单一输入,或者由某几个价值较小的前次交易共同构成的并行输入。但是输出最多只有两个:一个用于支付;另一个用于找零。
图1-7交易信息
需要指出的是,虽然一笔交易依赖之前的多笔交易,这些交易又各自依赖于多笔交易,但是这并不存在任何问题。因为这种工作机制并不需要展开检验之前发生的所有交易历史。
12 隐私
传统的造币厂模型为交易的参与者提供了一定程度的隐私保护,因为试图向可信任的第三方索取交易信息是严格受限的,但是如果将交易信息向全网进行广播,就意味着这样的方法失效了。然而隐私依然可以得到保护:将公钥保持为匿名。公众得知的信息仅仅是有某个人将一定数量的货币发送给了另外一个人,但是难以将该交易同某个特定的人联系在一起。也就是说,公众难以确信,这些人究竟是谁。这同股票交易所发布的信息是类似的,每一手股票买卖发生的时间、交易量是记录在案且可供查询的,但是交易双方的身份信息却不予透露。传统隐私模型与新隐私模型的对比如图1-8所示。
图1-8 隐私模型
作为额外的预防措施,使用者可以让每次交易都生成一个新的地址,以确保这些交易不被追溯到一个共同的所有者。不过由于存在并行输入,一定程度上的追溯还是不可避免的,因为并行输入暗示这些货币都属于同一个所有者。此时的风险在于,如果某个人的某一个公钥被确认属于他,那么就可以追溯出此人的其他很多交易。
1.1.3 比特币的特点
比特币作为一种电子货币,其特征如下:
● 去中心化。比特币是第一种分布式的虚拟货币,整个网络由用户构成,没有中央银行。去中心化是比特币安全与自由的保证。
● 全世界流通。比特币可以在任意一台接入互联网的计算机上管理。无论身处何方,任何人都可以挖掘、购买、出售或收取比特币。
● 专属所有权。操控比特币需要私钥,它可以被隔离保存在任何存储介质中,除了用户自己之外,无人可以获取。
● 低交易费用。可以免费汇出比特币,但最终对每笔交易将收取约1比特分的交易费以确保交易能更快地被执行。
● 无隐藏成本。作为由A到B的支付手段,比特币没有繁琐的额度与手续限制,知道对方比特币地址就可以进行支付。
● 跨平台挖掘。用户可以在众多平台上发掘不同硬件的计算能力。
区别于传统货币,比特币具有以下明显的优点:
● 完全去中心化。比特币没有发行机构,也不可能操纵发行数量,其发行与流通,是通过开源的P2P算法实现的。
● 匿名、免税、免监管。
● 健壮性。比特币完全依赖P2P网络,无发行中心,所以外部无法关闭它。比特币价格可能波动、崩盘,多国政府可能宣布它非法,但比特币和比特币庞大的P2P网络不会消失。
● 无国界、跨境。跨国汇款需要经过层层外汇管制机构,而且交易记录会被多方记录在案。但如果使用比特币交易,则直接输入数字地址,按一下鼠标键,等待P2P网络确认交易后,大量资金就转过去了,它不需要经过任何管控机构,也不会留下任何跨境交易记录。
● 山寨者难于生存。由于比特币算法是完全开源的,谁都可以下载到源码,修改些参数并重新编译,就能创造出一种新的P2P货币。但这些山寨货币很脆弱,极易遭到51%攻击。任何个人或组织,只要控制一种P2P货币网络51%的运算能力,就可以随意操纵交易及币值,这会对P2P货币构成毁灭性打击。很多山寨币,就是死在了这一环节上。而比特币网络已经足够健壮,想要控制比特币网络51%的运算力,所需要的CPU/GPU数量将是一个天文数字。
虽然比特币有较多的优点,但其自身也存在一些缺陷:
● 交易平台的脆弱性。比特币网络很健壮,但比特币交易平台很脆弱。交易平台通常是一个网站,而网站会遭到黑客攻击,或者遭到主管部门的关闭。
● 交易确认时间长。比特币钱包初次安装时,会消耗大量时间下载历史交易数据块。而比特币交易时,为了确认数据的准确性,也会消耗一些时间与P2P网络进行交互,得到全网确认后,交易才算完成。
● 价格波动极大。由于大量炒家介入,导致比特币兑换现金的价格如过山车一般起伏,使得比特币更适合投机,而不是匿名交易。
● 大众对原理不理解以及传统金融从业人员的抵制。活跃的网民了解P2P网络的原理,知道比特币无法人为操纵和控制,但普通大众并不理解,很多人甚至无法分清比特币和Q币的区别。“没有发行者”是比特币的优点,但在传统金融从业人员看来,“没有发行者”的货币毫无价值。
1.1.4 重要概念
1 地址、私钥、公钥
地址是为了便于人们交换比特币而设计出来的方案,因为公钥太长了(130字符串或66字符串)。地址的长度为25字节,转为Base58编码后,为34或35个字符。Base58是类似Base64的编码,但去掉了易引起视觉混淆的字符,又在地址末尾添加了4个字节的校验位,以保障在人们用于交换的个别字符发生错误时,能够因地址校验失败而制止误操作。
私钥是非公开的,拥有者需安全保管。私钥通常是由随机算法生成的,简单地说,就是一个巨大的随机整数,占32字节。大小介于1~0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD25E8C D0364141之间的数,都可以认为是一个合法的私钥。于是,除了随机生成方法之外,还可采用特定算法,由固定的输入得到32字节输出的算法,就可以成为得到私钥的方法。
公钥与私钥是相对应的,一把私钥通过推导可以推出唯一的公钥,但使用公钥却无法推导出私钥。公钥有压缩与非压缩两种形式。早期比特币均使用非压缩公钥,现在大部分客户端已默认使用压缩公钥。这个貌似是比特币系统的一个近乎于特征的bug,早期编写代码时人少、活多,代码写得不够精细,加上OpenSSL库的文档又不是足够好,导致中本聪以为必须使用非压缩的完整公钥才可以。后来大家发现其实公钥左右的两个32字节是有关联的,由左侧(x)可以推出右侧(y)的平方值,这样有左侧(x)就够用了。因此,这两种方式共存于现在系统里,并且应该会一直共存下去。两种公钥的首个字节为标识位,压缩公钥为33字节,非压缩公钥为65字节。以0X04开头的为非压缩公钥,以0X02/0X03开头的为压缩公钥,0X02/0X03的选取由右侧(y)开方后的奇偶决定。压缩形式可以减小Tx/Block的体积,每个Tx Input可减少32字节。图1-9所示为公钥、私钥生成的示意图。
图1-9 公钥、私钥生成示意图
2 椭圆曲线数字签名算法
椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟。ECDSA首先由Scott和Vanstone在1992年为了响应NIST对数字签名标准(DSS)的要求而提出。ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准。ECDSA在1998年已为ISO所接受,并且包含它的其他一些标准亦在ISO的考虑之中。与普通的离散对数问题(Discrete Logarithm Problem, DLP)和大数分解问题(Integer Factorization Problem, IFP)不同,椭圆曲线离散对数问题(Elliptic Curve Discrete Logarithm Problem, ECDLP)没有亚指数时间的解决方法。因此,椭圆曲线密码的单位比特强度要高于其他公钥体制。
数字签名算法(DSA)在联邦信息处理标准FIPS中有详细论述,称为数字签名标准。它的安全性基于素域上的离散对数问题。椭圆曲线密码(ECC)由Neal Koblitz和Victor Miller于1985年发明。它可以看作是椭圆曲线对先前基于离散对数问题(DLP)的密码系统的模拟,只是群元素由素域中的元素数换为有限域上的椭圆曲线上的点。椭圆曲线密码体制的安全性基于椭圆曲线离散对数问题(ECDLP)的难解性。椭圆曲线离散对数问题远难于离散对数问题,椭圆曲线密码系统的单位比特强度要远高于传统的离散对数系统。因此,在使用较短的密钥的情况下,ECC可以达到与DLP系统相同的安全级别。这带来的好处就是计算参数更小,密钥更短,运算速度更快,签名也更加短小。椭圆曲线密码尤其适用于处理能力、存储空间、带宽及功耗受限的场合。
3 梅克尔树
梅克尔树(Merkle Trees)是区块链的基本组成部分[14]。虽然从理论上来讲,没有梅克尔树的区块链也是可行的,人们只需创建直接包含每一笔交易的巨大区块头(Block Header)就可以实现,但这样做无疑会带来可扩展性方面的挑战。从长远发展来看,这样做的结果是,可能只有那些最强大的计算机,才可以运行这些无需受信的区块链。
梅克尔树是哈希大量聚集数据“块”(Chunk)的一种方式,它依赖于将这些数据“块”分裂成较小单位(Bucket)的数据块,每一个Bucket块仅包含几个数据“块”,然后取每个Bucket单位数据块再次进行哈希运算,重复同样的过程,直至剩余的哈希总数为1,即根哈希(Root Hash)。
梅克尔树最为常见和最简单的形式,是二叉梅克尔树(Binary Merkle Tree),其中一个Bucket单位的数据块总是包含了两个相邻的块或哈希值,其描述如图1-10所示。
图1-10 二叉梅克尔树示意图
那么,采用这种奇怪的哈希算法有什么好处吗?为什么不直接将这些数据块串接成一个单独的大块,用常规的哈希算法进行运算呢?答案在于,它允许了一个整齐的机制,称之为梅克尔证明(Merkle Proofs)。
一个梅克尔证明包含了一个数据块,这棵梅克尔树的根哈希,以及所有沿数据块到根路径哈希的“分支”。有人认为,这种证明可以验证哈希的过程,至少是对分支而言。梅克尔证明的应用也很简单:假设有一个大数据库,而该数据库的全部内容都存储在梅克尔树中,并且这棵梅克尔树的根是公开并且可信的(例如,它是由足够多个受信方进行过数字签名的,或者它有很多的工作量证明);当一位用户想在数据库中进行一次键值查找(比如“请告诉我,位置在85273处的对象”),就可以询问梅克尔证明,并接收到一个正确的验证证明(收到的值,实际上是数据库在85273位置上的特定根)。梅克尔证明允许了一种机制,这种机制既可以验证少量的数据,例如一个哈希值,也可以验证大型的数据库(可能扩至无限)。
梅克尔证明的原始应用是比特币系统。比特币区块链使用梅克尔证明,为的是将交易信息存储在每一个区块中。这样做的好处就是中本聪所描述的“简化支付验证”(SPV),而不必下载每一笔交易以及每一个区块。比如,一个“轻客户端”(Light Client)可以仅下载链的区块头,数据块大小为80字节,每个区块头中仅包含5项内容:上一区块头的哈希值、时间戳、挖矿难度值、工作量证明随机数,以及包含该区块交易的梅克尔树的根哈希。图1-11所示为Tx3的梅克尔树分支。
图1-11 Tx3的梅克尔树分支
如果一个轻客户端希望确定一笔交易的状态,它可以简单地要求一个梅克尔证明,显示出一个梅克尔树特定的交易,其根是在主链(Main Chain)非分叉链上的区块头。
这种机制会让我们走得很远,但比特币的轻客户端确实有其局限性。一个特别的限制是,梅克尔树虽然可以证明包含的交易,但无法证明任何当前的状态(如数字资产的持有、名称的注册、金融合约的状态等)。举例来说,你现在拥有多少个比特币?一个比特币轻客户端,可以使用一种协议,它将涉及查询多个节点,并相信其中至少有一个节点会通知你,关于你的地址中任何特定的交易支出,这可以让你实现更多的应用。但对于其他更为复杂的应用而言,这些是远远不够的。一笔交易影响的确切性质,取决于之前的几笔交易,而这些交易本身则依赖于更早的交易,所以最终你可以验证整个链上的每一笔交易。
4 哈希现金
比特币使用一种名叫“哈希现金”[11](Hash Cash)的工作量证明算法,这种算法的出现早于比特币。最初创造这种算法的目的,只是使之成为反DOS攻击的工具。哈希现金的灵感来自于这样一个想法,即采用一些数学算法的结果难于发现且易于校验。一个众所周知的例子是因数分解一个大的数字(尤其是因数较少的数字)。将数字相乘来获得它们的乘积的代价是低廉的,但找到那些因数的代价却要高得多。
对交互式协商来说,使用因数分解法就足以胜任。比如,希望客户端能象征性地付出代价才能访问在线资源。这个时候可以定义一个协议,首先服务器向客户端发送一个消息,说“只要您能因数分解这个数,我将让您得到这个资源”。这样,没有诚意的客户端将无法得到服务器上的资源,只有那些能够证明自己有足够的兴趣、肯付出一些CPU周期来回答这个协商的客户端才能得到这个资源。
不过,有一些资源无法很方便地进行交互式协商,比如,反垃圾电子邮件或者支付交易。怎么才能避免邮箱不被垃圾邮件所占据?一些人会说“我并不介意陌生人给我写信,但是,我希望他们能以稍微认真些的态度,通过对我有价值的邮件亲自与我取得联系。至少,我不希望他们是垃圾邮件制造者,那些人向我甚至上百万人发送包含同样消息的邮件,期望有人能购买某种产品或者落入一个骗局。”而对于电子货币,其内容的复制也几乎是没有代价的。如何保证电子货币(内容)没有被交易(发送)多次?这和反垃圾邮件面临的是同样的问题。
哈希现金的解决方法是:在电子邮件的消息头中,增加一个哈希现金戳记(Hash Cash Stamp)哈希值,该哈希值中包含收件人地址、发送时间、Salt值。该哈希值特别之处在于,它至少前20位必须是0才是一个合法的哈希现金戳记。为了得到合法的哈希值,发送者必须经过许多次尝试(改变Salt值,即系统用来和用户密码进行组合而生成的随机数值)才能获得。一旦生成戳记,希望每一个给我发送邮件的垃圾邮件制造者都不能重复使用该戳记。所以,哈希现金戳记要带一个日期,这样可以判定比指定时间更早的戳记是非法的。另外,哈希现金的接收端要实现一个重复支付数据库,用来记录戳记的历史信息。
5 51%攻击
一提到对比特币的攻击,大部分人想到的就是51%攻击[15]。51%攻击是指某个客户端或组织掌握了比特币全网的51%的算力之后,用这些算力来重新计算已经确认过的区块,使区块链产生分叉并且获得利益的行为。对于51%算力拥有者,他不仅能够修改自己的交易记录并进行双重支付,还能阻止区块确认部分或者全部交易,以及阻止部分或全部矿工开采到任何有效的区块。但是,他并不能修改其他人的交易记录,阻止交易被发送出去(交易会被发出,只是显示0个确认而已),却通过改变每个区块产生的比特币数量,凭空产生比特币,以及把不属于他的比特币发送给自己或其他人。
假如A掌握了整个网络51%的算力,则可以计算出这样一个区块链:其中包含A所有发送到A私人账户上的比特币交易信息。此时该区块链的长度为10,但是A不向网络广播并把所有的比特币在交易市场换成美元并提取出来,而且这笔交易记录在正常的那个区块链中。当A的美元正在提取时,那个正常的区块链的长度是9,而A的区块链长度是10。现在A才向网络广播出去,然后观察,发现网络会确认A的区块链是正确的,但是实际上美元已经被A提取了,损失的是交易市场。
发动51%攻击必须具备两个条件。第一,必须掌握足够的算力。无论是控制矿池,还是利用其他计算资源,总之必须使攻击者的算力领先于现在网络的总算力。领先的幅度越大,成功的可能性越高。第二,拿到足够的比特币作为筹码,无论是自己挖到的,还是从任何渠道买的,都可以。只有具备这两个条件,才能发起51%攻击。攻击过程首先是将手中的比特币充值到各大交易所,然后卖掉,提现,或者也可以直接卖给某人或某一群人;再运用手中的算力,从自己付款交易之前的区块开始,忽略自己所有的付款交易,重新构造后面的区块,利用算力优势与全网赛跑;当最终创建的区块长度超过原主分支区块,成为新的主分支,便完成攻击。一旦攻击完成,自己所有的对外付款交易将被撤销,等于收回所有已卖掉的比特币。
过去几年内,比特币网络的算力悄无声息地增长到了无比之大,这大大增加了比特币被51%攻击成功的可能性。在依赖密码学的数字货币领域,先发优势是非常明显的。51%攻击对于比特币来说并不是一个什么大问题(早在2013年7月,比特币全网算力已经达到世界前500强超级计算机算力之和的20倍),所以即使有政府集全国之力秘密造出一台超级计算机,用于击溃比特币来挽救自己的货币发行体系,但它会发现使用该能力进行挖矿便可垄断比特币的发行权,其收益会远大于击溃比特币,因而动机也就不复存在了。
6 冷钱包
一直以来,比特币行业的安全深受诟病,2014年3月曾是世界最大的比特币交易平台的Mt Gox总计遗失了85万枚比特币;2015年2月14日比特儿(BTER)存钱罐丢失总额为7170BTC。比特币的理想是构建一种金融社交网络,实现人类的金融民主。时至今日,比特币的基础技术架构仍有很大的提升空间。比特币交易平台、在线钱包等如何安全地保存大量比特币是整个行业面临的重要问题。比特币的安全是基于比特币的核心加密算法和私钥的安全保存。密码学界认为比特币的密码学基础(SHA-256和EDSA)在目前的解密技术能力下,是绝对安全的。比特币安全的主要问题就在于私钥的保存,所以业界通常采用冷钱包的方式(绝对不接触互联网的钱包)来保存大量的比特币。
比特币钱包的冷储存[16](Cold Storage)是一种将钱包离线保存的方法。具体来说,用户在一台离线的计算机上生成比特币地址和私钥,并将其妥善保存起来,以后由挖矿或者在交易平台得到的比特币都可以发送到这个离线生成的比特币地址上面。由这台离线计算机生成的私钥永远不会在其他在线终端或者网络上出现。
使用比特币钱包冷储存技术主要是出于安全上的考虑,举两个例子:
例一,某比特币超级大户想保证他的比特币钱包绝对安全,即使在计算机被黑客入侵的情况下,黑客依然得不到比特币私钥。为此,这位大户必须使用冷储存技术,离线生成几对比特币地址和私钥,作为冷储存钱包,以后所有需要储存的比特币都发送到这些地址上面,这就初步保证了比特币的安全。
例二,某比特币交易平台每天都有庞大的比特币用户群活动,这些用户在平台上存有数以万计的比特币,为了保证这些比特币的安全,交易平台的管理人员便每天定时将主机服务器上所储存的比特币放入冷储存钱包中,而只在服务器上保存少量的比特币,来应付正常的提现请求。这样,就算有黑客入侵了交易平台主机,也无法得到用户所储存的比特币。
那么如何进行冷存储呢?首先是私钥的产生和备份,步骤如下:
01在完全离线的计算机上生成10000个私钥及对应的地址,并对私钥进行AES加密,然后删除原始私钥;
02将AES密码由两个分属异地的人掌握;
03将加密后的私钥和明文地址生成二维码加密文档,通过扫描完全离线计算机生成地址文档二维码,用于日常使用。
热钱包往冷钱包汇币,每次必须是一个未使用过的地址,每个地址不可重复使用,然后从线上往冷钱包汇币,步骤如下:
01从地址文档中取出相应地址;
02根据安全级别,每个地址汇不超过1000枚比特币,每个地址使用一次之后就不可再使用。
最后是从冷钱包取币,取币过程如下:
01把私钥密文通过二维码扫描放入完全离线计算机;
02掌握AES密码的人在完全离线计算机上进行解密,获得私钥明文。通过二维码扫描把私钥明文导入到另一台完全离线的计算机中,在另一台完全离线计算机上进行签名交易,并把签名后的交易通过二维码或U盘同步至有网络的计算机中并广播交易。
7 闪电网络
比特币闪电网络[17](Bitcoin Lightning Network)是一项针对比特币的设计改进,它可以让用户以去中心化的方式进行小额支付。该网络通过在用户间增补哈希化时间锁合约(Hashed Time Lock Contracts)来解决比特币规模问题和立即支付问题。目前,该项目面临的首要问题是“软分叉”,即修改比特币协议,无效化之前的区块和交易,同时旧节点依然可以识别新的有效区块。
与当今的金融系统相比,Vi s a在标准的节假日每秒能处理4.5万笔交易,通常的一个营业日则为数亿次交易,然而比特币现在每秒仅能支持约7笔交易,同时还会受到区块链大小的限制。要想实现每秒4.5万笔交易,比特币必须进行离线处理。
闪电网络的工作原理可能听起来比较复杂,本质的工作原理非常类似于如下这个例子:假设所有的比特币交易能够在一个开放的论坛(比特币公共账户)中探讨,闪电网络在特定的时间段内可以让各方进入到一个密闭的房间(在此段时间内进行赊账交易);在合约时间结束时,再将那些交易广播到比特币网络上,这样可以保证区块链上保存最小化的信息。比特币闪电网络与现行的金融系统解决同类问题的方式极为相似。
8 多重签名
一般来说,一个比特币地址对应一个私钥,动用这个地址中的资金需要私钥的掌握者发起签名才行。而多重签名[18]地址,可以有3个相关联的私钥,用户需要其中的2个才能完成一笔转账。实际上,用户也可以设置成1/3、5/5、6/11的形式,但是最常见的是2/3的组合。
多重签名托管的工作原理如下:当Alice想要发送20元钱给Bob购买一个产品时,Alice首先挑选一个相互信任的仲裁员,这里称他为Martin;然后通过Alice, Bob, Martin三方多重签名来发送20元钱;Bob看到付款后,确认订单,邮寄商品;当Alice收到商品之后,她可以创建一个20元的多重签名给Bob,来完成这笔转账;然后,Bob再对其进行签名,这样就完成了转账。另外,Bob也可能会选择不发送产品,在这种情况下,他创建并签署20元的退款交易发送给Alice,让Alice可以签名并发布。那么,如果Bob声称已经发货,但是Alice拒绝付款呢?Alice和Bob就会联系Martin,让他来决定谁对谁错。Martin赞成哪一方,他就创建一笔给自己1元和对方19元的交易,并由对方提供签名,从而完成转账。
这种多重支付的方法需要为一个中介机构支付费用,那么它和Paypal相比好在哪里?首先,它是自愿的。在某些情况下,当用户从一个有信誉的大公司购买东西或者汇款给一个受信任的账户时,是不需要中介机构的,只需A转账给B就好了。其次,该系统是可以调整的。有时候,某些转账的仲裁员需要非常专业的知识才能够胜任。比如,用户购买虚拟商品的时候,最好选择虚拟商品平台上的专业仲裁员,而在其他的时候,用户可以选择一个一般的仲裁员就够了,因为专业仲裁员的收费比较高。市场上会产生一些专门的仲裁公司。通过多重签名技术,用户可以为每单交易轻松地选择不同的仲裁员,也可以不需要仲裁员,这时就是0手续费了。
9 合并挖矿
比特币工作量证明机制是指在矿工挖矿时,给区块补增一个随机数,并做随机哈希运算,使得给定区块的哈希值开头含有一定数量的零。下面举一个简单的例子。
对短语“message”(不含引号)进行SHA-256哈希算法加密会得到:
ab530a13e45914982b79f9b7e3fba994cfd1f3fb22f71cea1afbf02b460c6d1d
现在开始加入数据,直到得到一个以0开头的哈希值:
1message
daad0bc80059253928621a10365de153e335a18f03b9dc7e7e25897fb791f023
2message
6532f42bd1d6ccd00f47c133c3ca1a0fc852598e67c62eb31adab8ceb3a aa680
…
51message
0985e57510d017b177867168642543ab4f143333ad63782680e812251ab 3141e
经51次运算后得到第一个有效的哈希。只要“51message”一发送,接收器可以迅速通过哈希运算来验证它是否符合要求。被添加的那部分数据(本例中的51)被称作随机数(Nonce),关键在于该随机数可以是任何信息。
假设用户在同时挖A币与B币,现在用户有部分区块数据来自A币,部分区块数据来自B币,而且一个母随机数不断改变,直到用户找到一个区块。一旦用户找到一个块,它就是一个对A币、B币两者同时有效的块链(假设两者的挖矿难度相等)。例如:
同时哈希以下数据:[A币区块数据|B币区块数据|公随机数]
当一个块被发现:
对A币广播区块>> [A币区块数据]+随机数=B币区块数据+[母随机数]
对B币广播区块>> [B币区块数据]+随机数=A币区块数据+[母随机数]
只要用户愿意,就可以制造任意多的链。Slush矿池2011年就已经合并挖比特币与域名币(Name Coin)了。
合并挖矿的好处有:(1)同时为两个区块链贡献哈希计算力,有助于提高两个区块链的安全性;(2)挖矿的回报更高,在消耗相同电力的情况下,同时获得两种货币。如果用户不喜欢域名币,可以把它卖掉或换成比特币。
10 彩色币
通过仔细跟踪一些特定比特币的来龙去脉,可以将它们与其他的比特币区分开来,这些特定的比特币就叫作彩色币[19](Colored Bitcoins)。彩色币具有一些特殊的属性,比如支持代理或聚集点,从而具有与比特币面值无关的价值。彩色币可以用作替代货币、商品证书、智能财产以及其他金融工具,如股票和债券等。
比特币的P2P支付结算系统已经安全建立,可以实现可靠的、近乎于免费的转账,比特币网络(协议)本身是安全、稳定的,但比特币生态的服务提供商,比如汇率市场却被黑客多次攻击,这损害了比特币的声誉和交易价值。有没有一种办法可以利用比特币安全可靠的自身协议,来创建分布式的汇兑交易呢?
BitcoinX就是这样一个基于比特币的开放的标准协议,就像HTTP和Bit Torrent协议一样,该协议用来规范互联网的价值交易。基于BitcoinX协议,用户不但可以在分布式、安全的云平台上持有比特币,还可以持有黄金、欧元、美元或各种证券资产。这意味着人们可以使用金融工具进行自由交易,比如在某个节点G持有黄金,在另一个节点E持有欧元。用户可以以一种安全、透明、直接的方式相互兑换,而不需要第三方的介入。
BitcoinX的设计思想是将比特币网络(技术)与货币价值分割开来,并使用比特币网络技术来明晰交易来路以避免重复消费。通过创世转账来建立一个新的货币(即彩色币)。创世转账是一定量的比特币转账,这些比特币的金额将用来赋予所有这种新货币以价值。这一定数量的比特币发送到的那个地址就是新货币的起源地址,它将控制新货币的初始分配。
彩色币客户端就是通过一种特殊的方法来计算资金平衡的轻量级客户端。首先,所有转账的最后一个地址都是客户端地址,通过抓取区块链,可查看这些转账是否是来自创世转账。如果是,就将交易金额乘以初始分割率(假设0.00001BTC=1彩币),得到用户余额。彩色币客户端是分布式的,围绕特定的创世转账创建一个社区,就创造了一个独立的与比特币网络无关的“彩色币”生态,这个小的经济生态的波动建立在对比特币基础设施的利用上。
由于彩色币也是普通比特币,故它们也可以使用比特币网络,从一个地址传送到另一个地址。因为有办法识别出彩色币,所以它们相当于稀有货币,因此它们的价值取决于用户对这种稀有货币的需求,而与比特币价值无关。
彩色币怎样进行初始分配呢?在货币创世时,彩色币起源地址拥有该币的总体价值。在分配结束时,所有的货币价值将从起源地址转移到每个客户端。
在实际应用中,彩色币的拥有者不会知道货币总量有多少,此外,拥有者也不必知道想参与他的经济的有哪些人。在这种情形下,彩色币拥有者可以建立一个邀请系统,每一个新的客户端都可以邀请其他客户端加入。实现这种技术还有很长的路要走,比如社交网络身份验证、社交图谱搜索、担保系统、短信验证、独特的IP地址、物理识别等,这些方法可最大限度地减少在初次分配中的欺诈。