术语表 /地址与密钥
P2WPKH
又称原生 SegWit 地址、Pay-to-Witness-Public-Key-Hash、bc1q 地址。
- P2WPKH 是什么?
- P2WPKH 将签名和公钥从输入中移出,放入见证数据,其中每个字节计为1个权重单位,而不是4个。
规定于 BIP-141。
原生 SegWit 单密钥输出写作42个字符的 bc1q 地址。锁定脚本为22字节,花费一个输入约需68 vbytes,而传统格式的对应输入约需148。自版本0.20.0起,Bitcoin Core 默认使用这种格式,其他大多数钱包也随之跟进。
运作方式
P2WPKH 输出不含通常意义上的操作码。它是字节0x00,标明见证版本0,其后推入您压缩公钥的20字节 HASH160:共22字节,节点将其识别为见证程序,而不是作为脚本执行。花费它的输入会让 scriptSig 完全为空,并在见证字段中放入两项内容,即签名和公钥。
节省源于区块的计量方式。BIP-141将区块权重定义为基础大小乘以3再加上总大小,上限为4,000,000个权重单位,相当于非见证字节每个计4个单位,见证字节每个计1个单位。一个 P2WPKH 输入有41个非见证字节,权重为164个单位,另有约108个见证字节,权重为108,合计272个单位。除以4,就得到您实际支付的68 vbytes。
有两个次要影响与费用折扣同样重要。BIP-143替换了签名哈希算法,使签名所需的工作量随输入数量线性增长,而不是呈二次方增长,因此硬件钱包能快速处理较大的 SegWit 交易。此外,由于交易标识符不再覆盖见证数据,第三方无法再在传输途中修改签名以改变 txid。
在哪里会遇到它
打开最近几年发布的几乎任何钱包,收款界面都会显示以 bc1q 开头的字符串。这些钱包从 BIP-84分支派生地址,路径为 m/84'/0'/0',SLIP-132将其与 zpub 扩展密钥前缀配对,因此将备份恢复到不同的软件中,会得到相同的地址。
目前,基本上所有交易所的提币表单都接受 bc1q。如果某个交易所拒绝,说明它运行的是2017年之前编写的验证代码,实际的做法是提币到它接受的格式,再自行将资金转出。
bc1q 无法告诉您的一点是输出支付给谁。42个字符的 bc1q 地址是单个密钥;62个字符的则是脚本。两者都是见证版本0,都使用 bech32,因此长度是唯一可见的区别。
P2WPKH vs 嵌套 SegWit
P2WPKH 和嵌套 SegWit 花费同一个密钥,并承诺同一个20字节哈希。区别在于一层封装。嵌套 SegWit 把这个22字节的见证程序放入 P2SH 输出中,使地址可以是以3开头的 Base58 字符串,而花费输入中多出的23个非见证字节权重为92个单位,正是91 vbytes 与68 vbytes 之间的差距。安全性完全相同。您放弃了约三分之一可节省的手续费,换来的是一个古老软件也能接受的地址。