¿Cómo sabe un contrato inteligente el gas/las tarifas necesarias para ejecutar una transacción?

Instalé recientemente Solidity para Visual Studio y tienen esta muestra de Smart Contract allí:

contract Payout {
address Victor;
address Jim;
address Kieren;

mapping (address => uint) ownershipDistribution; 

function Setup() {
  Victor = 0xaabb;
  Jim    = 0xccdd;
  Kieren = 0xeeff;

  ownershipDistribution[Victor] = 35;
  ownershipDistribution[Jim]  = 35;
  ownershipDistribution[Kieren] = 30;
}

function Dividend() {
  uint bal= this.balance;
  Victor.send(bal * ownershipDistribution[Victor] / 100); 
  Jim.send(bal * ownershipDistribution[Jim] / 100);
  Kieren.send(bal * ownershipDistribution[Kieren] / 100);
}
}

Básicamente se supone que debe enviar los éteres que recibe a 3 direcciones.

Pero creo que el código tal como está no funcionará, ya que la última transacción no tendrá suficiente gasolina, ¿verdad? Solo los 2 primeros se ejecutarían.

Imagine que hay 10 ETH en el contrato, se enviarán 3,5 Eth + tarifas / gas a la dirección A, 3,5 Eth + tarifas / gas se enviarán a la dirección B, ahora no tenemos los 3 Eth restantes necesarios para la tercera dirección...

Entonces, ¿cómo puede Smart Contract saber por adelantado el gas/las tarifas necesarias para las transacciones?

¿Por qué la última transacción no tendrá suficiente gasolina? Esto parece que funcionaría bien.
Imagen allí 10 ETH en el contrato, 3.5 Eth + tarifas / gas se enviarán a la dirección A, 3.5 Eth + tarifas / gas se enviarán a la dirección B, ahora no tenemos los 3 Eth restantes necesarios para la tercera dirección... ¿Derecha?
Las tarifas provienen de la cuenta del remitente, no del contrato de pago. El remitente tiene su saldo ETH que es diferente del saldo ETH del contrato de pago.
Entonces, usted está diciendo que cuando se llama al método de dividendos, el protocolo ethereum detectará automáticamente que hay 3 transacciones dentro de él y los costos de transacción por tarifas y gas para esas 3 transacciones se presentarán para que el remitente pague cuando realice la transacción. llamando a ese método?
Las llamadas a otros contratos y para enviar no son transacciones separadas: ocurren como parte de la misma transacción en la que se ejecuta el contrato y usan el mismo contador de gas, con el gas suministrado por la persona que llama del contrato original.
Entonces, la respuesta a la pregunta de mi comentario anterior es sí.

Respuestas (2)

Básicamente, los mineros y los contratistas no conocen de antemano el gas/las tarifas necesarias para una transacción: tienen que ejecutar el código en la transacción para averiguarlo. Es por esto que lo gasespecificado en una transacción, es la cantidad máxima que la transacción está dispuesta a consumir.


Para responder a la pregunta planteada, las tarifas se pagan del saldo de la cuenta del remitente (la cuenta que llama Dividend), que es diferente del saldo del Payoutcontrato que se divide entre Víctor y otros.

Pero, ¿cómo puede funcionar este código entonces si no conocemos las tarifas y el gas por adelantado? La tercera transacción nunca se ejecutará.
Respondí la pregunta general, que es buena. El ejemplo que se hizo en la pregunta fue confuso, pero entiendo lo que está preguntando ahora y comenté a la pregunta que "las tarifas provienen de la cuenta del remitente, no del contrato de pago".
Actualicé la respuesta; limpiará algunos comentarios si ya no son necesarios.
Entonces, en otras palabras, lo que pregunté en mi último comentario sobre la pregunta es ¿qué pasará?

Piense en la gasolina como si fuera gasolina en su automóvil. No necesita saber de antemano exactamente cuánto gas va a usar; simplemente compra más de lo que cree que necesitará, y si se le acaba, el automóvil simplemente se detiene.

En este caso, el remitente envía una cierta cantidad de gas con la transacción. A medida que se ejecuta el código, el minero realiza un seguimiento de la cantidad de gas que se ha utilizado hasta el momento. Si la ejecución se queda sin gas, la ejecución simplemente se detiene y toda la transacción se revierte como nunca sucedió. Sin embargo, el minero se queda con el gas.