Dirección del contrato. Costo del gas del método de transferencia.

¿Quién pagará la gasolina en el siguiente escenario?

Digamos que tenemos la siguiente función simple. Eso envía una cantidad del contrato al remitente... solo un ejemplo.

    function withdraw() public payable 
    {
       address member = msg.sender;
       member.transfer(msg.value);
    }

El remitente del método obviamente pagará la tarifa para enviar la transacción al método y ejecutar las declaraciones. Sin embargo, ¿quién pagará el combustible de la transacción resultante que se creará a partir de ese código?

En segundo lugar, en general sobre el transfer()método, cuáles son los parámetros predeterminados. Sé que usa un límite de gasolina de 2100, pero ¿qué pasa con el precio de la gasolina? Además, este gas proviene del valor pasado en o del saldo de los contratos y se transferirá la totalidad del valor.

No rechace la pregunta por "falta de investigación". Soy consciente de las condiciones habituales del gas procedente del saldo, a diferencia del valor de las transacciones. Solo curiosidad por el transfer()método en particular. Como no hay mucha documentación sobre su implementación, ya que difiere de send(), que pude encontrar.

Respuestas (3)

¿Quién pagará el combustible de la transacción resultante que se creará a partir de ese código?

La transfer()función no da como resultado una transacción. Da como resultado una llamada de mensaje dentro de la transacción original iniciada por una cuenta externa . La cadena de bloques registrará una sola transacción sin importar cuántas transfer()o call()invocaciones haya en el código. El costo del gas se deducirá de la cuenta externa que inició la transacción.

Sé que usa un límite de gasolina de 2100, pero ¿qué pasa con el precio de la gasolina?

Se utiliza el precio del gas especificado por el titular de la cuenta externa, que inició la transacción.

Además, este gas proviene del valor pasado en o del saldo de los contratos y se transferirá la totalidad del valor.

El costo del gas no se restará del contrato sino de la cuenta externa que inició la transacción. El costo del gas se suma al valor pasado. La cuenta externa debe tener un saldo mayor o igual a value + gaslimit * gasprice.

Solo tengo curiosidad sobre el método transfer() en particular. Como no hay mucha documentación sobre su implementación, ya que difiere de send(), que pude encontrar.

Al enviar ether, tenga en cuenta las compensaciones relativas entre el uso de someAddress.send(), someAddress.transfer()y someAddress.call.value()():

  • someAddress.send()y someAddress.transfer()se consideran seguros contra la reentrada. Si bien estos métodos aún desencadenan la ejecución del código, el contrato llamado solo recibe un estipendio de 2300 de gasolina, que actualmente solo es suficiente para registrar un evento.
  • x.transfer(y)es equivalente a require(x.send(y)), se revertirá automáticamente si falla el envío.
  • someAddress.call.value(y)()enviará el éter proporcionado y la ejecución del código de activación. El código ejecutado recibe todo el gas disponible para la ejecución, lo que hace que este tipo de transferencia de valor sea insegura contra la reentrada.

Usar send()o transfer()impedirá el reingreso pero lo hace a costa de ser incompatible con cualquier contrato cuya función de repliegue requiera más de 2.300 de gas. También es posible utilizar someAddress.call.value(ethAmount).gas(gasAmount)()para reenviar una cantidad personalizada de gas.

Un patrón que intenta equilibrar esta compensación es implementar un mecanismo de empujar y tirar, usando send()o transfer()para el componente de empuje y call.value()()para el componente de extracción.

Vale la pena señalar que el uso exclusivo de send()o transfer()para transferencias de valor no hace que un contrato sea en sí mismo seguro contra el reingreso, sino que solo hace que esas transferencias de valor específicas sean seguras contra el reingreso.

Puede leer más aquí https://consensys.github.io/smart-contract-best-practices/recommendations/#be-aware-of-the-tradeoffs- between-send-transfer-and-callvalue


Puede encontrar más detalles en esta respuesta https://ethereum.stackexchange.com/a/38642/18932

Recibí una notificación sobre esta pregunta. Volviendo a mirar esto 5 años después. Veo cómo entré en esa línea de pensamiento: me faltaba una comprensión más profunda del EVM. ¡Esa fue una respuesta muy útil!

El remitente del método obviamente pagará la tarifa para enviar la transacción al método y ejecutar las declaraciones. Sin embargo, ¿quién pagará el combustible de la transacción resultante que se creará a partir de ese código?

Tal vez no estoy leyendo esto correctamente, pero básicamente respondes y luego haces la pregunta. El remitente pagará por el gas.

En segundo lugar, en general sobre el método transfer(), ¿cuáles son los parámetros predeterminados? Sé que usa un límite de gasolina de 2100, pero ¿qué pasa con el precio de la gasolina? Además, este gas proviene del valor pasado en o del saldo de los contratos y se transferirá la totalidad del valor.

transfer()en realidad puede diferir en función de lo que realmente está en el propio código de solidez. No necesariamente tiene un valor predeterminado de 21000. En realidad, dado que la transferencia en realidad envía datos y no solo una transacción de pago directo, tendría que establecer un límite de gas más alto.

En cuanto al precio del gas y el límite de gas, su llamada de función real ya tiene un rango o nivel de gas establecido que utilizará en función de la complejidad del código en sí, la mayor parte proviene de agregar/alterar el almacenamiento.

El precio predeterminado del gas está determinado por el medio que utiliza para enviar la llamada. web3por ejemplo, examina la situación actual de la red utilizada y establece dinámicamente el precio del gas en función de la confirmación en 5-10 segundos.

El límite de gas también se establece web3dinámicamente según el uso de gas esperado para la llamada. 21000 se ve comúnmente para transferencias pagaderas que no tienen datos adicionales.

Sí, buen punto en la aclaración del primer punto. Provino de una mala comprensión del método transfer(). No sabía que no resultó en una segunda transacción.
Si pudiera marcar dos respuestas, su respuesta definitivamente responde y proporciona buena información. +1
La estimación de gas en transferencias simples devuelve una tarifa de gas de 21,040 al estimar con web3 o probar en remix. Espero que esto sea un error, ya que la mayoría de los intercambios de cifrado ahora están estableciendo un límite de gas de 21,000 en los retiros.

Niza qus, viniendo a tu puño qus:

El remitente del método obviamente pagará la tarifa para enviar la transacción al método y ejecutar las declaraciones. Sin embargo, ¿quién pagará el combustible de la transacción resultante que se creará a partir de ese código?

msg.sender pagará la gasolina. es decir, la persona que llama al método de retiro () pagará el costo de la transacción. Una vez que sus transacciones sean validadas y agregadas a blockchain, los mineros recibirán un incentivo.

Llegando a su segundo Qus Ans:

Puede establecer el valor del precio del gas y del gas especificando el gas y el precio del gas junto con los valores desde y hasta para la función sendTransaction()

web3.eth.sendTransaction({from: 'myWallet', to: 'coinbaseWallet', value: web3.toWei(0.1,'ether'),gas: 5000, gasPrice: web3.toWei(40,'gwei')});
Gracias. Conozco los parámetros predeterminados y aceptados para sendTransaction de Web3. Mi pregunta era específica de solidity's address.transfer()