比特幣核心中的包是什麼,它們的案例是什麼?
在比特幣原始碼中有一個名為的實體
Package
,我在原始碼的很多地方都看到過它們。我在以下位置找到了這條評論src/policy/packages.h
:/** A package is an ordered list of transactions. The transactions cannot conflict with (spend the * same inputs as) one another. */ using Package = std::vector<CTransactionRef>;
為什麼它們有用?
您明確詢問了原始碼,但讓我首先對“包”一詞進行更廣泛的解釋。
在談到一攬子交易時,我們一般指的是一組關聯交易。例如,一組交易
{A; B; C}
,其中C
花費A
並且B
是一個包。一組交易{A; B; C; D}
,其中B
花費A
、C
花費B
和D
花費兩者A
,C
也是一個包。如您所見,這可能會變得非常複雜。那麼為什麼要打擾呢?事實上,事務之間的這種“連接”是一種依賴。從我上面的第一個範例中,
C
取決於A
並且B
因為它花費了他們的一個輸出。這很重要,因為:
C``A
沒有和是無效的B
。雖然當交易被確認時這很簡單,但當它們沒有被確認時就不那麼簡單了:如果一個節點聽到C
但不知道任何一個,A
或者B
它不會在它的記憶體池中接受它並轉發它。- 理想情況下,創建塊模板的算法需要考慮整個包的費率。
A
並且B
可能支付較低的費用,但C
支付較大的費用。由於C
依賴於A
,B
因此它激勵它們包含在一個塊中。這被稱為 CPFP(兒童為父母付費)。因此,包對於推理具有所有未確認依賴項的事務的費率很有用。
最近,人們對包進行了很多討論,以及包中繼的工作,這是一種協議擴展,不僅允許單獨中繼未確認的交易,而且可以作為包中繼。雖然包裹中繼的工作並不新鮮,但由於為閃電網路等一些第 2 層協議提供了更好的安全保證,最近這項工作得到了大量開展。
您引用的這行程式碼與 Bitcoin Core 的記憶體池驗證程式碼中的包的實現有關。程式碼的這個(關鍵)部分與節點記憶體池中新交易的接受有關。類型聲明是指指向事務的指針列表,並在兩種情況下使用。
首先,當接受一批可能相互關聯也可能不相互關聯的交易時。它目前僅通過
testmempoolaccept
RPC 命令公開。其次,當接受某種包時:一個拓撲排序(父母出現在孩子之前)的交易列表,代表一個孩子及其所有未確認的父母。它在目前的開發分支中只通過一個全新的
submitpackage
RPC 命令。目的是最終通過最近提出的Package Relay BIP使其可以從 P2P 網路訪問。你可以在文件中閱讀更多關於目前比特幣核心記憶體池接受規則的包
doc/policy/packages.md
。