主页 > imtoken官网地址是什么 > 深入比特币原理(五)——高级交易与脚本
深入比特币原理(五)——高级交易与脚本
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时间,时间类型需要保持一致。
至此我们了解了比特币上主要的高级交易类型。 随着时间的推移,比特币脚本的能力将得到进一步挖掘,比特币将进一步通过脚本向区块链“平台”发展。
感兴趣的可以查看版块中的信息。 如果你看到像下面这样无法解码的输出,则说明这不是标准交易,很可能被用于货币以外的其他目的。
分类:
技术要点:
相关文章: