Ist es möglich, alle Guthaben auf einem Ethereum-Konto aufzubrauchen?

Ich habe ein Ethereum-Konto, das mit Ether geladen ist, und ich muss sie alle ausgeben , sodass der Kontosaldo genau bei null Weis bleibt . Ist das möglich?

Ich weiß, dass die Methode verwendet und damit eth_estimateGas()multipliziert wird , aber gibt es wirklich eine Garantie dafür, dass dies die tatsächliche Gebühr meiner nächsten Transaktion ist? Die Gasschätzung könnte sich gemäß https://github.com/ethereum/go-ethereum/issues/2395 ändern und der Gaspreis ist weder festgelegt noch vorhersehbar https://etherscan.io/charts/gaspricegasPricetxCost

Gibt es eine Möglichkeit, eine Transaktion durchzuführen , bei der der endgültige Saldo des Absenders vor dem Senden genau bekannt ist?

Sie „müssen“ genau null wei zurücklassen? Wieso den?
Fügen Sie einfach eine Fiat-Buchhaltung hinzu, die über Blockchain geprüft wurde. Wenn ein Benutzer eine Auszahlung durchführt, sinkt das Guthaben auf Null.
Das scheint nicht so, als müsste es einen Saldo von genau Null hinterlassen. Ein paar hundert Benzin machen bei aktuellen Gaspreisen einen winzigen Bruchteil eines Pennys aus.

Antworten (1)

Ja , wenn Sie auf ein Externally Owned Account (EOA) überweisen.

Nein , wenn Sie auf ein Vertragskonto überweisen.

gasPriceSie können das ( ) angeben, das x gasSie für Ihre Transaktion zu zahlen bereit sind, und der Miner entscheidet, ob Ihre Transaktion abgebaut wird.

Bei einem EOA beträgt das Gas immer 21000, sodass Sie die Gebühr genau angeben können.

Bei einem Vertragskonto estimateGas(...)wird nicht immer genau das Gas zurückgegeben, das für die Ausführung Ihrer Transaktion erforderlich ist (siehe Welche Einschränkungen gibt es bei der Schätzung von Gas und wann wäre die Schätzung erheblich falsch? ), sodass Sie die Gebühr nicht genau angeben können.

Von Gas und Transaktionskosten :

Das Gaslimit soll Sie vor fehlerhaftem Code schützen, bis Ihr Guthaben aufgebraucht ist. Das Produkt aus gasPrice und gas stellt den maximalen Wei-Betrag dar, den Sie für die Ausführung der Transaktion zu zahlen bereit sind. Was Sie als gasPrice angeben, wird von Minern verwendet, um Transaktionen für die Aufnahme in die Blockchain einzustufen. Es ist der Preis in Wei für eine Einheit Gas, in dem VM-Operationen bepreist werden.

Hier ist ein Beispiel:

> eth.gasPrice
20000000000

// Specify a lower gasPrice
> eth.sendTransaction({from: eth.accounts[1], to: eth.accounts[2], gasPrice: 15000000000, value: web3.toWei(1, "ether")});
"0x9e53cb0268ae6b75303c46a20d869e2a6f95a93269a5c07bf5bf1f37ff6fea80"

Die Transaktion wird abgebaut. Der Transaktionsbeleg zeigt das verbrauchte Gas 21000:

> eth.getTransactionReceipt("0x9e53cb0268ae6b75303c46a20d869e2a6f95a93269a5c07bf5bf1f37ff6fea80");
{
  blockHash: "0xd0bd16c0a3064a5ee1d45762030080b1791d14ec80504f01c839577881696e60",
  blockNumber: 5706,
  contractAddress: "0x39236bc7d128340b345138d997854981eb4948e7",
  cumulativeGasUsed: 21000,
  from: "0x4d5bbe7fbc80933ffa90ece988a764e41ee6d018",
  gasUsed: 21000,
  logs: [],
  root: "86edc80b49786b7dc101c54f85659715661121a22e36dcfd90bf2c0961142493",
  to: null,
  transactionHash: "0x9e53cb0268ae6b75303c46a20d869e2a6f95a93269a5c07bf5bf1f37ff6fea80",
  transactionIndex: 0
}

Und der Gaspreis beträgt 15000000000, wie in der Transaktion angegeben:

> eth.getTransaction("0x9e53cb0268ae6b75303c46a20d869e2a6f95a93269a5c07bf5bf1f37ff6fea80");
{
  blockHash: "0xd0bd16c0a3064a5ee1d45762030080b1791d14ec80504f01c839577881696e60",
  blockNumber: 5706,
  from: "0x4d5bbe7fbc80933ffa90ece988a764e41ee6d018",
  gas: 90000,
  gasPrice: 15000000000,
  hash: "0x9e53cb0268ae6b75303c46a20d869e2a6f95a93269a5c07bf5bf1f37ff6fea80",
  input: "0x",
  nonce: 6,
  to: null,
  transactionIndex: 0,
  value: 1000000000000000000
}

Überprüfen Sie das Konto des Bergmanns im Block vor der geschürften Transaktion und im Block, als die Transaktion geschürft wurde:

> web3.fromWei(eth.getBalance(eth.accounts[0], 5705),"ether")
28522.81130279    
> web3.fromWei(eth.getBalance(eth.accounts[0], 5706),"ether")
28527.81161779

Und hier ist die Differenz, die die 5 ETH-Mining-Belohnung + die gesammelten Transaktionsgebühren zeigt:

> web3.fromWei(eth.getBalance(eth.accounts[0], 5706).minus(eth.getBalance(eth.accounts[0], 5705)),"wei")
5000315000000000000

Und die Bestätigung, dass die verdienten Transaktionsgebühren sind gas x specified gasPrice:

> new BigNumber(21000).times(15000000000)
315000000000000



Und das führt zur nächsten Frage: Was passiert, wenn Sie einen gasPricehöheren Wert als den Strom angeben gasPrice?

Also hier ist die gleiche Information mit der Angabe gasPricehöher als die aktuelle gasPrice:

> eth.sendTransaction({from: eth.accounts[1], to: eth.accounts[2], gasPrice: 25000000000, value: web3.toWei(1, "ether")});    
"0xcbd2a112c77baeca47550f49181fd2fcb05b3551b71f6180a30a55672c6aab3d"

Der Transaktionsbeleg:

> eth.getTransactionReceipt("0xcbd2a112c77baeca47550f49181fd2fcb05b3551b71f6180a30a55672c6aab3d")
{
  blockHash: "0x58ba7819f778f482930e67a2914c0174aaf92bfb680b407fa9bcd55cfe5e4e80",
  blockNumber: 5808,
  contractAddress: "0xc5c9b0194bb6184db6a278f96525718a45d310a5",
  cumulativeGasUsed: 21000,
  from: "0x4d5bbe7fbc80933ffa90ece988a764e41ee6d018",
  gasUsed: 21000,
  logs: [],
  root: "68774aad53457e6cd4cd3b9344235e43a021366ff9763156224dbf07101b55af",
  to: null,
  transactionHash: "0xcbd2a112c77baeca47550f49181fd2fcb05b3551b71f6180a30a55672c6aab3d",
  transactionIndex: 0
}

Die Transaktionsdetails:

> eth.getTransaction("0xcbd2a112c77baeca47550f49181fd2fcb05b3551b71f6180a30a55672c6aab3d")
{
  blockHash: "0x58ba7819f778f482930e67a2914c0174aaf92bfb680b407fa9bcd55cfe5e4e80",
  blockNumber: 5808,
  from: "0x4d5bbe7fbc80933ffa90ece988a764e41ee6d018",
  gas: 90000,
  gasPrice: 25000000000,
  hash: "0xcbd2a112c77baeca47550f49181fd2fcb05b3551b71f6180a30a55672c6aab3d",
  input: "0x",
  nonce: 7,
  to: null,
  transactionIndex: 0,
  value: 1000000000000000000
}

Die Veränderung des Kontostands zeigt, dass der Miner Ihre angegebenen verwenden gasPriceund die höheren Transaktionsgebühren einstreichen wird:

> web3.fromWei(eth.getBalance(eth.accounts[0], 5808).minus(eth.getBalance(eth.accounts[0], 5807)),"wei")
5000525000000000000

Bestätigen, dass die Transaktion Ihre angegebenen verwendet hat gasPrice:

> new BigNumber(21000).times(25000000000)
525000000000000
Perfekte Erklärung, vielen Dank. Nur ein Zweifel: Wenn eth.gasPrice 20000000000 ist, wie ist es möglich, dass Ethereum die erste Transaktion mit einem niedrigeren gasPrice akzeptiert: 15000000000 ?
Tatsächlich ist es auf mehr als eine Weise möglich, eine genaue Gasmenge an einen Vertrag zu senden. Erstens, da Ethereum völlig deterministisch ist, ist es mit einigem Aufwand möglich, in vielen Fällen genau zu wissen, wie viel Gas eine Transaktion verbrauchen wird. Zweitens ist es möglich, einen Vertrag zu erstellen, der garantiert fast das gesamte Gas verbraucht, das Sie ihm senden. Sie verwenden nur einen Low-Level-Anruf, um die eigentliche Übertragung durchzuführen, und verschwenden dann den Rest des Gases. Dies kann dazu führen, dass Sie weniger als 6 Gas übrig haben, was ehrlich gesagt nichts ist.