BTC-密码学原理
Crypto-Currency
Cryptographic hash function:
- collision resistance:【x≠y, H(x)=H(y)】,collision free:[没有方法高效的找出y使得已知x,找到y使得H(x)=H(y)]
- hiding:x —>H(x), H(x) -×->x
- puzzle friendly:0000000…XXX…XX,difficult to solve, but easy to verify
MD5已经找到哈希碰撞的方法
digital commitment
digital equivalent of a sealed envelope
例子:股市预测,预测某只股票 x 明天会涨停,为了防止预测会对第二天股市产生影响,所以在第二天股市结束前,需要对 x 进行保密封存。但是为了保证 x 在第二天公布时没有被更改,需要公布一个公开的凭证 H(x)。第二天股市结束后,通过公布的 x 加密后与 H(x)进行比对,判断预测是否篡改,x 正确后查看 x 这只股票是否涨停判断预测是否准确。但是会存在一个问题,股票的支数有限,通过暴力碰撞对所有的股票进行 H(y) = H(x),能够找到 y = x,提前猜出 x,继续被股民利用。所以一般会利用 H(x || nonce) 值进行公开
例子二:挖矿,寻找nonce(4 bytes),使得 x = 其他区块信息 + nonce,H(x) 的值满足一定条件(前面n未为0)H(block header) ≤ target,因为没有其他高效方法去计算的出nance,所以只能不停的使用不同nance去试,就产生了Proof of work
SHA-256:Secure Hash Algorithm
BTC 签名
BTC账户(public key,private key)
asymmetric encryption algorithm
encyption key
非对称秘钥:加密和解密使用的是同一个人的一对公钥/私钥,将公钥公开,需要发送消息的人使用公钥对信息进行加密,接收方只有使用私钥才可以解密获取信息
BTC中账户者需要转账,为了确保身份准确,转账时使用私钥对转账信息签名,然后发布,其他用户使用公钥对转账信息进行校验
a good source of randomness 防止多人生成同一对公私钥
BTC-数据结构
BTC 的数据结构包含
- hash pointers
- Merkle tree
hash pointers
hash 指针包含两个部分(地址hash+数据hash,即地址和地址内的数据)
区块链底层hash链表使用hash指针代替普通指针
Block chain is a linked list using hash pointers.
Merkle tree
全节点(block header + block body)
轻节点(block header)如:比特币钱包
Merkle proof:找到某个交易,从这个交易能够达到根节点
- Proof of membership
Proof of inclusion
复杂度:O(log(n)) - Proof of non-membership
复杂度:O(n)
Sorted Merkle tree 复杂度:O(log(n)) 比特币未使用(没有必要)
BTC-协议
double spending attack:双花攻击
中心化交易
full node/full validating node
light node
Consensus in BitCoin
distributed consensus 分布式共识
distributed hash table
FLP impossibility result
asynchronous system
faulty
CAP Theorem
Paxos:CP
membership hyperledger fabrac
Sybil attack
forking attack
新增区块并不会产生比特币,只是记录交易记录
唯一产生比特币的途径:Coinbase transation
block reward
起初,每产生一个区块,发布50个BTC。21万个区块以后,每产生一个区块,发布BTC数量减半,发布25个BTC
比特币设计的出块时间大概是10分钟,每减半大概需要210000*10/60/24/365≈4年
mining digital gold
miner
BTC-实现
transation-based ledger
UTXO:Unspent Transaction Output
total inputs = total outputs
transation fee
account-based ledger
下面是一个区块信息范例:
区块头源码:https://github.com/bitcoin/bitcoin/blob/master/src/primitives/block.h
nNonce为32位的无符号整形,最多有2^32个值,可能所有值都无法生成符合难度的hash
- 时间是非严格的,可以在一定范围内存在误差
- 可以调整merkle root值来计算符合hash的区块
CoinBase会产生创世区块币,通过修改某个tx,从而影响merkle root,生成新的hash值可能,这样就产生了2^96个hash值
概率分析:
Bernoulli trial:a randorm experiment with binary outcome
Bernoulli process:a sequence of independent Bernoulli trials
memeryless:无记忆概率(掷硬币),progress free
Poisson process
exponential distribute: 出块时间呈指数分布
geonetric series
比特币总量:21万50+21万25+21万12.5+… = 21万50*(1+1/2+1/4+…) = 2100万
BitCoin is secured by mining
confirmation
one confirmation -> two confirmation -> three confirmation…-> six confirmation 一个小时
irrevocable ledger
zero confirmation
selfish mining:
BTC-网络
The BitCoin Network
application layer:BitCoin Block chain
network layer: P2P Overlay Network
simple, robust, but not efficient
flooding
区块大小限制1M
best effort
BTC-挖矿难度
H(block header) ≤ target
SHA-256 2^256
difficulty = (difficulty_|_target)/target
51% attack
以太坊:ghost,orphan block(uncle reward)
201610/60/24=14天 调整一次target
target=targetactual time/expected time
actual time:time spend mining the last 2016 blocks
挖矿机器
CPU(通用计算) -> GPU(通用并行计算) -> ASIC(挖矿专用):Application Specific Integrated Circuit(只适合某一种币)
mining puzzle,merge mining
Alternative mining puzzle:ASIC resistance
pool manager -> miner
share, almost valid block 降低挖矿难度
矿池在各个国家的比例
on demand computing(mining)
BTC-比特币脚本
Proof of Burn 验证过程:当前交易的输入脚本和前一个交易的币的来源的输出脚本拼接在一起进行校验 交易的output不需要验证
AltCoin AlternativeCoin
digital commitment
Coinbase
发布交易不需要记账权,创建区块需要记账权
BTC-分叉
-
state fork
forking attack
deliberate fork -
protocd fork
hard fork
:block size limit(1M -> 4M) 1000,000/250=4000个交易 4000/60/10=7 tx/sec
新节点承认旧节点,旧节点不承认新节点
bch和btc因为区块扩容而分叉
ETC -> ETHsoft fork
:如:P2SH, Pay to Script Hash, redeem Script。第一步证明脚本没有改动,第二步证明满足脚本执行的条件coinbase前8个字节作为extra nonce+nonce = 2^((4+8)*8) = 2^96
原来在链上的合法交易,软分叉后可能变为不合法
新节点不承认旧节点,旧节点承认新节点
软分叉迫使其他旧版本必须升级
soft fork | hard fork |
---|---|
有超过一半节点升级 | 所有节点升级 |
BTC-问答
Q1:转账时,被转账人不在线怎么办? A1:不需要被转账者在线
Q2:转账时,可能存在转给一个不存在的收款人吗? A2:存在
Q3:账户私钥丢失怎么办? A3:没有办法,门头沟事件(Mt.Gox)
Q4:账户私钥泄露怎么办? A4:将资产转移到其他安全账户上
Q5:转账时,写错地址怎么办? A5:没有办法
Q6:挖矿时,发布一个nonce,别人把收款地址改成自己的可以吗? A6:不可以,区块打包多条交易记录,修改coinbase tx内容发生变化,导致merkel tree改变,根hash发生了变化后,原来的nonce值无法对应(根hash和nonce都存在block header里)
Q5:交易时,交易费转给谁? A5:不需要提前知道,发布区块时转给发布者,交易费 = total inputs - total outputs
BTC-匿名性
Bitcoin and anonymity
privacy
pseudonymity
unnamed lake
Silk road: eBay for illegal drugs, TOR
Silk road 2
hide your identity from whom?
如何提高个人匿名性? coin mixing
- 零知识证明:一方(证明者)向另一方(验证者)证明一个陈述是正确的,而无需透露除陈述是正确的外的任何信息。如:签名
- 同态隐藏:
如果x, y不同,那么它们的加密函数值E(x) 和 E(y)也不相同
给定 E(x) 的值,很难反推出x的值
给定E(x) 和 E(y)的值,我们可以很容易地计算出某些关于x, y的加密函数值- 同态加法:通过E(x) 和 E(y)计算出E(x + y)的值
- 同态乘法: 通过E(x) 和 E(y)计算出E(xy)的值
- 拓展到多项式
例子:Alice想要向Bob证明她知道一组数x和y使得x+y=7,同时不让Bob知道x和y的具体数值。
Alice把E(x) 和 E(y)的数值发给Bob,Bob通过收到的E(x) 和 E(y)计算出E(x + y) 的值(利用了性质3),Bob同时计算E(7)的值,如果E(x + y) = E(7),那么验证通过,否则验证失败
- 盲签方法
- 用户A提供SerialNum,银行在不知道SerialNum的情况下返回签名Token,减少A的存款
- 用户A把SerialNum和Token交给B完成交易
- 用户B拿SerialNum和Token给银行验证,银行验证通过,增加B的存款
- 银行无法把A和B联系起来
- 中心化
- 零币和零钞
- 零币和零钞在协议层就融合了匿名化处理,其匿名属性来自密码学保证
- 零币(zerocoin)系统中存在基础币和零币,通过基础币和零币的来回转换,消除旧地址和新地址的关联性,其原理类似于混币服务
- 零钞(zerocash)系统使用zk-SHARKs协议,不依赖一种基础币,区块链中只记录交易的存在性和矿工用来验证系统正常运行所需要关键属性的证明。区块链上既不显示交易地址也不显示交易金额,所有交易通过零知识验证的方式进行
BTC-思考
- hash pointer:hashPrevBlock没有实际指针,存在数据库中levelDB(key,value)
- 区块恋:将秘钥分成两部分分别保管,安全性降低了 2^256 / 2^128 = 2^128 倍
- 分布式共识:为什么比特币系统能够绕过分布式共识中的那些不可能结论?比特币的共识并非最终共识,存在分支
- 比特币的稀缺性
- 量子计算:距离实用还很遥远,比特币的地址取的是公钥的hash