Oye, ¿alguien puede ayudarme a descubrir por qué esta función devuelve 0 cuando la llamo? La función no arroja ningún error cuando le envío una transacción, pero el Ether no se envía y las variables no están configuradas.
function payout() returns (uint) {
if (projectPaid) {return 3; }
projectPaid = true;
if (!msg.sender.send(amountRaised)) {
projectPaid = false;
return 4;
}
return 5;
}
Aquí está la llamada web3/trufa
var projectToFund = document.getElementById("payout").value;
var thisProject = Project.at(projectToFund);
thisProject.payout.call({from: account, gas:200000}).then(function(_result) {
console.log(_result.valueOf());
no se compilará return 5;
fuera de la función.
Así que consideremos:
function payout() returns (uint) {
if (projectPaid) {return 3; }
projectPaid = true;
if (!msg.sender.send(amountRaised)) {
projectPaid = false;
return 4;
}
// return 5;
si proyectoPagado ??? No.
si enviar () falló ??? No.
No se devolvió nada si el envío funcionó, por lo que 0.
Función sencilla:
bool projectPaid;
uint amountRaised;
function payout() returns(bool success) {
if(projectPaid) return false;
projectPaid = true;
if(!msg.sender.send(amountRaised)) {
projectPaid = false;
return false;
}
return true;
}
Espero eso ayude.
call()
no emite una transacción, por lo que no es necesario esperar a la minería.Supongo que está utilizando web3.js para enviar transacciones llamando a su función. Esto no admite valores de retorno.
Puede obtener el valor de retorno solo cuando llama a esta función desde otro contrato o la llama como ctr.payout.call()
(tenga en cuenta que en el último caso, la función no puede cambiar el estado del contrato).
Consulte estas preguntas para obtener más información:
Es posible utilizar eventos para realizar un seguimiento de los valores de retorno.
Aquí está el contrato de prueba y geth
la sesión de ejemplo:
x.sol
pragma solidity ^0.4.0;
contract Test {
bool public projectPaid = false;
uint public amountRaised = 0;
function payout() returns (uint) {
if (projectPaid) return 3;
projectPaid = true;
if (!msg.sender.send(amountRaised)) {
projectPaid = false;
return 4;
}
return 5;
}
}
consola geth
var x_sol_testContract = web3.eth.contract([{"constant":false,"inputs":[],"name":"payout","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"amountRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"projectPaid","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"}]);
var x_sol_test = x_sol_testContract.new(
{
from: web3.eth.accounts[0],
data: '0x60606040526000805460ff19168155600155341561001957fe5b5b61014d806100296000396000f300606060405263ffffffff60e060020a60003504166363bd1d4a81146100375780637b3e5e7b14610059578063c2e39a731461007b575bfe5b341561003f57fe5b61004761009f565b60408051918252519081900360200190f35b341561006157fe5b610047610112565b60408051918252519081900360200190f35b341561008357fe5b61008b610118565b604080519115158252519081900360200190f35b6000805460ff16156100b35750600361010f565b6000805460ff1916600190811782555460405173ffffffffffffffffffffffffffffffffffffffff33169282156108fc02929190818181858888f19350505050151561010b57506000805460ff19169055600461010f565b5060055b90565b60015481565b60005460ff16815600a165627a7a723058205acabc04fdd5e478a5e40215426abb624ec48fea0ef750e4e6a0f14cb328dbe90029',
gas: '4700000'
})
x_sol_test.payout.call()
Intente ejecutar esto y vea si regresa 5
. Yo mi caso lo hace.
projectToFund
contiene una dirección válida (o tal vez apunta a algún contrato obsoleto).
max taldykin
etéreo