nameFunction.value 和 address.transfer 的區別
使用 nameFunction.value(n)(nameFunction 的參數) 和 address.transfer(10) 有什麼區別?
我知道在 address.transfer 的情況下,我會將金額發送到備份函式,以便合約中包含該金額。但在第一種情況下,發送的金額在哪裡?
最後,nameFunction.value 是否容易像 address.call.value()() 一樣受到重入攻擊?
我對此有點困惑。謝謝你。
呼叫
address.transfer(10)
會將乙太幣(10 wei)發送到目標地址。如果該地址是一個合約,並且它實現了回退應付功能,它將在目標合約中被觸發。另一方面
nameFunction.value(n)(parameters of nameFunction)
將呼叫所選函式,將參數和由 value 指定的 ether 連同它一起發送。為了使其工作,所述功能還必須標記為應付。因此,
address.transfer(10)
當您只想將乙太幣發送到另一個合約(或 EOA)時,您會使用該合約,如果該合約恰好在其備份功能上實現了某些東西,則由它決定(受 2300 天然氣津貼的限制)。
nameFunction.value(n)(parameters of nameFunction)
當您知道要在另一個需要發送乙太幣才能工作的契約上執行所述功能時,您會使用。假設合約 B 有這個功能:
function doSomethingWithEther(string _param) public payable{ balances[msg.sender] = msg.value; }
為了讓合約 A 執行這個功能並提供所需的乙太幣,它會做:
contractB.doSomethingWithEther.value(1 ether)("This is a string param");
nameFunction.value(n)(parameters of nameFunction)
確實容易受到重入攻擊。它可以從你的合約中執行一個功能,它會擾亂它的內部餘額,讓它在實際的乙太幣轉移完成之前耗盡資金。(這可以通過遵循 Checks-Effects-Interactions 模式來防止)。