Краткий курс по разработке Web3-приложений с помощью Python

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

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

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

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

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

Хотя в пространстве web3 существует множество уникальных блокчейнов и продуктов, это руководство будет посвящено блокчейну Ethereum, который является одной из наиболее часто используемых сетей. Как и большинство криптовалютных блокчейнов, Ethereum работает в децентрализованном режиме с обширной сетью компьютеров, с которыми можно взаимодействовать как с равными. Однако любая операция, требующая подтверждения права собственности, например, подписание транзакции, требует авторитетной печати закрытого ключа.

Это основа работы сети, которая делает метод коммуникации и управления привилегированной информацией главной задачей.

В этом учебнике мы будем придерживаться базовой схемы работы непосредственно с блокчейном Ethereum и его API:

  • Подключение к тестовой сети
  • Генерация и защита открытых ключей
  • Получение токенов
  • Безопасная отправка токенов

Давайте начнем!

Основные сведения о цепочке

При выборе способа подключения к блокчейну Ethereum существует два общих подхода, каждый из которых имеет свои преимущества и недостатки.

Первый — это подключение к стороннему API, который служит интерфейсом для низкоуровневых сетевых протоколов блокчейна. Такие сервисы, как Infura, предлагают веб-интерфейс JSON RPC API, который широко совместим с целым рядом библиотек и языков и позволяет разработчикам взаимодействовать с блокчейном без загрузки всей бухгалтерской книги, которая может занимать значительные вычислительные ресурсы и дисковое пространство (около 500 ГБ на момент написания статьи).

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

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

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

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

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

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

Первые шаги

Для подключения к сети Ethereum мы будем использовать geth (Go Ethereum), который является реализацией golang и может функционировать не только как клиент, но и как полнофункциональный узел.

Сначала следуйте инструкциям по установке geth для вашей операционной системы. После установки команда geth должна быть доступна из терминала.

geth version
Geth
Version: 1.10.17-stable
Architecture: amd64
Go Version: go1.16.13
Operating System: linux
GOPATH=
GOROOT=/nix/store/j1x3cy8g2cqcr54rg98gw0mdc28jlyc8-go-1.16.13/share/go

Войти в полноэкранный режим Выйти из полноэкранного режима

Флаги командной строки, передаваемые в geth CLI, определяют, к какой сети он будет подключаться. В сети Ethereum существует несколько тестовых сетей на выбор, в данном руководстве будет использоваться сеть Goerli proof-of-authority, поскольку она новее других и не связана с вычислительно затратными сетями proof-of-work.

Флаг --syncmode управляет методом, который geth будет использовать при загрузке исторической книги блокчейна. С одной стороны, метод full загрузит всю бухгалтерскую книгу блокчейна, включая все соответствующие транзакционные данные. С другой стороны, метод light будет загружать только заголовки последних блоков и извлекать другую информацию по требованию. При взаимодействии с производственной сетью Ethereum метод full дает наиболее полную гарантию того, что локальная копия данных блокчейна является действительной и легитимной. Однако в данном исследовательском случае в тестовой сети достаточно метода light.

Запустите процесс geth в фоновом терминале на вашей машине. Начальный процесс синхронизации займет время, но использование метода light на тестовой сети goerli не потребует чрезмерного пространства (на момент написания этой статьи вся цепочка занимает около 500 МБ дискового пространства). Следующая команда сохранит данные цепочки Goerli в каталоге ~/.goerli:

geth --syncmode light --datadir ~/.goerli --goerli
INFO [04-05|15:54:49.916] Starting Geth on Goerli testnet...
...

Войти в полноэкранный режим Выйти из полноэкранного режима

Через некоторое время демон перестанет импортировать исторические блоки, и будут доступны последние блоки.

При выполнении начальной синхронизации вывод журнала geth будет включать age блока. Если вы видите импортируемые блоки с выводом типа age=4m04w1d, это означает, что для построения локальной цепочки извлекаются старые блоки. Когда старые блоки перестанут появляться, это означает, что начальная синхронизация завершена.

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

Учетные записи и ключи

В начале этого руководства мы подробно говорили о важности ключей при взаимодействии с блокчейном.

Криптография с открытым ключом составляет основу криптографических методов формирования и аутентификации транзакций в публичных бухгалтерских книгах. Закрытые ключи подтверждают право собственности на публичные адреса и подписывают транзакции по отправке токенов на другие публичные адреса.

Хотя криптовалютные приложения высокого уровня, ориентированные на пользователя, могут использовать информацию об учетной записи для кошельков в виде традиционных комбинаций имени пользователя/пароля, основной ценностью, составляющей «учетную запись» на блокчейне типа Ethereum, является криптографический ключ — токены принадлежат адресу, связанному с закрытым ключом. В geth CLI включены утилиты для генерации ключей, которые он называет аккаунтом.

Для начала создайте новый аккаунт. Помните, что этот «аккаунт» на самом деле является локально зашифрованным файлом, а не аккаунтом, в который можно «войти» с другой машины — если вы используете аккаунт, привязанный к производственному блокчейну, очень важно убедиться, что этот аккаунт защищен надежной парольной фразой, регулярно резервируемой.

В нашем случае локальная учетная запись и пара ключей будут связаны с тестовой сетью, но мы все равно будем использовать лучшие практики управления парольной фразой, храня ее в зашифрованном хранилище секретов (Doppler), и рассматривать учетную запись как конфиденциальную. Поскольку запущенный процесс geth активен, мы подключимся к запущенному демону через attach вместо использования субкоманды geth account.

Войдите в консоль geth:

geth --datadir ~/.goerli attach

Войти в полноэкранный режим Выйти из полноэкранного режима

Вас встретит командная строка для команд geth javascript.

Welcome to the Geth JavaScript console!

instance: Geth/v1.10.17-stable/linux-amd64/go1.16.13
at block: 6664849 (Tue Apr 05 2022 17:34:43 GMT-0600 (MDT))
datadir: /home/yourname/.goerli
modules: admin:1.0 clique:1.0 debug:1.0 eth:1.0 les:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 vflux:1.0 web3:1.0

To exit, press ctrl-d or type exit
>

Войти в полноэкранный режим Выйти из полноэкранного режима

Чтобы создать новую учетную запись, выполните следующую команду, где вам будет предложено ввести кодовую фразу:

personal.newAccount()

Вход в полноэкранный режим Выйти из полноэкранного режима

После выполнения подсказок geth создаст пару ключей в каталоге ~/.goerli/keystore/. Вы можете в любое время просмотреть открытый адрес этой учетной записи, выполнив следующую команду из консоли geth:

personal.listAccounts

Войти в полноэкранный режим Выйти из полноэкранного режима

На этом этапе на вашей локальной машине будет установлена легкая копия блокчейна тестового сети Ethereum Goerli и пара ключей, готовая к отправке и получению токенов. Давайте начнем работать с транзакциями!

Взаимодействие с блокчейном

Простой задачей для подтверждения функциональности этой локальной тестовой сети является получение валюты. В отличие от валюты на живом, производственном блокчейне, валюта в тестовой сети часто раздается бесплатно, чтобы позволить разработчикам тестировать и повторять проекты и продукты.

Поставщики бесплатной валюты — часто называемые «кранами» — иногда могут быть недоступны или не иметь достаточных средств для свободного распределения токенов. На момент написания этой статьи упомянутый здесь кран функционирует и имеет достаточно средств для раздачи токенов всем, кто их запрашивает, но если вы столкнетесь с проблемами при запросе средств позднее, чем во время написания этого руководства, вы также можете поискать альтернативные источники (помните, что они должны работать в тестовой сети Goerli Ethernet).

Мы будем использовать Goerli Faucet для получения начальных средств, чтобы начать экспериментировать с блокчейном.

В консоли geth найдите свой публичный адрес с помощью listAccounts:

personal.listAccounts
["0x..."]

Войдите в полноэкранный режим Выйдите из полноэкранного режима

Скопируйте адрес, перейдите к крану Goerli, вставьте свой адрес в поле Wallet Address, затем нажмите Send Me ETH.

На этой цепочке часто майнятся блоки, поэтому самое время проверить свой баланс! Для взаимодействия с локальным узлом мы будем использовать библиотеку Web3 Python.

Это руководство предполагает, что на вашей локальной машине установлен Python 3. Мы предоставили репозиторий с примерами кода в качестве быстрого старта для ознакомления с тем, как использовать библиотеку Web3.

Клонируйте репозиторий GitHub, затем войдите в каталог репозитория:

git clone https://github.com/DopplerUniversity/python-web3
cd python-web3

Войдите в полноэкранный режим Выйти из полноэкранного режима

Создайте виртуальную среду Python и установите зависимости:

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Войдите в полноэкранный режим Выйти из полноэкранного режима

Не стесняйтесь открыть web3-app.py и взглянуть! Библиотека Python web3 делает доступ к информации блокчейна достаточно простым, поэтому этот пример кода должен стать хорошим началом, если вы захотите поэкспериментировать позже.

Давайте проверим работу скрипта, получив временную метку последнего блока в цепочке:

python web3-app.py latest-block

Войти в полноэкранный режим Выйдите из полноэкранного режима

Если вы видите временную метку, которая находится в пределах 30 секунд или около того, поздравляем! Вы успешно взаимодействовали с локальным экземпляром блокчейна testnet. Следующая задача — проверить баланс адреса, на который были отправлены токены faucet.

Сначала убедитесь, что Python может видеть локальный аккаунт:

python web3-app.py accounts

Войдите в полноэкранный режим Выйдите из полноэкранного режима

Номер счета должен совпадать с адресом, который вы ранее нашли в консоли geth с помощью personal.listAccounts. Наконец, проверьте баланс счета.

python web3-app.py balance

Вход в полноэкранный режим Выход из полноэкранного режима

Баланс счета для адреса, введенного на сайте Ethereum faucet, должен составлять 0,05 ETH. Вы проверили баланс своего счета из библиотеки python web3. Отлично!

Отправка ETH

До сих пор мы взаимодействовали с локальным блокчейном только с помощью API, не требующих приватных ключей аккаунта. Чтобы завершить этот эксперимент и успешно подписать транзакцию со своей учетной записью, мы потренируемся, отправив некоторое количество ETH обратно на кран Goerli. Это поможет продемонстрировать процесс, а также пополнить средства будущих разработчиков на блокчейне!

Чтобы отправить ETH, используйте метод send_transaction:

web3.geth.personal.send_transaction(self, transaction, passphrase)

Войдите в полноэкранный режим Выйти из полноэкранного режима

Помните, как мы создали локальную учетную запись Geth и указали кодовую фразу?

Парольная фраза нужна здесь для разблокировки закрытого ключа и подписания транзакции, чтобы подтвердить ее как законный перевод средств с нашего счета. Однако ввод парольной фразы в REPL или оболочку представляет собой проблему для безопасности: большинство REPL и оболочек (например, bash или интерпретатор python) сохраняют введенные команды, поэтому разумнее избегать ввода парольной фразы вручную в открытом виде.

Какие еще варианты существуют? Один из вариантов — считывать секретные значения — будь то парольная фраза, API-ключ или что-то еще — из файла на диске, например .env или JS-файла, но это опасный вариант, о чем уже говорилось выше.

Хранение секретов в открытых файлах — это огромный кошмар для безопасности, поскольку они могут быть прочитаны другими пользовательскими процессами и рискуют быть зафиксированными во время работы с такими инструментами, как git, если разработчик допустит ошибку, как это сделал Нат Элиасон, потерявший $30 000, случайно выложив файл со своей парольной фразой на GitHub.

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

Именно здесь может помочь платформа SecretOps, такая как Doppler, с помощью Doppler CLI для внедрения секретов в качестве переменных окружения в процесс приложения. Это позволяет безопасно заполнить переменную окружения парольной фразой без риска незашифрованного хранения локальных файлов.

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

doppler login

Войти в полноэкранный режим Выйти из полноэкранного режима

Создайте новый проект под названием python-web3, который будет хранить секреты этого проекта и держать все организованно, а также в пределах своего окружения:

doppler projects create python-web3
doppler setup --project python-web3 --config dev

Войти в полноэкранный режим Выйти из полноэкранного режима

Убедитесь, что вы запустили doppler setup в директории python-web3, так как Doppler CLI ограничивает доступ секретов к определенным директориям. В конечном итоге у вас должна получиться установка, подобная приведенной ниже: с вашим каталогом проекта, связанным с проектом python-web3 в Doppler.

Выполните следующую команду, чтобы проверить, что вы можете получить доступ к секретам из каталога python-web3:

doppler secrets

 ID NAME DESCRIPTION CREATED AT               

 python-web3 python-web3 2022-05-24T23:40:34.955Z 

Войти в полноэкранный режим Выйти из полноэкранного режима

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

Откройте python-web3 проект Doppler и создайте ETH_PASSPHRASE с вашим значением парольной фразы, затем нажмите Save.

Вернувшись в терминал, убедитесь, что Doppler успешно сохранил вашу ключевую фразу:

doppler secrets get ETH_PASSPHRASE

Войти в полноэкранный режим Выйти из полноэкранного режима

С парольной фразой, управляемой Doppler, мы можем запустить скрипт python с секретами, заполненными командой doppler run.

Вы можете просмотреть сопутствующий код python из клонированного репозитория, но ключевыми строками являются те, которые извлекают вашу секретную фразу из переменной окружения ETH_PASSPHRASE.

Когда вы вызовете команду doppler run, Doppler установит переменную окружения ETH_PASSPHRASE для использования python и подпишет транзакцию информацией о кошельке из разблокированного ключа. Хотя в качестве адреса указан адрес крана, с которого вы первоначально получили баланс, вы можете выбрать произвольную сумму для отправки с помощью команды (при условии, что у вас достаточно средств!).

Вы можете найти произвольный счет для отправки средств на странице главных счетов Goerli. Скопируйте один из адресов to (начиная с 0x) и замените {ADDRESS} в команде ниже, чтобы начать перевод средств:

doppler run -- python web3-app.py send {ADDRESS} 0.01

Войти в полноэкранный режим Выйти из полноэкранного режима

После завершения транзакции будет возвращен уникальный хэш транзакции, как показано ниже:

HexBytes('0x0d8c2b6924a88cda73c73275051245db7a7e698f419a9d27b8b185dda16a8436')

Вход в полноэкранный режим Выйти из полноэкранного режима

Ваша транзакция была отправлена в блокчейн! В этот момент запущенный узел geth light будет транслировать эту транзакцию, и перевод средств распространится по сети. Вы можете использовать несколько подходов для просмотра деталей транзакции.

Предоставленный скрипт python поддерживает команду для просмотра произвольного идентификатора транзакции, например, следующая команда отобразит детали транзакции для вышеупомянутого идентификатора транзакции:

python web3-app.py get-txn 0x0d8c2b6924a88cda73c73275051245db7a7e698f419a9d27b8b185dda16a8436

Войти в полноэкранный режим Выйти из полноэкранного режима

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

Например, вы можете использовать общедоступный веб-просмотрщик блокчейна для просмотра транзакций, связанных с определенным адресом (замените заданный хэш на свой, который находится под переменной в вашем python repl как my_account):

https://goerli.etherscan.io/address/0x858Eb06Bd4dc5BE36Dc5025483a316E1630b35e9

Или же вы можете просмотреть транзакцию напрямую, введя хэш вашей транзакции в URL, как показано ниже:

https://goerli.etherscan.io/tx/0x0d8c2b6924a88cda73c73275051245db7a7e698f419a9d27b8b185dda16a8436

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

Поздравляем! Вы только что создали транзакцию на блокчейне Ethereum!

Производственные соображения

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

Напомним, что в этом учебнике мы создали связку ключей с помощью geth CLI, поэтому связанные с ней открытый и закрытый ключи существуют только на локальной машине.

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

Библиотека web3 предоставляет метод web3.geth.personal.import_raw_key, который принимает закрытый ключ и парольную фразу, так что ваши транзакционные операции могут происходить на любой машине с правильно настроенной средой Doppler. Локальный блокчейн можно использовать для большего количества экспериментов благодаря гибкости среды testnet, поэтому вы можете продолжать получать валюту с крана Goerli testnet и отправлять средства на другие адреса.

Дополнительное чтение

Для получения дополнительной информации на этих ресурсах можно найти документацию и информацию о библиотеках и инструментах, используемых в данном руководстве:

  • Документация Web3.py
  • Транзакции | ethereum.org
  • Сети | ethereum.org
  • Goerli Testnet
  • Doppler SecretOps Platform | Начало работы

Оцените статью
Procodings.ru
Добавить комментарий