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
Ja, von Relay
können Sie Funktionen aufrufen Access2
, wie createEntity
.
Der wichtige Code Relay
, der dies ermöglicht, ist seine Fallback-Funktion :
function() {
if(!currentVersion.delegatecall(msg.data)) throw;
}
Es ist hilfreich, die Fragen und Antworten zur Fallback-Funktion zu lesen , um mehr darüber zu erfahren.
Grundsätzlich gilt: Wenn Sie in aufrufen (aufrufen) createEntity
, Relay
weil Relay
es keine createEntity
Funktion hat, wird die Fallback-Funktion von Relay
aufgerufen. Der Wert von currentVersion
ist Ihre Instanz von Access2
, also wird es delegatecall(msg.data)
für diese Access2
Instanz funktionieren. msg.data
enthält die Informationen, die dann die createEntity
Funktion auf dieser Access2
Instanz aufrufen.
Anders ausgedrückt: Sie bitten Relay
darum, einige Daten auszuführen (rufen Sie eine Funktion createEntity
mit bestimmten Daten und Argumenten auf), aber da Relay
Sie 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?web3.eth.sendTransaction
. Der data
entsprechende Aufruf createEntity
muss gemäß dem abi angegeben werden .Ja, Sie können eine Instanz Ihres Relay
Vertrags 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 target
in ihrem Konstruktor erstellt). Wenn Sie dann aufrufen relayCall
, wird die doSomething
Funktion dieser target
Instanz aufgerufen. Entsprechend sehen Sie das something
aufgerufene Ereignis.
Nicht, dass es wichtig wäre, aber der Vollständigkeit halber: Es gibt einen kleinen Punkt in Ihrem Access2
Vertrag:
function Access2(){
Relay r=new Relay(this);
}
Hier this
ist die Adresse der aktuellen Instanz von Access2
(die nicht vom Typ ist Relay
). Da Sie bei diesem Objekt nichts aufrufen, r
ist alles in Ordnung. Aber Sie würden höchstwahrscheinlich Laufzeitfehler bekommen, wenn Sie versuchen, auf Funktionen zuzugreifen, die nicht existieren (da Sie Access2
einem Objekt vom Typ eine Instanz zuweisen Relay
).
Niksmac
SwapnilKumbhar
Mike B