为什么Git不被视为“区块链”?


174

Git的内部数据结构是一棵数据对象树,其中每个对象仅指向其前身。每个数据块被散列。当保存的哈希值和实际哈希值发生偏差时,将注意到修改(位错误或攻击)中间块。

这个概念与区块链有何不同?
Git并未作为块链的示例列出,但是至少在摘要中,这两种数据结构的描述看起来都是相似的:数据块,单向反向链接,哈希等。

那么Git不叫做区块链又有什么区别呢?


2
Git未列为区块链的示例当我第一次尝试了解区块链是什么时,我被称为git是最突出的示例(我现在没有确切的链接,但这是从顶部开始的)。 Google搜索返回的“ blockchain”返回的列表)
Leon

2
Git和区块链都使用merkle树作为其基本的基础数据结构。但这本身并不能使Git成为区块链,反之亦然。–如果您确实了解Git(及其内部),但您确实知道merkle树,这对于了解区块链的工作原理可能是非常有帮助的启示。

24
亲爱的亲密的选民,您能解释您的原因吗?我看到了2个赞,好评论和答案。为什么基于意见?它与数据结构和算法有关,这些结构和算法无法将Git视为区块链。
Paebbels

2
您认为“不考虑...” bitcoin.stackexchange.com/a/43627/77469
v.oddou

4
@ v.oddou Merkle树自1979年以来就存在。仅仅因为两种技术在其概念中突出使用Merkle树,这并不能使它们相同。将Git或块链减少为仅merkle树是不正确的,因为它们都不 merkle树。他们只使用它们。这使得链接的帖子完全无关紧要,因为它实际上是在谈论Merkle树,而不是区块链。

Answers:


53

git 由于多种原因,它不是区块链技术的示例(这是我想到的第一个):

  1. 在区块链实现中,每个区块在添加到区块链之前都要经过多次独立验证。这确实是区块链技术最重要的事情之一,也是确保其“不可破解性”的原因。另一方面,许多git项目不需要独立的验证,而当他们这样做时,它们只需要一个人在更改提交到存储库之前就签字。因此,通过您必须信任的至多一个验证点,git打破了区块链技术的核心宗旨之一。

  2. 一个git仓库不一定复制在许多服务器上。您可以git在本地的存储库中工作,如果本地磁盘已损坏,则将丢失所有内容。区块链技术意味着跨服务器复制总账。

  3. 您可以重写git历史记录。将git push <remote> <branch> --forcewhere <branch>设置为比at更早的状态<remote>将重写历史记录。在区块链中,分类账是一成不变的历史。


104
“在区块链中,分类帐是一成不变的历史。” -git历史也是。当“重写历史记录”时,您从过去的某个点开始并添加新的提交。区块链也可能发生这种情况,实际上,每次发生分叉时都会发生这种情况,即使以后将其丢弃也是如此。
Holger Just

8
据我了解区块链与Git的关系,您也可以重写区块链,除非您解决了哈希冲突问题。对于Git,是的,您可以重写,但是所有遥控器仍然具有原始历史记录。重写历史记录会创建新的哈希值和不同的树。如果区块链没有进行这样的操作,那不是一个有效的参数,因为如果需要的话,我可以实现它。或者相反,我可以通过将分支设置为受保护来拒绝强制推送。
Paebbels

4
@HolgerJust的git历史是可变的。在push --force单个分支上执行操作时,您将丢失对垃圾收集器清除的提交的引用。这与fork不同,fork不是重写历史,而是替代的开发路径。
houtanb

24
我们可以总结一下,可以通过应用特殊的工作流程并禁止若干操作来以区块链模式操作Git?
Paebbels

4
@Paebbels是的,我同意这一点。默认情况下不是这样,但在常规使用中会这样。
houtanb

123

Git和区块链看起来相似的原因是因为它们都使用merkle树作为其底层数据结构。merkle树是其中每个节点都用其内容的加密哈希值标记的树,其中包括其子节点的标签。

Git的有向无环图恰恰是一棵Merkle树,其中的每个节点(标签,提交,树或Blob对象)都用其内容的哈希值和其“子级”的标签进行标记。请注意,对于提交,“子级”一词与Git对父级的理解有些冲突:父级提交提交的子级,您只需要将图看成一棵通过重新植根而不断增长的树。

区块链与此非常相似,因为它们也一直以这种方式增长,并且它们还使用其merkle树属性来确保数据完整性。但通常,区块链不仅被理解为默克尔树,还被理解为与“愚蠢的内容跟踪器” Git分开的地方。例如,区块链通常还意味着在块级别具有高度分散的系统(并非所有块都需要位于同一位置)。

了解区块链有点困难(就个人而言,我距离了解它还很远),但我认为了解Git内部是理解默克尔树的好方法,这无疑有助于理解区块链的基本组成部分。


24
对不起,但是区块链无处带来比git更强大的功能。区块链与git一样愚蠢。如果您不这样认为,那么您就大肆宣传。对等网络和共识系统是分开的。
v.oddou

2
私人分类帐(
区块

通常,在git存储库中,只有一个根提交,但可以有任意数量的分支。如果您将分支中的最后一次提交视为根提交,将父项视为孩子,则您有一棵树,其中有许多根在生长……我认为这只是默克尔树的一种变体,其中父引用位于内容中,而不是子引用。可能有多个父母和孩子,所以它甚至都不是一棵树。
赫尔曼

22

像比特币这样的网络货币,使用分布式共识密码块(merkle树)。常见用法已将其缩短为“区块链”

虽然git使用一连串的块(merkle树),但它缺少术语“ BlockChain”的常用含义所暗示的分布式共识密码学组件。



17

加密货币区块链不同; git没有p2p不信任共识机制。


您为什么将不信任共识系统视为区块链的一部分?在区块链中建立信任的方法有很多,对于git来说,只是您知道本地副本中的所有内容都无法通过下一次提取来删除,并且您指定要在远程副本中进行更改。只有在不清楚什么是对的情况下,才需要不信任的共识。在git中,多个分支可以是“正确的”,并且可以将eventuell合并在一起。
allo

@allo GitHub通常被用作真理的主要来源,但是什么阻止了管理员强行推翻和推翻历史呢?如果没有GitHub,而您又退出了同行,那么您如何处理合并冲突?您如何确定谁的权利?
米格尔·莫塔

1
没有什么可以阻止您施加压力。但是就像区块链为我保证的那样,我可以检测到它,因为我的链无法验证这些提交是否基于它。这就是区块链的意义,而不是分散的同意。在git中,我明确地不想为我要合并的内容达成共识协议(发展不是民主),但是当我将新的提交合并到我的链中时,我实际上阅读了这些提交。所以我的副本正确的,因为它由我已经拥有的东西组成,因此可以验证(即通过查看合并冲突)和我查看然后接受的东西。
异体

1
@allo在这方面您是正确的,但是我在答案“ cryptocurrencyblockchains”中表示,而不是一般的区块链,但是我现在考虑一下,我的答案似乎并不符合所提出的问题,因为我当时考虑整个系统,而不是基础数据结构
Miguel Mota,

您对git和cryptocurrencies中使用的区块链的区别完全正确。严格说来,为什么(或是否)git不被认为是区块链,这并不是一个答案。即使当前接受的答案也类似于您的答案。我仍然更喜欢得到赏金的答案。
allo

1

尽管区块链和git都使用merkle树作为数据结构,但目标却不同。

blockchain通常由对等网络的网络附着于用于节点间通信和验证新块的协议来管理。一旦记录,任何给定块中的数据都不能追溯更改,而无需更改所有后续块,这需要网络多数同意。

根据比特币白皮书:

纯粹的点对点版本的电子现金将允许在线付款直接从一方发送到另一方,而无需通过金融机构。数字签名提供了该解决方案的一部分,但是如果仍然需要一个受信任的第三方来防止重复支出,则将失去主要优势。我们提出了一种使用对等网络解决双花问题的解决方案。网络通过将事务散列到正在进行的基于散列的工作量证明链中来对事务进行时间戳记,从而形成一条记录,除非重做工作量证明,否则无法更改该记录。最长的链不仅可以证明所见证事件的顺序,还可以证明它来自最大的CPU能力。只要大多数CPU能力由不合作攻击网络的节点控制,它们就会 会产生最长的链并超过攻击者。网络本身需要最小的结构。消息以尽力而为的方式广播,节点可以随意离开并重新加入网络,并接受最长的工作量证明链作为其消失时发生的证据。

虽然这Git是一个分布式版本控制系统,用于在软件开发过程中跟踪源代码的更改,它是为协调程序员之间的工作而设计的,但是它可以用于跟踪任何文件集的更改。它的目标包括速度,数据完整性以及对分布式非线性工作流的支持。

根据Linus Torvalds的说法:

在许多方面,您都可以将git视为文件系统–它是可寻址的,并且具有版本控制的概念,但是我确实是从文件系统人员的角度设计它来解决问题的(嘿,内核是我的工作) ,而实际上我对创建传统的SCM系统完全没有兴趣。


0

正如戳所说

Git和区块链看起来很相似,因为它们都使用Merkle树来存储带时间戳的有序交易。merkle树是一种树数据结构,其中每个节点都用其内容的加密哈希值标记,其中包括其子节点的标记。

第一个区别是散列函数:区块链具有非常昂贵的散列函数,因此必须开采每个块,并且可以使用简单的提交消息来创建Git“块”。

比特币的目的是增加对交易顺序的信任。重点是最长的链,因为这是最昂贵的计算,因此很可能是事实。

比特币通过要求散列满足某些参数(以0的特定数量开始)来实现此目的,方法是增加消息中的值(“ nonce”)直到找到令人满意的散列。这需要费力才能找到,但是只有1个计算可以验证现时。如果多个随机数产生令人满意的散列,则该散列将变小并作为真相。其他身份验证方案通过将哈希的发布集中到某个机构(可能是通过网络协议或其他方法进行投票)来使哈希值得信赖。

区块链数据仅限于交易,交易必须符合验证条件。交易必须有效才能包含在下一个区块中。比特币交易与现实世界中的重要事物相对应,可以证明使用昂贵的区块记录这种转移是合理的,例如货币价值交换。我们实际上并不关心最终分类帐,它只是对现实世界中某些事物的隐喻。

相反,Git块是任意的,因为提交可以包含任意数量的数据。价值在于组织到git树中的数据的变化,因为我们关心最终产品,它通过git存储库的存在来验证。

Git的目的是允许廉价的“分类帐”跟踪多种产品选择。我们关心的是Git中的“分类帐”,这是我们的最终产品。交易数据仅记录产品的制造方式。我们希望使最终产品的多个版本的制造成本非常低廉,而其开销却足以要求创建者记录他们如何制造此产品。无需对数据进行任何明确的验证,如果最终产品看起来不错,则可以维护该产品,并且这种存在使拥有该产品创建链非常有用。如果最终产品不好或提交顺序无效,则在垃圾回收期间将删除此“分类帐”。

第二个区别是,区块链交易必须来自先前的有效来源。在Git中,我们不在乎您用于扩展树的数据。在区块链中,交易必须来自先前的有效来源。从这个意义上讲,Git跟踪我们环境的扩展,而区块链跟踪封闭环境中的价值交换。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.