考虑当前手机上的余额、手里的现金,其实本质都归属于银行发给我们的欠条,是在政府监管下的流通货币。当我们在做交易时,银行属于可信第三方,银行发行的货币在交易过程中起到了重要作用。但基于金融机构的受信任第三方容易受调解纠纷的影响。这些成本和支付的不确定性可以通过使用实物货币来避免,但不存在在没有可信方的情况下通过通信渠道进行支付的机制。
在2008年,中本聪提出了本文,该论文被认为是区块链的白皮书。讲解了Bitcoin这个分布式账本系统的运转方式。
Bitcoin是一个完全不需要第三方的交易系统,通过计算保证了交易的不可逆性,保证了卖家的资产安全,Bitcoin使用点对点分布式时间戳服务器来生成交易时间顺序的计算证明。只要诚实节点共同控制比任何合作的攻击者节点组更多的 CPU 功率,系统就是安全的(后续会讲解为什么是安全的)。
散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。
当前业界所用比较广泛的加密方式即是SHA256
[在线加密演示],可以将任意数据(文本、图片、视频)转换成256位长度的01字符串(转换为16位表示法就是)。使用该标准,使用方可以很轻易的生成所需要加密数据的哈希值(即称为摘要),但是其他人很难通过摘要还原出原始数据
简单来说,公钥和私钥不相同,即可称之为非对称加密,比较经典的算法即是RSA算法
用户可以同时生成公钥和私钥,私钥自己保留,然后交给问价接收者公钥,用户通过私钥对数据进行加密,接收者只能通过公钥对该数据进行解密
在文章中,中本聪将电子硬币定义为数字签名链
We define an electronic coin as a chain of digital signatures.
每个人在Bitcoin 注册账号后,可以通过一个随机数生成一对公钥和私钥,根据公钥可以生成自己的钱包地址
当A对B发起交易时,A需要公开自己的公钥和钱包地址,B只需要提供自己的钱包地址(只是针对交易内容),因为B需要知道A的公钥,才能对A地数字链所有权进行验证。而下面介绍的是全局验证
假设前一个交易的已经存在hash值,此时A拥有该链(注意是交易链,不是区块链),A对B发起交易,A上一笔交易的散列值为sign0,此时需要sign0 和B的公钥一起进行散列运算得到A的签名sign A, sign A是由A的私钥签名所得到的。如果想验证A的签名就要使用A的公钥。
当A将自己的签名附在交易中之后,这笔电子货币的所有权就从A转给了所有者B。
此时A对应的就是图中的Owner 1,B对应的就是图中的Owner 2,所发生的交易也就是中间的块过度到右边的块(不是指的区块,只是单纯图中的形状),对应着该块电子硬币的所有人从A转给了B
由于没有第三方的监管,所有的交易必须公开宣布,并且需要所有的分布式账本的参与者对交易的历史顺序达成一致。但是只通过该方法无法解决双重支付的问题
双重支付:假设A只拥有10个比特币(BTC),他在发起一笔10BTC的交易给B后,又发起了一笔10BTC的交易给C
收款人将难以检验之前的某位所有者是否对这枚电子货币进行了双重支付。传统银行的解决方案是引入信得过的权威:比如类似于造币厂( mint )的机构。在发生每笔交易后,都需要将所交易的电子货币收回。后面会有该内容的相应解决办法
本文为了解决该双重支付的问题,添加了时间戳服务器的使用,需要在对数据求哈希值时,加入当前时间,以此之后,每个散列都包含上一个交易发生的时间戳,以及本次发生交易的时间戳。这个后面会讲述
在中本聪最开始定义的区块链中,每个区块差不多1MB大小,每个区块最多只能包含2000多笔交易,每十分钟只能生成一个区块,意味着每十分钟就只能处理2000多笔交易。
当需要形成一个块时,不同的矿工会竞争完成一个"数学题",谁实现了本次数学题,也就完成了本次所需要的"工作量"
所需要实现的内容,是构建一个字符串
要求:要求所生成的256位hash值,前N位必须为0。
矿工根据自己的时间戳,以及不断尝试随机数,最终达成所需要满足的要求,当发现了该随机数,即广播自己完成了本次工作。此时矿工会构建该块,并会得到构建区块所提供的奖励。(也会出现两个矿工同时达成目标,竞争块的情况,后续会讲到)
除了构建区块的奖励外,矿工还会对交易进行抽成,交易方需自己指定本次交易的手续费,如果没有手续费,不会有矿工对本次交易进行结块。
比特币是一个没有通胀的货币,发行是有限的,矿工出块的奖励每四年会减半,到2140年,发行量达到2100万后,将不会再有出块奖励。
关于所生成的256位hash值,前N位的N设置,决定了构建块的难度
N越大,随机生成满足条件的概率越小,随N的增长呈指数级降低
做个简单的计算题,以10000台矿机为例,每台计算机的运行次数为10T/s = 1.4 ∗ 10 13 次 / s 1.4*{10}^{13}次/s 1.4∗1013次/s,此时需要满足10分钟构建一个块的要求,
1.4 ∗ 10 次 / s 13 ∗ 1 0 4 ( 机器数目 ) ∗ 600 s ( 10 分钟 ) = 2 N 1.4*{10}次/s^{13} * 10^4(机器数目)*600s(10分钟) = 2^{N} 1.4∗10次/s13∗104(机器数目)∗600s(10分钟)=2N
此时所计算的N大小约为66,所需要满足前66位为0,能在10分钟内构建块
因此Bitcoin这个分布式账本的运行方式就呼之欲出了
节点始终遵循最长链原则,此时就可以解决上一节两个矿工的情况
矿工A和矿工B同时完成了对新区块的构建, 同时广播该块的信息,黑色小人先收到A矿工的广播信息,构建自己的A块,红色小人先收到B矿工的广播信息,构建自己的B块,两组分别基于自己的新块构建下一个块,当某一个小组的新块构建成功后,会广播自己的新块,另一个小组在收到该新的最长链的消息后,放弃之前的分歧链,选择在最长链之后构建新块。
通常两个小组的算力决定了下一个区块的归属。
同样,如果某一个区块的消息丢失,也是借鉴相似的运行方式,在收到下一个区块,意识到自己不是最长链的情况下,会放弃构建自己的区块,选择最长链作为自己的主链并继续自己的工作
当在消除分歧时,假设消除矿工A构建的新块,会收回矿工A的手续费和交易构建费(这笔交易应该也是发生在自己的下一个区块构建上,本质上还是区块链上支持的一笔交易),如果A执意选择在自己的块上构建,随着落后的区块数目越来越多,所能追上的概率也就越来越小,最后一节计算了在N个节点落后的情况下追上的概率。
本系统的激励机制如上一节描述的那样
交易可以是由完全不熟悉本系统的两个人发起,由其他人对该交易进行记账。别人(矿工)帮你保存该交易的记录,也就会收到该行为所带来的奖励
假设A向B发起一笔10BTC(bitcoin)的交易,他会在发起的同时,标注手续费的大小,该手续费也就是给矿工们保存记录的抽成。
这种激励机制会很有效的鼓励节点保持诚实,因为在分布式账本中要发生欺骗,通常意味着攻击者拥有本系统中超过50%的算力,在该激励条件下,选择遵守该系统的标准,反而更有利于获得财富
一旦硬币中的最新交易被埋在足够多的区块下,之前花费的交易就可以被丢弃以节省磁盘空间。 为了在不破坏区块哈希的情况下实现这一点,交易在默克尔树 中进行哈希处理,只有根包含在区块的哈希中。 然后可以通过砍掉树的树枝来压缩旧块。 内部哈希不需要存储
基于Merkle Tree,比如验证事务3是否真实发生,只需图中的Hash01
,Hash2
的值即可,并不需要知道其他Hash值,Nonce代表的是随机数
关于Merkle Tree 可以看下这篇文章:MIT 6.824 Lecture 18 Fork Consistency & CT & Merkle Tree的应用
这些事务都是在一个Block块中,可能是由多个不同的发起者生成的交易
无需运行完整的网络节点即可验证付款。 用户只需要保留最长工作量证明链的区块头副本,他可以通过查询网络节点来获取该副本,直到他确信自己拥有最长的链,并获得将交易链接到区块的 Merkle 分支 他无法自己检查交易,但通过将其链接到链中的某个位置,他可以看到网络节点已接受该交易,并在进一步确认网络已接受该交易后添加区块。
尽管可以单独处理硬币,但为转账中的每一分钱进行单独的交易会很麻烦。 为了允许价值的分割和组合,交易包含多个输入和输出。 通常情况下,要么是来自较大的先前交易的单个输入,要么是组合较小金额的多个输入,并且最多有两个输出:一个用于付款,一个将找零(如果有)返回给发送者。
应该注意的是,扇出(其中一个事务依赖于多个事务,而这些事务又依赖于更多事务)在这里不是问题。 永远不需要提取交易历史记录的完整独立副本。
结合上两节,本节讲一下身份验证、余额检查和双重支付的问题
BitCoin分布式账本通过追溯的方式确定用户的余额,当已有的块上,A已经拥有了两笔交易,分别是获取的50个BTC,以及已经支付的20个BTC
此时当A发起10BTC的交易给B,此时矿工们会检查之前的块,如果通过,会将其构建在自己的块中,本处为通过
此时当A发起60BTC的交易给B,此时矿工们也会检查之前的块,不通过
这小节来讲一下双重支付的问题,假设A有10个BTC,然后同时发起了两笔交易
此时有两组矿工分别先后接受了这两笔交易,假设上面这一组先接受了A给B发起的交易,下面这组先接受了A给C发起的交易,矿工们在确认先接受的交易符合余额的要求,后面接受的交易不符合要求,舍弃。
此时两组会分别将这两个交易打包到自己的块中,然后争取完成工作量证明,假设上面的红色框中的小人完成了工作量证明。A给B发起的10个BTC的交易完成。他会广播自己构建的新块,此时下面的小组就会放弃自己构建的A发起的给C的交易记录
该分布式系统通过保持公钥匿名
公众只会看到一笔交易的发起,却看不到交易者的信息,同时,为了防止个人地址被攻击。
每笔交易都应使用新的密钥对,以防止它们链接到共同的所有者。 对于多输入交易,一些链接仍然是不可避免的,这必然表明它们的输入由同一所有者拥有。 风险在于,如果密钥的所有者被泄露,链接可能会泄露属于同一所有者的其他交易。
本节就是计算了在落后z个区块后,追上最长链的概率
p = 诚实节点发现新块的概率 q = 攻击者发现新块的概率 q z :攻击者在落后 z 个区块后追上的概率 p = 诚实节点发现新块的概率\\q=攻击者发现新块的概率\\q_z:攻击者在落后z个区块后追上的概率 p=诚实节点发现新块的概率q=攻击者发现新块的概率qz:攻击者在落后z个区块后追上的概率
感兴趣的可以看看这个公式的计算过程
p和q对应着算力比率,通常情况下,攻击者的算力会远远小于诚实节点的算力
论文中给出了攻击节点在0.1和0.3概率线,落后z个节点,追上的概率。
以及计算了需要多个区块,在不同攻击者算力占比的情况下,追上概率小于0.001的情况
通常情况下,大额的比特币交易,只有在构建六个长区块的情况下,才会确认这笔交易完成。防止被恶意追上的情况。
由于比特币对交易双方隐私的保护,以及比特币价值不断增长,越来越多不法分子通过Bitcoin这个分布式账本完成非法交易。同时,由于激励机制与实际财富绑定,滋生了大量的矿工,为了分一杯羹,甚至一些电脑制造业和显卡厂商下场参与比特币的获取。不得不承认,有些人通过比特币实现了财富扩张,但也有很多跟风者做了韭菜。
投资不代表投机,抛开滋生的灰色产业不谈,比特币所产生的影响是划时代的,他真正将分布式系统知识融入进了金融领域,对传统货币体系造成了冲击。社会上很大一部分价值的本质最终还是来源于知识。