Я пытаюсь отправить значение строкового параметра методу 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.
Ваш метод изменяет состояние контракта (цепочки блоков), что означает, что вы не можете получить какие-либо значения, поскольку к моменту возврата вызова транзакция (вызов метода) может быть не добыта (нет вычисленного идентификатора для возврата).
Вы получите хэш транзакции и должны дождаться выполнения кода (майнинга). Только тогда вы сможете получить идентификатор, вызвав метод, который выполняет только операцию чтения контракта.
Вам также необходимо назначить стоимость транзакции в газе для вызова, поскольку вы просите майнера выполнить ее для вас. Используйте geth IPC, так как это гораздо менее громоздко, чем бросать объекты JSON клиенту:
entityContract.insert("my_string", {from:eth.accounts[0],gas:100000000});
где entityContract — экземпляр контракта, созданный на основе его ABI и адреса.
Абхишек Ранджан
Себи
Абхишек Ранджан
Себи
returnId
изuint32 returnId
. Нет, вы по-прежнему выполняете вычисления в цепочке блоков, поэтому кто-то должен платить за эти тактовые циклы, даже если результат не сохраняется в цепочке блоков (вы должны платить как за хранение, так и за выполняемые инструкции).Абхишек Ранджан
Абхишек Ранджан
Себи
Абхишек Ранджан
Абхишек Ранджан