Solidity
一個合約如何將乙太幣發送到另一個擁有超過 2300 gas 的合約?
我希望一份契約在將其發送到另一份契約之前收集一定數量的 finney,但我不能簡單地用
C2.send(thisMuch)
.function() { Dividend m = Dividend(dividendAddr); if (this.balance >= 70 finney) { uint sendProfit = this.balance; } m.Enter.send(sendProfit); }
到目前為止,這就是我所擁有的,但是在將芬尼從一份契約發送到另一份契約時,我完全迷失了。我怎樣才能做到這一點?
我已經就我認為它應該如何運作簽訂了兩份契約。契約一將其發送給契約二。
contract one { address public deployer; address public targetAddress; modifier execute { if (msg.sender == deployer) { _ } } function one(address _targetAddress) { deployer = msg.sender; targetAddress = _targetAddress; } function forward() { two m = two(targetAddress); m.pay(); targetAddress.send(this.balance); } function() { forward(); } function sendBack() execute { deployer.send(this.balance); } }
契約二把它寄回給我。
contract two { address public deployer; function two() { deployer = msg.sender; } function pay() { deployer.send(this.balance); } function() { pay(); } }
這是它應該如何工作的嗎?
為了在指定氣體量的同時將 Ether 發送到另一個合約,請使用該
call
函式。
targetAddress.call.gas(200000).value(this.balance)();
將呼叫回退函式。
targetAddress.call.gas(200000).value(this.balance)(bytes4(sha3("pay()")));
將呼叫該pay
函式。
應該可以為每個外部函式(和建構子)呼叫指定傳輸的值和使用的氣體:
contract Fa { function fa(uint _a) {} } contract Fb { function fb(address a) { Fa b= Fa(a);// or Fa b = New Fa.value(2).gas(200)(a); b.fa.value(3).gas(1500)(50); } }
f.gas(x).value(20)()
呼叫修改後的函式 f,從而發送 20 Wei(或 20 ether 按值(20 ether))並將氣體限制為 x(因此此函式呼叫很可能會耗盡氣體並返回您的 20 Wei)。注意:
send()
實際上應該使用最小氣體。如果我們想要執行程式碼,我們應該使用call()