Сказ о том, как я UFO в Trezor добавлял
cemehbl4

@cemehbl4

Сказ о том, как я UFO в Trezor добавлял
29.09.2022 16:28
Post earned 14333.00 UFO

Очень хочется донести этой статьей всю прелесть open source до читателей. Вся фича в том, что Trezor, в отличие от закрытых и полузакрытых систем, не буду показывать пальцем, имеет полностью открытую архитектуру не только самого устройства, но и всего ПО, начиная от прошивки, заканчивая серверной частью, которая и связывает в конечном итоге кошелёк и блокчейн. Полная независимость от третьей стороны и децентрализация во всей красе. То есть буквально можно спаять себе кошелёк, что мы с нашей командой криптоэнтузиастов собственно и сделали, и использовать, не завися ни от кого.

Вся система состоит из следующих элементов:

1) UFO core (Bitcoin core, Litecoin core и т.д.) - полный узел блокчейна

2) Blockbook - сервер, индексирующий блокчейн, то есть собирающий информацию об адресах и транзакциях от полного узла. Бонусом идёт шустрый и информативный обозреватель блоков, вот, можете полюбоваться здесь https://ufo1.e4pool.com/blocks. Вместо Blockbook может использоваться сервер ElectrumX, но пока эта возможность реализована разработчиками SatoshiLabs только для биткоина. Я, конечно, попробовал использовать Electrum-сервер, и даже удачно с ним соединился, но адреса в Suite выдаются некорректные. Ждём реализацию использования Electrum-серверов для форков.

3) Trezor Suite - интерфейс пользователя, где отображаются балансы кошелька, формируются и транслируются транзакции. Связующее звено между аппаратником и Blockbook.

4) Trezor - непосредственно сам аппаратный кошелёк, где транзакции подписываются приватным ключом.

И если 1 нам доступно, то 2, 3 и 4 не имеют поддержки UFO от производителя. Хорошая новость в том, что добавить форк биткоина не так уж и сложно.

Всё делаю на Ubuntu 20.04.

Начнём с Blockbook.

Для него я выделил отдельный сервер, но можно его развернуть и на вашей локальной машине, либо на виртуалке.

https://github.com/e4p1k0/blockbook/commit/f488e7643b139a85e78f55972347b139d47bc0f9 - здесь можно ознакомиться с изменениями, внесёнными мною в оригинал https://github.com/trezor/blockbook.

Берём уже готовую монету из bchain/coins/ и configs/coins/, я брал за основу Vertcoin, создаём отдельную папку под новую монету и конфиг ufo.json. Сложные измения кода связаны с параметрами блокчейна UFO, их и распишу ниже.

ufoparser.go


MainnetMagic wire.BitcoinNet = 0xddb7d9fc
TestnetMagic wire.BitcoinNet = 0xdbb8c0fb
MainNetParams.PubKeyHashAddrID = []byte{27}
MainNetParams.ScriptHashAddrID = []byte{68}
MainNetParams.Bech32HRPSegwit = "uf"
TestNetParams.PubKeyHashAddrID = []byte{111}
TestNetParams.ScriptHashAddrID = []byte{130}
TestNetParams.Bech32HRPSegwit = "ut"

Все значения берутся из кода UFO, файл https://github.com/fiscalobject/ufo/blob/master-0.18/src/chainparams.cpp

MainnetMagic и TestnetMagic - это записанные в обратном порядке значения pchMessageStart для Main network и Testnet (v3)

PubKeyHashAddrID соответствуют значениям base58Prefixes[PUBKEY_ADDRESS]. Для основной сети это std::vector<unsigned char>(1,27)

ScriptHashAddrID - это значения base58Prefixes[SCRIPT_ADDRESS2]

Bech32HRPSegwit - значения bech32_hrp

ufo.json

"ports": Выбираются ещё не занятые порты в соответствии с таблицей https://github.com/trezor/blockbook/blob/master/docs/ports.md

"binary_url": Ссылка на последний релиз UFO core

"extract_command": Команда архиватора TAR для распаковки релиза, может слегка отличаться, в зависимости от структуры папок внутри архива

"exclude_files": Файлы из архива, которые можно удалить

"xpub_magic", "xpub_magic_segwit_p2sh", "xpub_magic_segwit_native" - здесь я прибегнул к помощи форка утилиты Ian Coleman BIP39, где уже добавлена поддержка UFO https://github.com/Bushstar/bip39

"xpub_magic" соответствует значению из файла src/js/bitcoinjs-extensions.js. Нужно просто перевести число 0x0488b21e в десятичную систему.

"xpub_magic_segwit_p2sh" соответствует значению из файла src/js/segwit-parameters.js

"xpub_magic_segwit_native" соответствует значению из файла src/js/segwit-parameters.js

"fiat_rates_params": Здесь важно правильно указать название монеты из API coingecko https://www.coingecko.com/en/api/documentation

Ну собственно и всё, то есть я взял уже готовое решение и внёс минимальные измениния для добавления нужной мне монеты.

Процесс сборки из нашего репозитория.


#Устанавливаем Docker и добавляем нашего пользователя в группу docker:
sudo apt install docker.io
sudo usermod -aG docker $USER

#Прелогиниваемся

#Клонируем репозиторий и собираем:
git clone https://github.com/e4p1k0/blockbook -b ufo
cd blockbook/
make all-ufo

#В директории build появятся файлы backend-ufo_0.18.1-1_amd64.deb и
# blockbook-ufo_0.3.6_amd64.deb

#Устанавливаем backend-ufo (UFO core) и запускаем сервис:
sudo apt install ./backend-ufo_0.18.1-1_amd64.deb
sudo systemctl start backend-ufo.service

#Начнётся синхронизация, процесс которой можно наблюдать в логе ноды:
sudo tail -f /opt/coins/data/ufo/backend/debug.log

#После синхронизации устанавливаем второй пакет и запускаем Blockbook:
sudo apt install ./blockbook-ufo_0.3.6_amd64.deb
sudo systemctl start blockbook-ufo.service

Всё! Переходим на https://localhost:9187 и видим эту красоту:

После синхронизации Blockbook предупреждающая надпись пропадёт и с ним можно полноценно работать.

Чуть не забыл, нужно обязательно настроить nginx, иначе Suite не сможет соединиться с Blockbook по websocket:


server {
     listen 443 ssl;
     ssl_certificate /etc/letsencrypt/live/ufo1.e4pool.com/fullchain.pem;
     ssl_certificate_key /etc/letsencrypt/live/ufo1.e4pool.com/privkey.pem;
     include /etc/letsencrypt/options-ssl-nginx.conf;
     ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
     server_name ufo1.e4pool.com;
     location / {
         add_header Access-Control-Allow-Origin '*' always;
         proxy_pass https://[::]:9187;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host;
         proxy_set_header X-NginX-Proxy true;
         # Enables WS support
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         proxy_redirect off;
     }
}

Примечание для разработчиков: в официальную ветку Blockbook на GitHub попасть не так уж и сложно, нужно только добавить тесты https://github.com/trezor/blockbook/blob/master/CONTRIBUTING.md#add-coin-implementation. А вот попасть официально в Suite и Firmware на данный момент, похоже, нереально, такова политика партии. Хочется надеяться, что я не прав.

Собираем прошивку.

Здесь всё то же самое, самое сложное это параметры блокчейна в файле common/defs/bitcoin/ufo.json

"decimals": Количество десятичных знаков после запятой - 8 , как и в биткоине

"maxfee_kb": Максимальная комиссия, сат/КБайт

"minfee_kb": Минимальная комиссия, сат/КБайт

"xpub_magic", "xpub_magic_segwit_p2sh", "xpub_magic_segwit_native" - по аналогии с Blockbook

"xpub_magic_multisig_segwit_p2sh" и "xpub_magic_multisig_segwit_native" оставил равными "xpub_magic" по аналогии c Vertcoin. В этом моменте могу оказаться не прав, не тестил мультисиг. Разработчики UFO, надеюсь, меня поправят.

"slip44": По аналогии с Blockbook

"default_fee_b": Стандартная комиссия, предлагаемая кошельком, сат/Байт

Поехали!


# Устанавливаем GNU ARM Embedded toolchain, как описано
# здесь https://askubuntu.com/a/1243405

python3.8 -m pip install poetry
git clone https://github.com/e4p1k0/trezor-firmware -b ufo
cd trezor-firmware/legacy/
python3.8 -m poetry install
export PRODUCTION=0
python3.8 -m poetry run ./script/setup
python3.8 -m poetry run ./script/cibuild

В конце сборки вы получите отпечаток прошивки, нас интересует тот, что относится к trezor-firmware/legacy/firmware

Готовая прошивка trezor.bin будет находиться в поддиректории firmware/

Теперь её можно установить с помощью Trezor Suite в устройство. При каждом запуске будет выводиться сообщение о неофициальной прошивке, а так же отображаться её отпечаток.

Trezor Suite.

Параметры блокчейна находятся в файле packages/connect-common/files/coins.json

"address_type", "address_type_p2sh", "bech32_prefix" - по аналогии с Trezor Firmware

"url": Адреса Blockbook-серверов

"decimals", "default_fee_b", "hash_genesis_block", "maxfee_kb",  "minfee_kb", "slip44", "xprv_magic", "xpub_magic", "xpub_magic_multisig_segwit_native", "xpub_magic_multisig_segwit_p2sh", "xpub_magic_segwit_native", "xpub_magic_segwit_p2sh" - по аналогии с Trezor Firmware

Ну и в паре файлов второе число в bip43Path нужно заменить на 202, согласно slip44, который уже упоминался выше.

Собираем.


# Устанавливаем nvm https://github.com/nvm-sh/nvm#install--update-script

# Устанавливаем последнюю LTS версию nodejs и yarn:
nvm install v16.16.0
npm install -g yarn

# Клонируем свой репозиторий:
git clone https://github.com/e4p1k0/trezor-suite -b ufo

cd trezor-suite/
git lfs pull
yarn
yarn build:libs && yarn workspace @trezor/suite-data msg-system-sign-config
cd packages/suite-desktop
yarn workspace @trezor/suite-desktop build:linux

# Аналогично под винду и мак - build:mac, build:win

В поддиректории build-electron/ появится готовый запускаемый файл Trezor-Suite-22.8.0-linux-x86_64.AppImage

Можно запускать и тестировать.

Заходим в "настройки" - "криптовалюты" и чудо произошло:

Добавляю UFO, возвращаюсь на главный экран и вижу свой баланс, поскольку я восстановил кошелёк из старого сида:

Напоследок, как и обещал в комментариях к предыдущему своему посту на Slabber, передам привет с помощью блокчейна UFO.

Готово:

Я по этическим соображениям не публикую на гитхабе готовые релизы, как минимум потому что:

1) Такие вещи должны исходить из официальных репозиториев UFO

2) Всё это счастие требует тщательного тестирования

3) Я не уверен в параметрах мультисига

Кому зашло, прошу не проходить мимо нашей весёлой компании https://e4pool.com/, а так же мимо моего ютуба, ссылка есть в описании канала.

Всем спасибо и до новых встреч)

Post earned 14,333.00 UFO

Post earned 14,333.00 UFO

Комментарии

Comments: