Git的内部数据结构是一棵数据对象树,其中每个对象仅指向其前身。每个数据块被散列。当保存的哈希值和实际哈希值发生偏差时,将注意到修改(位错误或攻击)中间块。
这个概念与区块链有何不同?
Git并未作为块链的示例列出,但是至少在摘要中,这两种数据结构的描述看起来都是相似的:数据块,单向反向链接,哈希等。
那么Git不叫做区块链又有什么区别呢?
Git的内部数据结构是一棵数据对象树,其中每个对象仅指向其前身。每个数据块被散列。当保存的哈希值和实际哈希值发生偏差时,将注意到修改(位错误或攻击)中间块。
这个概念与区块链有何不同?
Git并未作为块链的示例列出,但是至少在摘要中,这两种数据结构的描述看起来都是相似的:数据块,单向反向链接,哈希等。
那么Git不叫做区块链又有什么区别呢?
Answers:
git
由于多种原因,它不是区块链技术的示例(这是我想到的第一个):
在区块链实现中,每个区块在添加到区块链之前都要经过多次独立验证。这确实是区块链技术最重要的事情之一,也是确保其“不可破解性”的原因。另一方面,许多git
项目不需要独立的验证,而当他们这样做时,它们只需要一个人在更改提交到存储库之前就签字。因此,通过您必须信任的至多一个验证点,git
打破了区块链技术的核心宗旨之一。
一个git
仓库不一定复制在许多服务器上。您可以git
在本地的存储库中工作,如果本地磁盘已损坏,则将丢失所有内容。区块链技术意味着跨服务器复制总账。
您可以重写git
历史记录。将git push <remote> <branch> --force
where <branch>
设置为比at更早的状态<remote>
将重写历史记录。在区块链中,分类账是一成不变的历史。
push --force
单个分支上执行操作时,您将丢失对垃圾收集器清除的提交的引用。这与fork不同,fork不是重写历史,而是替代的开发路径。
Git和区块链看起来相似的原因是因为它们都使用merkle树作为其底层数据结构。merkle树是其中每个节点都用其内容的加密哈希值标记的树,其中包括其子节点的标签。
Git的有向无环图恰恰是一棵Merkle树,其中的每个节点(标签,提交,树或Blob对象)都用其内容的哈希值和其“子级”的标签进行标记。请注意,对于提交,“子级”一词与Git对父级的理解有些冲突:父级提交是提交的子级,您只需要将图看成一棵通过重新植根而不断增长的树。
区块链与此非常相似,因为它们也一直以这种方式增长,并且它们还使用其merkle树属性来确保数据完整性。但通常,区块链不仅被理解为默克尔树,还被理解为与“愚蠢的内容跟踪器” Git分开的地方。例如,区块链通常还意味着在块级别具有高度分散的系统(并非所有块都需要位于同一位置)。
了解区块链有点困难(就个人而言,我距离了解它还很远),但我认为了解Git内部是理解默克尔树的好方法,这无疑有助于理解区块链的基本组成部分。
Blockchain
是不是随便一个块的任何链。
Blockchain
就是当有两个或两个以上的分支被转移时,并且不需要中央授权来确定主链时的一种方法。
与加密货币区块链不同; git没有p2p不信任共识机制。
尽管区块链和git都使用merkle树作为数据结构,但目标却不同。
甲blockchain
通常由对等网络的网络附着于用于节点间通信和验证新块的协议来管理。一旦记录,任何给定块中的数据都不能追溯更改,而无需更改所有后续块,这需要网络多数同意。
根据比特币白皮书:
纯粹的点对点版本的电子现金将允许在线付款直接从一方发送到另一方,而无需通过金融机构。数字签名提供了该解决方案的一部分,但是如果仍然需要一个受信任的第三方来防止重复支出,则将失去主要优势。我们提出了一种使用对等网络解决双花问题的解决方案。网络通过将事务散列到正在进行的基于散列的工作量证明链中来对事务进行时间戳记,从而形成一条记录,除非重做工作量证明,否则无法更改该记录。最长的链不仅可以证明所见证事件的顺序,还可以证明它来自最大的CPU能力。只要大多数CPU能力由不合作攻击网络的节点控制,它们就会 会产生最长的链并超过攻击者。网络本身需要最小的结构。消息以尽力而为的方式广播,节点可以随意离开并重新加入网络,并接受最长的工作量证明链作为其消失时发生的证据。
虽然这Git
是一个分布式版本控制系统,用于在软件开发过程中跟踪源代码的更改,它是为协调程序员之间的工作而设计的,但是它可以用于跟踪任何文件集的更改。它的目标包括速度,数据完整性以及对分布式非线性工作流的支持。
根据Linus Torvalds的说法:
在许多方面,您都可以将git视为文件系统–它是可寻址的,并且具有版本控制的概念,但是我确实是从文件系统人员的角度设计它来解决问题的(嘿,内核是我的工作) ,而实际上我对创建传统的SCM系统完全没有兴趣。
正如戳所说:
Git和区块链看起来很相似,因为它们都使用Merkle树来存储带时间戳的有序交易。merkle树是一种树数据结构,其中每个节点都用其内容的加密哈希值标记,其中包括其子节点的标记。
第一个区别是散列函数:区块链具有非常昂贵的散列函数,因此必须开采每个块,并且可以使用简单的提交消息来创建Git“块”。
比特币的目的是增加对交易顺序的信任。重点是最长的链,因为这是最昂贵的计算,因此很可能是事实。
比特币通过要求散列满足某些参数(以0的特定数量开始)来实现此目的,方法是增加消息中的值(“ nonce”)直到找到令人满意的散列。这需要费力才能找到,但是只有1个计算可以验证现时。如果多个随机数产生令人满意的散列,则该散列将变小并作为真相。其他身份验证方案通过将哈希的发布集中到某个机构(可能是通过网络协议或其他方法进行投票)来使哈希值得信赖。
区块链数据仅限于交易,交易必须符合验证条件。交易必须有效才能包含在下一个区块中。比特币交易与现实世界中的重要事物相对应,可以证明使用昂贵的区块记录这种转移是合理的,例如货币价值交换。我们实际上并不关心最终分类帐,它只是对现实世界中某些事物的隐喻。
相反,Git块是任意的,因为提交可以包含任意数量的数据。价值在于组织到git树中的数据的变化,因为我们关心最终产品,它通过git存储库的存在来验证。
Git的目的是允许廉价的“分类帐”跟踪多种产品选择。我们关心的是Git中的“分类帐”,这是我们的最终产品。交易数据仅记录产品的制造方式。我们希望使最终产品的多个版本的制造成本非常低廉,而其开销却足以要求创建者记录他们如何制造此产品。无需对数据进行任何明确的验证,如果最终产品看起来不错,则可以维护该产品,并且这种存在使拥有该产品创建链非常有用。如果最终产品不好或提交顺序无效,则在垃圾回收期间将删除此“分类帐”。
第二个区别是,区块链交易必须来自先前的有效来源。在Git中,我们不在乎您用于扩展树的数据。在区块链中,交易必须来自先前的有效来源。从这个意义上讲,Git跟踪我们环境的扩展,而区块链跟踪封闭环境中的价值交换。