Используйте библиотеку JavaScript Web3.js, чтобы создать удобный интерфейс для взаимодействия с блокчейном Ethereum.

Смарт-контракты являются основными строительными блоками для приложений Web3. Чтобы включить функции в приложениях Web3, важно иметь возможность удобно взаимодействовать с функциями, указанными в смарт-контракте. Вы можете использовать популярный язык, такой как JavaScript, и известную библиотеку Web3.js, чтобы установить эту связь.

Введение в библиотеку Web3.js

Web3.js — это библиотека JavaScript, которая предлагает интерфейс для взаимодействия с блокчейном Ethereum. Это упрощает процесс сборки децентрализованные приложения (DApps) предоставляя методы и инструменты для подключения к узлам Ethereum, отправки транзакций, чтения данных смарт-контрактов и обработки событий.

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

Как импортировать Web3.js в проект JavaScript

Чтобы использовать Web3.js в своем проекте Node, сначала необходимо установить библиотеку как зависимость проекта.

Установите библиотеку, выполнив эту команду внутри вашего проекта:

npm install web3

or

yarn add web3

После установки Web3.js теперь вы можете импортировать библиотеку в свой проект Node как модуль ES:

const Web3 = require('web3');

Взаимодействие с развернутыми смарт-контрактами

Чтобы должным образом продемонстрировать, как вы можете взаимодействовать с развернутым смарт-контрактом в сети Ethereum с помощью Web3.js, вы создадите веб-приложение, которое работает с развернутым смарт-контрактом. Целью веб-приложения будет простой бюллетень для голосования, в котором кошелек может отдать голоса за кандидата и записать эти голоса.

Для начала создайте новый каталог для своего проекта и инициализируйте его как проект Node.js:

npm init 

Установите Web3.js в проект как зависимость и создайте простой index.html и стили.css файлы в корне проекта.

Импортируйте следующий код в index.html файл:

html>
<html>
<head>
<title>Voting Apptitle>
<linkrel="stylesheet"href="styles.css" />
head>
<body>
<h1>Voting Apph1>

<divclass="candidates">
<divclass="candidate">
<spanclass="name">Candidate Aspan>
<buttonclass="vote-btn"data-candidate="A">Votebutton>
<spanclass="vote-count">0 votesspan>
div>
<divclass="candidate">
<spanclass="name">Candidate Bspan>
<buttonclass="vote-btn"data-candidate="B">Votebutton>
<spanclass="vote-count">0 votesspan>
div>
<divclass="candidate">
<spanclass="name">Candidate Cspan>
<buttonclass="vote-btn"data-candidate="C">Votebutton>
<spanclass="vote-count">0 votesspan>
div>
div>

<scriptsrc="main.js">script>
body>
html>

Внутри стили.css файл, импортируйте следующий код:

/* styles.css */

body {
font-family: Arial, sans-serif;
text-align: center;
}

h1 {
margin-top: 30px;
}

.candidates {
display: flex;
justify-content: center;
margin-top: 50px;
}

.candidate {
margin: 20px;
}

.name {
font-weight: bold;
}

.vote-btn {
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}

.vote-count {
margin-top: 5px;
}

Ниже приведен получившийся интерфейс:

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

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

Перейдите к remix.ethereum.org и создайте новый файл под контракты папка. Вы можете назвать файл test_contract.sol.

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

Внутри этого файла напишите и скомпилируйте свой код Solidity:

// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.0;
contract Voting {
mapping(string => uint256) private voteCounts;

functionvote(string memory candidate) public{
voteCounts[candidate]++;
};
functiongetVoteCount(string memory candidate) publicviewreturns (uint256){
return voteCounts[candidate];
};
};

Когда Remix компилирует код Solidity, он также создает ABI (бинарный интерфейс приложения) в формате JSON. ABI определяет интерфейс между смарт-контрактом и клиентским приложением.

В нем будет указано следующее:

  • Имена и типы функций и событий, предоставляемых смарт-контрактом.
  • Порядок аргументов каждой функции.
  • Возвращаемые значения каждой функции.
  • Формат данных каждого события.

Чтобы получить ABI, скопируйте его из Remix IDE. Создать контракт.abi.json файл внутри договор в корне вашего проекта и вставьте ABI внутрь файла.

Вам следует развернуть свой контракт в тестовой сети с помощью такого инструмента, как Ganache.

Связь с вашим развернутым смарт-контрактом с использованием Web3.js

Ваш контракт теперь развернут в тестовой сети Ethereum. Вы можете начать работать над взаимодействием с развернутым контрактом из своего пользовательского интерфейса. Создать main.js файл в корне вашего проекта. Вы импортируете как Web3.js, так и сохраненный файл ABI в main.js. Этот файл будет общаться с вашим смарт-контрактом и будет отвечать за чтение данных из контракта, вызов его функций и обработку транзакций.

Ниже показано, как ваш main.js файл должен выглядеть:

const Web3 = require('web3');
const contractAddress = "CONTRACT_ADDRESS"; // Replace with the actual deployed contract address
import contractAbi from'../contract/contract.abi.json'

// Create an instance of web3 using the injected provider (e.g., MetaMask)
const web3 = new Web3(window.ethereum);

// Create a contract instance using the contract address and ABI
const votingContract = new web3.eth.Contract(contractAbi, contractAddress);

// Retrieve the candidate elements from the DOM
const candidates = document.querySelectorAll('.candidate');

// Function to handle voting for a candidate
asyncfunctionvote(candidate) {
try {
// Call the 'vote' function of the smart contract
await votingContract.methods.vote(candidate).send({ from: web3.eth.defaultAccount });

// Update the vote count in the UI
const voteCount = await votingContract.methods.getVoteCount(candidate).call();
const voteCountElement = document.querySelector(`[data-candidate="${candidate}"] .vote-count`);
voteCountElement.textContent = `${voteCount} votes`;
} catch (error) {
console.error(error);
// Handle error cases, such as invalid transactions or network issues
}
}

// Add click event listeners to the vote buttons
candidates.forEach(candidate => {
const candidateName = candidate.getAttribute('data-candidate');
const voteBtn = candidate.querySelector('.vote-btn');
voteBtn.addEventListener('click', () => {
vote(candidateName);
});
});

В приведенном выше блоке кода используется Web3.js для взаимодействия с вашими функциями смарт-контракта из вашего веб-интерфейса. По сути, вы используете функции JavaScript для вызова функций Solidity из main.js.

В коде заменить 'КОНТРАКТ_АДРЕС' с фактическим развернутым адресом контракта. Remix IDE предоставит вам это при развертывании.

Вот что происходит в коде:

  1. Обновите выбор элементов DOM на основе вашей структуры HTML. В этом примере предполагается, что каждый элемент-кандидат имеет кандидат данных атрибут, соответствующий имени кандидата.
  2. Экземпляр Веб3 Затем создается класс с использованием внедренного провайдера из окно.эфириум объект.
  3. голосованиеКонтракт переменная создает экземпляр контракта, используя адрес контракта и ABI.
  4. голосование Функция обрабатывает процесс голосования. Он называет голосование функция смарт-контракта с использованием voiceContract.methods.vote (кандидат).send(). Он отправляет транзакцию в контракт, записывая голос пользователя. количество голосов Затем переменная вызывает getVoteCount функция смарт-контракта для получения текущего количества голосов за конкретного кандидата. Затем он обновит количество голосов в пользовательском интерфейсе, чтобы оно соответствовало полученным голосам.

Не забудьте включить это main.js файл в вашем HTML-файле с помощью .

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

Роль JavaScript в создании DApps

JavaScript может взаимодействовать со смарт-контрактами, используемыми в децентрализованных приложениях. Это объединяет мир Web3 с основным языком программирования, используемым при создании приложений Web2, что помогает облегчить внедрение Web3. С Web3.js разработчики Web2 могут перейти к созданию приложений, таких как платформа социальных сетей Web3.