主页 > imtoken钱包2.0版本下载 > 比特币扩容争议:对隔离见证的反思

比特币扩容争议:对隔离见证的反思

imtoken钱包2.0版本下载 2023-08-02 05:13:50

比特币的基础设施:区块链

下面科普一下什么是比特币的区块链。 老手可以直接跳过这部分。 这里所说的比特币是指2017年8月之前的比特币,后来分为两条链:BTC with Segregated Witness和BCH without Segregated Witness。 下面会有很多看起来很专业的东西,但是请放心,我不是专业的程序员,我不会说得太深。 稍微了解一下比特币的架构和转账方式,对于理解Segregated Witness的骗局很有帮助。 比特币链大概是这样的:

隔离见证地址可以转普通_比特币隔离见证地址_比特币收币地址

在上图中,我们可以看到几个区块(Block),我们可以看到每个区块有两部分:一部分是用虚线绘制的Prev.block指向上一个区块,这部分叫做“block header””,另一部分是“区块体”Transaction,也就是这个区块中的交易信息。由于每个区块头都指向前一个区块头,所以我们称这个系统为区块链。仔细看看这个区块头:

比特币隔离见证地址_比特币收币地址_隔离见证地址可以转普通

在上图中,我们可以看到3个区块(Block),我们可以看到每个区块头中有4条信息。 其中,Nonce为矿机搜索到的数字。 这个数字很难找到,所以使用快速的矿机需要大量的电力。 谁先找到一个Nonce,就可以使这4条信息的Hash结果满足一定的条件。 谁能发布这个区块,谁就会获得 12.5 个币的区块奖励。 Prev-Hash是这4条信息在上一个区块的Hash结果,Timestamp是当前时间。 在这两个限制下,矿工必须至少收到前一个区块的区块头才能开始挖掘下一个区块。 块。 Tx_Root 是该区块主体中所有交易的 Merkle Root。 如果任何交易发生变化,则此 Tx_Root 将发生变化。 这样,比特币区块就形成了一条不可更改的链:如果这个Block11中加入的Tx1发生了变化,那么它上面的Hash1也会发生变化,Tx_Root也会发生变化,这样Block11中的4条信息就是combined 的Hash结果会不一样,会和Block12的Prev_Hash断开连接,Block12会失效,以此类推。

支付脚本

区块链中的交易可以大致理解为“A地址向B地址转xx币”、“B地址向C地址转xx币”等信息。 如果地址C收到了xx个币但没有转出,那么在UTXO数据库中会记录:“地址C还有xx个币没有被花掉”。 如果地址C是一个1开头的普通比特币地址,要花钱,需要用脚本。 这个脚本是在“地址B向地址C转xx币”时规定的。 C地址怎么可以花。一般这个脚本是这样的两部分

scriptPubKey 部分:OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG

脚本签名部分:

不会编程的朋友请不要害怕,其实并不难懂。 scriptPubKey部分有几个“操作码”,以OP开头,代表几个操作。 是比特币地址的中间部分,开头没有版本号1,结尾没有校验码。 这部分是对公钥进行哈希处理的结果。 scriptSig部分必须由要转账的人提供,公钥,以及交易用私钥的签名。 公钥可以从私钥推导出来,比特币地址可以从公钥推导出来。 这些步骤都不能逆转(在今天的技术下)。 如果一个人可以出示交易私钥的签名,并提供地址的公钥,那么我们就认为这笔转账是他授权的,其他人无法伪造。 矿池已经收到提供的交易和交易的签名,如何验证? 只需运行上面的脚本,看看结果是否为“True”。 如果结果为真,则通过。 首先要把scriptSig里面的东西“叠”起来,形成一个“栈”:

然后,scriptPubKey 部分被一个一个执行。 首先是一个OP_DUP,这是一个复制操作,这些操作都是对栈顶的操作。 所以复制操作后的栈变为:

然后是一个OP_HASH160,就是Hash160算法的运算,把栈顶变成:

然后,将其压入堆栈:

然后是OP_EQUALVERIFY,这是一个检查相等性的操作,对栈顶的两个元素进行。 如果提供的是正确的,它应该是相同的。 运行后栈变为:

最后一个操作码是 OP_CHECKSIG,它检查签名和公钥是否正确。 如果没有问题,则清除堆栈。 任何一步出现问题都会导致脚本报错。 如果没有错误,脚本结果为True,即通过。

脚本可以使用的操作码有很多,比如if,else,add,sub,drop,swap等。比如地址B给地址C转钱的时候,在刚才的脚本开头添加一个操作码OP_CHECKLOCKTIMEVERIFY来创建一个冻结资金,地址C中的钱必须在一定时间后才能花掉。 过期前的OP_CHECKLOCKTIMEVERIFY会使脚本验证失败。

据“2009年开始参与比特币开发”的克雷格赖特说,如果有足够的操作码,比特币系统也是图灵完备的,它也可以像ETH一样运行智能合约。 然而,许多操作码在 2013 年被 Core 禁用(因为 Core 开发人员无法理解这些操作码的用途),并且对脚本编写有更多限制。 BCH 的 2018 年开发路线图包括对操作码设计的修复。

如果,当地址B向地址C转账时,将脚本写成这样:

scriptPubKey 部分:留空

scriptSig 部分:OP_TRUE

那么这个脚本总是可以通过而不提供任何信息。 无论以何种方式转出,谁转出有效。 我们现在将这笔钱称为任何人都可以花。 这笔钱就相当于给了矿池,因为矿池最终决定了谁的交易可以进块。 如果有人将他的钱转账到这样一个任何人都可以花的地址,矿池肯定会把钱打给自己。

这个任何人都可以花费的脚本是隔离见证(Segwit)的基础。 使用此脚本,转账时无需在区块中提供签名,签名在区块链之外“隔离”,因此得名“Segregated Witness”。 虽然签名已经动了,但是转账的时候还是要签名的,不然就是乱转了。 事实上,用户应该发送的信息不会少,矿池需要验证的信息也不会少。 不同之处在于区块链中存储的信息较少。 由于区块设置了 1MB 的上限并且已经满了,如果交易在区块中占用的空间较小,就可以在这个 1MB 的区块中再挤几笔交易。 如果所有交易都使用这种任何人都可以花费的格式,隔离见证技术据称具有 1.7 倍的扩展效果。 现在的问题是,将签名信息移出区块链有什么好处? 为什么不把1MB的上限放宽到2MB呢?

硬分叉和软分叉

上述问题是软硬分叉扩容之争。 因为 Segwit 是所谓的软分叉,增加区块大小就是硬分叉。 我在上一篇文章中说过,其实硬分叉和软分叉之争是表象,本质上是路线之争:比特币普及之后就是流通的货币,或者说是流通货币的结算层; 去中心化,或者说结算层更去中心化。 软硬分叉其实只是技术手段,真正的最终结果还是人在掌控。

涉及“共识层”的修改将形成“分叉”。 共识的运作实际上是两层半。 第一层是有算力的节点(矿池),第二层是没有算力的全节点,还有一个轻钱包SPV,用于简单的支付验证。 让我们算作半层。 软分叉的特点是“旧版本的软件仍然可以识别新的共识”。 硬分叉是“旧版本的软件无法识别新版本的软件”。 我们用下图来看一下软硬分叉的情况。

隔离见证地址可以转普通_比特币收币地址_比特币隔离见证地址

Block8区块后,系统从V1软分叉升级到V2,此时:

计算层:

运行 V2 的矿工(大部分算力)认为最长的有效链是上面的链。

运行V1(少量未升级算力)的矿工也认为最长的有效链就是上面那条,会因为不是最长的而放弃自己的Block9(V1)形成孤块。 但是,V1矿工挖出的旧版本区块不会被V2矿工识别。 这样一来,如果V1矿机不升级,就会面临不被识别的情况,矿机就白白浪费了电能。

全节点层:

运行 V1 和 V2 的全节点(没有算力)都认为最长的有效链就是上面那条。 V1节点没有经济损失,因为没有矿机。

SPV层:

同时运行 V1 和 V2 的 SPV 钱包将最长的有效链视为上述链。

综上所述,软分叉期间只需要升级挖矿节点。 如果你不升级,就会有经济损失。

相比之下,系统从V1硬分叉升级到V2,此时:

计算层:

运行 V2 的矿工(大部分算力)认为最长的有效链是上面的链。

运行V1(少量未升级算力)的矿工认为最长的有效链是下面的,上面的长但无效。 这样,如果V1矿工不升级,就会和V2形成两条平行链。

全节点层:

运行 V2 的节点(没有计算能力)认为最长的有效链是上面的那条。

运行V1(没有算力)的节点认为最长的有效链是下面的,上面的长但无效。

SPV层:

如果这次硬分叉是将容量从1M扩容到2M,由于SPV钱包不检查容量限制,所以不会因为容量而使一条链失效。 同时运行 V1 和 V2 的 SPV 钱包将最长的有效链视为上述链。 如果这次硬分叉修改了挖矿算法或者难度调整算法,那么SPV节点会根据新旧版本来识别自己的链。

综上所述,发生硬分叉时,不仅需要升级挖矿节点,还需要升级非挖矿节点。 根据情况比特币隔离见证地址,SPV 可能不需要升级。 如果部分算力不升级,就会分裂成两种不能相互转移的货币,就像现在的BTC和BCH一样。

这样一来,软分叉是不是比硬分叉更安全呢? 如果你担心有人因为不知道而升级,或者忘记及时升级,软分叉似乎可以防止比特币莫名其妙地分裂成两个币。 但是这种情况是不存在的好吗? 现在算力掌握在几个矿池手里。 只要提前几周通知大家做好准备,就不会出现“忘记升级”的情况。 “忘记升级”只能是普通用户,没有算力的普通用户对系统的运行没有任何影响。 BCH上的DAA硬分叉(将难度调整算法改为逐块调整)已经很好地展示了这样的硬分叉,不会对普通用户的使用造成障碍。 我们平时使用其他软件,经常会遇到不升级就无法登录的情况,这并不是致命的事情。 Core开发团队一直在妖魔化硬分叉,称硬分叉会导致比特币一分为二,影响市场稳定。 事实上,差异导致的硬分叉无法停止(BCH分离),没有差异的硬分叉升级没有危险(BCH难度算法调整),没有理由不考虑路由差异就坚持认为软分叉是安全的。

软硬分叉争论的终结:中间派的失败

当大家质疑硬分叉的安全性时,中间派试图通过“合并分叉”的方式进行斡旋。 一般的做法是先从V1升级到V1.5,用一个大家都同意安全的软分叉,然后在V1.5中预嵌入硬分叉到V2代码。 这样,如果有算力的人“忘记升级”,他的V1在升级到V1.5时会被隔离,但不会立即形成2币。 当硬分叉从V1.5升级到V2时,由于是预埋代码,会自动运行,不会被“遗忘”。 我没有鄙视程序员的意思,这是典型的“程序员思维”。 软件是死的,人是活的。 人想做事,用代码是没有限制的。

中间派最终的方案是Segwit2x方案,融合了分叉Segwit和2M的两次升级。 前者是软分叉,后者是硬分叉。 这个计划得到了纽约超过83%的计算能力的支持。 纽约会议结束后,中国矿业做了一个内部协议:每个人都运行Segwit2x软件。 本软件有预埋码,Segwit激活90天后自动激活2M。 升级。 问题来了,你怎么知道别人运行的是和你一样的软件呢? 除非你黑进了矿池的服务器,否则完全不可能从外部判断别人是否会在3个月内进行2M的分叉。 代码虽然写好了,其他人可以运行其他版本的软件,删改那些行,外人无从知晓。 反扩张派倾向于 Segwit 而不是 2M,而中间派愿意为了 2M 而妥协 Segwit。 当Segwit启动后,中间派无法靠这两行代码强制反扩张派进行2M升级,分裂成2个币的结局还是不可避免的。 最后,大家也看到了结果。 中间派承认他们取消了 2M 硬分叉计划。

从2016年开始,为了防止比特币分裂成两个币,大家花了那么多时间开会谈判,现在明白了,如果路线有差异,没有技术手段可以阻止比特币分裂成两个币。两种币,并没有任何技术手段可以促使其他各方参与或不参与硬分叉。

隔离见证软分叉(Segwit)的危险

正如我们前面提到的,Segregated Witness 是一个软分叉,旧版本仍然兼容。 升级时,可以防止“忘记升级提示”。 这也算是一个很模糊的优势,到底有没有用,很值得怀疑。 相比之下,这次软分叉的弊端就严重多了。 或者画个图看看:

隔离见证地址可以转普通_比特币收币地址_比特币隔离见证地址

从Block7开始,系统增加了Segwit功能。 这个任何人都可以花的地址已经在介绍脚本的前一段中介绍过了。 假设 Block7 中的一个 Segwit 交易将硬币发送到任何人都可以消费的地址 C,并且签名放在外面。 假设地址C的所有者打算在Block8中花钱,将币发送到地址D,诚实的矿工会验证用户C的签名,安全性与之前基本相同。 在这里,读者可以看到“这笔钱是C的吗?”的问题。 取决于挂在 Block7 下的小签名。 如果只看Block7的信息,就会得出“这笔钱没有人捡到”的结论。

众所周知,这个Segwit功能是一个软分叉,也就是说旧版本的软件在不升级的情况下仍然会识别Segwit版本发送的区块。 旧版本的软件根本看不到这个小标志。 遗留钱包软件(全节点或 SPV 钱包)看到钱是无主的,任何人都可以花掉。 幸运的是,计算能力水平必须全面升级。 如果旧版钱包软件提出转账,会被所有算力拒绝。 你只能看着没有主人的钱坐在那里。 旧版钱包无法正确获取交易信息,但验证机制被绕过,无法发现交易模型发生变化。 前面我们介绍过,区块链的一个特点就是后一个区块依赖于前一个区块的区块头中的信息。 如果一个交易被修改,区块头就会发生变化,这将导致整个链条发生故障。 但是现在Segwit的“插件见证块”不在这条链上,修改sig中的内容不会使这条链失效。 如果我有算力但不是C地址的所有者,我不能提供C地址的签名,但是我把C地址的钱转给自己,这个区块肯定会被其他矿池拒绝,因为他们验证了找到的sig我没有资格动这个钱。 但是无论是旧钱包(全节点或SPV钱包)还是新SPV钱包(不验证与自己无关的交易,只接收区块头)都不会发现。 他们只会跟着最长的块走,不会查到sig的内容。 有效与否。

因此,Segwit 带来了一种新型的 51% 攻击。 我在之前的回答中介绍了这种攻击:

通用币51%攻击:我在12345高处发布交易,从地址A发送1000个比特币到地址B,同时用我压倒性的算力挖出一条12344-12345-12346的链,不包括刚才的交易。 这样,B一开始以为我付款了,但是后来我付款的区块被隔离了,最终形成的最长链上并没有包含我的付款。 这就是为什么各大交易所都要求3次确认和6次确认,以防止你发送币到交易所的交易被隔离。 一般认为,6次确认后,几乎不会出问题。 小额支付(数万美元以下)往往有 1 个确认甚至 0 个确认(当区块未满时),因为你没有经济动机去攻击小额交易。 小额没有利润,大额肯定需要多个区块的确认,很难做到,而且没有利润,攻击窗口是交易完成后的一两个小时释放,交易通过后就没有办法攻击了。 因此,比特币目前还没有真正的 51% 攻击。

SW币51%攻击:Segwit交易带来“AnyOneCanSpend”地址,本质上是一个空白的交易签名。 这笔交易的签名被移动到一个额外的见证区块,因此这种技术被称为“隔离见证”。 当然,虽然这笔交易的签名不在这里,但矿池肯定会在附带的见证区块中找到它进行验证。 在大家查证的情况下,安全性还是一样的。 控制50%以上算力的矿池主池可以直接放弃对附加见证块的验证,将AnyOneCanSpend地址中的钱转给自己,然后隔离那些检查见证块的矿池。 由于Segwit是软分叉升级,原来没有Segwit功能的SPV钱包和全节点钱包仍然可以使用,这些钱包不具备检查额外见证区块的能力。 这时候,这些钱包就会认为矿工的链是合​​法的最长链。 与普通币51%攻击的巨大区别在于,普通币51%攻击只能返还自己的一笔款项,而SW币51%可以花掉别人账户里的钱,而这笔钱的数量是从SW激活后,慢慢积累和增加的。 SW 运行时间越长,使用的 SW 交易越多,金额越大,越容易找到有攻击力的算力。 参考:SegWit 的风险 - 矿业卡特尔 - nChain

软分叉可以在不惊动普通用户的情况下秘密进行。 启用S​​egwit的功能是软分叉,禁用Segwit的功能也是软分叉,同样可以暗中进行。 一旦使用Segwit功能,将币放入AnyOneCanSpend地址,只有51%的算力可以相信不会执行禁用Segwit功能的软分叉。 如果你不使用Segwit功能,把币放在“经典”1地址,任何软分叉都不会让你丢币,除非大部分算力对你的币存地址发起硬分叉,才能转账这个地址的钱到另一个地址。 显然,这种硬分叉不可能成为主流,估计中本聪也不会得到这种待遇。 放置在前缀为1的地址的货币就是你的货币,只有你可以转出和出售,其他人不能。 放置在 Segwit 地址中的硬币取决于采矿业的完整性。 如果超过51%的算力发起取消Segwit的软分叉,剩下的49%必须有算力发起硬分叉才能摆脱。 拥有51%算力的最长链,留住你的币。 但是现在的隔离见证链的座右铭是“We don't hard-fork”,是不是有点尴尬?

有人会说51%的算力不可能发起关闭Segwit功能的软分叉。 我同意这一点,但也许你不需要 51% 的计算能力来做到这一点。 如果我是在搞矿池,占5%的算力,我挖出一个区块后,签名部分会延迟1分钟才发出。 其他矿池敢在这1分钟内根据我的区块挖出下一个区块吗? ? 如果你去挖,一分钟后你收到签名的内容时,你可能会发现这个区块有非法交易,这一分钟就浪费了。 如果不挖,一分钟后签名内容正常,浪费一分钟。 我只需要用5%的算力来捣乱,每天出几个块,就足以让很多矿池修改软件设置,在没有收到签名的情况下开始挖矿了。 扰乱矿池可以逐渐将签名延迟更长的时间,比如10分钟后发送。 很少的计算能力会使签名的严格验证成为一件代价高昂的事情。 不验证签名的矿工赚得更多,这在隔离见证之前的比特币上是不可能的,但现在是可能的。 如果30%的算力不验证附加签名块,那么我只需要21%的算力就可以发起上述Segwit特有的51%攻击。

隔离见证软分叉(Segwit)无法扩展

Core的开发者一直宣传Segwit可以带来1.3x,后来又说1.7x,四舍五入到2x的扩容效果。 从交易笔数来看,自2017年8月中旬激活Segwit以来,每区块交易笔数勉强突破前期高点2250笔,并没有1.1倍的扩张效应。 每个区块2000+交易的交易容量是不够的,必须尽快完善。 对此没有异议。 Core 的开发者不再提“Segwit 具有立竿见影的扩容效果”这几个字眼,而是专注于推广闪电网络。 “小额交易闪电直达,手续费几乎为零,大额结算50美金即可在主链结算”,这已经是Core支持者的信仰宣言。

第二层交易网络

让我们简单比较一下 BCH 的“传统”单层模型和闪电网络的二层模型。

在手续费方面:

按照50美元的大额交易手续费计算(50美元是今天的服务费水平),闪电网络通道的开启和关闭需要一笔交易,就是100美元的成本(闪电节点不包括在内)。 如果在每个渠道的结算过程中平均发生1000笔交易,那么每笔交易的成本是10美分,勉强算得上是一个比较低的手续费水平。 1000笔交易需要通过什么渠道结算? 在我的想象中,我只能把这个想象成支付宝,银行或者地下钱庄的模式,充值我的币,慢慢花。 可能在交易所等机构中比较有用,但对普通用户其实没什么用。

按照每个区块开启和关闭2000个闪电网络通道(1M限制),每个通道1000笔交易,在BCH模型中,100万笔交易差不多是500MB的区块。 nChain 和 BitcoinUnlimited 联合测试过 1GB 的区块,不是很科幻。

安全:

Segwit的安全问题已经是一个很好的反例。 区块链,即数字签名链,是中本聪的杰作,也是比特币与支付宝、银行、信用卡的根本区别。 在比特币中,现在是 BCH,没有私钥,没有人可以转移你的钱。 你必须有私钥才能把钱转移到指定的地方。 尽管闪电网络声称已经进行了多轮测试,但“如何保证通道内的交易不被修改”的问题仍然没有得到明确的回答。 如果有人能提供好的信息,将不胜感激。 以我目前的理解,闪电通道基本上是充值卡模式,加上双方通过多次交换签名对余额达成共识。 但是,如果双方有意或无意对平衡产生分歧,则需要由闪电节点决定。 Segwit 的问题再次出现:有人可以在没有你的数字签名的情况下转移你的钱。

技术方面:

我刚刚编的。 目前还没有对如此大流量的闪电网络进行公测。 考虑到闪电通道中反复交换签名的设计,在同样的硬件瓶颈下,闪电网络的交易能力堪忧。

结语

当我打这篇文章的时候,BTC正在暴涨,BCH等所有币种都被“抽血”下跌。 同时,BTC还有17万笔未确认交易,单笔交易手续费在50美元左右。 Steam宣布将放弃比特币支付渠道比特币隔离见证地址,因为手续费太贵,无法使用。 Bitpay宣布将投资支持比特币以外的各种货币,也是因为手续费太高。

市场在短时间内是非理性的,股票在这个混乱时期大涨大跌屡见不鲜。 如果再过十年,什么样的货币会成为市场的主流? 一个不易动弹又担心安全的BTC,真的能保值十年吗? 现在BTC确实有保值增值功能。 在过去几年的任何一个时间点,甚至过去几个月的任何一个时间点买入,今天都赚了很多钱。 暴涨总有一个头。 如果BTC停止暴涨,失去了支付渠道和商户支持的BTC就没法上新闻了。 在投资者圈子里,不再暴涨的BTC也将失去增值保值能力。 如今,加密货币都是新事物。 严格来说,BTC还没有进入大众视野。 新闻中的BTC只是暴涨,没有应用。 近两年,很少有新投资的加密货币只买BTC。 他们都是用ETH和其他货币投资的。 BTC在币圈并没有那么火爆。 毕竟,它会淡出公众视野,越来越受欢迎。 越小众。 十年后能成为主流的货币,一定是未来几年第一个真正进入大众视野的货币。 我猜这个货币是BCH。