¿devolviendo un problema uint array + gas + rentable?

Tengo una matriz pública creciente

struct MatchInfo {
    uint256 matchId;  
    bool isMatchDone; 
}

MatchInfo[] public matchInfo;

y quiero devolver una matriz que uint256recorrerá matchInfoy encontrará dóndeisMatchdone == 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;
}

Vi en algún lugar de la publicación que constant returnsno consumirá gasolina. ¿Es verdad? si no es cierto, ¿es la función anterior una mala forma de enfoque/práctica para devolver una matriz en solidez? Si es así, cuáles son las alternativas?

Respuestas (1)

Realmente depende. Hay dos formas de llamar funciones desde un contrato inteligente

  1. Llámalos desde una transacción de Ethereum. Esto llamará a la función en cadena y le costará gasolina de la ejecución.

  2. Llámelos de solo lectura sin crear una transacción. Esto no cuesta gasolina. Esto se puede hacer porque, dado que es una función constante y no modifica el estado, se puede llamar sin crear una transacción en cadena. Esto no funcionará para funciones que modifican el estado porque el estado no persistirá ya que no hay transacción. Esto generalmente se hace en web3 haciendo call()en la función.

Gracias por tu respuesta. Entonces, si hay constantun modificador, no costaría gasolina porque no crea una transacción. Veo. Si saco constantcomo function sellProduct(string _name, string _description, uint256 _price) public {}entonces crearía una transacción y costaría gasolina, ¿verdad?
Correcto. Tenga en cuenta que aún puede crear una transacción para una función constante si no lo está haciendo correctamente en Web3. Una función nombrada sellProductprobablemente no tendría sentido para ser constante, ya que el nombre hace que suene como si necesitara modificar el estado y, por lo tanto, no ser constante.
Veo. así que todavía necesito usar constante correctamente. Gracias.