¿Cuesta más gasolina llamar en solidez a las funciones de otro contrato?

Me gustaría dividir mi código en múltiples contratos, pero tengo miedo de que esto aumente las tarifas del gas. ¿Cuesta más gas una llamada de función externa que una llamada interna a una función dentro del mismo contrato? Si es así, ¿se trata de una tarifa fija por cada llamada o se tendrá en cuenta el tamaño de los argumentos que se transmiten?

Respuestas (1)

Un poco.

Aquí hay un conjunto muy idiomático de contratos con un conjunto de funciones que toman diferentes caminos para establecer y obtener el mismo valor. Ningún esfuerzo para optimizar para el gas. delegateCallpuede hacerlo más barato.

Puede ver la diferencia en el costo de transacción, que tiene que ver con las solicitudes de embalaje y desembalaje. Puede ver que son (aproximadamente) 2000 gasolina extra para establecer el valor con una invocación del "Módulo" al contrato "Independiente" que logra lo mismo si se llama directamente.

Vale la pena mencionar dos cosas.

La proporción de gastos generales para el trabajo es desmesurada porque los contratos no están haciendo ningún trabajo pesado por sí mismos. Es básicamente gastos generales de tarifa plana.

Los colocadores son la comparación importante. Aunque el costo del gas se calcula para operaciones de solo lectura, son esencialmente gratuitos, siempre que no exceda el límite de gas del bloque (el presupuesto).

pragma solidity 0.4.19; 

contract StandAlone {
    uint public x = 1;

    function get() public view returns(uint) {
        return x;
    }

    function set(uint _x) public returns(bool success) {
        x = _x;
        return true;
    }

    function getLongWay() public view returns(uint) {
        return get();
    }
}

contract Module {

    StandAlone s;

    function Module(address SAAddress) public {
        s = StandAlone(SAAddress);
    }

    function get() public view returns(uint) {
        return s.get();
    }

    function set(uint  _x) public returns(bool success) {
        return s.set(_x);
    }
}

Espero eso ayude.

Hola Rob, ¿esto también se aplica a contratos más grandes? ¿Qué pasa si StandAlone tuviera un volumen de código de contrato real en su lugar, mantendrá esta relación de consumo de gas?
La relación mejorará. La sobrecarga es empaquetar y desempaquetar mensajes. Cuanto más trabajo real están haciendo los contratos, menos significativo es este costo adicional porque se trata del tamaño del mensaje.
Aham, ya veo. Entonces, ¿cargar el contrato llamado en la memoria para llamar a su función no afecta el costo proporcionalmente a su tamaño? ¿Puede proporcionarme una referencia para leer más sobre el empaquetado y desempaquetado de mensajes?
No fue así como interpreté la pregunta. Pregunta sobre el costo adicional de dividir un contrato monolítico en varios más pequeños. Nadie dice que puede ejecutar nada gratis... de hecho, estamos hablando de la sobrecarga adicional de pasar mensajes entre contratos en lugar de contener todo el código de un solo trago.
Perdón por no ser claro, eso es lo que estoy tratando de entender, ¿vale la pena el costo adicional de llamar a otro contrato para separar algo de lógica y estado en otro contrato?
Ah bien. Los mensajes son baratos. En perspectiva, cada SSTORE cuesta 10 veces más. Por lo tanto, cuesta 20 000 gas escribir 32 bytes en el estado del contrato.
Tenía la misma pregunta. Creo que a la larga, los precios de la gasolina bajarán (gracias a ETH 2.0), pero descontando el precio actual, que es más alto debido a DeFi, el precio de la gasolina en abril de 2020 fue de 10Gwei. 2000 gas a 10 Gwei por unidad de gas equivale a 20000 gwei, lo que significa 0,0070 $. así que 0,7 centavos POR LLAMADA no es tan caro, pero en general tampoco es barato, especialmente. si está calculando los gastos generales a largo plazo. Apesta tener que optimizar los costos de gas por ahora. Esto cambiará a medida que los precios de la gasolina se vuelvan mucho más baratos con ETH 2.0. ¿Tal vez podamos intentar usar la cadena lateral Matic POS?