比特币锁定脚本带来的“坑”——真正掌握比特币的是“锁定脚本”,而不是私钥。 近几天学习了比特币的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)多重签名的锁定脚本和解锁脚本》http://btc.mom/?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要进行检查。 |