Получение добытых блоков вместо предполагаемых возвращаемых значений - PullRequest
0 голосов
/ 25 апреля 2019

Я только что развернул смарт-контракт с помощью кошелька ethereum.Я получил адрес Smart Contract, я скопировал его ABI из ремикса и проверил его на кошельке ethereum, он был активен, и я мог видеть все его методы.

Затем я попытался вызвать его с моего сервера nodejs. Я сделалэто, я не получил никакой ошибки ... Но вместо классического ответа, такого как возвращенные значения методов ниже, я получил добытые блоки .... и это очень странно, я думаю ... Как я должен получитьвывод методов (возврат)?

После этого я попытался развернуть другой контракт, на этот раз очень простой с тем же именем методов, умным именем контракта, параметрами, но без кода внутри методов, только базовый хард-кодированное возвращение. Когда я также развернул этот контракт, я получил тот же самый заминированный адрес смарт-контракта ... что странно, на мой взгляд ...

Я использовал 1.0.0-бета.46, nodejs, expressjs Когда я сказал eth wallet, я имел в виду ... этот веб-сайт, созданный с помощью puppeth, на странице / # wallet

Вот базовый смарт-контракт, который я пытался развернуть во второй раз.так же, как первый умный контракт.

Прагма солидность> = 0,4.22 <0,6,0; </p>

контракт BasicContract {

function function1(uint16 a,uint16 b,uint16 c,uint16 d) external payable returns(uint256){
    //a,b,c,d doesn't matter
    return 68;
}


//buy a ticket
function function2(uint128 a,uint16 b) external payable returns(uint128){
    //a,b doesn't matter
    return 94;
}

function function3(uint128 a) external payable returns(bool){
    //a doesn't matter
    return false;
}

}

1 Ответ

0 голосов
/ 25 апреля 2019

Существует два способа вызова функции в смарт-контракте: через транзакцию, отправленную в сеть, или через локальную call.

Транзакции не имеют возвращаемых значений.То, что вы получаете из библиотеки, которую используете для выполнения транзакции, обычно является хешем транзакции.Любое возвращаемое значение из вызванной вами функции отбрасывается.

Локальное call не включает транзакцию в сеть и, следовательно, не может изменить любое состояние.Но он дает возвращаемое значение.

Какой метод выбран по умолчанию для большинства библиотек, зависит от того, изменяется функция или нет.Если вы пометите свои функции как view или pure, это скажет библиотеке, что эти функции не изменяют состояние и затем могут безопасно просто call редактироваться локально, чтобы получить возвращаемое значение.Таким образом, простое «исправление» для приведенного выше кода - сделать эти функции pure.Для функций, которые делают изменения состояния, вам нужно переключиться с использования значений return на генерацию событий, которые можно прочитать после завершения транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...