Настройка Truffle для разработки
Truffle Suite — один из старейших фреймворков для разработки смарт-контрактов: компилятор, миграции, тестовый раннер, и Ganache для локальной сети. Несмотря на то что Hardhat и Foundry заняли большую часть новых проектов, Truffle остаётся в production у сотен проектов, запущенных до 2021 года. Настройка с нуля сейчас выглядит иначе, чем в туториалах трёхлетней давности.
Конфигурация truffle-config.js под современный проект
Ключевой момент — сеть и провайдер. Для работы с Infura или Alchemy:
const HDWalletProvider = require('@truffle/hdwallet-provider');
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*", // Ganache
},
sepolia: {
provider: () => new HDWalletProvider(
process.env.MNEMONIC,
`https://sepolia.infura.io/v3/${process.env.INFURA_KEY}`
),
network_id: 11155111,
gas: 5500000,
confirmations: 2,
timeoutBlocks: 200,
skipDryRun: true
}
},
compilers: {
solc: {
version: "0.8.20",
settings: {
optimizer: { enabled: true, runs: 200 },
viaIR: true // через Yul IR — лучше для сложных контрактов
}
}
},
plugins: ["truffle-plugin-verify"]
};
runs: 200 — компромисс между стоимостью деплоя и стоимостью вызовов. Для контрактов с высокой частотой вызовов увеличивают до 1000+.
Миграции: порядок имеет значение
Файлы миграций нумеруются: 1_initial_migration.js, 2_deploy_token.js. Truffle отслеживает выполненные миграции через Migrations контракт on-chain. Если миграция уже выполнена — она пропускается при повторном запуске.
Типичная миграция с зависимостями между контрактами:
const Token = artifacts.require("MyToken");
const Staking = artifacts.require("StakingContract");
module.exports = async function(deployer, network, accounts) {
await deployer.deploy(Token, "MyToken", "MTK", web3.utils.toWei("1000000"));
const token = await Token.deployed();
await deployer.deploy(Staking, token.address, accounts[0]);
};
Интеграция с Ganache
Ganache 7.x запускается как пакет (@ganache/core) или CLI (ganache). Для детерминированных тестов — фиксируем seed:
ganache --seed 42 --accounts 10 --defaultBalanceEther 1000
Или через ganache.fork для форкинга mainnet — аналог hardhat node --fork.
Тесты на JavaScript и Mocha
Truffle использует Mocha + Chai. Контракты доступны через artifacts.require. Async/await поддерживается:
const Token = artifacts.require("MyToken");
contract("MyToken", accounts => {
it("mints initial supply to deployer", async () => {
const token = await Token.deployed();
const balance = await token.balanceOf(accounts[0]);
assert.equal(balance.toString(), web3.utils.toWei("1000000"));
});
});
Верификация контракта после деплоя через truffle-plugin-verify:
truffle run verify MyToken --network sepolia
Ориентиры по срокам
Настройка Truffle с нуля: 2-3 часа. Включает конфигурацию сетей, Ganache, базовые миграции, тестовое окружение и плагин верификации.







