主页 > imtoken安卓app下载 > 深入比特币原理(五)——高级交易和脚本

深入比特币原理(五)——高级交易和脚本

imtoken安卓app下载 2023-04-18 05:23:16

【摘要】 多重签名交易允许同一笔交易输出需要多个私钥解锁,即锁定脚本设置条件,记录了N个公钥(注意不是公钥哈希)在脚本中,至少要提供M个签名才能解锁,也称为M-N方案。

一、多重签名交易

多签交易允许同一笔交易输出需要多个私钥才能解锁,即加锁脚本设置条件,有N个公钥(注意不是公钥哈希)记录在脚本中,其中至少 M 必须提供签名才能解锁,也称为 M-N 方案。 N是密钥总数,M是验证所需的签名数。

锁脚本的一般形式是:

M

...

N CHECKMULTISIG

锁脚本示例:2-3 多重签名条件

2

3 检查多重签名

解锁脚本示例:

由于比特币代码中的错误,第一个数字需要用 0 填充。调用时,将从堆栈中取出一个额外的数字。取出后立即扔掉,不再用于后续操作。这个数字的值是什么无关紧要,但不能从堆栈中丢失,否则无法正常执行CHECKMULTISIG。修复此代码将导致比特币分叉,因此现在通过添加 0 来避免。

最终实际解锁脚本验证如下:

0 2

3 检查多重签名

二、P2SH(Pay-to-Script-Hash)

多重签名会出现以下问题:

1. 交易臃肿,交易的输出中必须包含N个公钥(在lock脚本中),这增加了交易的大小,增加了交易费用,同时也增加了交易的手续费。矿工维护 UTXO 的负担。

2.支付用户必须根据你提供的所有公钥信息在交易中自定义锁定脚本,给支付带来极大的不便。

这里展开分析为什么多重签名需要定制,而P2PKH却不需要?

1.P2PKH 的锁定脚本包含公钥哈希。公钥哈希可以通过比特币地址进行解码,所以只要知道比特币地址,就可以正常生成锁脚本。付钱。

2.多重签名锁定脚本需要包含N个公钥。从一个地址获取所有公钥是不可能的,因此必须自定义锁定脚本。

P2SH的出现就是为了解决多重签名的这些问题。 P2SH 增加了 Redeem Script 的概念。 P2SH 脚本内容示例:

兑换脚本:2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 CHECKMULTISIG

锁定脚本:HASH160 EQUAL

解锁脚本:Sig1 Sig2

从脚本内容可以看出,加锁脚本从原来的多重签名锁脚本变成了原来脚本的hash,赎回脚本的内容就是原来的多重签名锁脚本的内容,并且将兑换脚本的内容添加到解锁脚本中。

所以执行情况变成如下:

1.先对比解锁脚本中赎回脚本的内容hash是否与加锁脚本中的一致

Sig1 Sig2 HASH160 等于

2.如果以上对比结果一致,则执行以下(回到多脚本验证的情况)

Sig1 Sig2 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 CHECKMULTISIG

注意:P2SH会使用P2SH地址比特币交易流程图,地址内容为兑换脚本hash的base58check编码结果,P2SH地址版本前缀为0x05,编码后的地址以“3”结尾,如关注

深入比特币原理(五)——高级交易与脚本_区块链

P2SH 的好处:

1.简化加锁脚本,减少事务占用空间

2.P2SH地址让付款人无需关心复杂的操作,只需支付到地址

3.P2SH 将多重签名脚本的负担转移给收款人,而不是付款人

(1)多重签名导致的交易规模膨胀依然存在,只是从加锁脚本转移到解锁脚本。

(2)只有在P2SH地址上的比特币需要解锁支付时才会发生,延迟了交易占用大量空间的时间。

(2)交易大小导致交易速度变慢、交易手续费增加等负担转嫁给收款人。

三、数据记录输出(返回)

比特币去中心化和分布式数据库的特性,让很多开发者开始使用交易脚本进行支付以外的尝试,比如数字公证服务、证券证明、智能合约等。

基于以上需求,出现了RETURN命令,它可以用于特定范围的数据,并记录在比特币区块链中进行永久存储。它具有以下特点:

1.RETURN命令的输出不能用于支付,所以不是比特币应该包含在RETURN输出中。尝试将 RETURN 的输出作为输入的交易将被视为无效。

2.RETURN的数据大小限制为80bytes,通常包含hash值(如SHA256结果)和服务内容的前缀(如Proof of Existence前缀为8字节的DOCPROOF )。

3.使用RETURN的输出不会存入矿工的U TXO是中心化的,避免内存占用,但会写入区块链。

RETURN 脚本示例

scriptPubkey:返回

脚本签名:

从脚本中可以看出,输入脚本通常为NULL

四、时间锁

Timelock主要用于延迟支付,即指定一笔交易或UTXO在某个区块高度或时间戳支付或可以使用。

1.交易时间锁(nLocktime)

比特币交易中有一个“locktime”参数,用于指示交易何时广播到比特币网络中

0 < locktime < 500million:代表区块高度(block height)

locktime >= 500million:表示时间戳(Unix 时间戳从 1970-1-1 开始)

事务时间锁的特点:

交易时间锁要求交易在指定时间后广播到全网,所以在时间到达区块链之前,该交易不包含在区中。因此,如果付款人在时间到达之前发起另一笔交易,双花并产生相同的输入,之前的交易实际上将失效,让收款人没有任何保证。

但是因为这个特性,给了付款人考虑的时间,如果付款人后悔交易,可以阻止交易生效。

2.Check Lock Time Verify(简称CLTV)

CLTV是一个基于UTXO的时间锁,可以通过P2SH中的脚本(redeem script)进行赎回,添加CHECKLOCKTIMEVERIFY命令来查看时间。将时间锁写入脚本确保UTXO被锁定,在达到锁定时间之前,任何人都无法使用UTXO。

CLTV兑换脚本示例:

CHECKLOCKTIMEVERIFY DROP DUP HASH160 EQUALVERIFY CHECKSIG

解锁前需要先验证,如果验证成功则删除,正常执行解锁脚本。

以下情况会导致验证失败:

1.堆栈为空

2.小于0

3.栈顶项()的锁定时间类型(区块高度或时间戳)与nLocktime字段不同

4.栈顶项大于交易的nLocktime字段

5.输入的nSequence字段为0xffffffff

从失败情况可以发现,在CLTV交易中,nLocktime字段还是需要设置的,而且必须大于CLTV时间,时间类型需要一致。

至此比特币交易流程图,我们已经了解了比特币上主要的高级交易类型。随着时间的推移,比特币脚本的能力将被进一步挖掘,比特币将通过脚本进一步转移到区块链上。”平台”开发。

如果您有兴趣,可以查看块中的信息。如果你看到如下输出无法解码,说明它不是标准交易,很可能是用于货币以外的其他用途。

深入比特币原理(五)——高级交易与脚本_区块链_02