BitcoinCash: 一個(gè)交易的自述(交易的來到)

交易的來源

交易的來源大體分兩種(自我總結(jié))

  1. 節(jié)點(diǎn)接收網(wǎng)絡(luò)中別人發(fā)送的交易;
  2. 節(jié)點(diǎn)自己通過RPC或QT錢包自己創(chuàng)建的交易;

Note : 此處節(jié)點(diǎn):指的是全節(jié)點(diǎn)
上述兩種交易進(jìn)交易池唯一不同的區(qū)別是:是否進(jìn)行最高交易費(fèi)的檢查

交易進(jìn)入交易池的流程

  1. 先檢查交易本身的格式的正確性,腳本,金額,字節(jié)...等
  2. 只允許可以在下個(gè)塊中進(jìn)行打包的交易進(jìn)入交易池;不成熟,報(bào)錯REJECT_NONSTANDARD,退出
  3. 檢查該交易是否已存在交易池中;已存在,報(bào)錯REJECT_ALREADY_KNOWN,退出。
  4. 檢查該交易的某個(gè)引用輸出 是否已被交易池的其它交易使用;已引用,報(bào)錯REJECT_CONFLICT,退出。
  5. 查看該交易是否已被打包確認(rèn),分別從UTXO集合與交易池都進(jìn)行查詢;;已被確認(rèn),報(bào)錯REJECT_ALREADY_KNOWN,退出。
  6. 檢查交易的所有父交易都已在本地節(jié)點(diǎn)存在(UTXO集合或者交易池);缺少父交易,賦值傳出參數(shù)pfMissingInputs = true,退出。
  7. 查看該交易的所有引用輸出是否都可以被花費(fèi);不可以被花費(fèi),報(bào)錯REJECT_DUPLICATE;退出。
  8. 檢查交易輸入的sequence字段的時(shí)間鎖;不到時(shí)間,報(bào)錯REJECT_NONSTANDARD,退出。
  9. 檢查該交易的所有引用輸出的鎖定腳本是否正確;不正確,報(bào)錯REJECT_NONSTANDARD,退出。
  10. 如果該交易的簽名操作碼數(shù)量過多;報(bào)錯REJECT_NONSTANDARD,退出。
  11. 交易的費(fèi)率小于 交易池的最小費(fèi)率,不允許進(jìn)入;報(bào)錯REJECT_INSUFFICIENTFEE,退出。
  12. 當(dāng)交易費(fèi)低于節(jié)點(diǎn)的最低中繼費(fèi)率時(shí),報(bào)錯REJECT_INSUFFICIENTFEE,退出。
  13. 如果該交易費(fèi)過低,但是優(yōu)先級足夠,同時(shí)節(jié)點(diǎn)又限制低交易費(fèi)的廣播流量;報(bào)錯REJECT_INSUFFICIENTFEE, 退出。
  14. 如果交易費(fèi)過高,也報(bào)錯REJECT_HIGHFEE,退出。
    • Note : 當(dāng)添加到交易池的交易,來自于網(wǎng)絡(luò)中的接收,則不檢查交易費(fèi)過高的情況。
    • 如果是自己使用QT創(chuàng)建交易,然后發(fā)送,會檢查高交易費(fèi)的情況。
    • 如果是調(diào)用sendrawtranstion RPC 命令,發(fā)送一個(gè)交易,則會檢查高交易費(fèi)的情況。
    • 綜上所述:只有當(dāng)交易為自己創(chuàng)建的時(shí),才會檢查高交易費(fèi)的情況;當(dāng)時(shí)接收自網(wǎng)上,別人發(fā)送的交易時(shí),則不會檢查。
  15. 如果該交易在交易池有太多依賴的祖先交易和后代交易,則報(bào)錯REJECT_NONSTANDARD,退出。
    • Note : 默認(rèn)一個(gè)交易在交易池分別有25個(gè)祖先和后代交易。
  16. 進(jìn)行交易腳本的ECDSA簽名驗(yàn)證; 先驗(yàn)證標(biāo)準(zhǔn)腳本檢查是否正確,如果出錯,返回狀態(tài)碼,退回。
  17. 根據(jù)父區(qū)塊生成腳本驗(yàn)證標(biāo)識,再次進(jìn)行腳本簽名驗(yàn)證,失敗,返回錯誤碼,退出。
  18. 添加該交易到交易池
  19. 限制交易池的大小
  20. 發(fā)送信號給所有關(guān)注該信息的組件,先添加了一個(gè)交易。

哪些交易可以進(jìn)交易池

由上述檢查可以得出:只有符合下面條件的交易才允許進(jìn)入交易池

  1. 交易自身格式正確。(腳本,金額,交易字節(jié),操作碼數(shù)量...符合限制)
  2. 成熟的交易。(即可以立即在下一個(gè)塊中進(jìn)行打包的交易)
  3. 非雙花的交易。
  4. 非孤兒交易。(即交易所有依賴的父交易都可以在本節(jié)點(diǎn)找到)
  5. 交易費(fèi)適合的交易。
    • 最低交易費(fèi)檢查:此處會檢查兩種交易費(fèi):
      • 交易池允許的最低交易費(fèi);默認(rèn)的配置為:每千字節(jié)
      • 節(jié)點(diǎn)中繼該交易的最低交易費(fèi);默認(rèn)的配置為:每千字節(jié)1000Satoshis
    • 最高交易費(fèi)檢查:
      • 當(dāng)接收到的交易來自網(wǎng)絡(luò)中時(shí),不檢查。
      • 當(dāng)為節(jié)點(diǎn)自己創(chuàng)建的交易進(jìn)交易池時(shí),會檢查。默認(rèn)最高交易費(fèi)為:1/10個(gè)比特幣。
  6. 交易的腳本驗(yàn)證通過。

只有當(dāng)一個(gè)交易符合上述所有條件時(shí),才允許進(jìn)入交易池。


本文由 Copernicus團(tuán)隊(duì) 姚永芯寫作,轉(zhuǎn)載無需授權(quán)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容