区块链重要基础知识7-1——标准脚本P2PKH、P2SH

这里主要用于补充区块链重要基础知识7——比特币的运行机制中标准协议P2SH的说明
五大标准脚本分别为P2PKH、P2PK、MS(限15个密钥)、P2SH和OP_Return。

这里主要介绍P2PKH、P2SH,因为这两个比较常见。

1.P2PKH

Alice向Bob咖啡馆支付的案例。Alice下达了向Bob咖啡馆的比特币地址支付0.015比特币的支付指令,该笔交易的输出内容为以下形式的

1.1 锁定脚本(用堆栈实现hash值的对比):

O P _ D U P   O P _ H A S H 160   < C a f e   P u b l i c   K e y   H a s h >   O P _ E Q U A L   O P _ C H E C K S I G OP\_DUP \space OP\_HASH160 \space \space OP\_EQUAL \space OP\_CHECKSIG OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUAL OP_CHECKSIG
Cafe Public Key Hash即为咖啡馆的比特币地址,但这个地址不是基于 B a s e 58 C h e c k Base58Check Base58Check编码的,是十六进制

1.2 锁定脚本的解锁版脚本是:

< C a f e   S i g n a t u r e >   < C a f e   P u b l i c   K e y > \space <Cafe Signature> <Cafe Public Key>

1.3 判断

只有当解锁版脚本与锁定版脚本的设定条件相匹配时,执行组合有效脚本时才会显示结果为真(Ture)

也就是只有当解锁脚本得到了咖啡馆的有效签名,交易执行结果才会被通过(结果为真),该有效签名是从与公钥哈希相匹配的咖啡馆的私钥中所获取的。

1.4 图示

指令 指令词源 16进制字节码 功能说明
O P _ D U P OP\_DUP OP_DUP duplicate 0x76 复制栈顶元素
O P _ H A S H 160 OP\_HASH160 OP_HASH160 hash 0xa9 弹出栈顶元素,先进行SHA-256哈希,再进行RipeMD160哈希处理,将结果压入栈。
O P _ E Q U A L V E R I F Y OP\_EQUALVERIFY OP_EQUALVERIFY equal verify 0x88 弹出栈顶两个元素,如果两个内容一致,则返回1,脚本继续执行。否则返回0,脚本中断执行。
O P _ C H E C K S I G OP\_CHECKSIG OP_CHECKSIG check signature 0xac 弹出栈顶两个元素,用公钥检查输入中的签名,验证该签名是否拥有该公钥的用户用其私钥签署的。如果签名符合,则将true(true = 1) 压入栈顶。
O P _ C H E C K M U L T I S I G OP\_CHECKMULTISIG OP_CHECKMULTISIG check multiple signature 0xae 用多个公钥检查多重签名的正确性。
O P _ R E T U R N OP\_RETURN OP_RETURN return 0x6a 标记交易无效
O P _ P U S H OP\_PUSH OP_PUSH 下面多少个字节要被压入堆栈
O P _ T R U R / O P _ 1 OP\_TRUR/OP\_1 OP_TRUR/OP_1 数字1被压入堆栈
O P _ F A L S E / O P _ 1 OP\_FALSE/OP\_1 OP_FALSE/OP_1 一个字节空串被压入堆栈

区块链重要基础知识7-1——标准脚本P2PKH、P2SH_第1张图片
区块链重要基础知识7-1——标准脚本P2PKH、P2SH_第2张图片

2.P2SH

对应有锁定脚本与赎回脚本,这就是我们经常称它为赎回脚本的原因,其实就是hash匹配之后将原本的hash之前的值拿回来

2.1 最初的多重签名:

顾客的任何支付都需要至少两个签名才能解锁,一个来自Mohammed,另一个来自其合伙人或拥有备份钥匙的代理人。这样的多重签名机制能为公司治理提供管控便利,同时也能有效防范盗窃、挪用和遗失。带来的问题就是脚本特别长。
2 < M o h a m m e d ′ s   P u b l i c K e y > < P a r t n e r 1   P u b l i c K e y > < P a r t n e r 2   P u b l i c K e y > < P a r t n e r 3   P u b l i c K e y > < A t t o r n e y   P u b l i c K e y > 5   O P _ C H E C K M U L T I S I G \begin{array}{l} {\rm{2 < Mohammed's \space Public Key > < Partner1 \space Public Key > < Partner2 \space Public Key > }}\\ {\rm{ < Partner3 \space Public Key > < Attorney \space Public Key > 5 \space OP\_CHECKMULTISIG}} \end{array} 2<Mohammeds PublicKey><Partner1 PublicKey><Partner2 PublicKey><Partner3 PublicKey><Attorney PublicKey>5 OP_CHECKMULTISIG
虽然多重签名十分强大,但其使用起来还是多有不便。多重签名导致过长的公钥,使得脚本也不断增加长度,那么一个长的交易脚本将一直记录在所有节点的随机存储器的UTXO集中1直到该笔资金被使用。所有这些都使得在实际交易中采用复杂输出脚本显得困难重重。

a.付款前必须发送给
b.产生的脚本过长,保存在UXTO中
b.产生的脚本过长,保存在UXTO中
多重签名
每一位客户
1.使用产生脚本的比特币钱包软件
2.利用脚本来完成交易
3.多重签名组合导致过长的公钥
导致复杂脚本输出处理困难

2.2 P2SH

P2SH就是为了解决这一难题而诞生,同时它所使用得方法思想也一直在影响我们对签名认证的处理,当一个签名过程时,我们都会试图通过对其进行hash处理,

在P2SH交易中,锁定脚本由哈希取代,哈希指代的是赎回脚本。因为它在系统中是在赎回时出现而不是以锁定脚本模式出现。

2.2.1 使用P2SH与不使用对比

  1. 不含P2SH的复杂脚本

    Locking Script 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
    Unlocking Script Sig1 Sig2
  2. P2SH的复杂脚本

    Redeem Script 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
    Locking Script OP_HASH160 <20-byte hash of redeem script> OP_EQUAL
    Unlocking Script Sig1 Sig2 redeem script

2.2.2 脚本支付

1. 锁定脚本

一笔P2SH交易运用锁定脚本将输出与哈希关联,而不是与前面特别长的脚本所关联。使用的锁定脚本为:

O P _ H A S H 160   54 c 557 e 07 d d e 5 b b 6 c b 791 c 7 a 540 e 0 a 4796 f 5 e 97 e   O P _ E Q U A L OP\_HASH160 \space 54c557e07dde5bb6cb791c7a540e0a4796f5e97e \space OP\_EQUAL OP_HASH160 54c557e07dde5bb6cb791c7a540e0a4796f5e97e OP_EQUAL

这个P2SH等同于“向含该哈希的脚本支付”

2. 支付过程

顾客在向Mohammed公司支付时,只需在其支付指令中纳入这个非常简短的锁定脚本即可。当Mohammed想要花费这笔UTXO时,附上原始赎回脚本(与UTXO锁定的哈希)和必要的解锁签名即可

指令中纳入简短的锁定脚本
原始赎回脚本hash+必要解锁签名
顾客
Mohammed公司支付
花费顾客所给的交易

如:

< S i g 1 > < S i g 2 > < 2   P K 1   P K 2   P K 3   P K 4   P K 5   5   O P _ C H E C K M U L T I S I G > <2 \space PK1 \space PK2 \space PK3 \space PK4 \space PK5 \space 5 \space OP\_CHECKMULTISIG> <Sig1><Sig2><2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG>

两个脚本经由两步实现组合:

  1. 将赎回脚本与锁定脚本比对以确认其与哈希是否匹配——进行hash匹配: < 2   P K 1   P K 2   P K 3   P K 4   P K 5   5   O P _ C H E C K M U L T I S I G >   O P _ H A S H 160   < r e d e e m   s c r i p t H a s h > O P _ E Q U A L <2 \space PK1 \space PK2 \space PK3 \space PK4 \space PK5 \space 5 \space OP\_CHECKMULTISIG> \space OP\_HASH160 \space OP\_EQUAL <2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG> OP_HASH160 <redeem scriptHash>OP_EQUAL
  2. 假如赎回脚本与哈希匹配,解锁脚本会被执行以释放赎回脚本——匹配好了之后,释放赎回脚本,将公钥信息放出来: < S i g 1 >   < S i g 2 >   2   P K 1   P K 2   P K 3   P K 4   P K 5   5   O P _ C H E C K M U L T I S I G \space \space 2 \space PK1 \space PK2 \space PK3 \space PK4 \space PK5 \space 5 \space OP\_CHECKMULTISIG <Sig1> <Sig2> 2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG

3. 与比特币地址一样同样的优势——hash编译为地址

P2SH的另一重要特征是它能将脚本哈希编译为一个地址,Mohammed可以将该地址发送给他的客户,这些客户可以采用任何的比特币钱包实现简单支付,就像这是一个比特币地址一样。只是这里的地址能够对应到一组公钥也就是一个脚本

4. 优点

  1. 在交易输出中,复杂脚本由简短电子指纹取代,使得交易代码变短(那么对比时间就会大大减少,只是传输时间不变而已,因为确认之后依旧要传输公钥信息等)。
  2. 脚本能被编译为地址,支付指令的发出者和支付者的比特币钱包不需要复杂工序就可以执行P2SH。
  3. P2SH将构建脚本的重担转移至接收方,而非发送方。
  4. P2SH将长脚本数据存储的==负担从输出方(存储于UTXO集,影响内存)转移至输入方(仅存储于区块链)==。
  5. P2SH将长脚本数据存储的重担从当前**(支付时)转移至未来(花费时)**。
  6. P2SH将长脚本的交易费成本从发送方转移至接收方,接收方在使用该笔资金时必须含有赎回脚本

参考文章:

1.UTXO交易模型

2.精通比特币.第五章.第七节


  1. (Unspent Transaction Outputs)是未花费的交易输出,它是比特币交易生成及验证的一个核心概念。交易构成了一组链式结构,所有合法的比特币交易都可以追溯到前向一个或多个交易的输出,这些链条的源头都是挖矿奖励,末尾则是当前未花费的交易输出。 ↩︎

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