RFC: 使用 this.balance
作為無儲存停用機制的後Cancun方案
在Cancun升級和EIP-6780引入的變更之後,動態停用和重新啟用合約的能力變得更加具有挑戰性,特別是在每次交易都需要查詢儲存的情況下。我提出了一種最小化的機制,使用內建的 this.balance
變數作為控制標誌來啟用和停用合約(特別是路由器合約)。
使用案例
所討論的路由器合約:
- 持有使用者批准但沒有代幣或重要的業務邏輯。
- 在正常操作中不持有ETH。
- 需要一種可靠的、無儲存的方式來切換啟用和停用狀態。
這在以下情況特別有用:
- 發現合約中存在bug,需要阻止使用者與之互動,直到修復完成。
- 需要快速停用路由器,而不需要手動撤銷使用者批准。
提議的機制
該機制完全依賴於合約的ETH餘額(this.balance
)來切換其狀態。邏輯如下:
- 狀態定義:
- 停用:
this.balance == 0
。合約拒絕所有互動。 - 啟用:
this.balance == 1 wei
。合約正常執行。 - 狀態轉換:
- 啟用合約:
activate()
函式(限制為不可變的DEACTIVATOR地址)向合約傳送1 wei,將其設定為啟用狀態。 - 停用合約:
deactivate()
函式(也有限制)將合約中的所有ETH轉回DEACTIVATOR,將餘額設定為零。 - 關鍵特性:
- 路由器沒有
receive
函式,確保ETH不會意外或惡意地傳送到它。 - 所有狀態轉換完全依賴於ETH餘額,消除了查詢或儲存自定義狀態變數的需要。
- 無儲存讀取:狀態檢查依賴於
this.balance
,避免了從儲存中讀取的gas成本。 - 高效的狀態轉換:啟用或停用只涉及最小的ETH轉賬。
- 安全性:沒有
receive
函式確保路由器不會意外積累ETH。 - 路由器合約中的bug迫使使用者手動撤銷批准。
- 由於gas成本或複雜性,每次交易都進行狀態查詢是不可取的。
優勢
為什麼這很有用
這種機制提供了一種輕量級的方式來處理路由器停用,特別是在以下情況下:
使用合約的ETH餘額作為切換開關避免了對儲存變數的需求,同時實現了快速高效的狀態變更。這種方法可能會使其他需要類似啟用/停用機制的合約設計受益,而無需依賴儲存。