Las variables públicas del contrato permanecen indefinidas. ¿Por qué?

Tengo un contrato que se ve así:

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;
     }

     ...    

}

Lo he implementado en la red de prueba: https://testnet.etherscan.io/address/0x5cad3cbdbf64b65174b36269f5201d3265569f2b

Sin embargo, cuando intento obtener el valor de la variable 'returnRate', obtengo que no está definida, aunque debería haberse establecido en la creación del contrato. Entonces traté de actualizarlo a través de la función updateReturnRate y aún no está definido. Y no puedo explicar por qué...

¿Tengo que especificar la función como pública? Aun así, ¿por qué no se estableció el valor al momento de la creación del contrato?

Estoy usando el compilador de solidez del navegador para realizar pruebas.

Su parámetro es _returnRate (guion bajo prefijado), por lo que debe inicializar returnRate a través dereturnRate=_returnRate;
Ah, cierto, ups... Olvidé el guión bajo. Pero, ¿cómo es que no puedo actualizarlo usando la función de actualización?
Para la updateReturnRatefunción. debería funcionar, no hay nada malo en su código. La única razón por la que podría ser si la transacción es enviada por otra persona que no sea minter(el propietario del contrato). De lo contrario, ¿alguna excepción? También para el método de escritura, aconsejo devolver una bandera exitosafunction updateReturnRate(uint newReturnRate) onlyMinter returns(bool successful){ returnRate = newReturnRate; return true; }
Resulta que mirando la cadena de bloques: testnet.etherscan.io/address/… la transacción no se enviaba desde la misma dirección que la dirección de creación del contrato. Aunque no sé por qué el compilador solidity del navegador llamó a una función desde una dirección que no es la mía.
Incluso con la misma dirección que la dirección de creación, no la actualiza. Aquí está el hash de la transacción: testnet.etherscan.io/tx/… enviado desde la misma dirección que la dirección de creación del contrato: testnet.etherscan.io/address/…

Respuestas (1)

Después de un vistazo rápido, su contrato funciona bien. Creo que definitivamente hay algo mal con Browser Solidity

Normalmente estoy desarrollando con Truffle , así que rápidamente hice un proyecto de Truffle de su contrato (abajo)

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;
     } 
}

Compilé el contrato y lo implementé:

Y lo probé en la consola. Aquí está el resultado:

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 ] }

El contrato inicializa la tarifa a 20. Y la cambié a 30 llamando a la función updateRate.

De todos modos, no soy un experto en Browser Solidity pero recomiendo herramientas como Truffle para industrializar tu desarrollo y ser más eficiente.

todo esta ahi