¿Cómo transferir todo el saldo de una cuenta?

Si tengo una cuenta con 5 ETH, ¿puedo enviar el saldo total de la cuenta de 5 ETH a otra cuenta y recibir exactamente 5 ETH en la segunda cuenta?

Comprendí que fallará porque no me queda éter para pagar las tarifas de transacción.

Si quiero que la segunda cuenta reciba exactamente 5 ETH, creo que debería tener alrededor de 5,0002 ETH en mi cuenta para poder transferir 5 ETH. ¿Puedes confirmar?

Edité tu pregunta para que ambos respondieran de la misma manera, ya que ambos decían lo mismo, pero uno comenzó con un no y el otro con un sí 🤔

Respuestas (4)

No.

No puede enviar el saldo completo porque las tarifas se deducen del saldo de su cuenta, no del valor que se envía. Para barrer una cuenta, debe enviar balance-gas*priceETH como el value, y también configurar manualmente el gasy gasPricepara asegurarse de poner exactamente a cero su cuenta.

Por ejemplo, si tiene 5ETH y quiere barrer:

  • Una transacción simple de cuenta a cuenta cuesta 21000 gas
  • El precio mínimo actual del gas en la red es de 20 GWei
  • Establezca el valor en 5ETH - 21000*20GWei = 5ETH - 42K GWei = 4,999958ETH
Siempre me pregunté por qué no había una función integrada en el cliente para calcular esa cantidad ;) Claro que es bastante simple, pero para los principiantes es difícil ya que implica calcular cosas con nuevas cantidades desconocidas.
@euri10 y con diferencias de multiplicador de unidades. Todavía no puedo entender cómo calcular la tarifa en éter a partir del precio del gas Wei... Estoy de acuerdo, debería hacerse en la billetera.
20 Gwei no es el precio mínimo de la gasolina. Es el precio de la gasolina por defecto. Puede enviar transacciones con un precio de gas inferior a 20 Gwei.
Es el mínimo permitido por Geth por defecto. Aunque se permite configurarlo por debajo de eso, otros nodos en la red no aceptarán y, por lo tanto, no reenviarán su transacción a los mineros. Entonces, incluso si un minero aceptara tarifas más bajas, actualmente no podría hacérselo llegar. Esto se hace para evitar el spam en la red hasta que se pueda encontrar una solución dinámica adecuada (tenga en cuenta que también es un problema aún no resuelto para bitcoin).
21k por 20 no es 42k, es 420k. Creo que te has saltado un cero en tu respuesta y el valor debe ser 4,99958 en lugar de 4,999958. ¿no es así?
También me ha dejado perplejo por qué no hay una función integrada que haga el barrido.
Perdón por interrumpir la fiesta tarde, pero SI la dirección a la que está enviando es un contrato pagadero (no una cuenta externa), el gas debe configurarse en 22000. Además, una cuenta nueva (cuenta inexistente, es decir, sin historial en trie) tendrá un costo de 25000. Sugeriría editar la respuesta.

¡La respuesta básica es no!

Cada vez que desee realizar una transacción, deberá pagar una tarifa por el cálculo involucrado en la validación y extracción de su tx. Si no tienes suficiente gas, no puedes enviar tu tx a la red. En su ejemplo, envíe "todos" y el receptor obtendrá 5 menos las tarifas.

Mi sugerencia sería automatizarlo.

Primero, configure la cuenta y desbloquéela después del lanzamiento geth attach:

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

Ahora

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

Después de eso, se devuelve un TXID, que se puede usar para verificar si la transacción se completó.

Soy un principiante, ¡así que se agradecen las sugerencias sobre cómo mejorarlo aún más!

Thnx, ayudo a esto
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);
};