¿Puedo enviar ethereum a un contrato fuera de su constructor?

¿Cómo financio contratos de Solidity con Ether? El ejemplo en las preguntas frecuentes de Solidity, http://solidity.readthedocs.io/en/develop/frequently-asked-questions.html#store-ether-in-a-contract , financia un contrato a través del constructor del contrato. ¿Puedes hacer lo mismo fuera del constructor?

Algunos antecedentes; Quiero un contrato para poder enviar Ether a la dirección de alguien a través de algo comorecipient.send(169000000000000000000);

De todos modos, aquí está la salida de mi gethconsola:

>eth.getBalance(eth.coinbase)
169531250000000000000

Así que tengo ~169 Ether para jugar. ¡Excelente! Así que probé esto:

contract A {
    function fund() public {
        Funded(msg.sender,msg.value);
    }    
}

Que luego quise financiar con la siguiente llamada .js:

const exchangerContract = web3.eth.contract(exchangerAbi)
const contractAddress = '0x0d2bbe5af1fa1eaebc5ad6e27aa27a7328dc58bc'
const contract = exchangerContract.at(contractAddress)
contract.fund({from: web3.eth.accounts[0], value: web3.toWei(100,"ether")})

Desafortunadamente, eso no parece funcionar; Obtengo lo siguiente cuando cargo la consola:

>eth.getBalance('0x0d2bbe5af1fa1eaebc5ad6e27aa27a7328dc58bc')
0

Entonces, preguntándome si mi .js estaba defectuoso, probé lo mismo en la consola:

>eth.sendTransaction({from: eth.coinbase, to: '0x0d2bbe5af1fa1eaebc5ad6e27aa27a7328dc58bc', value: web3.toWei(100, "ether")})
"0x136ae6919bd2640425b03633b6709c3863d96600da6ca0c61956f694bbe62384"
>eth.getBalance('0x0d2bbe5af1fa1eaebc5ad6e27aa27a7328dc58bc')
0

Boo :( ¡Entonces me pregunté si era posible enviar Ether! Pero:

>personal.newAccount()
Passphrase: 
Repeat passphrase: 
"0x5e610b6696683e1c4173bd949279fd6127d8b808"
> eth.getBalance(eth.coinbase)
169531250000000000000
> eth.getBalance(eth.accounts[1])
0
> eth.sendTransaction({from: eth.coinbase, to: eth.accounts[1], value: web3.toWei(169, "ether")})
"0x136ae6919bd2640425b03633b6709c3863d96600da6ca0c61956f694bbe62384"
> eth.getBalance(eth.accounts[1])
169000000000000000000

Después de todo, parece que puedo enviar Ether a una dirección sin contrato. ¡Uf!

¿Cómo hago lo mismo con las direcciones de contrato?

Respuestas (1)

, se puede enviar ether a un contrato fuera de su constructor.

La forma recomendada es invocar una función en el contrato (recepción de Ether/la función de respaldo) , y la función puede hacer más en lugar de simplemente registrar un evento .

Desde Solidity 0.4 , el payablemodificador debe adjuntarse a la función o función alternativa.

Se podría realizar la función de respaldo payable, pero eso significa que otras personas pueden enviar accidentalmente ether al contrato. Este tipo de elimina el beneficio de payable, que Solidity agregó para que los contratos no tuvieran que implementar su propio modificador para rechazar ether y adjuntarlo a la mayoría de sus funciones.

Las funciones que quieran recibir Ether deben especificar el nuevo modificador pagadero (de lo contrario, arrojan).

Los contratos que desean recibir Ether con un simple "envío" deben implementar una función de respaldo con el modificador pagadero. Los contratos ahora se lanzan si no se define una función de respaldo pagable y ninguna función coincide con la firma.

¡Hurra! ¡Buena esa! Así que esto funciona: function() payable { Funded(msg.sender, msg.value); } Y luego llamarlo de esta manera: web3.eth.sendTransaction({from: adminAccount, to: contractAddress, value: web3.toWei(100,"ether")}) ...financia el contrato con 100 Ether :) ¡Gracias!
Con respecto a: "La función de respaldo podría hacerse pagadera, pero eso significa que otras personas pueden enviar accidentalmente ether al contrato". ¿Podría evitarse agregando el onlyOwnermodificador a la función de respaldo (como se describe aquí: solidity.readthedocs.io/en/develop/contracts.html )?
Sí, agregar otro modificador como onlyOwnerpuede evitar que otras direcciones envíen ether.