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

By [310-340-7892.eth](https://paragraph.com/@310-340-7892) · 2023-01-17

---

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

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

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

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

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

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

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

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

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

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

![](https://storage.googleapis.com/papyrus_images/e2e4a2952bc1ca8e30c77d3d178cd75a6aa85f3ea037f2c5ce6446ebe5a9979d.png)

Внесите закрытый ключ и адрес первого участника торгов в файл 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.

![](https://storage.googleapis.com/papyrus_images/356ee700136b81c1633dd1de8f308c8e368a9de6e34b0c8f877172d7c58b254f.png)

Шаг 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.

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

![](https://storage.googleapis.com/papyrus_images/0541b40e47f3a730da8f54b92136f6278598312accaf9e1ddf0b339a3ebe2d97.png)

---

*Originally published on [310-340-7892.eth](https://paragraph.com/@310-340-7892/aleo)*
