术语表 /地址与密钥
P2PKH 地址
又称 P2PKH address、Pay-to-Public-Key-Hash。
- P2PKH 地址是什么?
- P2PKH 是一种输出类型,它将比特币锁定在公钥的20字节哈希上,因此在您花费之前,公钥本身一直处于隐藏状态。
Pay to public key hash 是每个以1开头的地址背后的脚本模式。其锁定脚本恰好为25字节,在比特币被转移时执行五个操作。由于该输出锁定的是指纹而不是公钥本身,因此未花费的 P2PKH 输出不会向观察者透露其背后公钥的任何信息。
运作方式
P2PKH 输出带有一个锁定脚本,其形式始终相同:OP_DUP OP_HASH160 <20-byte hash> OP_EQUALVERIFY OP_CHECKSIG。该20字节哈希即 HASH160,也就是对压缩公钥先做 SHA-256,再做 RIPEMD-160,33字节的公钥由此变成20字节的承诺值。
花费时,输入的 scriptSig 中提供两项内容:先是签名,然后是公钥。执行按顺序进行。OP_DUP 复制公钥,OP_HASH160 将副本缩减为20字节,OP_EQUALVERIFY 将其与已锁定的值比较,若不一致则中止,OP_CHECKSIG 则针对该交易验证签名。两项检查都必须通过;任何一项失败,都会使整笔交易无效,而不仅仅是该输入无效。
各项大小由这一结构决定。P2PKH 输出在链上占34字节,由8字节的金额、1字节的长度和25字节的脚本组成。一个输入约占148 vbytes,因为 DER 编码的 ECDSA 签名为71至72字节,压缩公钥另加33字节,而且这些数据全都位于见证数据之外,每个字节按四倍权重计算。
在哪里会遇到它
每个以1开头的地址都是 P2PKH 地址,SegWit 在2017年8月于区块481,824激活之前转移的大多数比特币都属于这一类。区块浏览器会在每个输出上标明类型,因此无需解码即可确认您看到的是什么。
值得记住的一点是,您的公钥何时变为公开。在您花费之前,链上只有哈希。第一次花费会把公钥永久公布在 scriptSig 中。如果随后重复使用该地址,之后的任何余额都将处于一个已对所有人可见的公钥之后,这会去掉一层本来不花任何成本的保护。这立即就是一个隐私问题,也是关于未来椭圆曲线密码学攻击的长期讨论集中于已重复使用和已花费地址,而不是全新地址的原因。
实际做法是:让您的钱包为每笔付款提供一个新的收款地址,找零也发送到新地址。现代软件默认两者都会这样做。
P2PKH 地址 vs P2WPKH
P2PKH 和 P2WPKH 锁定的是同一样东西,成本却相差很大。两者都将比特币锁定在单个压缩公钥的20字节 HASH160 上,也都由该公钥的一个签名解锁。两者的区别在于解锁数据写在哪里。P2PKH 把签名和公钥放在 scriptSig 中,每字节按四个权重单位计算;P2WPKH 则把它们移入见证数据,每字节按一个权重单位计算。因此,同一个密钥可以生成看上去截然不同的1开头地址和 bc1q 地址,二者各自独立持有比特币,清空时的成本相差两倍以上。