Как работает Этерскан?

Насколько я понимаю, блокчейны не оптимизированы для поиска прошлых транзакций. Загружает ли Etherscan данные в другую базу данных для повышения производительности запросов? Если да, то как он может загрузить данные и что он использует для запроса?

Ответы (2)

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

Вот структура блока

Из 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..."]
  }
}

Затем вы получаете хэши для транзакций, которые вы можете выполнять для каждого, два запроса

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.
     }, ...]
  }
}
Вау, спасибо! Могу ли я contractAddressв любой момент получить ABI контракта и узнать его состояние, как здесь etherscan.io/address/… ? Спасибо

Обозреватель блокчейна — это просто интерфейс для данных, содержащихся в блокчейне.

Такие программы, как Geth и Parity, также действуют как интерфейс для этих данных.

Оба реализуют конечные точки JSON RPC , которые можно запрашивать для получения данных о блоках или транзакциях.

Проблема в том, что JSON не особенно легко читается, а взаимодействие с командной строкой не всегда легко для людей без технического образования.

Обозреватели блокчейнов, такие как EthTools.com (отказ от ответственности — это продукт моей компании), Etherscan.io и EtherChain.org , сопоставляют эти данные, соответствующим образом индексируют их и представляют в удобном для просмотра/поиска формате.

К сведению, EthTools.com помечен MetaMask как фишинг (по состоянию на 06.01.2018)