数据形式
- Cryptographic Hash Functions
- 输入任意长数据,输出固定长hash,且计算容易
- 安全性:
- 防碰撞Collision Resistance:
很难找到一堆x,y满足 $x \neq y$ and $H(x)=H(y)$ - Second pre-image resistance(more constrained than collision resistance)
对于x,很难找到一个y,满足:$x \neq y$ and $H(x) = H(y)$ - Pre-image resistance
对于任意h,在hash函数的输出中,很难找到对应的x,即 $H(x)=h$ - Hiding
当从高低熵概率分布中选择一个秘密值r,再有 $H(r||x)$ 的结果,我们很难找到对应的x,这样的情况下我们可以说hash函数H是hiding
就是说,对密码加hash H和salt r,这样即使有人黑了数据库知道了加密后的密码,也无法倒推出我们的原来的密码 - Puzzle-friendly
对于一个输出n个字节h值的哈希函数H,如果选择一个k,那么他应该很难在$2^n$时间内找到一个x使得$H(k||x)=h$
就是说最佳方法是brute force,使得挖矿变得可能
A solution to the puzzle is a value x, s.t. $H(id||x) \in Y$
- 防碰撞Collision Resistance:
- Markle Tree
- 比如有四组Transaction,Hash每个Transcation得到4个hash值,两两hash得到两个hash值,最后再hash一次,得到Merkle Root。
- 如果有奇数的,则自己和自己组hash
- 如果一个Transcation变动,那么Merkle root会变
- 可以通过O(log(n))时间找到变动的地方
- Simple Payment Verification目的是用户不需要下载所有交易部分,只需要有header就可以
- 步骤如下,假设有Transcation T_k要验证
1) H_k = Hash(T_k)
2) 节点从区块链网络上获取最长链的Header
3) 从区块链获取带验证支付对应的Merkle tree哈希认证路径
4) 从认证路径,与H_k一起重新计算Hash
5) 如果最后结果与Root相同则支付有效。
- 比如有四组Transaction,Hash每个Transcation得到4个hash值,两两hash得到两个hash值,最后再hash一次,得到Merkle Root。

要验证HK,则需要知道HL、HIJ、HMNOP 和 HABCDEFGH
- Elliptic Curve Signature Algorithm(ECDSA)
- 用来对transaction签名
- 验证Transaction的签名
地址
- 唯一身份
- 公钥的Hash
- 0 < Balance < 21 Million Bitcoin
- 1 Satoshi == $10^{-8}$ Bitcoin
- 地址的第一位表示需要几个秘钥来
交易Transaction
当Alice将她拥有的一个比特币发送0.25个比特币给Bob时,0.25个BTC将会有一个新的地址,而Alice剩下的0.75个BTC的地址也会改变。
$\sum inputs \geq \sum outputs$ 大于等于是因为中间会收取一定的费用给矿工。
比特币脚本Scripts
- Stack based programming language,即根据opcode,对stack顶的数据进行计算,这样增快了速度
- 如果验证为真,则交易是正确的
- 用许多操作码来减少时间,防止DoS攻击
Transcation的种类
- P2PKH Pay to Public Key Hash如上图所示
- P2SH Pay to Script Hash
- Multisignature(m-n)
Block
由Header和List of transactions组成
Header以下这些组成
- 版本信息
- 上一个block的header的hash,
- merkle root
- Unix时间戳
- Target(代表挖矿的难度)
- Nonce
挖矿
如何挖矿
- 加入网络,监听交易,验证所有进来的交易tx,并收集成List of transcation
- 监听新的block,区块连会每隔多少时间自动生成一个新的区块
其中包含前一个区块头的hash,交易的merkle root,和一个target
这个target控制挖矿难度,每隔固定周期会调整target是他不会太难或太易 - 建立Block模版,即创建header
- 找到一个Nonce,使其满足条件
Hash( Hash(prev_block_header) | txs | N ) < target,只能brute force - 告诉其他的矿工 gossip P2P
- 接受奖励
因为现在很难靠自己一个人算出结果,所以大家一般都加入一个矿池,Pool Operator按每个人的算力贡献分配所得的。
Mining Difficulty in Pooling
Bitcoin Difficulty: Hash(Hash(B3) | txs | N) < Target = 0x000**
Pool Difficulty: Hash(Hash(B3) | txs | N) < target = 0x00**
把任务分配给每个矿工,每个矿工的t << T,难度远小于正常的T
Merge Mining
如果两种区块链都用了相同的PoW,那么弱的那方(因为参加挖矿的人数不多,所以target比较简单)很容易被大区块链中的矿工池所控制。
比如Namecoin是对Bitcoin添加了DNS的一个链,其本质算法与Bitcoin相同。那么Bitcoin的矿工计算得到一个随机数,如果随机数满足Namecoin的难度值(Namecoin的难度值一般情况肯定比bitcoin小,或者相等),Namecoin挖矿成功,打包交易成区块,然后上链;
如果随机数同时满足Bitcoin的难度值,bitcoin挖矿成功,打包交易上链(注意是bitcoin的区块链,bitcoin与namecoin拥有自己独立的区块链)。
好处:可以利用算力
缺点:
- 方便了黑客
- 弱方的链可能不会被validate
矿池的潜在危害
- 可以决定那些transcation添加入blockchain
- 可以影响transcation fee或者gas price
- 可以相互协作达到51%攻击
- 影响PoS的投票机制
所以要去中心化矿池
Bitcoin的方法:P2Pool,重新建一个share链,每个人算shared block,当算到正确解时,发钱。
Efficiency:A share is set to be found every 30 seconds. The more miners, the higher payout variance
Security: Many orphan shares (due to short block time) Small P2Pools have weak security. Need to incentivize block submission and validation
Ethereum的方法:SmartPool
Fork
Hard Fork
之前所有的不符合新标准的block都会合规,符合的变不合规。增加了functionality
所有的节点都需要升级到最新版本
Soft
只有之前合规的block变成不合规,减少了functionality
以前的block仍可以用。
比如进阶到了P2SH
Segregated Witness(Segwit)
把签名和脚本放到witness block中,链中只保存sender,reciver和value
好处:
- 可以扩容到4mb而不需要hard fork,
- 同时也解决了malleable的问题,
即Bob可以改变上一个Alice与Bob的未提交的交易Tx,即改变其 signature,使得Tx不成立,那么Bob和Charlie之间的交易Tx+1,根据UTXO就会不成立,如果Charlie已经给Bob物品,那么就会有损失。
缺点:
- Signatures required to validate a block,
- Complex
用户分类
- Full Node保存了所有的记录的节点
- Miner矿工
- Light Node用户
- 因为不全,所以使用SPV
- 小,可以PoW,可以跟全连。