PTB Builder Handbook โ
A Beginnerโs Guide to Move and Programmable Transaction Blocks
์๋ฌธ (Foreword) โ
์ด ์ฑ ์ Move ์ธ์ด์ PTB๋ฅผ ์ฒ์ ๋ฐฐ์ฐ๋ ๋ถ๋ค์ ์ํ ์งง์ ์๋ด์์ ๋๋ค. Move๋ ๋ธ๋ก์ฒด์ธ์์ ์์ฐ์ ์์ ํ๊ฒ ๋ค๋ฃจ๊ธฐ ์ํด ์ค๊ณ๋ ์ธ์ด์ ๋๋ค. ์ฌ๋ฌ๋ถ์ ์ด ์ฑ ์ ๋ฐ๋ผ๊ฐ๋ฉด์ ์ฝ๋๋ฅผ ๋ฐฐ์ฐ๊ณ ์คํํด๋ณด๋ฉฐ, ํ ํฐ ๋ฐํ๊ณผ PTB ๊ตฌ์ฑ์ ์ง์ ์ฒดํํด๋ณด๊ฒ ๋ ๊ฒ์ ๋๋ค. ๋จ 2~3์๊ฐ๋ง ํฌ์ํ๋ฉด, Move์ PTB๊ฐ ์ด๋ค ํ์ ๊ฐ์ง๋์ง ์ง์ ๊ฒฝํํ ์ ์์ต๋๋ค.
๋ชฉ์ฐจ (Table of Contents) โ
- Move ์๊ฐ
- ํ๊ฒฝ ๊ตฌ์ฑ
- Sui CLI ์ค์น (๊ธฐ๋ณธ)
- VS Code - Sui Extension ์ค์น
- ๋น ๋ฅธ ์์
- CLI ๋น ๋ฅธ ์์
- VS Code - Sui Extension ๋น ๋ฅธ ์์
- ์ค๋ธ์ ํธ์ ๋ฆฌ์์ค
- PTB ์ค์ต ๐
- ์ฐธ๊ณ ์๋ฃ (Further Reading)
1. Move ์๊ฐ โ
๐ก ํต์ฌ ์ฉ์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ โ
- Move: ์์ฐ ์ค์ฌ์ ๋ธ๋ก์ฒด์ธ ์ค๋งํธ ์ปจํธ๋ํธ ์ธ์ด
- ๋ฆฌ์์ค(Resource): ๋ณต์ฌ/์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅํ๊ณ ์ด๋๋ง ๊ฐ๋ฅํ ๊ฐ
- ๋ชจ๋(Module): Move ์ฝ๋์ ๊ธฐ๋ณธ ๋จ์ (ํจ์์ ํ์ ํฌํจ)
Move๋? โ
- Move๋ ๋ธ๋ก์ฒด์ธ ์์ฐ์ ์์ ํ๊ฒ ๋ค๋ฃจ๊ธฐ ์ํด ์ค๊ณ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค.
- Facebook์ Libra ํ๋ก์ ํธ(2018)์์ ์์๋์ด ํ์ฌ๋ Sui, Aptos ๋ฑ ๋ค์ํ ๋ธ๋ก์ฒด์ธ์์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ด๋ฆ์ โ๊ฐ์ ๋ณต์ฌํ์ง ์๊ณ ์ฎ๊ธฐ๋(move)โ ๋์์์ ๋ฐ์จ ๊ฒ์ผ๋ก, ์์ฐ ๋ชจ๋ธ์ ํต์ฌ์ ๋ด๊ณ ์์ต๋๋ค.
Move์ ํต์ฌ ๊ฐ์น โ
- ๋ณด์์ฑ: ์์ฐ์ด ๋ณต์ฌยท์ญ์ ๋์ง ์๋๋ก ์ธ์ด ์์ฒด์์ ๋ณด์ฅ
- ํํ๋ ฅ: ์์ฐ ๋ก์ง์ ์ ์ฐํ๊ฒ ์์ฑ ๊ฐ๋ฅ
- ์ง๊ด์ฑ: ์ค๋งํธ ์ปจํธ๋ํธ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋ ์ฝ๊ฒ ์ ๊ทผ ๊ฐ๋ฅ
Move์ ์ฃผ์ ํน์ง โ
- ๋ฆฌ์์ค ํ์ : ๋์งํธ ์์ฐ์ ๋ณต์ฌ/์ญ์ ํ ์ ์๊ณ ๋ฐ๋์ ์ด๋ํด์ผ ํจ
- Ability ์์คํ : ๊ฐ์ ์์ฑยท์ ์ฅยท์ด๋ ๋ฐฉ์์ ์๊ฒฉํ ์ ์ด
- ๋ชจ๋ ์์คํ : ์ฝ๋ ์ฌ์ฌ์ฉ๊ณผ ์บก์ํ ์ง์
- PTB(ํ๋ก๊ทธ๋๋จธ๋ธ ํธ๋์ญ์ ๋ธ๋ก): ์ฌ๋ฌ ์์ ์ ํ ๋ฒ์ ๋ฌถ์ด ์คํ ๊ฐ๋ฅ
Sui์์์ Move โ
- ์ค๋ธ์ ํธ ์ค์ฌ ๋ชจ๋ธ: ์์ฐ์ ์ค๋ธ์ ํธ ๋จ์๋ก ๊ด๋ฆฌ
- ๊ณ ์ ํ Object ID: ๋ชจ๋ ์ค๋ธ์ ํธ๋ ์ ์ญ์์ ์ ์ผ
- ๋ณ๋ ฌ ์คํ: ์ถฉ๋ ์๋ ํธ๋์ญ์ ์ ๋์์ ์คํ ๊ฐ๋ฅ
- Entry ํจ์ (Entry function): ๋๊ตฌ๋ ํธ์ถํ ์ ์๋ ํน๋ณํ ์ง์ ์ ํจ์
2. ํ๊ฒฝ ๊ตฌ์ฑ โ
๐ก ํต์ฌ ์ฉ์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ โ
- Sui CLI: Move ํจํค์ง ๋น๋/ํ ์คํธ/๋ฐฐํฌ๋ฅผ ๋ด๋นํ๋ ๊ธฐ๋ณธ ๋๊ตฌ
- VS Code Extension: ๊ฐ๋ฐ ํธ์๋ฅผ ์ํ GUI ๊ธฐ๋ฐ ํดํท
- Workspace: VS Code Extension์์ ๊ด๋ฆฌํ๋ ํ๋ก์ ํธ ๋จ์
- Explorer ๋ทฐ: VS Code์์ ํ๋ก์ ํธ ํ์/์์ฑ ๋ฉ๋ด ์ ๊ณต
2.1 Sui CLI ์ค์น (๊ธฐ๋ณธ) โ
- macOS / Linux / WSL:
brew install sui
- Windows:
choco install sui
์ค์น ํ์ธ:
sui --version
โ ๏ธ Sui CLI๋ Move ์ฝ๋์ ๋น๋์ ์คํ์ ๋ฐ๋์ ํ์ํฉ๋๋ค. ๋จผ์ CLI๋ฅผ ์ค์นํด์ผ ์ดํ ๋จ๊ณ๊ฐ ์ ์์ ์ผ๋ก ๋์ํฉ๋๋ค.
2.2 VS Code - Sui Extension ์ค์น โ
Sui Extension์ VS Code์์ Move ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ์ปดํ์ผ, ๋ฐฐํฌ, ํ ์คํธํ๊ณ , Programmable Transaction Blocks๋ฅผ ์๊ฐ์ ์ผ๋ก ๊ตฌ์ฑํ๊ณ ์คํํ ์ ์๋ ํ์ฅ ๋๊ตฌ์ ๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ โ
- ์ปดํ์ผ & ๋ฐฐํฌ
- ์
๊ทธ๋ ์ด๋ ์ง์ (
upgrade.toml
๊ธฐ๋ฐ) - ์ค๋ธ์ ํธ ํ์๊ธฐ
- ํจํค์ง ํ์๊ธฐ
- PTB Builder ๋ด์ฅ (๋๋๊ทธ ์ค ๋๋กญ)
์ค์น ๋ฐฉ๋ฒ โ
- VS Code ์ด๊ธฐ โ Extensions (โงโX / Ctrl+Shift+X)
Sui Extension
๊ฒ์ ํ ์ค์น- ์ค์น ํ ์ฌ์์
โ ๏ธ ํ์ ์กฐ๊ฑด: Sui CLI๊ฐ ๋จผ์ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค.
3. ๋น ๋ฅธ ์์ โ
๐ก ํต์ฌ ์ฉ์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ โ
- Build: Move ์ฝ๋๋ฅผ ์ปดํ์ผํด ๋ชจ๋ ์์ฑ
- Test: Move ๋จ์ ํ ์คํธ ์คํ
- Deploy: ๋คํธ์ํฌ์ ํจํค์ง ์ ๋ก๋
- Package Explorer: ๋ฐฐํฌ๋ ๋ชจ๋๊ณผ ํจ์๋ฅผ ํ์ธ/ํธ์ถํ๋ UI
3.1 CLI ๋น ๋ฅธ ์์ โ
sui move new hello_move
cd hello_move
sui move build
sui move test
3.2 VS Code - Extension ๋น ๋ฅธ ์์ โ
- Explorer ๋ทฐ์์ ์ํ๋ ํด๋ ์ฐํด๋ฆญ โ New Move Project ์ ํ
- ํ์
์์ Hello World ํ
ํ๋ฆฟ ์ ํ
- Activity Bar โ Sui Extension ์์ด์ฝ ํด๋ฆญ
- Workspace ์น์
์์
hello_move
ํจํค์ง ์ ํ ํ Build / Test / Deploy ์คํ - ๋ฐฐํฌ ์๋ฃ ์ Package Explorer์ ์ ํจํค์ง ์นด๋ ์์ฑ
๐ง ํ ์คํธ๋ท ํ ํฐ ๋ฐ๊ธฐ โ
ํ ์คํธ ์คํ์ ์ํด์๋ ํ ์คํธ๋ท SUI๊ฐ ํ์ํฉ๋๋ค. ๐ ๊ณต์ Faucet์์ ์๋ นํ์ธ์.
4. ์ค๋ธ์ ํธ์ ๋ฆฌ์์ค ๋ง๋ณด๊ธฐ โ
๐ก ํต์ฌ ์ฉ์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ โ
- Coin: ํ ํฐ์ ํํํ๋ ์ค๋ธ์ ํธ
- TreasuryCap: ๋ฐํ/์๊ฐ ๊ถํ์ ๊ฐ์ง ์ค๋ธ์ ํธ
- Entry ํจ์ (Entry function): ์ธ๋ถ์์ ์ง์ ํธ์ถ ๊ฐ๋ฅํ ํจ์
Move ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ์ตํ ๋ค, ์ค์ ์ฝ์ธ๊ณผ ๊ถํ ๋ชจ๋ธ์ ์ง์ ์ฒดํํฉ๋๋ค. Sui Extension ํ
ํ๋ฆฟ Sui Move Intro Course: Fungible Token (Managed) ์ ํ์ฉํด, ๋ฐฐํฌ์๊ฐ ๋ฐํ(mint)ยท์๊ฐ(burn)ํ ์ ์๋ ์ฝ์ธ๊ณผ TreasuryCap
๊ถํ ๋ชจ๋ธ์ ๋น ๋ฅด๊ฒ ์ดํดํฉ๋๋ค.
๐ ํ ํ๋ฆฟ ๊ฐ์ ธ์ค๊ธฐ (VS Code Sui Extension)
- Explorer์์ ์ํ๋ ํด๋ ์ฐํด๋ฆญ โ New Move Project
- ํ
ํ๋ฆฟ ๋ชฉ๋ก์์ Sui Move Intro Course: Fungible Token (Managed) ์ ํ
- ์์ฑ๋ ์ํฌ์คํ์ด์ค๋ฅผ Sui Extension โ Workspace์์ ์ ํ ํ Build/Test/Deploy ์งํ
ํต์ฌ ์ฝ๋ ๋ฐ์ท โ
์ฝ์ธ ํ์ ์ ์ โ
public struct MANAGED has drop {}
์ด๊ธฐํ โ
fun init(witness: MANAGED, ctx: &mut TxContext) {
let (treasury_cap, metadata) = sui::coin::create_currency<MANAGED>(
witness, 2, b"MANAGED", b"MNG", b"", std::option::none(), ctx
);
sui::transfer::public_freeze_object(metadata);
sui::transfer::public_transfer(treasury_cap, sui::tx_context::sender(ctx));
}
๋ฏผํธ / ์๊ฐ โ
public fun mint(
treasury_cap: &mut TreasuryCap<MANAGED>,
amount: u64,
recipient: address,
ctx: &mut TxContext,
) {
treasury_cap.mint_and_transfer(amount, recipient, ctx)
}
public fun burn(treasury_cap: &mut TreasuryCap<MANAGED>, coin: Coin<MANAGED>) {
treasury_cap.burn(coin);
}
mint/burn๋ TreasuryCap ๋ณด์ ์๋ง ํธ์ถํ ์ ์์ต๋๋ค.
5. PTB ์ค์ต ๐ โ
5.1 ์ค๋น โ
- Build & Deploy
- Owner Objects Explorer์์
TreasuryCap<...::MANAGED>
ํ์ธ
5.2 ์ต์คํ ์ ์์ ์คํ โ
Deploy ํ โ Package Explorer ์ด๊ธฐ
mint
ํจ์ ์ ํ โ ์ธ์ ์ ๋ ฅ (treasury_cap
, amount, recipient)์คํ โ ์
Coin<MANAGED>
์์ฑ
5.3 PTB Builder์์ ์คํ โ
PTB Builder ์ด๊ธฐ
๋ ธ๋ ์ถ๊ฐ: moveCall โ managed::mint
์ธ์ ์ ๋ ฅ:
object(treasuryCapId)
pure.u64(amount)
pure.address(recipient)
์คํ โ Transaction Digest ํ์ธ
โก๏ธ PTB Builder๋ ์คํํ ๊ตฌ์ฑ์ TypeScript ์ฝ๋๋ก ๋ณํํด ์ ๊ณตํฉ๋๋ค. Export/Copy ๋ฉ๋ด๋ฅผ ์ฌ์ฉํด ๊ฐ๋ฐ ์ฝ๋์ ํ์ฉํ์ธ์.
5.4 ptb.wal.app ํ์ฉ โ
์น ๊ธฐ๋ฐ PTB Builder: ptb.wal.app
์ฃผ์ ๊ธฐ๋ฅ:
- PTB ์กฐ๋ฆฝ ๋ฐ ์คํ
tx digest
โ ํธ๋์ญ์ ์๊ฐํ- PTB๋ฅผ ํ์ผ๋ก ๋ด๋ณด๋ด๊ธฐ(export)
- PTB๋ฅผ TypeScript ์ฝ๋๋ก ๋ณํ
6. ์ฐธ๊ณ ์๋ฃ โ
- ๐ The Move Book
- ๐ PTB Builder Online
- ๐งโ๐ป Sui Extension (VS Code Marketplace)