交易是如何被创建和打包的6

昨天写了签名的操作,今天来看下脚本的验证。原型如下:

介绍一下这几个参数

第一个:就是存储着签名信息

第二个:就是锁定脚本

第三个:就是一个标志(脚本检查标志位)

第四个:脚本检查的类引用

第五个:脚本错误信息对象指针(默认是为false)

接着来看函数主体,首先设置脚本的错误信息,默认是serror是NULL,所以没有赋值这个未知的错误(SCRIPT_ERR_UNKNOWN_ERROR)。

然后根据脚本标志与上标志(SCRIPT_VERIFY_SIGPUSHONLY),调用签名对象的IsPushOnly()函数,脚本操作符不能超过OP_16,否则就是失败。它是非图灵完备的。校验时也是需要push操作。

然后需要两个栈对象,剩下的就是入栈操作了,如果是SCRIPT_VERIFY_P2SH这种类型的话,需要复制一份给copy栈,这种类型的脚本本身就是一个哈希,就是多重签名类型的简化版。然后就是把锁定脚本就行入栈操作验证。验证过程发生在EvalScript();函数中,具体是读取每个操作符并进行执行操作指令。这里就不在解释。

如果栈空了,错误类型设置为(SCRIPT_ERR_EVAL_FALSE)类型,接着判断调用CastToBool();这个函数就是获取签名和锁定脚本是不是有对应的关系的,它对栈进行遍历,如果栈顶为0表示签名失败的,如果栈顶返回的是true,说明签名正确,它确实是锁定的脚本的钥匙,也就是说,你对这笔交易输出拥有使用权。

接着往下看,如果交易是类型TX_SCRIPTHASH,标志是SCRIPT_VERIFY_P2SH的,再判断锁定脚本是否是脚本哈希类型的。不是直接进行下一步,是的话,就重复上面的步骤进行验证,这是TX_SCRIPTHASH类型,所以锁定脚本要对锁定在进行一次验证,也就是评估。

如果发生错误信息,同上全部写入serror对象里面。

传入的标志类型。

默认最后是两个关于标志的和栈大小的判断。

最后返回return set_success(serror);我们知道如果没有错误信息写入到seeror,这个一直是为NULL,所以,当它为NULL,反而返回的true,自此,整个交易的创建的结束。剩下的就是交易的提交,和如何进交易池,和被矿工打包进块了。任务还是很繁重啊。

你可能感兴趣的:(交易是如何被创建和打包的6)