Wie rufe ich eine Funktion auf und lese Rückgabewerte von einer extern bereitgestellten Vertragsadresse?

Ich versuche, eine Funktion von der bereitgestellten Vertragsadresse im folgenden Format aufzurufen

DeployedContractAddress.call(bytes4(keccak256("get(address)")),0xfffff);

Wenn Sie jedoch versuchen, get(_address) mithilfe der bereitgestellten Vertragsadresse (ohne abi-codiert) aufzurufen, sollte ein Array zurückgegeben werden . Aber hier gibt es die booleschen Werte true oder false zurück .

 function get(address _address) public returns (uint256[]){
 for(uint i=0;i<n;i++){
     arr[address].push(i);
 }
 return (arr);
}

Gibt es eine einfache Möglichkeit, Array-Werte zu erhalten, ohne ABI-codiert zu verwenden?

Antworten (2)

Laut der Solidity-Dokumentation ist es ab Version 0.5.0 möglich, auf die Rückgabedaten eines Anrufs zuzugreifen:

address.call(bytes memory) returns (bool, bytes memory)

gibt Low-Level CALLmit der gegebenen Nutzlast aus, gibt Erfolgsbedingung zurück und gibt Daten zurück, leitet alles verfügbare Gas weiter, einstellbar

Die Daten werden als einzelnes Array angegeben , sodass Sie sie wahrscheinlich mit decodierenbytes möchten, um sie zu verwenden.abi.decode

Vor Version 0.5.0 können Sie sich darauf verlassen, dass die Rückgabewerte bei der call()Rückgabe auf dem Stack verbleiben. Auf sie kann zugegriffen werden, aber Sie müssen Assembler verwenden.

Die Aufrufmethode gibt nur einen booleschen Wert ( true / false ) zurück, basierend auf dem Erfolg, den sie beim Aufrufen der Methode hatte.

Wenn Sie die "zurückgegebenen Werte" lesen möchten, müssen Sie sich mit dem ABI befassen, oder Sie können einen Assembly-Aufruf durchführen und die Werte manuell lesen und verarbeiten.

Sehen Sie sich an, wie erstelle ich einen Aufruf zu einem anderen Vertrag mithilfe von Inline-Assemblierung?

Sie können immer eine abstrakte Schnittstelle für das zu verwendende abi angeben:

contract AbiInterface {
    function get(address _address) public returns (uint256[]);
}

function doIt() {
    AbiInterface myContract = AbiInterface.at(DeployedContractAddress);
    myContract.get(0xfffff);
}

Aber das funktioniert natürlich nicht, wenn Sie versuchen, beliebige Methoden aufzurufen.

Es ist in Ordnung, wenn es wahr oder falsch zurückgibt ... Wenn ich meinen bereitgestellten Code auf ein anderes System kopiere, funktioniert es ordnungsgemäß ... Aber wenn ich versuche, eine Funktion mit der bereitgestellten Adresse aufzurufen, passiert nichts ... In ERC721 habe ich es versucht Transferfunktion aufrufen, aber nichts reflektiert. Was müssen wir also tun, um dieses Problem zu lösen?
Sie müssen etwas Code freigeben. Ohne das können Sie das Problem nicht wirklich erkennen.
Vielen Dank ... Können Sie das etwas näher erläutern? Meinten Sie eigene Funktionen oder vollständiges Code-Sharing?
Ihre Frage besagt, dass Sie Werte aus einer Methode in einem Vertrag abrufen möchten, für die Sie kein "abi" haben. Dies ist cool, wenn Sie einen generischen Aufrufer implementieren. In diesem Fall müssen Sie die Rückgabewerte in Assembly basierend auf dem erwarteten Typ behandeln. Andererseits sagen Sie, wenn der Aufruf einen booleschen Wert zurückgibt, ist es auch in Ordnung. Welches ist es ? Was willst du eigentlich mit dem Code machen. Wenn Sie es sehen, kann es uns helfen, Ihnen zu helfen, oder zu erklären, was Sie erreichen möchten, kann ebenfalls hilfreich sein. Wählen Sie einfach aus, was Sie tun möchten :)
K sry .. Ich möchte nur eine Funktion von einer bereits bereitgestellten Vertragsadresse aufrufen ... weil immer noch nichts passiert, wenn versucht wird, die Funktionen von einer bereitgestellten Vertragsadresse aufzurufen ... :)
Teilen Sie Ihren Code in einem Pastebin-Link und ich werde ihn mir ansehen :)