Смарт-контракт — это самовоспроизводящийся фрагмент кода, обычно построенный на цепочках блоков, обеспечивающих соблюдение условий соглашения, с использованием криптографических алгоритмов, обеспечивающих действительность и безопасность контракта.
Они работают по логике «если-то», когда условие выполняется автоматически, что делает его более эффективным, безопасным и прозрачным.
В этой статье мы сосредоточимся на практической природе солидности на простом примере смарт-контракта и углубимся в развертывание на блокчейне с использованием каски.
Простой смарт-контракт должен состоять из своих функций и данных. Каждая переменная состояния должна иметь свой тип. Следующий смарт-контракт знакомит нас с основами смарт-контракта.
//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
Выполнение команды развертывает смарт-контракт в сети Мумбаи.