So tätigen Sie einen Funktionsaufruf über einen Relais- / Einstiegsvertrag

Ich versuche, einen Einstiegsvertrag zu erstellen (einen, der der Einstiegspunkt ist):

Relais.sol

pragma solidity ^0.4.8;
contract Relay {
    address public currentVersion;
    address public owner;

    modifier onlyOwner() {
        if (msg.sender != owner) {
            throw;
        }
        _;
    }

    function Relay(address initAddr) {
        currentVersion = initAddr;
        owner = msg.sender; 
    }

    function changeContract(address newVersion) public
    onlyOwner()
    {
        currentVersion = newVersion;
    }

    function() {
        if(!currentVersion.delegatecall(msg.data)) throw;
    }
}

Und mein Vertrag

Access2.sol

pragma solidity ^0.4.8;
import './Storage.sol';
import './Relay.sol';

contract Access2{
Storage s;
address Storageaddress=0xcd53170a761f024a0441eb15e2f995ae94634c06;

function Access2(){
Relay r=new Relay(this);
}

 function createEntity(string entityAddress,uint entityData)public returns(uint rowNumber){
        s = Storage(Storageaddress);
        uint row=s.newEntity(entityAddress,entityData);
        return row;
    }

    function getEntityCount()public constant returns(uint entityCount){
        s = Storage(Storageaddress);
        uint count=s.getEntityCount();
        return count;
    }   
}

Beide Verträge werden bereitgestellt.

Wenn ich mit dem Objekt von Access2 über web3 auf die Methode von Access2 zugreife, funktioniert es einwandfrei, aber jetzt ist das Problem, wie ich über Relay auf die Methode von Access2 zugreifen kann.

Kann ich das Objekt von verwenden Relay?

Dies wird hier wie ein Duplikat des aufrüstbaren Vertrags aussehen , aber meine Frage betrifft nicht das Schreiben eines aufrüstbaren Vertrags, sondern das Aufrufen der Funktionen unseres Vertrags aus dem Einstiegsvertrag: dh wie funktioniert das Konzept des Einstiegsvertrags?

Danke im Voraus

Mögliches Duplikat von Upgradeable Smart Contracts
@niksmac, eigentlich kein Duplikat, aber nächster Schritt oder weitere Erläuterung der Antwort auf Upgradeable Smart Contracts
Ich denke, dass die gewünschte Funktionalität dieser Frage der für den Multisig-Exploit verwendeten ähnlich ist; Rufen Sie eine Funktion des Access2-Vertrags mit der Fallout-Funktion des Relay-Vertrags auf. Weitere Einzelheiten finden Sie unter hackingdistributed.com/2017/07/22/deep-dive-parity-bug

Antworten (2)

Ja, von Relaykönnen Sie Funktionen aufrufen Access2, wie createEntity.

Der wichtige Code Relay, der dies ermöglicht, ist seine :

function() {
    if(!currentVersion.delegatecall(msg.data)) throw;
}

Es ist hilfreich, die Fragen und Antworten zur zu lesen , um mehr darüber zu erfahren.

Grundsätzlich gilt: Wenn Sie in aufrufen (aufrufen) createEntity, Relayweil Relayes keine createEntityFunktion hat, wird die Fallback-Funktion von Relayaufgerufen. Der Wert von currentVersionist Ihre Instanz von Access2, also wird es delegatecall(msg.data)für diese Access2Instanz funktionieren. msg.dataenthält die Informationen, die dann die createEntityFunktion auf dieser Access2Instanz aufrufen.

Anders ausgedrückt: Sie bitten Relaydarum, einige Daten auszuführen (rufen Sie eine Funktion createEntitymit bestimmten Daten und Argumenten auf), aber da RelaySie nicht wissen, wie Sie mit diesen Daten umgehen sollen, werden die Daten an Access2.

Basically, when you invoke (call) createEntity in Relay, because Relay doesn't have a createEntity function, the fallback function of Relay will be called.Was wird der web3-Befehl zum Aufrufen von createEntity in relay sein?
@AK Das ist eine gute Frage und gestellt in ethereum.stackexchange.com/questions/23369/…
auch diese Frage wird nicht beantwortet
@AK Es hat jetzt eine Antwort und es ist zu verwenden web3.eth.sendTransaction. Der dataentsprechende Aufruf createEntitymuss gemäß dem abi angegeben werden .

Ja, Sie können eine Instanz Ihres RelayVertrags verwenden, um Funktionen der verknüpften Instanz des Vertrags aufzurufen Access2.

Ich habe das folgende Minimalbeispiel erstellt, das Sie in Remix testen können :

contract target {
    event something();
    function doSomething() {
        something();
    }
}

contract relay {
    target myTarget;

    function relay() {
        // this will deploy a new target contract, you could also just set its address
        myTarget = new target();
    }

    function relayCall() {
        myTarget.doSomething();
    }
}

Um dies zu testen, können Sie eine Instanz von erstellen relay(die eine Instanz von targetin ihrem Konstruktor erstellt). Wenn Sie dann aufrufen relayCall, wird die doSomethingFunktion dieser targetInstanz aufgerufen. Entsprechend sehen Sie das somethingaufgerufene Ereignis.

Nicht, dass es wichtig wäre, aber der Vollständigkeit halber: Es gibt einen kleinen Punkt in Ihrem Access2Vertrag:

function Access2(){
Relay r=new Relay(this);
}

Hier thisist die Adresse der aktuellen Instanz von Access2(die nicht vom Typ ist Relay). Da Sie bei diesem Objekt nichts aufrufen, rist alles in Ordnung. Aber Sie würden höchstwahrscheinlich Laufzeitfehler bekommen, wenn Sie versuchen, auf Funktionen zuzugreifen, die nicht existieren (da Sie Access2einem Objekt vom Typ eine Instanz zuweisen Relay).

Ich glaube, Sie haben mich falsch verstanden, es geht nicht darum, Funktionen anderer Verträge aufzurufen,
Aber das haben Sie geschrieben: "Wie kann ich über Relay auf die Methode von Access2 zugreifen" - wenn Sie das nicht gemeint haben, formulieren Sie Ihre Frage bitte um.
Hallo @SwapnilKumbhar Bitte stellen Sie die Frage, die Sie als neue Frage beabsichtigt haben. Diese Frage ist immer noch hilfreich für die Community, also können wir sie beibehalten, aber klarer machen. Vielen Dank
@ValidityLabs-Sebastian, stimme zu!! Um diese Verwirrung zu vermeiden, habe ich den Code für beide Verträge gepostet, die meine Frage deutlich veranschaulichen