Solidity: Смарт-контракты — Урок 3

Что такое смарт-контракт?

Смарт-контракт — это компьютерный протокол, позволяющий проводить и контролировать сделки с помощью математических алгоритмов. Например, обещание выплатить 1000 долларов при заключении брака можно зафиксировать в смарт-контракте с доступом к вашему счёту. Как только контракт обнаружит регистрацию брака, он автоматически переведёт деньги без участия сторон, включая государственные органы. Всё происходит автоматически: стороны подписывают условия, санкции за невыполнение и цифровые подписи. Умный контракт самостоятельно определяет выполнение условий и принимает решение: завершить сделку, наложить штраф или заблокировать активы. Таким образом, смарт-контракты используются в блокчейне для создания договоров на любых условиях и с любым вознаграждением.

Solidity: язык программирования для смарт-контрактов

Solidity — язык программирования, идеально подходящий для работы с блокчейном и написания смарт-контрактов. Синтаксис Solidity схож с JavaScript, Python и C++. Язык работает на базе блокчейн-виртуальной машины EVM (о ней поговорим позже). Solidity позволяет определить действия и контракты, выполняемые в блокчейне.

Написание контракта

Создадим контракт. Удалите существующий файл и создайте новый. Название файла определяет название контракта. Назовём его itContract.

Внутри файла:

  1. Укажите версию Solidity: pragma solidity ^0.8.0; (или другую актуальную версию).
  2. Объявите контракт: contract itContract {
  3. Определите переменные:

    • string public name = "ItToken"; // Имя токена
    • string public symbol = "IT"; // Символ токена
    • uint8 public decimals = 18; // Количество десятичных знаков
    • uint256 public totalSupply = 1000000 * 10 ** 18; // Общее количество токенов
    • mapping(address => uint256) public balanceOf; // Балансы пользователей
  4. Объявите событие:

    event Transfer(address indexed from, address indexed to, uint256 value);
  5. Определите конструктор:

    constructor() {
        balanceOf[msg.sender] = totalSupply;
    }
  6. Создайте функцию для перевода токенов:

    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>.

Мы создали базовый смарт-контракт для простой монеты. Более сложные функции приведут к более сложному контракту, но этот пример демонстрирует основные принципы.

Что будем искать? Например,программа