¿Se reembolsa la tarifa de gas si la transacción falla?

Estoy confundiendo la regla de pagar la tarifa del gas cuando la persona que llama realiza una transacción.

La tarifa de gas es necesaria cuando se realiza la transacción y sé que require () es la función de guardia que devuelve toda la tarifa de gas a la persona que llama.

¿Se paga la tarifa del gas después de todas las operaciones en la función del contrato inteligente?

Entonces, si la función require () se coloca al comienzo de la función y los códigos no se operan en absoluto, ¿significa eso que no se necesita una tarifa de gas?

¿Y si el valor en esa instrucción require() es una condición falsa y, por lo tanto, la transacción falla?

¿Se reembolsa el 100% de la tarifa de gas a la persona que llama o la persona que llama tiene que pagar una tarifa de gas restante después de que algunas operaciones en la función funcionaron?

¿Se le puede reembolsar todo el gas a la persona que llama?

function burn(uint256 _value) public returns (bool success) {
    require(balances[msg.sender] >= _value);
    balances[msg.sender] = balances[msg.sender].sub(_value);
    totalSupply = totalSupply.sub(_value);
    Burn(msg.sender, _value);
    return true;
}

Si la tarifa del gas debe pagarse después de que se haya ejecutado el código, ¿qué sucede si la persona que llama (msg.sender) no puede pagar la tarifa del gas porque la cuenta de la persona que llama no tiene saldo después del pase condicional requerido ()?

Dudo que sepa bien.

Respuestas (2)

El gas tiene que ser suministrado con la transacción firmada. La función de contrato no se puede llamar a menos que se suministre gas. No hay forma de sobregirar la cuenta. Es como el combustible de tu coche. Necesita algo para comenzar, y si hay suficiente, llegará a su destino. Si no hay suficiente, todo se detiene.

El código fuente se compila en código ensamblador y cada vez que sucede algo, se utilizan OPCODES. El gas se cobra por los OPCODES, a medida que se usa, por lo que incluso si la primera línea es a require()y es false, se necesitaron muchos OPCODES para desempaquetar los datos de la transacción y evaluarlos require(), por lo que se quemó algo de gas.

Si se devuelve gas al firmante, es el gas restante. Esto es como llenar su tanque y luego abortar su viaje. Tal vez quemaste un poco mientras el motor estaba funcionando, pero aún tienes la mayor parte.

Si se desarrolla una gran cantidad de procesamiento antes de la operación fallida que revierte todo, es posible que la mayor parte del gas se haya agotado.

Espero eso ayude.

¡Excelentes analogías!
¡Gracias por la buena explicación! ¡Es fácil de entender! Gracias.

Por cada operación ejecutada por EVM, se consume una cierta cantidad de gas. Si alguna instrucción hace que la transacción falle, la ejecución se detiene y no se usa más gas después de ese punto.

¿Se paga la tarifa del gas después de todas las operaciones en la función que está en el contrato inteligente?

El gas se consume en cada paso de la ejecución de la transacción.

Entonces, si la función require () se coloca al comienzo de la función y los códigos no se operan en absoluto, ¿no se necesita una tarifa de gas?

Sí. Si require hace que la ejecución se detenga, no se consume más gas, por lo que no se usa más gas después de la ejecución de require.

¿Y si el valor no es válido en esa condición de instrucción require() y la transacción falló?

Como se indica en la primera declaración, se usará gas en cada paso. Y continuará hasta la instrucción que haga que la transacción falle. Es por esto que se prefiere saber de antemano si la transacción falla o no. Y para ello, estos controles se colocan al principio.

¿La tarifa de gas se reembolsará al 100 % a la persona que llama o la persona que llama tiene que pagar una tarifa de gas restante después de que algunas operaciones funcionaran en la función?

Tiene que pagar una tarifa de gas restante después de que algunas operaciones trabajaron en la función

¿Se le puede reembolsar a la persona que llama toda la tarifa de gas?

No. requireTambién usa algo de gasolina, y eso no será reembolsado. Se ha consumido.

Si la tarifa del gas debe pagarse después de que se haya ejecutado el código, ¿qué sucede si la persona que llama (msg.sender) no puede pagar la tarifa del gas porque la cuenta de la persona que llama no tiene saldo después del pase condicional requerido ()?

gas fee = amount of gas* price of 1 gas

Entonces se consume gas . El cliente Blockchain (geth/parity/...) no aceptará la transacción en la que gasPrice*amountOfGasexceda el saldo de la cuenta. Entonces vemos que el precio del gas se paga cuando la transacción se envía al cliente de blockchain.