目录
详解区块链
一、bitcoin 和 blockchain
bitcoin(比特币),p2p 电子货币系统。
bitcoin 的背后是一种名为 blockchain(区块链) 的技术,区块链构建了一个由算法保证的 可信的去中心化 p2p 网络,并在该网络上维护一个由算法保证的 统一的分布式数据库。
所以,理解区块链技术有两个要点:
- 可信的去中心化 p2p 网络
- 统一的分布式数据库
这两者均由算法保证,所以当某个区块链应用被实现之后,该应用就几乎完全脱离了任何人(包括创造者)的控制,这也是为什么我们说 blockchain 是 去中心化 的。
其次,上文提到的所谓算法,一般指基于密码学原理的算法,例如 RSA 算法,还有一些 hash 算法(SHA256 等)。
简单来讲,区块链实现了一个去中心化的 p2p 网络,并保证所有节点维护一份统一的数据库,这就是区块链的本质,至于如何保证没有人捣乱(可信),且数据库唯一(统一),就是接下来要解释的事情了。
下面我们以 bitcoin 为例,从该区块链应用的两个方面 —— 交易 和 信任 —— 来理解以下几个问题:
- 去中心化的 p2p 网络为什么是可信的?谁来保证?
- 分布式数据库为什么是统一的?谁来保证?
- 区块链是什么?
二、交易
1. p2p 网络
bitcoin 系统运行在一个公开的 p2p 网络中,其中的每一个节点都是一台主机,任何人,只要遵循该 p2p 网络的相关协议,就可以随意加入该网络。
2. 账户
在现实中,银行通过一串数字 —— 银行卡号 —— 来标识一个银行账户,这个账户内的货币由银行负责管理。
而在 bitcoin 里,账户由 私钥、 公钥 和 比特币地址 构成。私钥和公钥也称 密钥对,这是非对称加密算法相关的一个概念。
其中,比特币地址相当于银行账户的卡号,以字符串形式表示,这个地址来自私钥,私钥相当于银行账户的密码,私钥经过加密生成公钥,公钥经过哈希生成比特币地址。
具体来讲,在 bitcoin 中,私钥是一串 256 位二进制数据,将私钥通过 ECDSA (椭圆曲线加密算法)加密得到公钥,再将公钥依次进行 SHA256 及 RIPEMD160 哈希得到一个 160 位二进制数据,最后对该数据加上一个版本前缀(用来标识该结果是什么类型,例如比特币地址的前缀是 0x00)并通过 Base58Check 编码得到最终的比特币地址。
addr = Base58Check(perfix + RIPEMD160(SHA256(ECDSA(privateKey)))
Base58Check 编码的过程中,将对 “前缀 + 数据” 进行双 SHA256 哈希,然后取哈希结果的前四位,拼接到 “前缀 + 数据” 的后面并进行 Base58 编码。
Base58Check(data) = Base58(perfix + data + SHA256(SHA256(perfix + data)) >> 252)
现在的问题在于,这么一大串转换,意味着什么呢?
我们来简单画个图:
(私钥) --ECDSA–> (公钥) --SHA256–> --RIPEMD160–> (公钥哈希) --Base58Check–> (比特币地址)
ECDSA 是一种非对称加密算法,简言之,我们可以使用私钥作为参数对任意一段数据进行加密形成一段密文,然后将公钥作为参数就能解密这段密文。
而且,私钥到公钥的生成是单向的,这也是非对称加密算法的特点 —— 就像即使别人捡到你的银行卡也无法得到你的密码一样,唯一的反向运算方法只有暴力尝试。
所以,在区块链的 p2p 网络中,只有私钥能证明自己的账户属于自己,至于“证明过程是什么”和“在哪个阶段或哪里证明”,将在下一节中说明。
于是,我们就可以把比特币地址(公钥的衍生)任意公开而不担心财产泄露。
至于读者可能要问的一个问题 —— ”既然公钥已经不能反向运算为私钥了,为什么还要将公钥生成比特币地址?“
原因其一是为了生成一个可读的字符串,其二是为了进行抽象。
关于后者我们暂时按下不表,也许在后面我们会提到,在这里我们就把比特币地址当做公钥即可,因为公钥到比特币地址几乎是单射(哈希碰撞概率极小可以忽略)。
例如,bitcoin 系统中第 0 笔交易的接受方比特币地址为:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
,这笔交易来自第 0 个区块的区块奖励,目前来看,这个地址应该属于中本聪本人。关于区块和奖励的概念,我们会在后面关于信任的问题中提到。
2009 年,有人在 p2pfoundation forum 上发表了一篇论文 Bitcoin: A Peer-to-Peer Electronic Cash System,并署名 Satoshi Nakamoto(中本聪)。
原贴 http://p2pfoundation.ning.com/forum/topics/bitcoin-open-source
这篇论文描述了一个被称为 bitcoin 的去中心化电子交易系统,在这篇论文中,区块链技术被首次提出(或者说,区块链是隐藏在 bitcoin 系统背后的技术)。
该论坛的用户 Satoshi Nakamoto 几乎没有留下任何个人资料,并在 2014 年后彻底消失,中本聪是谁已不可考。
有了比特币地址,我们就可以在 p2p 网络中进行交易了(收发货币),下面一节我们就来解释 bitcoin 货币、交易的概念。
3. 货币和交易
货币
bitcoin 是 blockchain 的一种金融应用,此外,bitcoin 也可指用作交易的对象 —— 货币。
以 bitcoin 为代表的金融产品还有很多,目前 Ethereum (以太坊)是当下新一代区块链金融应用。不过,金融应用只是区块链技术的一方面,他还可以用于实现更多不同领域的应用,例如知识产权保护应用 —— 亿书。
我们遇到的第一个问题(也是最主要的问题),就是在 bitcoin 中如何表示一个货币?或者说,如何知晓某个比特币地址拥有多少 bitcoin?
读者可能会首先想到哈希表,用一个哈希表记录所有地址到其账户余额的映射,每次发生交易后更新这个表。
但 bitcoin 并不是这么做的,bitcoin 中每个节点都自发维护一个账本,这个账本就是开头提到的 统一的分布式数据库,每个节点的账本都一模一样,账本中记录了从 bitcoin 开始运行到当下的每一笔交易,每一次交易都由一个数据块表示,记录着 发送方 和 接收方,以及 被交易的 bitcoin。
所以,想要查询某个地址的余额,只需要回溯该账本即可。虽然这种说法并不严谨,但易于理解。
具体来讲,中本聪给出的货币定义是这样的,一个 bitcoin 货币由一条数字签名链表示,数字签名链上的每一个结点代表一次交易,每次交易均承接自上一次交易的接收方,并以数字签名的方式转让所有权给下一个拥有者。
可以这么说,bitcoin 货币就是一条记录了该货币所有权变更历史的链。
We define an electronic coin as a chain of digital signatures. Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin. A payee can verify the signatures to verify the chain of ownership.
我们定义一枚电子货币就是一条数字签名链。每个拥有者都通过将上一次交易和下一个拥有者的公钥的哈希值的数字签名添加到此货币末尾的方式将这枚货币转移给下一个拥有者。收款人可以通过验证数字签名来证实其为该链的所有者。
—— Bitcoin: A Peer-to-Peer Electronic Cash System
数字签名
在开始谈这个交易数据块之前,我们先简单解释一下数字签名,数字签名是非对称加密的一个应用,用来校验一块数据确实是由私钥持有者发出且未经篡改的。
我们知道,经由私钥加密的密文,只能通过对应公钥解密,于是我们就可以基于该原理对数据发送方进行身份校验。
例如私钥持有者 A 发送一段数据 data 给 B,
A 对 data 进行哈希,然后通过私钥对哈希值加密生成密文,并附在 data 后面,一同发送给 B,即发送 data + encrypt(hash(data)),后者就被称为私钥签名。
B 拥有公钥,所以可以对加密的哈希值进行解密,然后使用同样的哈希算法对 data 进行哈希,然后将得到的哈希值与先前解密出的哈希值进行对比。
如果相同,则说明数据未被中间人篡改,因为篡改数据必然影响该数据的私钥签名。
同时也验证了发送方的身份,发送方确实是私钥持有者,因为未持有私钥的人无法假冒发送方进行私钥签名。
交易
注意,bitcoin 的严格定义是一条数字签名链,链上的每个结点代表对该 bitcoin 的所有权转让。
现在的问题是,如何验证某一个交易数据块确实由该 bitcoin 所有者发出?
现在数字签名就派上用场了,我们定义当前交易数据块包含接收方的公钥和发送方数字签名 —— 该数字签名是该 bitcoin 的所有者(即发送方)用自己的私钥针对 “上一次交易的数据块 和 本次交易接收方的公钥 的哈希值“ 生成的数字签名。
这样就形成了一条数字签名链,其他所有节点都可以通过上一个拥有者的公钥对数字签名进行验证,以校验本次交易行为确实由发送方公钥对应的私钥持有者发出。
UTXO
关于货币和交易,还有一个问题尚未解决,那就是,如果每个 bitcoin 都是一条数字签名链,那如果我们想要交易 1.5 个 bitcoin 怎么办?
实际上,交易的基本单位不是 1 bitcoin,而是一个**未花费的交易输出(Unspent Transaction Output)**简称 UTXO,数字签名链实际上是一个 UTXO 的数字签名链。
一个 UTXO 代表一定数量的 bitcoin,这些 bitcoin 一定是 ”一聪“ 的整数倍(bitcoin 的最小单位,十亿分之一 bitcoin)。
交易发生时,程序将从发送方可用的 UTXO 中选择出合适数量的 UTXO(选择算法一般基于贪心),这些 UTXO 拼凑出的 bitcoin 总额一定大于或等于交易所需的 bitcoin 数量。
于是,每一笔交易将拥有一个或多个 UTXO 输入和一个或多个 UTXO 输出。
被交易消耗的 UTXO 称为交易输入,随后,每一笔交易还会创建一定数量的 UTXO 输出作为找零和支付。
例如 A 向 B 支付 1.5 个 bitcoin,但 A 仅有两个 1 bitcoin 的 UTXO,那么该笔交易的输入将是这两个 1 bitcoin 的 UTXO,交易输出将是一个 1.5 bitcoin 的属于 B 的 UTXO 和一个用作找零的还给 A 的 UTXO。
1 bitcoin + 1 bitcoin ----> 1.5 bitcoin + 0.5 bitcoin
至此,关于交易的大部分细节就全部讲完了。
脚本
事实上,bitcoin 通过一种非图灵完备的脚本语言来实现交易。
每笔交易的每个不同的 UTXO 输出均绑定了一个 锁定脚本,这个锁定脚本是一段残缺的代码。对应地,当该 UTXO 作为交易输入时,必须提供一个 解锁脚本,这个解锁脚本也是一段残缺的代码。两段代码拼接在一起成为一段完整代码,当且仅当该完整代码执行后为真,该交易才被认定为有效。
可以这样理解,锁定脚本是一个返回值为 bool
的函数,解锁脚本将作为锁定脚本的参数传入,执行结果为真,则代表交易有效。
上文 交易 一节所述是中本聪在论文中给出的方法,而在真实的 bitcoin 交易中,通常使用的是几种已经编译好的标准交易脚本。
下面以 P2PKH(Pay-to-Public-Key-Hash) 标准交易脚本为例来说明交易过程,该标准交易脚本也是中本聪本人创建的。
假设,某 UTXO 的持有者 A 发布了一个交易,该交易将把此 UTXO 转让给 B。
在该 UTXO 输出中,包含有一个锁定脚本,js 描述如下:
function unlock({ publicKeyB, sig }) {
return sigDecode(sig, publicKey) == publicKeyBHush
}
解锁脚本包含两个要传入锁定脚本的参数:
publicKeyB = '...'
sig = sigEncode(hash(publicKeyB), privateKeyB)
当 B 对该 UTXO 进行再次转让时,需要提供上述解锁脚本,其他节点将很容易验证,并确认这笔交易有效。
4. 交易的匿名性
区块链的去中心化网络带有匿名性质,这种匿名性来自“开户”过程 —— 通过一段程序,我们可以在几秒内生成成千上万个比特币地址,以及相关的密钥对(私钥和公钥)。
而这个过程是不可控的,没有任何一个机构、组织和个人可以参与我们的开户过程,从而也就无从知晓比特币地址对应私钥的持有者是哪个具体的人。
再深入说,生成密钥对、地址的过程纯粹基于数学(密码学),那么把一个人关到一个小黑屋,给他一根笔一个本,他也可以手算一个比特币地址出来,这种基于数学的开户方式从本质上决定了外人根本无从插手。
那么除非主动暴露身份,用户到比特币地址的映射关系,其他人根本无从知晓。
不过,虽然隐藏在地址背后的用户是匿名的,但通过该地址进行的交易信息是完全公开的 —— 这与现实中的银行完全相反,在银行交易系统里,用户账户的交易信息是对其他用户保密的,而用户的账号和个人信息则是公开的。
下面画个图,用来更直观的理解两者的匿名性差异,x 代表不可追溯,箭头代表可追溯。
bitcoin:用户 <–x--> 账户 <-----> 交易信息
银行:用户 <-----> 账户 <–x--> 交易信息
5. 交易实例
为了更好地理解交易过程,我们举个简单的例子,看下面这个 json:
这是时间戳为 1622815442 —— Fri Jun 04 2021 22:04:02 GMT+0800 (GMT+08:00) —— 发生的一笔交易。
这笔交易有一个输入,两个输出,一个输出用于转让 bitcoin 所有权,另一个输出用作找零。
发送方的地址为 inputs[0].addr = '19iqYbeATe4RxghQZJnYVFU4mjUUu76EA6'
发送的 UTXO 代表的 bitcoin 数量 inputs[0].value = 998323924613
接收方的地址为 out[0].addr = '169ZgSeAZ1ptteYUwb12TThrgPKsUhVV6R'
接收方收到的 UTXO 代表的 bitcoin 数量 out[0].value = 83506844
用作找零的 UTXO 代表的 bitcoin 数量 out[1].value = 998240317769
// 20210604222041
// https://blockchain.info/rawtx/6dccf1e1ebb96626e63c49a1f91a86b9dd19dd33943d17bd00479f45240e2d0a
{
"hash": "6dccf1e1ebb96626e63c49a1f91a86b9dd19dd33943d17bd00479f45240e2d0a",
"ver": 2,
"vin_sz": 1,
"vout_sz": 2,
"size": 225,
"weight": 900,
"fee": 100000,
"relayed_by": "0.0.0.0",
"lock_time": 0,
"tx_index": 358036066055144,
"double_spend": false,
"time": 1622815442,
"block_index": 686245,
"block_height": 686245,
"inputs": [
{
"sequence": 4294967295,
"witness": "",
"script": "47304402203c6700dcdf595ce393a117b33fbf4d93749877a26754056b2d818f1f8dd93559022012fd1ee952107bb6be0d3498e9ff7b70076bc338efa6c36babfffa875a745bab012103a02e93cf8c47b250075b0af61f96ebd10376c0aaa7635148e889cb2b51c96927",
"index": 0,
"prev_out": {
"spent": true,
"script": "76a9145faa9576e45acbc9662b6abf323229b748a9495d88ac",
"spending_outpoints": [
{
"tx_index": 358036066055144,
"n": 0
}
],
"tx_index": 7554462829335803,
"value": 998323924613,
"addr": "19iqYbeATe4RxghQZJnYVFU4mjUUu76EA6",
"n": 0,
"type": 0
}
}
],
"out": [
{
"type": 0,
"spent": false,
"value": 83506844,
"spending_outpoints": [
],
"n": 0,
"tx_index": 358036066055144,
"script": "76a91438773c8d735bb8cf335e14b5bfb2f82c38ec886488ac",
"addr": "169ZgSeAZ1ptteYUwb12TThrgPKsUhVV6R"
},
{
"type": 0,
"spent": true,
"value": 998240317769,
"spending_outpoints": [
{
"tx_index": 5419439732237338,
"n": 0
}
],
"n": 1,
"tx_index": 358036066055144,
"script": "76a9145faa9576e45acbc9662b6abf323229b748a9495d88ac",
"addr": "19iqYbeATe4RxghQZJnYVFU4mjUUu76EA6"
}
]
}
6. 问题
以上所有内容解释了,什么是 bitcoin 货币,什么是交易,以及相关的概念:密钥对、比特币地址、bitcoin、UTXO、非对称加密、数字签名等。
有心的读者也许注意到了,到目前为止,开篇提出的三个问题似乎一个都没解决:
- 去中心化的 p2p 网络为什么是可信的?谁来保证?
- 分布式数据库为什么是统一的?谁来保证?
- 区块链是什么?
下面即将开始介绍 bitcoin 讨论的核心问题 —— 共识机制,上面三个问题也将被陆续回答,这是 bitcoin 能够在匿名的去中心化网络中保证账本安全的关键思想。
也为几个以前从未解决的计算机科学难题 —— 拜占庭将军问题、去中心化的双重支出问题等 —— 提供了解决方案。
Thanks for the breath of freedom, Satoshi.
三、信任
1. 两个信任问题
双重支付
基于数字签名的原理,我们有能力验证交易的真实性,但还存在一个双重支付的问题。
假设 A 向 B 发送了某个 UTXO,过了一段时间,又向 C 发送了同样的 UTXO,那么 bitcoin 网络该如何知晓该 UTXO 已经被支付过一次?
对同一个 UTXO 进行的第二次支付肯定是无效的,但若想知晓这是第二次支付并拒绝该交易,唯一的方法就是知晓先前的所有交易记录,然后进行回溯和检索。
在现实的中心化交易系统中 —— 例如银行,引入了一个可信的中心服务器,所有交易均通过该可信方检查和授权,可以有效避免双重支付的问题。
但要想在去中心化的匿名网络中达到这一目的,只有让所有交易都公开发布。
在前面的讨论中,我们均基于一个假设 —— 所有节点都自发的维护一个统一的账本副本,只有这样,所有交易才能有序进行下去。
所以,想要解决双重支付的问题,只需要通过某种机制,令所有节点自发地维护账本。
篡改记录
即便每个节点都在自发地记账,但也无法保证是否有人在篡改交易记录。
例如 A 曾经向 B 发送了 1 bitcoin,不久之后,A 偷偷在自己的账本上删去了这条记录,并公开广播这个伪造的账本。
很显然,这会对 bitcoin 网络带来混乱,在这种情况下,其他节点该如何应对?
统一账本的目的是为了防止记录被篡改,包括双重支付的问题 —— 在匿名的去中心化网络中,这是非常有可能发生的,描述这一问题的模型被称为 拜占庭将军问题。
拜占庭将军问题
在很久很久以前,拜占庭是东罗马帝国的首都。那个时候罗马帝国国土辽阔,为了防御目的,因此每个军队都分隔很远,将军与将军之间只能靠信使传递消息。
在打仗的时候,拜占庭军队内所有将军必需达成 一致的共识,一同进攻或撤退,才能更好地赢得胜利。但是,在军队内有可能存有叛徒,扰乱将军们的决定。
这时候,在已知有成员不可靠的情况下,其余忠诚的将军需要在不受叛徒的影响下达成一致的决定。
这种同步账本的机制被称为 共识机制,为了讲清楚,下面我将分两步讨论,最终达到 ”所有节点自发维护统一账本“ 的目的:
- 防止记录被篡改的问题
- 如何让所有节点自发维护账本的问题
2. 区块和哈希链
先从一个新概念 —— 区块 —— 开始,这一节将解答开篇的第三个问题 —— “区块链是什么?”
每个区块包含有一定数量的交易,这些交易按照时间顺序串联在一起,形成一条链,这就是所谓 “区块链”。
新区块由 p2p 网络中的任意节点生成。
为了防止交易记录被篡改,这条链将以下述这种方式组织:
每个区块根据其内容哈希出一个哈希值,而每个区块的头部将包含 上一个区块的哈希值,这个哈希值也被称为 哈希指针,标识其父区块。
即 一个区块的内容 = 上一个区块的哈希值 + 一些数据、属性(例如交易记录、区块序号、时间戳等)。
通过利用哈希函数的单向性,每个区块的内容将直接依赖父区块的内容,而父区块的内容又依赖其父区块的内容,就这样组成一条 “结实” 的链条。
不难想象,若某个区块 A 的交易记录被篡改,则 A 的哈希值会改变,则紧邻的下一个区块 B 的哈希指针将失效。
所以我们必须修改区块 B 的哈希指针,则区块 B 的哈希值会改变,从而导致紧邻的下一个区块 C 的哈希指针也失效。从而引起一系列连锁反应 —— 从篡改区块开始,其后所有区块都将失效。
这中组织方式被称为 哈希链,不过仅有哈希链还不足以防止篡改,因为从某个篡改区块开始重新哈希其后所有区块并不难,而且如何在 p2p 网络中决出负责生成区块的节点也是一个问题。
下面将解决这些问题。
3. 工作量证明
中本聪在论文中为 bitcoin 提出的共识机制叫做 工作量证明系统(Proof-of-Work system)。
实际上工作量证明这一概念最早由 Cynthia Dwork 和 Moni Naor 在一篇学术论文描述(但并未提出),只不过当时并非为了解决拜占庭将军问题,而是为了抵制垃圾邮件。
发送邮件时,发送方被要求使用计算机计算一个数学问题,这将会耗费发送者计算机一定的时间来找出答案,有些类似现今的验证码。
后来,工作量证明在论文 Hashcash - a denial of service counter-measure 中被提出。
该系统在哈希链的基础上,要求新区块的 SHA256 哈希值将至少以若干个 0 bit 开头。
于是,新区块的产生除了要包含父哈希值外,还被要求包含一个名为 nonce
的字段,该字段可由节点任意填写,目的就是要寻找一个 nonce
,使得该区块的 SHA256 哈希值至少以若干个 0 bit 开头。
由于 SHA256 的单向性,目前还不存在一个有效的算法能通过控制输入来得到特定形式的输出,所以想要找到这么一个 nonce
,唯一的方法就是暴力尝试。
很显然,要求 nonce
开头的 0 bit 越多,计算出正确结果的难度越大,同样算力下所需时间越长。不过,当一个正确的 nonce
被找出,新区快被广播后,其他节点将很容易验证 —— 只需要一次 SHA 256 计算。
验证通过后,这些节点将会将新区块接在本地区块链的后边,然后在这个新区快后继续工作。
随着 0 bit 位要求数量的线性增长,计算的难度呈指数级增长。
对于一个随机输入,该次输出的第一位可能为 0 也可能为 1,由于 SHA256 哈希结果的均匀性,第一位是 0 的事件概率依概率收敛到 1/2。
那么连续 n 次伯努利实验成功的概率即为 (1/2)^n。
4. 难度调整
如何确定新区快的 SHA256 哈希值要以几个 0 bit 开头呢?这一要求被称为难度,由字段 bits
决定。
bitcoin 的目标是平均每十分钟产出一个新区快,但参与计算的节点和算力是在不断变化的,同时由于硬件的发展,单个节点的算力也会不断增长。
鉴于此,该难度值是可调整的,且难度的调整是每个节点依照规则自发独⽴完成的。在 bitcoin 中,每产生 2016 个区块,所有节点都会调整一次难度,调整依据是上 2016 个区块所用时间与目标平均时间 20160 min 的比较。
5. 激励
上述这种通过暴力尝试生成区块的行为就是所谓的 挖矿,该节点称为 矿工节点。
为了激励 p2p 网络中的节点帮忙记账(生成区块),每个区块的第一笔交易将是一笔特殊交易,称 coinbase 交易 或 创币交易。
这是创币交易的结构,由矿工负责构造:
可以看到,没有发送者地址,即 addr
字段。
{
"sequence": 4294967295,
"witness": "",
"script": "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73",
"index": 0,
"prev_out": null
}
以每个区块奖励 50 个⽐特币开始,每产⽣ 210000 个区块减半⼀次,预计在 2140 年后停止产出。
工作量证明系统能够有效防止篡改记录,并统一所有账本,保证该网络是可信的:
- 激励机制使更多算力进入 p2p 网络,以维持该网络的稳定性。
- 攻击者篡改区块后需要重做其后的工作量证明,除非攻击者能够整合超过全网 50% 的算力,否则将永远落后主链的生成速度。
- 工作量证明机制的本质是,使用 CPU 算力进行投票,以决出负责记账的节点,最长的链代表了多数决定,因为有最大的计算工作量证明的精力投入到这条链上。
6. 创世区块实例
{
"hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
"ver": 1,
"prev_block": "0000000000000000000000000000000000000000000000000000000000000000",
"mrkl_root": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"time": 1231006505,
"bits": 486604799,
"next_block": [
"00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048"
],
"fee": 0,
"nonce": 2083236893,
"n_tx": 1,
"size": 285,
"block_index": 0,
"main_chain": true,
"height": 0,
"weight": 1140,
"tx": [
{
"hash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"ver": 1,
"vin_sz": 1,
"vout_sz": 1,
"size": 204,
"weight": 816,
"fee": 0,
"relayed_by": "0.0.0.0",
"lock_time": 0,
"tx_index": 2098408272645986,
"double_spend": false,
"time": 1231006505,
"block_index": 0,
"block_height": 0,
"inputs": [
{
"sequence": 4294967295,
"witness": "",
"script": "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73",
"index": 0,
"prev_out": null
}
],
"out": [
{
"type": 0,
"spent": false,
"value": 5000000000,
"spending_outpoints": [
],
"n": 0,
"tx_index": 2098408272645986,
"script": "4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac",
"addr": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"
}
]
}
]
}
7. 工作量证明存在的问题
-
量子计算机
工作量证明基于算力设计,其能够绕过信任形成共识的基本假定是算力有限、稳定。
以目前基础科学的发展状况来看,在未来,量子计算机 将是威胁到该 bitcoin 系统稳定的技术。
-
区块链应用初期
区块链应用实现初期,参与计算的算力过小且不稳定,即便有挖矿难度的动态调整,短时间内也会存在很大安全隐患,很容易发生 51% 攻击。
-
爆块奖励减少至 0
对于 bitcoin 这种发行量有限的通货紧缩货币,在2140年之后,所有的矿⼯收益都将仅由交易费构成,单凭交易手续费是否能够维持足够安全的算力,是一个问题。