Contract-Design
檢查活性契約時是否可以進行比賽?
我想知道在執行類似於
eth.getCode(greeter.contractAddress)
為零的呼叫的返回值檢查時是否可能進行比賽。也就是說,是否有可能合約在檢查期間是有效的,但之後就自毀了?我迷失了乙太坊的因果關係規則。範例呼叫是從契約教程中複製的。
2 種情況:在乙太坊虛擬機 (EVM) 的外部和內部。
在 EVM 之外
是的,如果使用種族是可能
eth.getCode
的。eth.getCode
是 Javascript 並且在契約和 EVM 之外。因此,在 之後eth.getCode
,您的乙太坊客戶端收到的下一個區塊可能會有一個selfdestruct
在(歡迎者)合約上呼叫的交易。EVM 內部
**不,如果在單個事務中的 EVM 中,**因為語句是順序的並且目前沒有並行性(正如@Sebi 提到的)。EVM 等效項是使用
extcodesize
orextcodecopy
。EVM 內的控制流是確定性的。是的,如果使用多於一筆交易,則可能存在競爭。 在 EVM 中,重要的是要意識到礦工可以完全控制交易在區塊內的排序方式。本文提到了事務排序依賴(TOD),TOD 合約通常會存在安全問題。如果合約 C在一筆交易
extcodesize
中為合約 D執行,然後在另一筆交易中執行某些操作(假設合約 D 仍然存在),那麼 C 很容易受到攻擊:在 D 上執行的交易可以插入到 2 C的交易selfdestruct