Допис
Діліться своїми знаннями.

Створіть DEX на Sui за допомогою DeepBook: практичний посібник для розробників Move
Ласкаво просимо на наступний рівень розробки Sui Move. У цьому практичному посібнику ми глибоко занурюємось у DeepBook — потужний двигун CLOB (Central Limit Order Book) в екосистемі Sui, щоб показати вам, як побудувати DEX з нуля. Незалежно від того, створюєте ви прототипи програм DeFi чи досліджуєте механіку токенів, цей підручник проведе вас через створення смарт-контрактів, взаємодію та тестування за допомогою останніх модулів DeepBook.
Вступ: Чому DeepBook має значення
Якщо ви знайомі з протоколами DeFi, такими як Uniswap або dYdX, ви будете знати, наскільки важливою є ефективна книга замовлень у мережі. DeepBook надає цю можливість Sui з оригінально складеним дизайном. Це дозволяє лімітні ордери, ринкові ордери, пули ліквідності та кастодіальні рахунки - все це загорнуто в модулі Move.
Ця стаття продовжує наш попередній вступ до DeepBook і стає повністю практичною: ми покажемо вам, як карбувати токени, створювати пули ліквідності, депозит/виводити активи та виконувати як лімітні, так і ринкові ордери.
Налаштування вашого проекту
Почніть зі створення нового проекту Move:
$ sui move new howtosui_deepbook
Будемо будувати два модулі:
*usdt
: спеціальний маркер активів котирування
*deepbook
: наша логіка взаємодії з модулями DeepBook
Модуль токена USDT
module howtosui::usdt {
use sui::coin::{Coin, TreasuryCap, Self};
public struct USDT has drop {}
fun init(witness: USDT, ctx: &mut TxContext) {
let (treasury, metadata) = coin::create_currency(witness, 6, b"USDT", b"", b"", option::none(), ctx);
transfer::public_freeze_object(metadata);
transfer::public_transfer(treasury, tx_context::sender(ctx))
}
public entry fun mint(treasury_cap: &mut TreasuryCap<USDT>, amount: u64, recipient: address, ctx: &mut TxContext) {
treasury_cap.mint_and_transfer(amount, recipient, ctx)
}
public entry fun burn(treasury_cap: &mut TreasuryCap<USDT>, coin: Coin<USDT>) {
treasury_cap.burn(coin);
}
}
Інтеграція модуля DeepBook
module howtosui::deepbook {
use deepbook::clob_v2 as deepbook;
use deepbook::custodian_v2 as custodian;
use sui::coin::{Coin, Self};
use sui::clock::Clock;
const FLOAT_SCALING: u64 = 1_000_000_000;
public fun new_pool<Base, Quote>(payment: &mut Coin<SUI>, ctx: &mut TxContext) {
let fee = coin::balance_mut(payment).split(100 * FLOAT_SCALING);
let coin = coin::from_balance(fee, ctx);
deepbook::create_pool<Base, Quote>(1 * FLOAT_SCALING, 1, coin, ctx);
}
public fun new_custodian_account(ctx: &mut TxContext) {
transfer::public_transfer(deepbook::create_account(ctx), tx_context::sender(ctx));
}
public fun make_base_deposit<Base, Quote>(pool: &mut deepbook::Pool<Base, Quote>, coin: Coin<Base>, account_cap: &custodian::AccountCap) {
deepbook::deposit_base(pool, coin, account_cap);
}
public fun make_quote_deposit<Base, Quote>(pool: &mut deepbook::Pool<Base, Quote>, coin: Coin<Quote>, account_cap: &custodian::AccountCap) {
deepbook::deposit_quote(pool, coin, account_cap);
}
public fun withdraw_base<Base, Quote>(pool: &mut deepbook::Pool<Base, Quote>, quantity: u64, account_cap: &custodian::AccountCap, ctx: &mut TxContext) {
let base = deepbook::withdraw_base(pool, quantity, account_cap, ctx);
transfer::public_transfer(base, tx_context::sender(ctx));
}
public fun place_limit_order<Base, Quote>(
pool: &mut deepbook::Pool<Base, Quote>,
client_order_id: u64,
price: u64,
quantity: u64,
self_matching_prevention: u8,
is_bid: bool,
expire_timestamp: u64,
restriction: u8,
clock: &Clock,
account_cap: &custodian::AccountCap,
ctx: &mut TxContext
): (u64, u64, bool, u64) {
deepbook::place_limit_order(pool, client_order_id, price, quantity, self_matching_prevention, is_bid, expire_timestamp, restriction, clock, account_cap, ctx)
}
public fun place_base_market_order<Base, Quote>(
pool: &mut deepbook::Pool<Base, Quote>,
account_cap: &custodian::AccountCap,
base_coin: Coin<Base>,
client_order_id: u64,
is_bid: bool,
clock: &Clock,
ctx: &mut TxContext
) {
let quote_coin = coin::zero<Quote>(ctx);
let quantity = coin::value(&base_coin);
place_market_order(pool, account_cap, client_order_id, quantity, is_bid, base_coin, quote_coin, clock, ctx);
}
fun place_market_order<Base, Quote>(
pool: &mut deepbook::Pool<Base, Quote>,
account_cap: &custodian::AccountCap,
client_order_id: u64,
quantity: u64,
is_bid: bool,
base_coin: Coin<Base>,
quote_coin: Coin<Quote>,
clock: &Clock,
ctx: &mut TxContext
) {
let (base, quote) = deepbook::place_market_order(pool, account_cap, client_order_id, quantity, is_bid, base_coin, quote_coin, clock, ctx);
transfer::public_transfer(base, tx_context::sender(ctx));
transfer::public_transfer(quote, tx_context::sender(ctx));
}
}
Налаштування середовища: Тестування локальної мережі
Запустіть свій валідатор локально:
$ sui client switch --env localnet
Створіть два облікові записи:
$ sui client new-address ed25519 yasmine
$ sui client new-address ed25519 yoyo
Фінансуйте обидва через місцевий кран.
Розгортання та взаємодія
4.1 Публікація модулів
$ sui client publish --gas-budget 100000000
Експортуйте ключові об'єкти, такі як PACKAGE_ID, TREASURY_CAP_ID, POOL_ID тощо.
4.2 Токен котирування монетного двору (USDT)
$ sui client call --function mint ... 1000000000 <address>
4.3 Створити пул
$ sui client call --function new_pool --args <payment_coin_id>
4.4 Створити обліковий запис зберігача
$ sui client call --function new_custodian_account
4.5 Депозитні активи
$ sui client call --function make_base_deposit
$ sui client call --function make_quote_deposit
4.6 Розміщуйте лімітні ордери
$ sui client call --function place_limit_order --args <price> <quantity> <expire>
4.7 Виконання ринкових ордерів
$ sui client call --function place_base_market_order
- Підсумок
Завдяки DeepBook Sui пропонує повністю ланцюговий, складаний та ефективний двигун книги замовлень, придатний для високопродуктивних протоколів DeFi. Від карбування токенів до виконання замовлення кожен компонент програмується та перевіряється за допомогою Move. Цей посібник дає вам базову лінію для створення власних торгових платформ, стратегій ліквідності або навіть складних екосистем DeFi, керованих DAO, на Sui.
Слідкуйте за частиною 3, де ми занурюємось у аналіз подій, відстеження історії замовлень та інтеграцію інтерфейсу за допомогою SDK Sui. Давайте продовжуватимемо будувати
- Sui
- SDKs and Developer Tools
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Зароби свою частку з 1000 Sui
Заробляй бали репутації та отримуй винагороди за допомогу в розвитку спільноти Sui.