Смарт-контракт — это самовоспроизводящийся фрагмент кода, обычно построенный на цепочках блоков, обеспечивающих соблюдение условий соглашения, с использованием криптографических алгоритмов, обеспечивающих действительность и безопасность контракта.

Они работают по логике «если-то», когда условие выполняется автоматически, что делает его более эффективным, безопасным и прозрачным.

В этой статье мы сосредоточимся на практической природе солидности на простом примере смарт-контракта и углубимся в развертывание на блокчейне с использованием каски.

Простой смарт-контракт должен состоять из своих функций и данных. Каждая переменная состояния должна иметь свой тип. Следующий смарт-контракт знакомит нас с основами смарт-контракта.

//SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.0;

Contract Ico {
 address public owner;
    mapping(address => uint) public balances;
    event Sent(address from, address to, uint amount);

    constructor() {
        owner = msg.sender;
    }
    function mint(address receiver, uint amount) public {
        require(msg.sender == owner);
        balances[receiver] += amount;
    }

    error InsufficientBalance(uint requested, uint available);

    function send(address receiver, uint amount) public {
        if (amount > balances[msg.sender])
            revert InsufficientBalance({
                requested: amount,
                available: balances[msg.sender]
            });

        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Sent(msg.sender, receiver, amount);
    }
}
}

Первая строка кода говорит о том, что исходный код нелицензирован и важен там, где по умолчанию используется публикация исходного кода.

Во второй строке указана версия языка Solidity, на котором был написан исходный код.

Третья строка объявляет контракт и его имя. Строка address public owner объявляет переменную состояния типа address, которая принадлежит владельцу контракта, который может чеканить токены. Сопоставление — сопоставляет адрес владельца с балансом, ключевое слово public разрешает доступ к значению переменной состояния извне контракта.

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

Конструктор запускается только один раз при создании контракта. В этом случае владельцем является msg.sender создатель контракта. Функция монетного двора облегчает передачу вновь созданных монет. Это может сделать только владелец. Он принимает получателя и сумму для отправки и добавляет отправленную сумму к балансу получателя.

Ключевое слово error проверяет, недостаточно ли баланса отчеканенных токенов для осуществления перевода.

Функция отправки запрашивает адрес получателя и сумму. оператор if проверяет, превышает ли сумма остаток в кошельке отправителя, и если да, возвращается к недостаточному балансу и отображает запрошенную сумму и баланс владельца контракта.

Если отправитель является ликвидным, контракт вычитает сумму из баланса отправителя и «зачисляет» адрес получателя на эту сумму.

Затем контракт отправляет владельцу сообщение «отправлено» с адресом получателя и суммой.

Развертывание смарт-контрактов.

JavaScript предоставляет фреймворки, которые позволяют нам с легкостью развертывать наши смарт-контракты, такие как каски. Это обеспечивает более быстрое развертывание в цепочке EVM. Мы будем развертывать наши смарт-контракты в полигональной сети.

Нам нужен кошелек, чтобы получить доступ к закрытому ключу, который позволит нам развернуть смарт-контракты выше. В браузере вашего компьютера должно быть установлено расширение MetaMask. На следующем занятии мы углубимся в другие области применения смарт-контрактов и некоторые экономики создателей, лежащие в основе каждого из них.

В этом случае мы будем использовать NodeJS, внутреннюю библиотеку JavaScript для развертывания. Убедитесь, что на вашем компьютере запущен NodeJS. Если у вас его нет, посетите https://nodejs.org, чтобы загрузить рекомендуемую версию для большинства пользователей.

Шаг 1 — настроить приложение NodeJS. Откройте командную строку и введите приведенный ниже код, чтобы создать папку и перейти к ней.

mkdir contractdeployment && cd contractdeployment

Шаг 2 — инициализировать папку с помощью npm. Менеджер пакетов узла, используемый для установки и управления вашими зависимостями. Для получения дополнительной информации об инструменте посетите https://docs.npmjs.com

npm init 

Команда создает файл package.Json в корневом каталоге проекта, который содержит все метаданные проекта и управляет зависимостями проекта.

Шаг 3 — установить каску и ее набор инструментов. Среда разработки, упрощающая развертывание смарт-контрактов, выполнение тестов и отладку кода. Более подробную информацию можно найти в разделе Каска

npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox

Шаг 4 — запустить каску, чтобы включить создание проекта.

npx hardhat

Это создает подсказку с тремя вариантами, в этом случае мы создадим пустой файл hardhat.config.js. Структура папок, созданная защитным шлемом, будет содержать папку contracts, в которой хранятся исходные файлы для контрактов, test, в которой будут тестироваться сценарии, scripts для автоматизации. и hardhat.config.js, который будет содержать конфигурации для каски.

Измените конфигурацию каски, как показано ниже:

require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();
privateKey = process.env.PRIVATE_KEY

module.exports = {
  solidity: "0.8.9",
  networks: {
    mumbai: {
      url: "https://rpc-mumbai.maticvigil.com",
      accounts: [privateKey],
    },    
  },
  paths: {
    artifacts: "./artifacts",
  },
};

В коде, который нам нужен для hardhat-toolbox и зависимости dotenv, которая поможет хранить наши закрытые ключи. Мы объявляем переменную, которая содержит закрытый ключ.

В module.exports объявляется версия нашей солидности для компилятора, сеть, которую мы будем использовать, ее URL и учетные записи, которые принимают закрытый ключ в виде массива. Объект path принимает путь к тому месту, где будут храниться скомпилированные артефакты.

Шаг 5 — настроить наш сервер узлов с помощью платформы NodeJS. Мы установим еще одну дополнительную зависимость.

npm i dotenv

Пакет dotenv позволяет нам безопасно хранить наши закрытые ключи во время развертывания смарт-контрактов. Создайте файл .env в корне вашего каталога, скопируйте закрытый ключ из своего кошелька MetaMask и вставьте его в свой .env, как показано ниже:

Не забудьте добавить кавычки, теперь мы готовы скомпилировать смарт-контракт.

npx hardhat compile

Это создает двоичный интерфейс приложения контракта в формате JSON, который позволяет контракту взаимодействовать с внешними приложениями и смарт-контрактами.

Шаг 6 — развертывание смарт-контракта в полигональной сети. Откройте свой кошелек MetaMask и скопируйте адрес своей учетной записи, откройте браузер и перейдите к полигональному крану, чтобы получить немного MATIC.

Шаг 7. В Metamask нет полигона в списке сетей, поэтому необходимо добавить сеть. Перейдите в настройки и нажмите «Добавить учетную запись», вы должны ввести следующее:

Net
work Name: Mumbai Testnet
New RPC URL: https://rpc-mumbai.maticvigil.com
Chain ID: 80001
Currency Symbol: MATIC
Block Explorer URL: https://polygonscan.com

Сохраните его, и теперь мы готовы к развертыванию.

Шаг 7 — развертывание контракта. Откройте папку scripts и создайте файл deploy.js. В файле вставьте следующий код:

const hre = require("hardhat");

async function main() {
  
  const Ico = await hre.ethers.getContractFactory("Ico");
  const ico= await Ico.deploy();
  await ico.deployed();
  console.log("Ico deployed to:", ico.address);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});
npx hardhat run scripts/deploy.js --network mumbai

Выполнение команды развертывает смарт-контракт в сети Мумбаи.