Как перевести весь баланс счета?

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

Я понял, что это не удастся, потому что у меня не осталось эфира, чтобы оплатить комиссию за транзакцию.

Если я хочу, чтобы вторая учетная запись получила ровно 5 ETH, я думаю, что на моей учетной записи должно быть около 50002 ETH, чтобы иметь возможность перевести 5 ETH. Можешь подтвердить?

Я отредактировал ваш вопрос, чтобы оба ответа могли отвечать одинаково, поскольку оба говорили одно и то же, но один начинался с «нет», а другой с «да» 🤔

Ответы (4)

Нет.

Вы не можете отправить весь баланс, потому что сборы вычитаются из баланса вашей учетной записи, а не из отправляемой суммы. Чтобы очистить учетную запись, вам нужно отправить balance-gas*priceETH как value, а также вручную установить gasи gasPrice, чтобы убедиться, что вы точно обнулили свою учетную запись.

Например, если у вас есть 5ETH и вы хотите его развернуть:

  • Простая транзакция со счета на счет стоит 21000 газа.
  • Текущая минимальная цена газа в сети составляет 20 ГВт.
  • Установите значение 5ETH - 21000 * 20GWei = 5ETH - 42K GWei = 4,999958ETH.
Я всегда задавался вопросом, почему в клиенте нет встроенной функции для расчета этой суммы ;) Конечно, это достаточно просто, но для новичков это сложно, так как это связано с вычислением вещей с новыми неизвестными величинами!
@ euri10 и с разницей в множителях единиц. Я до сих пор не могу понять, как рассчитать комиссию в эфире из цены на газ Wei... Согласен, это нужно делать в кошельке.
20 Gwei — это не минимальная цена на газ. Это стандартная цена на газ. Вы можете отправлять транзакции с ценой газа ниже 20 Gwei.
Это минимум, разрешенный Geth по умолчанию. Несмотря на то, что разрешено устанавливать его ниже, другие узлы в сети не примут и, следовательно, не передадут вашу транзакцию майнерам. Таким образом, даже если майнер согласится на более низкую комиссию, вы не сможете получить ее в настоящее время. Это делается для того, чтобы избежать сетевого спама, пока не будет найдено правильное динамическое решение (обратите внимание, что это еще не решенная проблема и для биткойнов).
21к умножить на 20 это не 42к, а 420к. Я думаю, что вы пропустили ноль в своем ответе, и значение должно быть 4,99958 вместо 4,999958. Не так ли?
Это также поставило меня в тупик, почему нет встроенной функции, которая выполняет развертку?
Извините за поздний срыв вечеринки, но ЕСЛИ адрес, на который вы отправляете, является контрактом с оплатой (а не внешней учетной записью), газ должен быть установлен на 22000. Кроме того, совершенно новая учетная запись (несуществующая учетная запись, иначе говоря, без истории) будет стоить 25000. Я бы предложил отредактировать ответ.

Основной ответ - нет!

В любое время, когда вы хотите выполнить транзакцию, вам придется заплатить комиссию за вычисления, связанные с проверкой и майнингом вашего tx. Если у вас недостаточно газа, вы не можете отправить свой tx в сеть. В вашем примере отправьте «все», и получатель получит 5 минус сборы.

Мое предложение состояло бы в том, чтобы автоматизировать это.

Сначала установите учетную запись и разблокируйте ее после запуска geth attach:

var accountNum = 0
personal.unlockAccount(eth.accounts[accountNum]);

В настоящее время

var amount_to_send_eth = web3.fromWei(eth.getBalance(eth.accounts[accountNum]), "ether");
var amount_to_send_wei = amount_to_send_eth *1000000000000000000
var transactionFee = web3.eth.gasPrice * 21001;
var total_amount_to_send_wei = transactionFee + amount_to_send_wei 
eth.sendTransaction({from:eth.accounts[accountNum], to:"0xD3ADB33FD3ADB33FD3ADB33F", value: total_amount_to_send_wei });

После этого возвращается TXID, который можно использовать для проверки завершения транзакции.

Я новичок, поэтому советы, как улучшить его, приветствуются!

Спасибо, помогу
var transferAll = function(from, to) {
  var gas = '30000';
  var gasPrice = eth.gasPrice;
  var gasTotal = gasPrice.mul(gas);
  var totalValue = eth.getBalance(from).sub(gasTotal)-1;
  console.log("Transfer :"+totalValue+", from "+from+" to "+to);
  personal.unlockAccount(from);
  var result = eth.sendTransaction({from: from, to: to, value: totalValue});
  console.log("Transaction hash:", result);
};