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

320

Git的内部数据结构是一棵数据对象树,其中每个对象只指向它的前身。每个数据块都被散列。修改(比特错误或攻击)中间块时,将在保存的哈希值和实际哈希值不同时被注意到。

这个概念与区块链有何不同?
Git没有被列为区块链的例子,但至少在总结中,两种数据结构的描述看起来很相似:数据块、单向反向链接、哈希等)。

那么,Git之所以没有被称为区块链,区别在哪里呢?


3
Git没有被列为区块链的示例。当我第一次尝试学习什么是区块链时,有人告诉我git是最突出的例子(我现在没有确切的链接,但它是从谷歌搜索“区块链”返回的列表中排名最靠前的)。 - Leon
9
Git 和区块链都使用 Merkle 树作为它们基本的底层数据结构。但这并不能使 Git 成为区块链,反之亦然。如果你了解 Git(以及它的内部机制),你就会了解 Merkle 树,这对于理解区块链的工作原理非常有帮助。 - poke
2
这是你的观点,即“它不被认为是...” - v.oddou
10
自1979年以来,Merkle树一直存在。仅仅因为两种技术在其概念中广泛使用Merkle树,并不意味着它们是相同的。将Git或区块链简化为只是Merkle树是不正确的,因为它们都不是Merkle树,只是使用了它们。这使得所链接的文章完全无关,因为它实际上谈论的是Merkle树,而不是区块链。 - poke
2
你能引用这句话吗:“Git 不被认为是区块链”? - Jannis Ioannou
显示剩余7条评论
10个回答

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

Git的有向无环图正是这样一个Merkle树,其中每个节点(标记,提交,树或blob对象)都带有其内容的哈希值和“子节点”的标签。请注意,对于提交,"子节点"一词与Git对父项的理解有些冲突:父提交是提交的子节点,您只需将图形视为通过重新确定根而不断增长的树即可。

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

理解区块链有点困难(就我个人而言,我仍然远未理解其中的一切),但我认为理解Git内部原理是了解Merkle树的好方法,这绝对有助于理解区块链的基本部分。


64
抱歉,但区块链带来的东西与 Git 没有什么不同。区块链与 Git 同样愚蠢。如果你不这么认为,那就是被炒作了。节点网络和共识系统是另外两个不同的事情。 - v.oddou
12
私有账本(区块链)在概念上与Git相同。 - Munhitsu
11
Git 是一种区块链技术。对于需要“高度分散化系统”等异议,这些都是实现上的细节。 - Lumi
2
所以,这个答案想要表达的意思是Git不是区块链,因为区块链通常也意味着在区块级别上拥有高度去中心化的系统。除了提供这个被许多人认为是错误的“例子”之外,这个答案似乎并没有描述为什么。我错过了什么吗? - Yasushi Shoji
3
“blockchains通常也意味着拥有高度分散的系统,并且不需要所有区块都在同一个地方”,Git 也是这样吗?您可以使用“浅层克隆”(shallow)或“部分克隆”(partial clones)。 - Bergi
显示剩余3条评论

88
这个问题是:为什么Git不被认为是“区块链”?因此,这在断言有一种普遍的观点认为Git不是区块链(这一观点在本页上我的答案之前得到了说明和证实),并询问普及这种观点的原因。这是一个好问题。
从字面上理解这个问题,答案可能是区块链术语和概念作为称为“比特币”的数字货币操作的一部分而变得流行,并因此与比特币的操作方式相关联:通过使用大量计算能力来计算特定哈希值(包括nonce)以满足某些任意要求,声称没有中央机构,独立,甚至民主,以及其他的东西;由于这些事情在Git中看不到,所以Git不能成为区块链,对吧?因此,问题将从字面上得到回答。
隐藏在这个表面问题后面的是另一个问题:什么是区块链?现在你可以在某个地方查找定义并复制它,但我没有这样做,因为多年前我就已经明确了自己的想法,当时我听了一个关于比特币的播客,试图解释区块链的新概念,即区块链的工作方式类似于Git,我不打算让我的宝贵理解被互联网上的随机声明误导。
那么什么是区块链?这个词里面有什么?
术语“区块链”中没有任何预设要求在内容中包含nonce以产生所需数量的前导零的哈希值。(这个要求只是为了能够通过计算能力和最终通过货币来控制区块链。)
术语“区块链”中没有任何预设要求存在网络,更不用说去中心化的网络了。
术语“区块链”中没有任何“独立”于“中央机构”的要求。
术语“区块链”只预设了块(数据)链接在一起。现在,什么是链?它只是一个链接吗?不,它是一个强大的链接,旨在通过力量将事物连接在一起。
一个简单的链接列表不符合区块链的条件,因为列表中数据块的内容可以被改变,而列表仍然可以很好地前后链接。这不是链的工作方式。
要将数据块的链接变成数据块的链,需要以某种方式对块的内容进行校验和(摘要),并且此校验和(摘要)必须是链接的一部分,使其成为保护内容的强链接,防止其被更改。这就是区块链。
这也是Git所做的,因此Git是一个区块链,或者如果你愿意,可以将其视为一个区块链。
为了圆满解答,我们再问一次:为什么 Git 不被认为是“区块链”?可能是因为许多人,甚至大多数人,不关注一个概念的本质,而是关注闪烁的意外

3
我同意你的观点(或者至少我不反对):Git应该被视为区块链。但是,如果需要更多证据证明许多人持不同看法(除了这里其他答案),请参考维基百科:https://en.wikipedia.org/wiki/Blockchain。 - iconoclast
区块链是不可变的(Git允许rebase),并且依靠冗余网络挖掘的共识,网络规模越大,安全性就越高。 - lacostenycoder
你可以分叉一个区块链并重写区块,就像你可以分叉一个Git仓库并重写历史记录一样。两者在某种意义上都是不可变的,在另一方面则是可变的。 - DylanYoung

31

区块链不仅仅是一些块的任意链接。

当出现两条或更多分支时,区块链依旧能够确定主链的方式,并且不需要中央机构进行决策。


2
根据这个定义,“permissioned blockchain”没有意义,因为它们实际上有一个中心机构。因此,你的定义与单词的实际用法相矛盾。例如,请参见半中心化(联邦)的区块链,如 Liquid。 - Janus Troelsen
6
“权限区块链”(或“私有区块链”)是一种矛盾之词,实际上毫无意义,所谓的中心化区块链在功能上与常规服务器或常规 P2P 网络没有任何区别。这些术语(私有/权限/中心化区块链)仅在专业社区以外使用。 - Daniel Vartanov
但是R3是一家专业公司,他们使用它:https://www.r3.com/blog/how-public-permissioned-blockchains-are-not-an-oxymoron-2/ - Janus Troelsen
1
R3曾因滥用“区块链”一词来推销其软件而在社区中受到嘲笑,即使2008年的初始论文未被发表,该软件也可以轻松存在。恐怕引用R3的权威是无效的。 - Daniel Vartanov
3
在区块链中,例如比特币,需要进行不必要和不合理的计算来维护中央权威,而这个中央权威实际上只是由拥有最多计算能力的一方所组成。 - Lumi
1
@ocodo 在 Git 中,您所说的“在两个或多个分支时确定主链的一种方法,并且在该决定中不需要中央机构”的意思是什么? - Daniel Vartanov

30

像比特币这样的加密数字货币使用分布式一致性的块链技术(默克尔树)。通常使用简称为“区块链”。

虽然Git也使用了块链技术(默克尔树),但它缺乏“区块链”这个术语通常所涵盖的分布式一致性加密组件。


5
不具体说明“分布式共识”需要什么,这种区别就不重要了。如果PoW阈值很低,任何人都可以覆盖您的区块链。 - Janus Troelsen
1
比特币中不合理和不必要的密码要求只是为了使区块链需要计算能力,从而可以通过购买计算能力来主导,因此也就掌握了财务实力。 - Lumi
@JanusTroelsen 我认为作者的意思是,存在一种算法,没有中央机构来决定主链。在git中,从技术上讲,没有主链,任何人都可以宣布自己的主链。由于某个对象(资产)并不稀缺,所以对于git来说并不重要。 - Cigarette Smoking Man

20

与加密货币区块链不同,Git没有点对点的无信任共识机制。


10
为什么您认为无需信任的共识系统是区块链的一部分?在区块链中有许多建立信任的方法,例如对于Git而言,您只需要知道本地副本中的所有内容不会在下一次拉取时被删除,并且明确指定您希望在远程副本中进行更改。只有当不清楚正确性时才需要无需信任的共识。在Git中,多个分支可能都是“正确”的,最终可能会合并在一起。 - allo
GitHub通常被用作中心真相的来源,但是管理员强制推送并覆盖历史有什么阻止方法吗?如果没有GitHub,您从同行那里拉取代码时,如何处理合并冲突?您如何确定谁是正确的? - Miguel Mota
7
没有任何事情能阻止你强制推送。但正如区块链所保证的那样,我可以检测到你的推送,因为我的链不能将这些提交验证为基于它的。这就是区块链的关键,而不是分散式共识。在Git中,我明确地不想为我合并的内容设定共识协议(开发不是民主),但当我将新提交合并到我的链中时,我会实际阅读它们。因此,我的副本是正确的,因为它包含了我已经拥有并可以验证的东西(例如通过查看合并冲突),以及我审核后接受进来的东西。 - allo
2
@allo,你说得没错,但是我在回答中提到的是“加密货币区块链”,而不是一般的区块链。不过现在我想了想,我的回答似乎并不适合所问的问题,因为我考虑的是整个系统,而不是底层数据结构。 - Miguel Mota
你对于git和加密货币中使用的区块链的差异是完全正确的。但这并不是回答为什么(或是否)在严格意义上使用术语时,git不被认为是一个区块链的问题的答案。即使目前被接受的答案与你的答案相似,我仍然更喜欢获得赏金的答案。 - allo

15

没有理由不把 Git 视为一种区块链。Git 专注于一组非常特定(也很重要)的资产:源代码。在这种情况下,共识是手动进行的,并且我们可以认为当提交并合并到发布分支时,一个交易(commit)被接受了。

实际上,考虑到交易(commits)的数量,Git 是迄今为止最成功的区块链。

摘自:https://arxiv.org/pdf/1803.00892.pdf "... ... 我们定义了 “区块链” 和 “区块链网络”,然后讨论了两种非常不同的、众所周知的区块链网络类别:加密货币和 Git 存储库 ……"

另请参阅下一篇论文,该论文解释了为什么谷歌使用单个 monorepo 作为事实的唯一来源(基本上,作为区块链)。 https://research.google/pubs/pub45424/


13
总之(对于我来说):
尽管Git为您提供了完全的自由选择,但区块链是一个高度政治化的系统,您被迫信任他人:
- Git是一个没有预定义共识算法的Merkle树。 - 区块链是具有预定义共识算法的Merkle树。
因此,如果您孤身一人,Git和区块链之间没有区别。 因为您信任Git和自己,已经有了预定义的共识。
但是当您处于网络中时,情况开始变得不同。

注意:

  • 对于区块链来说,没有必要使哈希难以计算或定义类似“挖矿”之类的东西,也不需要特定的软件来确保您参与某个网络。
    这可能是比特币(通常被称为加密货币,我不能完全同意)之类的东西所必需的,但比特币既不定义什么是区块链,也不需要像比特币那样。

  • 共识算法不一定是基于某些加密协议的东西。例如,每天在当地报纸上发布TIP就足以(滥用)Git作为一种区块链。

Git提供了多种可能的共识算法供您选择:

  • 在报纸或类似物品上发布SHA(分布式且难以伪造的东西)

  • 如果您已经是GnuPG Web Of Trust的一部分,您可以立即使用Signed Commits(或Signed Tags)来达成共识。

  • “Signed off:”变体并不提供加密安全的共识,但与类似于Gerrit和Fast-Forward-Only推送相结合,它是一种非常明确定义的共识算法。

因此,要使Git成为区块链,您只需要添加一些空气


一些不同的观点:

Git本身并不是区块链。相反,它远不如区块链(缺乏预定义的共识算法),但也远比区块链更多(允许选择大量的共识算法,旨在作为源代码管理工具等)。


以下是一些其他观察:

  • Git分支与区块链分叉相同。虽然区块链分叉很少发生,但大多数Git存储库的分支比比特币有分叉少。

  • Git总是由您进行明确的共识,即您要推送的TIP。但是,这仅适用于您而不适用于其他人。
    将Git存储库推送到某个共享Git服务也可以视为共识。此类共识没有基于民主原则的要求。


非常个人的想法:

尽管区块链是一些被过度炒作的流行语, 你可以愉快地没有它而生活,但Git是一个不可避免的基本工具,用于完成你的工作,你不能没有的基本必备品,就像空气和水一样重要。这可能是为什么像我这样的人不把Git称为区块链的原因..

您的情况可能有所不同。


1
精彩的总结。 - stevegt

8

正如poke说的那样

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

第一个区别是哈希函数:区块链具有非常昂贵的哈希函数,以便每个块都必须进行挖掘,而Git的“块”可以通过简单的提交消息创建。

比特币的目的是为交易排序添加信任。焦点在于最长的链,因为这是计算成本最高的,因此最有可能是真相。

Bitcoin通过要求哈希满足特定参数(以特定数量的0开头),通过在消息中递增一个值(“nonce”)直到找到满意的哈希来实现这一点。这需要努力才能找到,但只需验证一次计算的nonce;如果多个nonce产生满意的哈希,则其中一个将更低并被视为真相。其他认证方案通过将哈希的发放集中化给某个权威机构(可能由网络协议投票或其他方法)来使哈希值可信。
区块链数据仅限于交易,必须符合验证规则。交易必须有效才能包含在下一个区块中。比特币交易对应于现实世界中的重要事物,证明了使用昂贵的区块记录此转移的价值,例如货币价值的交换。我们实际上并不关心最终账本,它是现实世界中某种东西的隐喻。
相比之下,Git块是任意的,因为提交可以包含任意数量的数据。价值在于将数据的更改组织成git树,因为我们关心最终产品,它通过git存储库的存在进行验证。
Git的目的是允许廉价的“分类帐”来跟踪多个产品选择。Git中的“分类帐”是我们关心的,这是我们的最终产品;交易数据只记录产品如何构建。我们希望制作多个最终产品版本非常便宜,只需要足够的开销要求创建者记录他们如何构建此产品。数据上没有明确的验证,如果最终产品看起来不错,你可以保持最终产品存在性,并且具有产品创造链的优点。如果最终产品不好或提交的顺序无效,则在垃圾收集期间删除此“分类帐”。
第二个区别是区块链交易必须来自先前有效的来源。在Git中,我们不关心您使用哪些数据来扩展树。在区块链中,交易必须来自先前有效的来源。从这个意义上说,Git跟踪环境的扩展,而区块链跟踪封闭环境内的价值交换。

5
目标对于区块链和Git是不同的,尽管两者都使用默克尔树作为数据结构。
区块链通常由遵循节点间通信协议和验证新块的点对点网络管理。一旦记录,任何给定块中的数据都不能在没有所有后续块的修改的情况下进行后期更改,这需要网络大多数的共识。
根据比特币白皮书:
“纯粹的点对点电子现金版本将允许在线支付直接从一方发送到另一方而无需经过金融机构。数字签名提供了部分解决方案,但如果仍需要一个可信赖的第三方来防止双重支付,则主要优势将会失去。我们提出了使用点对点网络解决双重支付问题的解决方案。该网络通过将交易的时间戳哈希为基于哈希的工作量证明的持续链,形成一个不可更改的记录,而要重新进行工作量证明,则需要改变所有内容。最长的链不仅作为见证事件序列的证明,还证明它来自CPU算力最大的池子。只要控制大多数CPU算力的节点不合作地攻击网络,他们就会生成最长的链并超越攻击者。网络本身需要最少的结构。消息是在最佳努力的基础上广播的,并且节点可以随意离开和重新加入网络,接受最长的工作量证明链作为他们离开时发生的事情的证明。”
而Git是一个分布式版本控制系统,用于跟踪软件开发过程中源代码的更改。它旨在协调程序员之间的工作,但也可以用于跟踪任何一组文件的更改。其目标包括速度、数据完整性和对分布式、非线性工作流的支持。
根据Linus Torvalds:
“在许多方面,你可以将git视为一个文件系统——它是内容可寻址的,并且它具有版本控制的概念,但我真正设计它的方式是从文件系统人员的角度来看待这个问题(嘿,在内核领域我的工作就是这个),而且我实际上对创建传统的SCM系统没有任何兴趣。”

1
一种理解任何技术的好方法是询问:“它解决了什么问题?” Git 的用例非常简单,因为它的预期用途是版本控制/源代码控制。
Git 是什么?
“Git 是一个免费的开源分布式版本控制系统,旨在以速度和效率处理从小型到非常大型项目的所有内容。”(参见 https://www.git-scm.com/
因此,很明显,预期使用的问题是“分布式版本控制”。仅此而已,没有更多,也没有更少。许多证据都可以轻松获得。
“版本控制 - 也称为源代码控制或修订控制 - 是跟踪和管理对代码和其他文件所做更改的重要软件开发实践。它与源代码管理密切相关。”(gitlab source
什么是区块链?
“区块链是一种点对点的去中心化分布式账本技术,可以使任何数字资产的记录透明且不可更改,并且无需涉及任何第三方中介。它是一项新兴和革命性的技术,由于其在可扩展性上降低风险和欺诈的能力而引起了很多公众的关注。”(引自blockchain-council.org
“不重复之前回答中已经概述的区块链技术的技术细节(如挖矿、分布式网络),简单地说,区块链是解决与Git解决的完全不同问题的解决方案。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接