Контракт Не отправка эфира на другой счет

Я создал контракт, в котором хранятся адреса пользователей, и я хочу отправить 1 эфир всем пользователям, хранящимся в массиве.

Вот мой код

contract project{

    address public user;
    bytes32[10] name;
    address[10] customer;
    uint public i=0;
    function project(){
        user=msg.sender;
    }



    function add(bytes32 _name){
        name[i]=_name;
        customer[i]=msg.sender;
        i++;
    }

    function get_address() constant returns(address[10]){
        return customer;
    }

    function reward() {
        for(uint i=0;i<10;i++)
        {
            customer[i].send(1);
        }

    }

}

Когда я вызываю метамаску вознаграждения метода, выполняется транзакция, но эфир не передается.

Пожалуйста, помогите мне.

Ответы (1)

Вы пытаетесь заставить контракт отправить средства, которых у него нет. Для этого нужен эфир. Баланс будет начинаться с 0, поэтому вам нужно добавить function() payable{}и отправить немного эфира для работы.

Я отметил часть кода *** unsafe ***, чтобы избежать недоразумений. Есть более глубокие опасения по поводу обращения с деньгами таким образом. Хорошим следующим шагом будет проверка успеха/неудачи операции send(), а затем ответная реакция по-другому. У меня он выдает сообщение об ошибке или сообщение об успехе.

Я добавил несколько эмиттеров событий, чтобы вы могли видеть, что происходит.

Надеюсь, поможет.

contract project{

  address public user;
  bytes32[10] name;
  address[10] customer;
  uint public i=0;

  event LogDep (address sender,    uint amount, uint balance);
  event LogSent(address recipient, uint amount, uint balance);
  event LogErr (address recipient, uint amount, uint balance);

  function project(){
    user=msg.sender;
  }

  function depositFunds() public payable returns(bool success) {
    LogDep(msg.sender, msg.value, this.balance); 
    return true;
  }

  function add(bytes32 _name){
    name[i]=_name;
    customer[i]=msg.sender;
    i++;
  }

  function get_address() constant returns(address[10]){
    return customer;
  }

  function reward() {
    for(uint i=0;i<10;i++)
    {

        // *** unsafe pattern ***

        if(customer[i].send(1)) {
            LogSent(customer[i], 1, this.balance);
        } else {
            LogErr(customer[i], 1, this.balance);
        }
    }
  }
}

Вот он в ремиксе, чтобы показать, как он работает.

Если вы еще не видели Remix, перейдите сюда https://ethereum.github.io/browser-solidity и просто вставьте код в компилятор. Вы можете взаимодействовать с контрактными функциями.

Шаг 1: Создайте контракт

введите описание изображения здесь

Шаг 2: Отправьте контракту немного средств

10 вэй достаточно, чтобы отправить 1 всем 10 клиентам. Если вы отправите меньше, вы начнете видеть неудачные отправки на шаге 3.

введите описание изображения здесь

введите описание изображения здесь

Шаг 3: отправьте txn на вознаграждение()

Обязательно НЕ отправляйте wei/eth на этот раз, потому что эта функция не подлежит оплате.

введите описание изображения здесь

Он показывает LogErr, когда я называю вознаграждение. Подскажите, как мне отправить эфир с одного адреса на другой?
Добавил несколько скриншотов к моему исходному ответу. Не уверен, что вы использовали Remix раньше. Это стоит того.
У вас есть возможность проголосовать или принять (или и то, и другое), если ответ полезен. ;-) Спасибо.
Итак, вы говорите, что если мы хотим отправить эфир на другой счет, мы должны отправить эфир на контракт. А затем используйте функцию отправки.
Да. Контракт не может тратить никакие средства, кроме собственных. Таким образом, вы можете заключить убедительно честный контракт с очевидной функцией. Затем пользователи могут доверить контракту выполнение своей функции за счет своих средств. Невозможно заключить контракт, который тратит средства со счета другой стороны.
Большой! Я понимаю, что это ранние исследования. Просто чтобы помочь вам, это объясняет опасения по поводу «небезопасного шаблона». На данном этапе может быть непонятно, но со временем это будет полезно: github.com/ConsenSys/smart-contract-best-practices/…