2017-03-30 14 views
4

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

5

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.

0

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)")) 

Verwandte Themen