← Назад в блог

Деплой смарт-контрактов в Geth с помощью Truffle

Опубликовано
2 мин чтения
--- просмотров

Используем Truffle с Geth вместо Ganache

Итак, как настоящий блокчейн-разработчик, ты можешь захотеть протестировать свой смарт-контракт не только на Ganache (эмуляторе блокчейна в памяти), но и в окружении, максимально близком к реальному блокчейну. В этом случае ты будешь использовать Go Ethereum (Geth) и, скорее всего, Truffle для написания, тестирования и деплоя своих контрактов.

Использовать Ganache + Truffle легко — кажется, будто они созданы друг для друга. Но связка Truffle + Geth часто приносит проблемы. В этом посте я расскажу, как решить проблемы, с которыми я столкнулся.

Настройка окружения

  • Версия Go Ethereum (geth): 1.10.19-stable (для ARM64)
  • Версия Truffle: 5.5.18
  • Цель: задеплоить смарт-контракты через Truffle в Geth и иметь возможность взаимодействовать с ними.

Команда Geth

geth --networkid 4224 --mine --miner.threads 1 --datadir "./private" --nodiscover -port "30303" --nat "any" \
  --http --http.api personal,eth,net,web3 \
  --ws --ws.api personal,eth,net,web3 \
  --password ./private/password.sec --ipcpath "~/Library/Ethereum/geth.ipc"

Обрати внимание на флаг --password — он указывает на файл с паролем для безопасной разблокировки аккаунта.

Конфигурация Truffle (truffle-config.js)

geth: {
  host: "127.0.0.1",
  port: 8545,
  network_id: 4224,
  from: '0x6db7f74b66403832fc2cfa40d6ee79f1b6915e37',
}

Создай этот аккаунт с помощью:

geth --datadir . account new

Ты можешь пропустить запрос пароля или использовать файл.

Проблема

Запусти:

truffle migrate --network geth
Ошибка Truffle

Приводит к ошибке аутентификации.

Решение: разблокировать аккаунт

Добавь --allow-insecure-unlock в свою команду Geth:

geth ... --allow-insecure-unlock

Изменение скрипта миграции Truffle

Обнови migrations/1_initial_migration.js:

const Migrations = artifacts.require('Migrations');
const TruffleConfig = require('../truffle-config');
const Web3 = require('web3');

module.exports = function (deployer, network, accounts) {
  const config = TruffleConfig.networks[network];
  if (process.env.ACCOUNT_PASSWORD) {
    const web3 = new Web3(new Web3.providers.HttpProvider(`http://\${config.host}:\${config.port}`));
    web3.eth.personal.getAccounts().then((accounts) => {
      const defaultAccount = accounts[0];
      console.log(`[x] Unlocking account \${defaultAccount}`);
      web3.eth.personal.unlockAccount(defaultAccount, process.env.ACCOUNT_PASSWORD);
    });
  }
  console.log('[x] Making migrations');
  deployer.deploy(Migrations);
};

Вариант 2: разблокировка в консоли Geth

  1. Запусти Geth
  2. В другом терминале:
geth attach
Подключение к Geth
  1. Затем:
personal.unlockAccount('0x6db7f74b66403832fc2cfa40d6ee79f1b6915e37', 'your_password');
  1. Запусти миграцию заново:
truffle migrate --network geth
Миграция Truffle

Готово, можно работать!

Открыт для работы по контракту

Я доступен для работы по контракту. Если у вас есть интересная идея проекта — запишитесь на звонок через Calendly.

Записаться на 30-минутный звонок