BRC-20 代幣標準

理解比特幣上的實驗性代幣標準與部署方式。

BRC-20 代幣標準:比特幣上的實驗性代幣協議完全指南

BRC-20 是比特幣區塊鏈上的一種實驗性代幣標準,於 2023 年 3 月由開發者 @domodata 創建。這是第一個在比特幣上實現類似以太坊 ERC-20 代幣功能的標準,雖然與傳統智能合約平台有本質上的不同。BRC-20 的獨特之處在於它完全依賴 Ordinals 協議的 inscription 機制來記錄代幣事件,而不依靠比特幣腳本本身執行任何邏輯。

本文將深入分析 BRC-20 的技術原理、與傳統代幣標準的差異、風險與限制,以及如何在實際應用中正確處理這種新型資產類別。

BRC-20 的誕生背景

Ordinals 協議的回顧

要理解 BRC-20,必須先理解 Ordinals 協議。Ordinals 是比特幣的一種索引方案,為每個 Satoshi(比特幣的最小單位,1 BTC = 1 億 Satoshi)分配唯一的序號。結合 Taproot 升級後的靈活性,用戶可以在這些 Satoshi 上附加任意數據,創建「刻寫」(Inscription)。

Ordinals 刻寫的關鍵特點:

BRC-20 的創新

BRC-20 利用 Ordinals 刻寫來記錄代幣事件。與以太坊的智能合約不同,BRC-20 代幣的「合約」只是一個 JSON 格式的部署定義,所有的 mint(鑄造)和 transfer(轉移)操作都只是附加到區塊鏈上的數據事件。

這種設計有幾個重要特點:

  1. 無需智能合約:不需要在比特幣上部署任何代碼
  2. 數據驅動:代幣狀態完全由索引器從區塊鏈數據計算得出
  3. 實驗性質:這是一種極簡的代幣實現,存在已知限制

BRC-20 的核心機制

三種操作類型

BRC-20 定義了三種基本操作:

1. Deploy(部署)

部署操作創建一個新的 BRC-20 代幣:

刻寫內容(JSON):
{
  "p": "brc-20",
  "op": "deploy",
  "tick": "pepe",
  "max": "1000000000",
  "lim": "1000"
}

參數說明:

2. Mint(鑄造)

Mint 操作鑄造一定數量的代幣到指定地址:

刻寫內容:
{
  "p": "brc-20",
  "op": "mint",
  "tick": "pepe",
  "amt": "1000"
}

參數說明:

3. Transfer(轉移)

Transfer 操作轉移代幣:

刻寫內容:
{
  "p": "brc-20",
  "op": "transfer",
  "tick": "pepe",
  "amt": "100"
}

代幣餘額的計算

BRC-20 代幣的餘額不是存儲在區塊鏈狀態中的,而是由索引器從所有相關的刻寫事件計算得出:

┌─────────────────────────────────────────────────────────────┐
│              BRC-20 代幣餘額計算流程                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  步驟 1:找到 Deploy                                       │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  掃描比特幣區塊鏈                                    │   │
│  │  找到 tick = "pepe" 的 deploy 刻寫                 │   │
│  │  記錄:max = 1B, lim = 1000                        │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                 │
│                           ▼                                 │
│  步驟 2:遍歷所有 Mint                                      │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  按區塊順序掃描 tick = "pepe" 的 mint 刻寫          │   │
│  │  累加所有有效 mint 的 amt                            │   │
│  │  記錄:地址 A 獲得 1000                             │   │
│  │  記錄:地址 B 獲得 500                              │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                 │
│                           ▼                                 │
│  步驟 3:遍歷所有 Transfer                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  按區塊順序掃描 tick = "pepe" 的 transfer 刻寫     │   │
│  │  扣除轉出方餘額                                      │   │
│  │  增加接收方餘額                                      │   │
│  │  (需確保轉出方餘額充足)                             │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                 │
│                           ▼                                 │
│  步驟 4:計算最終餘額                                        │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  地址 A: 1000 - 100 + 50 = 950                     │   │
│  │  地址 B: 500                                        │   │
│  │  總供應: 1500                                       │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

索引器的關鍵角色

BRC-20 的獨特之處在於索引器的核心地位:

  1. 狀態計算者:索引器負責計算每個地址的代幣餘額
  2. 規則執行者:索引器決定哪些刻寫是「有效的」
  3. 帳本維護者:沒有中央化的帳本,每個索引器可能有自己的帳本

與 ERC-20 的比較

設計哲學的差異

特性ERC-20BRC-20
執行環境EVM 智能合約比特幣區塊鏈數據
狀態存儲合約存儲索引器計算
轉帳確認合約執行區塊確認
可升級性合約可升級不可變
費用Gas 費用比特幣交易費
去中心化依賴合約代碼依賴索引器

安全模型的差異

ERC-20

BRC-20

實際差異示例

轉移代幣的流程對比

ERC-20 轉帳:

1. 用戶調用合約函數:transfer(to, amount)
2. 合約檢查餘額
3. 合約更新雙方餘額
4. 合約發出 Transfer 事件
5. 區塊鏈狀態更新(不可逆)

BRC-20 轉帳:

1. 用戶創建包含 transfer 數據的刻寫
2. 刻寫被寫入比特幣區塊鏈
3. 多個索引器獨立掃描區塊鏈
4. 每個索引器計算轉出方是否有足夠餘額
5. 各自更新自己的「帳本」
6. 如果索引器實現不同,可能出現餘額分歧!

BRC-20 的風險與限制

索引器風險

這是 BRC-20 最核心的風險:不同索引器可能給出不同的餘額

導致分歧的因素

  1. JSON 解析差異:不同索引器對無效 JSON 的處理不同
  2. 排序歧義:同一區塊內多個操作如何排序
  3. 重複處理:同一刻寫是否應該被計算多次
  4. 升級不一致:索引器升級後如何處理歷史數據
# 示例:索引器可能的分歧
# 假設同一區塊有兩筆針對地址 A 的 transfer 事件

# 索引器 1(按時間戳排序):
# 1. Transfer: A -> B 100
# 2. Transfer: C -> A 100
# 結果:A 的餘額 = 0(因為先扣款再加款)

# 索引器 2(按交易輸入順序):
# 1. Transfer: C -> A 100
# 2. Transfer: A -> B 100
# 結果:A 的餘額 = 100(先加款再扣款)

雙花問題

BRC-20 轉移的雙花風險比比特幣本身更高:

  1. 技術雙花:攻擊者可以嘗試同時發送兩筆有效的 transfer 刻寫
  2. 邏輯雙花:利用索引器之間的時間差
  3. 重放攻擊:同一筆 transfer 被多次執行

沒有共識保障

BRC-20 代幣不像智能合約那樣有區塊鏈共識保護:

費用與可擴展性

每個 BRC-20 操作都需要一個獨立的比特幣交易:

這導致:

灰塵 Dust 問題

比特幣的灰塵限制(通常為 546 satoshi)在 BRC-20 中同樣適用:

# 如果轉移金額小於比特幣灰塵限制
# 該輸出可能無法在比特幣網路中有效轉移
DUST_LIMIT = 546  # satoshis

# BRC-20 轉移時需確保:
# 轉移金額 >= DUST_LIMIT
# 否則可能導致比特幣 UTXO 無法花費

正確處理 BRC-20 的實務指南

索引器選擇與固定

處理 BRC-20 資產時,必須選擇並固定索引器:

class BRC20Indexer:
    def __init__(self, indexer_name, version):
        self.indexer_name = indexer_name  # 例如 "ord", "unisat"
        self.version = version          # 例如 "1.2.3"
        self.rules = self.load_rules(version)

    def get_balance(self, address, tick):
        """獲取餘額(使用固定索引器)"""
        # 必須使用固定的索引器版本
        return self.query_indexer(address, tick)

    def verify_transaction(self, tx_hash):
        """驗證交易有效性"""
        # 檢查索引器是否確認
        # 檢查確認數是否足夠
        pass

餘額驗證策略

不要依賴單一來源:

def verify_brc20_balance(address, tick):
    """多索引器餘額驗證"""
    # 查詢多個索引器
    balances = {
        "unisat": get_balance_unisat(address, tick),
        "ordinalsbot": get_balance_ordinalsbot(address, tick),
        "ord": get_balance_ord(address, tick)
    }

    # 如果所有餘額一致,則確認
    if len(set(balances.values())) == 1:
        return balances[list(balances.keys())[0]]

    # 如果不一致,發出警報
    log_warning(f"BRC-20 餘額不一致:{balances}")
    raise BalanceVerificationError()

處理索引器回滾

索引器可能會回滾歷史數據,需要設計應對機制:

def handle_indexer_rollback(new_height, old_height):
    """處理索引器回滾"""
    # 記錄回滾事件
    log_event(f"索引器回滾:{old_height} -> {new_height}")

    # 重新計算受影響的餘額
    affected_addresses = get_addresses_modified_between(old_height, new_height)

    for address in affected_addresses:
        # 重新獲取餘額
        new_balance = recalculate_balance(address)

        # 記錄差異
        diff = new_balance - old_balances[address]
        if diff != 0:
            log_warning(f"餘額變化:{address} {diff}")

確認數要求

BRC-20 操作的確認數要求應該比比特幣本身更保守:

# 建議確認數
BITCOIN_CONFIRMATIONS = 6        # 比特幣本身
BRC20_CONFIRMATIONS = 10         # BRC-20 應該更高

def wait_for_brc20_confirmation(tx_hash):
    """等待 BRC-20 操作確認"""
    btc_confirms = get_btc_confirmations(tx_hash)
    if btc_confirms < BRC20_CONFIRMATIONS:
        wait()

    # 額外檢查索引器確認
    indexer_confirms = get_indexer_confirmations(tx_hash)
    if indexer_confirms < 1:
        raise ConfirmationError()

BRC-20 的實際用例

知名 BRC-20 代幣

截至 2025 年,一些知名的 BRC-20 代幣包括:

代幣ticker最大供應描述
Pepepepe1,000,000,000青蛙 Meme 代幣
Ordiordi21,000,000紀念 Ordinals 協議
Pipi100,000,000紀念圓周率

交易所支持

越來越多的交易所開始支持 BRC-20:

錢包支持

主流比特幣錢包開始支持 BRC-20:

結論

BRC-20 代表了一種全新的代幣範式 — 它放棄了智能合約的執行能力,轉而使用極簡的數據驅動方法。這種設計有明顯的權衡:

優勢

劣勢

對於開發者和用戶而言,理解這些權衡至關重要。BRC-20 更適合實驗性項目和收藏品,而不是需要高安全性金融應用。隨著時間推移,我們可能會看到更多改進和替代方案出現。

在使用 BRC-20 時,請牢記:

  1. 選擇信譽良好的索引器
  2. 使用多索引器驗證
  3. 保持保守的確認數要求
  4. 做好索引器回滾的準備

這是一個實驗性的領域,在投入資金之前請確保充分理解風險。

本文包含

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!