我的博客

比特币协议解读

目录
  1. 哈希
  2. 默克尔树(Merkle Trees)
  3. 签名算法
  4. 交易验证
  5. 地址
  6. 数据结构
    1. 消息
    2. 变长整数
    3. 变长字符串
    4. 网络地址
    5. Inventory Vectors
    6. 区块头
    7. Differential encoding
    8. PrefilledTransaction
    9. HeaderAndShortIDs
    10. BlockTransactionsRequest
    11. BlockTransactions
    12. Short transaction ID
  7. 信息类型
    1. version
    2. verack
    3. addr
    4. inv
    5. getdata
    6. notfound
    7. getblocks
    8. getheaders
    9. tx
    10. block
    11. headers
    12. getaddr
    13. mempool
    14. checkorder
    15. submitorder
    16. reply
    17. ping
    18. pong
    19. reject
    20. filterload, filteradd, filterclear, merkleblock
    21. alert
    22. sendheaders
    23. feefilter
    24. sendcmpct
    25. cmpctblock
    26. getblocktxn
    27. blocktxn
  8. 协议流程

参考资料:https://en.bitcoin.it/wiki/Protocol_documentation

哈希

比特币系统中用到的两种哈希函数

  1. SHA-256
  2. RIPEMD-160

默克尔树(Merkle Trees)

graph TD
    node1["d1=hash(a)"] --> dataa((a))
    node2["d2=hash(b)"] --> datab((b))
    node3["d3=hash(c)"] --> datac((c))
    node4["d4=hash(c)"] --> datac((c))
    node5["d5=hash(d1+d2)"] --> node1
    node5 --> node2
    node6["d6=hash(d3+d4)"] --> node3
    node6 --> node4
    root["树根 d7=hash(d5+d6)"] --> node5
    root --> node6

图中圆形的 a,b,c 是数据(就是比特币系统中的交易),矩形节点 d1 到 d7 是默克尔树,其中 d7 是树根。默克尔树是完全二叉树,所以他的叶子节点数是 2 的 n 次幂,如图中的情况,数据的个数不是 2 的 n 次幂,那么后面的叶子节点的值都是最后一个数据的哈希。

在比特币系统中,交易就是最下面的数据, hash 对应的是两次 sha256。

签名算法

比特币使用 椭圆曲线 数字签名算法 (ECDSA) 给交易签名。

交易验证

  1. input 合法性
    1. 指向一个尚未花费的 output
    2. 提供了它指向的 output 的 script 中所要求的结果
  2. coinbase 交易合法性

地址

比特币地址是一个 ECDSA 公钥的哈希

数据结构

消息

变长整数

变长字符串

网络地址

Inventory Vectors

区块头

Differential encoding

PrefilledTransaction

HeaderAndShortIDs

BlockTransactionsRequest

BlockTransactions

Short transaction ID

信息类型

version

比特币两个节点建立连接以后先要互相发送 version 消息,确保双方版本兼容。

verack

比特币节点对 version 消息的回复。

addr

inv

getdata

notfound

getblocks

getheaders

tx

block

headers

getaddr

mempool

checkorder

submitorder

reply

ping

pong

reject

filterload, filteradd, filterclear, merkleblock

alert

bitcoin.it 上说比特币核心客户端已经于 2016 年 3 月 停止对 alert 消息的支持。但是实际上我在与一些节点交互的过程中发现 Satoshi:0.18.99 的客户端仍然会向我发送 alert 消息。

sendheaders

feefilter

sendcmpct

cmpctblock

getblocktxn

blocktxn

协议流程

客户端发起与 peer 的连接后首先进行 Version Handshake,流程如下:(L 是本地节点,R 是远端节点)

1
2
3
4
5
6
L -> R: Send version message with the local peer's version
R -> L: Send version message back
R -> L: Send verack message
R: Sets version to the minimum of the 2 versions
L -> R: Send verack message after receiving version message from R
L: Sets version to the minimum of the 2 versions

评论无需登录,可以匿名,欢迎评论!