主页 > imtoken正版app下载 > 比特币和以太坊的一些问题介绍

比特币和以太坊的一些问题介绍

imtoken正版app下载 2024-01-26 05:12:43

时间扭曲攻击、以太坊中的叔叔挖矿、比特币的延展性问题和投票中的隔离见证将按该顺序进行介绍。

时间扭曲攻击

这次攻击的原因来自

1. 区块的时间戳由矿工填充,但时间戳的取值要符合一定的限制(大小必须超过按时间戳大小排列的过去11个区块的中值,且时间戳的本地时间)其他连接中的节点)添加两个小时等),但它仍然是矿工可以操纵的变量。

2.调整时链条难度有差距,例如:[blk 0, blk 1, ..., blk 2015] [blk 2016, blk 2017, ..., blk 4031] ...

所以矿工可以调整blk 2015的时间戳,比如增加两个小时,这样当你调整难度时,你会发现blk2015减去blk 0的时间增加了比特币脚本模式,所以难度降低了。

但要发起这种攻击,攻击者需要有足够的计算能力(因为它可以掌握特定的区块并控制时间戳),这在今天相当成熟的比特币中是很难实现的(这也是51%的计算机攻击) . ),但一些山寨币已被成功攻击(Myriad、Geist Geld 等)。

挖矿叔叔

本题来自以太坊的挖矿机制——GHOST。

随着以太坊缩短生成区块所需的时间,更多开采的区块由于网络延迟或运气问题(称为陈旧区块)而被丢弃。 因此,GHOST 旨在允许这些陈旧的区块被采用并获得(减少的)奖励。 这也是为什么这些块会被称为叔块,见下图:

比特币、以太坊的一些问题介绍

2061年获得蓝色2060叔块

Uncle Mining 顾名思义,就是专门挖叔块盈利的人行道。

比特币线下交易模式_比特币分叉影响比特币总量_比特币脚本模式

矿工隐藏挖出的区块(假设应该是2001区块)等到主链的2001区块作为叔块被挖出。

叔叔出块也会获得奖励,叔叔出块越快,双方获得的奖励就越多。

假设一个矿工(或矿池)拥有 25% 的算力。 一般情况下,他的利润就是reward * 0.25:

比特币、以太坊的一些问题介绍

通常,每四个区块中就有一个被他挖出来。

现在不挖主链(只占主链算力的75%),而是挖叔块(假设叔块立即被下一个高度封堵,收益为reward * 7/8):

比特币、以太坊的一些问题介绍

因为主链的算力是75%,每三个区块变成一个周期。

因此,他的利润变为 Reward * (7/8) * 1/3 = Reward * 0.29。

假设矿工算力为X%,正常收益为Reward * X; 叔叔挖矿收益为Reward * 7/8 * X / (1-X),当X大于12.5时,X大于正常(但7/8是理想情况。如果叔块较慢,收益利润率是更低,门槛更高。另外,以太坊限制每个区块只能有两个叔块。

因为以太坊的挖矿机制不是赢者拿走的零和游戏(像比特币一样),如果矿工使用叔叔挖矿的话比特币脚本模式,整体矿工的利润实际上是增加的(从奖励*1/4到奖励)。 * 1/3,但也会导致以太坊发行总量增加,从而间接导致价格下跌)。

但如果其他矿工也使用叔叔挖矿,那么竞争就会互惠互利。

比特币分叉影响比特币总量_比特币线下交易模式_比特币脚本模式

交易可变性

该漏洞来源于比特币签名机制:

解锁脚本不会成为签名的一部分,因为它包含签名本身(否则会出现无限循环:签名包含脚本,脚本本身包含签名....)。 此外,由于脚本和签名是分开的,因此交易延展性会存在问题。

先介绍哈希值和ID

交易的哈希值可以看作是交易的ID(区块中默克尔树的每个叶子节点的值就是交易的哈希值),是交易数据序列化抛出后产生的。 哈希函数。 如果交易数据不同,得到的哈希值也会不同。

这怎么发生的?

下面是一个正常的交易解锁脚本: 0x48<signature>0x41<public key> (0x48和0x41指令是分别将后面的48字节和41字节入栈,即签名和公钥分别提前) ,当你收到签名,修改解锁脚本为0x4D4800<signature> 0x4D4100<public key>(0x4D指令将是后面两个字节的长度)字节入栈,即入栈总长度为0048字节. 可以详细查看操作码。 这和原来的脚本是一样的,但是修改后的交易通过hash函数抛出后生成的ID会完全不同。

如何利用此漏洞?

所以当你还在用你的ID来检查它是否在收入区并且交易已经完成时,你可以使用另一个ID来获取交易(听起来不错,毕竟你的交易已经完成)。

2014 年,MtGox,有兴趣从 MtGox 获取比特币的人被拦截、修改和发送。 如果先在区块链中获得原始交易,那么拿回应该退回的钱是正常的; 如果是第一次获取修改后的交易,那么除了获取比特币外,还需要等到MtGox系统发现交易不可用。 当您完成并获得补偿或重新发行时,感兴趣的人将获得额外的钱。

修改脚本和利用可塑性漏洞的方法也有很多(比如在脚本开头推送无用数据,在脚本中拼接公钥等)。 预防机制是不以交易ID作为确认交易是否完成的条件。

隔离证人

比特币脚本模式_比特币线下交易模式_比特币分叉影响比特币总量

Segregated Witness(以下简称SegWit)最初由Pieter Wuille于2015年提出,16年后加入BIP。 它被认为是解决比特币交易量问题的最佳方案。 比特币的比特大小限制在比特币社区已经被广泛讨论了很长时间。 许多人认为将区块大小加倍并不能真正解决问题,而且许多人支持扩展硬分叉。 chunk size 是最先响应的(但是对于应该多大没有达成共识),大多数都不支持这个方案。

执行方法:

SegWit并不是通过硬分叉的方式来扩大区块大小,而是通过改变矿工验证交易的方式来解决问题。 虽然不需要昂贵的硬分叉,但仍然需要大多数矿工同意(要求矿工接受SegWit来验证交易,否则会发生冲突,即矿工方认为交易是合法的,我认为是违法的,所以我现在投票。

那么隔离见证人在做什么呢?

在这里,见证人是指交易的签名。 顾名思义,隔离见证分离签名并从脚本中提取交易签名。 但是,去掉签名后,其他新节点加入时如何验证这些交易呢? 你可以想象将这些签名变成另一个默克尔树。

比特币、以太坊的一些问题介绍

区块头最初包含 Merkle Root,它是 Merkle 树的根,由该区块中包含的所有交易的 ID 组成。

让我描述一下目前的情况

Txid:由 [nVersion] [txins] [txouts] [nLockTime] 散列;

并且在哈希之后,SegWit 的 IDwtxid 是 [nVersion] [marker] [flag] [txins] [txouts] [witness] [nLockTime]。

见证是交易输入(txins)对应的签名数据,txins中包含txid的签名。 每笔交易都有一个 txid 和 wtxid。 如果是正常交易,它的 txid 看起来和 wtxid 一样。

现在SegWit将对应的txid wtxid组合成另一个对应的Merkle Tree,但是如果要将这个新的root插入到Header中,就必须加硬,如果要改变Header结构。

比特币脚本模式_比特币线下交易模式_比特币分叉影响比特币总量

所以 SegWit 将在区块的 coinbase 交易中使用这个根。 Coinbase 交易是矿工的奖金,允许矿工在交易脚本中填写任何数据。 例如,Satoshi Chong 正在填充比特币铸造区块。 输入:“The Times 03/Jan/2009 Principals face second bailout from banks”。

SegWit 脚本在采用签名时进行了修改。 被锁定的脚本变成一串几十字节的数据(在不使用SegWit的节点眼里,看到的是一串无意义的数据),分为两部分:1字节长的版本号和2到40字节长智能程序。

当前版本号为零(0x00),该版本下有两个见证程序:

1. Pay-to-witness-public-key-hash,长度为20字节,可以看作P2PKH的SegWit版本。 如果你想花费这个UTXO,你必须提供一个witness,witness包含一个签名和一个公钥,公钥等于哈希后的20字节长的思维程序(HASH160)。

2.长度为32字节的pay-to-witness-script-hash可视为P2SH的SegWit版本。 如果你想花费这个UTXO,你必须提供一个witness,witness包含一个赎回脚本,哈希脚本(SHA256)等于一个长度为32字节的程序(比如P2SH)。

因为witness是附加记录,SegWit交易的解锁脚本可能为空(可以玩模拟器测试这个比特币脚本),SegWit节点从其他途径接收到witness,然后解锁。

新设计的好处

版本号增强了系统的灵活性。 以后如果引入新的脚本规则和验证方式,只需要用版本号来判断即可。 不仅可以兼容新旧,而且不需要通过硬分叉来实现。

另外,由于见证中包含了SegWit的P2WSH赎回脚本,说明赎回脚本没有大小限制,可以设计更复杂的赎回脚本。

非 SegWit 节点呢?

前面说了SegWit交易不使用SegWit节点看到一堆废话,也就是说解锁脚本不需要任何签名,在他们眼里就是“任何人都可以消费”。 交易,所以非SegWit节点可以直接从SegWit交易中提取资金(解锁脚本为空),这也是SegWit投票需要大多数矿工支持的原因。

基本上,非 SegWit 节点不受影响,可以进行和验证非 SegWit 交易,但如果你想从 SegWit 交易中拿钱,你最终会没有人承认工作。

比特币线下交易模式_比特币脚本模式_比特币分叉影响比特币总量

SegWit将对比特币的交易效率产生重大影响,包括:

1.影响区块容量:

从交易中获得签名后,交易数据的大小就会减少。 如果区块是SegWit交易,平均情况是2MB左右,最坏情况可能是4MB。 它包含一般交易数据和winess,这是基于一般交易数据不超过1MB容量限制。

2.影响交易手续费:

由于比特币的交易成本取决于交易数据的大小,SegWit 会去除交易数据的签名,减少交易数据的大小,直接降低交易成本。

3. 影响矿工成本:

矿工的一个成本是他必须在内存中记下所有 UTXO(未花费的交易输出)。 如果比特币网络上的 UTXO 越多,那么矿工的成本就越高,用户就有动力产生更多的 UTXO。 想象一下,如果你有 0.5、0.5 和 0.9 BTC 的三个 UTXO,你需要支付 0.75 的费用。 查看交易费用后,您将选择使用 0.9 BTC UTXO 而不是 0.5 BTC + 0.5 BTC 用于两个 UTXO。 因为输入越多(也就是UTXO),交易数据越大,交易成本就越高。 但是这样会产生更多的UTXO(0.9到0.75+0.15两个),造成矿工成本上升,所以用户的利益和矿工的利益是冲突的。

SegWit计算交易手续费的方式,假设交易A的输入数大于输出数(3个输入,2个输出),交易B的输入数小于输出数( 2个输入,3个输出,这意味着交易A减少了UTXO的数量,而交易B产生了更多的UTXO,如果产生更多的UTXO,交易A的交易成本将低于交易B。

但是如果没有SegWit,交易A的数据量会比交易B大(因为一个输入的大小大于一个输出的大小),交易A的交易成本会更高,所以在SegWit的机制下,减少了 UTXO 的使用。 矿工和矿工都是有益的。

4.解决交易可变性

因为SegWit将签名拉出脚本,而脚本(witness程序)和解锁脚本(witness)都是格式固定的,即使有人截获了交易数据,也无法更改。 更改见证程序的任何位都会导致散列后获得与见证程序不同的哈希值。

Transaction Malleability 的解决方案也间接解决了闪电网络的一个重大问题。 SegWit不仅可以加速线上交易,还可以解决线下交易的问题。

越来越多的钱包、矿山和应用程序已升级到 DockWit,详见此列表。 可以在此处查看投票状态。 SegWit 投票从 2016 年 11 月中旬开始持续了一年。超过 95% 的矿工必须投票支持它,这意味着 2016 年的区块中有 1916 个。