C/C++教程

Bitcoin 标准交易脚本类型:介绍

本文主要是介绍Bitcoin 标准交易脚本类型:介绍,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

P2PKH

P2PKH 是 Pay-To-Public-Key-Hash 的缩写,即支付到公钥哈希。该类型的交易脚本占比特币交易脚本的大多数。

P2PKH 锁定脚本形式如下:

OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

P2PKH 解锁脚本形式如下:

<sig> <pubKey>

其中,pubKey 是公钥,pubKeyHash 是公钥哈希,sig 是用私钥签署的数字签名。解锁脚本和锁定脚本组合成的组合脚本如下所示:

<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

只要最后执行结果为 TRUE,就表示交易满足花费条件。

执行 P2PKH 脚本验证交易,可以看出 P2PKH 主要实现两个验证,一是创建新交易里指定的公钥是否能转换为其指定的上一笔关联交易输出中正确的比特币地址,即由解锁脚本里的公钥转换的比特币地址是和否与锁定脚本里的比特币地址一致;二是验证数字签名是否正确,数字签名是将交易信息摘要(即交易信息的密码哈希值)与私钥一起进行计算所得,验证数字签名就是将公钥和与之对应私钥签发的数字签名进行匹配校验,从而证明是否是交易输出里的比特币资金的所有人。我们由此能得出一个结论,即私钥是证明自己能支配相应公钥地址里资金的关键,谁知道私钥,谁就具有资金的支配权,如果丢了私钥,就相当于丧失了对资金控制的权利。

实例:

Tx: 3966a1f83661e6dc0a83fefa37f803d2b6355a3cf03b7ddfd0c267fdd635497a
它的锁定脚本(Output Script):

OP_DUP OP_HASH160 b9c6d294f857470ae29b1f2d3ce696f67e668bfe OP_EQUALVERIFY OP_CHECKSIG

它的解锁脚本(Input Script):

483045022100b81f14b9d8b8ec0a9d5bb776f21c85ff68af9446aadda1f845b0eabae64e881002200a86576a0c51d70941a72c0bd54bf56a3c4daecaf4394a0f91d7def18d5d3538012103d71ec6a61f2ecb6792547963afb3b064ec80f1cfa7760664f5d0d973e864b40e  H0E!

组合脚本(节点验证时执行的脚本):

483045022100b81f14b9d8b8ec0a9d5bb776f21c85ff68af9446aadda1f845b0eabae64e881002200a86576a0c51d70941a72c0bd54bf56a3c4daecaf4394a0f91d7def18d5d3538012103d71ec6a61f2ecb6792547963afb3b064ec80f1cfa7760664f5d0d973e864b40e  H0E! OP_DUP OP_HASH160 b9c6d294f857470ae29b1f2d3ce696f67e668bfe OP_EQUALVERIFY OP_CHECKSIG

P2PK

P2PK 即Pay-To-Pub-Key,支付到公钥,又名 P2PKH_PUBKEY。相比于 P2PKH 的锁定脚本存储公钥的哈希值,P2PK 的锁定脚本存储的是公钥本身。

P2PK 锁定脚本形式如下:

<pubKey> OP_CHECKSIG

P2PK 解锁脚本形式如下:

<sig>

P2PK 组合脚本形式如下:

<sig> <pubKey> OP_CHECKSIG

从组合脚本可以看出,P2PK 只需要验证数字签名,不需要进行比特币地址比对,所以该脚本类型比 P2PKH 类型更简单。目前 P2PK 在运行老版本的挖矿软件中的币基交易里能看见,新版本都使用了 P2PKH。

交易实例:

Tx:
f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16
锁定脚本1:

04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c OP_CHECKSIG

锁定脚本2:

0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3 OP_CHECKSIG

解锁脚本(Input Script):

47304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901
G0D NE�i2��QIa�ӡ�_�?Ow2��$��H�_��A "���H`�������l��F""!�v� 

MS

多重签名(Multiple Signatures,MS)允许使用多个身份(即多个公钥)共同签署一笔比特币交易。需要注意,多重签名并不一定指多个用户来签署交易,也可能是同一个用户使用自己的多个公钥,总的来说就是可能由多方共同管理资产,或者为了资产不被盗用、侵占或丢失需要多个公钥来保证,或者是为了引入第三方来对交易进行担保。

多重签名的脚本规则:假设在锁定脚本里公钥的个数为 N,那么至少要提供其中M个公钥所对应的私钥签名才能解锁脚本,所以又称之为“M-N 多重签名”。比如3-5多重签名意味着锁定脚本中公钥总数为5,要成功解除锁定,激活交易,则需要不少于其中3个公钥所对应的私钥进行签名,只有这样才能使交易验证通过,花费这笔资金。目前比特币系统对多重签名中公钥数目设定为最多15个,用户可以自行选择1-2到15-15之间任意组合来构建多重签名,前提是 M 不大于 N。

M-N 多重签名的锁定脚本形式如下:

M <pubKey甲> <pubKey乙> ... <pubKeyN> N OP_CHECKMULTISIG

其中,N 是锁定脚本里的公钥总数,M 是要求解锁脚本中需提供的最少签名个数。

M-N 多重签名的解锁脚本形式如下:

OP_0 <sig1> <sig2> ... <sigM>

其中,OP_0 是个占位符,没有实际意义,OP_CHECKMULTISIG 会自动忽略这个前缀。

多重签名的组合脚本形式:

OP_0 <sig1> <sig2> ... <sigM> M <pubKey甲> <pubKey乙> ... <pubKeyN> N OP_CHECKMULTISIG

执行上述脚本时,只要解锁脚本中包含与锁定脚本里 N 个公钥中的任意 M 个对应私钥的有效签名,即可执行成功,满足花费条件。

比如 3-5 多重签名的组合脚本:

OP_0 <sig1> <sig2> <sig3> 3 <pubKeyA> <pubKeyB> <pubKeyC> <pubKeyD> <pubKeyE> 5 OP_CHECKMULTISIG

P2SH

P2SH,Pay-To-Script-Hash,支付到脚本哈希,它是一种功能强大的脚本类型,用于简化 MS 多重签名。

//以 2-5 P2SH多签为例:
锁定脚本(Output Scrpit)形式:
OP_HASH160 <RIPEMD160(SHA256(LockScript))> OP_EQUAL

解锁脚本(Input Script)形式:
<sig1> <sig2> <LockScript>

我们能看到,锁定脚本的<RIPEMD160(SHA256(LockScript))>输出为160位的哈希值,同时该算法RIPEMD160(SHA256())也是把锁定脚本编码成了一个比特币地址。P2SH 的地址是将这160位的哈希值通过 Base58Check 编码得到的。Base58Check 使用前缀0x05对其进行编码,编码后前缀变成字符'3',所以输出地址是3打头的话,我们可以说这是个 P2SH 地址。

P2SH 地址隐藏了复杂的锁定脚本信息,付款方拿到“3”打头的 P2SH 地址就可以像普通的“1”打头的地址一样向其发起转账。而无需关注里面的脚本。

实例

Tx: d3adb18d5e118bb856fbea4b1af936602454b44a98fc6c823aedc858b491fc13

锁定脚本:

OP_HASH160 b4acb9d78d6a6256964a60484c95de490eaaae75 OP_EQUAL

解锁脚本:

48304502204c3da378d8323a7233892b8050f738da69daf765ddc0d9815d9ad352286b70c2022100dff11c19338daa85ec5b124434de3b4378ebe8c56950348d5f66197af1d04f09014104910ae6c9b41b04d366ea54e920663c691843bb83ef7336cd6a0f79b0ac82ee38d2ca23a24adc2348d82c8ca13f0db885712493e89d88551118a7e80ff66ab23c
H0E L=�x�2:r3�+�P�8�i��e��ف]��R(kp�!

P2WSH

P2WSH,Pay-To-Witness-Script-Hash,支付到见证脚本哈希。它是支持隔离见证类型的 P2SH。

首先介绍什么是见证(Witness)和隔离见证(Segregated Witness, SegWit)。见证指的是锁定脚本和解锁脚本。我们知道锁定脚本与解锁脚本都是交易的一部分,顾名思义,隔离见证就是指将锁定脚本与解锁脚本中的部分内容从交易中分离出来,放入一个独立的数据结构中。隔离见证的原理不是本文的内容。

P2WSH 就是支持隔离见证的 P2SH,除此之外,基本相同。

解锁脚本(Input Script)形式:
无(在见证里)

锁定脚本(Output Script)形式:
OP_0 <hashOfRedeemScript>
其中,OP_0代表版本号为“0”,hashOfRedeemScript是赎回脚本的SHA256哈希值。

见证(Witness)形式:
//以 2-5 P2WSH多签为例
OP_0 <sig1> <sig2> 2 <pubKeyA> <pubKeyB> <pubKeyC> <pubKeyD> <pubKeyE> 5 OP_CHECKMULTISIG
其中,OP_0代表版本号为“0”。

在 P2SH 交易中常常会有多重签名验证,所以验证信息会占用更多空间,将这些信息移到原交易之外能更大程度的降低交易大小。

交易实例

Tx: dc33ffa9d4c392ea12f1e255f4149922201bd83c09df594cc07a49344a666822

锁定脚本1(P2SH):

OP_HASH160 4d9c2ed075a18b5727bf6819addbadc9b16e924f OP_EQUAL

锁定脚本2(P2WSH):

OP_0 701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d

解锁脚本:
无(在见证里)

见证(Witness):

304402204a6ae219a993e517a34ba3e0500cb0f4b0789dacb86e40b6ff45ae01f5b9a55e0220749fab44e465e6e1af90c66c11cd81d5effe2a6b288b93a0897135b10ac3e48801 304402205b8399de8b5a41b4564e28f8686bb91a6ad9d88c3fe0e7c9ed7ac850e6dc3b2502206534fe8d15ad5da69c565d8bc68efcaae5e917db69b6bf1849cd6edadce7056f01 52210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae

P2WPKH

P2WPK,Pay-To-Witness-Pub-Key-Hash,支付到见证公钥哈希。

首先介绍什么是见证(Witness)和隔离见证(Segregated Witness, SegWit)。见证指的是锁定脚本和解锁脚本。我们知道锁定脚本与解锁脚本都是交易的一部分,顾名思义,隔离见证就是指将锁定脚本与解锁脚本中的部分内容从交易中分离出来,放入一个独立的数据结构中。隔离见证的原理不是本文的内容。

P2WPKH 就是支持隔离见证的 P2PKH,除此之外,基本相同。

锁定脚本(Output Script):
OP_0 <pubKeyHash>
其中的第一个OP_0是指代脚本版本号为“0”,有了版本号,未来升级后可以实现向前兼容;pubKeyHash是160位公钥哈希值,具体是RIPEMD160(SHA256(pubKey))

解锁脚本(Input Script):
无(在见证里)

见证(Witness):
<sig> <pubKey>

可见 P2WPKH 较 P2PKH 要精简不少,P2WPKH 的解锁脚本为空,而真正的解锁脚本内容被移到了原交易之外的 witness 部分。

交易实例:

Tx: 14d59b8e537210c11978d5900f9969230b7aadf5b5d41ff469d5bc8d4ff7b150
这是一笔锁定脚本为 P2PKH 和 P2WPKH 类型,见证为 P2WPKH 的交易。

锁定脚本1(P2PKH):

OP_DUP OP_HASH160 bfc085303e45fbd1eac1032aa6e662c27f4220a2 OP_EQUALVERIFY OP_CHECKSIG

锁定脚本2(P2WPKH):

OP_0 e2f8b29691593f27b9e63afa4a4534e2fbd3f232

解锁脚本:
无(在见证里)

见证(Witness):

3044022002bda535bf84b99df57c913e9df5099130483bae352cb77a7f10e35c5eb7d94802202e8990f2db2ca3c1293927ed4600ad2a69dc24ac86bca8b0f79fc7d751546c2301 023ed8ed6ccc39614e79a02c579bd50329fe83334849add337b858622cde4e80a8

OP_RETURN

OP_RETURN 是个很有趣的脚本操作符,用于将交易输出标记为无效。

任何非零金额的 OP_RETURN 输出,都不可消费。任何节点在验证交易时,一旦读取到 OP_RETURN,就会立即终止,从而所有带有 OP_RETURN 的输出都是不可花费的。因此 OP_RETURN 输出可用于销毁(burn)比特币,这样的操作相当于在 Ethereum 链,将币打入黑洞地址一样。

形式:
OP_RETURN [data]

我们称这是一个数据记录输出(Data Recording Output),这笔交易也被称为 OP_RETURN 交易,或 Null Data 交易。

data的长度限制是80字节。

OP_RETURN 输出,会随交易一同被写到账本中,但不会被当成 UTXO,不会带来 UTXO 集的膨胀,所以其金额通常为0。如果很不幸,金额不为0,那么这笔比特币将永远无法被任何人花掉。

需要注意的是,一笔标准交易,规定最多只能有一个 OP_RETURN 输出。

实践中,OP_RETURN 可用于证明资产所有权、锁仓挖矿、区块链表白等。

实例

Tx: 8bae12b5f4c088d940733dcd1455efc6a3a69cf9340e17a981286d3778615684

原文链接:https://www.cnblogs.com/hhzm/p/16205207.html

这篇关于Bitcoin 标准交易脚本类型:介绍的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!