Transactions
如何避免交易延展性後果?
請注意,此問題與其他有關transaction-malleability的問題不重複。
我的問題是關於以下場景,這可能發生在使用鏈上錢包管理的交易所上:
- 使用者將資金存入地址 A,屬於他在交易所的賬戶。Exchange 在記入使用者帳戶之前會等待n次確認。
- 然後使用者將資金從地址 A 轉移到地址 B,該地址也屬於他在同一交易所的帳戶。Exchange 不會在這裡等待任何確認,因為它知道自己不會雙花。因此,Exchange 會記錄此交易的 TXID 以供將來使用。
- 雖然交易未經確認,但有人利用交易延展性問題並推送其調整後的版本,而不是被礦工拾取。
- 同時,使用者想將資金提取到地址 C,這是另一個交易所或外部錢包。Exchange 使用它之前儲存的 TXID 創建此交易。不幸的是,Blockchain 不知道這個 TXID,因為它被大多數礦工拒絕了。交易所雖然沒有立即得到回饋,因為它不知道該交易的調整版本存在(因為兩者仍未確認)
- 實際上,資金沒有被提取,交易所運營商不知道為什麼會發生這種情況。
現在以下情況還沒有發生在我身上,但我想知道:
- 它是否足夠現實以至於它可能發生,或者我錯過了什麼?
- 我該如何防範呢?對我來說,最好的解決辦法似乎是在交易輸入中使用新的 NTXID 而不是 TXID。但這在不久的將來可能是不可能的,因為需要對協議進行相當大的改變。
這是新問題,是造成所有麻煩的問題。你基本上有兩個選擇:
- 在您完全確定它們被完全確認之前,不要花費您自己的任何輸出。例如,您可以等待三個確認。
- 準備好通過監控未完成的交易鏈並使用新的輸入交易 ID 重新發布任何孤立交易來處理此問題。
這是一種解決方法,它不能解決核心問題,但可以解決您的問題。
在進行交易之前,請檢查目標地址是否也是屬於同一使用者的地址。如果是這樣,請不要創建事務。警告使用者目標地址屬於他,他不能進行此轉移。
如果地址 B 屬於您網站上的另一個使用者,也會發生這種情況。做同樣的檢查並使交易脫離鏈。只需更新使用者的餘額,但不要創建比特幣交易。
假設這種情況實際上發生在交易所中,我認為您可以像這樣輕鬆地劃清界限。
在屬於同一使用者的兩個地址之間移動餘額聽起來像是錢包功能。但是你正在執行一個交易所。
一些使用者可能會抱怨,但是,嘿,安全比 goxed 更好。他們會明白的。