比特币规定客户端可运行五种标准交易脚本,分别为 P2PKH、P2PK、P2SH、MS 和 OP_Return,不同的脚本对应着不同的特性和用途。
<比特币交易脚本基于堆栈的执行语言>
1. P2PKH(Pay to Public Key Hash)
该脚本为比特币网络大多数交易所采用的交易脚本。该脚本包含一个锁定脚本,对交易输出进行锁定,即公钥和对应的公钥哈希(PKH)。该脚本锁定的输出通过键入公钥和经相应私钥创设的数字签名解锁。
锁定脚本
假如 Bob 给 Alice 转账 0.1 BTC,Bob 会在交易中创建一个输出脚本:
OP_DUP OP_HASH160 < Alice Public Key Hash > OP_EQUAL OP_CHECKSIG
脚本对输出交易解锁条件需要提供签名和公钥,因为签名是用户私钥生成,所以仅 Alice 能够创建解锁该脚本的验证签名。
解锁脚本
Alice 花费该交易 0.1 BTC 时,提供相应的解锁脚本:
< Alice Signature > < Alice Public Key >
合并脚本
脚本合并,解锁脚本在前,锁定脚本在后:
< Alice Signature > < Alice Public Key > OP_DUP OP_HASH160 < Alice Public Key Hash > OP_EQUAL OP_CHECKSIG
此脚本根据逆波兰表达式进行计算
脚本执行步骤
- Alice Signature, Alice Public Key 压入栈;
- OP_DUP 复制栈顶元素并压入栈顶;
- OP_HASH160 计算栈顶元素的哈希值,并将结果压入栈顶;
- Alice Public Key Hash 操作数直接压入栈顶;
- OP_EQUAL 对两个操作数判断,相等则通过;
- OP_CHECKSIG 对公钥和签名进行检查,确认签名是由公钥对应的私钥生成的,执行完毕结果压入栈中。
仅当解锁脚本与锁定脚本相匹配时,组合脚本执行结果才会为 True ,即解锁脚本提供了 Alice 的有效签名。
2. P2PK(Pay to Public Key)
该模式是比较简单的交易脚本模式。相对于 P2PKH ,未对公钥进行哈希,所以可能会泄露用户公钥。Coinbase 的交易常使用该模式。
锁定脚本
锁定脚本形式如下:
< Public Key > OP_CHECKSIG
解锁脚本
解锁脚本仅包含一个操作数,即使用者签名
< Signature of A >
组合脚本
组合脚本形式如下:
< Signature of A > < Public Key > OP_CHECKSIG
调用 OP_CHECKSIG 操作符,对经过用户 A 的私钥的签名和 A 私钥对应的公钥进行验证,结果为真即通过校验。
3. P2SH(Pay to Script Hash)
该脚本仅记录20字节的脚本哈希,从而对具体的脚本细节进行了保护。需要使用通过该类脚本锁定的 UTXO 时,出示对应哈希值的原始脚本,并保证脚本运行结果为真。
锁定脚本
锁定脚本形式如下:
HASH160 PUSHDATA (目标脚本哈希) EQUAL
解锁时提供对应的目标脚本。
4. 多重签名(Multi-Signature)
多重签名提供的解锁场景:在相关的 N 个公钥中,需要提供 M 个公钥对应的签名,才可以对相应的 UTXO 进行解锁。此脚本在涉及多方协商交易的场景下较为有效。其中 N 为公钥总数,M 为至少提供的签名数量。
锁定脚本
多重签名锁定脚本形式如下:
M < Public Key 1 > < Public Key 2 > ... < Public Key N > N OP_CHECKMULTISIG
解锁脚本
解锁脚本形式如下:
OP_0 < Signature k > < Signature j > ...
锁定脚本和解锁脚本结合,即可对提供的签名进行验证,达到多重签名锁定的目的。
5. 数据记录输出(OP_Return)
数据记录输出脚本主要用于对比特币功能的拓展。开发者可通过该脚本添加80字节的非交易数据信息。
在P2PKH(pay to pubKey hash)交易中,可以将output里的验证脚本换成其它数据。这么做会导致这笔交易里的比特币不能再被花费,因为很难再找到满足条件的调用脚本(需要反求哈希)。缺点是,未被花费的交易(UTXO)都会被存储在内存中,因此这种交易就会占用许多内存空间,影响比特币网络的效率。
所以,我们可以使用比特币的 OP_RETURN 指令。包含这一指令的交易也是不可花费的,但节点可以将其安全地移出UTXO集合,这笔交易可以在 OP_RETURN 中存储一定数量的字节。
参考资料:
《区块链技术及应用》——华为区块链技术开发团队