bitcoin 笔记
Bitcoin
transaction-based ledger
bitcon 是一个基于交易的账本
bitcoin 会维护一个 UTXO 数据结构
UTXO:upspent trasction output,用来防止 double spending
每笔交易都要指明,从哪几个交易记录到哪几个地址,
备注: 以太坊是 account-based ledger
比特币挖矿奖励减半
比特币每 21万个区块会使挖矿奖励减半,比特币通过控制挖矿难度来控制平均每 10 分钟出一个区块,而 21万个区块差不多等于 4年。
21万 * 10分钟 / (60分钟 * 24小时 * 365天) = 约4年
Bernoulli trial
比特币挖矿的每一次尝试 nonce 都是一次 Bernoulli trial
Bernoulli trial: a random experiment with binary outcome
Bernoulli process: a sequence of independent Bernoulli trials
memoryless: 前面的结果不会影响后面的概
比特币是 memoryless and progress free 的: 这提供了挖矿公平性的保证,每一次尝试都是一样的概率。
比特币网络
The BitCoin Network
appliction layer: BitCoin Block Chain
network layer: P2P Overlay Network
simple robust but not efficient
BTC 挖矿难度
挖矿目标,使得 H(block header) <= target,其中 Header 中的 nonce 可以修改,使得结果小于 target(target 是前缀一连串 0 的二进制数)
bitcoin 挖矿的本质就是尝试出 nonce 使得结果小于 target,从而获得记账权。
SHA-256 即 Secure hash Algorithm 2^256,产出 256 位二进制数。
出块时间太短会有什么问题?
同一时间会有很多分叉,算力会被分散,有恶意的算力可以集中扩展一个分叉。
好人的算力被分散了,这样坏人就不需要 51%的算力进行攻击了。
以太坊将出块时间降低到了15s,这样的话就需要新的共识机制,ghost,(扩展,orphan node, uncle reward)
调整方式?
1 | target = target * (actural time / expected time) |
其中 actual time = time spent mining the last 2016 blocks
expected time = 2016 * 10 * 60 (秒)
1 | next_dificulty = previous_diffulty * (2 weeks / time to mine last 2016 blocks) |
target 和 expect_difficulty 成反比
每次调整最大4倍,最小1/4
如何让大家都进行调整?
在 block header 中有一个字段 nBits 4个字节,nBits 是 target 的压缩版本(target 有 256位)
如果有坏矿工不进行调整,那么他产生的区块将不被其他矿工承认。
比特币如何保证安全性?
- 密码学上的保证:没有私钥就没办法伪造签名,并且矿工只认有正确签名的交易
- 共识机制:工作量证明
BTC 挖矿
从速度上来说:
CPU -> GPU -> ASIC 即 Appliction Specific Integrated Circuit
mining puzzle -> Alternative mining puzzle (目的: ASIC resistance)
有些区块链会使用可变的 mining puzzle,这样可以有效抑制 ASIC 的发展。
矿池
矿池:pool manager has many miner,pool manager 也就是全节点,有很多职责,而 miner 只负责计算 hash。
矿池如何分配奖励:使用 almost valid block,矿工只需要挖到矿池规定的具有一定数量前导 0 的 nonce,就可以得到一个 share,最终的奖励根据 share 分配。
矿池的弊病:让 51% Attack 更容易
51%算力的矿池可以干的坏事:
- 分叉攻击
- boycott:封锁账户
BTC 脚本
- P2PK: pay to public key
- P2PKH: pay to public hash
- P2RSH: pay to redeem script hash