Прогнозирование событий с распределением выигрыша(Ставки)
Find a file
2023-12-20 22:46:01 +03:00
contract.go Initial implementation of smart-contract 2023-12-20 21:23:31 +03:00
contract.yml Initial implementation of smart-contract 2023-12-20 21:23:31 +03:00
data.json Initial implementation of smart-contract 2023-12-20 21:23:31 +03:00
go.mod Initial implementation of smart-contract 2023-12-20 21:23:31 +03:00
go.sum Initial implementation of smart-contract 2023-12-20 21:23:31 +03:00
README.md Update README.md 2023-12-20 22:46:01 +03:00

Смарт-контракт для ставок на событие

Конракт создаётся под одно событие и даёт возможность множеству игроков сделать ставку на результат. Используется упрощенная модель события: есть только две стороны события, одна из которых обязана победить.

Контракт принимает ставки только до того момента, пока контракт не обновил своё состояние, запросив у оракула результаты события. Оракул обращается к внешнему ресурсу и запрашивает у него JSON-документ, описывающий следующие допустимые состояния события:

  • ещё не произошло
  • выиграла 1-ая сторона
  • выиграла 2-ая сторона

Чтобы сделать ставку у игрока должно быть необходимое количество газа.

Игроки имеют возможность обратиться к контракту для получения выигрыша. Выигрыш распределяется из суммы ставок всех проигравших игроков пропорционально ставке выигрывшего игрока. При этом, контракт оставляет себе премию в размере половины суммы всех ставок всех проигравших игроков.

Пример использования конракта в приватной сети

Для установки и использования контракта требуется сеть NEO. Например, private network из воркшопа NeoSPCC.

Для выполнения команд нужна подключенная к сети нода neo-go.

Компиляция

$ ./bin/neo-go contract compile -i ../smart-contract-bets/contract.go -c ../smart-contract-bets/contract.yml -m ../smart-contract-bets/contract.manifest.json

Установка

$ ./bin/neo-go contract deploy -i ../smart-contract-bets/contract.nef -manifest ../smart-contract-bets/contract.manifest.json -r http://localhost:20331 -w ../smart-contract-bets/wallet.json

Создание ставки игроком

$ ./bin/neo-go contract invokefunction -r http://localhost:20331 -w ../smart-contract-bets/player_wallet.json <номер контракта> placeBet <сумма ставки> <номер стороны события> NbrUYaZgyhSkNoRo9ugRyEMdUZxrhkNaWB -- NbrUYaZgyhSkNoRo9ugRyEMdUZxrhkNaWB:CalledByEntry,CustomContracts:0xd2a4cff31913016155e38e474a2c06d08be276cf

NbrUYaZgyhSkNoRo9ugRyEMdUZxrhkNaWB - пример адреса игрока, от имени которого мы делаем ставку

NbrUYaZgyhSkNoRo9ugRyEMdUZxrhkNaWB:CalledByEntry - инструкция разрешить контракту действовать от имени игрока

CustomContracts:0xd2a4cff31913016155e38e474a2c06d08be276cf - инструкция разрешить системному контракту GAS действовать от имени игрока

Проверка статуса события

$ ./bin/neo-go contract invokefunction -r http://localhost:20331 -w ../smart-contract-bets/wallet.json <номер контракта> checkEventStatus

Предполагается, что функция вызывается владельцем контракта для обновления состояния контракта.

Функция обращается к оракулу и, если оракул сообщает, что событие сыграно, то контракт обновляет своё состояние. Иначе, функцию нужно вызывать до тех пор, пока событие не случится.

Получение выигрыша игроком

$ ./bin/neo-go contract invokefunction -r http://localhost:20331 -w ../smart-contract-bets/player_wallet.json <номер контракта> claimWin NbrUYaZgyhSkNoRo9ugRyEMdUZxrhkNaWB

NbrUYaZgyhSkNoRo9ugRyEMdUZxrhkNaWB - пример адреса игрока, от имени которого мы получаем выигрыш

Предполагается, что функция вызывается игроком. В случае, если ставка игрока выиграла, то контракт перечисляет выигрыш игроку, и функция возвращает true.

Если ставка игрока не выиграла, то функция возращает false и не производит никаких перечислений.

Функция, вызванная повторно после получения выигрыша, возвращает false.

Функция, вызванная до факта розыгрыша события, возвращает ошибку.