Contract-Design

自殺式契約是否容易重新進入?

  • June 23, 2016

如果我的合約呼叫自殺()引用合約作為資金接收者,並且接收者合約預設函式回調我的合約,呼叫會成功嗎?

contract A {
 function die(address _recipient) external {
   suicide(_recipient);
 }
}

contract B {
 A a;
 function () {
   a.die(this);
 }
}

更重要的是,這重要嗎?作為對 B 的呼叫的一部分,是否所有剩餘的 ETH 都已發送?

跟進:

黃皮書顯示余額是直接操縱的,而不是通過呼叫。(自殺指令下的第 29 頁)

Go 客戶端的 master 分支中的 core/vm/instructions.go 文件定義了 opSuicide() 方法,看起來它是在執行期間呼叫的方法,看起來它甚至沒有轉移餘額。它只是將其添加到收件人並刪除呼叫契約。

func opSuicide(instr instruction, pc *uint64, env Environment, contract *Contract, memory *Memory, stack *stack) {
   balance := env.Db().GetBalance(contract.Address())
   env.Db().AddBalance(common.BigToAddress(stack.pop()), balance)

   env.Db().Delete(contract.Address())
}

誰能證實他們對此的理解?

不,沒有帶有selfdestruct( suicide) 的合約呼叫,因此沒有重入的可能性。

正如您所指出的,沒有 CALL,並且您引用的 Geth 程式碼是正確的。

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