Пример смарт контракта и механизм его работы
Давайте разберем по шагам, как будет работать смарт-контракт на примере пари: если «Спартак» обыграет «ЦСКА», то пользователь А переводит пользователю Б определенную сумму. Мы будем использовать блокчейн Ethereum и язык Solidity для написания смарт-контракта.
Шаг 1: Написание смарт-контракта
Код на Solidity
pragma solidity ^0.8.0;
contract SpartakVsCSKA {
address public userA;
address public userB;
uint public betAmount;
bool public spartakWins;
// Конструктор: задаем участников пари и сумму
constructor(address _userB, uint _betAmount) payable {
require(msg.value == _betAmount, "Incorrect bet amount");
userA = msg.sender;
userB = _userB;
betAmount = _betAmount;
}
// Функция для определения результата матча
function setResult(bool _spartakWins) public {
require(msg.sender == userA || msg.sender == userB, "Not authorized");
spartakWins = _spartakWins;
}
// Функция для выполнения перевода
function executeBet() public {
require(spartakWins == true || spartakWins == false, "Result not set");
if (spartakWins) {
payable(userB).transfer(betAmount * 2); // Если Спартак выиграл, Б получает удвоенную сумму
} else {
payable(userA).transfer(betAmount * 2); // Если Спартак проиграл, А получает удвоенную сумму
}
}
}
Шаг 2: Развертывание смарт-контракта
- Компиляция:
- Код компилируется в байт-код с помощью компилятора Solidity (например, в Remix IDE).
- Развертывание:
- Пользователь А (инициатор пари) развертывает контракт в сети Ethereum.
- При развертывании пользователь А указывает:
- Адрес пользователя Б (
_userB
). - Сумму пари (
_betAmount
).
- Адрес пользователя Б (
- Пользователь А также отправляет сумму пари (
betAmount
) на адрес контракта.
Шаг 3: Взаимодействие с контрактом
1. Установка результата матча
- После матча пользователь А или Б вызывает функцию
setResult
и передает результат: true
, если «Спартак» выиграл.false
, если «Спартак» проиграл.
2. Выполнение пари
- Пользователь А или Б вызывает функцию
executeBet
. - Контракт проверяет результат матча (
spartakWins
): - Если
spartakWins == true
, контракт переводит удвоенную сумму (betAmount * 2
) пользователю Б. - Если
spartakWins == false
, контракт переводит удвоенную сумму пользователю А.
Шаг 4: Запись в блокчейн
- Все действия (развертывание контракта, установка результата, выполнение пари) записываются в блокчейн Ethereum.
- Любой участник сети может проверить:
- Адреса пользователей А и Б.
- Сумму пари.
- Результат матча.
- Факт выполнения перевода.
Шаг 5: Пример сценария
- Пользователь А создает контракт:
- Указывает адрес пользователя Б (
0x123...
). - Устанавливает сумму пари (
1 ETH
). - Отправляет
1 ETH
на адрес контракта.
- После матча:
- Если «Спартак» выиграл, пользователь А или Б вызывает
setResult(true)
. - Если «Спартак» проиграл, вызывается
setResult(false)
.
- Выполнение пари:
- Пользователь А или Б вызывает
executeBet
. - Контракт переводит
2 ETH
победителю.
Шаг 6: Преимущества и ограничения
Преимущества:
- Автоматизация: Контракт выполняет перевод автоматически.
- Прозрачность: Все действия записаны в блокчейн.
- Безопасность: Никто не может изменить условия пари.
Ограничения:
- Оракул: В текущем примере результат матча вводится вручную. В реальной системе потребуется оракул (например, Chainlink) для автоматического получения данных.
- Комиссии: Каждая транзакция в Ethereum требует оплаты газа.
- Неизменяемость: Ошибки в коде контракта сложно исправить.
Шаг 7: Улучшения
- Использование оракула:
- Интегрируйте контракт с оракулом (например, Chainlink), чтобы автоматически получать результаты матчей.
- Мультисигнатура:
- Добавьте требование, чтобы оба пользователя подтвердили результат матча перед выполнением пари.
- Возврат средств:
- Добавьте функцию для возврата средств, если матч отменен.
Заключение
Этот пример демонстрирует, как смарт-контракт может автоматизировать пари на результат матча. Хотя текущая реализация проста, она может быть расширена для поддержки более сложных сценариев, таких как использование оракулов или мультисигнатур.