Contract-Design
自殺式契約是否容易重新進入?
如果我的合約呼叫自殺()引用合約作為資金接收者,並且接收者合約預設函式回調我的合約,呼叫會成功嗎?
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 程式碼是正確的。