Ich habe ein wachsendes öffentliches Array
struct MatchInfo {
uint256 matchId;
bool isMatchDone;
}
MatchInfo[] public matchInfo;
und ich möchte ein Array zurückgeben, das uint256
durchschleift matchInfo
und wo findetisMatchdone == false
function getUnfinishedMatches() public constant returns (uint256[]) {
uint256[] memory unFinishedMatches = new uint[](getMatchCount());
for (uint i = 0; i <= matchInfo.length; i++) {
if (matchInfo.isMatchdone == false) {
unFinishedMatches[i] = matchInfo.matchId;
}
}
return unFinishedMatches;
}
Ich habe irgendwo in der Post gesehen, dass constant returns
kein Benzin verbraucht wird. Ist es wahr? Wenn dies nicht der Fall ist, ist die obige Funktion ein schlechter Ansatz / eine schlechte Methode, um ein Array in Solidität zurückzugeben? Wenn ja, welche Alternativen gibt es?
Es kommt wirklich darauf an. Es gibt zwei Möglichkeiten, Funktionen aus einem Smart Contract aufzurufen
Rufen Sie sie von einer Ethereum-Transaktion aus an. Dies ruft die Funktion in der Kette auf und kostet Sie Gas von der Ausführung.
Nennen Sie sie schreibgeschützt, ohne eine Transaktion zu erstellen. Das kostet kein Benzin. Dies ist möglich, da es sich um eine konstante Funktion handelt, die den Status nicht ändert, und daher aufgerufen werden kann, ohne eine On-Chain-Transaktion zu erstellen. Dies funktioniert nicht für Funktionen, die den Zustand ändern, da der Zustand nicht bestehen bleibt, da es keine Transaktion gibt. Dies geschieht normalerweise in web3, indem Sie call()
die Funktion ausführen.
Busfahrer
constant
Modifikator gibt, würde er kein Gas kosten, da er keine Transaktion erstellt. Ich verstehe.constant
Wenn ich so etwas herausnehme,function sellProduct(string _name, string _description, uint256 _price) public {}
würde es eine Transaktion verursachen und Benzin kosten, oder?natewelch_
sellProduct
würde wahrscheinlich keinen Sinn machen, um konstant zu sein, da der Name so klingt, als müsste sie den Zustand ändern und daher nicht konstant sein.Busfahrer