Включая комиссию за транзакции при отправке ETH из смарт-контракта

Допустим, у меня есть простой контракт кошелька Solidity, как показано ниже. Когда я хочу отказаться от договора, используя sendкомиссию за транзакцию (стоимость газа), она уменьшается с суммы, которую получает принимающая сторона. Как отправить эфир со смарт-контракта, чтобы стоимость газа накладывалась на сам контракт, а не на получателя?

Кроме того, я хочу знать комиссию, взимаемую с кошелька, прежде чем называть контракт. Можно ли определить плату, взимаемую за 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);
        }
    }

}
Эту информацию можно получить из внутренней транзакции, как здесь: testnet.etherscan.io/tx/…
Заголовок кажется противоположным вопросу «Как я могу отправить эфир со смарт-контракта, чтобы стоимость газа накладывалась на сам контракт, а не на получателя?» Следует ли перефразировать заголовок?

Ответы (2)

Согласно документам Solidity, я не думаю, что ваш первый запрос возможен. На самом деле, документы рекомендуют перейти на схему вывода средств:

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() .

Хорошая точка зрения! В этом случае я хочу запустить кошелек Ethereum в размещенном веб-сервисе. Все обычные транзакции Ethereum должны быть доступны для пользователя, поэтому, к сожалению, здесь нельзя использовать модель вывода получателя.

Когда я хочу выйти из договора с помощью отправки, комиссия за транзакцию (стоимость газа) уменьшается с суммы, которую получает принимающая сторона. Как отправить эфир со смарт-контракта, чтобы стоимость газа накладывалась на сам контракт, а не на получателя?

Газ оплачивает тот, кто вызывает withdraw.

_to.send(_value)всегда будет пытаться отправить указанное число wei _valueна адрес _to. _valueне уменьшается никакими затратами на газ. ( sendможет завершиться ошибкой (возвращает false), если превышена глубина вызова 1024 или если _toесть резервная функция, которая потребляет больше газа 2300. Обычно рекомендуется проверять возвращаемое значение send.)

определить комиссию, взимаемую за send() через интерфейс geth JSON-RPC?

eth_estimateGas — это метод JSON-RPC для оценки стоимости газа. Для конкретного случая withdrawэто даст разумную оценку, но не только для _to.send(_value). Для общих случаев рассмотрите, каковы ограничения для оценки газа и когда ее оценка будет существенно неправильной?