Estoy tratando de llamar a una función desde la dirección del contrato implementada usando el siguiente formato
DeployedContractAddress.call(bytes4(keccak256("get(address)")),0xfffff);
Pero al intentar llamar a get(_address) usando la dirección de contrato implementada (sin codificación abi), debería devolver una matriz . Pero aquí, devuelve valores booleanos verdadero o falso .
function get(address _address) public returns (uint256[]){
for(uint i=0;i<n;i++){
arr[address].push(i);
}
return (arr);
}
¿Hay alguna forma sencilla de obtener valores de matriz sin utilizar la codificación ABI?
Según la documentación de Solidity , a partir de la versión 0.5.0 es posible acceder a los datos de devolución de una llamada:
address.call(bytes memory) returns (bool, bytes memory)
emite un nivel bajo
CALL
con la carga útil dada, devuelve la condición de éxito y devuelve los datos, reenvía todo el gas disponible, ajustable
Los datos se proporcionan como una sola bytes
matriz, por lo que es probable que desee decodificarlosabi.decode
para poder utilizarlos.
Antes de la versión 0.5.0, puede contar con el hecho de que los valores de retorno permanecen en la pila cuando call()
regresa. Se puede acceder a ellos, pero tendrá que usar ensamblador.
El método de llamada solo devuelve un valor booleano (verdadero/falso) basado en el éxito que tuvo al llamar a dicho método.
Si desea leer los "valores devueltos", debe tratar con el ABI o puede realizar una llamada de ensamblaje y leer y manejar los valores manualmente.
Consulte ¿Cómo construyo una llamada a otro contrato utilizando el ensamblado en línea?
Siempre puede especificar una interfaz abstracta para el abi que va a utilizar:
contract AbiInterface {
function get(address _address) public returns (uint256[]);
}
function doIt() {
AbiInterface myContract = AbiInterface.at(DeployedContractAddress);
myContract.get(0xfffff);
}
Pero esto, por supuesto, no funciona si está intentando llamar a métodos arbitrarios.
lekshmi
Micky Socaci
lekshmi
Micky Socaci
lekshmi
Micky Socaci