主页 > imtoken苹果版教程 > 谁控制比特币,你是吗? 还是钱包? |BTC地址及交易原理解析

谁控制比特币,你是吗? 还是钱包? |BTC地址及交易原理解析

imtoken苹果版教程 2023-01-16 23:36:20

举个栗子:

【如果Alice要付给Bob一个资产,Alice需要把这个资产锁在一个保险箱里,而只有Bob有这个保险箱的钥匙,也就是只有Bob可以取出这个资产。 如果 Bob 想要提取资产,他必须同时花费资产(即锁入另一个保险箱)。 在Bob取出资产之前,资产并不真正属于Bob】【想象一下,如果Bob丢了钥匙,他将无法再取出资产。 换句话说,当资产存入保险箱时,它既不属于爱丽丝,也不完全属于鲍勃。 当然,Alice 也可以将资产放入一个任何人都可以打开的保险箱中,也称为 Anyone-Can-Spend 交易】

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

btc交易图标_查询btc交易_api交易btc

为什么说比特币从未实现真正意义上的传递函数?

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

api交易btc_btc交易图标_查询btc交易

基于以上解释,我们不难理解:pywallet开源库将1地址错误识别为3地址时,相当于将原来的1类保险箱改造成3类保险箱,账户持有人还是持有1-保险箱的钥匙是开锁的,能打开才怪。

有什么方法可以挽救被误锁定的资产吗? 1-address 钥匙可以用来打开 3-safe 吗?

那么之前提到的被误锁的OmniLayer数字资产能否找回呢?

根据 Ambi Lab 的 zer0to0ne 的说法,小白可能首先需要了解两个重要的概念,P2PKH(Pay to Public Key Hash)和 P2SH(Pay to Script Hash)才能理解答案。 这两个名词代表两种不同类型的比特币交易。

P2PKH:中本聪的伟大发明

btc交易图标_api交易btc_查询btc交易

P2PKH(Pay to Public Key Hash),就是把比特币放入保险箱,钥匙孔就是公钥哈希(Public Key Hash)。 我们看到的最常见的1地址查询btc交易,本质上就是Public Key Hash的一种编码。 1- 地址生成过程非常简单。 公钥通过Hash160计算得到Public Key Hash查询btc交易,在Public Key Hash的头部加上前缀0x00,在末尾加上校验和,通过Base58得到1开头的比特币地址。

看一下P2PKH交易类型的安全构建过程,以Alice向Bob发送比特币为例。 付款人 Alice 在构建保险箱时需要设置锁定脚本:

查询btc交易_api交易btc_btc交易图标

注:这一步可以理解为Alice为Bob定制了一个保险箱,将比特币放入保险箱,并用Bob的公钥PubKey Hash锁定。 现在除了持有私钥的 Bob 之外,没有人可以打开这把锁。

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

查询btc交易_btc交易图标_api交易btc

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

btc交易图标_查询btc交易_api交易btc

图片来自 Mastering Bitcoin

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

[第一个入栈的是

查询btc交易_api交易btc_btc交易图标

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

此时,细心的读者可能会注意到一个细节:如果Bob拿出钥匙,在他打开保险箱之前,区块链上的任何矿工都可以看到钥匙的形状,理论上他们可以立即复制一把钥匙,打开并花费Alice 对 Bob 是安全的(通常称为 Front-running 攻击)。

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

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

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

btc交易图标_查询btc交易_api交易btc

例如构造一个使用哈希原像(Pre-image)解锁交易的脚本:

脚本的意思是:当Hash160(Pre-image)==两个神奇的函数满足时:

但是,这个脚本有一个很大的安全问题。 继续从保险柜的例子来理解,将这种保险柜命名为三联保险柜。

[Alice 给 Bob 的比特币被锁在一个由上述 Hash160 保护的保险箱中,我们称之为哈希锁。 锁仍然需要正确的形状才能打开,但安全性要弱得多。 由于缺少数字签名机制,密钥隐藏的密钥信息不会随着鲍勃的新保险箱而改变。 任何矿工都可以在 Bob 出示密钥的那一刻复制完全相同的密钥,急忙打开 Alice 留给 Bob 的保险箱(Front-running),并将币转移给另一个人(Eve)。 】

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

P2SH的交易输出还在验证Hash160(Script)==