отправка значения строкового параметра в метод Solidity

Я пытаюсь отправить значение строкового параметра методу Solidity, но не могу получить возвращаемое значение. это мой код прочности:

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;
    }
}

и вот как я пытаюсь взаимодействовать с ним через JSON RPC API

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

В результате я получаю 0x.

Ответы (1)

Ваш метод изменяет состояние контракта (цепочки блоков), что означает, что вы не можете получить какие-либо значения, поскольку к моменту возврата вызова транзакция (вызов метода) может быть не добыта (нет вычисленного идентификатора для возврата).

Вы получите хэш транзакции и должны дождаться выполнения кода (майнинга). Только тогда вы сможете получить идентификатор, вызвав метод, который выполняет только операцию чтения контракта.

Вам также необходимо назначить стоимость транзакции в газе для вызова, поскольку вы просите майнера выполнить ее для вас. Используйте geth IPC, так как это гораздо менее громоздко, чем бросать объекты JSON клиенту:

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

где entityContract — экземпляр контракта, созданный на основе его ABI и адреса.

В случае отправки транзакции она должна быть добыта, если я не ошибаюсь, но здесь я просто вызываю метод, который в основном должен был вернуть какое-то значение, но этого не происходит.
Вы изменяете состояние контракта в своем методе, увеличивая entityId.
в основном это произойдет внутри, но поскольку я не отправляю никаких транзакций, состояние не изменится, и я полагаю, оно вернется к исходному состоянию.
В вашем контракте удалите returnIdиз uint32 returnId. Нет, вы по-прежнему выполняете вычисления в цепочке блоков, поэтому кто-то должен платить за эти тактовые циклы, даже если результат не сохраняется в цепочке блоков (вы должны платить как за хранение, так и за выполняемые инструкции).
То, что вы упоминаете, я думаю, что блокчейн автоматически делает это, если вы не упомянули в коде.
И с параметрами uint32 это работает, это проблема только с динамическими типами данных, я пробовал только строку, но все же думаю
Нет. Необходимо указать баланс вручную.
пытался с упоминанием газа для конкретного запроса, но все равно ответ тот же