比特币的密码学原理
哈希
比特币使用SHA-256作为它的哈希函数
哈希加密的性质:collision resistance、hiding、puzzle friendly.
签名
比特币账户使用非对称加密的公私钥对,这保证了交易是“安全的”即不会在网络传输中被篡改。
私钥用来签名
公钥用来验证签名
此操作生成公私钥时需要一个好的随机源,即产生的公私钥对与过去账户难产生哈希碰撞
比特币中区块采用的的数据结构
哈希指针:哈希值代替指针
Merkle Tree:二叉树,最下层储存每笔交易信息,往上层层哈希,这保证了交易的不可篡改性。
对于轻节点来说,验证一个merkle proof 是θ(log(n))。
对于轻节点来说,验证一个proof of non-membership是θ(n)。
交易信息
比特币采用UTXO模型,即每笔交易需要说明钱的来源,并且in=out(零钱结给自己)。发出的交易会被放入UTXO集合中等待矿工打包组成新区块。
这种结构可以阻止双花攻击(double spending)
分布式共识与挖矿
为保证分布式数据库的一致性,比特币使用POW共识机制。
矿工会打包一些交易进新区块并不断尝试Nounce值(指数分布)即使得区块哈希值小于难度值Bit,算出来的矿工获得记账权,发布区块由他人认证交易的合法性与Nounce值的正确性,通过即可获得交易手续费和出块奖励。我们假设大部分节点是“诚实”的,那么长期来看每笔合法的交易都会被写入区块。
但由于51%算力可能存在分叉攻击仍有可能性。
区块结构
比特币网络、脚本语言与分叉
网络:p2p网络,节点分轻节点(只有区块头信息)与全节点(全区块信息与UTXO集合)两种,轻节点无法独立验证交易的合法性与交易的正确性,需要向全节点请求Merkel proof。
脚本语言:一种极为简单的脚本语言,只使用栈空间。
软分叉:旧节点认可新节点,反之不然。会常常分叉但不会拉长,往往最终会变回一条链。
硬分叉:新节点认可旧节点,反之不然,或双方互不认可。除非旧节点全部升级否则会一直分叉。
匿名性、零知识证明与分布式共识的思考
1.匿名性:比特币的匿名性并不是完全的。与真实世界交易交互,公钥地址追踪是容易暴露比特币钱包与真人的对应关系。所以一个钱包最好只用一次。使用洋葱路由掩盖ip地址。
2.零知识证明挖坑
3.分布式共识的思考暂时补不了坑,希望这学期能学完分布式系统把坑填上
AMA and 明日补坑 and 下次更以太坊