Ich versuche, einen Vertrag eine Funktion zu haben, die Funktionen eines anderen Vertrags aufrufen kann. Der Schlüssel zu meinem Ziel ist, dass der Vertrag nicht ohne Importanweisungen bereitgestellt werden kann und der Name des Vertrags standardmäßig nicht bekannt ist. Mit anderen Worten, der Benutzer dieses Vertrags würde die aufgerufenen Vertragsdaten (d. H. Adresse, Name) als Parameter eingeben. Was ist der beste Weg, dies zu erreichen?Externer Vertrag in Solidität dynamisch aufrufen
Antwort
Nicht sicher, warum dies abgelehnt wurde.
Wenn ich die Frage richtig verstehe, möchten Sie den Vertrag ohne Kenntnis der spezifischen Details der Verträge bereitstellen, mit denen er kommunizieren muss.
Sie können dies erheblich vereinfachen, indem Sie Wissen über ihre Schnittstellen übernehmen.
Sie können Schnittstellen definieren, ohne den Vertragscode zu importieren. Definieren Sie die Funktionsschnittstellen und lassen Sie die Funktionsdefinitionen leer:
contract WidgetInterface {
function doSomething() returns(uint) {}
function somethingElse() returns(bool isTrue) {}
}
verwenden, die Schnittstellen-Vertrag tatsächlich Verträge zu sprechen:
WidgetInterface w = WidgetInterface(actualContractAddress);
Meiner Meinung nach wird es in der Regel möglich und sinnvoll, sich zu registrieren autorisiert/gültige Verträge, wie Sie gehen. Pflegen Sie eine Liste der Verträge, die sie sicher, in diese Richtung sprechen können:
if(!isAuthorized(actualContractAddress)) throw;
wo actualContractAddress
vom Sender geliefert wird und isAuthorized()
ist eine Funktion, die Sie gearbeitet haben, aus einem internen Register abzufragen.
Ich hoffe, es hilft.
Sie können dies tun, indem Sie eine Schnittstelle verwenden, wie von Rob Hitchens vorgeschlagen, oder Sie könnten die Schnittstelle dynamisch definieren und eine Methode ausführen, indem Sie .call, .callcode, .delegatecall verwenden.
Hier ist ein Beispiel:
contract ContractsCaller {
function execute(address contractAt, uint _i, bytes32 _b) returns (bool) {
return contractAt.call(bytes4(sha3("testMethod(uint256,bytes32)")), _i, _b);
}
}
contract Test {
uint256 public i;
bytes32 public b;
function testMethod(uint256 _i, bytes32 _b) {
i = _i;
b = _b;
}
}
-Test kann in einer separaten Datei definiert werden. ContractsCaller muss außer seiner Adresse und der Signatur der Methode, die es aufruft, nichts über Test wissen.
Die Signatur des Verfahrens ist, die ersten 4 Bytes des Methodennamen und die Art seiner Parameter:
bytes4(sha3("testMethod(uint256,bytes32)"))
- 1. Wie Mapping-Liste in Solidität zurückgeben? (Ethereum Vertrag)
- 2. String Verkettung in Solidität?
- 3. String-Array in Solidität
- 4. läuft Zeppelin-Solidität Demos zeigt undefined Rückmeldung
- 5. Aufrufen externer Typen, die Dateien über den relativen Pfad aufrufen
- 6. Portlet Aktion von externer Anwendung aufrufen
- 7. Dynamisch Funktion in Javascript aufrufen
- 8. Erstellen Sie einen "Transaktions-Handler" Smart-Vertrag
- 9. Dynamisch erstellte Wörterbücher aufrufen
- 10. Dynamisch JavaScript aus externer Datei enthalten - PHP
- 11. Funktionen dynamisch aufrufen - Python
- 12. Solidität und Vollständigkeit eines Algorithmus
- 13. Gibt es Null wie Ding in Solidität
- 14. JavaScript dynamisch erweitern/Vertrag Matrix - wie dies zu implementieren?
- 15. Was bedeuten Vertrag zuerst und Vertrag zuletzt?
- 16. Methoden dynamisch auf Java aufrufen
- 17. Dynamisch P/Aufrufen einer DLL
- 18. ghc 7.4.2, dynamisch aufrufen Module
- 19. JQuery: Eine Funktion dynamisch aufrufen
- 20. Dynamisch eine statische Funktion aufrufen?
- 21. php - eine Funktion dynamisch aufrufen
- 22. wie dynamisch eine Funktion in C# aufrufen
- 23. Dynamisch eine Methode in DLL aufrufen
- 24. Ermöglicht U-SQL benutzerdefinierten Code zum Aufrufen externer Dienste
- 25. Externer REST-Web-Service von Conversation API aufrufen
- 26. Wo speichert Browser-Solidität .sol-Dateien?
- 27. Jade Templates - Einen Mixin dynamisch aufrufen
- 28. Dynamisch eine statische Variable (Array) aufrufen
- 29. Async-Funktionen dynamisch mit exec aufrufen()
- 30. Funktionen dynamisch aufrufen, abhängig vom Namen