enviando el valor del parámetro de cadena al método de solidez

Estoy tratando de enviar el valor del parámetro de cadena a un método de solidez, pero no puedo obtener el valor de retorno. este es mi código de solidez:

contract Entity{
    event Entities(string name);
    struct Entity{
        string name;
    }
    uint32 public entityId;
    mapping(uint32 => Entity) entities;
    function insert(string name) returns (uint32 returnId){
         returnId = ++entityId;
         entities[returnId] = Entity(name);
         Entities(name);
         return returnId;
    }
}

y así es como intento interactuar con él a través de la API JSON RPC

curl --data '{"jsonrpc":"2.0","method": "eth_call", "params": [{"from": "0xec1466c6fa38de0506e14fe8e5b51e95d3f80b11","to":"0xbd46d45c440ae02a76938043af18cc75ac569e4b","data":"0xb1498e29456e746974792042000000000000000000000000000000000000000000000000"}], "id": 6}'

Obtengo 0x como resultado.

Respuestas (1)

Su método cambia el estado del contrato (cadena de bloques), lo que significa que no puede obtener ningún valor, ya que cuando la llamada devuelve la transacción (llamando al método) es posible que no se haya extraído (no hay una identificación computada para devolver).

Obtendrás el hash de la transacción y deberás esperar hasta que el código sea ejecutado (minado). Solo entonces puede obtener la identificación llamando a un método que solo realiza una operación de lectura sobre el contrato.

También debe asignar un costo en gas a la transacción de la llamada, ya que le está pidiendo a un minero que lo ejecute por usted. Use el IPC geth ya que es mucho menos engorroso que arrojar objetos JSON al cliente:

entityContract.insert("my_string", {from:eth.accounts[0],gas:100000000});

donde entityContract es una instancia de contrato creada a partir de su ABI y dirección.

En caso de enviar una transacción, debe extraerse si no me equivoco, pero aquí solo estoy llamando al método que básicamente debería haber devuelto algún valor, pero eso no está sucediendo.
Está cambiando el estado del contrato en su método al incrementar el Id. de entidad.
esto sucederá básicamente internamente, pero como no estoy enviando ninguna transacción, el estado no cambiará y volverá al original, supongo.
En su contrato elimine returnIdde uint32 returnId. No, todavía está haciendo cálculos en la cadena de bloques, por lo que alguien tiene que pagar por esos ciclos de reloj, incluso si el resultado no se almacena en la cadena de bloques (tiene que pagar tanto por el almacenamiento como por las instrucciones ejecutadas).
El pago de lo que está mencionando, creo que blockchain lo hace automáticamente si no lo menciona en el código.
Y con los parámetros uint32 está funcionando, esto es solo un problema con los tipos de datos dinámicos. Probé solo una cadena, pero sigo pensando
No, no lo hace. Debe especificar el saldo manualmente.
Intenté mencionar el gas para una solicitud particular, pero aún así la respuesta es la misma.