Допустим, у меня есть простой контракт кошелька 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);
}
}
}
Согласно документам 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() .
Когда я хочу выйти из договора с помощью отправки, комиссия за транзакцию (стоимость газа) уменьшается с суммы, которую получает принимающая сторона. Как отправить эфир со смарт-контракта, чтобы стоимость газа накладывалась на сам контракт, а не на получателя?
Газ оплачивает тот, кто вызывает 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)
. Для общих случаев рассмотрите, каковы ограничения для оценки газа и когда ее оценка будет существенно неправильной?
Микко Отамаа
эт