Добро пожаловать в наше руководство для начинающих по контрактам смарт-чейнов Decimal и разработке dApp. Цель этого руководства — быстро научить вас писать и развертывать смарт-контракты в десятичной смарт-цепочке.
В этом уроке мы будем использовать:
- Солидность
- JavaScript
- Node.js
- Эфиры.js
- Каска
Настройка среды
На первом этапе нам нужно установить Node.js.
Установка Node.js
Вы можете пропустить этот раздел, если у вас уже есть рабочаяNode.js >= 16.0
Вставьте эти команды в терминал :
Ubuntu
sudo apt update sudo apt install curl git curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt-get install -y nodejs
MacOS
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash nvm install 18 nvm use 18 nvm alias default 18 npm install npm --global # Upgrade npm to the latest version
Windows
To install Node.js on windows follow this guide: https://docs.microsoft.com/en-us/windows/dev-environment/javascript/nodejs-on-windows
Создание нового проекта
Откройте новый терминал и запустите эти команды, чтобы создать новую папку.
Создание новой папки
mkdir hardhat-tutorial cd hardhat-tutorial
Установите каску и запустите ее:
npm install –save-dev hardhat npm install –save-dev @nomicfoundation/hardhat-toolbox npx hardhat
Выберите Create an empty hardhat.config.js
с помощью клавиатуры и нажмите Enter. Hardhat.config.js обычно находится в корневой папке проекта и содержит все ваши настройки.
Написание смарт- контракта
Давайте начнем с создания новой папки в нашем проекте каски с именем contracts
. В этой папке мы создаем файл с именем token.sol
.
Поместите этот код в файл :
контракты /token.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; contract ExampleContract { mapping(address => uint256) balances; event Deposit(uint256 value); event Withdraw(address indexed receiver, uint256 value); constructor() {} function deposit() external payable { balances[msg.sender] += msg.value; emit Deposit(msg.value); } function withdrawNative(address payable receiver, uint256 amount) public { require(amount >= balances[msg.sender], "Insufficient balance"); balances[msg.sender] -= amount; sendNative(receiver, amount); emit Withdraw(receiver, amount); } function sendNative(address payable account, uint256 amount) private { (bool sent, ) = account.call{gas: 10000, value: amount}(""); require(sent, "Failed to send DEL"); } receive() external payable {} }
Для составления контракта запустите его npx hardhat compile
в своем терминале.
Составление договора
npx hardhat compile Compiled 1 Solidity file successfully
Развертывание в смарт- цепочке
Итак, вы готовы протестировать свой контракт в реальной сети, чтобы другие получили доступ к вашему коду и могли его проверить.
В реальной «основной сети» десятичной смарт-цепи вы должны платить за транзакцию реальными деньгами, но есть отдельная сеть «девнет», которая имитирует сценарии реального мира, не ставя на карту реальные деньги.
На уровне программного обеспечения развертывание в сети разработчиков такое же, как развертывание в основной сети. Разница только в том, к какой сети вы подключаетесь. Давайте посмотрим, как будет выглядеть код для развертывания ваших контрактов с использованием ethers.js.
Давайте создадим новую папку в корне проекта с именем scripts
и создадим там файл с именем deploy.js
.
Поместите этот код в файл :
скрипты /deploy.js
async function main() { const accounts = await ethers.getSigners(); console.log('Deploying contract with account:', accounts[0].address); const balance = await accounts[0].getBalance(); console.log('Account balance ',balance.toString()); const ExampleContract = await ethers.getContractFactory("ExampleContract"); const exampleContract = await ExampleContract.connect(accounts[0]).deploy(); await exampleContract.deployed(); console.log('ExampleContract address:', example.address); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });
Чтобы сообщить Hardhat, к какой сети вы хотите подключиться, вы используете --network
параметр при запуске любой задачи, например:
Подключение к сети
npx hardhat run scripts/deploy.js –network <network-name>
В нашей конфигурации запуск без –network
параметров приведет к развертыванию контракта в локальном файле Hardhat Network
. Развертывание теряется после выполнения, но оно по-прежнему полезно для тестирования нашего кода развертывания.
Развертывание в локальной сети каски
npx hardhat run scripts/deploy.js –network <network-name>
Для развертывания в удаленной сети, такой как mainnet
или devnet
, вам необходимо настроить сетевую запись в вашем hardhat.config.js
файле. Мы будем использовать devnet
для этого примера.
Поместите этот код в .hardhat.config.js
hardhat.config.js
require("@nomicfoundation/hardhat-toolbox"); const PRIVATE_KEY = "YOUR PRIVATE KEY"; module.exports = { solidity: { version: "0.8.17", settings: { optimizer: { enabled: true, runs: 200, }, }, }, defaultNetwork: "decimal_devnet", networks: { decimal_devnet: { url: `https://devnet-val.decimalchain.com/web3/`, accounts: [PRIVATE_KEY], gasPrice: 80000000000000 } } };
Чтобы развернуть на Decimal devnet
, вам нужно отправить некоторые devnet DEL
на адрес, который будет выполнять развертывание. Вы можете получить devnet DEL
из крана, сервис, который распространяется devnet DEL
бесплатно.
Наконец, запустите:
Развертывание в действующей сети
npx hardhat run scripts/deploy.js --network decimal_devnet
Если все прошло хорошо, вы должны увидеть развернутый адрес контракта.