主页 > imtoken苹果手机不能下载 > #3 比特币的共识协议

#3 比特币的共识协议

imtoken苹果手机不能下载 2023-11-08 05:14:01

第一的

本文对应老师P4

比特币创世纪区块_比特币每个区块产出几个币_比特币区块记录查询

链接到 #1 比特币密码学原理文章:

比特币区块记录查询_比特币创世纪区块_比特币每个区块产出几个币

链接到 #2 比特币数据结构文章:

比特币每个区块产出几个币_比特币创世纪区块_比特币区块记录查询

1 引用:央行如何发行数字货币

1.1 方案一:

央行发行数字货币,央行用私钥对数字货币进行签名,公众使用央行的公钥来验证数字货币的真伪。

比特币区块记录查询_比特币创世纪区块_比特币每个区块产出几个币

比如老师头像左右两侧分别是央行用私钥签名的100元和50元数字货币

老师买肉,将左边100元的数字货币支付(复制)给屠夫。 屠夫使用公钥(每个人都有)来验证并完成交易。

这个方案可行吗?

这是不可行的,因为无法防止双花攻击。 原因是老师在向屠夫支付(复制)数字货币的同时,还可以保留押金,下次买菜时可以支付给菜农。

1.2 方案二:

中央银行为每一种数字货币分配一个序列号,并维护一个数据库。 中央银行在数据库中维护每种货币的序列号及其所有者。 比如017号币是肖震的,018号币是张三的……

比特币每个区块产出几个币_比特币区块记录查询_比特币创世纪区块

017号货币属于萧震

肖震老师将数字货币支付(复制)给屠夫时,屠夫在数据库中查询①货币是否为真品; ②货币支付是小震的。 如果全部通过,则支付完成。 支付完成后,在数据库中,数字货币编号指向屠夫。

比特币创世纪区块_比特币每个区块产出几个币_比特币区块记录查询

肖震老师买菜的时候,如果还是用017号货币支付,菜农查数据库的时候,会发现这个币是屠夫的,不是肖震老师的,所以交易不会去通过。

这个方案能防止双花攻击吗? 预防。

这个方案可行吗?

正确性没有问题,但是每一笔交易都要经过央行,是中心化交易。

我们能否发明一种解决方案,一种去中心化的解决方案,将验证责任从中央银行转移到公众身上?

1.3 方案启示:

要发行数字货币,需要解决两个问题:

1、谁有权力决定发行货币、发行多少货币、何时发行货币?

2. 如何验证交易的有效性,如何防止双花攻击?

在比特币系统中,第一个问题的答案是挖矿机制,后面会讲到。

这一次,如何验证交易的有效性

比特币区块记录查询_比特币创世纪区块_比特币每个区块产出几个币

2 如何验证交易的有效性

在比特币系统中,如何防止双花攻击就是维护一个上面提到的数据库。 然而,这个数据库是由公众维护的,而不是由中央银行维护的。 这个数据库,或者说数据结构,叫做“区块链”

2.1 比特币如何交易(基于交易的账本)

我们先来看一个合法的交易:

比特币创世纪区块_比特币区块记录查询_比特币每个区块产出几个币

每个方框代表一个方块

比特币区块记录查询_比特币创世纪区块_比特币每个区块产出几个币

最左边第一个区块中的交易是铸造交易。 显示A(由于挖矿)获得了10个比特币。

中间第二个区块的交易中,A转5个比特币给B,5个比特币给C。在这个交易中,需要说明A支付的10个比特币的来源(也就是箭头所指) ,并且必须有A的签名(由A签名),表示A同意这笔交易。

右边第三个区块的交易中,B向C转了2个比特币,向D转了3个比特币。在这个交易中,需要说明B支付的5个比特币的来源(即由箭头),并且必须有B的签名(由B签名),表示B同意交易。

上述交易完成后,我们发现C有7(2+5)个比特币,D有3个比特币。

我们来看一个非法交易:

比特币区块记录查询_比特币每个区块产出几个币_比特币创世纪区块

非法交易传奇

1.一个“矿”10个币

2、A分别转10个币给B5和C5

3、B分别转5个币给C2和D3

4. C转1个币给E

5. B转5个币给F(非法)

第五次非法交易的原因是B没有那么多钱,进行了双花攻击。 这个非法怎么查? 它是通过追踪货币的来源。 “5. B转5个币给F(非法)” 往前追溯交易币的来源,发现是在第二个区块,但是我们发现在第三个区块,已经转了5个币,所以B实际上没有那么多币,所以交易是非法的。

通过以上两个交易例子,我们发现比特币网络在现实世界中并没有使用“记录账户余额”的方法来测试双花攻击,而是使用“追溯交易”的方法来测试双花攻击(本质上是检查付款人是否真的有那么多钱)。

我们将前一种“记录账户余额”的方式称为账户分类账,将后一种“追溯交易”的方式称为交易分类账。 比特币使用基于交易的分类账,而以太坊和现实世界使用基于账户的分类账。

2.2 几个问题

1、在A到B的转账交易中,A(付款人)需要了解B(收款人)的哪些信息?

A需要知道B的地址(地址类似于账户名),这个地址是通过B的公钥计算出来的(详见#1)

比特币区块记录查询_比特币创世纪区块_比特币每个区块产出几个币

2、在A给B的转账交易中,B(收款人)需要知道A(付款人)的哪些信息?

B需要知道A的公钥,所有节点都需要知道A的公钥才能验证。

比特币区块记录查询_比特币创世纪区块_比特币每个区块产出几个币

3 比特币的共识机制——POW(proof of works)

什么是共识机制? 简单来说,每个全节点在本地维护一个区块,这个区块包含多笔交易。 那么,哪些交易被写入区块,以什么顺序写入区块,导致各个节点维护的区块内容不一致。 那么,那么多全节点,最终会选择哪个节点的区块上传到区块链(其实上传这个概念不好,网上没有区块链,大家认可的区块链其实都是保存在本地的在每个节点上)? 这是一个共识问题。

3.1 工作量证明:POW

1. 每个账户一人一票制

每个账户都有一人一票制,得票最多的区块上传到区块链。 由于女巫攻击,这种方法不可行。

女巫攻击:恶意节点利用超级计算机不断生成账户来操纵投票。

2、比特币网络采用工作量证明共识机制,即POW机制

POW的原理是算力投票系统,具体运行过程如下:

Step1:通过网络广播新的数据记录,通过基本合法性验证的数据暂存。 这意味着所有候选块都是合法块,非法块(非法是指块中包含的交易是非法的)不会被用作候选块。

Step2:全网执行共识算法,即寻找合适的nonce,使H(Block header)≤target,俗称挖矿

Step3:先找到nonce节点获得记账权,其打包的区块可以上传到区块链

Step4:对外广播新区块,其他节点验证通过后加入主链。

3.2 挖矿原理

许多教程将挖矿解释为解决数学问题,这在本质上是错误的。 挖矿原理如下:

Step1:每个节点维护一个候选区块,这个候选区块必须是合法的,包括:合法的签名、足够的余额、正确的语法。 这里补充一点,节点按照一定的规则将交易打包到候选区块中。 规则是:①先打包coinbase交易,即转入一定数量的比特币到自己的账户。 ②优先级较高的打包交易。 交易的优先级是指如果一个交易没有赶上前一个区块,它的优先级会相应增加。 ③交易成本较高的交易

比特币区块记录查询_比特币创世纪区块_比特币每个区块产出几个币

Step2:将以下内容首尾相连:

版本

父散列

交易的默克尔树根哈希值

更新时间

困难

随机数

上面的内容首尾相连后是一个字符串,设为A。需要注意的是,上面的内容中,1~5项是常量值,不会改变( date好像没变),唯一能变的就是6,也就是nonce值。 所以老师一直说挖矿是为了测试nonce值。 还有一点,上面还有一个内容就是父哈希值。 选择父哈希值意味着矿工选择接受这个区块。

Step3:对字符串做两次SHA256哈希运算:

SHA256 (SHA256(A))

Step4:我们不断随机改变nonce值(注意不是从0开始一路递增),直到:

SHA256(SHA256(A)) ≤ 目标

上一篇文章讲过,SHA256运算得到一个256位的二进制数,通俗理解就是小于等于target就是SHA256(SHA256(A))的前n位为0

3.3 最长合法链与分叉攻击

考虑以下情况:A 在第 5 个区块上传到链上后发布了一个 4' 的区块,并试图将其上传到区块链中。 这可能吗?

比特币区块记录查询_比特币创世纪区块_比特币每个区块产出几个币

分叉攻击示意图,无视模糊老师

它很难。 这种方法称为分叉攻击,后面会详细介绍。

比特币每个区块产出几个币_比特币创世纪区块_比特币区块记录查询

难的原因是区块链网络会认可最长合法链的说法比特币每个区块产出几个币,即如图所示,1~5已经是最长合法链,那么当A上传4'块时,必然会形成1~4'链,虽然这条链是合法的,但并不是最长的。 对于目前各个节点正在打包的区块(还记得上面说的,挖矿的时候需要父哈希值吗),他们在计算nonce的时候比特币每个区块产出几个币,已经确定5号区块的哈希值为父哈希值,这意味着他们的候选区块必须连接在第5个区块之后,而不是第4'个区块之后。

那么,这种攻击可能吗? 这是可能的,将在后面关于分叉攻击的章节中详细讨论。 这里简单说一下,就是A的算力很强,那么A上传完4'块后,A马上计算5'块,马上计算6'块。 这个时候,区块链网络大家还没有数过6个区块。 这是A同时上传了区块5'和6',这些区块中的交易都是合法的。 区块链网络的各个节点在校验nonce后发现满足要求后,就会放弃计算6号块,转而按照A上传的6号块计算7号块。

这是一个分叉攻击。 由于分叉攻击,区块 4 和区块 5 中的所有合法交易都被回滚。

3.4 自然分叉

3.3讲分叉攻击,3.4讲自然分叉。 即同时有两个满足要求的矿工,同时计算并广播nonce。 此时,会有两个候选区块试图加入区块链,如下图所示。

比特币每个区块产出几个币_比特币创世纪区块_比特币区块记录查询

那么每个节点会接受哪一个呢? 一般情况下,谁先收到,谁就先被接受。 这样,在区块链网络中,有些人会接受上层区块,有些人会接受下层区块。 然后,接受上述区块的节点将使用上述区块的哈希值作为父哈希值来准备下一个区块,下同。

这创建了一个自然的分叉。 遇到这种情况怎么办? 很简单,看下一个合法块是连接在上方还是下方。如下图

比特币每个区块产出几个币_比特币区块记录查询_比特币创世纪区块

先连接上层区块,然后上层链成为最长合法链,同时下层区块成为孤儿块,回滚其中的所有交易。

比特币区块记录查询_比特币创世纪区块_比特币每个区块产出几个币

4 比特币挖矿机制

为什么要计算nonce,也就是为什么要打包块,竞争记账权?

因为有区块奖励和交易手续费(交易手续费很少)。

如上所述,每个区块的第一笔交易是 coinbase 交易,这是区块奖励,也是比特币网络中产生新币的唯一途径。

一开始每个区块奖励是50个比特币,比特币机制是每21万个区块区块奖励减半。 即50→25→12.5……目前每个区块的奖励是12.5个比特币。

从上面我们也可以推断,比特币一共只有2100万枚。

比特币区块记录查询_比特币创世纪区块_比特币每个区块产出几个币

结尾

这一章很长,但是老师讲了很多异步系统,包括CAP原理等等,这些内容我没有写,有兴趣的可以百度。

如有任何问题,欢迎站内来信交流(优先),或发邮件至:sam.jiang@sjtu.edu.cn(如有较多问题)