Как использовать экземпляры контейнеров Azure для размещения Ganache

Когда я начал больше узнавать о Web3, я познакомился с Ganache, блокчейном в один клик.

Это отлично подходит для местного развития. Я хотел найти способ использовать его в рамках рабочего процесса PR с Azure Static Web Apps (SWA). Статические веб-приложения Azure могут развернуть временную среду для просмотра изменений во время PR.

Если приложение является распределенным приложением (dApp), для просмотра изменений у вас должны быть развернуты смарт-контракты. Именно здесь я хочу использовать Azure Container Instances (ACI) для размещения временного экземпляра Ganache для развертывания смарт-контрактов во время PR.

Сначала мне нужно было выяснить, как развернуть ACI для размещения образа Ganache Docker из trufflesuite/ganache. Я буду использовать кроссплатформенный Azure CLI и кроссплатформенный PowerShell. Чтобы создать ACI, мне нужна группа ресурсов. Я могу создать новую группу ресурсов или сохранить ее в той же группе, что и SWA. Если бы я хотел создать группу ресурсов для ACI, я мог бы использовать следующую команду:

az group create --resource-group test-ganache --location centralus

Создав группу ресурсов, я развернул ACI с помощью следующей команды:

$aci = az container create --resource-group test-ganache --name ganache --image trufflesuite/ganache:latest --ports 8545 --ip-address Public --output json | ConvertFrom-Json

Приведенная выше команда использует PowerShell для преобразования вывода JSON команды az container create в объект PowerShell и сохранения его в $aci. Мне это нужно, чтобы я мог получить доступ к IP-адресу ACI. Команда create предоставляет порт 8545, который является портом по умолчанию, используемым Ganache, и запрашивает, чтобы контейнер получил общедоступный IP-адрес.

Поскольку я запускал эти команды в интерактивном сеансе PowerShell с установленным geth, я подключился к этой цепочке блоков с помощью следующей команды:

geth attach http://$($aci.ipAddress.ip):8545

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

$logs = az container logs --container ganache --resource-group test-ganache --name ganache

С выводом, сохраненным в $logs, я использовал Select-String CmdLet для получения адреса и закрытого ключа с помощью следующих команд:

# Get first address
$address = ($logs | Select-String '\(0\) ([^\(]+) \(').Matches.Groups[1].Value 
# Get first private key
$key = ($logs | Select-String '\(0\) ([^\(]{64,})').Matches.Groups[1].Value

Команды выше получают первый адрес. Если мне нужна другая учетная запись, я просто настраиваю индекс в регулярном выражении с 0 на желаемый индекс. Например, чтобы получить вторую учетную запись, измените \(0\) на \(1\) в приведенных выше командах.

Чтобы очистить свой ACI, я использовал следующую команду:

az container delete --resource-group test-ganache --name ganache

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

az group delete --resource-group test-ganache

Спасибо за прочтение. До скорого!

Первоначально опубликовано на https://www.donovanbrown.com.