Las funciones send() o transfer() siempre fallan

Creé algunos códigos a continuación

solidez de pragma ^0.4.19;

contract SendAndTransferExample {

    function SimpleSendToAccount() public returns(bool) {
       return msg.sender.send(10000000000000000000);
    }

    function SimpleTransferToAccount() public {
       msg.sender.transfer(10000000000000000000);
    }
}

Ejecuté ambas funciones usando JavaScript vm y ese resultado siempre fue el mismo. primer resultado cuando ejecuté la función enviar () ingrese la descripción de la imagen aquíy el siguiente resultado cuando ejecuté la función transferir ()ingrese la descripción de la imagen aquí

transact to SendAndTransferExample.SimpleTransferToAccount errored: VM error: revert.
revert  The transaction has been reverted to the initial state.
Note: The constructor should be payable if you send value.  Debug the transaction to get more information. 

No tengo idea de lo que estaba mal. Que alguien me ayude por favor.

Parece que está intentando transferir ETH del contrato al msg.sender. ¿El contrato incluye algún ETH para enviar? Como sugiere el mensaje de error, podría agregar una función de constructor u otra función de pago que permita que el contrato acepte ETH, que luego podría enviar.
Intenté poner ETH en contrato y obtuve un error. Error de máquina virtual: revertir. revert La transacción ha sido revertida al estado inicial. Nota: El constructor debe pagar si envía valor. Depure la transacción para obtener más información.
¿Y cómo puedo agregar un constructor o una función de pago que permita eso?

Respuestas (2)

Prueba esto para tu contrato:

pragma solidity ^0.4.24;

contract SendAndTransferExample {

    constructor() public payable { }

    function SimpleSendToAccount() public returns(bool) {
       return msg.sender.send(10000000000000000000);
    }

    function SimpleTransferToAccount() public {
       msg.sender.transfer(10000000000000000000);
    }

    function() public payable { }
}

Aquí he añadido 2 funciones:

  1. Una constructor()función que se ejecuta solo una vez, justo cuando se crea el contrato. Puede usar esta función para inicializar variables, como quién es el propietario del contrato y otros valores globales. En este caso, hicimos la función payable, lo que significa que puede aceptar ETH. Entonces, durante la creación del contrato, puede pasar ETH como msg.valuey luego de la creación del contrato, el ETH se aceptará en el contrato como parte de su saldo.

  2. Una función alternativa ( function()) que se ejecuta cada vez que llama al contrato, y ninguna de las otras funciones coincide con el identificador de función, o cuando no se proporcionaron datos. Esto significa que simplemente puede enviar ETH al contrato y, debido a que la función de respaldo también es payable, aceptará ese ETH.

Usando cualquiera de estas funciones, debería poder enviar a su contrato suficiente ETH para que sus otras funciones funcionen.

¡Debe dedicar algún tiempo a leer la documentación de solidez que trata sobre estos dos temas y mucho más!

Será algo así:

function send(address _receiver) payable {
_receiver.send(msg.value);

}

Su método debe ser pagadero para enviar ether.

NB address.send(value) y address.transfer(value) ambos son iguales, excepto que el envío no genera una excepción en caso de falla y consume todas las tarifas de transacción y la excepción de generación de transferencia .

Esto no es exacto. Una función NO necesita ser payablepara enviar ether. Sólo para recibir éter.
Para realizar el envío o la transferencia en un contrato inteligente, el método debe recibir ether del invocador del método, que se encuentra aquí msg.value.
Está haciendo suposiciones sobre lo que la función del usuario está tratando de hacer. Aquí ha creado una función que reenvía ETH a otra dirección. En este caso, su función tiene sentido, pero eso no es necesariamente lo que el usuario está tratando de hacer, y la declaración que hace no es cierta en general.