Публичные переменные контракта остаются неопределенными. Почему?

У меня есть контракт, который выглядит так:

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, но он все еще не определен. И я не могу объяснить, почему...

Должен ли я указывать функцию как общедоступную? Тем не менее, почему значение не было установлено при создании контракта?

Я использую компилятор солидности браузера для тестирования.

Ваш параметр _returnRate (с префиксом подчеркивания), поэтому вы должны инициализировать returnRate черезreturnRate=_returnRate;
Ах точно ой... Забыл подчеркивание. Но почему я не могу обновить его с помощью функции обновления?
Для updateReturnRateфункции. это должно работать, в вашем коде нет ничего плохого. Единственная причина, по которой это может быть, заключается в том, что транзакция отправляется кем-то другим, кроме minter(владельцем контракта). В противном случае, какие-либо исключения? Также для метода записи я советую вернуть успешный флагfunction updateReturnRate(uint newReturnRate) onlyMinter returns(bool successful){ returnRate = newReturnRate; return true; }
Как видно из блокчейна: testnet.etherscan.io/address/… транзакция не отправлялась с того же адреса, что и адрес создания контракта. Хотя я не знаю, почему компилятор солидности браузера вызвал функцию с не моего адреса.
Даже с тем же адресом, что и адрес создания, он не обновляет его. Вот хэш транзакции: testnet.etherscan.io/tx/… отправлен с того же адреса, что и адрес создания контракта: testnet.etherscan.io/address/…

Ответы (1)

После беглого просмотра ваш контракт работает нормально. Я думаю, что с 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, чтобы индустриализировать вашу разработку и сделать ее более эффективной.

Все есть