zoukankan      html  css  js  c++  java
  • 【区块链整理】二、比特币交易脚本

    比特币规定客户端可运行五种标准交易脚本,分别为 P2PKH、P2PK、P2SH、MS 和 OP_Return,不同的脚本对应着不同的特性和用途。

    <比特币交易脚本基于堆栈的执行语言>

    1. P2PKH(Pay to Public Key Hash)

    该脚本为比特币网络大多数交易所采用的交易脚本。该脚本包含一个锁定脚本,对交易输出进行锁定,即公钥和对应的公钥哈希(PKH)。该脚本锁定的输出通过键入公钥和经相应私钥创设的数字签名解锁。

    锁定脚本

    假如 Bob 给 Alice 转账 0.1 BTC,Bob 会在交易中创建一个输出脚本:

    OP_DUP OP_HASH160 < Alice Public Key Hash > OP_EQUAL OP_CHECKSIG

    脚本对输出交易解锁条件需要提供签名和公钥,因为签名是用户私钥生成,所以仅 Alice 能够创建解锁该脚本的验证签名。

    解锁脚本

    Alice 花费该交易 0.1 BTC 时,提供相应的解锁脚本:

    < Alice Signature > < Alice Public Key >

    合并脚本

    脚本合并,解锁脚本在前,锁定脚本在后:

    < Alice Signature > < Alice Public Key > OP_DUP OP_HASH160 < Alice Public Key Hash > OP_EQUAL OP_CHECKSIG

    此脚本根据逆波兰表达式进行计算

    脚本执行步骤

    1.  Alice Signature, Alice Public Key 压入栈;
    2. OP_DUP 复制栈顶元素并压入栈顶;
    3. OP_HASH160 计算栈顶元素的哈希值,并将结果压入栈顶;
    4. Alice Public Key Hash  操作数直接压入栈顶;
    5. OP_EQUAL 对两个操作数判断,相等则通过;
    6. OP_CHECKSIG 对公钥和签名进行检查,确认签名是由公钥对应的私钥生成的,执行完毕结果压入栈中。

     仅当解锁脚本与锁定脚本相匹配时,组合脚本执行结果才会为 True ,即解锁脚本提供了 Alice 的有效签名。

    2. P2PK(Pay to Public Key)

    该模式是比较简单的交易脚本模式。相对于 P2PKH ,未对公钥进行哈希,所以可能会泄露用户公钥。Coinbase 的交易常使用该模式。

    锁定脚本

    锁定脚本形式如下:

    < Public Key > OP_CHECKSIG

    解锁脚本

    解锁脚本仅包含一个操作数,即使用者签名

    < Signature of A >

    组合脚本

    组合脚本形式如下:

    < Signature of A > < Public Key > OP_CHECKSIG

    调用 OP_CHECKSIG 操作符,对经过用户 A 的私钥的签名和 A 私钥对应的公钥进行验证,结果为真即通过校验。

    3. P2SH(Pay to Script Hash)

    该脚本仅记录20字节的脚本哈希,从而对具体的脚本细节进行了保护。需要使用通过该类脚本锁定的 UTXO 时,出示对应哈希值的原始脚本,并保证脚本运行结果为真。

    锁定脚本

    锁定脚本形式如下:

    HASH160 PUSHDATA (目标脚本哈希) EQUAL

    解锁时提供对应的目标脚本。

    4. 多重签名(Multi-Signature)

    多重签名提供的解锁场景:在相关的 N 个公钥中,需要提供 M 个公钥对应的签名,才可以对相应的 UTXO 进行解锁。此脚本在涉及多方协商交易的场景下较为有效。其中 N 为公钥总数,M 为至少提供的签名数量。

    锁定脚本

    多重签名锁定脚本形式如下:

    M < Public Key 1 > < Public Key 2 > ... < Public Key N > N OP_CHECKMULTISIG

    解锁脚本

    解锁脚本形式如下:

    OP_0 < Signature k > < Signature j > ...

    锁定脚本和解锁脚本结合,即可对提供的签名进行验证,达到多重签名锁定的目的。

    5. 数据记录输出(OP_Return)

    数据记录输出脚本主要用于对比特币功能的拓展。开发者可通过该脚本添加80字节的非交易数据信息。

    在P2PKH(pay to pubKey hash)交易中,可以将output里的验证脚本换成其它数据。这么做会导致这笔交易里的比特币不能再被花费,因为很难再找到满足条件的调用脚本(需要反求哈希)。缺点是,未被花费的交易(UTXO)都会被存储在内存中,因此这种交易就会占用许多内存空间,影响比特币网络的效率。

    所以,我们可以使用比特币的 OP_RETURN 指令。包含这一指令的交易也是不可花费的,但节点可以将其安全地移出UTXO集合,这笔交易可以在 OP_RETURN 中存储一定数量的字节。

    参考资料:

    《区块链技术及应用》——华为区块链技术开发团队

    ----------------------------------------声明----------------------------------------
    作者:xsmile
    仅自己学习过程技术总结,如有哪里有误的地方,欢迎指正。
    原创不易,如需转载,请注明出处及地址 www.cnblogs.com/xsmile
    ----------------------------------------end----------------------------------------
  • 相关阅读:
    C语言实现五子棋简单功能
    C语言学习笔记——堆和栈——未整理
    《C和指针》章节后编程练习解答参考——第10章
    华为06年面试题——求交换数组元素后差值最小方案
    丢沙包游戏(或杀人游戏)的C语言实现
    《C和指针》章节后编程练习解答参考——第9章
    PHP函数:array_key_exists
    PHP函数:php_sapi_name
    PHP函数:json_last_error
    PHP函数:func_num_args
  • 原文地址:https://www.cnblogs.com/xsmile/p/14752320.html
Copyright © 2011-2022 走看看