比特币锁定脚本带来的“坑”——真正掌握比特币的是“锁定脚本”,而不是私钥(这篇文章写的存在问题!)

作者:王建伯

时间:2021年1月22日

微博:比特币布道者

!!!!!!!!!!!!!!!!!!!

2021年3月2日,首先说文章的错误点:

在比特币的交易数据结构中,输出部分并没有“输出地址”字段!“锁定脚本”字段中的地址是接收方地址经过base58check反编码而来,所以锁定脚本中的地址必然是接收方的地址,否则接收方无法收到比特币。交易数据结构如下图所示:

!!!!!!!!!!!!!!!!!!!!

比特币锁定脚本带来的“坑”——真正掌握比特币的是“锁定脚本”,而不是私钥。

近几天学习了比特币的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中的比特币。

2、p2sh(pay to script hash):地址以3开头。

(1)标准p2sh脚本

p2sh主要用于多重签名,例如你与甲乙三个人合伙开公司,你们三个人中的任意两个人同意就可以动用该utxo上的比特币。如果你不懂技术很有可能被坑,即你的私钥不起作用。具体如下分析。

我们可以通过blockchain.com查看交7f972c4575a2f23aa7c794ed1b9578326bf552829cbf10b59253ca4aa6fa7250生成的index = 0的utxo(即地址39ttEgUXq92jbYvA5Zb2tcNJV6RKJq3d7Y上的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

具体解析脚本如下,很类似于p2pkh-p2wpkh,但更简洁。

4、p2wsh

可以参考p2sh-p2wsh脚本解析。

三、如何避免?

如果是从平台提币,大可不必担心,因为平台以盈利为目的,不会贪你那点芝麻粒的比特币。

将来,比特币普及支付了,还是要小心为宜,要对发送方构造的utxo要进行检查。

相关文章:

发表评论