¿ 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 isValueOne
a Child
todo funciona.
Probé este código en testrpc y lo remezclé con los mismos resultados.
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;
}
}
usuario8754979
constant
no hace nada actualmente, ¿qué causaría que esto fallara aquí? Esto definitivamente debe ser documentado.pabloruiz55
usuario8754979
verify()
y actualizo una propiedad, por lo tanto, eliminoconstant
, este código fallará. no creo que eso sea correctopabloruiz55
usuario8754979
value
enChild
. 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).