区块链与比特币基础知识——北京大学肖臻老师《区块链技术与应用》公开课笔记

区块链技术与应用

北京大学肖臻老师《区块链技术与应用》公开课的一些笔记

1 比特币中的密码学原理

crypto-currency 加密货币

1 密码学中用到的哈希函数的几个特性:

1 collision resistance 抗碰撞性

​ 哈希碰撞的就是不同的输入有相同的输出而导致的冲突

​ 意思是没有什么高效的方法去人为的制造哈希碰撞

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

​ 从哈希值是不能反推得到输入的(输入空间足够大的情况下)

1和2的性质可以用来做digital commitment,也叫digital equivalent of a sealed envelope

在网络中,公开的是由输入得到的哈希值,由于上面两个特性,所以无法反推得到输入值,就可以用输入值来进行验证

因为在实际操作中输入的空间不一定是无限大,所以需要给输入值X拼接一个随机数,然后整体进行取Hash

3 puzzle friendly 哈希值的计算是不可预测的,由输入看不出来输出值

​ 想要得到理想范围的Hash值,需要一个一个去试

所谓挖矿其实就是不断的去试验输入,来得到比给定target要小的Hash值,这需要大量的工作量,但是验证起来是很容易的,只需要求一次Hash值

2 签名

比特币的开户;只需要在本地创立一个public key和Private key对就可以(公钥和私钥)

公私钥的概念来自非对称的加密体系(asymmetric encryption algorithm)加密和解密用的分别是接收者的公钥和私钥,公钥是对所有人可见的

因为对称加密体系中公钥的分配与传输并不安全

发布时用到的时个人的私钥作为签名,在别人验证时使用的公钥进行验证

2 比特币中的数据结构

**1 哈希指针:**哈希指针除了保存地址之外,还要保存哈希值

区块链与普通链表的区别之一就是用哈希指针代替了普通的指针

区块a指向区块b 则区块a中的哈希值是对区块b的整体去哈希得到的

这也就会导致无论在区块链的哪个节点做了改动,都会导致其祖上节点Hash值的变化,这样就很容易检测到哪里做了改动

哈希指针无法应用与有环的链

2 Merkle tree

与普通的binary tree的区别就是用Hash指针代替了普通指针

每个叶子节点(data block)都是一个交易,他的父节点保存了他的Hash值

根节点的Hash值并没保存具体的交易 boack header你保存了根节点的Hash值

一个作用就是可以提供Merkle proof:就是从具体交易内容的叶子节点直到根节点,在这过程中,只要每一个Hash值都能对应上,就说明是正确的

3 协议

double spending attack 双花攻击 普通的数字货币可以无限复制 如果交易需要通过央行,那么则还是中心化的模式,区块链需要的是去中心化

如何以去中心化的方式来防范double spending attack

每一次交易既要写明去处,也要写明币的来源 这样在交易时可以验证

每一次转账信息包括 本人的公钥和目标转账人的公钥,这样目标人可以用自己的私钥解密。也可以通过公钥的Hash值去验证这个币的来源

比特币包括 Block header和Block body

Block header包括的是比特币的协议版本 version、指向前一个区块的指针 hash of previous block header 整个Merkle Tree的根哈希值 挖矿的目标预值 target 还有随机数nonce

全节点(full node):保存区块链的所有信息

轻节点(light node):只保存block header的信息

分布式共识(distributed consensus): Paxos协议能够保证一致性

比特币中的共识协议:Consensus in BitCoin

最长合法链:现有区块链接受的区块应满足最长合法链,不能插入到中间开出分支(分叉攻击)

当然区块链是可能出现分叉的,两个节点同事都捕获到了随机数,则都会其对进行记录

当然在之后的竞争中会有胜出者称为主链,而分叉会被丢弃

block reward:铸币交易是比特币中发行新币的唯一途径,而拿到记账权的节点可以有特殊权利进行铸币交易,刚开始每一次可以产生50btc,每过21w个就会减半(大概需要每四年减少一次)

4 比特币系统的实现

比特币采用的是基于账本的交易模式 记录了铸币交易转账交易,但没有显示的记录每个账户有多少钱

比特币系统的全节点要维护一个叫UTSO(Unspent Transaction Output)的数据结构(没花出去的钱,同一个交易可能有多个输出。有的保存在结构中,有的没有)

total input == total output 有时候不是完全相等,可能有一点给了记账的区块作为奖励

激励机制(交易费 transaction fee):

基于账户的模式(以太坊)

挖矿

每一个挖矿的过程都是在不断的尝试nonce ,每一个尝试的过程都能看作一个Bernoulli trial

Bernoulli trial(伯努利试验):随机试验只有两种结果 0或者1

Bernoulli process:a sequence of independent binary outcome 无记忆性(前面的实验对后面的结果没有影响)在任何时候挖到矿的概率都是一样的

因为出币的数量每21w(大约需要4年)就会减少一半,总数构成了一个几何序列21w * 50(1 + 1/2 + 1/4…) 大约2100w

风险:只能从概率上保证交易的安全性。需要六个确认来辨别一个节点为诚实节点

selfish mining 挖到先不发布,而是先积累,等到时候直接发布一条长链以此来破坏主链

当然这样需要极强的算力,且失败的风险极大

5 比特币的网络

应用层(application layer): 遵循BitCoin Block chain

网络层(network layer):遵循 P2P Overlay Network

所有节点都是平等的,没有超级节点

设计原则:simple robust but not effictive

消息传播在节点中采用flooding的方式

比特币要求区块的大小不超过1M

6 挖矿难度

对块头节点进行Hash计算,得到的值与t目标预值target进行比较(小于等于),target越小,目标难度越大。调整挖矿难度就是调整目标空间在整个输出空间中所占的比例

比特币使用的哈希算法是SHA-256,所以整个输出空间是2的256次方

挖矿难度与target成反比

总结

全节点

  • 一直在线
  • 在本地硬盘上维护完整的区块链信息
  • 在内存里维护UTXO集合,以便快速检验交易的正确性
  • 监听比特币网络上的交易信息,验证每个交易的合法性
  • 决定哪些交易会被打包到区块里
  • 监听别的矿工挖出来的区块,验证其合法性
  • 挖矿

轻节点

  • 不是一直在线
  • 不用保存整个区块链,只要保存每个区块的块头(差了大约1000倍)
  • 不用保存全部交易,只保存和自己有关的交易
  • 无法检验发多数交易的合法性,只能检验与自己相关的那些交易的合法性
  • 无法检测网上发布的区块的正确性
  • 可以验证挖矿的难度
  • 只能检测哪个是最长链,不知道哪个是最长合法链

7 分叉(分叉攻击)

state fork:(两个节点同时发布区块,对比特币当前的状态有意见而产生的分叉)

​ forking attack:分叉攻击

​ deliberate attack:认为故意造成的

protocd forkl(比特币协议不同造成的分叉)

​ hard fork:

​ block size有一定的限制 limit 1M

当大部分节点更新块大小限制,而少部分未更新时,会导致小块会把大块视为非法链,出现硬分叉,只要旧节点不更新,分叉就不会消失

必须所有的节点都更新了,分叉才会消失,否则会永久存在

​ soft fork:(软分叉的短链可能会消失,不会产生永久性的分叉)

只要拥有半数以上的节点更新了软件,分叉就会消失

  • 只能检测哪个是最长链,不知道哪个是最长合法链

8 匿名性

并未能实现真正的匿名,对外交互的时候可能暴露自己的信息

应用层

网络层的加密是很重要的

零知识证明:

指一方(证明者)向另一方(验证者)证明一个陈述时正确的,而无需透露除该陈述是正确的外的任何信息

同态隐藏:

1 如果下x,y不同,那么他们加密函数值E(x)、E(y)也不相同(不会出现碰撞)

2 给定加密函数值,很难反推得到x的值

3 给定E(x)、E(y)的值,可以很容易的计算得到关于x,y的加密函数值

同态加法:通过E(x)、E(y)计算得到E(x+y)的值

同态乘法:通过E(x)、E(y)计算得到E(xy)的值

扩展到多项式

零币和零钞:主要是为了实现匿名性

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>