Estoy tratando de llamar a una función en un contrato desde otro contrato con el siguiente ejemplo simple:
Sin título.sol:
pragma solidity ^0.4.16;
contract helloworld {
function returnint() returns (uint) {
return 15;
}
}
Y el segundo contrato:
pragma solidity ^0.4.16;
import "./Untitled.sol";
contract pullother {
function callFunctionInContractOne (address _address) returns (uint) {
helloworld contractOne = helloworld(_address);
contractOne.returnint();
}
}
Al llamar callFunctionInContractOne()
en el segundo contrato, la dirección del implementado Untitled.sol
se proporciona como parámetro, luego returnint()
se llama a la función en el primer contrato (que debería devolver 15). Cuando pruebo esto en el editor de remezclas, obtengo lo siguiente en su lugar:
Estoy copiando de llamar a una función simple de otro contrato pero obtengo un resultado diferente. También intenté ejecutar una función en un contrato de otro en una cadena de bloques privada de manera similar, pero no tuve éxito.
Agregando un valor de retorno obtengo lo mismo:
De hecho, envió un TX que llama a ese método del primer contrato inteligente, que llamó a la función del segundo contrato inteligente. La cuestión es que estás en una cadena de bloques real , me parece Ropsten, y no en la memoria de tu computadora, por lo que no puedes recuperar valores de un contrato como ese. Lo que te devuelve el remix es el recibo de la transacción después de que el bloque se acuña.
Si desea que una ÐApp pueda recuperar valores directamente de un contrato, cree funciones con constant returns
. Y tenga en cuenta que pronto esta constante se dividirá en view
y pure
.
Debe agregar un valor de retorno para callFunctionInContractOne
la función, de la siguiente manera:
contract pullother {
function callFunctionInContractOne (address _address) returns (uint) {
helloworld contractOne = helloworld(_address);
return contractOne.returnint();
}
}
Probando que todo está bien. El resultado es :
Espero que ayude ~
ZhouW
BinGoBinBin
constant
paracallFunctionInContractOne
la función, pruébalo.function callFunctionInContractOne (address _address) constant returns (uint) { helloworld contractOne = helloworld(_address); return contractOne.returnint(); }