资料:
https://blog.csdn.net/jerry81333/article/details/56824166
http://book.8btc.com/books/1/master_bitcoin/_book/5/5.html
https://www.liaoxuefeng.com/article/001482718603696a6b6eb2bebc74211ab967146a952ae0c000
标准交易
- 在比特币最初几年的发展过程中,开发者对可以经由客户端进行操作的脚本类型设置了一些限制。这些限制被编译为一个Standard()函数,该函数定义了五种类型的标准交易。
- 五大标准脚本分别为P2PKH、P2PK、MS(限15个密钥)、P2SH和OP_Return
P2PKH(Pay-to-Public-Key-Hash)
- 比特币网络上的大多数交易都是P2PKH交易,此类交易都含有一个锁定脚本,该脚本由公钥哈希实现阻止输出功能,公钥哈希即为广为人知的比特币地址。由P2PKH脚本锁定的输出可以通过键入公钥和由相应私钥创设的数字签名得以解锁。
- 锁定脚本 OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUAL OP_CHECKSI
- 脚本中的Cafe Public Key Hash即为收款方的比特币地址,但这个地址不是基于Base58Check编码的。事实上,大多数比特币地址都显示为十六进制码,而不是以1开头的基于Bsase58Check编码的比特币地址。
- 解锁版脚本 <Cafe Signature> <Cafe Public Key>
- 将两个脚本结合起来可以形成有效的组合脚本
- <Cafe Signature> <Cafe Public Key> OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUALOP_CHECKSIG
- 只有当解锁版脚本与锁定版脚本的设定条件相匹配时 即只有当解锁脚本得到了收款方的有效签名,交易执行结果才会被通过(结果为真),该有效签名是从与公钥哈希相匹配的咖啡馆的私钥中所获取的。
- http://book.8btc.com/books/1/master_bitcoin/_book/5/Fig504.png
P2PK(Pay-to-Public-Key)
- 与P2PKH模式含有公钥哈希的模式不同,在P2PK脚本模式中,公钥本身已经存储在锁定脚本中,而且代码长度也更短。P2PKH是由Satoshi创建的,主要目的一方面为使比特币地址更简短,另一方面也使之更方便使用。
- P2PK目前在Coinbase交易中最为常见,Coinbase交易由老的采矿软件产生,目前还没更新至P2PKH。
- 锁定的脚本 <Public Key A> OP_CHECKSIG
- 解锁的脚本 <Signature from Private Key A>
- 组合脚本 <Signature from Private Key A> <Public Key A> OP_CHECKSIG
MS(Multiple Signatures)多重签名
多重签名脚本设置了这样一个条件,假如记录在脚本中的公钥个数为N,则至少需提供其中的M个公钥才可以解锁。这也被称为M-N组合,其中,N是记录在脚本中的公钥总个数,M是使得多重签名生效的公钥数阀值(最少数目)。
例: 对于一个2-3多重签名组合而言,存档公钥数为3个,至少同时使用其中2个或者2个以上的公钥时,才能生成激活交易的签名,通过验证后才可使用这笔资金。
M-N多重签名锁定脚本 M <Public Key 1> <Public Key 2> ... <Public Key N> N OP_CHECKMULTISIG
N是存档公钥总数,M是要求激活交易的最少公钥数。
例:2 <Public Key A> <Public Key B> <Public Key C> 3 OP_CHECKMULTISIG
锁定脚本可由含有签名和公钥的脚本予以解锁 OP_0 <Signature B> <Signature C>
组合将形成一个验证脚本:
OP_0 <Signature B> <Signature C> 2 <Public Key A> <Public Key B> <Public Key C> 3 OP_CHECKMULTISIG
P2SH(Pay-to-Script-Hash)
在P2SH支付中,复杂的锁定脚本被电子指纹所取代,电子指纹为密码学哈希。
当一笔交易试图支付UTXO时,要解锁支付脚本,它必须含有与哈希相匹配的脚本。
P2SH的含义是,向与该哈希匹配的脚本支付。
P2SH是MS多重签名的简化版本
(ms锁定脚本) 2 <Public Key A> <Public Key B> <Public Key C> 3 OP_CHECKMULTISIG
对MS锁定脚本,首先采用SHA256哈希算法,随后对其运用RIPEMD160算法 生成20字节的脚本
8ac1d7a2fa204a16dc984fa81cfdf86a2a4e1731
最终转化为
(P2SH 锁定脚本) OP_HASH160 8ac1d7a2fa204a16dc984fa81cfdf86a2a4e1731 OP_EQUAL
当接收方要使用此交易中的UTXO时,需要提交解锁脚本(这里又可称为赎回脚本)
解锁脚本:
<Sig1> <Sig2> <2 PKA PKB PKC 3 OP_CHECKMULTISIG>
结合脚本:
<Sig1> <Sig2> <2 PKA PKB PKC 3 OP_CHECKMULTISIG> OP_HASH160 8ac1d7a2fa204a16dc984fa81cfdf86a2a4e1731 OP_EQUAL
P2SH地址
P2SH的另一重要特征是它能将脚本哈希编译为一个地址(其定义请见BIP0013)。
P2SH地址是基于Base58编码的一个含有20个字节哈希的脚本,就像比特币地址是基于Base58编码的一个含有20个字节的公钥。
由于P2SH地址采用5作为前缀,这导致基于Base58编码的地址以“3”开头。
例如,Mohammed的脚本,基于Base58编码下的P2SH地址变为“39RF6JqABiHdYHkfChV6USGMe6Nsr66Gzw”。此时,Mohammed可以将该地址发送给他的客户,这些客户可以采用任何的比特币钱包实现简单支付,就像这是一个比特币地址一样。以“3”为前缀给予客户这是一种特殊类型的地址的暗示,该地址与一个脚本相对应而非与一个公钥相对应,但是它的效果与比特币地址支付别无二致。
P2SH的优点
在交易输出中,复杂脚本由简短电子指纹取代,使得交易代码变短。
脚本能被编译为地址,支付指令的发出者和支付者的比特币钱包不需要复杂工序就可以执行P2SH。
P2SH将构建脚本的重担转移至接收方,而非发送方。
P2SH将长脚本数据存储的负担从输出方(存储于UTXO集,影响内存)转移至输入方(仅存储于区块链)。
P2SH将长脚本数据存储的重担从当前(支付时)转移至未来(花费时)。
P2SH将长脚本的交易费成本从发送方转移至接收方,接收方在使用该笔资金时必须含有赎回脚本。
数据输出(OP_RETURN操作符)
比特币的分发和时间戳账户机制(也即区块链),其潜在运用将大大超越支付领域。许多开发者试图充分发挥交易脚本语言的安全性和可恢复性优势,将其运用于电子公证服务、证券认证和智能协议等领域。比特币脚本语言的早期运用主要包括在区块链上创造出交易输出。例如,为文件记录电子指纹,则任何人都可以通过该机制在特定的日期建立关于文档存在性的证明。
运用比特币区块链存储与比特币支付不相关数据的做法是一个有争议的话题。许多开发者认为其有滥用的嫌疑,因而试图予以阻止。另一些开发者则将之视为区块链技术强大功能的有力证明,从而试图给予大力支持。那些反对非支付相关应用的开发者认为这样做将引致“区块链膨胀”,因为所有的区块链节点都将以消耗磁盘存储空间为成本,负担存储此类数据的任务。更为严重的是,此类交易仅将比特币地址当作自由组合的20个字节而使用,进而会产生不能用于交易的UTXO。因为比特币地址只是被当作数据使用,并不与私钥相匹配,所以会导致UTXO不能被用于交易,因而是一种伪支付行为。这样的做法将使得内存中的UTXO不断增加,而且这些不能被用于交易的数据同样也不能被移除,因此比特币节点将永久性地担负这些数据,这无疑是代价高昂的。
在0.9版的比特币核心客户端上,通过采用OP_Return操作符最终实现了妥协。OP_Return允许开发者在交易输出上增加40字节的非交易数据。然后,与伪交易型的UTXO不同,OP_Return创造了一种明确的可复查的非交易型输出,此类数据无需存储于UTXO集。OP_Return输出被记录在区块链上,它们会消耗磁盘空间,也会导致区块链规模的增加,但它们不存储在UTXO集中,因此也不会使得UTXO内存膨胀,更不会以消耗代价高昂的内存为代价使全节点都不堪重负。
OP_RETURN脚本的样式:
OP_RETURN <data>
“data”部分被限制为40字节,且多以哈希方式呈现,如32字节的SHA256算法输出。许多应用都在其前面加上前缀以辅助认定。例如,电子公正服务的证明材料采用8个字节的前缀“DOCPROOF”,在十六进制算法中,相应的ASCII码为44f4350524f4f46。
请记住OP_RETURN不涉及可用于支付的解锁脚本的特点,OP_RETURN不能使用其输出中所锁定的资金,因此它也就没有必要记录在蕴含潜在成本的UTXO集中,所以OP_RETURN实际是没有成本的。OP_RETURN常为一个金额为0的比特币输出,因为任何与该输出相对应的比特币都会永久消失。假如一笔OP_RETURN遇到脚本验证软件,它将立即导致验证脚本和标记交易的行为无效。如果你碰巧将OP_RETURN的输出作为另一笔交易的输入,则该交易是无效的。
一笔标准交易(通过了isStandard()函数检验的)只能有一个OP_RETURN输出。但是单个OP_RETURN输出能与任意类型的输出交易进行组合。