帖子
分享您的知识。

使用 DeepBook 在 Sui 上构建 DEX:Move 开发人员实用指南
欢迎来到 Sui Move 开发的下一阶段. 在这份实践指南中,我们将深入探讨DeepBook——Sui生态系统中强大的CLOB(中央限价订单簿)引擎,旨在向你展示如何从头开始构建去中心化交易所. 无论你是在设计DeFi应用程序原型还是探索代币机制,本教程都将引导你使用DeepBook的最新模块完成智能合约的创建、交互和测试.
简介:为什么 DeepBook 很重要
如果你熟悉 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进行编程和测试. 本指南为您在 Sui 上构建自己的交易平台、流动性策略甚至复杂的 DAO 管理的 DeFi 生态系统提供了基准.
请继续关注第 3 部分,我们将深入探讨事件解析、订单历史记录跟踪以及使用 Sui SDK 进行前端集成. 让我们继续构建
- Sui
- SDKs and Developer Tools
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.