Contrato No enviar ether a otra cuenta

Creé un contrato que almacena la dirección de los usuarios y quiero enviar 1 éter a todos los usuarios almacenados en la matriz.

Aquí está mi código

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);
        }

    }

}

Cuando llamo al método de recompensa, metamask ejecutó la transacción pero el éter no se transfirió.

Por favor, ayúdame.

Respuestas (1)

Está tratando de hacer que el contrato envíe fondos que no tiene. Necesita éter para extraer. El saldo comenzaría en 0, por lo que debe agregar un function() payable{}y enviar algo de éter para trabajar.

He marcado una sección del código *** unsafe ***para evitar malentendidos. Hay preocupaciones más profundas sobre el manejo del dinero de esta manera. Un buen siguiente paso es verificar el éxito/fallo de la send()operación y luego responder de manera diferente. Lo tengo emitiendo un mensaje de falla o un mensaje de éxito.

Agregué algunos emisores de eventos para que puedas ver lo que está pasando.

Espero eso ayude.

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);
        }
    }
  }
}

Aquí está en Remix para mostrar su funcionamiento.

Si no ha visto Remix antes, vaya aquí https://ethereum.github.io/browser-solidity y simplemente pegue el código en el compilador. Puede interactuar con las funciones del contrato.

Paso 1: Crear el contrato

ingrese la descripción de la imagen aquí

Paso 2: envíe el contrato algunos fondos

10 wei es suficiente para enviar 1 a los 10 clientes. Si envía menos, comenzará a ver envíos fallidos en el Paso 3.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Paso 3: envía txn a la recompensa ()

Asegúrese de NO enviar wei/eth esta vez, porque esta función no es de pago.

ingrese la descripción de la imagen aquí

Muestra LogErr cuando llamo a la recompensa. ¿Puede decirme cómo puedo enviar ether de una dirección a otra?
Agregué algunas capturas de pantalla a mi respuesta original. No estoy seguro de haber usado Remix antes. Vale la pena.
Tiene las opciones de votar o aceptar (o ambas) si la respuesta es útil. ;-) Gracias.
Entonces, ¿qué dices que si queremos enviar ether a otra cuenta, tenemos que enviar ether al contrato? Y luego use la función de envío.
Sí. El contrato no puede gastar fondos excepto los propios. Entonces, puede hacer un contrato convincentemente honesto con una función obvia. Luego, los usuarios pueden confiar en que el contrato realizará su función con sus fondos. No es posible hacer un contrato que gasta de la cuenta de otra parte.
¡Excelente! Me doy cuenta de que son exploraciones tempranas. Solo para ayudarlo, esto explica las preocupaciones sobre el "patrón inseguro". Puede que no esté claro en esta etapa, pero será útil con el tiempo: github.com/ConsenSys/smart-contract-best-practices/…