主页 > 华为手机怎么安装imtoken > 肖真区块链课程笔记:BTC原理(第二至第四讲)

肖真区块链课程笔记:BTC原理(第二至第四讲)

华为手机怎么安装imtoken 2024-01-26 05:12:19

以下笔记来自北京大学肖震老师的《区块链技术与应用》公开课。同时感谢我主页上的@blockchainnotes 对课程下方的笔记

BTC密码学原理第二讲

一、简介

1、比特币是一种加密货币,但实际上区块链上的所有交易内容(账户地址、转账金额)都是公开的

2、比特币使用两种加密功能:散列、签名

二、哈希

1、密码学中使用的哈希:密码哈希函数

2、密码散列函数的两个性质

(1)防撞

阐明:

①碰撞(散列碰撞):例如x≠y,H(x)=H(y)两个不同的输入,但输出相等

② 哈希冲突很常见,比如哈希表;原则上哈希冲突是不可避免的,因为输入空间远大于输出空间

③ 所以抗碰撞并不意味着不会发生hash碰撞,无碰撞意味着没有有效的方法人为地制造hash碰撞,即给定x,很难找到y,所以H(x)= H(y),除非暴力破解

④ 防碰撞的作用:检测消息的篡改,没有办法篡改内容,同时不被检测。对于要被消化的消息,例如该消息为m,m的哈希值为H(m)=digest。如果有人想篡改 m 值,而 H(m) 保持不变,那是做不到的。

⑤ 没有哈希函数可以在数学上证明抗碰撞性,这是基于实践经验的。

(2)隐藏

阐明:

① 哈希函数的计算过程是单向的,不可逆的。

② x→H(x)✅;H(x)→x❎;哈希值并没有透露任何关于输入的信息(当然也可以使用蛮力遍历穷举)

③ 隐藏属性的前提是输入空间足够大,使得暴力破解不可行,并且分布需要比较均匀。如果不够大,通常会在x后面拼接一个随机数,比如H(x||nonce)。

④ 隐藏的作用:结合防碰撞实现数字承诺(也称数字等效密封信封)

⑤密封信封:例如:预测股价预测结果,预测结果不能提前披露,同时必须保证预测结果未被篡改。哈希值是关于发布哈希值的。隐藏让人们知道哈希值而不是预测值。最后,发布 x。由于碰撞阻力的性质,预测结果不能被篡改。

3、BTC 还要求哈希函数具有第三个属性:谜题友好

(1)hash值的预算是无法提前预知的。如果hash值为00...0XX...X,也无法提前知道哪个值更容易计算结果,还是要一一带来。

(2)❓❓为什么 BTC 需要益智游戏❓❓

①比特币挖矿的过程其实就是找一个nonce。随机数与块头中的其他信息结合作为输入,得到的哈希值小于或等于指定的目标预值。

② H(块头)≤目标。区块头是指区块头。区块头中有很多字段。其中一个字段是我们可以设置的随机数随机数。挖矿过程就是不断尝试随机数,使区块头经过哈希处理,落在指定范围内。

③ 解谜友好意味着挖矿过程没有捷径。为了使输出值在规定范围内,只能一一尝试。所以它可以作为工作量证明。挖矿难,验证容易。(很难解决,但很容易验证)

4、比特币中使用的哈希函数称为SHA-256(安全哈希算法)。满足以上三个性质。

三、签名

1、BTC系统中的账户管理

在比特币系统中开一个账户,在本地创建一个公钥对(公钥,私钥),就是一个账户。公私密钥对源自非对称加密算法。

2、非对称加密算法和对称加密

区块链技术和比特币_比特币创世纪区块_比特币创世纪区块地址

(1)对称加密:两个人之间的信息交换可以使用加密密钥,A将信息加密后发送给B,B收到后用密钥解密,因为加密和解密使用的是相同的密钥,即所谓的对称加密。

(2)对称加密的前提是有一个通道可以安全地将密钥分发给通信双方。因此,对称加密的缺点是密钥分发不方便,容易被窃听。

(3)非对称密钥使用一对密钥而不是一个,公钥用于加密,私钥用于解密,接收者的公钥和私钥用于加密和解密。

(4)好处:解决了密钥分发不方便的问题。公钥不需要保密,私钥也需要保密,而私钥只需要在本地保存就可以了不需要传递给对方,公钥相当于银行账号,别人只需要知道公钥就可以转账,私钥相当于账户密码,知道私钥就可以转账账户中的钱。公钥和私钥用于签名

3、BTC系统加密应用场景:签名

(1)例子:如果A想给B转10个比特币,A把交易放到区块链上,别人怎么知道这笔交易是A发起的?这就需要A使用自己的私钥了用于对交易进行签名,其他人收到交易后,会使用A的公钥来验证签名,私钥用于签名,公钥用于验证,依旧是同一个人。

(2)创建一个账号生成相同的公私钥的可能性很小,所以创建大量账号盗取别人的账号是不可行的。

4、随机源

我们假设在生成公钥和私钥时有很好的随机性来源。公钥和私钥是随机生成的。如果随机源不好,有可能生成相同的公钥和私钥。

比特币中使用的签名算法不仅是生成公钥​​和私钥时的良好随机性来源,而且是之后每个签名的良好随机性来源。只要用于签名的随机源不好,就有可能泄露私钥。

第三讲是BTC的数据结构

一、哈希指针

1、普通指针将结构的地址存储在内存中。如果 P 是指向结构的指针,那么 P 中存储的就是该结构在内存中的起始位置。

2、哈希指针除了存储地址外,还需要存储结构的哈希值H()。

3、hash指针的好处:从hash指针的hash值中,不仅可以查到结构体的位置,还可以查到结构体的内容是否被篡改过,因为我们保存了它的hash价值。

二、区块链

1、比特币中最基本的结构是区块链,它是一个由区块组成的链表。

2、❓❓区块链和普通链表有什么区别❓❓

(1)B区块链是一个使用哈希指针的链表)

一个普通的链表可以改变任何元素,对链表中的其他元素没有影响。区块链影响整个身体,因为只需要保存最后一个哈希值,就可以判断区块链是否发生了变化,以及在哪里发生了变化。

阐明:

区块链的第一个区块称为创世区块;最后一个块是最近的块。每个块都包含一个指向前一个块的哈希指针。

区块哈希值的计算方法是结合整个前一个区块的内容,包括里面的哈希指针,得到哈希值。通过这种结构,可以实现防篡改日志。

(2)普通链表中的变化元素对链表中的其他元素没有影响,而区块链影响整个链表。

只需要保存最后一个hash值,就可以判断区块链是否发生了变化,以及在哪里发生了变化。所以比特币不必保留所有区块,它可以只保留最近的数千个区块。如果你想使用前一个块,你可以向系统中的其他节点请求这个块。有些节点是恶意的,如何判断?这里用到了hash值的一个属性,如下:

其他节点给你出块,如何判断是否正确?计算其哈希值,并将其与保留块的哈希值进行比较。

三、默克尔树

1、结构说明

2、Merkle 树的好处

比特币创世纪区块地址_区块链技术和比特币_比特币创世纪区块

只要记住根哈希,就可以检测到对树的任何部分的修改。

3、Merkle 树在比特币中的应用

比特币中的区块通过哈希指针连接。每个区块中包含的交易以默克尔树的形式组织。数据块底部的每个块实际上是一个事务。它分为两部分,即块头和块体(块头,块体)。

区块头中有一个根哈希值。由每个区块中包含的所有交易组成的默克尔树的根哈希值存在于区块的区块头中。但是,区块头中并没有交易的具体内容,只有一个根哈希值。,在块体中有一个交易列表。

4、merkle tree的作用:提供merkle证明

比特币中的节点分为两类:全节点(保存整个区块的内容,即区块头和区块体有交易的具体信息)和轻节点(比如手机上的比特币钱包)(只有块头)

❓❓如何向轻节点证明交易写入区块链❓❓

需要使用默克尔证明:找到交易的位置(最下面一行的区块之一),则该区块到根节点的路径称为默克尔证明。

默克尔证明传说

阐明:

(1)最上面一行是一个小区块链,图中是一个区块的默克尔树比特币创世纪区块地址,最下面一行是包含的交易。

(2)假设一个轻节点想知道图片中的黄色交易是否包含在默克尔树中。轻节点不包含交易列表,没有这棵默克尔树的具体内容,只有一个根哈希值.

(3)轻节点向全节点发送请求,证明黄色交易包含在这棵merkle树的merkle证明中。全节点收到这个请求后,只需要标记三个红色交易图中,只需向轻节点发送一个哈希值,有了这些哈希值后,轻节点就可以在本地计算图中绿色标记的三个哈希值。

(4)先计算黄色交易的hash值,也就是正上方的绿色hash值,然后和旁边的红色hash值拼接,计算上层节点的绿色hash值。 (图步骤一)

(5)然后拼接,然后计算上绿色的hash值(图中步骤2),再拼接,就可以计算出整棵树的根hash值(图中步骤3)。

(6)轻节点将这个根哈希值与区块头中的根哈希值进行比较,就可以知道黄色交易是否在这棵默克尔树中。

第 4 讲:BTC 中的协议

一、❓❓可以和央行一样发行数字货币吗❓❓

1、不是,因为数字货币和纸币的区别在于数字货币可以被复制(纸币很难复制),这就是所谓的双花攻击。

2、数字货币面临的一大挑战:如何防止双花攻击

二、集中式解决方案

1、发行由央行统一控制

2、每笔交易都需要央行确认,证明合法性

三、去中心化币需要解决两个问题

1、数字货币发行

(1)比特币的发行由挖矿决定

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

需要维护一个数据结构来检测硬币是否已经被花费以及是谁花费了它。该数据结构由所有用户共同维护 → 区块链

例子:

比特币发行者 A 有权铸币(createcoin),发行 10 个比特币(铸币交易);A 分别给 B 和 C 五个: A(10) → B(5)C (5) ,交易需要 A 签名,证明 A 已经同意。(设计由 A),并解释花费的 10 个比特币是从哪里来的。

比特币创世纪区块地址_区块链技术和比特币_比特币创世纪区块

四、比特币系统中的交易描述

1、区块链小图标

小区块链图标

1、比特币系统中的每一笔交易都由一个输入和一个输出组成。

(1)输入部分要注明币的来源,

(2)输出部分应该给出接收者公钥的哈希值。

2、两个哈希指针:

(1)第一种:块之间连接,将它们串在一起形成链表(这是我们前面学过的)

(2)第二种:指向前一笔交易的指针,表示币的来源。

❓❓为什么要说明币的来源❓❓

证明硬币不是凭空捏造的证据已记录在案,它还可以防止双重支出。

五、转账交易如何运作

1、A转账给B所需的资料:A的签名和B的地址

1.1 关于B的地址:比特币系统中收款地址是根据公钥计算出来的(地址≈银行账号)

❓❓A怎么知道B的地址❓❓

需要通过其他渠道获取,因为在比特币系统中没有查询对方地址的功能(例如:电子商务网站,接受比特币支付,可以公开自己的地址或公钥)

1.2 关于A的签名:A想给B转账,B需要知道A的公钥

❓❓为什么要知道A的公钥❓❓

① 因为 A 的公钥代表 A 的身份

②不仅B,所有节点都必须知道A的公钥→为了验证A的签名(签名用私钥签名公钥验证)

❓❓如何知道A的公钥❓❓

A 的公钥由他自己在交易中给出。不仅要输入硬币的来源,还要输入公钥。

❓❓如果B的同伙伪造了这笔交易怎么办?如何预防❓❓

方法是输出A的公钥的hash,所以A在第二个区块交易中的公钥必须和之前的hash配对。

2、加密与签名对比

(1)加密:A向B发送加密消息比特币创世纪区块地址,A用B的公钥加密,B收到后用自己的私钥解密

(2)签名:B对A签名,用A的公钥加密,收到后用自己的私钥解密

六、实际比特币系统中的一些细节

1、上述验证过程是通过执行脚本实现的:BitCoin Script

(1)每笔交易的输入都是一个脚本,包括给出公钥的过程,在输入脚本中也有规定。

(2)每笔交易的输出也是一个脚本,要验证其合法性,需要将当前交易的输入脚本与上一笔交易(提供币源的交易)的输出脚本结合起来,再看看能不能顺利执行,能执行则说明合法。

区块链技术和比特币_比特币创世纪区块_比特币创世纪区块地址

2、在实际系统中,每个区块(对应图中的每个框)可以有很多交易,这些交易形成一个默克尔树。每个区块分为区块头和区块体。

(1)区块头包含区块的宏信息,如:

① 使用的是哪个版本的比特币协议?

② 指向区块链中前一个区块的指针(前一个区块头的哈希)

③ 整个默克尔树的根哈希(merkle root hash)

④ 另外还有两个与挖矿相关的字段:一个是挖矿难度目标值(target),另一个是随机数nonce。(这里的target就是前面提到的那个,整个block header的hash应该小于这个pre-value,也就是H(block header)≤target。block header里面存放的是这个target pre-的code(nBits) -value.这里注意,前一个块的hash只计算前一个块的块头,所以之前的绘制,一个块导致一个切割头指向另一个块的中间,是不正确的,所以有些书切割头是指向块顶部的点。哈希时,块头的所有部分都被哈希。)

⑤ 块体中有交易列表。

3、在简化版系统中,每个节点都需要验证所有交易,而在实际系统中,节点分为全节点和轻节点。

(1)全节点保存了区块链的所有信息并对每一笔交易进行验证,所以全节点也称为全验证节点

(2)轻节点只保存区块头信息。一般来说,轻节点无法独立验证交易的合法性。比如一笔交易是否是双花,轻节点不存储之前的交易信息,因此无法验证交易的有效性。

(3)系统中大部分节点都是轻节点,本课内容主要针对全节点(因为轻节点不参与区块链的建设和维护,只是使用区块链的部分信息)进行一些查询)。

七、区块链中的内容是如何写入区块链的?→ 分布式共识

1、谁来决定哪些交易应该包含在下一个区块中?以什么顺序?如果每个节点自己决定可以吗?

如果每个人都在本地维护一个区块链,则无法保证区块链的统一性,账本的内容是为了实现分布式共识。

2、分布式共识

2.1 分布式共识的一个简单例子是分布式哈希表。例如,系统中有许多机器共同维护一个全局哈希表。

这里需要商定什么?哈希表中包含哪些键值对键值对。如果有人在自己的电脑上插入一个键值对,那么“xiao”对对应的是12345,即“xiao”→12345。然后其他人在从另一台计算机读取时应该能够读取这个,这称为全局哈希表。

2.2 分布式系统有很多不可能的结果,其中最著名的就是FLP。这三个字母是三位专家的首字母,

在异步系统(称为无网络传输延迟上限的异步系统)中,即使只有一个成员出现故障,也不可能达成共识。

2.3 一个著名的结论:CAP 定理。

Consistency、Availability 和 Partition tolerance 只能满足三者中的二者。

2.4 分布式共识 众所周知的协议是Paxos,它可以保证一致性,第一属性。如果协议达成共识,那么共识一定是一致的,即每个成员认为的共识是一致的。但是,在某些情况下,该协议可能永远无法达成共识,这是一个很小但客观的可能性。

八、比特币共识

1、要解决的问题是:有些节点可能是恶意的。假设系统中大部分节点都不错,如何设计共识协议??

1.1 第一个解决方案是投票。首先,应该确定哪些区块具有投票权。有些会员有严格的要求。在这种情况下,基于投票的解决方案是可行的。

投票方案的问题:比特币系统使得创建账户很容易,所以当账户总数超过一半时,一些人可以继续创建账户并获得控制权。这称为女巫攻击。因此,投票方法是不可取的。

1.2 进化版的投票:不是靠账户数量,而是靠算力。

每个节点可以在本地组装一个候选区块,把它认为合法的交易放进去,然后开始尝试各种nonce值(占用4个字节),看看哪一个能满足不等式H(block header)≤target要求. 如果一个节点发现一个满足要求的nonce,它就有记账的权利。

❓❓什么是记账权❓❓

记账权:将下一个区块写入比特币账本的权利。只有找到这个nonce,获得记账权的节点才有权发布下一个区块。其他节点收到这个块后,需要验证这个块的合法性。

❓❓验证合法性需要其他节点验证什么❓❓

① 例如括号中的区块头内容是否正确?

比特币创世纪区块_比特币创世纪区块地址_区块链技术和比特币

② 区块头中有一个字段叫nBits field。实际上,它是目标预值的代码。检查nBits字段的设置是否满足比特币协议规定的难度要求。

③不等式是否成立。

④ 查看块体中的交易列表,验证每笔交易是否合法:第一个一、必须有合法签名且二、之前没有被消费过。

如果有一项不符合要求,则该块是不可接受的。如果所有条件都满足,则可能不被接受。

❓❓即使满足条件也不能接受❓❓

交易是有效的,但它不在最长的有效链上。这称为分叉攻击。

❄️❄️比特币协议中规定,接收到的区块应该是延伸的最长合法链后面的区块

❄️❄️分叉攻击:通过在区块链中间插入一个块,回滚已经发生的交易

最长的法律链

阐明:

(1)如果生成了新块,怎么知道新块插入到哪里了?根据生成块的指针。

(2)图中显示的两笔交易是指A转账给B和A转账给自己。这种情况不是双花。判断一笔交易是否是双花,取决于区块所在的分支,没有被花掉,如图,直到第三个区块,币都没有被花掉,所以这个交易是合法的。但是还是不能接受。

? ? 区块链在正常情况下也可能分叉。如何处理这种情况??

(1)具体情况描述:两个节点同时获得记账权。每个节点在本地组装一个自己认为合适的块,然后尝试各种nonce,如果两个节点差不多在同一时间,如果一个nonce找到符合要求的,就可以出块,会出现两条等长的分叉,这两条是最长的合法链。

(2)应该接受哪一个?在比特币协议中,默认情况下(默认含义),每个节点都会接受它最早收到的那个。所以不同的节点根据它们在网络上的位置而有所不同,有些节点听到新生成的块中的一个,然后接受这个块;一些节点先听到另一个块,然后接受另一个块。

(3)如何判断收到了一个区块?比特币协议中使用了隐式委托,如果继续沿着这个区块扩展,则识别出已发布的区块。例如,在其中一个新生成的区块中块后展开一个块,表示新块被批准。

(4)后续发展将如何发展?等长的临时分叉会维持一段时间,直到有一个分叉获胜。即哪条链先产生新区块,以最长且合法的为准另一个叫做孤块,这两个新块可能会拉到一起,两条区块链会胜出,取决于谁的算力最强,有时也看谁的运气好。

(5)竞争记账权的好处:首先获得记账权的节点有一定的权力,可以决定哪些交易写入下一个区块。

(6)区块奖励)

①什么?比特币协议规定,获得记账权的节点可以在已发布的区块中进行一项特殊的交易:铸币交易。本次交易可以发行一定数量的比特币。

②为什么?获得记账权的节点的权利不应该被设置为记账权竞争的主要驱动力,因为我们希望所有合法的交易都写在区块链中,所以比特币巧妙地构建了一个机制:区块报酬。

③怎么做?谁决定货币的发行?Coinbase 交易 Coinbase 交易是比特币系统中发行新比特币的唯一途径,所有后续交易都是比特币的转移。该交易不需要指明硬币的来源。可以制作多少个硬币?比特币刚推出的时候,每个发布的区块可以产生 50 个比特币(比特币是比特币的象征)。协议规定,21万个区块后,初始区块奖励减半,变为25BTC。再过 210,000 个区块后,将再次减半。

2、比特币系统要达成的共识是什么?

去中心化账本的内容是达成共识。

? ? 谁可以决定账本的内容??

只有获得记账权的节点才能写入账本。

? ? 如何正确记账??

就是解谜(挖矿)。

? ? 为什么比特币的共识机制要靠算例来投票??

由于谜题友好的性质,解决谜题没有捷径可走。算力越大,获得会计权的概率越大。它不是一个人,一票或一台计算机,一票,而是每秒可以尝试的随机数(哈希率)。, 算力决定投票权重

? ? 如何防止女巫袭击??

门票是按算力计算的,无论创建多少账户,都无法增强算力。

3、比特币争夺记账权的过程称为挖矿,比特币称为数字黄金,争夺记账权的节点称为矿工。