Столкнулся с очень непонятной для меня проблемой. Есть два простых контракта:
contract Test1 {
int128 public val;
function getVal() view public returns(int128) {
return val;
}
function setVal( int128 _val ) public {
val = _val;
}
}
contract Test2 {
address public the1;
function setTest1( address _adr ) public {
the1 = _adr;
}
function setVal( int128 _val ) public {
Test1( the1 ).setVal( _val );
}
function getVal() view public returns(int128) {
return Test1( the1 ).getVal();
}
}
Значение поля Test1.val, которое вы можете изменить, вызывая функцию setVal в контракте Test1 и вызывая ту же функцию в Test2 (конечно, после установки адреса первого контракта во втором Test2.setTest1)).
В Remix и тестах (ganache) - все работает как положено. Но в частной сети (реализованной через Geth) у меня возникают проблемы: когда я вызываю Test2.setVal - значение изменяется; когда я вызываю Test2.getVal - не работает . Я звоню через web3j
test2.setVal( BigInteger.valueOf(30)).send();
result = test2.getVal().send(); // (1)
В точке (1) есть исключение:
ContractCallException: Emtpy value (0x) returned from contract.
Понятия не имею, что с этим не так. Механизм вызова функции из другого договора довольно прост. Но я не могу понять, что я делаю неправильно.
И я попытался вызвать функции контракта через geth-console. В этом случае ошибки нет, а просто Test2.getVal () возвращает 0.
Буду благодарен за любые идеи!
UPDATE. Это тест (я использовал тест Ферита)
const TEST_1 = artifacts.require('Test1.sol');
const TEST_2 = artifacts.require('Test2.sol');
contract('Ferit Test1', function (accounts) {
let test1;
let test2;
beforeEach('setup contract for each test case', async () => {
test1 = await TEST_1.at("…");
test2 = await TEST_2.at("…");
})
it('test1', async () => {
await test1.setVal(333);
let result = await test1.getVal();
console.log( "-> test1.getVal=" + result );
assert(result.toNumber(), 333 );
})
it('test2', async () => {
await test2.setVal(444);
let result = await test2.getVal(); // (!!!) return 0
console.log( "-> test2.getVal=" + result );
assert(result.toNumber(), 444);
})
})