Rückgabe eines uint Array + Gas + kosteneffizientes Problem?

Ich habe ein wachsendes öffentliches Array

struct MatchInfo {
    uint256 matchId;  
    bool isMatchDone; 
}

MatchInfo[] public matchInfo;

und ich möchte ein Array zurückgeben, das uint256durchschleift matchInfound 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 returnskein 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?

Antworten (1)

Es kommt wirklich darauf an. Es gibt zwei Möglichkeiten, Funktionen aus einem Smart Contract aufzurufen

  1. 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.

  2. 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.

Danke für deine Antwort. Wenn es also einen constantModifikator gibt, würde er kein Gas kosten, da er keine Transaktion erstellt. Ich verstehe. constantWenn ich so etwas herausnehme, function sellProduct(string _name, string _description, uint256 _price) public {}würde es eine Transaktion verursachen und Benzin kosten, oder?
Richtig. Beachten Sie, dass Sie immer noch eine Transaktion zu einer konstanten Funktion erstellen können , wenn Sie es in Web3 nicht richtig machen. Eine benannte Funktion sellProductwü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.
Ich verstehe. also muss ich immer noch Konstante richtig verwenden. Danke.