区块链-交易的独立校验(交易是否符合上链基本要求)

目录:http://www.javashuo.com/article/p-nitsjfvy-ey.html数据结构

去中心化共识(如何达到共识):http://www.javashuo.com/article/p-wcdglpfz-gx.html函数

钱包建立了一个交易,产生的交易会被发送到最近的一个节点,而后全网广播,可是在这个交易传递到最近的节点以前会检验这个节点是否符合要求,因此,每一个交易都会在第一个节点进行检验。且每一个全节点依据综合标准对每一个交易进行独立验证.net

综合检验标准以下:blog

  1. 交易的语法和数据结构必须正确。
  2. 输入与输出列表都不能为空。
  3. 交易的字节大小是小于 MAX_BLOCK_SIZE 的。
  4. 每个输出值,以及总量,必须在规定值的范围内 (小于 2,100 万个币,大于 0)。
  5. 没有哈希等于 0,N 等于-1 的输入(coinbase 交易不该当被传递)。
  6. nLockTime 是小于或等于 INT_MAX 的。或者 nLocktimeandnSequence 的值满 足 MedianTimePast(译者注:MedianTime 是这个块的前面 11 个块按照 blocktime 排序后的中间时间)
  7. 交易的字节大小是大于或等于 100 的。
  8. 交易中的签名数量(SIGOPS)应小于签名操做数量上限。
  9. 解锁脚本( scriptSig )只可以将数字压入栈中,而且锁定脚本( scriptPubkey ) 必需要符合 isStandard 的格式 (该格式将会拒绝非标准交易)。
  10. 池中或位于主分支区块中的一个匹配交易必须是存在的。
  11. 对于每个输入,引用的输出是必须存在的,而且没有被花费。
  12. 对于每个输入,若是引用的输出存在于池中任何别的交易中(译者注:这笔
  13. 输入引用的输出有人家本身的输入,不是你),该交易将被拒绝。
  14. 对于每个输入,在主分支和交易池中寻找引用的输出交易。若是输出交易缺
  15. 少任何一个输入,该交易将成为一个孤 立的交易。若是与其匹配的交易尚未出 如今池中,那么将被加入到孤立交易池中。
  16. 对于每个输入,若是引用的输出交易是一个 coinbase 输出,该输入必须至少 得到 COINBASE_MATURITY(100)个确认。
  17. 使用引用的输出交易得到输入值,并检查每个输入值和总值是否在规定值的 范围内 (小于 2100 万个币,大于 0)。
  18. 若是输入值的总和小于输出值的总和,交易将被停止。
  19. 若是交易费用过低以致于没法进入一个空的区块,交易将被拒绝。
  20. 每个输入的解锁脚本必须依据相应输出的锁定脚原本验证。

 这些条件可以在比特币标准客户端下的 AcceptToMemoryPool 、 CheckTransaction 和 CheckInputs 函数中得到更详细的阐述。 请注意,这些条件 会随着时间发生变化,为了处理新型拒绝服务攻击,有时候也为交易类型多样化而放宽规则。
排序

在收到交易后,每个节点都会在全网广播前对这些交易进行独立校验,并以 接收时的相应顺序,为有效的新交易创建一个验证池(还未确认),这个池能够 叫作交易池,或者 memorypool 或者 mempool。
 ip