Давайте остановимся на простой и тривиальной на первый взгляд задаче — получении списка транзакций, связанных с определенным адресом. На первый взгляд уж этот простенький запрос не должен вызывать вопросов — в конце концов блокчейн ведь содержит именно большую базу данных транзакций, ведь так?
Не совсем. Если Bitcoin и его наследники (Litecoin, DASH, Docgecoin, etc) действительно являются по определению леджером транзакций, то вот Ethereum и производные от него — уже являются леджерами балансов, хотя и транзакции они хранить должны, как минимум в теории.
Но вот что интересно, даже для Bitcoin адреса вы не сможете штатными средствами получить список транзакций, связанных с определенным адресом полностью, только входы (полученные адресом транзакции). С Ethereum все еще интереснее. Geth (go-ethereum) не позволяет штатными средствами получить транзакции вообще. Если Вам известен хеш транзакции — без проблем, если нет — то все, что вы можете узнать о адресе в блокчейне — это его баланс.
Конечно это не будет большой проблемой, если все адреса сгенерированы вашим приложением, и ваш бакенд уже отслеживает состояние mempool и сканирует все новые блоки на предмет нужных транзакций — вы наверняка будете аккуратно конспектировать все операции, складывать их в базу данных и иметь к ним доступ в любое время. В случае Etherem и други блокчейнов, где механизм токенов реализован подобно стандарту ERC20 вы еще и получите все транзакции, связанные с вызовами смарт-контрактов (например отправку или получение ERC20 токенов)
Однако почти любое хорошее приложение-кошелек позволяет импортировать ключи и получить доступ к адресам, созданным в другой программе. Да, можно использовать подход, который взяли на вооружение создатели Exodus — просто “сгребать” все средства с импортируемого адреса на тот, что указан в приложении, на чем считать проблему закрытой.
Но как тогда работает например популярный Metamask? Каким образом ему удается показать все транзакции даже для импортированных адресов?
Собственно никакой особой магии они не используют. Для эксперимента — попробуйте добавить в MetaMask новую сеть, и внимательно изучите поля, которые нужно заполнить. Среди очевидных данных, таких как URL точки доступа, networkID, названия сети и символа валюты вам предложат заполнить необязательное поле — указать ссылку на blockexplorer. Вся информация получается через API с таких сервисов как infura.io и alchemy.com. Для Bitcoin похожий функционал обеспечивает blockhain.com/blockhain.info, большое количество сетей покрывает сервис blockchair.
Выходит для того, чтобы обеспечить наше приложение информацией достаточно подключится к какому то такому провайдеру и дело в шляпе? С одной стороны да. Однако не всегда такое решение будет лишено недостатков, и иногда эти недостатки могут быть критическими. Давайте пройдемся только по самым очевидным.
Во первых о какой бы то ни было конфиденциальности операций можно забыть сразу. Большая компания будет иметь доступ ко всем данным всех ваших клиентов и не известно с какими целями она эти данные будет использовать. Хорошо, если это будет всего лишь безобидная сборка bigdata для анализа рынка и получения инсайдерской информации при торговле. Но в перспективе такие данные могут стать достоянием скажем так, не совсем чистых на руку людей, Кстати совсем недавно Alchemy заявила, что будет регистрировать IP, с которых произведена транзакция. Уж если они официально заявили, что будут собирать данные о местоположении даже не своих клиентов а клиентов всех сервисов, которые пользуются их API — то можно с высокой степенью предположить, что они это уже активно делают.
Второй аспект, не менее проблемный в перспективе — зависимость от чужого сервиса никак не может гарантировать, что условия обслуживания не поменяются. Например сервис решит ввести плату за подписку на API — и автор любого приложения, даже бесплатного будет вынужден думать, что с этим делать. Забросить приложение? Сделать его платным? Но напомню, криптокошелек — это хранилище криптовалюты, и пользователи такого приложения могут внезапно потерять доступ к своим сбережениям. А суммы могут быть значительными.
Продолжать этот список можно долго, но вывод будет один — во многих случаях куда рациональнее обеспечить свой бакенд, и развернуть свою инфраструктуру, которая позволит получить доступ к нужным данным.
Что для этого нужно, и как это реализовать — рассмотрим в следующей статье