¿Por qué usaría una matriz como entrada?

Tengo los siguientes contratos:

pragma solidity ^0.4.17;

contract one{
    uint firstNum;
    uint secondNum;
    uint thirdNum;
    function getNumber(uint _num, uint _num2,uint _num3) public{
       firstNum = _num;
       secondNum = _num2;
       thirdNum = _num3;
    }
}

contract two{
    uint firstNum;
    uint secondNum;
    uint thirdNum;
    function getNumber(uint[3] numValues) public{
       firstNum = numValues[0];
       secondNum =numValues[1];
       thirdNum = numValues[2];
    }
}

Literalmente, la única diferencia es la función de entrada. Ahora los costos:

Contrato una creación:

  • Costo de transacción: 102814 gas.
  • Costo de ejecución: 37682 gas.

y llamar a la función 1,2,3 como entrada:

  • Costo de transacción: 82106 gas.
  • Costo de ejecución: 60258 gas.

Contrato dos creación:

  • Costo de transacción: 121264 gas.
  • Costo de ejecución: 51500 gas.

y llamar a la función [1,2,3] como entrada:

  • Costo de transacción: 82296 gas.
  • Costo de ejecución: 60448 gas.

Así que algunas preguntas... ¿por qué es más caro? y ahora, ¿por qué los contratos como 0x usan arreglos en lugar de simplemente ingresarlos por separado?

Respuestas (1)

Su contrato es muy simple y el costo de ejecución está dominado por los costos de almacenamiento.

Almacenando cada uno uinten el uso de almacenamiento de su contrato 20000 gas. Su contrato tiene tres de ellos almacenándolos usará 60000 de gas.

Los arreglos en solidez necesitan un procesamiento adicional, consulte Inmersión en la VM de Ethereum, Parte 3: Los costos ocultos de los arreglos (para verificar la condición fuera de los límites). Entonces, las funciones que los usan serán más largas.

Esto contribuye a que los contratos sean más grandes y más caros de implementar. Pero la implementación se realiza solo una vez, por lo que no es un problema muy grave.

Una de las posibles razones por las que 0x usa matrices como parámetros es que usar demasiados parámetros en una función causa un error de compilación "Stack too deep".

Gracias por la respuesta. el ángulo de 'apilar demasiado profundo' tiene sentido.