Unconfirmed-Transactions

使用未開采的 Tx 作為 UTXO

  • August 8, 2022

考慮兩個交易——Tx1、Tx2。Tx1 是 Tx2 的輸入。

假設 Tx1 還沒有到達任何塊。Tx2 能否進入以下記憶體池:

  1. 在其記憶體池中保存 Tx1 的節點
  2. 一個不在其記憶體池中保存 Tx1 的節點。如果是這樣,它會向它的鄰居請求 Tx1 嗎?

我讀過一些文章說 Tx2 是一個有效的 Tx 並且在某些情況下會被確認為 0-conf Tx。我知道不同的節點可能會有所不同(他們可以調整實現)所以我只要求比特幣標準原始碼行為。

塊可以包含兩個相互依賴的事務(一個事務花費同一塊中另一個事務創建的輸出)。

比特幣核心將接受其記憶體池交易,這些交易花費記憶體池中其他交易創建的輸出。這些交易可能會或可能不會被探勘到同一個區塊中。

讓我添加一些關於如何在網路上中繼未確認交易的更多細節,然後您可以回答您自己的問題。假設有三個節點。愛麗絲、鮑勃和卡羅爾。Alice 有 Tx1 並且剛剛收到 Tx2,Bob 有 Tx1,Carol 兩者都沒有。Bob 和 Carol 都是 Alice 的對等節點。

當 Alice 得知新交易 Tx2 時,她通過 txid 向 Bob 和 Carol 宣布 Tx2。Bob 和 Carol 都沒有與 Tx2 的 txid 的交易,所以他們向 Alice 請求 Tx2。

Bob 收到 Tx2 並檢查將其包含在一個塊中是否有效。當節點看到輸入花費了 Tx1 的輸出時,它會在其記憶體池中找到 Tx1。輸入未經確認,但也是有效交易的一部分,因此 Tx2 可以包含在一個塊中,只要 Tx1 包含在它之前的塊中。Bob 將 Tx2 添加到他的記憶體池中,並向他的同伴宣布 Tx2。

Carol 收到 Tx2 並檢查交易是否有效以包含在一個塊中。當節點看到輸入花費了 Tx1 的輸出時,它意識到它不知道 Tx1,例如因為當 Tx1 最初廣播到網路時 Carol 不線上。由於在知道所有輸入之前,Carol 無法確認 Tx2 已準備好包含在一個塊中,因此 Carol 將 Tx2 放入其“孤兒交易”列表中。由於節點只轉發他們認為有效的交易,將 Tx2 轉發給 Carol 的節點應該知道 Tx2 的所有輸入。因此,Carol 通過向 Alice 請求 Tx1 來跟進。Alice 將 Tx1 提供給 Carol。Carol 驗證 Tx1,將其添加到她的記憶體池中。現在輸入已知,她確定 Tx2 也是有效的,並將其添加到記憶體池中。然後,Carol 向她的同伴宣布 Tx1 和 Tx2。

另外,關於術語的說明:我們認為交易被包含在區塊中時已*確認。但是,如果交易可以包含在區塊中,我們認為它是有效的。*可能有多個衝突的(花費相同的輸入)有效交易,但在最佳鏈中只能確認其中一個。一個節點一次只能在其記憶體池中保存一組衝突事務中的一個。通常這是他們第一次看到,除非後來的交易滿足替換其前任的要求。

接受零確認交易, 是指接收方在確認之前決定依賴(有效)交易的做法。由於交易可以在確認之前被替換(在某些情況下甚至在確認之後),因此不推薦這種做法。然而,有些企業擁有必要的遙測和風險緩解措施,使其適合他們。

引用自:https://bitcoin.stackexchange.com/questions/114771