Ich versuche, eine Funktion in einem Vertrag aus einem anderen Vertrag mit dem folgenden einfachen Beispiel aufzurufen:
Ohne Titel.sol:
pragma solidity ^0.4.16;
contract helloworld {
function returnint() returns (uint) {
return 15;
}
}
Und der zweite Vertrag:
pragma solidity ^0.4.16;
import "./Untitled.sol";
contract pullother {
function callFunctionInContractOne (address _address) returns (uint) {
helloworld contractOne = helloworld(_address);
contractOne.returnint();
}
}
Beim Aufruf callFunctionInContractOne()
des zweiten Vertrags wird die Adresse des Deployed Untitled.sol
als Parameter angegeben, dann returnint()
wird die Funktion im ersten Vertrag aufgerufen (die 15 zurückgeben sollte). Wenn ich das im Remix-Editor versuche, bekomme ich stattdessen Folgendes zurück:
Ich kopiere vom Aufrufen einer einfachen Funktion aus einem anderen Vertrag, erhalte aber ein anderes Ergebnis. Ich habe auch versucht, eine Funktion für einen Vertrag von einem anderen auf einer privaten Blockchain auf ähnliche Weise auszuführen, bin aber erfolglos.
Wenn ich einen Rückgabewert hinzufüge, bekomme ich dasselbe:
Sie haben tatsächlich einen TX gesendet, der diese Methode des ersten Smart Contracts aufruft, die die Funktion des zweiten Smart Contracts aufruft. Die Sache ist, dass Sie sich auf einer echten Blockchain befinden – es scheint mir Ropsten – und nicht im Speicher Ihres Computers, sodass Sie keine Werte aus einem solchen Vertrag abrufen können. Was der Remix Ihnen zurückgibt, ist die Transaktionsquittung, nachdem der Block geprägt ist.
Wenn Sie möchten, dass eine ÐApp Werte direkt aus einem Vertrag abrufen kann, erstellen Sie Funktionen mit constant returns
. view
Und bitte beachten Sie, dass diese Konstante bald in und aufgeteilt wird pure
.
callFunctionInContractOne
Sie sollten wie folgt einen Rückgabewert für die Funktion hinzufügen :
contract pullother {
function callFunctionInContractOne (address _address) returns (uint) {
helloworld contractOne = helloworld(_address);
return contractOne.returnint();
}
}
Testen ob alles ok ist. Das Ergebnis ist :
Hoffe es hilft~
ZhouW
BinGoBinBin
constant
für Funktion hinzufügencallFunctionInContractOne
, versuchen Sie es.function callFunctionInContractOne (address _address) constant returns (uint) { helloworld contractOne = helloworld(_address); return contractOne.returnint(); }