概述
这里主要用于补充区块链重要基础知识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 <Cafe space Public space Key space Hash> 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 > <Cafe space Signature> space <Cafe space Public space Key> <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 | 一个字节空串被压入堆栈 |
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<Mohammed′s PublicKey><Partner1 PublicKey><Partner2 PublicKey><Partner3 PublicKey><Attorney PublicKey>5 OP_CHECKMULTISIG
虽然多重签名十分强大,但其使用起来还是多有不便。多重签名导致过长的公钥,使得脚本也不断增加长度,那么一个长的交易脚本将一直记录在所有节点的随机存储器的UTXO集中1,直到该笔资金被使用。所有这些都使得在实际交易中采用复杂输出脚本显得困难重重。
2.2 P2SH
P2SH就是为了解决这一难题而诞生,同时它所使用得方法思想也一直在影响我们对签名认证的处理,当一个签名过程时,我们都会试图通过对其进行hash处理,
在P2SH交易中,锁定脚本由哈希取代,哈希指代的是赎回脚本。因为它在系统中是在赎回时出现而不是以锁定脚本模式出现。
2.2.1 使用P2SH与不使用对比
-
不含P2SH的复杂脚本
Locking Script 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG Unlocking Script Sig1 Sig2 -
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锁定的哈希)和必要的解锁签名即可
如:
< 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 > <Sig1> <Sig2> <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>
两个脚本经由两步实现组合:
- 将赎回脚本与锁定脚本比对以确认其与哈希是否匹配——进行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 <redeem space scriptHash> OP_EQUAL <2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG> OP_HASH160 <redeem scriptHash>OP_EQUAL
- 假如赎回脚本与哈希匹配,解锁脚本会被执行以释放赎回脚本——匹配好了之后,释放赎回脚本,将公钥信息放出来: < 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 <Sig1> space <Sig2> 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. 优点
- 在交易输出中,复杂脚本由简短电子指纹取代,使得交易代码变短(那么对比时间就会大大减少,只是传输时间不变而已,因为确认之后依旧要传输公钥信息等)。
- 脚本能被编译为地址,支付指令的发出者和支付者的比特币钱包不需要复杂工序就可以执行P2SH。
- P2SH将构建脚本的重担转移至接收方,而非发送方。
- P2SH将长脚本数据存储的==负担从输出方(存储于UTXO集,影响内存)转移至输入方(仅存储于区块链)==。
- P2SH将长脚本数据存储的重担从当前**(支付时)转移至未来(花费时)**。
- P2SH将长脚本的交易费成本从发送方转移至接收方,接收方在使用该笔资金时必须含有赎回脚本。
参考文章:
1.UTXO交易模型
2.精通比特币.第五章.第七节
(Unspent Transaction Outputs)是未花费的交易输出,它是比特币交易生成及验证的一个核心概念。交易构成了一组链式结构,所有合法的比特币交易都可以追溯到前向一个或多个交易的输出,这些链条的源头都是挖矿奖励,末尾则是当前未花费的交易输出。 ↩︎
最后
以上就是清秀香水为你收集整理的区块链重要基础知识7-1——标准脚本P2PKH、P2SH1.P2PKH2.P2SH的全部内容,希望文章能够帮你解决区块链重要基础知识7-1——标准脚本P2PKH、P2SH1.P2PKH2.P2SH所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复