Transactions
如何唯一標識交易(以防止延展性)?
我廣播的交易可以被任何觀看記憶體池的人破壞(更多資訊在這裡)。
這排除了
txid
用於交易辨識的可能性。我如何辨識我的交易以確保它們被我的應用程序跟踪,即使
txid
交易在區塊中被探勘時發生了變化?
這是一個有趣的問題,已經在比特幣社區中進行了很多研究和討論。
執行此操作的基本方法是跟踪規範化的 TXID 以及協議中使用的實際 TXID。然後為了計算交易的規範化 ID,將其序列化:
- 將輸入的 txid 替換為其規範化交易
- 刪除 scriptSigs(因為它們是交易中最具延展性的部分)
唯一需要注意的是,對於 coinbase 交易不需要這樣做,因為 scriptSig 不可延展(因為它已經在一個塊中)並且輸入中沒有真正的 txid。您也不想從 coinbase 交易中刪除 scriptSig,因為它包含塊的高度(每個 BIP34),這保證了 TXID(和規範化的 TXID)將是唯一的。因此,對於 coinbase 交易,標準化交易 id 與交易 id 相同(nTXID == TXID)。
注意:跟踪每筆交易的標準化 ID 需要做大量工作。它還沒有在比特幣核心中實現,實現你自己的版本可能很耗時。
如果您可以保證系統內所有交易中的輸出集是唯一的(即您為每筆交易使用新的接收地址和新的更改地址),那麼您可以使用輸出集的雜湊作為唯一標識符。這將更具體到您的案例,作為臨時修復,而比特幣核心尚不支持規範化交易 ID。
一些進一步的資源:
- <https://github.com/bitcoin/bitcoin/pull/3656>
- 什麼是交易的規範化交易雜湊?
- 在計算規範化事務 id 時,何時完成 sha256 雜湊?
您仍然可以使用
txid
來在數據庫中辨識它。你只需要確保等待足夠的確認以信任交易,並且它不能被其他方“惡意”。如果您收到 2 筆具有相同輸入/輸出但交易 id 不同的交易,那麼您只需保留一個(可能是第一個)並丟棄另一個。換句話說,隨心所欲地辨識交易,只要記住不要相信未經證實的交易。