У меня есть контракт, который выглядит так:
contract MainContract is usingOraclize {
...
address minter;
uint public returnRate;
...
function MainContract(uint _returnRate) {
minter = msg.sender;
returnRate = returnRate;
oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS);
}
modifier onlyMinter {
if (msg.sender != minter) throw;
_;
}
function updateReturnRate(uint newReturnRate) onlyMinter {
returnRate = newReturnRate;
}
...
}
Я развернул его в тестовой сети: https://testnet.etherscan.io/address/0x5cad3cbdbf64b65174b36269f5201d3265569f2b .
Однако, когда я пытаюсь получить значение переменной returnRate, я получаю, что оно не определено, хотя оно должно было быть установлено при создании контракта. Затем я попытался обновить его с помощью функции updateReturnRate, но он все еще не определен. И я не могу объяснить, почему...
Должен ли я указывать функцию как общедоступную? Тем не менее, почему значение не было установлено при создании контракта?
Я использую компилятор солидности браузера для тестирования.
После беглого просмотра ваш контракт работает нормально. Я думаю, что с Browser Solidity определенно что-то не так.
Обычно я занимаюсь разработкой с Truffle , поэтому быстро сделал проект Truffle по вашему контракту (ниже)
pragma solidity ^0.4.4;
contract MainContract {
address minter;
uint public returnRate;
function MainContract(uint _returnRate) {
minter = msg.sender;
returnRate = _returnRate;
}
modifier onlyMinter {
if (msg.sender != minter) throw;
_;
}
function updateReturnRate(uint newReturnRate) onlyMinter {
returnRate = newReturnRate;
}
}
Я скомпилировал контракт и развернул его:
И проверил это в консоли. Вот результат:
truffle(default)> var c = MainContract.deployed()
truffle(default)> c.returnRate.call()
{ [String: '20'] s: 1, e: 1, c: [ 20 ] }
truffle(default)> c.updateReturnRate(30)
'0x642d24031f582730000c37dd254173944840e5e771fbb0b74c032bd74f7294ba'
truffle(default)> c.returnRate.call()
{ [String: '30'] s: 1, e: 1, c: [ 30 ] }
Контракт инициализирует скорость до 20. И я изменил ее на 30, вызвав функцию updateRate.
В любом случае, я не эксперт в Browser Solidity, но я рекомендую такие инструменты, как Truffle, чтобы индустриализировать вашу разработку и сделать ее более эффективной.
Все есть
Грег Джинмарт
returnRate=_returnRate;
Паби
Грег Джинмарт
updateReturnRate
функции. это должно работать, в вашем коде нет ничего плохого. Единственная причина, по которой это может быть, заключается в том, что транзакция отправляется кем-то другим, кромеminter
(владельцем контракта). В противном случае, какие-либо исключения? Также для метода записи я советую вернуть успешный флагfunction updateReturnRate(uint newReturnRate) onlyMinter returns(bool successful){ returnRate = newReturnRate; return true; }
Паби
Паби