根据B站上北大教授肖老师的教学视频记录的
视频链接:https://www.bilibili.com/video/BV1Vt411X7JF
密码学基础
区块链中密码学的核心概念:hash和签名
hash有三个重要的特性
- collision resistance
- hiding
- puzzle friendly
分别的解释:
特征 | 解释 |
---|---|
collision resistance(碰撞抵制) | 很难找到 x , y x,y x,y,使得 h ( x ) = h ( y ) h(x)=h(y) h(x)=h(y) |
hiding | x → h ( x ) x\rightarrow h(x) x→h(x)容易,但是 h ( x ) → x h(x)\rightarrow x h(x)→x难 |
puzzle friendly | 其分布难以控制 |
比如sealed envelope,A方发布消息,B方接受消息。hiding可以保证B方很难破解消息,而碰撞抵制可以防止A方进行篡改。这个签名过的消息则保存在可信的第三方。
目前广泛使用的是SHA-256(secure hash algorithm)
在密码学中,分为对称加密与非对称加密。非对称加密中,包含有公钥与私钥 ( p u b l i c k e y , p r i v a t e k e y ) (public key, private key) (publickey,privatekey)。pk加密,sk解密。需要注意的是用的是同一人的pk和sk。而签名正好相反,sk签名,pk验证。
区块链中,发送消息,通常是先hash,然后再签名。
数据结构
比特币中的2个重要的数据结构
- 区块链
- merkle tree
区块链
重要概念:hash指针,除了包含地址,还包含结构体的hash值(为的是防篡改)
区块链是使用了hash指针的链表(linked list)
某个区块里面的hash指针的取值为,前面整个区块的内容和它里面的指针一起hash得到的结果。
最后一个保存在系统中的hash指针值可以检测出前面任意的区块是否被篡改,叫做tamper-evident log。牵一发动全身,多米诺骨牌的效果。
merkle tree
最底层为data block,其它的节点都是hash指针,对根节点节点取的hash值为root hash。与区块链类似,root hash可以检测对其它任意内容的篡改,而且效率更高,因为其类似于二叉树的结构。
每个区块所包含的交易会组织成merkle tree,最底下的数据块都是比特币的交易块。
每个区块分为块头和块身,block header和block body。block header只记录root hash,而具体的交易记录在block body中。
merkle proof,是一连串的merkle路径,其可以证明merkle tree中包含了某个交易。(复杂度logn)
sorted merkle tree(对交易块取hash值,并排序),用于不存在证明(这样的复杂度还是logn)。比特币中因为不需要不存在证明,所以不是用排序merkle tree
协议
比特币的共识机制
普通的数字货币的问题
- 双花攻击(double spending attack)
- 中心化(每一次交易都要经过央行)
比特币
- 谁发行(挖矿)
- 验证有效性(防范双花攻击),所有用户共同维护一个数据库,即区块链
交易中,需要发款人的签名和收款人的地址(相当于银行账号),地址是通过收款人的公钥推算出来的(hash+转换);输入部分说明币的来源,以及A的pk,输出部分给出收款人pk的hash 。
每个区块分为块头和块身
概念 | 组成 | |
---|---|---|
block header | version, hash of previous block header, merkle root hash, target, nonce | H ( b l o c k h e a d e r ) < = t a r g e t H(block header) <= target H(blockheader)<=target,hash的值是针对block header的 |
block body | transaction list |
节点分为:full node和light node;系统中大多数的节点是轻节点
账本的内容要取得分布式共识(distribution consensus)
比特币中的共识协议:
有些节点有恶意的
membership,投票权的问题
比特币系统中创建账户特别容易,只需要生成一对公私钥。
sybil attack(女巫攻击),即创建很多个 账户,一直投票
比特币系统中,不是根据账户数,而是根据计算力来投票。
找到nonce,4个bytes,该节点就可以获取到记账权。
最长合法链的概念(longest valid chain)
forKing attack,通过往中间位置插入一个区块,来回滚已经发生过的交易。
正常的也会出现分叉链,比如同时有2个节点(矿工)获取到记账权,并写入。
orphan block被舍弃掉的区块
为什么要竞争记账权,因为会有奖励,block reward,每过21万个区块减半。
50->25->12.5
铸币交易,coinbase transaction,发行比特币的唯一方式,不用指明来源。
解puzzle,来获得记账权,没有捷径(puzzle friendly),只能一个nonce一个nonce地计算。
争夺记账权的过程称为挖矿(mining)
每一个区块都是被挖出来的。
实现
transaction-based ledger 基于交易的账本(隐私保护好)
需要说明币的来源和去处,没有账户的概念
UTXO: unspent transaction output
每个交易有多个输入和多个输出
total inputs = total outputs
比特币系统设计的第二个激励机制:交易费(第一个激励,初块奖励,21万减半),要保证挖矿的难度,确保10分钟挖出一个。
21w * 10 / (60 *24 * 365) ~~ 4年,即每四年减半
你把你的交易打包在我的区块里,我会给你一定的交易费
account-based ledger 基于账户的账本
比如以太坊使用的就是这种模式
计算hash值都只算block header
具体求解nonce的时候,会受tx的影响,实际上2层遍历,对一层遍历merkle tree里面的tx,第二个是nonce。
挖矿:
Bernoulli trial: a random experiment with binary outcome
Bernoulli: a sequence of independent Bernoulli trials
memoryless(多次实验不会相互影响)
出块时间服从指数分布;10分钟,属于系统的平均出块时间;将来还要挖多长时间和过去挖了多久没有关系,这样保证了公平性
总共的比特币总量为2100万,总量守恒,区块链无限长。
21w * 50 *(1+0.5+0.25+…+…)
Bitcoin is secured by mining.
多等几个确认(第六次确认),被篡改的概率会呈指数级下降
confirmation
irrevocable ledger
zero confirmation(交易发生了,但还没有往区块链里面写 )
self mining(挖好了先藏着,然后一下全部发出去,前提是算力足够强)
比特币网络、挖矿难度
设计原则:简单 鲁棒 而不高效
比特币中所有的节点都是对等的
应用层:bitcoin blockchain
网络层:P2P Overlay network
每个区块的最大限制为1M
挖矿难度
H ( b l o c k h e a d e r ) < = t a r g e t H(block header) <= target H(blockheader)<=target
target越小,越难
Hash使用的是SHA-256
2 256 2^{256} 2256
如果挖矿的时间设置得过短,可能会出现很多分叉
网络延迟过大,分叉情形更加容易出现
51% attack危害很大
好人的算力被分散了,恶意攻击者可以一直加长一个链
以太坊出块时间为15s,也需要保持稳定
2016*10/60/24=14天
target = target * (actual time / expected time)
actual time = time spent mining the last 2016 blocks
由于nbits的存在,恶意节点如果故意不调,会不被接受
Hash Rate,算力
挖矿难度与算力增长都大致呈指数级增长
挖矿
全节点与轻节点
是否一致在线
是否保存整个区块链
比特币网络中,大多数都是轻节点
比特币安全:1.密码学机制2.共识机制
挖矿设备:
CPU->GPU挖矿,效率提高(大规模的并行系统)->ASIC
现在流行用ASIC(专门用来挖矿的芯片)挖矿
一个芯片只能为一种货币挖矿
购买矿机要提前预定
矿池(矿主和矿工,矿工只负责挖矿,不知道别的,矿主负责组装一个区块,让矿工去试nonce,矿工不能自己私自发布区块)
矿池之间存在竞争关系,所有可以派一些搞乱的矿工去别的矿池,挖到后故意丢弃。
根据矿工的share计算工作量
矿池带来的危害,使得51%攻击容易了
分叉攻击、boycott攻击
回答(提问,巩固知识)
- 转账时,不要求收款人在线。该交易只需要记录就可以。
- 创建账户时,其它节点都不知道,第一次转账后才会通知其它节点。
- 私钥丢失了,由于去中心化,没办法找回密码,账户里面的钱就没有了,永远取不出来了;如果私钥泄露了,可以把钱转到另外的安全账户上。公私钥一旦生成就不能更改了,所以只能重新创建一个账号。
- 如果转钱时收款人地址写错了,怎么办?没有办法取消已经发布的交易。地址是由公钥的hash得到的。如果是非法的地址(即不存在的公钥),那钱就再也取不出来了。
- 不存在偷答案,每个矿工挖到的nonce都是和自己的收款地址绑定在一起的。
- 事先不需要知道哪个矿工获得交易费,一个交易会有很多个输入与输出,当total inputs大于total outputs时,差值作为交易费。哪个矿工挖到了,就可以计算出交易费。
- 每天产生的区块数目差不多的,交易数目的变化主要取决于每个区块中包含的交易数目。
bitcoin and anonymity
与隐私保护有关
pseudonymity(一种假的匿名)
比特币的匿名性比真实货币差,比电子银行好。
影响比特币匿名性的:
输入地址有多个,很有可能是同一个人的。这些地址会被关联起来。
资金的转入转出,盯住交易链
支持比特币支付
总结:比特币的匿名性并不好
多路径转发(TOR,洋葱路由)
coin mixing,
匿名性不好的本质:公开的,不可篡改的
零知识证明:
同态隐藏
x ≠ y , E ( x ) ≠ E ( y ) x\neq y, E(x)\neq E(y) x=y,E(x)=E(y)
E ( x ) → x E(x)\rightarrow x E(x)→x很难
给定E(x)和E(y),很容易计算出某些关于x,y的加密函数值
同态加法: E ( x ) 、 E ( y ) → E ( x + y ) E(x)、E(y) \rightarrow E(x+y) E(x)、E(y)→E(x+y)
同态乘法: E ( x ) 、 E ( y ) → E ( x y ) E(x)、E(y) \rightarrow E(xy) E(x)、E(y)→E(xy)
盲签
具有更好的匿名性:零币和零钞(匿名性来源于密码学保证,它们都不主流)
思考:
hash指针:实际中只有hash,没有指针
(key, value)(区块的hash,区块的内容)levelDB
hash指针的性质保证了区块的不可篡改性
区块恋👫,把私钥划分为多个,目前使用的是256位私钥
不安全:破解难度降低很多
多个人的账户,建议使用多重签名。 MULTISIG(每个私钥独立产生)
UTXO里面的死钱很麻烦
分布式共识:理论上不可能,现实中为什么可以取得共识(理论和现实的差距)
比特币的稀缺性:矿工为什么要挖矿,为了获得收益
总量定死的货币不适合做货币,应当要有通货膨胀的能力
类似于房地产,如果房价一直疯长,那么有钱的人越来越有钱,没钱的人越来越买不起房
量子计算:对密码学造成巨大的打击;量子计算首先会对电子货币造成威胁,而不是比特币;取hash的时候,其实信息已经有一定的丢失了,所以不用害怕量子。SHA-256不可逆。
公钥的hash作为地址
比特币是区块链1.0;以太坊是区块链2.0(memory hard)