比特币地址P2SH&P2PKH学习

《来自猫本聪的知乎博客》
比特币地址是一串字母和数字的组合,收款时你可以放心地把它分享给发款方。地址既不是你的钱包私钥也不是公钥,别人光知道地址是无法动用你的资金的,不过可以根据公开的区块链信息查阅所有进出这个地址的交易记录。
比特币地址有几种形式。
最常见的莫过于以数字“1”开头的P2PKH(Pay-to-Public-Key-Hash)地址,例如1Nekoo5VTe7yQQ8WFqrva2UbdyRMVYCP1t。它表示的是最简单的、用一对私钥和公钥控制的钱包。
另一种越来越普及的格式是以数字“3”开头的P2SH(Pay-to-Script-Hash)地址,例如3MotoZaxiHoCTDXuAjWXRHP37mprGAAEKU。多重签名、SegWit以及一些智能合约(没错,比特币也支持简单的智能合约)通常都采用这种“3”型地址。
以“2”、“m”或“n”开头的地址非常罕见,仅仅被用于比特币的测试网络。首字符的不同让我们很容易区分它们的用途,也能防止主链的币被误发到测试网络上。
首字符是“5”、“K”或“L”的不是地址,而是WIF(Wallet Import Format)格式的私钥,务必要妥善保管,不可泄漏。

首字符是“1”的P2PKH(Pay-to-Public-Key-Hash)地址。它由一个公钥的哈希构成。任何人都可以向它转入资金,但只有掌握对应的私钥才能转出资金。转出时需要出示交易的私钥签名和公钥。秘钥本身并不透露。

P2PKH缺乏灵活性,无法支持复杂的需求,比如允许三个人中任意两个动用资金之类。为了丰富比特币的功能,BIP-16改进方案在2012年引入了首字符是“3”的P2SH(Pay-to-Script-Hash)地址。它常被谬称为多重签名(multi-signature或multisig)地址,因为multisig都以这种形式实现,但P2SH还能用于其他加密方式。今年八月激活的隔离见证(SegWit)也常以P2SH包裹,做到向后兼容。

P2SH的灵活性来自于它巧妙的设计——交易的输出并不像P2PKH那样直接保存上锁脚本,而是记录20字节的脚本哈希,形式是这样的:

HASH160 PUSHDATA(目标脚本哈希) EQUAL

光根据脚本哈希,外人无从推断出解锁的逻辑。等我们转账时才需要出示与该哈希对应的原始脚本,并且保证脚本的运行结果为真。
P2SH最常用于M-of-N多重签名,也就是在预定的N个公钥中,给出M个相应的签名就能通过验证(1 ≤ M ≤ N)。

如以交易ID:8e5df5f792ac4e98cca87f10aba7947337684a5a0a7333ab897fb9c9d616ba9e为例:
输入脚本:

P2PKH 473044022064ca802546454aea11504234ac36532f9ecce8dc4ec5cb2b620835ff45e3861702207e628f7dcad3b5172ea6c03f632502bff7297593c0ae10630fb89841ca97c69d0141046706ba47bef4f6a23383286ab016193f545c89d7d50513be70a48a86cb88e3538ce72028b556773800f8cd16d08356a0f02fde3986ddce37f7b197d4776f3c88

输出脚本:

P2PKHOP_DUP OP_HASH160 c58b058436a76c4e078d0f8bf87d59f28201589d OP_EQUALVERIFY OP_CHECKSIG
P2SH        OP_HASH160 ecc23533aa4b1c12421c05bcd11abe181b3f4515 OP_EQUAL

你可能感兴趣的:(比特币地址P2SH&P2PKH学习)