la función de herencia no funciona

¿ Por qué el contrato adjunto siempre arroja un código de operación no válido cuando ejecuto test()y verify()(en ese orden)?

pragma solidity ^0.4.10;

contract Parent
{

    uint value;

    function isValueOne() public constant returns (bool) {
        return value == 1;
    }

}


contract Child is Parent
{

    uint public value;

    function test() public {
        value = 1;
    }

    function verify() {
        require(isValueOne());
    }
}

Según tengo entendido, este nunca debería ser el caso. He leído los documentos sobre herencia y no pude averiguar qué está pasando. Después de pasar isValueOnea Childtodo funciona.

Probé este código en testrpc y lo remezclé con los mismos resultados.

Respuestas (1)

Su código está fallando por algunas razones.

1- La función verificar() no está marcada como constante. Debe marcarse como constante dado que está leyendo datos y no escribiendo. (Arreglar esto eliminará el error que está recibiendo).

2- Incluso cuando se corrige este error, el contrato no funcionará según lo previsto porque está declarando un valor público uint en el elemento secundario que ensombrece la declaración de la variable con el mismo nombre/tipo en el elemento principal.

Así es como su código debe verse para que funcione:

pragma solidity ^0.4.10;

contract Parent
{

    uint public value;

    function isValueOne() public constant returns (bool) {
        return (value == 1);
    }

}


contract Child is Parent
{

    function test() public {
        value = 1;
    }

    function verify() constant returns (bool) {
        require(isValueOne());
        return true;
    }
}
Gracias por la respuesta rápida y funciona. He leído en alguna parte que constantno hace nada actualmente, ¿qué causaría que esto fallara aquí? Esto definitivamente debe ser documentado.
El compilador no obligará a agregarlo, pero debe agregarlo para indicarle que use la función eth_call en lugar de eth_sendTransaction.
Dado que cambio algo verify()y actualizo una propiedad, por lo tanto, elimino constant, este código fallará. no creo que eso sea correcto
Actualmente no está modificando ninguna variable de estado en verificar().
Como referencia, el problema fue que redefiní valueen Child. El compilador debería arrojar un error en este caso, este problema ya está abierto en github github.com/ethereum/solidity/issues/2563 (Pude encontrar esto después de que me recordaran el remedo).