Я пытаюсь вызвать функцию в одном контракте из другого контракта со следующим простым примером:
Без названия.sol:
pragma solidity ^0.4.16;
contract helloworld {
function returnint() returns (uint) {
return 15;
}
}
И второй контракт:
pragma solidity ^0.4.16;
import "./Untitled.sol";
contract pullother {
function callFunctionInContractOne (address _address) returns (uint) {
helloworld contractOne = helloworld(_address);
contractOne.returnint();
}
}
При вызове во втором контракте в качестве параметра задается callFunctionInContractOne()
адрес деплоя , затем вызывается функция в первом контракте (которая должна вернуть 15). Когда я пробую это в редакторе ремиксов, вместо этого я получаю следующее:Untitled.sol
returnint()
Я копирую вызов простой функции из другого контракта , но получаю другой результат. Я также пытался аналогичным образом запустить функцию одного контракта из другого в частном блокчейне, но безуспешно.
Добавляя возвращаемое значение, я получаю то же самое:
Фактически вы отправили TX, который вызывает метод первого смарт-контракта, вызывающий функцию второго смарт-контракта. Дело в том, что вы находитесь в реальном блокчейне — мне кажется, это Ropsten — а не в памяти вашего компьютера, поэтому вы не можете получить значения из такого контракта. То, что вам возвращает ремикс, — это квитанция о транзакции после того, как блок отчеканен.
Если вы хотите, чтобы приложение ÐApp могло извлекать значения непосредственно из контракта, создайте функции с расширением constant returns
. Обратите внимание, что скоро эта константа будет разделена на view
и pure
.
Вы должны добавить возвращаемое значение для callFunctionInContractOne
функции следующим образом:
contract pullother {
function callFunctionInContractOne (address _address) returns (uint) {
helloworld contractOne = helloworld(_address);
return contractOne.returnint();
}
}
Проверяем, что все в порядке. Результат:
Надеюсь поможет~
ЧжоуВ
БинГоБинБин
constant
дляcallFunctionInContractOne
функции, попробуйте.function callFunctionInContractOne (address _address) constant returns (uint) { helloworld contractOne = helloworld(_address); return contractOne.returnint(); }