constante versus público en funciones de solidez

Usando Mix, si creo un contrato en el escenario con la dirección A como parámetro, al hacer clic en getConstant en el html a continuación, se devuelve A como lo esperaba, y veo una transacción marcada por JS.

Si ahora hago clic en getPublic, que es más o menos la misma función que la palabra clave constante/pública, obtengo una transacción pendiente en el escenario y una dirección que no es la que esperaba.

Entonces, es posible que NO entienda algo fundamental sobre lo que público significa o implica, pero no puedo ver qué es.

He configurado este contrato / html básico para esta pregunta:

contract constantOrPublic {
    address creator;
    address otheraddress;

    function constantOrPublic(address _otheraddress) 
    {
        creator = msg.sender;
        otheraddress = _otheraddress;
    }

    function getConstant() constant returns(address) {
        return otheraddress;
    }
    function getPublic() public returns(address) {
        return otheraddress;
    }

}

y esta página html:

<!doctype>
<html>
<head>
<script type='text/javascript'>

function getConstant() {
    var param = document.getElementById('c').value;
    var res = contracts['constantOrPublic'].contract.getConstant();
    document.getElementById('c').innerText = res;
}

function getPublic() {
    var param = document.getElementById('p').value;
    var res = contracts['constantOrPublic'].contract.getPublic();
    document.getElementById('p').innerText = res;
}

</script>
</head>
<body >
<div>
getConstant:
    <div id='c'>none</div>
    <button onclick='getConstant()'>getConstant</button>
</div>
<div>
getPublic:
    <div id='p'>none</div>
    <button onclick='getPublic()'>getPublic</button>
</div>
</body>
</html>

Respuestas (2)

No estoy seguro de qué parte del sistema asume esto (¿web3.js?), Pero si no declara una función como constante, se supone que cambiará el estado del contrato y, por lo tanto, establecerá una transacción.

La declaración debería verse así (nota, no la compilé):

function getPublic() public constant returns(address) {

Revisé los documentos de solidez, no estoy seguro de que publicsea una palabra clave útil para una función, porque publices la predeterminada.

publices más útil para los datos del contrato.
Tiene razón, constantsolo importa que web3.js se interprete myContract.getPublic()como myContract.getPublic.call()si fuera constante, y de myContract.getPublic.sendTransaction()lo contrario.

En pocas palabras, la "constante" indica que no se necesita ninguna transacción y que no se utilizará gas/eth. Es lo mismo que obtener el valor de la propiedad de un contrato. Público indica visibilidad al código externo.