【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(01-13)——BTC篇

学习视频来自:北京大学计算机系肖臻区块链学习视频
还有一些参考了一些博客的记录。

其他博客1

01 简介

1.1 教材

教材和参考资料如下:

  • BitCoin and CryptoCurrency Technologies A comprehensive introduction (2016)
  • 以太坊白皮书、黄皮书、源代码
  • Solidity 文档

1.2 主要内容

比特币:

  1. 密码学基础
  2. 比特币的数据结构
  3. 共识协议和系统实现
  4. 挖矿算法和难度调整
  5. 比特币脚本
  6. 软分叉和硬分叉
  7. 匿名和隐私保护

以太坊:

  1. 概述:基于账户的分布式账户
  2. 数据结构:状态树、交易树、收据树
  3. GHOST协议 挖矿:memory-hard mining puzzle 挖矿难度调整 权益证明 casper the Friend Finality Gadget(FFG)
  4. 智能合约

02 BTC密码学原理

2.1 哈希

加密货币特性:crypto-currency 本身并不加密,转账地址是公开。主要使用了哈希函数,哈希函数特性:Cryptographic hash function ,collision resistance,抗碰撞性。

x=y 那么 Hash(x)=Hash(y);而且 Hash(x)≠Hash(y),那么x≠y

人为制造哈希collision没有好的方法,只能采用穷举法破解,brute-force。d在比特币系统中,采用SHA-256算法。输出空间为2^256。

哈希函数的作用:生成消息摘要digest。在实际生活中,以网盘上传文件为例,文件上传前计算文件的Hash值,下载保存文件后,再次计算文件的Hash值,如果2个Hash值不一致,文件就是被篡改了。如果2个Hash值一致,那么保存在云盘上的文件是没有被篡改过的。(云厂商为什么要篡改文件,云厂商本身的原因造成文件损坏,用户没有察觉这个问题,通过校验Hash值的方式可以发现)。

哈希函数作用二:信息隐藏。举例为,我要预测股票,将股票预测文本的摘要hash公布出去,但是股票预测这段文本M没有公布。当股票结果被证实了(经过一段时间),我再将股票预测文本M公布,所有人都可以用Hash算法验证M摘要信息hash2,如果hash2=hash,那么可以证明我之前公布文本M。

信息隐藏必须满足条件,输入的样本空间必须大。否则,恶意攻击者会穷举输入,找到产生摘要的原文。例如,股票的个数比较少,那么可以添加随机数,计算H(X || nonce)并公布,公布原文的时候要一并公布随机数nonce。可能有人会怀疑,我通过修改X和nonce,伪造了摘要信息,但是哈希函数的抗碰撞性,伪造出这个摘要值是非常困难的。
2.2 工作量证明

在比特币中要求,合法的区块必须满足:

H(block header)≤target

在区块头(block header)中有一个域nonce,穷举计算nonce,计算block header哈希值小于target,确定一个合法区块。

区块链的工作原理,记账节点(矿工)收集网络上广播的交易(tx),维护一个交易集合,将若干笔交易打包,计算交易列表hash,放在block header中,穷举nonce域,使H(block header)≤target。

由于Hash函数的puzzle friendly特性,只能使用穷举算法。挖矿的主要工作就是通过穷举计算,找到符合条件的区块头。矿工找到符合条件块头,就获得了记账权,获得出块奖励和交易费,矿工要把这个区块信息发布到网络上,以便其他矿工能够收到这个区块信息。
在这里插入图片描述
2.3 账户信息

在比特币中,用户可以自己创建一个公私钥对,公钥就作为用户的账户信息。公私钥体系又称为非对称密码体系,一对密码分为(public key,private key),私钥保密,公钥公开。利用公私钥实现信息的保密通信和数字签名。

Alice想要给Bob发送信息,Alice在公开场景下获取了Bob的公钥,Bob的私钥自己保密。那么Alice用Bob的公钥加密信息发送给Bob,Bob接收到信息后,用Bob自己私钥解密。加密后的密文可以在不安全的信道上传输,没有Bob的私钥,无法解密密文。

数字签名可以用来实现信息的真实性和抗抵赖性。Alice要向Bob提供一版word版报价单,Bob要求Alice提供报价单的真实性证明,Alice可以采用Hash算法计算文件的摘要,并用Alice自己的私钥对摘要加密,加密后的结果就是数字签名,Alice把原始word文档和数字签名一起发给Bob。Bob收到word文件时,可以计算word摘要,并用Alice的公钥解密数字签名,如果收到的word文档摘要和摘要数字签名解密后的结果一致,证明了报价单在传递过程中没有被篡改,也证明了确实是Alice认可的文档。

在BTC中,用户可以任意生成公私钥,将公钥公布作为自己的账号地址,私钥作为账户所属权证明。实现转账时,发起向某个公钥地址转账的交易(tx),那么这个公钥对应的账号就获得了这笔交易的金额。

在2.2节可以看到比特币的区块中记录的都是一笔一笔交易(tx),而发起交易的节点并不是直接将交易写到区块链上,而是发布到网络上,让矿工节点接收。矿工节点通过挖矿获得记账权,发布打包交易的区块。

这里有一个问题,如果是用户自己产生公私钥,而私钥能够代表一个人身份,如果产生的公私钥重复,怎么办?比特币采用的公钥算法,公钥空间很大,这样即使用户自己产生公私钥,发生碰撞的概率也很小。同样是这个原因,通过穷举公私钥对比特币账户进行攻击,也是不能实现的。但是,用户在生成公私钥时,应采用优质的随机源。如果随机源用的不好,一次签名也可以泄露私钥。
扩充:
1.比特币加密算法一共有两类:非对称加密算法(椭圆曲线加密算法)和哈希算法(SHA256,RIMPED160算法)。
公钥和私钥(encyption key)由椭圆曲线加密算法生成,私钥可推出公钥而反之不能。
【重点】:

有了私钥,你就可以对文本签名。别人拿了你的公钥就可以根据签名认证你是否拥有私钥。这就是证明你拥有存款的办法。

为了安全起见,公钥应该隐藏起来。所以对公钥进行哈希加密,生成公钥哈希值然后计算哈希值的比特币地址:

**

  • 公钥哈希值=RIMPED160(SHA256(公钥))

**

**

  • 比特币地址=1+Base58(0+公钥哈希值+校验码)

**

**

  • 校验码=前四字节(SHA256(SHA256(0+公钥哈希值)))

**
SHA-256算法

单向Hash函数是密码学和信息安全领域中的一个非常重要的基本算法,它是把任意长的消息转化为较短的、固定长度的消息摘要的算法。

2.SHA-256算法的安全性分析

Hash函数的安全性很大程度上取决于抗强碰撞的能力,即攻击者找出两个涓息M和M’(M≠M’),使得H(M)=HM’。因此,评价一个Hash函数的安全性,就是看攻击者在现有的条件下,是否能找到该函数的一对碰撞。目前已有的对Hash函数攻击的方法包括生日攻击、彩虹表攻击、差分攻击等。

3.生日攻击

生日攻击是一种可用于攻击任何类型Hash函数的攻击方法。从攻击原理上看,它没有利用Hash函数的结构和任何代数弱性质,只依赖于Hash值的长度。因此,抵御生日攻击最有效的方法是Hash值必须有足够的长度。

生日攻击步骤:

发送方用私钥对256位的Hash值加密,并将加密结果附于消息之后一并提交给接收者,攻击者可按如下步骤实施攻击:

1)攻击者生成出消息M的2128种不同的消息变形,每一种消息变形都与原消息M具有相同的含义,同时攻击者再伪造一个假冒的消息M’,并对假冒的消息生成出2128个不同消息,其目的是试图用假冒的消息替代真实消息。

2)比较上述两个集合,找出具有相同Hash值的一对消息Mi和M’j,依照生日悖论原理,攻击者找到碰撞的概率大于0.5。如果没找到,则重新伪造一个消息,并生成2128个变形,直至找到碰撞为止。

3)攻击者将消息Mi(与伪造消息M’j有相同Hash值)提交给A请求签名,后将该签名连同伪造消息M’j一起发送给接收者

4.差分攻击

差分攻击是目前破译迭代Hash函数最有效的手法之一,其基本方法是利用明文的输入差值对输出差值的影响,运用差分的高概率的继承或者消除来产生最终的相同输出。一个Hash函数的安全性高低最终要看能否找到函数的整体碰撞,由于SHA-256算法具有迭代型结构,根据迭代算法的雪崩效应,随着轮数的增加,相应的整体碰撞复杂度会急剧上升,这就使得找到整体碰撞变得非常困难,直至目前现有的攻击还无法找到SHA-256的一个整体碰撞。因此,SHA-256算法被认为是目前最安全的Hash函数之一。

5.签名与验证
可以参考这篇文章比特币交易中的签名与验证

03BTC数据结构

1. 特殊的单链表
这个单链表就特殊在它是反过来,而且是hash指针作为记录当前最近的区块。反过来的意思是指指向是反向的,如下图:
在这里插入图片描述
解析一下上面的图,第一个是创始区块,第三个块假如命名为H3(m3) ,H3(m3)= H2(m2+H(m2)),同理,第二个块相应命名为H2(m2) ,H2(m2)= H1(m1+H(m1)),hash指针记录的是当前最新的结点的Hash值。
2. 比特币结构图
下图为比特币结构图:
在这里插入图片描述
比特币的结构分为区块头和区块体,其中区块头细分为:

  • 父区块头哈希值:前一区块的哈希值,使用SHA256(SHA256(父区块头))计算。占32字节

  • 版本:区块版本号,表示本区块遵守的验证规则 。占4字节

  • 时间戳:该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己2个小时时间戳的区块。占4字节

  • 难度:该区块工作量证明算法的难度目标,已经使用特定算法编码。占4字节

  • 随机数(Nonce):为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数。占4字节

  • Merkle根:该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算。占32字节

区块头总共占了80字节。

3.比特币的Merkle树
在这里插入图片描述
最底层的叶子结点是有信息的区块,每一个区块各取一个hash值,兄弟结点的hash值组成一个父结点,两个父结点再组成爷结点,爷结点再……最后得到的hash值作为根哈希值。
【注:】轻结点就是保存根H(m)的值,而全结点就是指保存所有区块的结点。轻节点的数目不多,,大部分还是全节点。举个例子:BTC的钱包就是轻结点只保存根哈希。
【笔记】:

Merkle树特点记住root hash的值,则可以保护整个树 ,保证每个节点不被修改

4.Merkle树的作用
1.Merkle的作用之一提供Merkle proof
前面我们提过轻结点即保存根H(m)的值,全结点是指保存所有区块的结点。那么我们如何向轻节点证明某个交易是写入区块链的则需要用到Merkle proof。

在这里插入图片描述
首先算出黄色代证明tx的哈希值也就是绿色的。再和右边红色的哈希值也就是全结点提供的哈希值拼接起来可以算出上一层绿色的哈希值,同理 以此类推可以得出Merkle 的根哈希值,再将该值与block header的哈希值对比一下即可证明黄色代证明tx是否在该Merkle tree里。
【总结】从下往上 每一次检查都是正确的也即是正确的。需要注意的是 我们只能检查半边也就是绿色的哈希值 ,和红色拼接最后得到根哈希值。我们改变任意一个都会导致最后根哈希值与block header里存放的哈希值不一样从而达到纠错。
如果上述文字还不是很理解,可以看下面图片方式讲解交易过程如下:
在这里插入图片描述
红色的date block可以生成最靠近的红色H(m),最靠近蓝色H(m)是向全结点请求的结果,两个hash结果得到橙色H(m)最后结合向全结点请求的绿色H(m)最后就得到了一个H(m),再和根哈希值比较,假如相等就是指已经添加到链上。

从而我们可以证明proof of membership.时间复杂度为O(log(n))
【课堂提问】
我们是否可以证明proof of non-membership?

答:可以。比较高效的方法是对叶节点的哈希值进行排序。我们把我们要查找的哈希值算出来
然后看他在哪两个叶子节点之间。我们需要提供的proof是看把那新节点和这两个节点之间进行一次计算,不断往上 最后与根哈希值比对 如果改变了
则proof of non-membership。这种排好序的方法叫做sorted merkle tree。(比特币中没有用到sorted
merkle tree,因为比特币种不需要不存在证明)

【笔记】实际中,我们只要保证是无环状的结构都可以用哈希指针。但如果是有环的就不可以了。比如 循环单链表就不可以用哈希指针。因为会造成循环依赖。
在这里插入图片描述
因为哈希指针后一个指针哈希值需要前一个来确认。但如果是带环的话,则会导致每一个都确认不了 从而导致循环依赖。

04.BTC协议

4.1.数字货币与双花攻击(double spending attack)
央行可以发行一种和纸币对应的数字货币,数字货币中包含面额、编号和央行数字签名。如下图所示:
如果采用
在这里插入图片描述
当Alice向Bob花费100元时,可以将手中的100元数字货币转交给Bob。但是,这种数字货币会有一个严重问题,Alice可以复制这个数字货币,并在下一次支付时候,再次使用。这个就是双花问题double spending attack。
我们可以考虑 引入编号 来避免这个问题。
比如 017对应 Alice。Alice向Bob支付100元后。017对应的拥有者就修改为Bob。如果Alice想复制一份这个数字货币100元进行第二次支付给jack。jack只需要向央行核实017对应的拥有者 发现不是Alice这笔交易就无法执行 从而避免了双花攻击。
但是这个方案也有一个严重的弊端 每一笔交易都必须去和央行核实 虽然正确性是能解决的。但是这是一个很中心化的方法 极为不便。
4.2去中心化的数字货币
采用去中心化的数字货币,我们首先就面临着两个问题。

  1. 谁来发现,货币什么时候该发现,发行多少?
  2. 怎么验证交易的有效性,怎么避免双花攻击?
    第一个问题的解决方法:
    货币的发行是根据比特币协议产生,由获得记账权
  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值