Читать книгу Криптовалюта с нуля: От идеи до запуска вашего блокчейн проекта. Часть 2 (Алексей Дмитриевич Боровков) онлайн бесплатно на Bookz (2-ая страница книги)
bannerbanner
Криптовалюта с нуля: От идеи до запуска вашего блокчейн проекта. Часть 2
Криптовалюта с нуля: От идеи до запуска вашего блокчейн проекта. Часть 2
Оценить:

4

Полная версия:

Криптовалюта с нуля: От идеи до запуска вашего блокчейн проекта. Часть 2

const totalSupply = await bookCoin.totalSupply()

console.log("Total Supply:", totalSupply.toString())


// Проверить ваш баланс

const accounts = await web3.eth.getAccounts()

const myBalance = await bookCoin.balanceOf(accounts[0])

console.log("My Balance:", web3.utils.fromWei(myBalance, 'ether'))


// Перевести токены (1 BOOK)

await bookCoin.transfer("0xReceiverAddress", web3.utils.toWei("1", "ether"))


11. Добавление токена в MetaMask

1. Откройте MetaMask

2. Нажмите "Import tokens"

3. Вставьте адрес контракта

4. Символ и decimals подтянутся автоматически

5. Нажмите "Add"


Теперь вы видите свои BOOK токены в кошельке!


Возможные ошибки и решения:

Ошибка: insufficient funds

· Решение: Получите больше test ETH из крана


Ошибка: gas required exceeds allowance

· Решение: Увеличьте значение gas в truffle-config.js


Ошибка: nonce too low

· Решение: Сбросьте nonce в настройках аккаунта MetaMask


Транзакция висит в pending

· Решение: Увеличьте gas price или отмените транзакцию


Проверка успешного деплоя

Контракт появился в блок-эксплорере

Баланс токенов отображается в MetaMask

Можно выполнять transfer транзакции

Комиссии списываются в test ETH


Поздравляю! Вы успешно развернули свой ERC-20 токен в тестовой сети Ethereum. В следующем разделе мы верифицируем исходный код, чтобы любой мог проверить логику вашего контракта.

5.5 Верификация контракта на Etherscan.


Верификация контракта – это процесс публикации исходного кода вашего смарт-контракта в блок-эксплорере (Etherscan). Это критически важный шаг для построения доверия к вашему проекту.


Зачем верифицировать контракт?

1. Прозрачность: Пользователи могут убедиться, что код соответствует заявленной функциональности

2. Доверие: Верифицированные контракты вызывают больше доверия у инвесторов

3. Взаимодействие: Позволяет напрямую вызывать функции контракта через Etherscan

4. Отслеживание: Пользователи могут отслеживать транзакции и балансы


Без верификации:

Contract Source Code Not Verified

Click to Verify and Publish


После верификации:

Contract Source Code Verified

Read Contract | Write Contract


Способ 1: Автоматическая верификация с помощью Truffle Plugin

Шаг 1: Установка плагина

bash

npm install -D truffle-plugin-verify


Шаг 2: Настройка truffle-config.js

Добавьте в truffle-config.js:

javascript

module.exports = {

// … остальная конфигурация

plugins: ['truffle-plugin-verify'],

api_keys: {

etherscan: process.env.ETHERSCAN_API_KEY

}

};


Шаг 3: Получение API-ключа Etherscan

1. Зарегистрируйтесь на etherscan.io

2. Перейдите в API Keys

3. Создайте новый API Key

4. Добавьте в .env файл:


env

ETHERSCAN_API_KEY=YourApiKeyToken


Шаг 4: Верификация контракта

bash

truffle run verify BookCoin –network sepolia


Ожидаемый результат:

Verifying BookCoin

Pass – Verified: https://sepolia.etherscan.io/address/0x1234…5678#code

Successfully verified 1 contract(s).


Способ 2: Ручная верификация через веб-интерфейс

Шаг 1: Найдите ваш контракт в Etherscan

Перейдите по адресу:

https://sepolia.etherscan.io/address/ВАШ_АДРЕС_КОНТРАКТА


Нажмите "Verify and Publish"


Шаг 2: Заполните форму верификации

Contract Address: 0xYourContractAddress

Compiler Type: Solidity (Single file)

Compiler Version: v0.8.19+commit.7dd6d404

Open Source License Type: MIT License


Шаг 3: Вставьте код контракта

Скопируйте содержимое вашего BookCoin.sol:

solidity

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;


import "@openzeppelin/contracts/token/ERC20/ERC20.sol";


contract BookCoin is ERC20 {

constructor(uint256 initialSupply) ERC20("BookCoin", "BOOK") {

_mint(msg.sender, initialSupply * 10 ** decimals());

}

}


Шаг 4: Настройка конструктора

В разделе "Constructor Arguments" введите ABI-encoded параметры:

00000000000000000000000000000000000000000000000000000000000f4240


Это hex-представление 1000000 (1 миллион токенов).


Способ 3: Верификация с помощью Hardhat

Если вы используете Hardhat вместо Truffle:

Установка плагина:

bash

npm install –save-dev @nomiclabs/hardhat-etherscan


Добавьте в hardhat.config.js:

javascript

require("@nomiclabs/hardhat-etherscan");


module.exports = {

etherscan: {

apiKey: process.env.ETHERSCAN_API_KEY

}

};


Верификация:

bash

npx hardhat verify –network sepolia DEPLOYED_CONTRACT_ADDRESS "1000000"


Решение распространенных проблем:

Проблема 1: "Already Verified"

Contract source code already verified

Решение: Контракт уже верифицирован – это успех!


Проблема 2: "Bytecode doesn't match"

Sorry! The compiled result does not match the deployed bytecode

Решение:

· Убедитесь, что версия компилятора совпадает

· Проверьте настройки оптимизатора

· Убедитесь, что вы верифицируете правильный контракт


Проблема 3: "Unable to detect constructor arguments"

Failed to detect constructor arguments

Решение: Вручную укажите ABI-encoded параметры конструктора


Как получить ABI-encoded параметры конструктора


Способ 1: Использование Truffle

javascript

// В консоли Truffle

const contract = await BookCoin.deployed();

const transaction = await web3.eth.getTransaction(contract.transactionHash);

console.log(transaction.input);


Способ 2: Онлайн-энкодер

Используйтеabi.hashex.org для кодирования параметров.


Способ 3: Использование ethers.js

javascript

const { ethers } = require("ethers");

const coder = new ethers.utils.AbiCoder();

const encoded = coder.encode(["uint256"], [1000000]);

console.log(encoded);


Что вы получите после верификации

Read Contract Tab – просмотр состояния контракта

· totalSupply()

· balanceOf()

· allowance()


Write Contract Tab – взаимодействие с контрактом

· transfer()

· approve()

· transferFrom()


Источник транзакций – отслеживание всех операций

Аналитика – графики и статистика

Комментарии – обратная связь от сообщества


Пример успешной верификации

После успешной верификации ваш контракт будет выглядеть так:

Contract Source Code Verified (Exact Match)


Contract Name: BookCoin

Compiler Version: v0.8.19+commit.7dd6d404

Optimization Enabled: Yes with 200 runs

Other Settings: default evmVersion, MIT license


Read Contract | Write Contract


+ [X] Contract created with 0x123… at block 4000001

+ [X] Verified 2 days ago

+ [X] 15 transactions


Дополнительные возможности


Верификация через flattening:


bash

npx truffle-flattener contracts/BookCoin.sol > flattened.sol


Затем загрузите flattened.sol в Etherscan.


Верификация прокси-контрактов:

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


Верификация библиотек:

Если ваш контракт использует внешние библиотеки, их нужно верифицировать отдельно.


Проверка результатов

1. Перейдите на страницу контракта в Etherscan

2. Убедитесь, что появились вкладки "Read Contract" и "Write Contract"

3. Проверьте, что код отображается корректно

4. Протестируйте функции через веб-интерфейс


javascript

// Пример чтения через Etherscan

totalSupply() → 1000000000000000000000000

balanceOf(0xYourAddress) → 1000000000000000000000000

name() → "BookCoin"

symbol() → "BOOK"

decimals() → 18


Поздравляю! Ваш контракт теперь полностью прозрачен и доступен для проверки всем желающим. Это важный шаг на пути к созданию доверия к вашему проекту в криптосообществе.


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

5.6 Практикум: Шаг за шагом создаем токен "BookCoin".


Это пошаговое руководство, которое проведет вас через весь процесс создания, тестирования и развертывания вашего первого ERC-20 токена.


Предварительные требования

Установленное ПО:

· Node.js (v16 или выше)

· npm

· Git

· MetaMask (браузерное расширение)


Аккаунты:

· Infura (бесплатный аккаунт)

· Etherscan (бесплатная регистрация)

· Alchemy (для получения тестовых ETH)


Шаг 1: Инициализация проекта

bash

# Создаем папку проекта

mkdir bookcoin-token

cd bookcoin-token


# Инициализируем npm проект

npm init -y


# Устанавливаем Truffle глобально

npm install -g truffle


# Инициализируем Truffle проект

truffle init


# Устанавливаем необходимые зависимости

npm install @openzeppelin/contracts @truffle/hdwallet-provider dotenv


Проверка структуры проекта:

bookcoin-token/

├── contracts/

│ └── Migrations.sol

├── migrations/

│ └── 1_initial_migration.js

├── test/

├── node_modules/

├── truffle-config.js

└── package.json


Шаг 2: Создание контракта BookCoin

В папке contracts/ создайте файл BookCoin.sol:

solidity

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;


import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

import "@openzeppelin/contracts/access/Ownable.sol";


/**

* @title BookCoin

* @dev ERC-20 токен для книги о создании криптовалют

*/

contract BookCoin is ERC20, Ownable {


/**

* @dev Конструктор создает все токены и отправляет создателю

* @param initialSupply Начальное предложение токенов (в целых единицах)

*/

constructor(uint256 initialSupply) ERC20("BookCoin", "BOOK") {

_mint(msg.sender, initialSupply * 10 ** decimals());

_transferOwnership(msg.sender);

}


/**

* @dev Функция для создания дополнительных токенов (только владельцем)

* @param to Адрес получателя

* @param amount Количество токенов для создания

*/

function mint(address to, uint256 amount) public onlyOwner {

_mint(to, amount);

}


/**

* @dev Функция для сжигания токенов

* @param amount Количество токенов для сжигания

*/

function burn(uint256 amount) public {

_burn(msg.sender, amount);

}

}


Шаг 3: Настройка конфигурации

Замените содержимое truffle-config.js:

javascript

const HDWalletProvider = require('@truffle/hdwallet-provider');

require('dotenv').config();


module.exports = {

networks: {

// Локальная разработка с Ganache

development: {

host: "127.0.0.1",

port: 7545,

network_id: "*"

},


// Sepolia testnet (рекомендуемая)

sepolia: {

provider: () => new HDWalletProvider({

privateKeys: [process.env.PRIVATE_KEY],

providerOrUrl: `https://sepolia.infura.io/v3/${process.env.INFURA_PROJECT_ID}`

}),

network_id: 11155111,

gas: 5500000,

gasPrice: 20000000000,

confirmations: 2,

timeoutBlocks: 200,

skipDryRun: true

}

},


compilers: {

solc: {

version: "0.8.19",

settings: {

optimizer: {

enabled: true,

runs: 200

}

}

}

},


// Для верификации на Etherscan

plugins: ['truffle-plugin-verify'],

api_keys: {

etherscan: process.env.ETHERSCAN_API_KEY

}

};


Шаг 4: Настройка переменных окружения

Создайте файл .env в корне проекта:

env

# Ваш приватный ключ из MetaMask (НИКОМУ НЕ ПОКАЗЫВАЙТЕ!)

PRIVATE_KEY=ваш_приватный_ключ_без_0x


# Infura Project ID

INFURA_PROJECT_ID=ваш_infura_project_id


# Etherscan API Key

ETHERSCAN_API_KEY=ваш_etherscan_api_key


Как получить приватный ключ:


1. Откройте MetaMask

2. Выберите аккаунт → "Account details" → "Export Private Key"


Внимание! Добавьте .env в .gitignore!


Шаг 5: Создание миграционного файла

В папке migrations/ создайте 2_deploy_bookcoin.js:

javascript

const BookCoin = artifacts.require("BookCoin");


module.exports = async function (deployer) {

// 1,000,000 токенов с 18 десятичными знаками

const initialSupply = "1000000";


console.log("Деплой BookCoin с начальным предложением:", initialSupply);


await deployer.deploy(BookCoin, initialSupply);

const bookCoin = await BookCoin.deployed();


console.log(" BookCoin успешно развернут!");

console.log(" Адрес контракта:", bookCoin.address);

console.log(" Владелец:", await bookCoin.owner());

console.log(" Общее предложение:", (await bookCoin.totalSupply()).toString());

console.log(" Символ:", await bookCoin.symbol());

console.log(" Название:", await bookCoin.name());

};


Шаг 6: Компиляция контракта

bash

truffle compile


Ожидаемый результат:

Compiling your contracts…

===========================

> Compiling ./contracts/BookCoin.sol

> Compiling ./contracts/Migrations.sol

> Compiling @openzeppelin/contracts/access/Ownable.sol

> Compiling @openzeppelin/contracts/token/ERC20/ERC20.sol

> Artifacts written to /path/to/build/contracts

> Compiled successfully using:

– solc: 0.8.19


Шаг 7: Получение тестовых ETH

1. Перейдите на sepoliafaucet.com

2. Войдите через аккаунт Alchemy (бесплатная регистрация)

3. Вставьте ваш адрес MetaMask

4. Получите 0.5 Sepolia ETH


Альтернативные краны:

· poinfrastructure.com/faucet

· faucet.quicknode.com/ethereum/sepolia


Шаг 8: Деплой в сеть Sepolia

bash

truffle migrate –network sepolia


Ожидаемый вывод:

Starting migrations…

> Network name: 'sepolia'

> Network id: 11155111


1_initial_migration.js

======================

Deploying 'Migrations'

Transactions: 0x1234…5678


2_deploy_bookcoin.js

====================

Deploying 'BookCoin'

Transactions: 0x5678…9012


BookCoin успешно развернут!

Адрес контракта: 0xAbC…123

Владелец: 0xYourAddress

Общее предложение: 1000000000000000000000000

Символ: BOOK

Название: BookCoin


Summary

=======

> Total deployments: 2

> Final cost: 0.035 ETH


Шаг 9: Проверка в блок-эксплорере

Откройте в браузере (замените YOUR_CONTRACT_ADDRESS):

https://sepolia.etherscan.io/address/YOUR_CONTRACT_ADDRESS


Вы должны увидеть:

· Подтвержденную транзакцию

· Контракт с состоянием "Contract Source Code Not Verified"


Шаг 10: Верификация контракта

Установите плагин для верификации:

bash

npm install -D truffle-plugin-verify


Выполните верификацию:

bash

truffle run verify BookCoin –network sepolia


Ожидаемый результат:

Verifying BookCoin

Pass – Verified: https://sepolia.etherscan.io/address/0xYOUR_CONTRACT#code

Successfully verified 1 contract(s).


Шаг 11: Взаимодействие с контрактом

Через Truffle Console:

bash

truffle console –network sepolia


javascript

// Получить экземпляр контракта

const bookCoin = await BookCoin.deployed()


// Проверить общее предложение

const totalSupply = await bookCoin.totalSupply()

console.log("Total Supply:", totalSupply.toString())


// Проверить баланс владельца

const accounts = await web3.eth.getAccounts()

const ownerBalance = await bookCoin.balanceOf(accounts[0])

console.log("Owner Balance:", web3.utils.fromWei(ownerBalance, 'ether'))


// Перевести 10 BOOK другому адресу

const recipient = "0x742d35Cc6634C0532925a3b8Dc9F1a…"

await bookCoin.transfer(recipient, web3.utils.toWei("10", "ether"))


// Проверить баланс получателя

const recipientBalance = await bookCoin.balanceOf(recipient)

console.log("Recipient Balance:", web3.utils.fromWei(recipientBalance, 'ether'))


Шаг 12: Добавление токена в MetaMask

1. Откройте MetaMask

2. Нажмите "Import tokens"

3. Введите адрес контракта (остальное подтянется автоматически)

4. Нажмите "Add Custom Token"


Теперь вы видите свои BOOK токены!


Шаг 13: Тестирование основных функций

Через Etherscan:

1. Перейдите на страницу вашего контракта

2. Откройте вкладку "Write Contract"

3. Подключите MetaMask

4. Протестируйте функции:


· transfer – перевод токенов

· approve – разрешение на расходование

· burn – сжигание токенов


Шаг 14: Создание простого теста

В папке test/ создайте bookcoin.test.js:

javascript

const BookCoin = artifacts.require("BookCoin");


contract("BookCoin", (accounts) => {

const [owner, user1, user2] = accounts;

const initialSupply = web3.utils.toWei("1000000", "ether");


it("должен развернуть контракт с правильным начальным предложением", async () => {

const instance = await BookCoin.deployed();

const totalSupply = await instance.totalSupply();


assert.equal(totalSupply.toString(), initialSupply, "Неправильное начальное предложение");

});


it("должен отправлять все токены владельцу", async () => {

const instance = await BookCoin.deployed();

const ownerBalance = await instance.balanceOf(owner);


assert.equal(ownerBalance.toString(), initialSupply, "Владелец должен получить все токены");

});


it("должен позволять перевод токенов", async () => {

const instance = await BookCoin.deployed();

const transferAmount = web3.utils.toWei("100", "ether");


await instance.transfer(user1, transferAmount, { from: owner });

const user1Balance = await instance.balanceOf(user1);


assert.equal(user1Balance.toString(), transferAmount, "Получатель должен получить токены");

});

});


Запуск тестов:

bash

truffle test


Итоги практикума

Вы создали:

· Полнофункциональный ERC-20 токен

· Безопасный контракт с использованием OpenZeppelin

· Настроенную среду разработки


Вы развернули:

· В тестовой сети Sepolia

· С верификацией исходного кода

· С возможностью взаимодействия через Etherscan


Вы получили:

· Практический опыт работы с Truffle

· Навыки работы с тестовыми сетями

· Понимание процесса деплоя смарт-контрактов


Дополнительные задания

1. Добавьте кастомные функции в контракт:

· Функцию паузы

· Механизм сжигания комиссий

· Whitelist для определенных операций

2. Создайте простой dApp для взаимодействия с токеном:

· Веб-интерфейс для перевода токенов

· Отображение балансов

· История транзакций

3. Настройте CI/CD для автоматического деплоя:

· Используйте GitHub Actions

· Автоматизируйте тестирование и деплой


Поздравляю! Вы успешно создали и развернули свой первый ERC-20 токен. Этот фундаментальный навык открывает дорогу к созданию более сложных DeFi-проектов и dApp.

Глава 6: Создание токена на Binance Smart Chain (BEP-20)

6.1 Почему BSC? Низкие комиссии.

Binance Smart Chain (BSC) стал популярной альтернативой Ethereum, особенно для проектов, где стоимость транзакций играет ключевую роль. Давайте разберемся, почему низкие комиссии так важны и как BSC их обеспечивает.


Проблема: "Комиссионный кризис" Ethereum

Реальные цифры комиссий в Ethereum (2021-2023):

· Простой перевод ETH: $5-20

· Взаимодействие с DeFi-протоколом: $50-200

· Минтинг NFT: $100-500

· Сложные операции: до $1000+


Последствия для проектов:

· Пользователи отказываются от использования dApp из-за высоких комиссий

· Невозможность микроплатежей и игровых механик

· Ограниченная доступность для пользователей из развивающихся стран


Решение: Binance Smart Chain и его экономика комиссий

Сравнительная таблица комиссий:


Операция

Ethereum Mainnet

BSC Mainnet


Простой перевод

$5-20

$0.05-0.15


Swap на DEX

$30-100

$0.20-0.50


Деплой контракта

$100-500

$5-15


Ежедневное использование

Экономически нецелесообразно

Доступно обычным пользователям


Реальные примеры стоимости (в BNB):

· Перевод токена: 0.000075 BNB (~$0.02)

· Свап на PancakeSwap: 0.000225 BNB (~$0.06)

· Стейкинг: 0.0003 BNB (~$0.08)


Технические причины низких комиссий BSC

1. Алгоритм консенсуса: Proof of Staked Authority (PoSA)

Ethereum (PoW → PoS):

· Децентрализованная валидация

· Высокие вычислительные затраты

· Ограниченная пропускная способность


BSC (PoSA):

· 21 активный валидатор

· Быстрое время блока (3 секунды vs 12 секунд в Ethereum)

· Оптимизированная для производительности архитектура


2. Экономическая модель газа

Ethereum:

· Динамическая цена газа

· Аукционная система

· Частые перегрузки сети


BSC:

· Стабильная цена газа

· Предсказуемые комиссии

· Постоянно высокая пропускная способность


3. Архитектура двойной цепи

BSC работает параллельно с Binance Chain:

· Binance Chain: Быстрые торговые операции

· Binance Smart Chain: Смарт-контракты и dApps

· Синхронизация между цепями


Практические преимущества для разработчиков

1. Быстрая итерация и тестирование

javascript

// Стоимость деплоя контракта

const deploymentCost = {

ethereum: "0.05 – 0.2 ETH", // $75 – $300

bsc: "0.01 – 0.05 BNB" // $3 – $15

};


2. Пользовательский опыт

Для конечных пользователей:

· Возможность пробовать dApp без значительных затрат

· Микроплатежи и игровые механики

· Частые взаимодействия с контрактами


3. Экономическая эффективность

Бюджет проекта на комиссии:

· Ethereum: Тысячи долларов в месяц

· BSC: Сотни долларов в месяц


Сравнение экосистем


Параметр

Ethereum

BSC


Ежедневные транзакции

1-1.5 млн

3-5 млн


Средняя комиссия

$5-20

$0.05-0.20


Время блока

12 сек

3 сек


TVL в DeFi

$25-50 млрд

$3-6 млрд


Активные dApps

3000+

1000+


Когда выбирать BSC для вашего токена?

Идеальные сценарии для BSC:

1. GameFi и Play-to-Earn проекты

solidity

// Частые внутриигровые транзакции

function buyItem(uint256 itemId) public {

// Стоимость: $0.05 вместо $5.00

items[msg.sender][itemId] = true;

}


2. Микроплатежи и социальные dApps

solidity

// Ежедневные награды пользователям

function claimDailyReward() public {

// Экономически целесообразно даже для наград в $0.10

_mint(msg.sender, dailyReward);

}


3. MVP и тестовые запуски

solidity

// Быстрое прототипирование без больших затрат

contract MVPToken {

// Деплой: $10 вместо $300

// Тестирование: $5 вместо $500

}


4. Массовая адопция в развивающихся странах

· Пользователи с меньшими доходами

· Низкие барьеры для входа

· Частые транзакции небольшими суммами


Компромиссы и ограничения BSC

Централизация

· 21 валидатор vs тысячи в Ethereum

· Значительное влияние Binance

· Теоретически более уязвима для регуляторного давления


Безопасность

· Меньшая децентрализация → потенциально меньшая безопасность

· Зависимость от репутации Binance


Восприятие сообществом

· Некоторые рассматривают BSC как "централизованную" альтернативу

· Меньше "элитных" проектов в сравнении с Ethereum


Реальные примеры успеха на BSC

bannerbanner