Cover photo

Приватный аукцион на Aleo

Краткое вступление

Аукцион с закрытой ставкой по первой цене (или слепой аукцион) - это тип аукциона, в котором каждый участник подает заявку, не зная о заявках других участников. Участник с наивысшей ставкой выигрывает аукцион.

В этой модели есть две стороны: аукционист и участники аукциона.

Участник аукциона: Участник аукциона. Аукционист: Сторона, ответственная за проведение аукциона. Мы делаем следующие предположения об аукционе:

Аукционист честен. То есть аукционист будет рассматривать все заявки в порядке их поступления. Аукционист не будет подтасовывать заявки. Количество заявок не ограничено. Аукционист знает личности всех участников аукциона, но участники аукциона не обязательно знают личности других участников. В рамках этой модели мы требуем, чтобы:

Участники аукциона не узнают никакой информации о стоимости других предложений.

Порядок проведения аукциона

Аукцион проводится в несколько этапов.

Торги: На этапе торгов участники подают ставки аукционисту. Для этого они вызывают функцию place_bid. Разрешение: На этапе разрешения аукционист разрешает заявки в порядке их поступления. Аукционист делает это, вызывая функцию resolve. В результате процесса разрешения выдается единственная выигравшая заявка. Завершение: На этом этапе аукционист завершает аукцион, вызывая функцию finish. Эта функция возвращает победную ставку участнику аукциона, которую он может использовать для получения товара.

Шаг 0: Инициализация аукциона

post image

Внесите закрытый ключ и адрес первого участника торгов в файл program.json.

{

     "program": "auction.aleo",

     "version": "0.0.0",      "description": "A sealed bid auction",      "development": {      "private_key":      "APrivateKey1zkpG9Af9z5Ha4ejVyMCqVFXRKknSm8L1ELEwcc4htk9YhVK",      "address":      "aleo1yzlta2q5h8t0fqe0v6dyh9mtv4aggd53fgzr068jvplqhvqszq7pj2ke"       },       "license": "MIT" }

Шаг 1: Первое предложение

Пусть первый участник торгов сделает ставку 10.

// Returns a new bid. // - `bidder` : The address of the account that placed the bid. // - `amount` : The amount of the bid. // Requires that `bidder` matches the function caller. // The owner of the record is set to the entity responsible for running the auction (auction runner). // The address of the auction runner is aleo1fxs9s0w97lmkwlcmgn0z3nuxufdee5yck9wqrs0umevp7qs0sg9q5xxxzh. transition place_bid(bidder: address, amount: u64) -> Bid {           // Ensure the caller is the auction bidder.           console.assert_eq(self.caller, bidder);           // Return a new 'Bid' record for the auction bidder.      return Bid {           owner: aleo1fxs9s0w97lmkwlcmgn0z3nuxufdee5yck9wqrs0umevp7qs0sg9q5xxxzh,           gates: 0u64,           bidder: bidder,           amount: amount,           is_winner: false,      }; }

Вызовите функцию place_bid bidder 1 с аргументами 10u64.

leo run place_bid aleo1yzlta2q5h8t0fqe0v6dyh9mtv4aggd53fgzr068jvplqhvqsnvzq7pj2ke 10u64

Шаг 2: Второе предложение

Пусть второй участник торгов сделает ставку 90.

Внесите закрытый ключ и адрес второго участника торгов в файл program.json.

Вызовите функцию place_bid bidder 2 с аргументами 90u64.

leo run place_bid aleo1esqchvevwn7n5p84e735w4dtwt2hdtu4dpguwgwy94tsxm2p7qpqmlrta4 90u64

Шаг 3: Выберите победителя

Попросите аукциониста выбрать выигрышную ставку.

// Returns the winning bid. // - `first` : The first bid. // - `second` : The second bid. // Requires that the function caller is the auction runner. // Assumes that the function is invoked only after the bidding period has ended. // In the event of a tie, the first bid is selected. transition resolve(first: Bid, second: Bid) -> Bid { // Ensure the caller is the auctioneer.      console.assert_eq(self.caller,      aleo1fxs9s0w97lmkwlcmgn0z3nuxufdee5yck9wqrs0umevp7qs0sg9q5xzh); // Resolve the winner of the auction. if (first.amount >= second.amount) {       return first; } else {      return second;      } }

Внесите закрытый ключ и адрес аукциониста в файл program.json.

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

post image

Шаг 4: Завершить аукцион

Попросите аукциониста закончить аукцион.

// Returns ownership of the bid to bidder. // - `bid` : The winning bid. // Requires that the function caller is the auction runner. // Assumes that the function is invoked only after all bids have been resolved. transition finish(bid: Bid) -> Bid { // Ensure the caller is the auctioneer. console.assert_eq(self.caller,  aleo1fxs9s0w97lmkwlcmgn0z3nuxufdee5yck9wqrs0umevp7qs0sg9q5xzh); // Return 'is_winner' as 'true' in the winning 'Bid'.      return Bid {           owner: bid.bidder,           gates: bid.gates,           bidder: bid.bidder,           amount: bid.amount,           is_winner: true, }; }

Внесите закрытый ключ и адрес аукциониста в файл program.json.

Вызовите функцию перехода к завершению с записью выигравшего предложения.

post image