交易校验与交易脚本

这里写图片描述

校验与脚本

交易校验是基于对脚本语言的执行结果的判断。
交易校验引擎依赖于两种类型的脚本:
* unlocking script
* locking script
当一个交易被校验有效时,每个输入的unlocking script会与对应的locking script一起被执行,以判断他们是否满足给定的要求(花费条件)。
script是用来使可编程货币的校验生效的。
未花费的交易会永远记录在链上,因此它是不可变的,校验失败的交易不会影响已有的有效的交易。只有有效的校验会使得输出的结果被认为是已经“花费“了,且把对应的原UTXO(unspent transaction output)从UTXO set总移除。

交易脚本

交易脚本语言包含许多操作符,但没有循环或复杂的流程控制功能(仅有条件判断)。每一个交易会被链上所有的full node校验。
交易脚本语言是无状态的,在脚本执行前不会有前置状态,在执行后也不会保存结果状态。因此,脚本执行所需要的信息全都包含在脚本自身。同一脚本对于任何系统执行效果都是可以预知的。

locking script是实际上一个放置在输出的可花费条件:它指定欲花费通货需要满足的条件。也会称为scriptPubKey,因为它通常包含一个公钥或地址(公钥的hash)。
unlocking script是用来满足locking script种指定的要求的,unlocking script的结果会作为locking script的输入。

unclocking script是交易输入的一部分。通常他们会包含一个由私钥生成的数字签名,因此,他们也称为scriptSig。
每一个正在校验的node都会通过执行locking script和unlocking script来校验交易。每一个输入都会包含一个unlocking script和已存在的UTXO的引用。校验过程会把unlocking script拷贝出来,且通过UTXO引用,获取对应的locking script,接着执行unlocking script和locking script。unlocking script和locking script的执行结果为TURE的话,对应的输入就被校验为有效。交易种所有的输入都被校验为有效的话,则交易被校验为有效。

执行堆栈

区块链脚本语言也称为基于堆栈的语言。它会从左到右顺序执行脚本中的项。
当脚本(unlocking script + locking script)执行结束时,栈顶数据为非0值或堆栈为空,校验过程视为valid;栈顶数据为0值或执行过程中断则校验过程视为invalid。

P2PKH(Pay-To-Public-Key-Hash)

这里写图片描述
比特币中的交易输出就是使用P2PKH格式的。
P2PKH输出通常包含一个比特比地址,可以通过构建包含相应public key和根据相应私钥生成(ECDSA)的签名的unlocking script解锁。

签名哈希类型

区块链签允许多个用户和多个输入。
签名(signature)隐含了签名者(signer)对交易的承诺(commitment)。
比特币签名可以通过设置不同的SIGHASH标志来指示哪一个部分的数据被包含在数字签名中。

下面前三个标志是互斥的,第四个标志可以与前三个标志组合:
* ALL(0x01) 对应所有输入和输出的签名
* None(0x02) 应用到所有输入
* SINGLE(0x03) Signature applies to all inputs but only the one output with the same index number as the signed input
* SIGHASH_ANYONECANPAY(0x08) 可以与前面三个中的一个组合在一起。只对一个输入进行签名,其余输入不变。
这里写图片描述
SIGHASH类型在交易签名前就已经被添加到交易中了,所以它不能被更改。

猜你喜欢

转载自blog.csdn.net/bnbjin/article/details/82594823