交易的来源
交易的来源大体分两种(自我总结)
- 节点接收网络中别人发送的交易;
- 节点自己通过RPC或QT钱包自己创建的交易;
Note : 此处节点:指的是全节点
上述两种交易进交易池唯一不同的区别是:是否进行最高交易费的检查
交易进入交易池的流程
- 先检查交易本身的格式的正确性,脚本,金额,字节...等
- 只允许可以在下个块中进行打包的交易进入交易池;不成熟,报错REJECT_NONSTANDARD,退出
- 检查该交易是否已存在交易池中;已存在,报错REJECT_ALREADY_KNOWN,退出。
- 检查该交易的某个引用输出 是否已被交易池的其它交易使用;已引用,报错REJECT_CONFLICT,退出。
- 查看该交易是否已被打包确认,分别从UTXO集合与交易池都进行查询;;已被确认,报错REJECT_ALREADY_KNOWN,退出。
- 检查交易的所有父交易都已在本地节点存在(UTXO集合或者交易池);缺少父交易,赋值传出参数pfMissingInputs = true,退出。
- 查看该交易的所有引用输出是否都可以被花费;不可以被花费,报错REJECT_DUPLICATE;退出。
- 检查交易输入的sequence字段的时间锁;不到时间,报错REJECT_NONSTANDARD,退出。
- 检查该交易的所有引用输出的锁定脚本是否正确;不正确,报错REJECT_NONSTANDARD,退出。
- 如果该交易的签名操作码数量过多;报错REJECT_NONSTANDARD,退出。
- 交易的费率小于 交易池的最小费率,不允许进入;报错REJECT_INSUFFICIENTFEE,退出。
- 当交易费低于节点的最低中继费率时,报错REJECT_INSUFFICIENTFEE,退出。
- 如果该交易费过低,但是优先级足够,同时节点又限制低交易费的广播流量;报错REJECT_INSUFFICIENTFEE, 退出。
- 如果交易费过高,也报错REJECT_HIGHFEE,退出。
- Note : 当添加到交易池的交易,来自于网络中的接收,则不检查交易费过高的情况。
- 如果是自己使用QT创建交易,然后发送,会检查高交易费的情况。
- 如果是调用sendrawtranstion RPC 命令,发送一个交易,则会检查高交易费的情况。
- 综上所述:只有当交易为自己创建的时,才会检查高交易费的情况;当时接收自网上,别人发送的交易时,则不会检查。
- 如果该交易在交易池有太多依赖的祖先交易和后代交易,则报错REJECT_NONSTANDARD,退出。
- Note : 默认一个交易在交易池分别有25个祖先和后代交易。
- 进行交易脚本的ECDSA签名验证; 先验证标准脚本检查是否正确,如果出错,返回状态码,退回。
- 根据父区块生成脚本验证标识,再次进行脚本签名验证,失败,返回错误码,退出。
- 添加该交易到交易池
- 限制交易池的大小
- 发送信号给所有关注该信息的组件,先添加了一个交易。
哪些交易可以进交易池
由上述检查可以得出:只有符合下面条件的交易才允许进入交易池
- 交易自身格式正确。(脚本,金额,交易字节,操作码数量...符合限制)
- 成熟的交易。(即可以立即在下一个块中进行打包的交易)
- 非双花的交易。
- 非孤儿交易。(即交易所有依赖的父交易都可以在本节点找到)
- 交易费适合的交易。
- 最低交易费检查:此处会检查两种交易费:
- 交易池允许的最低交易费;默认的配置为:每千字节
- 节点中继该交易的最低交易费;默认的配置为:每千字节1000Satoshis
- 最高交易费检查:
- 当接收到的交易来自网络中时,不检查。
- 当为节点自己创建的交易进交易池时,会检查。默认最高交易费为:1/10个比特币。
- 交易的脚本验证通过。
只有当一个交易符合上述所有条件时,才允许进入交易池。
本文由 Copernicus团队 姚永芯
写作,转载无需授权。