Security
汽油退款如何運作?
在清理儲存或呼叫
SELFDESTRUCT
契約時提供Gas 退款。黃皮書提到,退款“最多為一半……”。這個“一半”和其他構成退款的部分到底是什麼?首選答案將用一個具體的例子來解釋(因為黃皮書有定義)。
有什麼限制?如果退款不受限制,可能會發生哪些攻擊?
以下操作碼觸發退款
SELFDESTRUCT
SSTORE[x] = 0
(即刪除)
SELFDESTRUCT
退款24.000
並SSTORE
清除退款15.000
gas。累計退款不能超過目前上下文(即初始呼叫)所用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 / 2
(13.003
)。退還的金額是15.000
,但由於這顯然超過了13.003
我們將其限制在該金額的最大值。我們限制這一點的原因是礦工最終不會為契約的實際執行付費:-)
編輯:
如果退款沒有上限,我們將遇到 2 個問題:
- 它不鼓勵執行任何退款的契約;
- 礦工最終可能會為執行付費。
如果它們沒有被封頂,那麼執行這些類型的交易將是不利的,因為在執行結束時,退款會從礦工獲得的金額中減少(即
gasUsed * tx.price
)。限制說這gasUsed
將使執行對礦工無用(它不會因執行合約而獲得獎勵)。這將我們帶到第二點;因此,獲得比使用的 gas 更高的退款最終會導致 gas 使用量為負,因此必須從礦工的餘額中扣除。沒有一個心智正常的礦工會為執行你的電話付錢給你。