【区块链整理】二、比特币交易脚本

比特币规定客户端可运行五种标准交易脚本,分别为 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

此脚本根据逆波兰表达式进行计算

脚本执行步骤

  1.  Alice Signature, Alice Public Key 压入栈;
  2. OP_DUP 复制栈顶元素并压入栈顶;
  3. OP_HASH160 计算栈顶元素的哈希值,并将结果压入栈顶;
  4. Alice Public Key Hash  操作数直接压入栈顶;
  5. OP_EQUAL 对两个操作数判断,相等则通过;
  6. 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 中存储一定数量的字节。

 

参考资料:

《区块链技术及应用》——华为区块链技术开发团队