正如Bitcoin Wallet for Android所提到的,什麼是“不安全的交易類型”?
我
Bitcoin Core v0.11.0.0-gd26f951 (64-bit)
在家裡執行 Ubuntu,並Bitcoin Wallet for Android
在我的手機上安裝了。我從家裡向我的手機發送了兩筆交易:第一,第二。一個收費很低,需要幾天時間,所以我發送了另一個收費稍高的,只用了幾分鐘。兩者都到了,到現在已經有近兩千個確認,並在應用程序中顯示為綠色。現在的比特幣應用程序(我今天第一次注意到它,我不認為它最初是這麼說的)說
This payment was delayed because the sender used an insecure transaction type.
在這兩項交易之下。那是什麼意思?
我用Google搜尋了這個片語,並在一個資源包中得到了準確的結果,該資源包是 github 上的比特幣錢包項目程式碼的一部分,它似乎是 Android 應用程序。對應的鍵是
transaction_row_message_received_rbf
,它根本沒有產生任何命中。誰能告訴我這種“不安全的交易類型”可能是什麼,以及為什麼 Bitcoin-Qt 會使用它?我是否需要阻止它,如果需要,我該怎麼做?
TL; 博士:
似乎錯誤地將交易
Bitcoin Wallet for Android
標記為由於. 該問題已報告。你不需要做任何事情。nLockTime``OptInRBF``bitcoinj
顯然,Android 的比特幣錢包將您的交易辨識為
OptInRBF
(正如您找到的程式碼所指出的那樣)。您看到的警告僅在 2016 年3 月 10 日添加到應用程序中。什麼是 OptInRBF?
OptInRBF
是“Opt-in replace-by-fee”的縮寫,在 0.12.0 中被添加到 Bitcoin Core。新版本允許比特幣核心接收並正確處理費用替換交易。但是,Bitcoin Core還不能創建 rbf 交易。錢包必須“選擇加入”才能發送它們。Replace-by-fee 是一個可以在交易上設置的標誌,以傳達人們可能想要在交易被包含在區塊之前更改交易。因此,此類交易在獲得第一次確認之前不應被認為是可靠的。將它們包含在一個塊中後,它們與任何其他交易一樣安全。
支持 rbf 的礦池將允許更新版本的交易替換舊版本,尤其是在新交易支付更高費用的情況下。例如,這對於在交易卡住時增加交易費用很有用,或者當您決定在確認前一筆交易之前發送另一筆交易時將多筆交易合併為一個交易。
警告來自哪裡?
查看第一筆交易的原始數據,事實證明交易的
sequence
數量確實低於最大值:它顯示0xFEFFFFFF
而最大值將是0xFFFFFFFF
。E
排在第二位的序列是一個無符號小端長,表示“低於最大值”。這是一個nLockTime
事務的順序。
OptInRBF
具有小於序列的nLockTime
序列,即sequence < MAX - 1
. 因此,似乎要麼bitcoinj
或將交易Bitcoin Wallet for Android
錯誤分類nLockTime
為OptInRBF
. 問題在於,自從 Bitcoin Core 0.11 以來,所有交易都有一個nLockTime
序列。乍一看,檢查交易是否正常的
bitcoinj
程式碼OptInRBF
似乎很好:public boolean isOptInFullRBF() { return sequence < NO_SEQUENCE - 1; }
但是,Java 本身使用大端格式而不是小端格式。
<speculation>因此,可能存在一個
NO_SEQUENCE - 1
可以解決的問題,讀取為 big endian0xFFFFFFFE
的nLockTime
序列0xFEFFFFFF
會顯得比這小得多,因此可以標記為OptInRBF
。</speculation> 11事實證明,我的推測是錯誤的。
BitcoinJ
並Bitcoin Wallet for Android
處理好nLockTime
序列的事務,並根據需要使用小端格式對其進行解析。到目前為止,維護者無法使用提供的事務重現所描述的問題(相反,它們在沒有警告的情況下正確顯示)。因此,警告出現的原因仍然未知。感謝 Pepijn Schmitz、Gregory Sanders、Andreas Schildbach 和 Wladimir van der Laan 幫助解決這個問題。