比特币交易流程解析

网上很多人分析了一堆,但是具体的交易流程,具体怎么工作的,很少有人分析清楚,现在我力求把这个过程说清楚,这个更适合技术人员查看,没有废话。

交易整体流程

比特币交易流程解析

  1. 交易者用钱包客户端对一笔交易进行签名
  2. 然后选择一个自有节点或者公共节点peerA将自己的交易发送过去
  3. peerA获取到交易信息之后,进行一长串的验证
  4. 验证通过之后,加入本地的交易池,而且广播到与之连接的所有节点peerB,peerC
  5. peerB和peerC接收到交易之后,进行验证,通过之后,加入到交易池中,同时判断交易池中交易数量是否超过1000,超过就按照交易池中的交易hash,批量获取所有的完整交易数据
  6. 拿到所有交易数据之后,就可以执行挖矿流程

peerA进行验证过程

  • 交易的语法和数据结构必须正确。
  • 输入与输出列表都不能为空。
  • 交易的字节大小是小于MAX_BLOCK_SIZE的。
  • 每一个输出值,以及总量,必须在规定值的范围内 (小于2,100万个币,大于0)。
  • 没有哈希等于0,N等于-1的输入
  • 交易的字节大小是大于或等于100的
  • 交易中的签名数量应小于签名操作数量上限。
  • 池中或位于主分支区块中的一个匹配交易必须是存在的。
  • 对于每一个输入,如果引用的输出存在于池中任何的交易,该交易将被拒绝(避免双花)
  • 对于每一个输入,在主分支和交易池中寻找引用的输出交易。如果输出交易缺少任何一个输入,该交易将成为一个孤立的交易。如果与其匹配的交易还没有出现在池中,那么将被加入到孤立交易池中。
  • 对于每一个输入,如果引用的输出交易是一个coinbase输出,该输入必须至少获得COINBASE_MATURITY (100)个确认。
  • 对于每一个输入,引用的输出是必须存在的,并且没有被花费。
  • 使用引用的输出交易获得输入值,并检查每一个输入值和总值是否在规定值的范围内 (小于2100万个币,大于0)。
  • 如果输入值的总和小于输出值的总和,交易将被中止。
  • 如果交易费用太低以至于无法进入一个空的区块,交易将被拒绝。
  • 每一个输入的解锁脚本必须依据相应输出的锁定脚本来验证。

peerA广播交易Hash

  • peerA会广播交易Hash到所有与之相连的peer节点上
  • peerA的这个交易并不保证广播到比特币网络的所有节点。只要到达足够多的节点,那么没多久这些交易就会被打包进一个区块。区块广播也容许一些消息被丢弃。如果一个节点并未接收到某个区块,那么这个节点会在它接收到下一个区块的时候意识到自己错失了之前的区块,因此会发出补充那个遗失区块的请求。