数字货币存在的问题
数字货币本身为带有签名的数据文件,可以进行复制。即:对用户来说,可以将同一货币花费两次。这就是“双花攻击”。
如何解决:对货币添加唯一编号(不可篡改),每次支付向货币发行单位查询真伪。该方法每次交易都依赖于第三方机构来判断货币真伪且防止双花攻击。这是一个典型的第三方中心化方案。
现实中,我们的交易往往依赖于一个可信的第三方机构(支付宝、微信),这个机构具有较高的可信度,有政府背书,所以可以采用这种方案。
但是,很多场景下,并不存在这样一个可信赖的第三方机构。基于这个背景,以去中心化思想为核心的比特币系统便吸引了人们的注意力。
去中心化需要解决的问题
- 货币由谁发行,如何发行,什么时候发行?
在比特币系统中由挖矿来决定货币发行权的发行量
- 如何验证交易是否有效?如何防止双花攻击?
该问题的解决,依赖于系统中维护的一个数据结构,记录货币的使用情况(是否被花过,被谁花过?)。该数据结构由系统中全体用户共同维护,保证了交易的有效性。该数据结构,便是区块链。
该数据结构中,有两种哈希指针,一种指向前面的区块,使得形成区块链,第二种(红色部分)则是为了说明比特币的来源。说明比特币的来源非凭空捏造,可以防止双花攻击。
如下,假如 A 获得铸币权,并发布了 10 个比特币(该交易称为铸币交易)。
在进行交易时,A 给 B 转账,需要付款人的签名和收款人的地址(公钥的哈希)。收款方需要知道付款方的公钥(为了验证签名是否有效。实际上其他节点都需要知道付款方的公钥,验证交易合法性)。
这里存在一个问题:
:::info
假设 B 的同伙 B’,B’ 伪造一笔 A 到 B 的转账交易,用自己的公钥说是 A 的公钥,然后用假造的私钥签个名,别的节点收到这笔交易后,要假造的公钥去验证这个签名。验证结果肯定是对的,这让别的节点以为这个交易是合法的,这就出问题了。相当于把 A 账上的钱偷走了。
:::
解决这个问题的关键,就是第二种哈希指针。虽然 B’伪造了 A 到 B 的交易,但是实际中 A 转账的时候提供的公钥需要和铸币交易中的公钥对的上,如果对不上,说明该交易不合法。
比特币区块信息
区块信息可以分为两部分:block header 和 block body
block header 由以下信息:
- version(版本协议)
- hash of previous block header(指向前一个区块指针)
- merkle root hash(默克尔树根哈希值)
- target(挖矿难度目标阈值)
- nonce(随机数)
hash of previous block header 只计算区块头部部分的哈希(merkle root hash 保证了 block body 内容不被篡改,所以只需要计算 block header 即可保证整个区块内容不会被篡改)。
区块链中,轻节点(只存储区块 block header 信息)只利用区块链,并不参与区块链系统的维护和构造。
比特币共识协议
投票方案:可行的投票方案前提是系统中的大多数节点时“好”的节点,在这种情况下进行共识协议设置。
比特币系统中,若直接投票,将某节点打包交易到区块,将其发给其他节点,其他节点检查该候选区块,检查若正确投赞成票,若票数过半,则加入区块链。存在以下问题:
- 恶意节点不断打包不合法区块,导致一直无法达成共识
- 无强迫投票收到,某些节点可以不投票(行政不作为)
- 网络延迟未知,投票需要等待多久?
- 最重要的问题,比特币系统中任何人都可以创建账户,且建账户及其简单,若黑客使用计算机专门生成大量公私钥对,当其产生超过系统中一半数目,就可以获得支配地位(女巫攻击)
所以比特币系统并没采用这种简单的账户数目方案,而是依据算力进行投票。每个节点都可以自行组装一个候选区块,然后尝试各种 nonce 值,这就是挖矿。当某个节点找到符合要求的 nonceh(block header)<=target
,便获得了记账权,从而可以将区块发布到系统中。其他节点收到区块后,验证区块合法性,如果绝大多数节点验证通过,则接口该区块为最新区块并加入到区块链。
比特币激励机制
节点为什么要提供算力和电力成本去竞争记账权?
比特币引入奖励机制,通过设置出块奖励来解决该问题。
一个获得合法区块的节点,可以在去区块中加入一个特殊交易(铸币交易)。这也是唯一一种产生新比特币的途经。
比特币系统规定,起初每个区块可以获得 50 个比特币,但之后每隔 21 万个区块,奖励减半
区块中保存交易记录,如果仅仅设置出块奖励,那么,会不会存在节点只想发布区块获得出块奖励而不想打包交易?
比特币系统设计了 Tranction fee(交易费),对于获得记账权节点来说,除了出块奖励之外,还可以得到打包交易的交易费。但目前来说,交易费远远小于出块奖励。等到未来出块奖励变少,可能区块链的维护便主要依赖于交易费了。