Skip to content

BTC #4:Transaction(中)— 地址类型与隔离见证

比特币经历了多次升级,地址类型从 Legacy 到 SegWit 再到 Taproot,每一代都在提升效率和功能。


比特币地址类型演进

graph LR
    A["P2PKH<br/>1 开头<br/>2009"] -->|"更强大"| B["P2SH<br/>3 开头<br/>2012"]
    B -->|"更高效"| C["P2WPKH<br/>bc1q 开头<br/>2017"]
    C -->|"更隐私"| D["P2TR<br/>bc1p 开头<br/>2021"]

    style A fill:#ffecb3
    style B fill:#ffe0b2
    style C fill:#c8e6c9
    style D fill:#b3e5fc

地址类型详解

类型前缀编码格式引入时间说明
P2PKH1Base58Check2009最早的地址格式,Pay to Public Key Hash
P2SH3Base58Check2012 (BIP16)支持多签等复杂脚本,Pay to Script Hash
P2WPKHbc1qBech322017 (BIP141)原生隔离见证,手续费更低
P2TRbc1pBech32m2021 (BIP341)Taproot,Schnorr + MAST

各类型的锁定脚本对比

类型锁定脚本解锁需要
P2PKHOP_DUP OP_HASH160 <hash> OP_EQUALVERIFY OP_CHECKSIG签名 + 公钥
P2SHOP_HASH160 <script_hash> OP_EQUAL赎回脚本 + 脚本输入
P2WPKHOP_0 <20字节hash>witness 中提供签名 + 公钥
P2TROP_1 <32字节公钥>witness 中提供 Schnorr 签名

隔离见证(Segregated Witness)

为什么需要 SegWit

SegWit 解决了比特币的两大问题:

graph TB
    subgraph "问题1:交易延展性"
        P1A["签名数据在交易ID计算范围内"]
        P1B["第三方可以修改签名格式"]
        P1C["导致交易ID改变但交易仍有效"]
        P1A --> P1B --> P1C
    end

    subgraph "问题2:区块容量限制"
        P2A["1MB 区块大小限制"]
        P2B["签名占交易约 60% 空间"]
        P2C["实际可用空间很少"]
        P2A --> P2B --> P2C
    end

    subgraph "SegWit 解决方案"
        S1["签名数据移出交易主体"]
        S2["交易ID不再包含签名"]
        S3["引入'虚拟字节'概念"]
        S4["等效区块容量提升至约 4MB"]
    end

    P1C --> S1
    P2C --> S1
    S1 --> S2
    S1 --> S3
    S3 --> S4

SegWit 前后交易结构对比

SegWit 之前

[version] [inputs (含签名)] [outputs] [locktime]
         ↑ 交易ID = hash(整个数据)

SegWit 之后

[version] [marker] [flag] [inputs (不含签名)] [outputs] [witness (签名)] [locktime]
                          ↑ 交易ID = hash(不含witness)

签名数据被"隔离"到 witness 区域,不再参与交易 ID 的计算,彻底解决了交易延展性问题。

学习资源