Bitcoin区块验证

时间:2022-05-24 15:42:41

区块的生成

  • 矿工在挖矿前要组建区块

    • 将coinbase交易打包进区块

    • 将交易池中高优先级的交易打包进区块

      • 优先级 = 交易的额度 * UTXO的深度/交易的size
      • 防粉尘攻击
    • 创建区块的头部

      版本号|父区块哈希|Merkle树根|时间戳|难度值|Nonce

  • 挖矿成功后,将计算出来的随机数noncet填入区块头部,向临近节点传播

区块的验证链接

验证过程

  • 相邻节点收到新区快后,立即做以下检查
    • 验证Pow的nonce值是否符合难度值
    • 检查时间戳是否小于当前时间2小时(10分钟一个块)
    • 检查Merkle树根是否正确
    • 检查区块size要小于区块size的上限
    • 第一笔交易必须是coinbase的交易
    • 验证每笔交易

Merkle Tree结构

二叉树

  • 树--由多个节点组成的一种数据结构

    • 每个节点存储数据
    • 根节点root
    • 父节点,子节点,兄弟节点
  • 构建二叉搜索数

    • 12 5 2 18 19 15 17 16 9

    Bitcoin区块验证

Merkle Tree

  • 防止数据篡改

  • 快速验证某个交易是否存在

  • 节点存储Hash值

  • 从子节点构造树

    Bitcoin区块验证

Merkle Path - 验证路径

  • 只需log2(N)个已知数,即可验证K是否被包含在区块中

    • H[^K]为查找交易

    • H[^ABCDEFGH]和H[^MNOP]及H[^IJ] 为临近已知父节点

    • H[^L]为相邻节点交易Hash

      Bitcoin区块验证