Возможно ли исчерпать все средства на счете Ethereum?

У меня есть учетная запись Ethereum, загруженная с помощью Ethers, и мне нужно потратить все из них , оставив окончательный баланс аккаунта ровно на ноль Weis . Возможно ли это?

Я знаю, используя метод eth_estimateGas() и умножая на gasPrice он вычисляет txCost, но действительно ли есть какая-либо гарантия, что это будет фактическая плата за следующую транзакцию? Оценка газа может измениться в соответствии с https://github.com/ethereum/go-ethereum/issues /2395 и цена на газ не фиксирована и не предсказуема https://etherscan.io/charts/gasprice

Есть ли способ выполнить транзакцию, зная точно окончательный баланс отправителя до его отправки?

5 голосов | спросил Juan Ignacio Pérez Sacristán 12 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 12 Sep 2016 18:20:33 +0300 2016, 18:20:33

1 ответ


4

Да , если вы переходите на внешнюю учетную запись (EOA).

Нет , если вы переходите на контрактную учетную запись.

Вы можете указать gasPrice (x gas), которые вы готовы заплатить за транзакцию, и шахтер решит, нужно ли вы совершать транзакции.

Для EOA газ всегда равен 21000, поэтому вы можете точно указать плату.

Для учетной записи контракта estimateGas(...) не всегда возвращает точный газ, необходимый для выполнения вашей транзакции (см. Каковы ограничения для оценкиGas и когда оценка будет значительно неправильной? ), поэтому вы не можете точно указать плату.

Из Затраты на газ и транзакции :

  

Ограничение по газу должно быть защищено от ошибок, пока ваши средства не будут исчерпаны. Продукт gasPrice и gas представляет собой максимальную сумму Wei, которую вы готовы заплатить за выполнение транзакции. То, что вы указываете как gasPrice, используется шахтерами для ранжирования транзакций для включения в блок-цепочку. Это цена в Вэй одной единицы газа, в которой оцениваются операции VM.

Вот пример:

> 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"

Завершена транзакция. В квитанции о транзакции показан использованный газ 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
}

И gasPrice - 15000000000, как указано в транзакции:

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

Проверьте учетную запись шахтера в блоке перед добытой транзакцией и в блоке, когда была проведена транзакция:

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

И вот разница, которая показывает 5-ю награду за добычу полезных ископаемых + сбор за транзакцию:

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

И подтверждая, что заработанные комиссионные транзакции: gas x specified gasPrice:

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



И это приводит к следующему вопросу: что произойдет, если вы укажете gasPrice выше текущего gasPrice

Итак, вот такая же информация с указанным gasPrice выше текущего gasPrice:

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

Получение транзакции:

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

Сведения о транзакции:

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

Изменение баланса показывает, что шахтер будет использовать указанный вами gasPrice и занять более высокие комиссионные сборы:

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

Подтверждение того, что транзакция использовала указанный вами gasPrice:

> new BigNumber(21000).times(25000000000)
525000000000000
ответил The Officious BokkyPooBah 12 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 12 Sep 2016 19:04:31 +0300 2016, 19:04:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132