DAY 26- 分叉 Fork

「———≡」


分叉

网路上的传播是有时间误差的,也就是说如果今天 A 矿工成功挖到矿,并把挖到的区块公布给其他节点,
在这个公告传遍全世界的过程中,若有另外一个矿工B挖到了矿,他也把挖到的区块公布给其他节点,
那麽较靠近A的节点们就会在帐本上纪录 A 的区块,靠近B的节点们就会记录B的区块。
(这里的区块不一定一样,因为矿工可以自由选择要包进区块的交易。)

於是在网路上就出现了两种帐本,也就是有两个区块都接在上一个区块之後。
我们称这个现象为分叉,而分叉无可避免的会发生。

分叉後的链有两个接口,矿工就会选择他认可的链继续挖下去,
这时两条分叉的链就会进行一个竞赛。

在比特币链上有个最长链机制(The Longest Chain Rule),意思是只有在最长链(主链)上的交易会受到认可,
在较短的链上的交易不会被认可,交易资讯会重新回到网路中等到矿工再次打包,
打包到短链的矿工也不会获得报酬,因此矿工也会自然而然地追随最长链。

然而在乙太币链上分叉出现的机率远远大於比特币链,因为乙太链每15秒就会产出一个新的区块。
因此在乙太链上就算出现分叉,短链在之後也有机会重新接回主链,
打包短链的矿工、帮忙接回主链的矿工皆会得到报酬,只是没有正常打包报酬高,
但是只要有报酬就会有人做,所以这个机制可以运行下去。

最长链的共识造就了区块链难以遭到窜改的性质,
如果有人想窜改资料,他就必须和全世界的节点对抗,因为只有最长链上的交易会受到认可。
而这种和全世界的人对抗的攻击称为51%攻击,
因为攻击者必须以自身的能力达成世界上51%的算力,才有可能让自己所窜改的区块成为最长链,
因此实际上在算力庞大的链要达成51%攻击是不可行的,这种攻击只有可能实现在小链上。

软分叉和硬分叉

另外一种分叉是人为产生的分叉,通常是为了系统更新的时候所进行的分叉。
区块链并没有一个中心系统可以一次更新,而是由所有节点形成系统。

这有点像一个组织,组织成员都有自由选择不同的行事方式,
而透过讨论的方式它们可以决定未来走向,成员可以接受或不接受。
区块链中每个节点都是独立的个体,也没有办法制止节点进行任何事情。
因此若是区块链要进行更新,就要进行大众讨论的方式。

而讨论不一定有共识,至少不一定所有人都赞同新的做法,这时就要进行链上分叉。

  • 软分叉:新区块不能兼容旧区块
  • 硬分叉:新区块可以兼容新区块

#以下称使用更新後协定打包的区块为新区块,反之为旧区块。

软分叉顾名思义就是较为柔软,没有那麽强硬。
旧区块仍然可以继续接在链上,只是新区块不能接在旧区块上。
於是若新矿工人数较多时,旧矿工所接出的区块就会成为孤儿块(没有後续区块的区块),也就不会得到报酬。
於是旧矿工可以选择更新协定,转变成新矿工。

硬分叉为较强硬的分叉方式,
因为旧区块无法接在新区块之後,因次旧矿工要马成为新矿工,要马继续维护原链,
如果旧矿工够多,区块链就会分叉成两个不同的链,也就会产生分叉币(如BCH、ETC)。


今天的内容虽然跟密码学比较没有关系,
不过我个人认为有密码学底子的人在看区块链会比较知道在干嘛,
也更可以理解分叉在实际上到底发生了什麽事。

https://ithelp.ithome.com.tw/upload/images/20211008/20140112fQRQyUexRj.jpg

图片来源:
https://www.meme-arsenal.com/en/create/meme/1203703
https://www.potatomedia.co/post/df651897-3c56-4241-aa68-d7a7e6926c2c
https://monnos.com/en/blog/what-is-a-soft-or-hard-fork/
https://memegenerator.net/instance/75401316/bbnokay-okay-then-bye-bye-now

参考资料:
https://www.potatomedia.co/post/7fec48ce-0c06-47e0-b9d9-4cd971af5e4f#comment
https://corporatefinanceinstitute.com/resources/knowledge/other/hard-fork/
https://ithelp.ithome.com.tw/articles/10216164
https://www.samsonhoi.com/846/blockchain_hardfork_softfork


<<:  Day23 Let's ODOO: Currency

>>:  如何在 Angular 建立 Breadcrumb (面包屑)

Day18:SwiftUI Picker

前言 SwiftUI Picker 可以让我们自行选择项目, 也可以选择不同的呈现方式, 这篇文章来...

【这些年我似是非懂的 Javascript】那些年我睡掉的物件导向 #浅谈 #Part 2

嗨各位好久不见, 今天要来分享上次的续集 第 2 part , 上篇讲到建构器 今天要来分享关於继...

[Golang]恢复panic(recover、defer)-心智图总结

1. 如何让panic,包含一个值 在呼叫panic函数时,把某个值做为参数传给该函数就可以了。pa...

第五章

依照之前介绍的内容都是属於在Hostinger提供的功能面,当然还有许多细项的功能或建置时会用到的,...

[Day 26] 针对View来作测试

验证view的资料 我们也可以针对view来做测试, 透过Laravel提供的测试方法, 我们可以不...