Насколько я понимаю, блокчейны не оптимизированы для поиска прошлых транзакций. Загружает ли Etherscan данные в другую базу данных для повышения производительности запросов? Если да, то как он может загрузить данные и что он использует для запроса?
Если вы хотите заниматься аналитикой, хитрость заключается в том, чтобы поместить всю цепочку блоков в проиндексированную базу данных. Мой совет: возьмите базу данных 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.
}, ...]
}
}
Обозреватель блокчейна — это просто интерфейс для данных, содержащихся в блокчейне.
Такие программы, как Geth и Parity, также действуют как интерфейс для этих данных.
Оба реализуют конечные точки JSON RPC , которые можно запрашивать для получения данных о блоках или транзакциях.
Проблема в том, что JSON не особенно легко читается, а взаимодействие с командной строкой не всегда легко для людей без технического образования.
Обозреватели блокчейнов, такие как EthTools.com (отказ от ответственности — это продукт моей компании), Etherscan.io и EtherChain.org , сопоставляют эти данные, соответствующим образом индексируют их и представляют в удобном для просмотра/поиска формате.
Мигу
contractAddress
в любой момент получить ABI контракта и узнать его состояние, как здесь etherscan.io/address/… ? Спасибо