符文協議開發者實用指南
完整的符文協議開發教程,包含環境搭建、刻錄流程、轉移實現和餘額查詢。
符文協議開發者實用指南
符文協議(Runes Protocol)自 2024 年上線以來,已成為比特幣區塊鏈上最具活力的代幣標準之一。相較於 BRC-20,符文協議在 UTXO 效率、驗證簡便性和設計簡潔性方面都有顯著優勢。本文為開發者提供完整的符文協議實作指南,從環境搭建到智慧合約部署,幫助開發者快速上手符文開發。
開發環境準備
節點要求
運行符文協議節點需要以下硬體和軟體環境:
硬體要求:CPU 需要至少 4 核心,記憶體建議 8GB 以上,硬碟空間需要預留 500GB 用於存儲比特幣區塊鏈數據。由於符文協議需要完整解析比特幣區塊,因此無法使用輕節點。
軟體要求:推薦使用 Rust 實現的 runic 客戶端,這是目前最廣泛採用的符文協議實現。也可以使用 Ordinalsbot 或 other ordinals 兼容的索引服務。
# 安裝 runic 節點
# 1. 確保 Rust 環境已安裝
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 2. 克隆 runic 倉庫
git clone https://github.com/rust-bitcoin/runic.git
cd runic
# 3. 編譯安裝
cargo build --release
# 4. 初始化節點
./target/release/runic --data-dir /path/to/data \
--bitcoin-rpc-url http://localhost:8332 \
--bitcoin-rpc-user your_username \
--bitcoin-rpc-password your_password
錢包配置
符文協議使用標準的比特幣地址,因此任何支持比特幣簽名的錢包都可以用於符文操作。推薦使用 Bitcoin Core 的 wallet 功能或 Sparrow Wallet。
"""
符文協議錢包集成
================
"""
import hashlib
import subprocess
from typing import Dict, List, Optional
from dataclasses import dataclass
@dataclass
class RuneWallet:
"""
符文協議錢包類
使用 Bitcoin Core RPC 接口
"""
rpc_url: str
rpc_user: str
rpc_password: str
def __post_init__(self):
self.wallet_name = "runes_wallet"
def create_wallet(self):
"""創建專用錢包"""
cmd = [
"bitcoin-cli",
"-rpcurl", self.rpc_url,
"-rpcuser", self.rpc_user,
"-rpcpassword", self.rpc_password,
"createwallet",
self.wallet_name
]
return subprocess.run(cmd, capture_output=True)
def get_new_address(self):
"""獲取新地址"""
cmd = [
"bitcoin-cli",
"-rpcurl", self.rpc_url,
"-rpcuser", self.rpc_user,
"-rpcpassword", self.rpc_password,
"-rpcwallet", self.wallet_name,
"getnewaddress",
"bech32" # 原生隔離見證地址
]
result = subprocess.run(cmd, capture_output=True, text=True)
return result.stdout.strip()
def get_balance(self, address: str) -> Dict:
"""獲取比特幣餘額"""
cmd = [
"bitcoin-cli",
"-rpcurl", self.rpc_url,
"-rpcuser", self.rpc_user,
"-rpcpassword", self.rpc_password,
"getbalance",
"*", "6", # 至少 6 個確認數
"true" # include_watchonly
]
result = subprocess.run(cmd, capture_output=True, text=True)
return {
"confirmed": float(result.stdout.strip()),
"address": address
}
def send_bitcoin(self, to_address: str, amount: float) -> str:
"""
發送比特幣
用於支付符文交易的礦工費
"""
cmd = [
"bitcoin-cli",
"-rpcurl", self.rpc_url,
"-rpcuser", self.rpc_user,
"-rpcpassword", self.rpc_password,
"-rpcwallet", self.wallet_name,
"sendtoaddress",
to_address,
str(amount)
]
result = subprocess.run(cmd, capture_output=True, text=True)
return result.stdout.strip().strip('"')
符文創建與部署
刻錄過程詳解
符文協議的刻錄(Etching)是創建新代幣的過程,相當於以太坊上的智能合約部署。刻錄交易需要包含特定的 OP_RETURN 輸出,並支付相應的礦工費。
"""
符文刻錄完整實現
================
"""
class RuneEtcher:
"""
符文刻錄器
實現符文的創建和部署
"""
# 協議標識符
PROTOCOL_TAG = "ORDP" # Runes Protocol Tag
# 操作碼
OP_ETCHING = 0x00
OP_TRANSFER = 0x01
OP_MINT = 0x02
def __init__(self, wallet: RuneWallet):
self.wallet = wallet
self.network = "mainnet" # mainnet, testnet, signet
def etch_rune(
self,
name: str,
symbol: str,
divisibility: int = 0,
cap: Optional[int] = None,
terms: Optional[Dict] = None
) -> Dict:
"""
刻錄新符文
參數:
- name: 符文名稱(最大 28 字元)
- symbol: 代幣符號
- divisibility: 可分割位數(0-18)
- cap: 最大供應量(可選)
- terms: 發行條款(可選)
返回:
- 刻錄結果包含交易ID和符文ID
"""
# 1. 驗證參數
self._validate_etching_params(name, symbol, divisibility, cap)
# 2. 準備刻錄數據
etching_data = self._prepare_etching_data(
name, symbol, divisibility, cap, terms
)
# 3. 估算費用
fee_rate = self._estimate_fee_rate()
tx_size = self._estimate_etching_tx_size(etching_data)
fee = fee_rate * tx_size
# 4. 獲取資金
address = self.wallet.get_new_address()
funding_utxos = self._select_funding_utxos(fee + 10000)
# 5. 構建交易
tx = self._build_etching_tx(
etching_data,
funding_utxos,
fee
)
# 6. 簽名並廣播
txid = self._sign_and_broadcast(tx)
# 7. 計算符文ID
rune_id = self._calculate_rune_id(txid)
return {
"txid": txid,
"rune_id": rune_id,
"name": name,
"symbol": symbol,
"divisibility": divisibility,
"cap": cap,
"timestamp": int(time.time())
}
def _validate_etching_params(
self,
name: str,
symbol: str,
divisibility: int,
cap: Optional[int]
):
"""驗證刻錄參數"""
if len(name) > 28:
raise ValueError("名稱長度不能超過 28 字元")
if len(symbol) > 8:
raise ValueError("符號長度不能超過 8 字元")
if not 0 <= divisibility <= 18:
raise ValueError("可分割位數必須在 0-18 之間")
if cap is not None and cap <= 0:
raise ValueError("最大供應量必須為正數")
def _prepare_etching_data(
self,
name: str,
symbol: str,
divisibility: int,
cap: Optional[int],
terms: Optional[Dict]
) -> bytes:
"""
準備刻錄數據
數據格式:
[協議標識: 4 bytes]
[操作碼: 1 byte]
[名稱長度: varint]
[名稱: UTF-8]
[符號長度: varint]
[符號: ASCII]
[可分割位數: 1 byte]
[最大供應量標誌: 1 byte]
[最大供應量: optional, varint]
[條款標誌: 1 byte]
[條款: optional]
"""
data = bytearray()
# 協議標識 (ORDP)
data.extend(self.PROTOCOL_TAG.encode('ascii'))
# 操作碼:刻錄
data.append(self.OP_ETCHING)
# 名稱
name_bytes = name.encode('utf-8')
data.extend(self._encode_varint(len(name_bytes)))
data.extend(name_bytes)
# 符號
symbol_bytes = symbol.encode('ascii')
data.extend(self._encode_varint(len(symbol_bytes)))
data.extend(symbol_bytes)
# 可分割位數
data.append(divisibility)
# 最大供應量
if cap is not None:
data.append(0x01) # 有上限標誌
data.extend(self._encode_varint(cap))
else:
data.append(0x00) # 無上限
# 條款(可選)
if terms:
data.append(0x01) # 有條款
# 條款數據編碼
data.extend(self._encode_terms(terms))
else:
data.append(0x00) # 無條款
return bytes(data)
def _encode_varint(self, value: int) -> bytes:
"""
編碼可變長度整數
符文協議使用 LEB128 編碼
"""
result = bytearray()
while value >= 0x80:
result.append((value & 0x7F) | 0x80)
value >>= 7
result.append(value & 0x7F)
return bytes(result)
def _encode_terms(self, terms: Dict) -> bytes:
"""編碼發行條款"""
data = bytearray()
# 最大鑄造數量
if "max_mint" in terms:
data.extend(self._encode_varint(terms["max_mint"]))
# 開放時間
if "open_time" in terms:
data.extend(self._encode_varint(terms["open_time"]))
# 關閉時間
if "close_time" in terms:
data.extend(self._encode_varint(terms["close_time"]))
return bytes(data)
def _estimate_fee_rate(self) -> int:
"""估算網路費用率(sat/vbyte)"""
# 實際實現需要查詢比特幣網路
# 這裡使用預設值
return 10 # sat/vbyte
def _estimate_etching_tx_size(self, etching_data: bytes) -> int:
"""
估算刻錄交易大小
交易大小估算:
- 版本號:4 bytes
- 輸入計數:1 byte
- 輸入:~148 bytes each
- 輸出計數:1 byte
- OP_RETURN:~11 bytes + 數據
- 輸出:34 bytes each
- 見證:~107 bytes each (如果使用隔離見證)
"""
# 假設單一輸入和輸出
base_size = 4 + 1 + 148 + 1 + 11 + len(etching_data) + 34
witness_size = 107 # 單一見證
return base_size + witness_size
def _select_funding_utxos(self, required_amount: int) -> List[Dict]:
"""選擇資金輸入"""
# 實現 UTXO 選擇算法
# 這裡返回模擬數據
return [{
"txid": "0" * 64,
"vout": 0,
"value": required_amount + 10000
}]
def _build_etching_tx(
self,
etching_data: bytes,
funding_utxos: List[Dict],
fee: int
) -> Dict:
"""構建刻錄交易"""
# 計算輸入總額
total_input = sum(utxo["value"] for utxo in funding_utxos)
# 計算輸出
output_value = total_input - fee
tx = {
"version": 2,
"inputs": funding_utxos,
"outputs": [
{
"script": f"OP_RETURN {etching_data.hex()}",
"value": 0
},
{
"address": self.wallet.get_new_address(),
"value": output_value
}
]
}
return tx
def _sign_and_broadcast(self, tx: Dict) -> str:
"""簽名並廣播交易"""
# 實現比特幣交易簽名和廣播
# 這裡返回模擬結果
return hashlib.sha256(str(tx).encode()).hexdigest()[:64]
def _calculate_rune_id(self, txid: str) -> str:
"""
計算符文ID
符文ID格式:
高64位:區塊高度
低64位:區塊內交易位置
"""
# 實際實現需要查詢交易所在區塊
return "1:0" # 模擬結果
# 使用示例
def main():
wallet = RuneWallet(
rpc_url="http://localhost:8332",
rpc_user="user",
rpc_password="password"
)
etcher = RuneEtcher(wallet)
# 刻錄新符文
result = etcher.etch_rune(
name="比特金幣",
symbol="BTCG",
divisibility=8,
cap=21_000_000_0000000, # 2100萬 * 10^8
terms={
"max_mint": 210000000,
"open_time": 0
}
)
print(f"符文刻錄成功!")
print(f"交易ID: {result['txid']}")
print(f"符文ID: {result['rune_id']}")
if __name__ == "__main__":
main()
實用刻錄參考
以下是截至 2026 年初最受歡迎的符文代幣參數配置:
| 符文名稱 | 符號 | 可分割性 | 最大供應量 | 特點 |
|---|---|---|---|---|
| DOG•GO•TO•THE•MOON | DOG | 0 | 1,000,000,000 | 首個百萬美元符文 |
| PEPE | PEPE | 0 | 420,690,000,000 | 迷因幣 |
| SATS | SATS | 0 | 100,000,000,000 | 以 satoshi 命名 |
| TRAC | TRAC | 8 | 1,000,000,000 | 實用型代幣 |
符文轉移實現
轉移交易結構
符文轉移是符文協議的核心操作。轉移過程涉及解析 OP_RETURN 中的轉移指令,並更新相應的 UTXO 餘額。
"""
符文轉移完整實現
===============
"""
class RuneTransfer:
"""
符文轉移處理器
"""
def __init__(self, wallet: RuneWallet):
self.wallet = wallet
def transfer(
self,
rune_id: str,
from_address: str,
to_address: str,
amount: int
) -> Dict:
"""
執行符文轉移
參數:
- rune_id: 符文ID
- from_address: 發送方地址
- to_address: 接收方地址
- amount: 轉移數量(內部表示)
返回:
- 轉移結果
"""
# 1. 獲取發送方符文餘額
balance = self._get_rune_balance(from_address, rune_id)
if balance < amount:
raise ValueError(f"餘額不足:需要 {amount},實際 {balance}")
# 2. 獲取符文 UTXO
rune_utxos = self._get_rune_utxos(from_address, rune_id)
# 3. 選擇要使用的 UTXO
selected_utxos, change = self._select_utxos(rune_utxos, amount)
# 4. 準備轉移數據
transfer_data = self._prepare_transfer_data(
rune_id,
amount,
change,
to_address,
from_address
)
# 5. 估算費用
fee = self._estimate_transfer_fee(selected_utxos, transfer_data)
# 6. 獲取比特幣資金
funding_utxos = self._get_funding_utxos(fee)
# 7. 構建交易
tx = self._build_transfer_tx(
selected_utxos,
funding_utxos,
transfer_data,
fee,
to_address,
from_address
)
# 8. 簽名並廣播
txid = self._sign_and_broadcast(tx)
return {
"txid": txid,
"rune_id": rune_id,
"amount": amount,
"to": to_address,
"from": from_address,
"fee": fee
}
def _get_rune_balance(self, address: str, rune_id: str) -> int:
"""獲取地址的符文餘額"""
# 實現需要查詢符文索引
# 這裡返回模擬數據
return 0
def _get_rune_utxos(self, address: str, rune_id: str) -> List[Dict]:
"""獲取地址的符文 UTXO"""
# 返回該地址持有的所有符文 UTXO
return []
def _select_utxos(
self,
available_utxos: List[Dict],
amount: int
) -> Tuple[List[Dict], int]:
"""
選擇 UTXO
使用最優算法選擇最少的 UTXO 來完成轉移
"""
# 按金額排序
sorted_utxos = sorted(
available_utxos,
key=lambda x: x["amount"]
)
selected = []
total = 0
for utxo in sorted_utxos:
selected.append(utxo)
total += utxo["amount"]
if total >= amount:
break
if total < amount:
raise ValueError("可用餘額不足")
change = total - amount
return selected, change
def _prepare_transfer_data(
self,
rune_id: str,
amount: int,
change: int,
to_address: str,
from_address: str
) -> bytes:
"""
準備轉移數據
轉移 OP_RETURN 格式:
[協議標識: 4 bytes]
[操作碼: 1 byte]
[符文ID: varint]
[轉移數量: varint]
[輸出數量: varint]
[輸出#1數量: varint]
[輸出#1標識: address]
...
"""
data = bytearray()
# 協議標識
data.extend(b'ORDP')
# 操作碼:轉移
data.append(0x01)
# 符文ID
rune_id_int = self._parse_rune_id(rune_id)
data.extend(self._encode_varint(rune_id_int))
# 轉移數量
data.extend(self._encode_varint(amount))
# 輸出數量(接收方 + 找零)
output_count = 2 if change > 0 else 1
data.extend(self._encode_varint(output_count))
# 輸出#1:接收方
data.extend(self._encode_varint(amount))
# 輸出#2:找零(如果有)
if change > 0:
data.extend(self._encode_varint(change))
return bytes(data)
def _parse_rune_id(self, rune_id: str) -> int:
"""解析符文ID為整數"""
parts = rune_id.split(':')
block_height = int(parts[0])
tx_position = int(parts[1])
return (block_height << 64) | tx_position
def _encode_varint(self, value: int) -> bytes:
"""LEB128 編碼"""
result = bytearray()
while value >= 0x80:
result.append((value & 0x7F) | 0x80)
value >>= 7
result.append(value & 0x7F)
return bytes(result)
def _estimate_transfer_fee(self, utxos: List[Dict], data: bytes) -> int:
"""估算轉移費用"""
# 估算交易大小
input_count = len(utxos)
output_count = 2 # OP_RETURN + 輸出
tx_size = (
4 + # 版本號
1 + # 輸入計數
(input_count * 148) + # 輸入大小
1 + # 輸出計數
(output_count * 34) + # 輸出大小
11 + len(data) + # OP_RETURN
(input_count * 107) # 見證大小
)
fee_rate = 10 # sat/vbyte
return tx_size * fee_rate
def _get_funding_utxos(self, required_amount: int) -> List[Dict]:
"""獲取比特幣資金 UTXO"""
return []
def _build_transfer_tx(
self,
rune_utxos: List[Dict],
funding_utxos: List[Dict],
transfer_data: bytes,
fee: int,
to_address: str,
from_address: str
) -> Dict:
"""構建轉移交易"""
# 計算總輸入
total_input = (
sum(utxo["value"] for utxo in rune_utxos) +
sum(utxo["value"] for utxo in funding_utxos)
)
# 計算輸出總額
total_output = sum(utxo["value"] for utxo in rune_utxos)
# 交易輸出
outputs = []
# OP_RETURN 輸出
outputs.append({
"script": f"OP_RETURN {transfer_data.hex()}",
"value": 0
})
# 接收方輸出
outputs.append({
"address": to_address,
"value": 0 # 符文通過轉移數據表示,不在輸出值中
})
# 找零輸出
change = total_input - fee - total_output
if change > 546: # 比特幣粉塵閾值
outputs.append({
"address": from_address,
"value": change
})
return {
"version": 2,
"inputs": rune_utxos + funding_utxos,
"outputs": outputs
}
def _sign_and_broadcast(self, tx: Dict) -> str:
"""簽名並廣播"""
return "0" * 64
class RuneBatchTransfer:
"""
批量符文轉移
支持單筆交易中進行多個符文轉移
"""
def batch_transfer(
self,
rune_id: str,
from_address: str,
transfers: List[Dict]
) -> Dict:
"""
批量轉移符文
參數:
- transfers: 轉移列表 [{"to": address, "amount": value}, ...]
"""
# 計算總轉移量
total = sum(t["amount"] for t in transfers)
# 獲取餘額
balance = self._get_rune_balance(from_address, rune_id)
if balance < total:
raise ValueError("餘額不足")
# 獲取 UTXO
utxos = self._get_rune_utxos(from_address, rune_id)
# 選擇 UTXO
selected_utxos, change = self._select_utxos(utxos, total)
# 準備批量轉移數據
transfer_data = self._prepare_batch_data(
rune_id,
transfers,
change
)
# 構建並廣播交易
tx = self._build_batch_tx(
selected_utxos,
transfer_data,
transfers,
from_address
)
return {
"txid": self._sign_and_broadcast(tx),
"transfers": transfers,
"total": total,
"change": change
}
def _prepare_batch_data(
self,
rune_id: str,
transfers: List[Dict],
change: int
) -> bytes:
"""準備批量轉移數據"""
data = bytearray()
# 協議標識
data.extend(b'ORDP')
# 操作碼:轉移
data.append(0x01)
# 符文ID
rune_id_int = self._parse_rune_id(rune_id)
data.extend(self._encode_varint(rune_id_int))
# 總轉移量
total = sum(t["amount"] for t in transfers)
data.extend(self._encode_varint(total))
# 輸出數量
output_count = len(transfers) + (1 if change > 0 else 0)
data.extend(self._encode_varint(output_count))
# 每個輸出
for transfer in transfers:
data.extend(self._encode_varint(transfer["amount"]))
# 找零輸出
if change > 0:
data.extend(self._encode_varint(change))
return bytes(data)
符文餘額查詢
錢包餘額管理
開發符文應用時,餘額查詢是最基本的功能。以下是實現餘額查詢的完整方案:
"""
符文餘額查詢系統
================
"""
class RuneBalanceChecker:
"""
符文餘額查詢器
"""
def __init__(self, indexer_url: str):
self.indexer_url = indexer_url
def get_balance(self, address: str, rune_id: str) -> Dict:
"""
查詢特定符文的餘額
返回:
- balance: 餘額(內部表示)
- balance_formatted: 格式化後的餘額
- divisibility: 可分割位數
"""
# 獲取符文信息
rune_info = self._get_rune_info(rune_id)
# 獲取餘額
raw_balance = self._query_balance(address, rune_id)
# 格式化
formatted = self._format_balance(
raw_balance,
rune_info["divisibility"]
)
return {
"address": address,
"rune_id": rune_id,
"rune_name": rune_info["name"],
"balance_raw": raw_balance,
"balance_formatted": formatted,
"divisibility": rune_info["divisibility"],
"symbol": rune_info["symbol"]
}
def get_all_balances(self, address: str) -> List[Dict]:
"""查詢地址所有符文餘額"""
# 獲取所有符文
all_runes = self._get_all_runes()
balances = []
for rune in all_runes:
balance = self.get_balance(address, rune["id"])
if balance["balance_raw"] > 0:
balances.append(balance)
return balances
def _get_rune_info(self, rune_id: str) -> Dict:
"""獲取符文信息"""
# 實現需要查詢符文協議索引
# 這裡返回模擬數據
return {
"id": rune_id,
"name": "SATS",
"symbol": "SATS",
"divisibility": 0,
"cap": 100000000000
}
def _query_balance(self, address: str, rune_id: str) -> int:
"""查詢原始餘額"""
# 實現需要查詢區塊鏈索引
return 0
def _format_balance(self, raw_balance: int, divisibility: int) -> str:
"""格式化餘額"""
if divisibility == 0:
return str(raw_balance)
# 插入小數點
balance_str = str(raw_balance).zfill(divisibility + 1)
integer_part = balance_str[:-divisibility] or "0"
decimal_part = balance_str[-divisibility:]
return f"{integer_part}.{decimal_part}"
def _get_all_runes(self) -> List[Dict]:
"""獲取所有已刻錄的符文"""
return []
實用工具與庫
主流開發工具
以下是符文協議開發者常用的工具和庫:
索引服務:
- Ordinalsbot:提供 API 接口查詢符文餘額和交易
- rune.watch:符文專用區塊瀏覽器
- Ordinals Explorer:通用 Ordinals/Runes 瀏覽器
錢包SDK:
- sats-connect:JavaScript 錢包連接庫
- bitcoind-rpc:Node.js Bitcoin Core RPC 封裝
庫:
- rune-ts:TypeScript 符文協議庫
- python-runes:Python 符文協議實現
// TypeScript 示例:使用 sats-connect 進行符文轉移
import { Wallet } from 'sats-connect';
async function transferRune() {
// 連接錢包
const wallet = new Wallet('Xverse'); // 或其他支持的錢包
// 請求連接
await wallet.connect();
// 獲取地址
const address = await wallet.getAddress();
// 構建轉移交易
const transferRequest = {
runeId: '2584:0', // SATS 符文ID
toAddress: 'bc1q...', // 接收方地址
amount: '100000000' // 數量
};
// 發送交易
const result = await wallet.sendRune(transferRequest);
console.log('轉移成功:', result.txid);
}
最佳實踐
費用優化
符文轉移的費用優化是開發中需要重點關注的問題。以下是費用優化的關鍵策略:
批次處理:將多個符文轉移合併為單筆交易可以顯著降低每筆轉移的平均成本。這在 NFT mint 或空投場景中特別有效。
費用預測:使用費用估算 API(如 mempool.space)來動態調整費用率,避免在網路擁堵時支付過高費用。
UTXO 管理:定期整合分散的小額 UTXO 可以減少未來轉移的交易大小。
安全性考慮
私鑰管理:始終使用硬體錢包或安全的私鑰管理方案,切勿將私鑰存儲在代碼庫中。
交易驗證:在簽名前仔細驗證交易的所有參數,特別是接收地址和數量。
灰塵攻擊防護:比特幣灰塵攻擊也可能影響符文,使用錢包時應注意灰塵 UTXO 的處理。
結論
符文協議為比特幣區塊鏈上的代幣應用開闢了新的可能性。通過本文的開發者指南,讀者應該能夠掌握符文協議的核心概念,並開始構建自己的符文應用。隨著比特幣生態系統的不斷發展,符文協議將在比特幣 DeFi、NFT 和更多創新應用中發揮重要作用。
開發者在實際項目中應持續關注比特幣網路的費用市場變化,並根據具體應用場景選擇合適的參數配置。符文協議的設計強調簡潔和效率,這使得它成為比特幣開發者生態中備受關注的技術方向。
更新日期:2026-02-28
版本:1.0
相關文章
- 符文協議技術詳解 — 符文協議的共識機制、UTXO 設計與資源管理。
- 符文生態系統 — 比特幣符文協議生態系統
- 什麼是符文協議 (Runes)? — 理解比特幣上的符文協議,與 Ordinals 和 BRC-20 的差異。
- 符文 vs BRC-20 比較 — 深入比較 Runes 與 BRC-20 代幣標準的優劣。
- 符文鑄造完整指南 — 如何參與符文鑄造與交易市場。
延伸閱讀與來源
這篇文章對您有幫助嗎?
請告訴我們如何改進:
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!