主页 > imtoken钱包注册 > 深入比特币原理(五)——高级交易与脚本

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

imtoken钱包注册 2023-07-12 05:13:57

1. 多重签名交易

多重签名交易允许为同一个交易输出解锁多个私钥,即锁定脚本设置条件。 脚本中记录了N个公钥(注意不是公钥哈希)做比特币数据的是什么工作,其中至少有M个必须提供签名才能解锁,也称为MN方案。 N 是密钥总数,M 是验证所需的签名数。

锁定脚本的一般形式是:

...

N 检查多重签名

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

2个

3 检查多重签名

示例解锁脚本:

由于比特币代码存在BUG,第一位需要补0。 调用时,会从栈中取出一个额外的数。 取出后,立即扔掉,不用于后续计算。 这个数的值是多少无关紧要,但是不能在栈上缺失,否则不能正常执行CHECKMULTISIG。修正这段代码会导致比特币分叉,所以现在加0就可以避免了

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

0 2

3 检查多重签名

2. P2SH (Pay-to-Script-Hash)

多重签名会存在以下问题:

1. 交易臃肿,N个公钥必须包含在交易的输出中(在锁定脚本中),这增加了交易的大小并增加了交易费用。 另外,也增加了矿工维护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、首先比较解锁脚本中赎回脚本的内容哈希是否与锁定脚本中一致

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)由于交易规模大,交易速度变慢,交易手续费增加的负担转嫁给收款人。

3、数据记录输出(RETURN)

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

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

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

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

3、使用RETURN的输出不会存储在矿工的UTXO集合中,避免内存占用,而是写入区块链。

返回脚本示例

脚本公钥:返回

脚本签名:

从脚本中可以看出,通常输入的脚本都是NULL

四、时间锁(Timelock)

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

1.交易时间锁(nLocktime)

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

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

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

事务时间锁的特点:

交易时间锁要求交易在指定的时间后广播到全网,所以在时间到来之前交易不会被写入区块链。 这样一来,如果付款人发起另一笔交易,在时间未到之前双花并生成相同的输入,则之前的交易实际上将作废,这让收款人没有任何保障。

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

2. Check Lock Time Verification(检查锁定时间验证(以下简称CLTV))

CLTV是基于UTXO的时间锁,通过在P2SH赎回脚本(redeem script)中加入CHECKLOCKTIMEVERIFY命令来验证时间。 将时间锁写入脚本,确保UTXO被锁定,在锁定时间到期之前,任何人都无法使用UTXO。

CLTV赎回脚本示例:

CHECKLOCKTIMEVERIFY DROP DUP HASH160 EQUALVERIFY CHECKSIG

在解锁之前,您需要先进行验证。 如果验证成功,则将其删除,并正常执行解锁脚本。

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

1.栈为空

2.小​​于0

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

4.栈顶项大于事务的nLocktime字段

5.输入nSequence字段为0xffffffff

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

至此我们了解了比特币上主要的高级交易类型。 随着时间的推移,比特币脚本的能力将得到进一步挖掘,比特币将进一步通过脚本向区块链“平台”发展。

感兴趣的可以查看版块中的信息。 如果你看到像下面这样无法解码的输出,则说明这不是标准交易,很可能被用于货币以外的其他目的。

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

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

分类:

技术要点:

相关文章: