La función de solidez no regresa: sigue regresando el recibo de tx

Intento llamar a mi función Solidity:

function getVehicleDetails(string _vin) returns (string _vln, uint _year, string _make, string _model, string _colour) {
    Vehicle vehicle = vehicles[_vin];
    if (vehicle.year == 0)
        throw;

     _vln = vehicle.vln;
    _year = vehicle.year;
    _make = vehicle.make;
    _model = vehicle.model;
    _colour = vehicle.colour;
}

Aquí está el comando geth:

instance.getVehicleDetails("vin_101",{from:web3.eth.accounts[1]})

devoluciones"0x6cf98ab5b77bfa0397ee6eaa046f85a133c5a3ef636c59a56b4308dc73fb20fd"

es decir, ¡sigue devolviendo un recibo de tx!

Así es como creo un vehículo:

function setVehicleDetails(string _vin, string _vln, uint _year, string _make, string _model, string _colour) owneronly {
    Vehicle vehicle = vehicles[_vin];
    if (vehicle.year == 0)
        throw;
    vehicle.vln = _vln;
    vehicle.year = _year;
    vehicle.make = _make;
    vehicle.model = _model;
    vehicle.colour = _colour;
}

Llamo a esto en geth con:

instance.registerVehicle("vin_101","vln_101",2004,"ferrari","convertible","black",{from:web3.eth.accounts[0],gas:4000000})

¿Qué estoy haciendo mal?

¡Todo lo que quiero hacer es leer los valores devueltos getVehicleDetailsy simplemente se niega a hacerlo!

estoy testrpcen

Respuestas (3)

Como esta es una función no paga. Siempre llame a estas funciones con la palabra clave call y no solo con el nombre de la función. Solo las llamadas devolverán valores.

Formato si la llamada: Contract.getVehicleDetails.call(params)

Las funciones en Solidity siempre devuelven hash de transacción. Puede utilizar funciones constantes para devolver valores. El constant functionsno puede cambiar el estado del contrato.

Si necesita cambiar el estado del contrato en una función y también desea devolver algún valor, los eventos son la mejor solución posible AFAIK.

Puede usar eventos para obtener valores de una función no constante.

Entiendo que. Gracias por la aclaración. Debido a que alguien más escribió Solidez, no pude agregar la constantpalabra clave. Entonces, usé "llamar" en su lugar. instance.getVehicleDetails.call("vin_101",{from:web3.eth.accounts[0]})¡Estoy resolviendo esto de la manera difícil!
Usar callno te ayudará. Calles similar a sendsimplemente no crear una transacción y publicarla en la cadena de bloques. No hay diferencia en la forma en que call y send invocan la función.
No estoy de acuerdo. En la cadena de bloques (a diferencia de los compiladores de Solidity en el navegador, como browser-solidity), existe una diferencia definitiva entre usar "call" y no usarlo. Sin "llamada", no se devuelven parámetros de devolución, solo un recibo de tx. Con "llamar", obtienes los parámetros devueltos. Una cosa que podría hacer es usar la palabra clave "constante" en su función Solidity. Si está usando browser-solidity, no tiene que preocuparse por este matiz. Aunque encontré esto muy confuso: el código funcionó bien en la solidez del navegador, pero no en una cadena de bloques real...

Debe usar la función constante para devolver cualquier valor de la función de solidez. La función constante viene con la limitación de que no puede cambiar el estado del contrato (no puede cambiar el valor de ninguna variable de estado) en la función constante.

Aquí está el ejemplo de función constante y llamada a función constante desde JS.

contract MyNumber{

    uint public num1 = 1;

    function getNumber() constant returns (uint){
        return num1 ;
    }

}

Para llamar a esta función, use call() en lugar de sendTransaction() aquí está el ejemplo

var contract = web3.eth.contract(abi).at(contractAddress);    
contract.getNumber.call();

nuevamente, si desea obtener los valores de la función que cambia el estado del contrato, puede usar eventos y devolución de llamada de eventos Para obtener más información sobre el uso de eventos y devolución de llamada de eventos, consulte el código en esta PREGUNTA