【比特币学习笔记】比特币交易脚本

比特币交易脚本

    • 比特币交易脚本概述
    • 比特币交易脚本中常用的指令
    • 简单数学运算的脚本执行过程
    • 比特币交易的脚本执行过程(以P2PKH交易为例)
    • 比特币交易脚本类型

比特币交易脚本概述

  • 脚本是区块链上实现自动验证、自动执行合约的重要技术。每一笔交易的每一项输出严格意义上并不是指向一个地址,而是指向一个脚本。
  • 脚本类似一套规则,它约束着接收方怎么花掉这个输出上锁定的资产。它分布运行在区块链网络的每一个节点上。
  • 交易的合法性验证全依赖于交易脚本。
  • 比特币中的交易脚本机制相对简单,是基于逆波兰表示法,基于堆栈式的解释相关OP指令的引擎。
    - 基于堆栈的语言的指令只按顺序执行一次,没有循环和跳转指令。是特意设置成图灵不完备的脚本语言。
    - 虽然比特币脚本规则不多,不能实现复杂的逻辑。但是它为区块链可编程提供了一个原型,后续的可编程区块链项目是基于脚本的原理发展起来的。
  • 以太坊智能合约就是深入增强了脚本机制。 脚本机制里不单单是简单的OP指令,而是一套图灵完备的脚本语言,该脚本语言可以通过‘虚拟机’执行。所以说比特币交易脚本是智能合约的雏形;以太坊则是实现了一个支持图灵完备性脚本语言的区块链平台。
  • 比特币脚本语言非常小,只有256个指令,每个指令一个字节长。这256个指令中75个是保留指令,15个已经废弃。 可用的有160多个。

比特币交易脚本中常用的指令

指令 指令词源 16进制字节码 功能说明
OP_DUP duplicate 0x76 复杂栈顶元素
OP_HASH160 hash 0xa9 弹出栈顶元素,先进行SHA-256哈希,再进行RipeMD160哈希处理,将结果压入栈。
OP_EQUALVERIFY equal verify 0x88 弹出栈顶两个元素,如果两个内容一致,则返回1,脚本继续执行。否则返回0,脚本中断执行。
OP_CHECKSIG check signature 0xac 弹出栈顶两个元素,用公钥检查输入中的签名,验证该签名是否拥有该公钥的用户用其私钥签署的。如果签名符合,则将true(true = 1) 压入栈顶。
OP_CHECKMULTISIG check multiple signature 0xae 用多个公钥检查多重签名的正确性。
OP_RETURN return 0x6a 标记交易无效
OP_PUSH 下面多少个字节要被压入堆栈
OP_TRUR/OP_1 数字1被压入堆栈
OP_FALSE/OP_1 一个字节空串被压入堆栈

简单数学运算的脚本执行过程

  1. 执行简单的数学运算,判断“2+3是否等于5”,写成脚本

    2 3 OP_ADD 5 OP_EQUAL
    

    脚本执行过程如下

    • 将常量2压入栈
    • 将常量3压入栈
    • 执行OP_ADD指令,弹出栈顶两个元素2和3,将其相加,相加后的结果压入栈顶
    • 将常量5压入栈顶
    • 执行OP_EQUAL指令,弹出栈顶两个元素5和5,判断两者是否相等。两者相等,则将true (true = 1)压入栈顶。
    • 任何解锁和锁定脚本的组合如果结果为真(TRUE),则有效。
  2. 较复杂的常量运算脚本:

    2 7 OP_ADD 3 OP_SUB 1 OP_ADD 7 OP_EQUAL
    
    1. 将常量2压入栈
    2. 将常量7压入栈
    3. 执行OP_ADD指令,弹出栈顶的两个元素2和7,将其相加,相加后的结构9被压入栈顶
    4. 将常量3压入栈顶
    5. 执行OP_SUB指令,弹出栈顶两个元素9和3,将两者相减,也就是9-3, 相减后的结果6倍压入栈顶
    6. 将常量1压入栈
    7. 执行OP_ADD指令,弹出栈顶的两个元素6和1,将其相加,相加后的结果7被压入栈顶
    8. 将常量7压入栈
    9. 执行OP_EQUAL指令,弹出栈顶两个元素7和7,判断两者是否相等。两者相等,则将true(true = 1)压入栈顶。

比特币交易的脚本执行过程(以P2PKH交易为例)

  1. A 向 B 转账,该笔交易的输出中包含以下锁定脚本
OP_DUP OP_HASH160OP_EQUALVERIFY OP_CHECKSIG 
  1. B 要使用这笔被A转账时锁定的资产,必须在交易输入中有相应的解锁脚本

  1. 将两个脚本结合形成组合验证脚本

    • 先执行输入脚本(解锁脚本),再执行输入脚本(锁定脚本), 脚本从左至右执行。
      OP_DUP OP_HASH160OP_EQUALVERIFY OP_CHECKSIG
    
  2. 组合脚本执行过程

    • 将B的签名sig 压入栈顶
    • 将B的公钥Public Key压入栈顶
    • 执行OP_DUP指令,复杂栈顶元素(即B的公钥),形成新的栈顶元素Public Key
    • 执行OP_HASH160指令。弹出栈顶元素Public Key,先进行SHA-256哈希,再进行RipeMD160哈希处理,将结果PubHash压入栈
    • 将B的公钥hash值压入栈顶,形成新的PubHASH2
    • 执行OP_EQUALVERIFY 指令,弹出当前栈顶两个元素PubkHash2 和PubHash,判断两者是否一致,如果两者内容一致,则返回1,脚本继续执行。否则返回0,脚本终端执行。
    • 执行OP_CHECKSIG指令。弹出当前栈顶两个元素sig和PubK,用PubK公钥对sig签名进行校验,验证该签名是否是拥有该公钥的用户用对应的私钥签署的。如果签名符合,则将true(true=1)压入栈顶。

比特币交易脚本类型

比特币交易目前中支持以下几种交易标准,分别是P2PK、O2PKH、P2SH和 Coinbase交易(挖矿交易)。早期交易通常是P2PK交易,后来以P2PKH为主,P2SH未来会有很多应用场景,Coinbase交易一直存在。

  1. P2PK(Pay to Public Key)
    - 支付到公钥的交易
    - 支付到pubkey的脚本中,锁定脚本中是接收方公钥本身,解锁脚本中是支付方的签名
    - 交易验证过程中就是用签名与公钥进行匹配校验。
    - 这在早期的比特币中很常见,最初是由矿工默认创建的脚本类型,现在的标准是使用P2PKH的脚本

  2. P2PKH(Pay to Public Key Hash)
    - 支付到公钥哈希的交易(支付到比特币地址的交易脚本)。这是最常见的交易类型
    - 支付到pubkeyhash的脚本中,锁定脚本中是接收方公钥的哈希,解锁脚本中是支付方的签名及公钥

  3. P2SH(Pay to Script Hash)
    - 支付到脚本哈希(支付到比特币多重签名地址的交易)
    - 该类交易的地址不是通常的地址,而是一个合成地址,需要几对公钥私钥一起生成合成地址
    - 在生成过程中可用指定,几对公钥私钥中至少有几个签名生效后,就可以消费该地址所指向的资金
    - 这种类型的交易可以实现多方资产管理,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。
    - 这里交易未来会有很多应用场景

    以上内容是观看千锋教育视频的学习笔记
    

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