Солидность: Отправить немного денег себе

У меня есть вопрос от Solidity, и моя IDE использует Remix, я хочу отправить немного денег себе.

Мой код:

pragma solidity ^0.4.24;
contract toMyself{

    address owner;

    function toMyself()public{
        owner = msg.sender;
    }
    function Send(uint x)public payable{
        owner.transfer(x);
    }
}

Но когда я нажимаю кнопку "Отправить", появляется сообщение типа:

Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending?

Как я могу это исправить?


person Daniel kuo    schedule 10.02.2019    source источник
comment
Привет, до этого ты нажимал toMyself()?   -  person Charles Brown    schedule 10.02.2019
comment
Привет, Джимми Ли, но toMyself — это конструктор, у них нет кнопки. В моих развернутых контрактах только одна кнопка — «Отправить».   -  person Daniel kuo    schedule 10.02.2019


Ответы (3)


  1. Вы уверены, что у контракта достаточно эфира для отправки?

  2. Вы не предпочитаете переключаться

function Send(uint x)public payable{
    owner.transfer(x);
}

to

function Send()public payable{
    owner.transfer(msg.value);
}

Итак, вы отправляете владельцу все, что входит в смарт-контракт?

Кроме того, вы можете отправить обратно любое количество, которое только что было отправлено msg.sender, следующим образом:

function SendBack() public payable{
    msg.sender.transfer(msg.value);
}

Но это закончится бесполезно и тратит немного газа.

person Fernando gonzalez-burgos roche    schedule 10.02.2019
comment
Привет, я использую тестовую сеть Ropsten для создания своего контракта, поэтому у меня достаточно эфира, чтобы попрактиковаться. И я надеюсь, что смогу отправить себе любое количество эфира, когда у меня будет достаточно эфира. - person Daniel kuo; 10.02.2019
comment
@Danielkuo Я имел в виду, что с помощью вашего кода вы отправляете x wei из смарт-контракта владельцу. Без учета количества, доступного самому смарт-контракту. С моим кодом вы будете отправлять владельцу то количество, которое отправил отправитель. - person Fernando gonzalez-burgos roche; 11.02.2019
comment
Также я отредактировал ответ, чтобы отразить функциональность SendBack. - person Fernando gonzalez-burgos roche; 11.02.2019
comment
Хорошо, я понимаю, что вы имеете в виду. Спасибо. - person Daniel kuo; 11.02.2019

Я только что проверил ваш код в ремиксе, и он работает, я только что использовал компилятор Solidity версии 0.5.

pragma solidity ^0.5;
contract toMyself{

address owner;

 constructor() public{
    owner = msg.sender;
}
function Send(uint x)public payable{
    msg.sender.transfer(x);
}
}

Возможно, это из-за отсутствия суммы в контракте. Во-вторых, когда вы используете Send, значение uint должно быть в wei.

Для доминирующих единиц http://ethdocs.org/en/latest/ether.html

person Uahmed    schedule 13.02.2019
comment
это очень понятно. - person Vishwa Ratna; 15.02.2019
comment
Хорошо, теперь у меня есть еще один вопрос: imgur.com/a/q4DZatr . Я не знаю, в чем проблема? - person Daniel kuo; 16.02.2019
comment
Попробуйте это в метамаске Аккаунты->Настройки->Сбросить аккаунт - person Uahmed; 16.02.2019
comment
Это не сработало, но я думаю, что знаю, в чем проблема. Я не устанавливал GAS FEE, но он может работать после того, как я установил GAS FEE. Итак, большое спасибо. - person Daniel kuo; 17.02.2019

Я просто уточняю здесь ответ @Fernando.

function Send(uint x) public payable {
    owner.transfer(x);
}

здесь x сумма wei будет отправлена ​​на счет владельца с баланса контракта. Чтобы это произошло, ваш контракт должен содержать не менее x количества wei. Не та учетная запись, которая вызывает функцию Send. Примечание. здесь функция Send не обязательно должна быть помечена как payable.

Теперь в случае

function Send() public payable {
    owner.transfer(msg.value);
}

вызывающая функция Send отправит некоторое количество ether/wei вместе с запросом. Мы можем получить эту сумму, используя msg.value. Затем перенесите его на счет владельца. Здесь сам контракт не должен содержать какое-либо количество эфира. Примечание: здесь функция Send должна быть помечена как payable.

person Iftifar Taz    schedule 10.02.2019
comment
Ладно, я понял. Итак, теперь я просто хочу отправить немного эфира со своего адреса на свой адрес, разве это не возможно? - person Daniel kuo; 11.02.2019
comment
Да. Теоретически это возможно. Но мне интересно, а зачем вам это? - person Iftifar Taz; 11.02.2019
comment
Пожалуйста, научите меня, как это сделать. Я новичок в Solidity, и я просто хочу сделать как привет, мир! простое кодирование. Так что у меня есть идея сделать это. - person Daniel kuo; 11.02.2019
comment
Найдите несколько руководств на udemy или blockgeeks или подобные веб-сайты. здесь хорошее место для начала. - person Iftifar Taz; 11.02.2019
comment
ХОРОШО. Большое спасибо. Я попробую. - person Daniel kuo; 11.02.2019