精通比特币(39):P2SH(Pay-to-Script-Hash)

  • A+
P2SH在2012年被作为一种新型、强大、且能大大简化复杂交易脚本的交易类型而引入。
P2SH是为了解决这复杂脚本的使用而被引入的,它旨在使复杂脚本的运用能与直接向比特币地址支付一样简单。
在P2SH支付中,复杂的锁定脚本被电子指纹所取代,电子指纹是指密码学中的哈希值。

 

当一笔交易试图支付UTXO时,要解锁支付脚本,它必须含有与哈希相匹配的脚本。
P2SH的含义是,向与该哈希匹配的脚本支付,当输出被支付时,该脚本将在后续呈现。

 

在P2SH交易中,锁定脚本由哈希运算后的20字节的散列值取代,被称为赎回脚本。因为它在系统中是在赎回时出现而不是以锁定脚本模式出现。

 

非P2SH脚本
精通比特币(39):P2SH(Pay-to-Script-Hash)
P2SH脚本
精通比特币(39):P2SH(Pay-to-Script-Hash)
从表中可以看出,对于P2SH,详细描述了输出(赎回脚本)的条件的复杂脚本不会在锁定脚本中显示。
相反,只有它的散列值在锁定脚本中呈现,并且兑换脚本本身稍后呈现,作为解锁脚本在输出花费时的一部分。 这使得给矿工的交易费用从发送方转移到收款方,复杂的计算工作也从从发送方转移到收款方。

 

整个脚本都可由仅为20个字节的密码哈希所取代,首先采用SH256哈希算法,随后对其运用RIPEMD160算法。

 

这个脚本比前面的长脚本简短多了。取代“向该5个多重签名脚本支付”,这个P2SH等同于“向含该哈希的脚本支付”。顾客在向Mohammed公司支付时,只需在其支付指令中纳入这个非常简短的锁定脚本即可。当 Mohammed想要花费这笔UTXO时,附上原始赎回脚本(与UTXO锁定的哈希)和必要的解锁签名即可,如:
<Sig1> <Sig2> <2 PK1 PK2 PK3 PK4 PK5 5 CHECKMULTISIG>
两个脚本经由两步实现组合。 首先,将赎回脚本与锁定脚本比对以确认其与哈希是否匹配:
<2 PK1 PK2 PK3 PK4 PK5 5 CHECKMULTISIG> HASH160 <redeem scriptHash> EQUAL
假如赎回脚本与哈希匹配,解锁脚本会被执行以释放赎回脚本:
<Sig1> <Sig2> 2 PK1 PK2 PK3 PK4 PK5 5 CHECKMULTISIG

 

P2SH地址

P2SH的另一重要特征是它能将脚本哈希编译为一个地址(其定义请见BIP0013 /BIP-13)。P2SH地址是基于Base58编码的一 个含有20个字节哈希的脚本,就像比特币地址是基于Base58编码的一个含有20个字节的公钥。由于P2SH地址采用5作为前缀,这导致基于Base58编码的地址以“3”开头。
例如,Mohammed的脚本,基于Base58编码下的P2SH地址变 为“39RF6JqABiHdYHkfChV6USGMe6Nsr66Gzw”。
此时,Mohammed可以将该地址发送给他的客户,这些客户可以 采用任何的比特币钱包实现简单支付,就像这是一个比特币地址一样。以“3”为前缀给予客户这是一种特殊类型的地址的暗示,该地址与一个脚本相对应而非与一个公钥相对应,但是它的效果与比特币地址支付别无二致。 P2SH地址隐藏了所有的复杂性,因此,运用其进行支付的人将不会看到脚本。

 

P2SH的优点

与直接使用复杂脚本以锁定输出的方式相比,P2SH具有以下特点:
  • 在交易输出中,复杂脚本由简短电子指纹取代,使得交易代码变短。
  • 脚本能被编译为地址,支付指令的发出者和支付者的比特币钱包不需要复杂工序就可以执行P2SH。
  • P2SH将构建脚本的重担转移至接收方,而非发送方。
  • P2SH将长脚本数据存储的负担从输出方(存储于UTXO集,影响内存)转移至输入方(存储在区块链里面)TODO 。
  • P2SH将长脚本数据存储的重担从当前(支付时)转移至未来(花费时)。
  • P2SH将长脚本的交易费成本从发送方转移至接收方,接收方在使用该笔资金时必须含有赎回脚本。

 

赎回脚本和标准确认

在0.9.2版比特币核心客户端之前,P2SH仅限于标准比特币交易脚本类型(即通过标准函数检验的脚本)。这也意味着使用该笔资金的交易中的赎回脚本只能是标准化的P2PK、P2PKH或者多重签名,而非RETURN 和P2SH。

 

作为0.9.2版的比特币核心客户端,P2SH交易能包含任意有效的脚本,这使得P2SH标准更为灵活,也可以用于多种新的或复杂类型的交易。
请记住不能将P2SH植入P2SH赎回脚本,因为P2SH不能自循环。

 

需要注意的是,因为赎回脚本只有在你试图发送一个P2SH输出时才会在比特币网络中出现,假如你将输出与一个无效的交易哈希锁定,则它将会被忽略。该UTXO将会被成功锁定,但是你将不能使用该笔资金,因为交易中含有赎回脚本,该脚本因是一个无效的脚本而不能被接受。这样的处理机制也衍生出一个风险,你可能将比特币锁定在一个未来不能被花费的P2SH中。因为比特币网络本身会接受这一P2SH,即便它与无效的赎回脚本所对应(因为该赎回脚本哈希没有对其所表征的脚本给出指令)。
注释 P2SH锁定脚本包含一个赎回脚本哈希,该脚本对于赎回脚本本身未提供任何描述。P2SH交易即便在赎回脚本无效的情况下也会被认为有效。如果处理不当,有可能会出现一个事故,即你的比特币可能会被锁死在P2SH这个交易中,导致你以后再也不能花费这笔比特币了。【此处也是一个比特币消失的情况】

发表评论

您必须才能发表评论!