Автор Патрик О’Грэйди

В июне мы запустили Rosetta как спецификацию с открытым исходным кодом, которая делает интеграцию с блокчейнами проще, быстрее и надежнее. Сейчас над реализацией Rosetta работают более 20 проектов блокчейнов (Near, Cardano, Celo, Coda, Neo, Tron, Handshake, Oasis, Cosmos, Decred, Filecoin, Ontology, Sia, Zilliqa, Digibyte, Harmony, Kadena, Nervos и Blockstack), пять незавершенных SDK (Golang, JavaScript, TypeScript, Java и Rust) и восемь команд внесли свой вклад как минимум в один из Репозитории Rosetta на GitHub (rosetta-specs, rosetta-sdk-go и rosetta-cli).

Сегодня мы делимся ключевым вкладом в эту растущую коллекцию реализаций: розетта-биткойн.

Почему биткойн?

Биткойн является лидером для всей криптовалюты, является самым популярным блокчейном, имеет самую большую рыночную капитализацию, и большинство разработчиков блокчейнов знают, как он работает (поэтому легче понять, как Rosetta может быть реализован для других блокчейнов).

С другой стороны, эталонная реализация Биткойна (известная как Bitcoin Core) не обеспечивает встроенной поддержки многих функций, которые требуются интеграторам. Невозможно запрашивать балансы учетных записей и / или UTXO для всех учетных записей, обслуживать предварительно обработанные блоки для вызывающих, поэтому им не нужно извлекать все входные данные для анализа транзакции, а также создавать транзакции без импорта закрытых ключей на узел (что не является не практично для пользователей, которые никогда не приносят закрытые ключи в сеть). Часто эти недостающие функции побуждают интеграторов запускать какое-то дополнительное программное обеспечение для индексирования и реализовывать свои собственные библиотеки для обработки построения транзакций.

rosetta-bitcoin обеспечивает доступ ко всем этим функциям, по умолчанию не требует настройки и может быть запущен с помощью одной команды. Кроме того, rosetta-bitcoin обеспечивает эти функции исключительно через взаимодействие RPC с Bitcoin Core, поэтому нам не нужно поддерживать форк Bitcoin Core, чтобы включить эту новую функциональность и простую настройку!

Обновление Rosetta API

rosetta-bitcoin реализует оба основных компонента Rosetta API: Data API и Construction API. Вместе эти компоненты обеспечивают универсальный доступ для чтения и записи к Биткойну. Ниже мы привели несколько диаграмм, на которых показаны конкретные конечные точки, которые поддерживает любая реализация Rosetta API. Если вы заинтересованы в построении поверх реализации, мы рекомендуем использовать rosetta-sdk-go (который абстрагирует эти потоки от функций Golang).

API данных состоит из всех конечных точек, используемых для получения информации о блокчейне. Мы можем получить сети, поддерживаемые реализацией (что может быть ›1, если блокчейн поддерживает сегментирование или если он является шлюзом для нескольких сетей), поддерживаемые типы операций в каждой сети и статус каждой сети. .

Data API также позволяет получить содержимое любого блока, получить определенную транзакцию в блоке и получить баланс любой учетной записи, присутствующей в блоке. Инструмент проверки Rosetta гарантирует, что баланс, вычисленный для любой учетной записи из операций в блоках, равен балансу, возвращаемому узлом (часто называемым согласованием).

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

В то время как Data API обеспечивает возможность чтения данных из блокчейна в стандартном формате, Construction API позволяет разработчикам писать в блокчейн (то есть создавать транзакции) в стандартном формате. Для соответствия строгим стандартам безопасности ожидается, что реализации не будут иметь состояния, работать полностью в автономном режиме и поддерживать создание и подпись отдельных ключей. Мы можем получить адрес из открытого ключа (в блокчейнах, которые не требуют создания в цепочке).

При построении транзакции в общем случае часто невозможно полностью указать результат или то, что может появиться в цепочке (например, создание транзакции, которая пытается использовать мгновенную ссуду). Мы называем набор операций, мы можем указать транзакцию намерение (которое обычно является подмножеством всех операций в транзакции в цепочке). На высоком уровне построение транзакции с помощью Construction API влечет за собой создание намерения, сбор метаданных, необходимых для создания транзакции с намерением, подписание полезных данных из учетных записей, ответственных за намерение, и трансляцию созданной транзакции. . Прежде чем пытаться подписать или транслировать транзакцию, мы подтверждаем, что созданная нами транзакция имеет то же намерение, которое мы изначально указали при запуске процесса построения. Вы можете увидеть весь процесс строительства на схеме ниже:

Как только у нас есть подписанная транзакция (которая выполняет намерение по нашему выбору), мы можем вычислить ее хеш-код, зависящий от сети и транслировать его.

Как это работает

Мы оптимизированы для повторного использования пакетов при разработке rosetta-bitcoin. Если это можно было сделать с помощью существующего пакета от rosetta-sdk-go, мы использовали его. Это привело к нескольким значительным улучшениям производительности по мере того, как мы тестировали и оптимизировали rosetta-bitcoin.

Мы используем Bitcoin Core для синхронизации блоков / широковещательных транзакций, приема этих блоков с помощью пакета syncer, хранения обработанных блоков с использованием пакета storage и обслуживания запросов Rosetta API с использованием пакета server из данных, кэшированных с помощью хранение упаковка. Вы можете найти общее представление об этой архитектуре ниже:

Для реализации Rosetta API / account / balance endpoint нам пришлось создать индексатор UTXO, который обеспечивает атомарный поиск баланса. Атомарный в этом смысле означает, что мы можем получить баланс учетной записи с индексом блока и хешем блока, если он был действителен в одном вызове RPC. Благодаря нашей реализации Rosetta Bitcoin вам больше не нужно запускать отдельный индексатор!

Мы реализовали одновременный прием блоков, чтобы ускорить синхронизацию блоков и автоматическую обрезку для удаления блоков из ядра биткойна после приема блока, чтобы сэкономить место. Одновременное получение блоков позволяет нам заполнять несколько блоков перед текущим обрабатываемым блоком, пока мы ждем сохранения последнего заполненного блока (сохраняя занятость наших ресурсов хранения). Поскольку мы храним все полученные блоки в нашем собственном кеш-хранилище, нам не нужно хранить повторяющиеся данные в базе данных Bitcoin Core.

И последнее, но не менее важное: мы реализовали построение транзакций без сохранения состояния, офлайн, на основе кривых для отправки с любого адреса SegWit-Bech32. Мы решили поддерживать отправку только с адресов SegWit-Bech32, чтобы минимизировать сложность в первом выпуске (здесь много новых движущихся частей). Мы с нетерпением ждем возможности рассмотреть вклад сообщества, в котором добавлена ​​поддержка MultiSig, Lightning и других адресов.

Попробуйте

Хватит разговоров, покажи мне код! В этом разделе вы познакомитесь с созданием rosetta-bitcoin, запуском rosetta-bitcoin, взаимодействием с rosetta-bitcoin и тестированием rosetta-bitcoin. Чтобы выполнить следующие шаги, вы должны быть на компьютере, который соответствует системным требованиям rosetta-bitcoin, и вы должны установить Docker.

Во-первых, нам нужно загрузить предварительно созданный образ Docker rosetta-bitcoin (сохраненный с тегом rosetta-bitcoin:latest):

curl -sSfL https://raw.githubusercontent.com/coinbase/rosetta-bitcoin/master/install.sh | sh -s

Далее нам нужно запустить контейнер с помощью нашего загруженного образа (контейнер запускается в автономном режиме):

docker run -d --rm --ulimit "nofile=100000:100000" -v "$(pwd)/bitcoin-data:/data" -e "MODE=ONLINE" -e "NETWORK=TESTNET" -e "PORT=8080" -p 8080:8080 -p 18333:18333 rosetta-bitcoin:latest

После запуска контейнера вы увидите идентификатор, напечатанный в вашем терминале (это идентификатор контейнера Docker). Чтобы просмотреть журналы из этого запущенного контейнера, вы должны запустить:

docker logs --tail 100 -f <container_id>

Чтобы убедиться, что все работает, давайте сделаем запрос cURL для текущего состояния сети (вам может потребоваться несколько минут, чтобы узел начал синхронизацию):

curl --request POST 'http://localhost:8080/network/status' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '{
  "network_identifier": {
    "blockchain": "Bitcoin",
    "network": "Testnet3"
  }
}' | jq

Теперь, когда rosetta-bitcoin запущена, самое интересное может начаться! Затем мы устанавливаем rosetta-cli, наш инструмент командной строки для взаимодействия и тестирования реализаций Rosetta API (он будет установлен в ./bin/rosetta-cli):

curl -sSfL https://raw.githubusercontent.com/coinbase/rosetta-cli/master/scripts/install.sh | sh -s

Мы рекомендуем переместить этот загруженный rosetta-cli двоичный файл в вашу bin папку, чтобы его можно было запустить, вызвав rosetta-cli вместо ./bin/rosetta-cli). Далее в этом пошаговом руководстве предполагается, что вы это сделали.

Также нам необходимо скачать файл конфигурации для взаимодействия с rosetta-bitcoin:

curl -sSfL https://raw.githubusercontent.com/coinbase/rosetta-bitcoin/master/rosetta-cli-conf/bitcoin_testnet.json -o bitcoin_testnet.json

Мы можем посмотреть текущий статус синхронизации:

rosetta-cli view:networks --configuration-file bitcoin_testnet.json

Мы можем искать содержимое любого синхронизированного блока (убедитесь, что индекс, который вы ищите, меньше индекса, возвращаемого текущим индексом, возвращенным в статусе синхронизации):

rosetta-cli view:block <block index> --configuration-file bitcoin_testnet.json

Мы можем проверить конечные точки API данных с помощью команды `check: data`:

rosetta-cli check:data --configuration-file bitcoin_testnet.json

Этот тест синхронизирует все блоки и подтвердит, что баланс для каждой учетной записи, возвращенный конечной точкой `/ account / balance`, соответствует вычисленному балансу с использованием операций Rosetta .

Наконец, мы можем проверить конечные точки Construction API с помощью команды `check: construction`:

rosetta-cli check:construction --configuration-file bitcoin_testnet.json

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

Когда вы закончите экспериментировать с rosetta-bitcoin, выполните следующую команду, чтобы выключить его:

docker kill --signal=2 <container_id>

Дальнейшая работа

  • Публикация тестов скорости синхронизации, использования хранилища и нагрузочного тестирования как в тестовой, так и в основной сети.
  • Реализовать Rosetta API / mempool / конечную точку транзакции
  • Добавить тест CI в репозиторий с помощью rosetta-cli (вероятно, в сети regtest)
  • Поддержка Multi-Sig транзакций и многоэтапных транзакций.
  • Напишите пакет кошелька (с использованием примитивов rosetta-sdk-go) для оркестровки построения транзакции для любой реализации Rosetta (вы можете найти некоторые ранние работы над этим усилием здесь)

Если вас интересует какой-либо из этих элементов, обратитесь на сайт сообщества.

Работа в Coinbase

Мы активно нанимаем увлеченных разработчиков, чтобы они присоединились к команде Crypto, и отношения с разработчиками приведут к работе над проектом Rosetta. Если вы заинтересованы в создании этого общего языка для взаимодействия с блокчейнами, Coinbase нанимает.

Этот веб-сайт содержит ссылки на сторонние веб-сайты или другой контент только в информационных целях («Сторонние сайты»). Сторонние сайты не находятся под контролем Coinbase, Inc. и ее дочерних компаний (далее «Coinbase»), и Coinbase не несет ответственности за содержание любых Сторонних сайтов, включая, помимо прочего, любую ссылку, содержащуюся в Сторонних сайтах. Сторонний сайт, а также любые изменения или обновления Стороннего сайта. Coinbase не несет ответственности за веб-трансляцию или любую другую форму передачи, полученную с любого Стороннего сайта. Coinbase предоставляет вам эти ссылки только для удобства, и включение любой ссылки не означает одобрения, одобрения или рекомендации Coinbase сайта или какой-либо связи с его операторами.

Все изображения, представленные здесь, принадлежат Coinbase.