好久没有认真研究比特币的脚本了,最近想搞明白Taproot assets,发现绕不开Taproot交易,只好把Taproot的几个BIP都读完了。
最常见的比特币交易叫支付到公钥哈希,Pay-to-Publick-Key-Hash(P2PKH),它是将比特币锁定到公钥的哈希上,公钥哈希就是我们的比特币地址,即1开头的那种地址。
如果Alice想通过P2PKH交易向Bob支付1btc,这个过程可以按如下解释。
P2PKH交易的技术过程:
地址和公钥哈希:Bob给Alice提供了一个比特币地址,这个地址实际上是他的公钥的哈希值。
解锁和锁定:Alice要发送1 BTC给Bob,她需要从自己的钱包中解锁这笔资金。然后,她在创建交易时将这1 BTC锁定到Bob的公钥哈希上。
Bob的签名和解锁:当Bob想要花费这1 BTC时,他需要用自己的私钥签名来证明他是这个地址的拥有者。这样他就可以解锁这笔资金并将其用于新的交易。
通俗的解释:
Bob给Alice一个开着的带锁盒子(这里的锁就是Bob的比特币地址)。
Alice把1 BTC放进这个盒子,然后把盒子锁上,这样就只有拥有正确钥匙(即Bob的私钥)的人才能打开。
当Bob想使用这1 BTC时,他就用自己的钥匙(私钥)打开盒子,取出比特币,并可以选择将其放入另一个人的盒子(进行另一笔交易)。
第二常见的比特币交易叫支付到脚本哈希,我们常用这种交易格式来实现多重签名。
如果Alice想通过P2SH交易格式向Bob发送1BTC,可以按如下来解释:
P2SH交易的技术过程:
脚本哈希而非公钥哈希:在P2SH交易中,资金被锁定到一个脚本哈希而不是一个公钥哈希。
这个脚本通常包含多个条件,比如需要多个签名(多重签名)或满足其他特定条件。
创建和发送交易:发送方(比如Alice)会将比特币发送到这个脚本哈希地址。这个地址是由接收方(比如Bob)提供的,而这个地址背后隐藏的脚本包含了解锁这些资金所需的条件。
即这个脚本哈希的原始脚本是Bob拥有的,但Bob不会将这个脚本公开,而只是公开这个脚本的哈希值。(这对应上面P2PKH的是公钥哈希)
解锁资金:当Bob(收款方)想要花费这些比特币时,他就会提供原始的脚本(这就是解锁脚本,或称赎回脚本),矿工拿到这个原始脚本就可以验证这笔交易。
通俗的解释:
其实P2SH和上面的P2PKH的差别就是在那个盒子上的锁不同,P2SH的锁是允许Bob自定义,可以构建非常复杂的锁。
比如最常见的多重签名,就是Bob自定义了多把解锁的钥匙,并定义了要多少把钥匙来解锁。
使用P2SH这种交易机制,把脚本哈希当成锁,把原始脚本当成是私钥,就可以自定义各种解锁条件。这让比特币的可编程性大大提高了。
P2PKH是支付到公钥哈希,花费条件是提供公钥对应的私钥签名。
P2SH是支付到脚本哈希,花费条件是提供原始脚本。
P2TR是一种结合了支付到公钥哈希和支付到脚本哈希,因此它有两条花费路径,即可以是直接的私钥签名,也可以是提供原始脚本。
并且,P2TR的脚本是一颗包含了n个脚本的二叉树,花费时提供树的一个叶子节点脚本和树路径就可以花费。
这样,P2TR交易就可以定义出更复杂的花费条件,比特币的可编程性就更丰富了。