Transactions

什麼是防止負平衡?

  • June 4, 2018

這可能是一個愚蠢的問題,在某處有答案,但我找不到任何東西,所以請隨時重定向我!

我對比特幣區塊鏈的工作原理有一個基本的了解,即你簽署和廣播你的交易,它被節點接收並最終包含在一個被探勘的塊中。

我知道只要沒有人控制超過 50% 的算力,就不可能進行雙花嘗試。

但是,是什麼阻止了人們花費他們擁有的更多比特幣?例如,如果我的地址上有 1 個比特幣,假設我執行一個挖礦節點,是什麼阻止我嘗試探勘一個花費 1.2 個比特幣的區塊?在這個過程中的什麼時候檢查我的地址餘額以確保我確實有我想要花費的比特幣?

起初我認為是節點在開始探勘它們之前驗證了記憶體池上的交易是有效的,但事實並非如此,因為你可能有一個惡意節點做任何事情(儘管很難拉沒有足夠的挖礦能力就關閉)。

該檢查必須以某種方式“硬編碼”某處,因為實際上不可能創建不存在的比特幣的交易。有人可以指出我的資源或詳細說明這是如何工作的嗎?

如果我的地址上有 1 個比特幣,假設我執行一個挖礦節點,是什麼阻止我嘗試探勘一個花費 1.2 個比特幣的區塊?

這是 Bitcoin Core 中的特定程式碼集,它拒絕任何在交易中投入的資金(輸入)少於接收者收到的資金(輸出)的交易,例如花費的資金多於他們在交易中增加的資金:

const CAmount value_out = tx.GetValueOut();
if (nValueIn < value_out) {
   return state.DoS(100, false, REJECT_INVALID, "bad-txns-in-belowout", false,
       strprintf("value in (%s) < value out (%s)", FormatMoney(nValueIn), FormatMoney(value_out)));
}

從技術上講,這不是檢查地址的“餘額”,因為在比特幣系統本身中,地址沒有餘額。當您收到比特幣時,您會將它們接收到可單獨辨識的輸出(付款)。當您花費比特幣時,您可以準確地確定您想要花費的輸出(或輸出)並一次性花費所有這些價值。

如果您想向某人支付的金額低於您的一項輸出的全部價值,您可以在您的付款中添加一個額外的輸出,將剩餘部分返還給您自己。這就像用 5 美元的鈔票支付 2 美元的零食並收到 3 美元的零錢返還給自己(而它是比特幣,我們將額外的輸出稱為支付給自己的“零錢輸出”)。

因此,在上面的程式碼中,通過檢查系統中的每筆支出以防止任何人收到比最初花費更多的比特幣(新鑄造的比特幣除外),我們防止出現負餘額。

在這個過程中的什麼時候檢查我的地址餘額以確保我確實有我想要花費的比特幣?

如上所述,檢查的是輸入和輸出(而不是地址餘額)。當收到一個塊時,它們最終會被檢查;但是,該軟體可能會檢查它們是否存在未確認的交易並記憶體結果,以便它可以更快地處理新收到的塊。


有點相關,您也不能向某人支付負面輸出:

   if (txout.nValue < 0)
       return state.DoS(100, false, REJECT_INVALID, "bad-txns-vout-negative");

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