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

Внесите закрытый ключ и адрес первого участника торгов в файл program.json.
{
"program": "auction.aleo",
"version": "0.0.0", "description": "A sealed bid auction", "development": { "private_key": "APrivateKey1zkpG9Af9z5Ha4ejVyMCqVFXRKknSm8L1ELEwcc4htk9YhVK", "address": "aleo1yzlta2q5h8t0fqe0v6dyh9mtv4aggd53fgzr068jvplqhvqszq7pj2ke" }, "license": "MIT" }
Пусть первый участник торгов сделает ставку 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
Пусть второй участник торгов сделает ставку 90.
Внесите закрытый ключ и адрес второго участника торгов в файл program.json.
Вызовите функцию place_bid bidder 2 с аргументами 90u64.
leo run place_bid aleo1esqchvevwn7n5p84e735w4dtwt2hdtu4dpguwgwy94tsxm2p7qpqmlrta4 90u64
Попросите аукциониста выбрать выигрышную ставку.
// 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.

Попросите аукциониста закончить аукцион.
// 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.
Вызовите функцию перехода к завершению с записью выигравшего предложения.


