¿Pueden las funciones puras/vista de solidez ser arbitrariamente complejas?

Las funciones no constantes están limitadas en complejidad computacional por el límite de gas del bloque. Supongo, pero no estoy seguro, que esto no se aplica a view/ purefunciones. ¿Están view/ purelas funciones de alguna manera limitadas en complejidad computacional aparte del hecho de que tendría que esperar bastante tiempo hasta que, por ejemplo, se ejecute un ciclo largo?

La constantpalabra clave en realidad no forma parte de la especificación del protocolo, por lo que su comportamiento en casos extremos depende en gran medida del cliente. La única especificación relevante es el método JSON-RPCeth_call . En la práctica, la mayoría de los clientes respetan el límite de gas para el bloque en el que están simulando la transacción, pero no debe confiar en que ese sea el caso para todos los clientes.

Respuestas (2)

view/ purelas funciones están limitadas por el gas que se le proporciona . Todavía "usan" gasolina, aunque al remitente ( fromcuenta) no se le "cobra" por la gasolina.

view, pureson palabras clave de Solidity, pero actualmente solo son un indicador para que Javascript web3.js use JSON-RPC eth_callen lugar de eth_sendTransaction.

https://github.com/ethereum/wiki/wiki/JavaScript-API#métodos-de-contrato

// Automatically determines the use of call or sendTransaction based on the method type (constant keyword exists or not?)
myContractInstance.myMethod(param1 [, param2, ...] [, transactionObject] [, defaultBlock] [, callback]);

// Explicitly calling this method
myContractInstance.myMethod.call(param1 [, param2, ...] [, transactionObject] [, defaultBlock] [, callback]);

// Explicitly sending a transaction to this method
myContractInstance.myMethod.sendTransaction(param1 [, param2, ...] [, transactionObject] [, callback]);

call y sendTransaction son muy similares (bajo el capó), con la principal diferencia de que el primero es una simulación. Pero la simulación todavía "usa" gas y, comprensiblemente, puede causar confusión. Para realizar un cálculo complejo en una función view/ pure, es posible que deba especificar explícitamente mucho gas como:myContractInstance.myMethod.call(param1, {gas:990000000})

Por ejemplo, Geth "solo" proporciona 50 millones de gas:

if msg.gas == nil {
    msg.gas = big.NewInt(50000000)
}

Como comentó @Tjaden, básicamente no hay especificaciones sobre eth_call, por lo que otros clientes y la solidez del navegador pueden comportarse de manera diferente a Geth.

Gracias, una cosa que agregaría en caso de que las personas se excedan al especificar el gas es poner el valor del gas entre comillas si excede el número más grande que permite Javascript .
¿Cuál sería el límite de gas al usar MetaMask? ¿Usan Geth?
@EliezerSteinbock Creo que hay 2 cosas: hacer una pregunta de separación es mejor y MetaMask no aparecerá con eth_call.
Los alambiques lógicos de gas de 50 millones parecen ser el caso en 2022: github.com/ethereum/go-ethereum/blob/…

El trabajo computacional que necesita una función constanto non-constantes el mismo cuando crea su contrato o si ejecuta la función. El costo inicial depende de las operaciones ejecutadas en la EVM, cada opcode tiene su propio precio. Puede consultar la lista aquí (tal vez desactualizada).

Sin embargo, la palabra clave "constante" indica que no se supone que la función modifique los estados, y no se usará gas porque permite que la función se ejecute locally/off blockchainen su nodo.

Prueba :

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Editar : intentemos ejecutar un ciclo dentro de una función constante para tener una idea del trabajo computacional:

pragma solidity ^0.4.0;

contract test_compexity{
   

 function f(uint256 n) constant  returns (uint256)  {
    uint256 j=0;
     while(j<n){
         j=j+1;
     }
  
 return j;
 }
}

Si ejecutamos esta función constante con la entrada 1001, obtenemos el resultado 0X

ingrese la descripción de la imagen aquí

Si ejecutamos la misma función sin el tipo constante y con la misma entrada, obtenemos un error:Gas required exceeds limit

ingrese la descripción de la imagen aquí

Entonces, incluso si estamos usando una función constante, todavía estamos bajo la limitación de gasLimit. Piense en ello como si estuviera usando la función constante y solo se está pagando a sí mismo dentro de un gasLimit.

Tiene sentido para mí que el esfuerzo computacional para mí sea el mismo, pero no veo que esto responda a mi pregunta si existen limitaciones en la complejidad computacional de las constantfunciones.
verifique la edición en la respuesta
Bien, incluso las funciones constantes parecen estar sujetas al límite de gas predeterminado y probablemente también al límite de gas de bloque, lo acabo de confirmar en Ethereum Studio. Esto no tiene sentido para mí, consulte también: github.com/ethereum/go-ethereum/issues/3237
@Sebastian: Sí, están sujetos al gas proporcionado y, dado que usa Geth, creo que solo obtiene 50 millones de gas por eth_call, así que intente especificar más.
La respuesta es un poco complicada porque el bucle modifica el estado y no debe declararse constante/vista. Declarar jdentro de la función debería permitir especificaciones de gas arbitrariamente grandes. Para aclarar, Remix exige que la vista no modifique el estado, pero el compilador solc aún no lo hace, por lo que esto no funcionaría con las pruebas en su estación.