区块链比特币交易中锁定脚本与解锁脚本_P2PKH

区块链锁定脚本与解锁脚本

    • 钱包
    • 一笔交易
    • 输入脚本(解锁脚本)
    • 输出脚本 (锁定脚本)
    • 验证过程

本篇文章主要说明一下区块链中常用的交易脚本是什么,如何通过交易脚本来验证你是不是这笔钱的所有者。

钱包

先说一下钱包中 私钥 > 公钥 > 公钥Hash > 地址的关系,在后面中利于理解脚本如何实现验证的。请看下图:
区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第1张图片
图片来自网上,通过上图我们可以看到 他们之间的关系。私钥通过算法生成公钥,但公钥是不能通过计算得出私钥,也就是不可逆的。公钥的哈希值可以得到钱包地址,钱包地址可以逆向得出公钥的哈希。

一笔交易

我们先来看一下比特币中一笔交易的结构。店小二上图:
区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第2张图片

这笔信息是在BitCoin的客户端通过命令得到的,我们解释几个我们关注的点:

  1. txId : 交易的Hash值
  2. vin : 交易的输入。可以有多个输入,每一个输入都说明了他是引用的哪一比交易的输出。这里可以理解为 我本次交易的钱是从哪来的。
  3. vout: 交易的输出,可以有多个,本次交易的钱我可以转给多个不同的地址,包括给自己找零的钱。可以理解为 我本次交易的钱都给了哪些人。

输入脚本(解锁脚本)

区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第3张图片

  1. txid:引用的交易id.这里及指明了我的钱是从这笔交易来的
  2. vout: 在交易中第几个vout是我的。这里是vout的索引 ,0 也就是第一个
  3. scriptSig > asm : 解锁脚本 这个信心包含以下两个内容
    sig 我的私钥对 txid 的加密,这里的txid是我引用的交易
    PubKey 我的公钥

输出脚本 (锁定脚本)

区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第4张图片

  1. value: 我要支付的钱金额
  2. scriptPubKey :
    addresses: 收款人的地址
    asm: 锁定脚本
    . OP_DUP OP_HASH160 b8c1475c5289924394284559b20f524bb015cf5f OP_EQUALVERIFY OP_CHECKSIG
    上面的每一个操作码都有固定的含义对应着需要做不同的操作。有的做加法运算,有的减法,有的是做加密运算。总之你可以理解为 不同的操作码 有不同的用处。如果想了解更多的信息 查看比特币脚本语言官网 https://en.bitcoin.it/wiki/Script。
操作码 含义
OP_DUP 复制一份栈顶元素
OP_HASH160 对栈顶元素 SHA256/RipeMD160,实际上是计算一个公钥的Hash
b8c14…5cf5f 这里是一条数据。这个数据就是通过收款人地址逆向得到的公钥Hash。前面我们说过地址与公钥hash的关系。这里很重要,我们给某人转钱实际是 把钱锁定到对方的地址上。因为地址和公钥hash 是公开的 ,
OP_EQUALVERIFY 这条指令会比较栈顶的两个元素是否相等
OP_CHECKSIG 验证签名

验证过程

在我们理解了上面描述的后。那脚本到底是怎样验证的的。
我向某人转账,在我本地的比特币客户端中产生了一条这样的数据:
区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第5张图片
本地比特币客户端会把这条数据向外扩散,传播。让每一个比特币客户端都知晓我的这一笔交易,这样这笔交易才是有效的。他如何验证这笔交易的有效性:
区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第6张图片
如图所示,他会把我的本次交易的 输入脚本 scriptSig 和 我引用交易的 输出脚本(别人转给我的钱)组合起来验证。这笔钱我能不能用 是不是我的。最后组合出下图:
区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第7张图片
把这一整串脚本 一个一个放入到栈中,可以理解为把每一个数据放入一个竖立着的桶中。下面我们来一步一步说明:

  1. 把sig放入桶中
    区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第8张图片

  2. 把公钥放入桶中
    区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第9张图片

  3. 把桶中最上边的元素复制一份,也就是把公钥复制一份
    区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第10张图片

  4. 对复制出的公钥做hash运算
    区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第11张图片

  5. 把锁定脚本中的公钥Hash放入桶中
    区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第12张图片

  6. 验证桶中最上边的两个值是否相等,如果相等则会消失。不相等本次验证结束,验证失败。在这里是最重要的,咱们前面说过公钥Hash不能推算出公钥,你必须提供出正确的公钥Hash 才能与锁定脚本中的公钥Hash相等。你也许会想公钥都是公开的,我一个一个的试不就行了 ?最后一步
    区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第13张图片

  7. 我提供的公钥是否能验证Sig,验证正确则返回true.。sig前面说过是通过私钥加密的txid。这里你可就没有办法靠猜去蒙了。
    区块链比特币交易中锁定脚本与解锁脚本_P2PKH_第14张图片
    到这里我们的交易验证成功后,别的节点会以相同的方式传遍网络。
    我的理解就是:别人给我钱的时候,在钱上加了一把锁 只有拿这把钥匙的人才能打开这把锁。

你可能感兴趣的:(区块链)