Solidity

包括從智能合約發送 ETH 時的交易費用

  • July 17, 2016

假設我有一個簡單的 Solidity 錢包合約,如下所示。send當我想使用交易費用(gas 成本)從接收方獲得的金額中減少時,我想退出契約。如何從智能合約發送乙太幣,以便將 gas 成本強加給合約本身,而不是接收者?

另外,我想在呼叫合約之前知道對錢包徵收的費用。是否可以確定send()通過 JSON-RPC 介面收取的費用?

/**
* Simple hosted wallet contract.
*/
contract Wallet {

   event Deposit(address from, uint value);
   event Withdraw(address to, uint value);

   address owner;

   function Wallet() {
       owner = msg.sender;
   }

   /**
    * Simple withdrawal operation.
    */
   function withdraw(address _to, uint _value) {
       if(msg.sender != owner) {
           throw;
       }

       Withdraw(_to, _value);

       _to.send(_value);
   }


   /**
    * Somebody sends ETH to this contract address
    */
   function() {
       // just being sent some cash?
       if (msg.value > 0) {
           Deposit(msg.sender, msg.value);
       }
   }

}

根據solidity docs,我認為您的第一個請求是不可能的。事實上,文件建議切換到退出方案:

Warning: There are some dangers in using send: The transfer fails if the call stack depth is at 1024 (this can
always be forced by the caller) and it also fails if the recipient runs out of gas. So in order to make safe Ether
transfers, always check the return value of send or even better: Use a pattern where the recipient withdraws the
money.

切換到提款模式後,您可以簡單地使用web3.eth.estimateGas()

當我想使用 send 退出契約時,交易費用(gas 成本)會從接收方獲得的金額中減少。如何從智能合約發送乙太幣,以便將 gas 成本強加給合約本身,而不是接收者?

汽油由呼叫的人支付withdraw

_to.send(_value)將始終嘗試將 wei 指定的數量發送_value到 address _to_value不會因任何 gas 成本而減少。(send如果超過 1024 的呼叫深度或者如果_to有一個消耗超過 2300 gas 的備份功能,可能會失敗(返回 false)。一般建議檢查返回值send。)

確定通過 geth JSON-RPC 介面對 send() 徵收的費用?

eth_estimateGas是一種用於估算 gas 成本的 JSON-RPC 方法。對於 的具體情況withdraw,它會給出合理的估計,但不會只針對_to.send(_value)。對於一般情況,請考慮對估計氣體的限制是什麼,以及它的估計什麼時候會出現很大的錯誤?

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