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 getVehicleDetails
y simplemente se niega a hacerlo!
estoy testrpc
en
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 functions
no 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.
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
amor
constant
palabra 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!Prashant Prabhakar Singh
call
no te ayudará.Call
es similar asend
simplemente 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.amor
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á usandobrowser-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...