时间:2021年1月22日
微博:比特币布道者
比特币锁定脚本带来的“坑”——真正掌握比特币的是“锁定脚本”,而不是私钥。
近几天学习了比特币的p2pkh、p2sh的锁定脚本和解锁脚本,发现比特币锁定脚本带来的“坑”——掌握比特币的真正前提是“锁定脚本”,而不是私钥。
一、如果你明白utxo原理的话,就知道:
(1)比特币地址上的比特币总数,实际上是该地址上的所有utxo的比特币数量之和。
(2)每个utxo都有“锁定脚本”,锁定脚本定义了该utxo的花费条件。通过私钥解锁该utxo上的比特币,只是花费条件的一种,当然是最常用的,也是钱包构造交易时默认的花费条件。
(3)utxo的花费条件是由交易的发送方定义的,因为utxo的锁定脚本是比特币交易的一部分,而构造交易是由交易的发送方操作完成的。
这时,就存在一个问题,就是该笔utxo的花费条件可能“不是由utxo所在地址的私钥解锁”,是由别的条件或别的私钥解锁。
比特币的锁定脚本、解锁脚本正是比特币是可编程货币(自带智能合约)的体现。我们可以设置各种解锁条件,例如到某个时间或某个区块高度才能花费该笔utxo。
所以不论解锁花费条件是什么,全节点都不会进行“是否合法”检验的,只能由交易的接收者进行检查,哪怕是比特币被打到黑洞里面去了(即没有人能给出对应的解锁“钥匙”)。
二、按脚本类型具体分析
1、p2pkh(pay to public key hash):地址以1开头。
我们可以通过blockchain.com查看交7f972c4575a2f23aa7c794ed1b9578326bf552829cbf10b59253ca4aa6fa7250生成的index = 1的utxo(即地址1JwyVSpJAa281cDLAdwBi74Sb6hHE7vBGz上的utxo)。
如果锁定脚本(Pkscript):
(1)格式如下:
OP_DUP
OP_HASH160
c4dfc18fb8bcfbeab61aa7ebb9e4d6e916995205
OP_EQUALVERIFY
OP_CHECKSIG
(2)且“c4dfc18fb8bcfbeab61aa7ebb9e4d6e916995205”经过base58check编码后,得到是比特币的接收地址。
上面的16进制数值是比特币地址还未进行base58check编码的格式,也是公钥经过sha256和ripemd160后的哈希值,如果该值被替换成发送方的公钥哈希值,那么发送方就可以用自己的私钥解锁你地址上的该utxo。
可以通过网站http://ibitlin.com/tools/convert进行检验。
如果上面(1)或(2)不满足,很有可能:你即使掌握了该地址的私钥,你也无法解锁该utxo中的比特币。
!!!!!!!!!!!!!!!!!!!
2021年3月2日,首先说文章的错误点:
对于p2pkh,在比特币的交易数据结构中,输出部分并没有“输出地址”字段!“锁定脚本”中的地址是接收方地址经过base58check反编码而来,所以锁定脚本中的地址必然是接收方的地址,否则接收方无法收到比特币。交易数据结构如下图所示:
!!!!!!!!!!!!!!!!!!!!
2、p2sh(pay to script hash):地址以3开头。
(1)标准p2sh脚本
p2sh主要用于多重签名,例如你与甲乙三个人合伙开公司,你们三个人中的任意两个人同意就可以动用该utxo上的比特币。如果你不懂技术很有可能被坑,即你的私钥不起作用。具体如下分析。
我们可以通过blockchain.com查看交易d8ded48f7874a6ef590655e18963ffdf0e20a160702bd671dcc2ca75d72e12d5生成的index = 0的utxo(即地址3DF7tcrgLWJ1jfoZhRwwSoBaMwNiMZqT5y上的utxo)。
如果锁定脚本(Pkscript):
(1)格式如下:
OP_HASH160
59ff94aeca2beffecfc69616e1e797ccfdf9d344
OP_EQUAL
(2)且“59ff94aeca2beffecfc69616e1e797ccfdf9d344”必须是由你们三个人的公钥构成的赎回脚本经过sha256和ripemd160后的值。
赎回脚本的构成:“52”+“你的公钥”+“甲的公钥”+“乙的公钥”+“53”+“ae”。千万不能漏掉自己的公钥!
原理见:《比特币中P2SH(pay-to-script-hash)多重签名的锁定脚本和解锁脚本》https://startbitcoin.org/?p=5471
注:计算哈希值时,要去掉上面的双引号和加号。
可以通过网站http://ibitlin.com/tools/hash来计算。
如果上面(1)或(2)不满足,很有可能你被坑了,你的私钥只是一个摆设。
(2)P2SH-P2WPKH、P2SH-P2WSH
P2SH-P2WPKH、P2SH-P2WSH是为了支持旧钱包对P2WPKH、 P2WSH做的升级,应用此格式,旧钱包可以创建给隔离见证地址的交易。
具体解析见下图
3、p2wpkh
交易ID:b9d4d5003269fa3b7555c69dd9075f67bfcb1dffa3555caea3e4c2428b6b2c13
具体解析脚本如下,很类似于p2pkh-p2wpkh,但更简洁。
4、p2wsh
可以参考p2sh-p2wsh脚本解析。
三、如何避免?
如果是从平台提币,大可不必担心,因为平台以盈利为目的,不会贪你那点芝麻粒的比特币。
将来,比特币普及支付了,还是要小心为宜,要对发送方构造的utxo要进行检查。
相关文章:
- 比特币锁定脚本及地址解析(p2pkh p2sh p2wpkh p2wsh p2sh-p2wpkh p2sh-p2wsh格式)
- 隔离验证钱包开发指南
- 比特币隔离见证交易格式解析(Segregated witness)
- 比特币中P2SH(pay-to-script-hash)多重签名的锁定脚本和解锁脚本
- 比特币中P2PKH(pay-to-public-key-hash)的锁定脚本和解锁脚本
- 区块链学习笔记——一些交易脚本(P2PK、P2PKH、P2MS、P2SH)及作业回顾
- BTC地址与交易原理大剖析:是谁控制了比特币,是你?还是钱包?
- BTC-比特币脚本(北大肖臻:区块链技术与应用)
- 比特币改进协议BIP16:Pay to Script Hash(P2SH)
- P2SH和MultiSig多重签名是一回事吗?或者说BIP11和BIP16有什么区别?
文章写的太棒了,2022年了,刚入行者看了依然受益匪浅