区块链:2比特币 交易脚本

Posted DonquixoteXXXXX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链:2比特币 交易脚本相关的知识,希望对你有一定的参考价值。

区块链:2、比特币 交易脚本

比特币使用一种简单的、基于堆栈的语言来描述比特币应用和传输方式。该语言缺少图灵完备性且不包含训话结构,以避免在比特币网络上长期运行/悬挂脚本时产生的不良影响。
这种脚本语言基于一种类似于 Forth的语法,并使用一个逆波兰标记。其中,每个操作数均由其操作符执行,同时按照从左到右的顺序,并使用一种 “后进先出”(LIFO)堆栈进行评估。

脚本使用各种操作码或指令来定义操作。操作码也称作字、命令或函数。早期版本的比特币节点中包含了操作码。
然而,鉴于其设计问题,这一类操作码已不再使用。脚本代码的各种类型一般定义为常量、 流控制、堆栈、位逻辑、连接和算术、加密和锁定时间。

一、锁定脚本&解锁脚本

比特币交易验证依赖于锁定脚本解锁脚本这两类脚本。

锁定脚本代表了花费条件或者说需要解除的障碍,只有满足条件的用户才能无障碍地进行交易输人量中的UTXO的花费。

解锁脚本就是这个条件的答案,它允许交易新产生的UTXO被花费。

锁定脚本中常会包含比特币地址,以及利用私钥产生的数字签名,但并不是所有解锁脚本都一定包含数字签名。
节点通过堆栈形式执行锁定脚本和解锁脚本来验证一笔交易,首先检索交易输入的UTXO, UTXO中就包含了定义花费条件的锁定脚本,之后会验证解锁脚本,并执行。
但实际上,本次交易输入的UTXO是上一笔交易产生的输出,可以用一系列单输入/单输出交易对该过程进行模拟。

如图:当前交易的输人都引用了前一笔交易的输出。

当Bob想要利用交易a中输出的比特币用于支付Carol需要的费用时,就需要解开Alice在交易a的输出脚本,也就是锁定脚本,Bob会在交易b的输人脚本,即解锁脚本中给出题解。
这种类似于题目和答案的关系,在图中箭头对应的输人和输出才是真正的一对锁定脚本和解锁脚本。

比特币在交易中使用的是脚本系统,它基于堆栈,从左至右处理,脚本语言被设计为非图灵完备的,没有LOOP语句。在交易输人中使用了用于解锁UTXO的Signature Script,在交易输出中使用了锁定脚本PubKey Script。

针对使用的Signature Script 和PubKey Script的不同,可以将比特币网络中的标准交易分为以下几种类型:
P2PKH(paytopublic key hash)、P2PK(pay to public key)、MS( multiple signature) 、P2SH(pay to script hash)。

二、P2PKH

Sigscript: < sig>< PubKey >

PubKeyscript: OP_ DUPOP_ HASH160 < PubKey> OP_ EQUALVERIFYOP_ CHECKSIG

以刚才的单输人/单输出系列交易为例,在交易a中,Alice在交易的输出填写了Bob的比特币地址(对应公钥哈希),当Bob想要利用交易a产生的UTXO时,他必须要证明自己拥有该比特币地址对应的私钥,才能解开交易a的锁定脚本。因此Bob就在交易b的输人中加入了自己的公钥和利用私钥产生的签名,P2PKH的标准交易类型的脚本组合如图所示。

解锁脚本中主要有两个验证,一个是公钥是否能转换为正确的公钥哈希,一个是签名是否有效。如果两个验证均成功,也就是脚本被执行有效时,输出结果为OP_TRUE。

利用堆栈形式表示的具体流程大概如下:

(1)输入解锁脚本,因为脚本按照堆栈形式从左至右执行,那么先入栈的是签名,随后是公钥,如图

(2)执行解锁脚本,输入第一个指令OP_DUP(复制栈顶元索操作),将< PubKey >复制并存储,如图所示。

(3) OP_ HASH160:对栈顶元素< PubKey>进行哈希160计算,得到了公钥哈希< PubKHash>,如图所示。

(4)将解锁脚本中的公钥哈希字段< PubKHash >人栈,表示为< PubKHash’>,如图所示。

(5) OP_ EQUALVERIFY:判断栈顶两个元素是否相等,如果相等,则继续执行,否则中断执行,返回失败信息,如图所示。

(6) OP CHECKSIG:执行签名校验操作,判断签名信息和公钥是否匹配,如果相等,则返回成功,锁定脚本和解锁脚本匹配,能够执行花费操作;否则返回失败,如图所示。

三、P2PK

Sigscript: < sig>
PubKeyscript: < PubKey> OP CHECKSIG 

对比P2PKH,P2PK简化了验证过程,只剩一步验证签名过程,少了地址验证的步骤。

P2PK的核心仍然是P2PKH,其被创建的目的主要是使得验证简洁更加方便使用。

四、MS

Sigscript: OP_ 0<sig1><sig2>...<sigm>  //OP. _0为占位符,无实际意义;m为激活交易需要的最少公钥数

PubKeyscript: M < PubKey1 >< PubKey2 >...< PubKeyn>N OP_CHECKMULTISIG
//n为存档公钥总数

多重签名表示一个账户对应多个密钥,如果想要使用该账户对应的比特币,则需要有多个签名才能够完成。M-N多重签名中:
N指的是存档的公钥总数,也就是对应的密钥对数目;
M是要求激活交易的最少公钥数,其中需要满足N≥M。
通用的多重签名锁定脚本的形式为:

M< Public Key 1>< Public Key 2>...< Public Key N> N OP_ _CHECKMULTISIG

M和N可以被设定,假设M取2,N取3,即某个地址所代表的比特币有三个关联的密钥,只有拥有其中的两个或两个以。上的签名时才能花费这个比特币,这种情况下的2-3多重签名条件可以表示为:

2 < PublicKeyA >< PublicKeyB >< PublicKeyC> 3OP_ _CHECKMULTISIG

在具体验证过程中,每个公钥地址都需要被验证,譬如说在2-3多重签名中,验证脚本可以表示为:

OP_ 0< SignatureB >< SignatureC>
//OP_ 0为占位符,无实际意义

MN的组合可以自由设定,如1-3(存档公钥数为3,激活交易需要至少1个签名)、3-3(存档公钥数为3.激活交易需要3个签名)或者4-5(存档公钥数为5,激活交易需要至少4个签名)等.
但比较常见的还是2-3(存档公钥数为3,激活交易需要至少2个签名)多重签名。

多重签名对保护用户的账户安全有着深刻的意义。用户的私钥虽然不能被暴力破解,但还是存在被黑客攻击盗用的风险。多重签名保证了在用户的某个私钥丢失或者被盗的情况下账户中比特币的安全。
另外,多重签名在资产能够安全化管理方面有着重要作用,尤其是在暴露私钥的交易中,有效提高了账户的安全系数。多重签名代表在只有几方共同确认的情况下,账户资金才能被动用,这也有着广泛的实用场景,譬如说电子商务、财产分割、资产监管等方面。

五、P2SH

Sigscript: [signature][PubKey]OP_ CHECKSIG   //[PubKey]OP_CHECKSIG即redeemScript代码
PubKeyscript: OP_ HASH1 60[20-byte hashof[ PubKey]OP_ CHECKSIG]OP_ EQUAL

P2SH是MS多重签名的简化版本,在BIP16中进行了具体阐述,主要目的是容许发送者构造更加丰富的交易类型,其次是对锁定脚本使用了SHA-256哈希算法,将制作脚本的责任给了接收方,暂缓节点的存储压力。可以理解为只要提供一段script,当它的二进制哈希与目标匹配的情况下,款项就能够被使用。

参考文献

[1]魏翼飞.李晓东.于非(Fei Richard Yu).区块链原理、架构与应用.清华大学出版社

[2](美)伊姆兰·巴希尔.王烈征(译).精通区块链开发技术.清华大学出版社

以上是关于区块链:2比特币 交易脚本的主要内容,如果未能解决你的问题,请参考以下文章

区块链:2比特币 交易脚本

区块链学习交易

清华大学iCenter区块链公开课 第二节

比特币的交易过程

区块链: 技术驱动金融 - 第3章 比特币的运行机制

区块链比特币学习 - 1 - 交易