• bitcoinBitcoin (BTC) $ 62,179.00
  • ethereumEthereum (ETH) $ 3,009.54
  • tetherTether (USDT) $ 0.999201
  • bnbBNB (BNB) $ 583.32
  • solanaSolana (SOL) $ 147.12
  • usd-coinUSDC (USDC) $ 0.999121
  • xrpXRP (XRP) $ 0.523910
  • staked-etherLido Staked Ether (STETH) $ 3,011.30
  • dogecoinDogecoin (DOGE) $ 0.149138
  • the-open-networkToncoin (TON) $ 5.81
  • cardanoCardano (ADA) $ 0.443968
  • shiba-inuShiba Inu (SHIB) $ 0.000023
  • avalanche-2Avalanche (AVAX) $ 34.53
  • tronTRON (TRX) $ 0.122451
  • wrapped-bitcoinWrapped Bitcoin (WBTC) $ 62,183.00
  • polkadotPolkadot (DOT) $ 7.07
  • bitcoin-cashBitcoin Cash (BCH) $ 461.89
  • chainlinkChainlink (LINK) $ 13.92
  • nearNEAR Protocol (NEAR) $ 7.12
  • matic-networkPolygon (MATIC) $ 0.683303
  • litecoinLitecoin (LTC) $ 81.54
  • internet-computerInternet Computer (ICP) $ 12.27
  • fetch-aiFetch.ai (FET) $ 2.25
  • uniswapUniswap (UNI) $ 7.43
  • leo-tokenLEO Token (LEO) $ 5.88
  • daiDai (DAI) $ 0.998559
  • ethereum-classicEthereum Classic (ETC) $ 28.67
  • render-tokenRender (RNDR) $ 10.00
  • hedera-hashgraphHedera (HBAR) $ 0.108157
  • first-digital-usdFirst Digital USD (FDUSD) $ 1.00
  • aptosAptos (APT) $ 8.64
  • cosmosCosmos Hub (ATOM) $ 9.05
  • crypto-com-chainCronos (CRO) $ 0.126021
  • pepePepe (PEPE) $ 0.000008
  • mantleMantle (MNT) $ 1.03
  • filecoinFilecoin (FIL) $ 5.75
  • wrapped-eethWrapped eETH (WEETH) $ 3,125.74
  • stellarStellar (XLM) $ 0.108245
  • blockstackStacks (STX) $ 2.13
  • immutable-xImmutable (IMX) $ 2.09
  • okbOKB (OKB) $ 50.28
  • renzo-restaked-ethRenzo Restaked ETH (EZETH) $ 2,960.22
  • dogwifcoindogwifhat (WIF) $ 2.93
  • optimismOptimism (OP) $ 2.65
  • arbitrumArbitrum (ARB) $ 1.03
  • kaspaKaspa (KAS) $ 0.112768
  • bittensorBittensor (TAO) $ 387.48
  • the-graphThe Graph (GRT) $ 0.273931
  • vechainVeChain (VET) $ 0.035647
  • makerMaker (MKR) $ 2,747.84
  • suiSui (SUI) $ 1.06
  • arweaveArweave (AR) $ 37.38
  • moneroMonero (XMR) $ 128.50
  • ethena-usdeEthena USDe (USDE) $ 0.997682
  • injective-protocolInjective (INJ) $ 24.09
  • theta-tokenTheta Network (THETA) $ 2.16
  • thorchainTHORChain (RUNE) $ 5.74
  • fantomFantom (FTM) $ 0.669562
  • lido-daoLido DAO (LDO) $ 2.00
  • celestiaCelestia (TIA) $ 9.50
  • rocket-pool-ethRocket Pool ETH (RETH) $ 3,331.57
  • flokiFLOKI (FLOKI) $ 0.000170
  • bonkBonk (BONK) $ 0.000024
  • coredaoorgCore (CORE) $ 1.76
  • bitget-tokenBitget Token (BGB) $ 1.12
  • algorandAlgorand (ALGO) $ 0.189564
  • galaGALA (GALA) $ 0.043629
  • sei-networkSei (SEI) $ 0.534750
  • mantle-staked-etherMantle Staked Ether (METH) $ 3,106.37
  • jupiter-exchange-solanaJupiter (JUP) $ 1.07
  • whitebitWhiteBIT Coin (WBT) $ 9.96
  • quant-networkQuant (QNT) $ 98.10
  • flowFlow (FLOW) $ 0.883118
  • ethenaEthena (ENA) $ 0.912104
  • aaveAave (AAVE) $ 87.31
  • beam-2Beam (BEAM) $ 0.024158
  • bitcoin-svBitcoin SV (BSV) $ 65.11
  • worldcoin-wldWorldcoin (WLD) $ 5.83
  • singularitynetSingularityNET (AGIX) $ 0.933797
  • dydx-chaindYdX (DYDX) $ 2.10
  • wormholeWormhole (W) $ 0.646782
  • bittorrentBitTorrent (BTT) $ 0.000001
  • ondo-financeOndo (ONDO) $ 0.788638
  • ribbon-financeRibbon Finance (RBN) $ 1.18
  • zebec-protocolZebec Protocol (ZBC) $ 0.022350
  • chilizChiliz (CHZ) $ 0.126242
  • flare-networksFlare (FLR) $ 0.028444
  • neoNEO (NEO) $ 15.57
  • elrond-erd-2MultiversX (EGLD) $ 40.47
  • gatechain-tokenGate (GT) $ 8.08
  • axie-infinityAxie Infinity (AXS) $ 7.22
  • akash-networkAkash Network (AKT) $ 4.42
  • kucoin-sharesKuCoin (KCS) $ 10.37
  • the-sandboxThe Sandbox (SAND) $ 0.430886
  • ecasheCash (XEC) $ 0.000048
  • tokenize-xchangeTokenize Xchange (TKX) $ 11.83
  • starknetStarknet (STRK) $ 1.27
  • eosEOS (EOS) $ 0.794678
  • tezosTezos (XTZ) $ 0.933096
  • msolMarinade Staked SOL (MSOL) $ 173.88

Сканер блоков (Blockchain explorer) своими руками: немного теории

0 1

Сканер блоков (Blockchain explorer) своими руками: немного теории

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

Попробуем определить, что нам для этого понадобится. Очевидно, нам понадобится для начала копия желаемого блокчейна, причем эта копия должна сохранять актуальность (синхронизироваться с соответствующей сетью). Последнее намекает, что либо нам нужно реализовать полностью соответствующий протокол (что очевидно будет избыточно и крайне дорого) либо — установить соответствующее программное обеспечение, что более рационально. Для Ethereum это будет например Geth (go-ethreum), bitcoind или btcd (реализация на golang) для Bitcoin, или любое соответствующее программное обеспечение. Главное условие — доступ к полному блокчейну (или той части, которую вы хотите отслеживать). 

Для ясности давайте вспомним, как должна хранится информация в блокчейн. Bitcoin и его потомки (назовем их “классическими”) используют концепцию UTXO (Unspent Transaction Output). Результат транзакции можно назвать “выходом” (Out), И каждая транзакция за одним исключением должна ссылаться на “Вход” (“In”). Таким образом каждая танзакция содержит адрес-отправитель и адерс получатель в той или иной форме (не будем сейчас вдаваться в детали, на достаточно самого факта наличия такой информации). Побочный эффект — из этой информации мы можем так же построить дерево транзакций, которое позволит отслеживать каждый прошедший по сети сатоши. 

Сеть Ethereum обращается с информацией несколько иначе. Как я упомянул в прошлой статье, концепция Ethereum отличается, и хранится информация непосредственно о балансах адресов. Однако информация о транзакциях по прежнему находится в блоках и хранится в сети. Таким образом индексация транзакций и их взаимосвязь с адресами по прежнему возможна. В этой статье я намеренно не буду касаться смартконтрактов и операций с токенами (ERC20/ERC721/ERC1155) и так называемых “Internal Transactions” — рассмотрение этой темы требует отдельной статьи.

А что нам не доступно? Блокчейны, использующие алгоритмы “доказательства с нулевым разглашением” (“Zero-knowledge proof”), такие как Monero и ZCash не могут быть индексированы таким образом, что следует из их концепции. 

Далее процесс будет прямолинеен и прост, хотя крайне затратен по времени и по объему дискового пространства, которе вам понадобится. 

Шаг первый — запрашиваем начальный блок через RPC (реализация зависит от конкретной сети) и перебирая транзакции по одной, декодируем их и выделяем информацию, которую хотим индексировать. Вероятно нас будут интересовать хеш транзакции, использованные адреса, направление транзакции, время и номер блока. Полный перечень зависит от ваших задач и от доступных вам ресурсов (в основном бутылочным горлышком будет дисковое пространство).

Далее мы сохраняем интересующую нас информацию в каком либо варианте базы данных, берем следующий блок и повторяем описанные действия. Не слишком изящно, однако другого рецепта к сожалению нет. 

И возникает логичный вопрос — а почему собственно разработчики блокчейн не дают доступа к такой очевидно полезной информации? Что мешает сразу, при синхронизации с сетью сохранить и индексировать такие данные? 

Ответ будет пересекаться с объяснением, почему именно дисковое пространство будет бутылочным горлышком. 

Для начала маленький пример. Те, кто разворачивал node для Ethereum знают, что есть несколько вариантов синхронизации Geth. В документации, раздел “Sync modes” упомянуты Full nodes и Light nodes. Последние нас не интересуют, а вот Full nodes в свою очередь условно разделены на Snap, Full и Archive. И вот тут начинается интересное, особенно если рассмотреть внимательно иллюстрацию, кто собственно из них кто. Snap-нода хранит подробную информацию о последних 128 блоках и пару контрольных точек (checkpoint) в относительно недавнем прошлом. Full нода, как следует из иллюстрации хранит контрольные точки (checkpoint) с некоей периодичностью практически до “начала времен”. Archive хранит уже полную информацию, за все время существования Ethereum. Если задаться целью и выяснить, какой объем данных хранит полная (Full) нода, то окажется что это около 1Tb (на момент написания статьи). Не будем вдаваться в механизмы “реорганизации сети”, и прочие ухищрения. Нам интересно другое, объем данных, хранимых Archive нодой — уже около 16Tb(!). Получается, что нам не доступно более 90% информации о блокчейн?

Если поставить один несложный эксперимент — многое становится на свои места. 

Воспользуемся сервисом etherscan.io и найдем случайную транзакцию “из начала времен”, например 0x7d7062d6f865931e0bbbccea46551a73d5d58a6ef618d5592c35b5256a65e9ba (примерно за август 2015 года) и попробуем получить информацию о ней с помощью консоли локального Geth, синхронизированного в режиме full. Мы же можем получить такую информацию, да? 

Welcome to the Geth JavaScript console!    instance: Geth/v1.12.0-stable-e501b3b0/linux-amd64/go1.20.3  at block: 19122581 (Tue Jan 30 2024 23:24:11 GMT+0000 (UTC))   datadir: /home/eth/ethereum   modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0    To exit, press ctrl-d or type exit  > eth.getTransaction("0x7d7062d6f865931e0bbbccea46551a73d5d58a6ef618d5592c35b5256a65e9ba")    null

Эм… То есть, информации о транзакции нет? Не совсем… Давайте попробуем просмотреть содержимое блока, в котором находится искомая транзакция, благо мы знаем номер блока:

> eth.getBlockByNumber(122546)  {  …     hash: "0xc58aa38cf7df6050d3be43f1557d61e3a28e3f34d7818b1644e6a9972003e80a",  …     number: "0x1deb2",  …     transactions: ["0x7d7062d6f865931e0bbbccea46551a73d5d58a6ef618d5592c35b5256a65e9ba"],  …  }

Так вот же она, на месте! Если выполнить eth.getBlockByNumber(122546, true) (дополнительный параметр, указывающий запрос на выдачу всей информации о транзакциях в блоке), то мы получим и содержимое транзакции, и например узнаем, что отправителем был адрес 0x5685620dce626248ccb7121e87fbc098fd5310bd а получателем 0x9b0a028eafdecde3afc0fd00b7937098388b7c8a, как и всю сопутствующую информацию. Почему же мы не смогли получить эту информацию, запрашивая напрямую?

Не вдаваясь в технические детали — только архивная нода полностью индексирует весь блокчейн и все связи между блоками, транзакциями и адресами. И “вес” этих индексов — это как раз те самые недостающие 15 террабайт информации. 

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

Что касается bitcoin — там есть подобные механизмы, но объем данных несравнимо меньше. На момент написания статьи, объем блокчейн bitcoin оставляет смехотворные 545Gb, так что проблем с ним будет значительно меньше.

В заключении пару слов, о том, как можно ускорить процесс индексации. Совсем не обязательно обрабатывать все запросы через обращение к клиенту соответствующей сети. Чаще всего программное обеспечение для работы с блокчейн является открытым, а форматы баз данных достаточно стандартизированы. Возможно стоит рассмотреть вариант работы непосредственно сданными на диске уже синхронизированной ноды, и лишь потом — синхронизацию новых блоков. 

В следующей статье мы попробуем собрать из подручных средств минимальную реализацию для подготовки базы поиска по адресам для разных блокчейнов.

Источник: forknews.io

Оставьте ответ

Ваш электронный адрес не будет опубликован.