Woher weiß ein Smart Contract, welche Gase/Gebühren für die Ausführung einer Transaktion erforderlich sind?

Ich habe kürzlich Solidity für Visual Studio installiert und sie haben dieses Smart Contract-Beispiel dort:

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);
}
}

Grundsätzlich soll es die empfangenen Ether an 3 Adressen senden.

Aber ich glaube, der Code, so wie er ist, wird nicht funktionieren, da die letzte Transaktion nicht genug Gas haben wird, oder? Nur die ersten 2 würden ausgeführt.

Stellen Sie sich vor, der Vertrag enthält 10 ETH, 3,5 Eth + Gebühren / Gas werden an Adresse A gesendet, 3,5 Eth + Gebühren / Gas werden an Adresse B gesendet, jetzt haben wir nicht die restlichen benötigten 3 Eth für die dritte Adresse ...

Wie kann der Smart Contract also im Voraus wissen, welche Gase/Gebühren für die Transaktionen benötigt werden?

Warum hat die letzte Transaktion nicht genug Benzin? Das sieht so aus, als würde es gut funktionieren.
Bild dort 10 ETH im Vertrag, 3,5 Eth + Gebühren / Gas werden an Adresse A gesendet, 3,5 Eth + Gebühren / Gas werden an Adresse B gesendet, jetzt haben wir nicht die restlichen benötigten 3 Eth für die dritte Adresse ... Recht?
Gebühren stammen vom Konto des Absenders, nicht vom Auszahlungsvertrag. Der Sender hat sein ETH-Guthaben, das sich vom ETH-Guthaben des Auszahlungsvertrags unterscheidet.
Sie sagen also, wenn die Dividendenmethode aufgerufen wird, erkennt das Ethereum-Protokoll automatisch, dass 3 Transaktionen darin enthalten sind, und die Transaktionskosten für Gebühren und Benzin für diese 3 Transaktionen werden dem Absender zur Zahlung vorgelegt, wenn er die Transaktion durchführt Aufruf dieser Methode?
Anrufe zu anderen Verträgen und zum Senden sind keine separaten Transaktionen: Sie treten als Teil derselben Transaktion auf, in der der Vertrag ausgeführt wird, und verwenden denselben Gaszähler, wobei das Gas vom Anrufer des ursprünglichen Vertrags geliefert wird.
Die Antwort auf die Frage meines vorherigen Kommentars lautet also ja?

Antworten (2)

Grundsätzlich kennen Bergleute und Verträge die für eine Transaktion erforderlichen Gase/Gebühren nicht im Voraus: Sie müssen den Code in der Transaktion ausführen, um dies herauszufinden. Aus diesem Grund ist der gasin einer Transaktion angegebene Betrag der maximale Betrag, den die Transaktion zu verbrauchen bereit ist.


Um die beabsichtigte Frage zu beantworten, werden Gebühren aus dem Saldo des Absenderkontos (dem Konto, das anruft Dividend) gezahlt, das sich von dem Saldo des PayoutVertrags unterscheidet, der zwischen Victor et al.

Aber wie kann dieser Code dann funktionieren, wenn wir die Gebühren und das Benzin nicht im Voraus kennen? Die dritte Transaktion wird niemals ausgeführt
Ich habe die allgemeine Frage beantwortet, die gut ist. Das in der Frage gestellte Beispiel war verwirrend, aber ich verstehe, was Sie jetzt fragen, und kommentierte die Frage wie folgt: "Gebühren stammen vom Konto des Absenders, nicht vom Auszahlungsvertrag."
Ich habe die Antwort aktualisiert; wird einige Kommentare bereinigen, wenn sie nicht mehr benötigt werden.
Mit anderen Worten, was ich in meinem letzten Kommentar zu der Frage gefragt habe, ist, was passieren wird?

Stellen Sie sich Benzin vor, als wäre es Benzin in Ihrem Auto. Sie müssen nicht genau wissen, wie viel Gas Sie verbrauchen werden; Sie kaufen einfach mehr, als Sie denken, dass Sie brauchen werden, und wenn es ausgeht, hält das Auto einfach an.

In diesem Fall sendet der Absender eine bestimmte Menge Gas mit der Transaktion. Während der Code ausgeführt wird, verfolgt der Miner, wie viel Gas bisher verbraucht wurde. Wenn der Ausführung das Gas ausgeht, stoppt die Ausführung einfach und die gesamte Transaktion wird rückgängig gemacht, da sie nie stattgefunden hat. Der Bergmann darf das Gas jedoch behalten.