Security

汽油退款如何運作?

  • August 29, 2020

在清理儲存或呼叫SELFDESTRUCT契約時提供Gas 退款。

黃皮書提到,退款“最多為一半……”。這個“一半”和其他構成退款的部分到底是什麼?首選答案將用一個具體的例子來解釋(因為黃皮書有定義)。

有什麼限制?如果退款不受限制,可能會發生哪些攻擊?

以下操作碼觸發退款

  • SELFDESTRUCT
  • SSTORE[x] = 0(即刪除)

SELFDESTRUCT退款24.000SSTORE清除退款15.000gas。累計退款不能超過目前上下文(即初始呼叫)所用gas的一半。

讓我們看下面的例子:

合約儲存的目前狀態

0x00: 1
0x01: 1

以及以下執行

PUSH 0
PUSH 0
SSTORE ; set contents of address 0x0 to 0 (i.e. delete)

這將導致以下氣體總和21000 + 3 + 3 + 5000( tx_gas + push_gas + push_gas + sstore_clear_gas)。可退還的總額為gas_sum / 213.003)。退還的金額是15.000,但由於這顯然超過了13.003我們將其限制在該金額的最大值。

我們限制這一點的原因是礦工最終不會為契約的實際執行付費:-)

編輯:

如果退款沒有上限,我們將遇到 2 個問題:

  1. 它不鼓勵執行任何退款的契約;
  2. 礦工最終可能會為執行付費。

如果它們沒有被封頂,那麼執行這些類型的交易將是不利的,因為在執行結束時,退款會從礦工獲得的金額中減少(即gasUsed * tx.price)。限制說這gasUsed將使執行對礦工無用(它不會因執行合約而獲得獎勵)。這將我們帶到第二點;因此,獲得比使用的 gas 更高的退款最終會導致 gas 使用量為負,因此必須從礦工的餘額中扣除。沒有一個心智正常的礦工會為執行你的電話付錢給你。

引用自:https://ethereum.stackexchange.com/questions/594