¿Cómo funciona Etherscan?

Por lo que entiendo, las cadenas de bloques no están optimizadas para buscar transacciones pasadas. ¿Etherscan descarga los datos en otra base de datos para realizar consultas de mayor rendimiento? Si es así, ¿cómo puede descargar los datos y qué utiliza para consultarlos?

Respuestas (2)

Si desea realizar análisis, el truco consiste en desechar toda la cadena de bloques en una base de datos indexada. Mi consejo es que obtenga una base de datos SQL y escriba un programa que consulte un nodo por sus bloques, uno por uno, luego obtenga las transacciones y los recibos de transacciones, que puede consultar nuevamente para obtener más datos. Depende de usted qué campos le interesan más, a los que desea aplicar la indexación correcta.

Aquí está la estructura de un bloque.

De https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getblockbyhash

// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", true],"id":1}'

// Result
{
"id":1,
"jsonrpc":"2.0",
"result": {
    "number": "0x1b4", // 436
    "hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
    "parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5",
    "nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2",
    "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
    "logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
    "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
    "stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff",
    "miner": "0x4e65fda2159562a496f9f3522f89122a3088497a",
    "difficulty": "0x027f07", // 163591
    "totalDifficulty":  "0x027f07", // 163591
    "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "size":  "0x027f07", // 163591
    "gasLimit": "0x9f759", // 653145
    "gasUsed": "0x9f759", // 653145
    "timestamp": "0x54e34e8e" // 1424182926
    "transactions": [{...},{ ... }]
    "uncles": ["0x1606e5...", "0xd5145a9..."]
  }
}

Luego obtiene hashes para transacciones, que puede realizar para cada una, dos consultas

https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_gettransactionbyhash

// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1}'

// Result
{
"id":1,
"jsonrpc":"2.0",
"result": {
    "hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b",
    "nonce":"0x",
    "blockHash": "0xbeab0aa2411b7ab17f30a99d3cb9c6ef2fc5426d6ad6fd9e2a26a6aed1d1055b",
    "blockNumber": "0x15df", // 5599
    "transactionIndex":  "0x1", // 1
    "from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1",
    "to":"0x85h43d8a49eeb85d32cf465507dd71d507100c1",
    "value":"0x7f110" // 520464
    "gas": "0x7f110" // 520464
    "gasPrice":"0x09184e72a000",
    "input":"0x603880600c6000396000f300603880600c6000396000f3603880600c6000396000f360",
  }
}

https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_gettransactionreceipt

// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1}'

// Result
{
"id":1,
"jsonrpc":"2.0",
"result": {
     transactionHash: '0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238',
     transactionIndex:  '0x1', // 1
     blockNumber: '0xb', // 11
     blockHash: '0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b',
     cumulativeGasUsed: '0x33bc', // 13244
     gasUsed: '0x4dc', // 1244
     contractAddress: '0xb60e8dd61c5d32be8058bb8eb970870f07233155' // or null, if none was created
     logs: [{
         // logs as returned by getFilterLogs, etc.
     }, ...]
  }
}
¡Wow gracias! ¿Puedo usar contractAddresspara obtener el ABI de un contrato y averiguar su estado en cualquier momento como aquí etherscan.io/address/… ? Gracias

Un explorador de cadena de bloques es simplemente una interfaz para los datos contenidos en la cadena de bloques.

Software como Geth y Parity también actúan como una interfaz para estos datos.

Ambos implementan puntos finales JSON RPC que se pueden consultar para obtener datos sobre bloques o transacciones.

El problema es que JSON no es particularmente fácil de leer, y la interacción con la línea de comando no es necesariamente fácil para las personas sin conocimientos técnicos.

Los exploradores de blockchain como EthTools.com (descargo de responsabilidad: este es el producto de mi empresa), Etherscan.io y EtherChain.org recopilan estos datos, los indexan adecuadamente y los presentan en un formato fácil de ver/buscar.

FYI EthTools.com es señalado por MetaMask por phishing (a partir del 06/01/2018)