Standards Track Draft
BIP-370: PSBT 版本 2
改進的 PSBT 格式,支援更靈活的交易構建和多方協議。
Andrew Chow 2021年1月14日
BIP 編號
370
類型
Standards Track
狀態
Draft
創建日期
2021-01-14
摘要
PSBT v2 是對 BIP-174 (PSBT v0) 的重大改進。它重新設計了 PSBT 的結構, 使其更適合多方交易構建協議,如 CoinJoin 和交互式交易構建。
PSBT v0 的限制
原始 PSBT 格式存在一些限制:
- ✗ 不可修改:創建後無法添加/移除輸入輸出
- ✗ 完整交易必須存在:全域欄位包含完整的未簽章交易
- ✗ 角色混淆:Creator 和 Updater 角色難以分離
- ✗ 多方困難:不適合 CoinJoin 等需要動態構建的協議
v2 的關鍵改進
1. 交易欄位分散存儲
v2 不再在全域區域存儲完整的未簽章交易。相反,交易的各個部分(版本、locktime、輸入、輸出) 分別存儲在各自的區域,允許獨立修改。
PSBT v0 結構:
├── Global
│ ├── PSBT_GLOBAL_UNSIGNED_TX (完整交易)
│ └── ...
├── Inputs[...]
└── Outputs[...]
PSBT v2 結構:
├── Global
│ ├── PSBT_GLOBAL_TX_VERSION
│ ├── PSBT_GLOBAL_FALLBACK_LOCKTIME
│ ├── PSBT_GLOBAL_INPUT_COUNT
│ ├── PSBT_GLOBAL_OUTPUT_COUNT
│ └── ...
├── Inputs[...]
│ ├── PSBT_IN_PREVIOUS_TXID
│ ├── PSBT_IN_OUTPUT_INDEX
│ ├── PSBT_IN_SEQUENCE
│ └── ...
└── Outputs[...]
├── PSBT_OUT_AMOUNT
├── PSBT_OUT_SCRIPT
└── ... 2. 可修改狀態
新增 PSBT_GLOBAL_TX_MODIFIABLE 欄位, 明確指示 PSBT 是否可以被修改。這允許 Constructor 角色動態添加輸入和輸出。
可修改標誌
Bit 0
可添加輸入
Bit 1
可添加輸出
Bit 2
有 SIGHASH_SINGLE
3. 新角色:Constructor
v2 引入 Constructor 角色,負責添加輸入和輸出。這與 Updater(添加簽章資訊)明確分離。
v2 角色模型
| 角色 | v0 | v2 |
|---|---|---|
| Creator | 創建完整交易框架 | 創建空 PSBT(只有版本) |
| Constructor | 不存在 | 添加輸入和輸出 |
| Updater | 添加所有資訊 | 只添加簽章所需資訊 |
| Signer | 簽章 | 簽章(相同) |
| Combiner | 合併 | 合併(相同) |
| Finalizer | 完成 | 完成(相同) |
| Extractor | 提取 | 提取(相同) |
多方交易構建
PSBT v2 特別適合需要多方參與的協議:
CoinJoin 示例
- 1. 協調者創建空 PSBT v2
- 2. 參與者 A 作為 Constructor 添加自己的輸入和輸出
- 3. 參與者 B 添加自己的輸入和輸出
- 4. 參與者 C 添加自己的輸入和輸出
- 5. 協調者鎖定 PSBT(設置不可修改)
- 6. 每個參與者作為 Signer 簽署自己的輸入
- 7. 合併、完成、廣播
新增全域欄位
| 欄位 | 說明 |
|---|---|
| PSBT_GLOBAL_TX_VERSION | 交易版本號 |
| PSBT_GLOBAL_FALLBACK_LOCKTIME | 預設 locktime |
| PSBT_GLOBAL_INPUT_COUNT | 輸入數量 |
| PSBT_GLOBAL_OUTPUT_COUNT | 輸出數量 |
| PSBT_GLOBAL_TX_MODIFIABLE | 可修改標誌 |
新增輸入/輸出欄位
| 欄位 | 類型 | 說明 |
|---|---|---|
| PSBT_IN_PREVIOUS_TXID | Input | 前序交易 ID |
| PSBT_IN_OUTPUT_INDEX | Input | 前序輸出索引 |
| PSBT_IN_SEQUENCE | Input | nSequence 值 |
| PSBT_OUT_AMOUNT | Output | 輸出金額(聰) |
| PSBT_OUT_SCRIPT | Output | 輸出腳本 |
向後相容
PSBT v2 與 v0 不直接相容。轉換規則如下:
- • v0 可以轉換為 v2(分解未簽章交易)
- • v2 可以轉換為 v0(重建未簽章交易,僅當不可修改時)
- • 版本號存儲在 PSBT_GLOBAL_VERSION 欄位
相關 BIP
- • BIP-174:PSBT v0(原始格式)
- • BIP-371:Taproot PSBT 欄位
延伸閱讀: 查看 GitHub 上的完整 BIP-370 文件
已複製連結