如何防止相隔一個街區的超支?
所以,假設你有一個 20BTC 的錢包,並且你有這樣的流程:
- 您在區塊 1 中向 A 發送 15BTC
- 您在區塊 2 中向 B 發送 15BTC
如果在區塊 1 有兩條跨礦工的鏈會發生什麼。在 X 鏈中,交易存在,在 Y 鏈中,交易不存在。
當他們在區塊 2 中花費另外的 15BTC 並且他們的錢包(想像另一台使用同一個錢包的電腦)在鏈 Y 上時,他們的錢包會讓他們這樣做。在以下情況下會發生什麼:
- 鏈 X 成為主導鏈 ** 交易 1 會確認,那麼交易 2 會被拒絕並且永遠不會確認嗎?
- 鏈 Y 成為主導鏈 ** 交易 2 已經確認,那麼交易 1 會被拒絕並且永遠不會確認嗎?
這在比特幣軟體中是如何表現的呢?我知道有些交易可以廣播但從未確認過,但是如果已經廣播,錢包怎麼知道錢沒有花呢?
當一個節點得知一筆交易時,會執行一些有效性測試,如果該交易尚未在它所知道的具有最長高度的區塊鏈中並且該交易也是有效的(即,不是雙花),那麼該交易被添加到該節點的記憶體池。
如果後面的交易到達一個節點,但試圖將已經在具有最長高度的區塊鏈中或已經在記憶體池中的交易加倍,那麼後面的交易將被忽略。
一筆交易會在幾秒鐘內傳播到幾乎所有的礦工,所以大多數礦工會立即拒絕你以後的雙花嘗試,因為他們已經知道了之前的交易。
區塊鏈分叉一直在發生(即每天多次)。因此,如果交易包含在分叉一側的塊中,但尚未包含在分叉另一側的塊(或多個塊)中,則完全有可能發生衝突。最終,幾個競爭的區塊鏈分叉中的一個將成為最長的鏈,並且該鏈中的交易從那時起反映在比特幣分類賬中。這就是為什麼交易所要等到三到六次確認——因為從技術上講,如果發生分叉,雙方之間可能會發生變化。
攻擊者可能會利用這種暫時的不一致來嘗試通過種族攻擊或其他方法進行欺詐。這是有關該主題的必要閱讀:http: //en.bitcoin.it/wiki/Double-spending
如果鏈 X 成為主導,則現在孤立鏈 Y 中的所有交易都將返回到“記憶體池”。發生這種情況時,交易 2 將不會確認,因為它花費了交易 1 已經花費的輸出。
同樣,如果鏈 Y 成為主導,則現在孤立鏈 X 中的所有交易都將返回到“記憶體池”。發生這種情況時,交易 1 將不會確認,因為它花費了交易 2 已經花費的輸出。