区块链网站|NFTS 比特币地址 谁控制比特币 你吗?还是钱包?|分析|BTC地址和交易原则

谁控制比特币 你吗?还是钱包?|分析|BTC地址和交易原则

广告位

谁控制了比特币,是你?还是钱包?|BTC地址与交易原理大剖析

青葱App月28日,作者尹,转载请注明出处。

如果你正在使用比特币钱包,却无法回答以上3个问题,那么这篇文章就是为你定制的。

比特币被锁定在无效地址。近日,SECBIT实验室在审计数字钱包的源代码时,发现一个名为pywallet的比特币钱包开源库存在一个严重缺陷:如果你将钱转移到pywallet生成的OmniLayer收款地址,将导致资产的永久损失。

Anbi Laboratories的区块链技术专家zer0to0ne表示,OmniLayer协议允许在比特币区块链上发行定制资产(如USDT)。全层资产交易的本质是比特币交易。

比特币交易的代码库有很多,pywallet就是其中之一。它可以方便地构造OmniLayer格式的比特币交易。目前pywallet已经在一些数字钱包软件中使用。

然而,开源库pywallet在生成OmniLayer的钱包地址时,错误地将地址的前缀写反了,导致部分比特币资产被锁定在无效地址中。

图1是pywallet相关错误代码的屏幕截图。

小葱注:比特币网络上最常见的地址类型有三种:公共公钥地址(1-地址)、脚本哈希地址(3-地址)和隔离见证地址(bc1-地址)。地址类型由地址的前缀来区分。其中,1地址的前缀为0x00,3地址的前缀为0x05。三种类型的地址有不同的用途。

前面提到的开源库pywallet颠倒了地址前缀,错误地将1地址设置为3地址。因此,原本转移到1-地址的资产会被错误地转移到3-地址。

当用户通过1地址验证(即私钥签名)的方式取出资产时,区块链网络通过3地址执行脚本执行验证,导致用户无法正常取出资产。

安全专家:比特币从未真正实现转账功能。众所周知,比特币的实现是基于UTXO模型,与我们直观的账户模型有很大不同。

Ann Lab的区块链专家Zer0to0ne告诉小葱,事实上比特币从未真正实现通常意义上的转账功能。中本聪只是为比特币设计了一系列的比特币脚本操作器和比特币脚本执行器,而所谓的转账过程实际上是模拟了一个比特币脚本锁定和解锁的过程。这与日常生活中的总账(或账户模型)概念不同。

为了便于理解,我们可以将比特币区块链上的资产交易比喻为将资产锁入保险箱,只有持有保险箱钥匙的人(即收款人)才能取出保险箱中的资产进行交易。

来源:比特币白皮书https://bitcoin.org/bitcoin.pdf

举个栗子:

[如果Alice想要向Bob支付资产,Alice需要将资产锁在保险箱中。只有鲍勃有保险箱的钥匙,也就是说,只有鲍勃才能取出资产。如果Bob想取出资产,他必须同时花掉(即锁在另一个保险箱里)。在Bob取出这些资产之前,这些资产并不真正属于他][想象一下,如果Bob丢失了他的钥匙,他将无法再次取出这些资产。换句话说,当这个资产被存储在保险箱中时,它不属于Alice或Bob。当然,爱丽丝也可以把她的资产放在任何人都可以打开的保险箱里,这也被称为任何人都可以消费的交易]

付款方为收款方定制一个保险箱,将资产放入保险箱并上锁,然后将保险箱扔在公共场所,收款方自己开锁。由于比特币区块链上的支付地址类型不同,对应的保险柜类型、打开保险柜的钥匙、保险柜的解锁流程也不同。

为什么比特币从来没有实现真正的转账功能?

因为比特币系统中没有账户概念,所以账户之间的转账无从谈起。未来一个人能开多少个保险柜还是未知数。

基于上面的解释,我们很容易理解,当pywallet开源库错误地将1地址识别为3地址时,就像是将原来的1型保险柜改造成了3型保险柜,而账户持有人仍然持有1型保险柜的钥匙来解锁,所以能打开就很奇怪了。

被错误锁定的资产还能保存吗?我能用1号地址的钥匙打开3号保险箱吗?那么,之前提到的被错误锁定的OmniLayer数字资产还能找回吗?

根据Ann Laboratories的zer0to0ne的说法,小白可能需要理解两个重要的概念P2PKH(付费公钥哈希)和P2SH(付费脚本哈希),才能理解答案。这两个名词分别代表了两种不同类型的比特币交易。

P2PKH:中本聪的伟大发明

P2PKH(Pay to Public Key Hash),即比特币放入保险箱,锁眼Hash(公钥Hash。我们看到的最常见的1地址本质上是一个公钥散列的代码。1-地址的生成过程非常简单。公钥散列是通过公钥的Hash160运算获得的。前缀0x00被添加到公钥哈希的头部,校验和被添加到尾部。Base58后,获得以1开头的比特币地址。

我们来看一下P2PKH交易类型的安全构造流程。以爱丽丝给鲍勃送比特币为例。付款人Alice在构造保险箱时需要设置一个锁脚本:

注:这一步可以理解为爱丽丝为鲍勃定制了一个保险箱,将比特币放入保险箱,用鲍勃的公钥PubKey Hash锁定。现在这个锁除了持有私钥的Bob,任何人都打不开。

当Bob想要花掉Alice给他的比特币时,他需要提供必要的参数:交易签名公钥(技术俚语:scriptSig)来打开保险箱,这样锁脚本执行后就会返回True。这一步通常由钱包自动完成。

那么比特币节点如何验证scriptSig的合法性呢?

图片来自掌握比特币

在脚本执行过程中,如上图所示,Bob签署交易后获得的数据(实际包括数据长度信息),真正的scriptSig应该是

[堆栈上的第一件事是

除了持有私钥的人之外,没有人能够伪造数字签名。至此,一笔比特币P2PKH交易安全完成。

在这一点上,细心的读者可能会注意到一个细节:如果鲍勃拿出钥匙,区块链的任何一个矿工都可以在打开保险箱之前看到钥匙的形状。理论上,他们可以立即复制一把钥匙,打开爱丽丝留给鲍勃的保险箱并花掉(俗称前跑攻击)。

显然,中本聪已经考虑到了这个问题。该密钥中的交易签名是Bob发起的交易的完整签名。假设Bob想把Alice建的保险柜里的比特币放到一个新的保险柜里(给Charlie)。这时,Bob给出的密钥包含了Charlie的公钥Hash。虽然矿工可以复制Bob的钥匙,但是这个钥匙已经隐藏了下一个新保险箱的钥匙信息,所以矿工无法使用这个复制的钥匙完成其他动作(数字签名不能被盗用)。

P2SH:后中本聪时代的伟大创新

中本聪设计了这么强大的脚本系统,只构造转账交易似乎太浪费了,于是一些开发者尝试用其他指令构造一些特殊的加锁脚本,用其他方式解锁。

例如,构建一个使用哈希前映像解锁事务的脚本:

这个脚本的意思是:当Hash160(前像)==满足两个神奇的功能时:

交易结构的输出足够短,意味着比特币节点维护的UTXO缓存空间会大大减少;前像总是在交易花完的时候作为输入被引用,不会出现在交易的输出端。UTXO保持精简,同时可以把手续费的负担转嫁给接收方。但是,这个脚本有一个很大的安全问题。从保险箱的例子继续理解,把这种保险箱命名为Class 3保险箱。

【Alice给Bob的比特币被锁在上面Hash160保护的保险箱里。让我们称之为散列锁。这种锁还是需要合适的形状才能打开,但是安全性弱了很多。由于缺少数字签名机制,钥匙所隐藏的钥匙信息不会随着鲍勃的新保险箱而改变。任何一个矿工,只要鲍勃一露出来,就可以复制出确切的钥匙,并抢着打开艾丽丝留给鲍勃的前冲保险柜,把钱转给另一个人(夏娃)。】

不要惊慌。比特币核心开发者加文艾德森(Gavin Adresen)提出的P2SH(Pay to Script Hash)技术,正是为了让上述交易方式更加安全。

P2SH的事务输出仍然是验证哈希160(脚本)==

广告位
本文来自网络,不代表区块链网站|NFTS立场,转载请注明出处:https://www.qklwz.com/btb/qianbao/33135.html

作者: 杀虫剂

上一篇
下一篇

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部