比特币交易中矿工检查交易单的细节

一笔交易包括输入部分和输出部分,假设A向B发起一笔转账,那么

in:A(pk,sig)

out:B(addr)

其中,someone.addr = HASH160(some.pk)

接下来,B要向C转账,那么

in:B(pk,sig)

out:C(addr)

矿工要检查以下两点:

1. H160(B.pk) = B.addr ? (地址和公钥是否相符)

2. B.pk \leftrightarrow B.sig ? (公钥和签名是否相符)

由以上两点即可得出地址和签名是否相符。

具体的检查过程如下:

<PushData><B.sig><PushData><B.pk>

<OP_DUP><OP_HASH160><PushData><B.addr><OP_EQUALVERIFY><OP_CHECKSIG>

OP是对数据进行操作的指令,经过汇编会变成0x76这种形式,为了防止<B.sig> <B.pk> <B.addr>中含有此类数字而被误认为是指令,故在其前面进行<PushData>这样的标记,<PushData>是16进制数,记录了后面数据的长度,通过一些手段使得<PushData>不会与汇编出来的指令产生重复。

基于堆栈的验证过程如下:

1. B.sig 入栈

2. B.pk 入栈

3.  <OP_DUP>复制栈顶,即B.pk

4. 令a = B.pk, 再令 a = Hash160(a), B.pk出栈

5. B.addr 入栈,b = B.addr, B.addr 出栈

6. 比较a 和 b,即为B.pk 和 B.addr

7.用B.pk解开B.sig的内容,进行验证,验证出的内容应该是交易单2的in替换为交易单1的out,然后对替换后的交易单2的整个in和out做哈希(也就是说,B在签名的时候就是这么做的)

这中间可能进行了一些简化


关于矿工收入

猜你喜欢

转载自blog.csdn.net/constanting1996/article/details/81169327
今日推荐