Transactions

如何唯一標識交易(以防止延展性)?

  • March 15, 2016

我廣播的交易可以被任何觀看記憶體池的人破壞(更多資訊在這裡)。

這排除了txid用於交易辨識的可能性。

我如何辨識我的交易以確保它們被我的應用程序跟踪,即使txid交易在區塊中被探勘時發生了變化?

這是一個有趣的問題,已經在比特幣社區中進行了很多研究和討論。

執行此操作的基本方法是跟踪規範化的 TXID 以及協議中使用的實際 TXID。然後為了計算交易的規範化 ID,將其序列化:

  • 將輸入的 txid 替換為其規範化交易
  • 刪除 scriptSigs(因為它們是交易中最具延展性的部分)

唯一需要注意的是,對於 coinbase 交易不需要這樣做,因為 scriptSig 不可延展(因為它已經在一個塊中)並且輸入中沒有真正的 txid。您也不想從 coinbase 交易中刪除 scriptSig,因為它包含塊的高度(每個 BIP34),這保證了 TXID(和規範化的 TXID)將是唯一的。因此,對於 coinbase 交易,標準化交易 id 與交易 id 相同(nTXID == TXID)。


注意:跟踪每筆交易的標準化 ID 需要做大量工作。它還沒有在比特幣核心中實現,實現你自己的版本可能很耗時。

如果您可以保證系統內所有交易中的輸出集是唯一的(即您為每筆交易使用新的接收地址和新的更改地址),那麼您可以使用輸出集的雜湊作為唯一標識符。這將更具體到您的案例,作為臨時修復,而比特幣核心尚不支持規範化交易 ID。

一些進一步的資源:

您仍然可以使用txid來在數據庫中辨識它。你只需要確保等待足夠的確認以信任交易,並且它不能被其他方“惡意”。如果您收到 2 筆具有相同輸入/輸出但交易 id 不同的交易,那麼您只需保留一個(可能是第一個)並丟棄另一個。換句話說,隨心所欲地辨識交易,只要記住不要相信未經證實的交易。

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