Fragmentos de JavaScript útiles comunes para geth

En geth puedes cargar cualquier .jsarchivo.

Descubrí este en la wiki que me gusta mucho:

function checkAllBalances() { 
  var i =0; 
  eth.accounts.forEach( function(e){
    console.log("  eth.accounts["+i+"]: " +  e + " \tbalance: " + web3.fromWei(eth.getBalance(e), "ether") + " ether"); 
    i++; 
  })
};

¿Utiliza con frecuencia otros? Una especie de repositorio de 'clásicos' o 'imprescindibles' sería un gran recurso para tener.

Aquí resumí todos los scripts y creé un solo archivo a partir de ellos niksmac/ethereum-scripts
Entonces, no entiendo cómo cargamos estos scripts. Supongo que guardo el script individual que quiero usar como un archivo .js. Pero entonces, ¿cómo lo cargo en Geth?
Solo me devuelve verdadero cuando llamo desde otra terminal. Así que está trabajando pero no devuelve saldos.

Respuestas (12)

Script para encontrar transacciones hacia/desde una cuenta

Uso

Encuentre todas las transacciones hacia/desde eth.accounts[0]dentro de los últimos 1000 bloques:

> getTransactionsByAccount(eth.accounts[0])

Encuentre todas las transacciones hacia/desde la cuenta de The DAO0xbb9bc244d798123fde783fcc1c72d3bb8c189413 entre los bloques 1,432,400 y 1,432,423:

> getTransactionsByAccount("0xbb9bc244d798123fde783fcc1c72d3bb8c189413", 1432400, 1432423)

Encuentre todas las transacciones hacia/desde cualquier cuenta en los últimos 1000 bloques:

> getTransactionsByAccount("*")


La secuencia de comandos

function getTransactionsByAccount(myaccount, startBlockNumber, endBlockNumber) {
  if (endBlockNumber == null) {
    endBlockNumber = eth.blockNumber;
    console.log("Using endBlockNumber: " + endBlockNumber);
  }
  if (startBlockNumber == null) {
    startBlockNumber = endBlockNumber - 1000;
    console.log("Using startBlockNumber: " + startBlockNumber);
  }
  console.log("Searching for transactions to/from account \"" + myaccount + "\" within blocks "  + startBlockNumber + " and " + endBlockNumber);

  for (var i = startBlockNumber; i <= endBlockNumber; i++) {
    if (i % 1000 == 0) {
      console.log("Searching block " + i);
    }
    var block = eth.getBlock(i, true);
    if (block != null && block.transactions != null) {
      block.transactions.forEach( function(e) {
        if (myaccount == "*" || myaccount == e.from || myaccount == e.to) {
          console.log("  tx hash          : " + e.hash + "\n"
            + "   nonce           : " + e.nonce + "\n"
            + "   blockHash       : " + e.blockHash + "\n"
            + "   blockNumber     : " + e.blockNumber + "\n"
            + "   transactionIndex: " + e.transactionIndex + "\n"
            + "   from            : " + e.from + "\n" 
            + "   to              : " + e.to + "\n"
            + "   value           : " + e.value + "\n"
            + "   time            : " + block.timestamp + " " + new Date(block.timestamp * 1000).toGMTString() + "\n"
            + "   gasPrice        : " + e.gasPrice + "\n"
            + "   gas             : " + e.gas + "\n"
            + "   input           : " + e.input);
        }
      })
    }
  }
}


Ejemplo

Buscar transacciones hacia/desde eth.accounts[0]la dirección:

> getTransactionsByAccount(eth.accounts[0])
Using endBlockNumber: 1864
Using startBlockNumber: 864
Searching for transactions to/from account "0xa7857047907d53a2e494d5f311b4b586dc6a96d2" within blocks 864 and 1864
Searching block 1000
  tx hash          : 0x3c3bc3c456a84e20cf0077f9aa5ce363d3b12bca18d01000a750288c2e76401e
   nonce           : 44
   blockHash       : 0xef2d15775908951fc61f9a83b53c00cf2cde4e0def93e20544f784441c6178db
   blockNumber     : 1582
   transactionIndex: 0
   from            : 0xa7857047907d53a2e494d5f311b4b586dc6a96d2
   to              : null
   value           : 0
   time            : 1470459255 Sat, 06 Aug 2016 04:54:15 GMT
   gasPrice        : 20000000000
   gas             : 24615
   input           : 0x6060604052600a8060106000396000f360606040526008565b00
  tx hash          : 0xc255cdbf477452eb8922d8230889f7cc08b9deed4695378aba3d97906071ce5f
   nonce           : 45
   blockHash       : 0x987a8214af96bb1530b97fe09da8f8168679e42c9efb4defee50800f2067d6d8
   blockNumber     : 1587
   transactionIndex: 0
   from            : 0xa7857047907d53a2e494d5f311b4b586dc6a96d2
   to              : null
   value           : 0
   time            : 1470459409 Sat, 06 Aug 2016 04:56:49 GMT
   gasPrice        : 20000000000
   gas             : 24615
   input           : 0x6060604052600a8060106000396000f360606040526008565b00
...
@KalyanKumar, rechacé su edición porque el verdadero en la eth.getBlock(i, true);llamada a la función devuelve todos los objetos de transacción, por lo que no necesita la función de mapa para recuperar los objetos de transacción.
Se ve muy bien, excepto que espera un mínimo de 1000 bloques. En mi configuración de prueba, no tenía tantos. La línea 7 debería ser startBlockNumber = Math.max(endBlockNumber - 1000,0);.
@VikramRao, ¿hay alguna razón por la que no puedas cambiarlo a menos de mil?
@RameshPareek, seguro que puede seleccionar el tamaño del lote. en mi caso, si supongamos que hay menos de batch size(1000 en este ejemplo), el script no funcionaría y, por lo tanto, agregué un archivo min.
Creo que eso es trivial.
@TheOfficiousBokkyPooBah ¿Es posible ejecutar este script en un Nodejs? ¿Qué lib podemos usar que sea similar al ethobjeto en su código?
¿Cómo encontrar un para más de 1000 cuentas?
Precaución, eth.getBlockdevuelve una Promesa.
eth.accountsno funciona aquí uso eth.getAccounts(callback)_

1. ¡Mina solo cuando hay transacciones!

var mining_threads = 1

function checkWork() {
    if (eth.getBlock("pending").transactions.length > 0) {
        if (eth.mining) return;
        console.log("== Pending transactions! Mining...");
        miner.start(mining_threads);
    } else {
        miner.stop(0);  // This param means nothing
        console.log("== No transactions! Mining stopped.");
    }
}

eth.filter("latest", function(err, block) { checkWork(); });
eth.filter("pending", function(err, block) { checkWork(); });

checkWork();

2. Obtenga algunos datos de geth sin iniciar el nodo.

$ geth --exec "eth.accounts" console 2>/dev/null

["0x0000000000000000000000000000000000000000"]

3. Ver una transacción

function printTransaction(txHash) {
  var tx = eth.getTransaction(txHash);
  if (tx != null) {
    console.log("  tx hash          : " + tx.hash + "\n"
      + "   nonce           : " + tx.nonce + "\n"
      + "   blockHash       : " + tx.blockHash + "\n"
      + "   blockNumber     : " + tx.blockNumber + "\n"
      + "   transactionIndex: " + tx.transactionIndex + "\n"
      + "   from            : " + tx.from + "\n" 
      + "   to              : " + tx.to + "\n"
      + "   value           : " + tx.value + "\n"
      + "   gasPrice        : " + tx.gasPrice + "\n"
      + "   gas             : " + tx.gas + "\n"
      + "   input           : " + tx.input);
  }
}

4. Imprimir los detalles de un bloque

function printBlock(block) {
  console.log("Block number     : " + block.number + "\n"
    + " hash            : " + block.hash + "\n"
    + " parentHash      : " + block.parentHash + "\n"
    + " nonce           : " + block.nonce + "\n"
    + " sha3Uncles      : " + block.sha3Uncles + "\n"
    + " logsBloom       : " + block.logsBloom + "\n"
    + " transactionsRoot: " + block.transactionsRoot + "\n"
    + " stateRoot       : " + block.stateRoot + "\n"
    + " miner           : " + block.miner + "\n"
    + " difficulty      : " + block.difficulty + "\n"
    + " totalDifficulty : " + block.totalDifficulty + "\n"
    + " extraData       : " + block.extraData + "\n"
    + " size            : " + block.size + "\n"
    + " gasLimit        : " + block.gasLimit + "\n"
    + " gasUsed         : " + block.gasUsed + "\n"
    + " timestamp       : " + block.timestamp + "\n"
    + " transactions    : " + block.transactions + "\n"
    + " uncles          : " + block.uncles);
    if (block.transactions != null) {
      console.log("--- transactions ---");
      block.transactions.forEach( function(e) {
        printTransaction(e);
      })
    }
}

5. Consultar todos los saldos

function checkAllBalances() { 
 var i =0; 
 eth.accounts.forEach( function(e){
    console.log("  eth.accounts["+i+"]: " +  e + " \tbalance: " +    web3.fromWei(eth.getBalance(e), "ether") + " ether"); 
  i++; 
 })
};

Fuentes

  1. https://github.com/ethereum/go-ethereum/wiki/bitchin-tricks
  2. https://ethereum.stackexchange.com/a/2928/259
@Nikhil M. Estaba probando el ejemplo que diste para "¡Mío solo cuando hay transacciones!" Pero no puedo usar el comando "miner.start (2)", parece que necesito alguna biblioteca, pero seguro que no está allí en web3.js. Gracias por adelantado.
@Sushant ¿qué error?
checkWork() no es confiable. Ocasionalmente, observo que hay txs pendientes, pero la minería no comienza. Por ejemplo, eth.getBlock("pendiente").transactions.length == 0, eth.pendingTransactions.length == 3, pero eth.mining == false
@sinoTrinity, es un script antiguo, siéntase libre de mejorar según sea necesario.
¿ Quizás cambiar a eth.getBlock("pending").transactions.length > 0 || eth.pendingTransactions.length > 0? Sin embargo, no he verificado esto.
La última versión de github.com/ethereum/go-ethereum/wiki/bitchin-tricks está disponible en el ID de confirmación 34cfee511a49cb3a01a51380be18212f20a01933 La versión actual no tiene ese archivo.

Script para encontrar un recuento de transacciones distinto de cero en un rango de bloques

(Actualización 22/04/2016)

Aquí hay una secuencia de comandos para verificar la cantidad de transacciones entre un número de bloque inicial y un número de bloque final:

function checkTransactionCount(startBlockNumber, endBlockNumber) {
  console.log("Searching for non-zero transaction counts between blocks "  + startBlockNumber + " and " + endBlockNumber);

  for (var i = startBlockNumber; i <= endBlockNumber; i++) {
    var block = eth.getBlock(i);
    if (block != null) {
      if (block.transactions != null && block.transactions.length != 0) {
        console.log("Block #" + i + " has " + block.transactions.length + " transactions")
      }
    }
  }
}

Ejecutar los scripts para los bloques 1 a 46146 muestra los siguientes resultados: ¡no hay transacciones!:

> checkTransactionCount(1, 46146)
Searching for non-zero transaction counts between blocks 1 and 46146
undefined

Comprobemos que el script funciona como se esperaba:

> eth.blockNumber
1382234
> checkTransactionCount(1382224, 1382234)
Searching for non-zero transaction counts between blocks 1382224 and 1382234
Block #1382224 has 4 transactions
Block #1382225 has 2 transactions
Block #1382226 has 4 transactions
Block #1382227 has 6 transactions
Block #1382228 has 17 transactions
Block #1382231 has 2 transactions
Block #1382234 has 1 transactions
undefined

Hay algunas transacciones incluidas en 46147 a 46200:

> checkTransactionCount(46147, 46200)
Searching for non-zero transaction counts between blocks 46147 and 46200
Block #46147 has 1 transactions
Block #46169 has 1 transactions
Block #46170 has 1 transactions
Block #46194 has 1 transactions
undefined
Precaución, eth.getBlock devuelve una Promesa.

Script para encontrar bloques y tíos minados + Transacciones de lista

Aquí están mis scripts para verificar e imprimir bloques, tíos y transacciones. Esto se escribió originalmente como respuesta a la pregunta ¿Cómo sé si un bloque enviado se convirtió en tío? .

Los he enumerado por separado para facilitar la lectura. Si tiene la intención de usarlo en geth, probablemente querrá concatenar las siguientes 5 funciones en un solo archivo para copiar y pegar fácilmente en la gethconsola. Y simplemente elimine el campo que no necesita ver.

imprimirTransacción(txHash)

function printTransaction(txHash) {
  var tx = eth.getTransaction(txHash);
  if (tx != null) {
    console.log("  tx hash          : " + tx.hash + "\n"
      + "   nonce           : " + tx.nonce + "\n"
      + "   blockHash       : " + tx.blockHash + "\n"
      + "   blockNumber     : " + tx.blockNumber + "\n"
      + "   transactionIndex: " + tx.transactionIndex + "\n"
      + "   from            : " + tx.from + "\n" 
      + "   to              : " + tx.to + "\n"
      + "   value           : " + tx.value + "\n"
      + "   gasPrice        : " + tx.gasPrice + "\n"
      + "   gas             : " + tx.gas + "\n"
      + "   input           : " + tx.input);
  }
}

imprimirBloque(bloque)

function printBlock(block) {
  console.log("Block number     : " + block.number + "\n"
    + " hash            : " + block.hash + "\n"
    + " parentHash      : " + block.parentHash + "\n"
    + " nonce           : " + block.nonce + "\n"
    + " sha3Uncles      : " + block.sha3Uncles + "\n"
    + " logsBloom       : " + block.logsBloom + "\n"
    + " transactionsRoot: " + block.transactionsRoot + "\n"
    + " stateRoot       : " + block.stateRoot + "\n"
    + " miner           : " + block.miner + "\n"
    + " difficulty      : " + block.difficulty + "\n"
    + " totalDifficulty : " + block.totalDifficulty + "\n"
    + " extraData       : " + block.extraData + "\n"
    + " size            : " + block.size + "\n"
    + " gasLimit        : " + block.gasLimit + "\n"
    + " gasUsed         : " + block.gasUsed + "\n"
    + " timestamp       : " + block.timestamp + "\n"
    + " transactions    : " + block.transactions + "\n"
    + " uncles          : " + block.uncles);
    if (block.transactions != null) {
      console.log("--- transactions ---");
      block.transactions.forEach( function(e) {
        printTransaction(e);
      })
    }
}

imprimirTío(bloque, tíoNúmero, tío)

function printUncle(block, uncleNumber, uncle) {
  console.log("Block number     : " + block.number + " , uncle position: " + uncleNumber + "\n"
    + " Uncle number    : " + uncle.number + "\n"
    + " hash            : " + uncle.hash + "\n"
    + " parentHash      : " + uncle.parentHash + "\n"
    + " nonce           : " + uncle.nonce + "\n"
    + " sha3Uncles      : " + uncle.sha3Uncles + "\n"
    + " logsBloom       : " + uncle.logsBloom + "\n"
    + " transactionsRoot: " + uncle.transactionsRoot + "\n"
    + " stateRoot       : " + uncle.stateRoot + "\n"
    + " miner           : " + uncle.miner + "\n"
    + " difficulty      : " + uncle.difficulty + "\n"
    + " totalDifficulty : " + uncle.totalDifficulty + "\n"
    + " extraData       : " + uncle.extraData + "\n"
    + " size            : " + uncle.size + "\n"
    + " gasLimit        : " + uncle.gasLimit + "\n"
    + " gasUsed         : " + uncle.gasUsed + "\n"
    + " timestamp       : " + uncle.timestamp + "\n"
    + " transactions    : " + uncle.transactions + "\n");
}

getMinedBlocks(minero, startBlockNumber, endBlockNumber)

Si startBlockNumberno se especifica, se establecerá de forma predeterminada en los últimos 10.000 bloques. Esto toma algo de tiempo para escanear, así que reduzca este número a 1000 para reducir el tiempo de escaneo.

Si endBlockNumberno se especifica, se establecerá de forma predeterminada en el último número de bloque.

function getMinedBlocks(miner, startBlockNumber, endBlockNumber) {
  if (endBlockNumber == null) {
    endBlockNumber = eth.blockNumber;
    console.log("Using endBlockNumber: " + endBlockNumber);
  }
  if (startBlockNumber == null) {
    startBlockNumber = endBlockNumber - 10000;
    console.log("Using startBlockNumber: " + startBlockNumber);
  }
  console.log("Searching for miner \"" + miner + "\" within blocks "  + startBlockNumber + " and " + endBlockNumber + "\"");

  for (var i = startBlockNumber; i <= endBlockNumber; i++) {
    if (i % 1000 == 0) {
      console.log("Searching block " + i);
    }
    var block = eth.getBlock(i);
    if (block != null) {
      if (block.miner == miner || miner == "*") {
        console.log("Found block " + block.number);
        printBlock(block);
      }
      if (block.uncles != null) {
        for (var j = 0; j < 2; j++) {
          var uncle = eth.getUncle(i, j);
          if (uncle != null) {
            if (uncle.miner == miner || miner == "*") {
              console.log("Found uncle " + block.number + " uncle " + j);
              printUncle(block, j, uncle);
            }
          }          
        }
      }
    }
  }
}

getMyMinedBlocks(startBlockNumber, endBlockNumber)

function getMyMinedBlocks(startBlockNumber, endBlockNumber) {
  getMinedBlocks(eth.accounts[0], startBlockNumber, endBlockNumber);
}

Ejemplos para usar la función anterior

Estos son algunos ejemplos del uso de las funciones anteriores en la red principal pública Ethereum.

  • Bloque de impresión extraído por "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5". Ver https://etherscan.io/block/1325630

    getMinedBlocks("0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5", 1325620, 1325640);
    
  • Imprimir bloque con tíos minado por "0xf3b9d2c81f2b24b0fa0acaaa865b7d9ced5fc2fb". Ver https://etherscan.io/block/1325635

    getMinedBlocks("0xf3b9d2c81f2b24b0fa0acaaa865b7d9ced5fc2fb", 1325630, 1325640);
    

    con la salida:

    > getMinedBlocks("0xf3b9d2c81f2b24b0fa0acaaa865b7d9ced5fc2fb", 1325630, 1325640);
    Searching for miner "0xf3b9d2c81f2b24b0fa0acaaa865b7d9ced5fc2fb" within blocks 1325630 and 1325640"
    Found uncle 1325635 uncle 0
    Block number     : 1325635 , uncle position: 0
     Uncle number    : 1325634
     hash            : 0xae03bb2d5f1fbde4e22bf79850307ab6ae7d8545a9f0de4a5f529095546308c0
     parentHash      : 0x771b46e0310666780a55b1d603648d89e7d8cc3feac20a175117b4cb7e206a75
     nonce           : 0xeff5922de2f569e8
     sha3Uncles      : 0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347
     logsBloom       : 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
     transactionsRoot: 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
     stateRoot       : 0xafca80bc836c00c7eeb4b6f3254573f72d38a0738ce4793da7d5222ed6c0c5cd
     miner           : 0xf3b9d2c81f2b24b0fa0acaaa865b7d9ced5fc2fb
     difficulty      : 26564802678158
     totalDifficulty : 0
     extraData       : 0x426974436c756220455448204d696e696e6720506f6f6c
     size            : 0
     gasLimit        : 4712388
     gasUsed         : 0
     timestamp       : 1460501836
     transactions    : undefined
    
  • Imprimir bloque con tíos. Ver https://etherscan.io/block/907703

    getMinedBlocks("*", 907703, 907703);
    
  • Imprimir bloques que mi minero ha extraído entre los bloques 1321603 y 1321605

    getMyMinedBlocks(1321603, 1321605);
    
printTransactionfunciona para mí, pero printBlocksolo devuelve indefinido para cada parámetro. Block number undefined, hash undefined, parentHash undefinedetc. ¿Lo llamas simplemente como printBlock("17020")?
printBlock(...)necesita ser llamado por getMinedBlocks(...). O puedes usarprintBlock(eth.getBlock(17020))

Manera RÁPIDA de escanear bloques para transacciones en una cuenta

Vea el código fuente de Node.JS o su salida de muestra .

Este es un escáner asíncrono, crea 200 subprocesos para escanear en busca de cualquier/todas las transacciones relacionadas con su número de cuenta.

Puede cambiar fácilmente lo que sucede cuando se encuentra su transacción, actualmente solo se imprime en la consola para que pueda verla.

Algunas de las respuestas anteriores mostraron una forma sincrónica de escanear todos los bloques en busca de transacciones, pero hacer este escaneo sincrónicamente es lento, especialmente si se está conectando a Geth a través de Internet. Esta solución es más rápida para escanear grandes cantidades de bloques.

De acuerdo con las notas en el enlace de arriba, obtienes alrededor de 266 bloques por segundo (4297 bloques en 16,111 segundos). Hice algunas pruebas de alcanzar la paridad (a diferencia de geth) con un programa C++ de un solo subproceso y obtuve alrededor de 150-180 bloques por segundo de manera bastante consistente. Así que hay una aceleración, pero no tanto como hubiera pensado. Parece que debes haber llegado al límite de la capacidad de geth para entregar bloques a través de RPC. ¿Tiene sentido? ¿Has probado las diferentes aceleraciones dadas diferentes cantidades de subprocesos?
No probé mucho RE cambiando el conteo de subprocesos, excepto para decir que demasiados subprocesos consumen mi CPU y en realidad es peor que no demasiados subprocesos. Tampoco intenté ajustar geth para una red óptima, lo que puede ser posible para aumentar aún más la velocidad. Usé un stock geth con la configuración predeterminada.

Transferir TODO el saldo de una cuenta a otra

/**
 * Transfer the ENTIRE BALANCE from one account to another.
 *
 * Before you call this, you must unlock your account:
 *   personal.unlockAccount(from)
 *
 * @see https://github.com/ethereum/go-ethereum/issues/1637
 * @see https://github.com/ethereum/go-ethereum/issues/2173
 */
function transferEntireBalance(from, to) {
    var gas = new BigNumber(21000);
    var price = web3.eth.gasPrice;  // current average price; or set your own
    var balance = eth.getBalance(from);
    var value = balance.minus(gas.times(price));
    if (value.greaterThan(0)) {
        var txn = eth.sendTransaction({from: from, to: to, gasPrice: price, gas: gas, value: value});
        console.log("  Transfer", from, "to", to, ":", txn);
        return txn;
    }
    console.log("  Transfer "+ from +" to "+ to +": (No funds available)");
    return null;
}

https://gist.github.com/ross-p/cfa489bb7ed7427e4498058b0d6a5984

Esto calcula la cantidad de gas requerida para realizar la transacción, luego transfiere el 100% de los fondos (después del costo del gas) de la fromcuenta a la tocuenta.

Después de ejecutar este método, a la fromcuenta le quedarán 0 Ether.

Uso:

var txn = transferEntireBalance(from, to);
eth.getTransaction(txn);

Actualizado el 19 de julio de 2017 para usar exclusivamente matemáticas BigNumber y el precio de gas promedio de todo el sistema de forma predeterminada.

Si bien esto puede responder teóricamente a la pregunta, sería preferible incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Son solo 20 líneas de código, solo inclúyalas aquí también.

Script para obtener saldos de cuenta e incluir tokens TheDAO

Aquí hay una versión checkAllBalancesque también muestra tokens TheDAO . Hay un script de Linux que puede ejecutar desde la línea de comando en ¿Cómo imprimo los saldos de mi cuenta y los tokens TheDAO de geth ?

function padTokens(s, n) {
  var o = s.toPrecision(n);
  while (o.length < n) {
    o = " " + o;
  }
  return o;
}

function padEthers(s) {
  var o = s.toFixed(18);
  while (o.length < 27) {
    o = " " + o;
  }
  return o;
}

function checkAllBalances() { 
  var theDAOABI = [ { "type": "function", "outputs": [ { "type": "uint256", "name": "", "value": "5e+22" } ], "name": "minTokensToCreate", "inputs": [], "constant": true }, { "type": "function", "outputs": [ { "type": "uint256", "name": "", "value": "2.668900014413644230605979e+24" } ], "name": "totalSupply", "inputs": [], "constant": true }, { "type": "function", "outputs": [ { "type": "uint256", "name": "", "value": "1464426000" } ], "name": "closingTime", "inputs": [], "constant": true }, { "type": "function", "outputs": [], "name": "refund", "inputs": [], "constant": false }, { "type": "function", "outputs": [ { "type": "address", "name": "", "value": "0xda4a4626d3e16e094de3225a751aab7128e96526" } ], "name": "curator", "inputs": [], "constant": true }, { "type": "function", "outputs": [ { "type": "uint256", "name": "balance", "value": "0" } ], "name": "balanceOf", "inputs": [ { "type": "address", "name": "_owner" } ], "constant": true }, { "type": "function", "outputs": [ { "type": "uint256", "name": "_numberOfProposals", "value": "0" } ], "name": "numberOfProposals", "inputs": [], "constant": true }, { "type": "function", "outputs": [ { "type": "address", "name": "", "value": "0x807640a13483f8ac783c557fcdf27be11ea4ac7a" } ], "name": "extraBalance", "inputs": [], "constant": true }, { "type": "function", "outputs": [ { "type": "bool", "name": "", "value": true } ], "name": "isFueled", "inputs": [], "constant": true }, { "type": "function", "outputs": [ { "type": "bool", "name": "success" } ], "name": "createTokenProxy", "inputs": [ { "type": "address", "name": "_tokenHolder" } ], "constant": false }, { "type": "function", "outputs": [ { "type": "uint256", "name": "_voteID" } ], "name": "vote", "inputs": [ { "type": "uint256", "name": "_proposalID" }, { "type": "bool", "name": "_supportsProposal" } ], "constant": false }, { "type": "event", "name": "FuelingToDate", "inputs": [ { "type": "uint256", "name": "value", "indexed": false } ], "anonymous": false }, { "type": "event", "name": "ProposalAdded", "inputs": [ { "type": "uint256", "name": "proposalID", "indexed": true }, { "type": "address", "name": "recipient", "indexed": false }, { "type": "uint256", "name": "amount", "indexed": false }, { "type": "bool", "name": "newCurator", "indexed": false }, { "type": "string", "name": "description", "indexed": false } ], "anonymous": false }, { "type": "event", "name": "ProposalTallied", "inputs": [ { "type": "uint256", "name": "proposalID", "indexed": true }, { "type": "bool", "name": "result", "indexed": false }, { "type": "uint256", "name": "quorum", "indexed": false } ], "anonymous": false } ];
  var theDAOAddress = "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413";
  var theDAO = eth.contract(theDAOABI).at(theDAOAddress);
  var theDAOTotal = 0; 
  var ethersTotal = 0; 

  console.log("  #     Account                                        TheDAO                      ethers");
  console.log("------- ------------------------------------------ ---------- ---------------------------");
  var i =0; 
  eth.accounts.forEach( function(e){
    var tokens = theDAO.balanceOf(e) / parseFloat(1e16);
    theDAOTotal += parseFloat(tokens);
    var ethers = web3.fromWei(eth.getBalance(e), "ether");
    ethersTotal += parseFloat(ethers);
    console.log("  " + i + "\t" + e + " " + padTokens(tokens, 10) + " " + padEthers(ethers)); 
    i++; 
  })
  console.log("------- ------------------------------------------ ---------- ---------------------------");
  console.log("  " + i + "                                               " + padTokens(theDAOTotal, 10) + " " + padEthers(ethersTotal));
}; 

Aquí hay algunos resultados de muestra:

> checkAllBalances()
  #     Account                                        TheDAO                      ethers
------- ------------------------------------------ ---------- ---------------------------
  0     0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa       1100        1.111111111111111111
  1     0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb       2200        2.222222222222222222
  2     0xcccccccccccccccccccccccccccccccccccccccc       3300        3.333333333333333333
------- ------------------------------------------ ---------- ---------------------------
  3                                                      6600        6.666666666666666666
El enlace para "TheDAO" ( daohub.org ) está roto.

encuentre tokens en blockchain, cortesía de https://github.com/linagee/find-ethereum-coins/blob/master/token.js

var tokenInterface = [{"type": "function","name": "name","constant": true,"inputs": [],"outputs": [{"name": "","type": "string"}]},{"type": "function","name": "decimals","constant": true,"inputs": [],"outputs": [{"name": "","type": "uint8"}]},{"type": "function","name": "balanceOf","constant": true,"inputs": [{"name": "","type": "address"}],"outputs": [{"name": "","type": "uint256"}]},{"type": "function","name": "symbol","constant": true,"inputs": [],"outputs": [{"name": "","type": "string"}]},{"type": "function","name": "transfer","constant": false,"inputs": [{"name": "_to","type": "address"},{"name": "_value","type": "uint256"}],"outputs": []},{"type": "constructor","inputs": [{"name": "_supply","type": "uint256"},{"name": "_name","type": "string"},{"name": "_decimals","type": "uint8"},{"name": "_symbol","type": "string"}]},{"name": "Transfer","type": "event","anonymous": false,"inputs": [{"indexed": true,"name": "from","type": "address"},{"indexed": true,"name": "to","type": "address"},{"indexed": false,"name": "value","type": "uint256"}]}];
TokenContract = web3.eth.contract(tokenInterface);

var lowestBlock = 474147; //November 3, 2015 - last time the ABI above was changed
var highestBlock = eth.getBlock("latest").number;
//var lowestBlock = 483325; //smaller test case with just one coin (MistCoin)
//var highestBlock = 484731; //smaller test case with just one coin (MistCoin)
for (var x=lowestBlock; x < highestBlock; x++) {
  var transactions = eth.getBlock(x).transactions;
  for (var y=0; y < transactions.length; y++) {
//    if (x % 100 == 0) { console.log("."); }
    var contractAddr = eth.getTransactionReceipt(transactions[y]).contractAddress;
    if (contractAddr != null) {
       var tokenInstance = TokenContract.at(contractAddr);
       var symbol = "";
       var decimals = "";
       var name = "";
       try {
         symbol = tokenInstance.symbol();
       } catch(err) {
       }
       try {
         decimals = tokenInstance.decimals();
       } catch(err) {
         //don't do anything here, just catch the error so program doesn't die
       }
       try {
         name = tokenInstance.name();
       } catch(err) {
         //don't do anything here, just catch the error so program doesn't die
       }
       if (symbol != null && symbol != "" && name != null && name != "") {
         console.log("-----------");
         console.log("Contract Address: " + contractAddr);
         console.log("Name: " + name);
         console.log("Symbol: " + symbol);
         console.log("Decimals: " + decimals);
         console.log("-----------");
       }
//       console.log(contractAddr);  //testing
    }
  }
//  console.log(eth.getBlock(x).transactions);  //testing
}

Aquí hay uno simple para obtener su saldo total:

function totalBalance() { 
  var x = 0
  eth.accounts.forEach( function(e) {
    x = x + parseFloat(web3.fromWei(eth.getBalance(e)), 10); 
  });
  console.log("  total balance: " + x + " ether"); 
};
Hmm... ¿No es esto casi lo mismo que el guión de la pregunta?
@varm es idéntico excepto por el hecho de que suma todos los saldos de las cuentas en lugar de mostrarlos individualmente. De hecho, había estado usando el fragmento de la pregunta y agregué esta pequeña adición para ver rápidamente el total en todas las cuentas.

Una búsqueda heurística de transacciones monetarias para una cuenta específica sin procesar toda la cadena

var myAddr = '0xbb9bc244d798123fde783fcc1c72d3bb8c189413';
var currentBlock = eth.blockNumber;
var n = eth.getTransactionCount(myAddr, currentBlock);
var bal = eth.getBalance(myAddr, currentBlock);
for (var i=currentBlock; i >= 0 && (n > 0 || bal > 0); --i) {
    try {
        var block = eth.getBlock(i, true);
        if (block && block.transactions) {
            block.transactions.forEach(function(e) {
                if (myAddr == e.from) {
                    if (e.from != e.to)
                        bal = bal.plus(e.value);
                    console.log(i, e.from, e.to, e.value.toString(10));
                    --n;
                }
                if (myAddr == e.to) {
                    if (e.from != e.to)
                        bal = bal.minus(e.value);
                    console.log(i, e.from, e.to, e.value.toString(10));
                }
            });
        }
    } catch (e) { console.error("Error in block " + i, e); }
}

¿Como funciona?

Usando la información disponible sobre el estado actual (número de transacciones "desde" y el saldo actual), retrocede en el tiempo hasta que se hayan encontrado al menos tantas transacciones "desde" y luego continúa retrocediendo hasta que el saldo llega a 0.

La limitación inherente es que no se encontrarán las transacciones de valor 0 antes de que se financiara la cuenta.

Esta función aquí verifica a los compañeros, separando los apretones de manos de las conexiones efectivas:

function getPeers(flagAll) { 
  // always lists established connections
  // if flagAll is true shows handshakes also
  var i =0; 
  var flagHandshake = 0;
  var count00 = 0;
  var count01 = 0;
  var peersHandshake = new Array();
  var peersConnect = new Array();
  admin.peers.forEach( function(e){
    flagHandshake = ( e.protocols.eth == "handshake");
    if (flagHandshake) {
        peersHandshake[count01] = e.network.remoteAddress;
        count01++;
    } else {
        peersConnect[count00] = e.network.remoteAddress;
        count00++;
    }  
  })
  i = 0;
  peersConnect.forEach(function(e){
    console.log("  peersConnect["+i+"] :  [" +  e + "]" ); 
    i++; 
  })
  if (count00 == 0) {
    console.log("  No TRUE connections yet.  Try using `admin.addPeer()` to speed things up.");
  }  else {
    console.log("  Found ["+count00+"] TRUE connections.");
  } 
    
  
  if (flagAll) {
    i = 0;
    peersHandshake.forEach(function(e){
        console.log("  peersHandshake["+i+"] :  [" +  e + "]" ); 
        i++; 
    })
  }
    
};

Solo por diversión. Obtiene todos los bloques recursivamente :) (no es la mejor manera)

 function getAllBlocks(blockNumber,res) { 
  if(blockNumber < 0) return; 
  var block = eth.getBlock(blockNumber); 
  res.push(getAllBlocks(block.number-1,res));
  return res; 
 }

getAllBlocks('latest',[])