Pelajaran 4

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

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

Взаимодействие с внешними контрактами

Смарт-контракты могут взаимодействовать с другими контрактами на блокчейне Ethereum, позволяя им вызывать функции, читать переменные и отправлять Ether или токены. Один из способов облегчить это взаимодействие - использовать Web3j, легковесную библиотеку Java для работы с Ethereum. Web3j может автоматически генерировать обертку кода смарт-контракта, обеспечивая безшовное развертывание и взаимодействие со смарт-контрактами из JVM.

Для взаимодействия с внешними контрактами с использованием Web3j сначала вам нужно скомпилировать свой смарт-контракт и сгенерировать обертывающий код. Затем вы можете создать и развернуть свой смарт-контракт или использовать существующий контракт, что облегчает совершение транзакций и вызов методов смарт-контракта напрямую.

События и журналы

События крайне важны для отслеживания и мониторинга активности смарт-контрактов на блокчейне. Они обеспечивают способ генерации журналов, которые могут быть сохранены и позднее извлечены вне цепи. События упрощают отслеживание конкретных событий контракта или изменений в переменных состояния, что особенно полезно для dApps (децентрализованных приложений), требующих обновлений в реальном времени.

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

Пример: Развертывание смарт-контракта с помощью Remix и MetaMask

Шаг 1: Откройте Remix IDE
Сначала откройте Remix IDE ( https://remix.ethereum.org/) в вашем веб-браузере.

Шаг 2: Создать новый файл
Нажмите на кнопку "+" в верхнем левом углу IDE, чтобы создать новое пустое рабочее пространство. Затем нажмите на страницу "Новый файл", чтобы создать новый файл

Назовите файл "Auction.sol".

Шаг 3: Определите контракт
Скопируйте и вставьте следующий код в новый файл “Auction.sol”:

TypeScript// SPDX-License-Identifier: MIT// Указываем Solidity versionpragma solidity ^0.8.0;// Определяем аукцион contractcontract Auction { // Объявляем переменные состояния address payable public owner; // Владелец контракта (может отменить аукцион) uint public startBlock; // Номер блока, с которого начинается аукцион uint public endBlock; // Номер блока, на котором заканчивается аукцион string public ipfsHash; // IPFS хеш для выставляемого на аукцион лота bool public canceled;  Был ли аукцион отменен bool public ended; Завершился ли аукцион uint public highestBid; Самая высокая ставка на данный момент адресована payable public highestBidder; Адрес участника, предложившего наивысшую цену // Объявляем события события AuctionCanceled(); Событие, генерируемое при отмене аукциона event HighestBidIncrease(address bidder, uint amount); Событие, генерируемое при установлении новой самой высокой ставки event AuctionEnded(address winner, uint amount); Событие генерируется при окончании аукциона // Объявляем отображение mapping(address => uint256) публичных балансов;    Constructor function constructor() { owner = payable(msg.sender); // Устанавливаем владельца на адрес, по которому разворачивается контракт startBlock = block.number; // Устанавливаем начальный блок на номер текущего блока endBlock = startBlock + 40320; // Устанавливаем конечный блок на 1 неделю (40320 блоков) после стартового блока ipfsHash = ""; Инициализируем хеш IPFS пустой строкой } // Функция для размещения ставки function placeBid() public payable { require(block.number >= startBlock && block.number <= endBlock, "Аукцион не активен."); // Проверяем, что аукцион активен require(msg.value > highestBid, "Уже есть более высокая ставка."); // Проверяем, что новая ставка выше, чем текущая самая высокая ставка require(!canceled, "Аукцион отменен."); // Проверяем, что аукцион не был отменен        Если в прошлом был участник с самой высокой ценой, добавьте сумму его ставки к его балансу if (highestBidder != address(0)) { balances[highestBidder] += highestBid;    } // Устанавливаем новую самую высокую ставку и участника торгов highestBid = msg.value;        highestBidder = payable(msg.sender);        Выдача события, сигнализирующего о том, что установлена новая самая высокая ставка emit HighestBidIncrease(msg.sender, msg.value);    } // Функция отмены аукциона function cancelAuction() public { require(msg.sender == owner, "Отменить аукцион может только владелец."); // Проверяем, что отправитель является владельцем require(!ended, "Аукцион уже закончился."); // Проверяем, что аукцион еще не закончился // Устанавливаем флаг canceled и генерируем событие, сигнализирующее об отмене аукциона canceled = true;        emit AuctionCanceled();    } // Функция завершения аукциона function endAuction() public { require(block.number > endBlock, "Аукцион еще не окончен."); // Проверяем, что аукцион окончен require(!canceled, "Аукцион отменен."); // Проверяем, что аукцион не отменен require(!ended, "Аукцион уже закончился."); // Проверяем, что аукцион еще не закончился // Устанавливаем флаг завершения и генерируем событие, сигнализирующее о том, что аукцион закончился ended ended = true;        emit AuctionEnded(highestBidder, highestBid);        Передать владельцу наибольшую сумму ставки owner.transfer(highestBid);        Если в прошлом был участник с самой высокой ценой, добавьте сумму его ставки к его балансу if (highestBidder != address(0)) { balances[highestBidder] += highestBid;        } } // Функция для установки IPFS хэша для предмета, выставляемого на аукцион function setIpfsHash(string memory hash) public { require(msg.sender == owner, "Только владелец может установить IPFS хэш."); // Проверяем, что отправитель является владельцем ipfsHash = hash; // Устанавливаем IPFS хэш в указанное значение }}

Этот код определяет AUCTIONконтракт, который позволяет пользователям делать ставки на товар и завершает аукцион после определенного периода. Контракт также имеет функцию отмены аукциона и функцию установки хэша IPFS для продаваемого товара.

Шаг 4: Составьте договор

Нажмите на вкладку «Компилятор Solidity» в левом меню. Под «Скомпилировать Auction.sol» нажмите кнопку «Компилировать». Контракт должен быть успешно скомпилирован, и вы должны увидеть зеленую галочку рядом с «Auction.sol» в файловом менеджере.

Шаг 5: Разверните контракт

Нажмите на вкладку "Развернуть и выполнить транзакции" в левом меню. В разделе "Среда" выберите "Внедренный Web3" в качестве среды. В разделе "Контракт" выберите "Аукцион" в качестве контракта для развертывания. Нажмите кнопку "Развернуть".

Шаг 6: Взаимодействуйте с договором
После развертывания контракта вы можете взаимодействовать с ним, используя различные функции, определенные в контракте. Например, вы можете вызвать placeBid()функция размещения ставки на товар

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

Основные моменты
Смарт-контракты могут взаимодействовать с другими контрактами в блокчейне Ethereum, обеспечивая вызовы функций, чтение переменных и передачу эфира или токенов.
Web3j - это легкая библиотека Java, которая облегчает взаимодействие с Ethereum. Она может автоматически генерировать код оболочки смарт-контракта для безпроблемного развертывания и взаимодействия с контрактами с JVM.
События необходимы для отслеживания и мониторинга активности контракта на блокчейне. Они выдают журналы, которые могут быть сохранены и извлечены внецепных системами, обеспечивая обновления в реальном времени для dApps.
Журналы, которые представляют собой записи, излучаемые событиями, играют решающую роль в эффективной коммуникации между смарт-контрактами и внебиржевыми системами. Они проиндексированы, что позволяет легко фильтровать и искать конкретные события или точки данных.
Предоставленный пример демонстрирует процесс развертывания смарт-контракта с использованием среды Remix IDE и MetaMask. Он включает такие шаги, как создание нового файла, определение контракта, его компиляция, развертывание и взаимодействие с его функциями.

Pernyataan Formal
* Investasi Kripto melibatkan risiko besar. Lanjutkan dengan hati-hati. Kursus ini tidak dimaksudkan sebagai nasihat investasi.
* Kursus ini dibuat oleh penulis yang telah bergabung dengan Gate Learn. Setiap opini yang dibagikan oleh penulis tidak mewakili Gate Learn.
Katalog
Pelajaran 4

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

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

Взаимодействие с внешними контрактами

Смарт-контракты могут взаимодействовать с другими контрактами на блокчейне Ethereum, позволяя им вызывать функции, читать переменные и отправлять Ether или токены. Один из способов облегчить это взаимодействие - использовать Web3j, легковесную библиотеку Java для работы с Ethereum. Web3j может автоматически генерировать обертку кода смарт-контракта, обеспечивая безшовное развертывание и взаимодействие со смарт-контрактами из JVM.

Для взаимодействия с внешними контрактами с использованием Web3j сначала вам нужно скомпилировать свой смарт-контракт и сгенерировать обертывающий код. Затем вы можете создать и развернуть свой смарт-контракт или использовать существующий контракт, что облегчает совершение транзакций и вызов методов смарт-контракта напрямую.

События и журналы

События крайне важны для отслеживания и мониторинга активности смарт-контрактов на блокчейне. Они обеспечивают способ генерации журналов, которые могут быть сохранены и позднее извлечены вне цепи. События упрощают отслеживание конкретных событий контракта или изменений в переменных состояния, что особенно полезно для dApps (децентрализованных приложений), требующих обновлений в реальном времени.

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

Пример: Развертывание смарт-контракта с помощью Remix и MetaMask

Шаг 1: Откройте Remix IDE
Сначала откройте Remix IDE ( https://remix.ethereum.org/) в вашем веб-браузере.

Шаг 2: Создать новый файл
Нажмите на кнопку "+" в верхнем левом углу IDE, чтобы создать новое пустое рабочее пространство. Затем нажмите на страницу "Новый файл", чтобы создать новый файл

Назовите файл "Auction.sol".

Шаг 3: Определите контракт
Скопируйте и вставьте следующий код в новый файл “Auction.sol”:

TypeScript// SPDX-License-Identifier: MIT// Указываем Solidity versionpragma solidity ^0.8.0;// Определяем аукцион contractcontract Auction { // Объявляем переменные состояния address payable public owner; // Владелец контракта (может отменить аукцион) uint public startBlock; // Номер блока, с которого начинается аукцион uint public endBlock; // Номер блока, на котором заканчивается аукцион string public ipfsHash; // IPFS хеш для выставляемого на аукцион лота bool public canceled;  Был ли аукцион отменен bool public ended; Завершился ли аукцион uint public highestBid; Самая высокая ставка на данный момент адресована payable public highestBidder; Адрес участника, предложившего наивысшую цену // Объявляем события события AuctionCanceled(); Событие, генерируемое при отмене аукциона event HighestBidIncrease(address bidder, uint amount); Событие, генерируемое при установлении новой самой высокой ставки event AuctionEnded(address winner, uint amount); Событие генерируется при окончании аукциона // Объявляем отображение mapping(address => uint256) публичных балансов;    Constructor function constructor() { owner = payable(msg.sender); // Устанавливаем владельца на адрес, по которому разворачивается контракт startBlock = block.number; // Устанавливаем начальный блок на номер текущего блока endBlock = startBlock + 40320; // Устанавливаем конечный блок на 1 неделю (40320 блоков) после стартового блока ipfsHash = ""; Инициализируем хеш IPFS пустой строкой } // Функция для размещения ставки function placeBid() public payable { require(block.number >= startBlock && block.number <= endBlock, "Аукцион не активен."); // Проверяем, что аукцион активен require(msg.value > highestBid, "Уже есть более высокая ставка."); // Проверяем, что новая ставка выше, чем текущая самая высокая ставка require(!canceled, "Аукцион отменен."); // Проверяем, что аукцион не был отменен        Если в прошлом был участник с самой высокой ценой, добавьте сумму его ставки к его балансу if (highestBidder != address(0)) { balances[highestBidder] += highestBid;    } // Устанавливаем новую самую высокую ставку и участника торгов highestBid = msg.value;        highestBidder = payable(msg.sender);        Выдача события, сигнализирующего о том, что установлена новая самая высокая ставка emit HighestBidIncrease(msg.sender, msg.value);    } // Функция отмены аукциона function cancelAuction() public { require(msg.sender == owner, "Отменить аукцион может только владелец."); // Проверяем, что отправитель является владельцем require(!ended, "Аукцион уже закончился."); // Проверяем, что аукцион еще не закончился // Устанавливаем флаг canceled и генерируем событие, сигнализирующее об отмене аукциона canceled = true;        emit AuctionCanceled();    } // Функция завершения аукциона function endAuction() public { require(block.number > endBlock, "Аукцион еще не окончен."); // Проверяем, что аукцион окончен require(!canceled, "Аукцион отменен."); // Проверяем, что аукцион не отменен require(!ended, "Аукцион уже закончился."); // Проверяем, что аукцион еще не закончился // Устанавливаем флаг завершения и генерируем событие, сигнализирующее о том, что аукцион закончился ended ended = true;        emit AuctionEnded(highestBidder, highestBid);        Передать владельцу наибольшую сумму ставки owner.transfer(highestBid);        Если в прошлом был участник с самой высокой ценой, добавьте сумму его ставки к его балансу if (highestBidder != address(0)) { balances[highestBidder] += highestBid;        } } // Функция для установки IPFS хэша для предмета, выставляемого на аукцион function setIpfsHash(string memory hash) public { require(msg.sender == owner, "Только владелец может установить IPFS хэш."); // Проверяем, что отправитель является владельцем ipfsHash = hash; // Устанавливаем IPFS хэш в указанное значение }}

Этот код определяет AUCTIONконтракт, который позволяет пользователям делать ставки на товар и завершает аукцион после определенного периода. Контракт также имеет функцию отмены аукциона и функцию установки хэша IPFS для продаваемого товара.

Шаг 4: Составьте договор

Нажмите на вкладку «Компилятор Solidity» в левом меню. Под «Скомпилировать Auction.sol» нажмите кнопку «Компилировать». Контракт должен быть успешно скомпилирован, и вы должны увидеть зеленую галочку рядом с «Auction.sol» в файловом менеджере.

Шаг 5: Разверните контракт

Нажмите на вкладку "Развернуть и выполнить транзакции" в левом меню. В разделе "Среда" выберите "Внедренный Web3" в качестве среды. В разделе "Контракт" выберите "Аукцион" в качестве контракта для развертывания. Нажмите кнопку "Развернуть".

Шаг 6: Взаимодействуйте с договором
После развертывания контракта вы можете взаимодействовать с ним, используя различные функции, определенные в контракте. Например, вы можете вызвать placeBid()функция размещения ставки на товар

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

Основные моменты
Смарт-контракты могут взаимодействовать с другими контрактами в блокчейне Ethereum, обеспечивая вызовы функций, чтение переменных и передачу эфира или токенов.
Web3j - это легкая библиотека Java, которая облегчает взаимодействие с Ethereum. Она может автоматически генерировать код оболочки смарт-контракта для безпроблемного развертывания и взаимодействия с контрактами с JVM.
События необходимы для отслеживания и мониторинга активности контракта на блокчейне. Они выдают журналы, которые могут быть сохранены и извлечены внецепных системами, обеспечивая обновления в реальном времени для dApps.
Журналы, которые представляют собой записи, излучаемые событиями, играют решающую роль в эффективной коммуникации между смарт-контрактами и внебиржевыми системами. Они проиндексированы, что позволяет легко фильтровать и искать конкретные события или точки данных.
Предоставленный пример демонстрирует процесс развертывания смарт-контракта с использованием среды Remix IDE и MetaMask. Он включает такие шаги, как создание нового файла, определение контракта, его компиляция, развертывание и взаимодействие с его функциями.

Pernyataan Formal
* Investasi Kripto melibatkan risiko besar. Lanjutkan dengan hati-hati. Kursus ini tidak dimaksudkan sebagai nasihat investasi.
* Kursus ini dibuat oleh penulis yang telah bergabung dengan Gate Learn. Setiap opini yang dibagikan oleh penulis tidak mewakili Gate Learn.