¿Quién recibe la tarifa de la llamada de contrato?

Básicamente, no necesita pagar una tarifa por la llamada de contrato, pero si un método de contrato hace mucho trabajo, debe agregar gas en la llamada de contrato para evitar un ataque DoS como este:

contrato.método.llamada({gas: 1000000000})

¿Quién recibe esta tarifa?

Creo que esto se responde principalmente aquí: ethereum.stackexchange.com/questions/11/… . Podría agregar que Ethereum devuelve el gas no gastado. En ese sentido, es un límite superior para la ejecución. Otro pequeño detalle es que si la transacción falla por alguna razón en lugar de ejecutarse con éxito, entonces el gas (todo) se destruye para siempre.
No parece la respuesta. ¿Quién recibe la tarifa?

Respuestas (2)

"Llamar" es un término sobrecargado porque es una forma de invocar un contrato (consulte ¿Cuál es la diferencia entre una transacción y una llamada? ) y depende de dónde se realiza la invocación, en relación con la máquina virtual Ethereum (EVM).

Fuera del EVM (por ejemplo, web3.js)

La pregunta contract.method.call({gas: 1000000000})trata sobre web3.js, que está fuera de Solidity y EVM.

La API web3.js es web3.eth.call y es lo que se usa para las funciones de Solidityconstant .

Nadie recibe la tarifa porque la invocación de "ejecución en seco" es local para el nodo con el que está conectado web3.js: la red y los mineros no saben nada sobre esta invocación.

Sin embargo, a pesar de que la invocación es local, el gas todavía se "usa" y aún es posible quedarse sin gas o (auto) "DoS" al invocar una función de constante de solidez. Por ejemplo, como se explica en ¿Pueden las funciones constantes de solidez ser arbitrariamente complejas? , Geth "solo" proporciona invocaciones locales con 50 millones de gas:

if gas.Cmp(common.Big0) == 0 {
    gas = big.NewInt(50000000)
}

Para evitar un "auto DoS", pruebe con más gas comocontract.method.call({gas: 999000000})

Una razón más precisa por la que nadie cobra la tarifa es que el gas se mide, y la medición es diferente de las tarifas , extracto:

En Bitcoin, la medición se realiza con bytes: el número de bytes en la transacción. En Ethereum, el cálculo también debe medirse porque una pequeña cantidad de código aún podría ser un programa que se ejecuta para siempre. El cálculo de la medición es una de las razones del gas. Pero tener gas no significa cobrar cuotas.

Por ejemplo, en una cadena privada cada cuenta podría tener X gas por día, o cada cuenta podría tener Y gas por transacción, o algún otro esquema. Por otro lado, tener tarifas no significa necesitar gas: las tarifas pueden basarse en diferentes mediciones, como bytes. La seguridad en una cadena de bloques pública requiere gas y tarifas, mientras que las alternativas son más aplicables a las cadenas privadas (por ejemplo, un esquema en el que cada cuenta tiene X gas por día puede ser atacado por Sybil en una cadena pública donde cualquiera puede crear una cuenta) .

Una invocación de contrato con web3.eth.call todavía se mide, aunque no haya una tarifa resultante, y es por eso que el gas todavía está involucrado.

Dentro de la EVM (p. ej. Solidity)

En Solidity, calles una bestia completamente diferente y es una característica de bajo nivel para que un contrato envíe un mensaje a otro contrato, como se explica en ¿Qué significa la función de "llamada" de Solidity?

Una cosa a tener en cuenta es cuando .gasse usa, por ejemplo:

contract.call.gas(1000)(bytes4(sha3("methodName()")))

significa que la invocación de la subllamada a methodNamese limitará a 1000 gasolina: no significa proporcionar 1000 gasolina más a methodName.

Si Solidity se ejecuta en el contexto de una invocación local de "ejecución en seco", entonces la tarifa de transacción no se le otorga a nadie. Si el Solidity se está ejecutando en una transacción, la tarifa siempre va al minero del bloque, incluso si hay un error de ejecución o sin gas de cualquier tipo.

Aún no entiendo muchas cosas. Preguntaba por fuera de la convocatoria de EVM. Se dice que el gas todavía se "usa", pero nadie cobra la tarifa. Si se usa el gas, ¿a dónde va la tarifa? ¿Desaparece? o ¿Solo necesita especificar la tarifa, pero la tarifa no se envía o no va a nadie?
Cuando la ejecución no interactúa con la cadena de bloques, el saldo eth del originador de la transacción no cambiará al final.
Si el saldo del remitente no cambia, ¿cuál es el punto de especificar el gas en la llamada al método? ¿Por qué se llama esto "se usa gas"? Si no se cambia el equilibrio, parece que no se usa gas.
Gracias por las preguntas, actualicé esta respuesta para explicar la medición y también agregué otra que espero ayude: ethereum.stackexchange.com/a/10940/42
Probablemente entiendo lo que querías decir ahora. Lo que quiso decir con "Se usa gas" es que el parámetro de gas debe especificarse en el método de llamada si va a usar más de 50 millones de gas. ¿Tengo razón?
Tiene razón, debe especificar si hay más de 50 millones de gas para Geth (la paridad puede tener un comportamiento diferente). Ese es el punto práctico, y el concepto útil es que para las "llamadas", el EVM aún mide, a través del gas.

En el caso de que la transacción se ejecute con éxito, la tarifa real va al minero que resuelve el bloque. Para evitar la redundancia, solo señalaré algunos detalles aquí: ¿Cómo se comparan las tarifas de transacción de Ethereum con las de Bitcoin? . La conclusión aquí es que la tarifa no será de 1000000000 en la mayoría de los casos, pero no la excederá.

En caso de error de ejecución, el gas se destruye para siempre, por lo que nadie lo recibe.

También vale la pena mencionar que en el caso de "call" (frente a sendTransaction), la ejecución será local y no costará gasolina, por lo que al final, la persona que llama aún tendrá la gasolina prometida. El uso de "llamada" es común para las operaciones de solo lectura que no cambiarán de estado porque es más rápido y gratuito.

Usar "llamar" no siempre es gratis. Como escribí en la primera publicación, debe agregar el gas cuando el método hace mucho trabajo, incluso si usa la "llamada".
Veo a lo que te refieres ahora. Soy de mente abierta y curiosa. ¿Dónde puedo encontrar una explicación de la llamada no siempre es gratis?
Creo que no hay explicación, así que por favor pregúntenle a los comités geth.