La llamada a la función devuelve 0

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());
¿Has resuelto esto? ¿Puede por favor arrojar algo de luz sobre cuál fue el problema real?
Entonces parecía que estaba configurando la variable con uint y uint256 (en diferentes puntos de la aplicación). Parecía arreglarse cuando cambié todas las variables a uint256.

Respuestas (2)

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.

Hola, lo siento Rob, olvidé agregar el punto y coma de cierre, edité la pregunta para que coincida con lo que tengo en solidez.
Entonces, cuando comento cada línea y solo trato de devolver un uint como 5, devuelve 0, cuando intento devolver verdadero, devuelve falso.
Parece que no estás esperando a que se extraiga la transacción. Eche un vistazo a este código que he usado con éxito para un buen patrón. gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6
Ok, en realidad estoy haciendo una llamada () y luego intento la transacción, pero ¿debería esperar a que también se extraiga la llamada ()? ¿Sabe cómo analizar el recibo de la transacción cuando se extrae?
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 gethla 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.

No estoy seguro de lo que quiere decir con que web3 no admite valores de retorno. Web3 es cómo los front-end obtienen datos de las funciones del contrato.
Lo siento, quiero decir que no es posible obtener valor de retorno al enviar una transacción desde web3. Actualicé mi respuesta.
Ok, de hecho estoy tratando de usar call () y está devolviendo 0 ... Agregué la llamada web3
Agregué una sesión de consola geth de ejemplo. Compruebe que projectToFundcontiene una dirección válida (o tal vez apunta a algún contrato obsoleto).