¿Cómo llamar a una función y leer los valores devueltos desde una dirección de contrato implementada externa?

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?

Respuestas (2)

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 CALLcon 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 bytesmatriz, 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.

Está bien si devuelve verdadero o falso... Cuando copio mi código implementado en otro sistema, funciona correctamente... Pero si trato de llamar a una función usando la dirección implementada, no sucede nada... En ERC721, lo intenté para llamar a la función de transferencia, pero nada refleja. Entonces, ¿qué tenemos que hacer para resolver este problema?
vas a tener que compartir algo de código... realmente no puedo entender el problema sin eso.
Gracias... ¿Puedes explicar un poco más? ¿Quiso decir funciones propias o código compartido completo?
Su pregunta indica que desea recuperar valores de un método en un contrato para el que no tiene "abi". Esto es genial si está implementando una llamada genérica, en cuyo caso necesita manejar los valores devueltos en el ensamblado según el tipo que espera. Por otro lado, está diciendo que si la llamada devuelve un valor booleano, también está bien. ¿Cuál es? ¿Qué estás tratando de hacer con el código? Verlo puede ayudarnos a ayudarte o explicar lo que quieres lograr también podría ayudar, solo elige lo que quieres hacer :)
K sry... Solo quiero llamar a una función desde una dirección de contrato ya implementada... porque todavía no sucede nada cuando intento llamar a las funciones desde una dirección de contrato implementada... :)
Comparta su código en un enlace de pastebin y lo revisaré :)