交易的來源
交易的來源大體分兩種(自我總結(jié))
- 節(jié)點(diǎn)接收網(wǎng)絡(luò)中別人發(fā)送的交易;
- 節(jié)點(diǎn)自己通過RPC或QT錢包自己創(chuàng)建的交易;
Note : 此處節(jié)點(diǎn):指的是全節(jié)點(diǎn)
上述兩種交易進(jìn)交易池唯一不同的區(qū)別是:是否進(jìn)行最高交易費(fèi)的檢查
交易進(jìn)入交易池的流程
- 先檢查交易本身的格式的正確性,腳本,金額,字節(jié)...等
- 只允許可以在下個(gè)塊中進(jìn)行打包的交易進(jìn)入交易池;不成熟,報(bào)錯REJECT_NONSTANDARD,退出
- 檢查該交易是否已存在交易池中;已存在,報(bào)錯REJECT_ALREADY_KNOWN,退出。
- 檢查該交易的某個(gè)引用輸出 是否已被交易池的其它交易使用;已引用,報(bào)錯REJECT_CONFLICT,退出。
- 查看該交易是否已被打包確認(rèn),分別從UTXO集合與交易池都進(jìn)行查詢;;已被確認(rèn),報(bào)錯REJECT_ALREADY_KNOWN,退出。
- 檢查交易的所有父交易都已在本地節(jié)點(diǎn)存在(UTXO集合或者交易池);缺少父交易,賦值傳出參數(shù)pfMissingInputs = true,退出。
- 查看該交易的所有引用輸出是否都可以被花費(fèi);不可以被花費(fèi),報(bào)錯REJECT_DUPLICATE;退出。
- 檢查交易輸入的sequence字段的時(shí)間鎖;不到時(shí)間,報(bào)錯REJECT_NONSTANDARD,退出。
- 檢查該交易的所有引用輸出的鎖定腳本是否正確;不正確,報(bào)錯REJECT_NONSTANDARD,退出。
- 如果該交易的簽名操作碼數(shù)量過多;報(bào)錯REJECT_NONSTANDARD,退出。
- 交易的費(fèi)率小于 交易池的最小費(fèi)率,不允許進(jìn)入;報(bào)錯REJECT_INSUFFICIENTFEE,退出。
- 當(dāng)交易費(fèi)低于節(jié)點(diǎn)的最低中繼費(fèi)率時(shí),報(bào)錯REJECT_INSUFFICIENTFEE,退出。
- 如果該交易費(fèi)過低,但是優(yōu)先級足夠,同時(shí)節(jié)點(diǎn)又限制低交易費(fèi)的廣播流量;報(bào)錯REJECT_INSUFFICIENTFEE, 退出。
- 如果交易費(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í),則不會檢查。
- 如果該交易在交易池有太多依賴的祖先交易和后代交易,則報(bào)錯REJECT_NONSTANDARD,退出。
- Note : 默認(rèn)一個(gè)交易在交易池分別有25個(gè)祖先和后代交易。
- 進(jìn)行交易腳本的ECDSA簽名驗(yàn)證; 先驗(yàn)證標(biāo)準(zhǔn)腳本檢查是否正確,如果出錯,返回狀態(tài)碼,退回。
- 根據(jù)父區(qū)塊生成腳本驗(yàn)證標(biāo)識,再次進(jìn)行腳本簽名驗(yàn)證,失敗,返回錯誤碼,退出。
- 添加該交易到交易池
- 限制交易池的大小
- 發(fā)送信號給所有關(guān)注該信息的組件,先添加了一個(gè)交易。
哪些交易可以進(jìn)交易池
由上述檢查可以得出:只有符合下面條件的交易才允許進(jìn)入交易池
- 交易自身格式正確。(腳本,金額,交易字節(jié),操作碼數(shù)量...符合限制)
- 成熟的交易。(即可以立即在下一個(gè)塊中進(jìn)行打包的交易)
- 非雙花的交易。
- 非孤兒交易。(即交易所有依賴的父交易都可以在本節(jié)點(diǎn)找到)
- 交易費(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è)比特幣。
- 交易的腳本驗(yàn)證通過。
只有當(dāng)一個(gè)交易符合上述所有條件時(shí),才允許進(jìn)入交易池。
本文由 Copernicus團(tuán)隊(duì) 姚永芯寫作,轉(zhuǎn)載無需授權(quán)。