Что такое смарт-контракт?
Смарт-контракт — это компьютерный протокол, позволяющий проводить и контролировать сделки с помощью математических алгоритмов. Например, обещание выплатить 1000 долларов при заключении брака можно зафиксировать в смарт-контракте с доступом к вашему счёту. Как только контракт обнаружит регистрацию брака, он автоматически переведёт деньги без участия сторон, включая государственные органы. Всё происходит автоматически: стороны подписывают условия, санкции за невыполнение и цифровые подписи. Умный контракт самостоятельно определяет выполнение условий и принимает решение: завершить сделку, наложить штраф или заблокировать активы. Таким образом, смарт-контракты используются в блокчейне для создания договоров на любых условиях и с любым вознаграждением.
Solidity: язык программирования для смарт-контрактов
Solidity — язык программирования, идеально подходящий для работы с блокчейном и написания смарт-контрактов. Синтаксис Solidity схож с JavaScript, Python и C++. Язык работает на базе блокчейн-виртуальной машины EVM (о ней поговорим позже). Solidity позволяет определить действия и контракты, выполняемые в блокчейне.
Написание контракта
Создадим контракт. Удалите существующий файл и создайте новый. Название файла определяет название контракта. Назовём его itContract.
Внутри файла:
- Укажите версию Solidity: pragma solidity ^0.8.0; (или другую актуальную версию).
- Объявите контракт: contract itContract {
- Определите переменные:
- string public name = "ItToken"; // Имя токена
- string public symbol = "IT"; // Символ токена
- uint8 public decimals = 18; // Количество десятичных знаков
- uint256 public totalSupply = 1000000 * 10 ** 18; // Общее количество токенов
- mapping(address => uint256) public balanceOf; // Балансы пользователей
- Объявите событие:
event Transfer(address indexed from, address indexed to, uint256 value);
- Определите конструктор:
constructor() { balanceOf[msg.sender] = totalSupply; }
- Создайте функцию для перевода токенов:
function transfer(address to, uint256 value) public { require(balanceOf[msg.sender] >= value, "Insufficient balance"); balanceOf[msg.sender] -= value; balanceOf[to] += value; emit Transfer(msg.sender, to, value); }
Этот контракт определяет монету, количество десятичных знаков, конструктор для инициализации и функцию для перевода токенов.
Компиляция и развёртывание контракта
Для компиляции используйте команду в терминале: npx hardhat compile.
В файле log.js (пример упрощённого кода):
// ... (код, описывающий начальное количество монет и их разблокировку) ...
const contract = require("./artifacts/contracts/itContract.sol/itContract.json");
const initialSupply = 1000000;
// ... (код для деплоя) ...
Для развёртывания используйте команду: npx hardhat run scripts/deploy.js —network <network>.
Мы создали базовый смарт-контракт для простой монеты. Более сложные функции приведут к более сложному контракту, но этот пример демонстрирует основные принципы.