教程网

您现在的位置是: 首页 > 百科

区块链不可篡改的工作原理是什么?

区块链不可篡改的工作原理是什么?
区块链不可篡改的工作原理是什么?理解这点需要引入一个概念:Hash算法。Hash算法有很多种,基本功能是:将任意长度的数据文件转换成一个唯一对应的固定长度字符串。你可以理解为,

区块链不可篡改的工作原理是什么?理解这点需要引入一个概念:Hash算法。Hash算法有很多种,基本功能是:将任意长度的数据文件转换成一个唯一对应的固定长度字符串。

你可以理解为,给任意一个文件生成了一串固定长度的乱码一样的标签。

这个算法是不可逆的,就是说,你拿到这个标签,无法反向推导出原来的数据文件。

如果数据文件有一点点变动,比如加了个标点符号,那么重新hash之后,新的标签也与原标签大不相同。

无法从新旧标签的差异推测数据文件发生了什么变化。因此,通过标签,可以很容易地验证某个文件在某个时刻是存在的,或者验证两个文件是否相同。

正是这种不可逆性,决定了区块链的不可更改性。每个区块中,除了十分钟内的转账交易数据之外,还有一个区块头。

区块头包含了对上一个区块数据的 hash 值。这些 hash 层层嵌套,长度固定,最终将所有区块串联起来,形成区块链。区块链里包含了自该链诞生以来发生的所有交易和所有新币发行。

假如我是坏人,我要篡改一笔交易。交易包括发送方和接收方,以及转账的数量。发送方的比特币可以一路追溯到最早新发行该币的区块。

发送方拥有这些比特币的合法性,是由该币的原始发行区块记录和该币有关的所有历史交易记录保证的。

因此,要篡改一笔交易,意味着它之后的所有 hash 和相关交易记录全部要篡改一遍,这需要的算力和难度极高,成功概率为零。

所以有所谓6个确认的问题。一笔交易被打包成区块后,再串接6个区块,这个交易才是基本无法更改的。可以类比排队。

如果所有人都认可最长的队伍是合法的队伍,那么你排上之后,最关心的应该是:有多少人排在你后面。因为,排在你后面的人越多,你的合法利益越稳固。

新闻上经常用铁索链条图片来展示区块链,严格来说,这是不准确的。铁链或者项链,结构都是线性的。

去掉其中一环,整个链条损失不大。区块链的结构不是这样,因为有 hash 算法,咬合的更加坚固,无法改动一点而不伤及其他。这就是区块链不可更改特性的源泉。

用于数据存储和传输的不可改变的技术

保险和医疗行业用于数据存储和传输的系统一般优先考虑其不可改变的性能。目前这些行业正在积极探索区块链技术的潜力,并认为该技术在不可篡改性方面拥有不可比拟的潜力。

像MyBit这样的区块链初创公司一直在寻求将区块链技术用于数据存储和传输的方法。MyBit联合创始人兼董事总经理Ian Worrall表示:

“MyBit通过去中心化的分布式总账技术来实现对资产所有权的安全管理,从而彻底改变资产管理行业。 它有效地消除了单点故障风险、依赖第三方托管代理的风险以及传统系统中的大部分摩擦。”

以太坊的工作原理是什么?不管你们知不知道以太坊(Ethereum blockchain)是什么,但是你们大概都听说过以太坊。最近在新闻里出现过很多次,包括一些专业杂志的封面,但是如果你们对以太坊到底是什么没有一个基本的了解的话,看这些文章就会感觉跟看天书一样。

所以,什么是以太坊?本质上,就是一个保存数字交易永久记录的公共数据库。重要的是,这个数据库不需要任何中央权威机构来维持和保护它。相反的它以一个“无信任”的交易系统来运行一个个体在不需要信任任何第三方或对方的情况下进行点对点交易的架构。

依然感到很困惑?这就是这篇文章存在的理由。我的目标是在技术层面来解释以太坊的工作原理,但是不会出现很复杂的数学问题或看起来很可怕的公式。即使你不是一个程序员,我希望你看完之后最起码对技术有个更好的认识。如果有些部分技术性太强不好理解,这是非常正常的,真的没有必要完全理解每一个小细节。我建议只要宏观的理解一下事物就行了。

这篇文章中的很多议点都是以太坊黄皮书中讨论过的概念的细分。我添加了我自己的解释和图表使理解以太坊更加简单一点。那些足够勇敢的人可以挑战一下技术,去阅读一下以太坊的黄皮书。

好了, 让我们开始吧!

区块链定义

区块链就是一个具有共享状态的密码性安全交易的单机(cryptographically secure transactional singleton machine with shared-state)。[1]这有点长,是吧?让我们将它分开来看:

“密码性安全(Cryptographically secure)”是指用一个很难被解开的复杂数学机制算法来保证数字货币生产的安全性。将它想象成类似于防火墙的这种。它们使得欺骗系统近乎是一个不可能的事情(比如:构造一笔假的交易,消除一笔交易等等)。

“交易的单机(Transactional singleton machine)”是指只有一个权威的机器实例为系统中产生的交易负责任。换句话说,只有一个全球真相是大家所相信的。

“具有共享状态(With shared-state)”是指在这台机器上存储的状态是共享的,对每个人都是开放的。

以太坊实现了区块链的这个范例。

以太坊模型说明

以太坊的本质就是一个基于交易的状态机(transaction-based state machine)。在计算机科学中,一个 状态机 是指可以读取一系列的输入,然后根据这些输入,会转换成一个新的状态出来的东西。

根据以太坊的状态机,我们从创世纪状态(genesis state)开始。这差不多类似于一片空白的石板,在网络中还没有任何交易的产生状态。当交易被执行后,这个创世纪状态就会转变成最终状态。在任何时刻,这个最终状态都代表着以太坊当前的状态。

以太坊的状态有百万个交易。这些交易都被“组团”到一个区块中。一个区块包含了一系列的交易,每个区块都与它的前一个区块链接起来。

为了让一个状态转换成下一个状态,交易必须是有效的。为了让一个交易被认为是有效的,它必须要经过一个验证过程,此过程也就是挖矿。挖矿就是一组节点(即电脑)用它们的计算资源来创建一个包含有效交易的区块出来。

任何在网络上宣称自己是矿工的节点都可以尝试创建和验证区块。世界各地的很多矿工都在同一时间创建和验证区块。每个矿工在提交一个区块到区块链上的时候都会提供一个数学机制的“证明”,这个证明就像一个保证:如果这个证明存在,那么这个区块一定是有效的。

为了让一个区块添加到主链上,一个矿工必须要比其他矿工更快的提供出这个“证明”。通过矿工提供的一个数学机制的“证明”来证实每个区块的过程称之为工作量证明(proof of work)。

证实了一个新区块的矿工都会被奖励一定价值的奖赏。奖赏是什么?以太坊使用一种内在数字代币-以太币(Ether)作为奖赏。每次矿工证明了一个新区块,那么就会产生一个新的以太币并被奖励给矿工。

你也许会在想:什么能确保每个人都只在区块的同一条链上呢?我们怎么能确定不会存在一部分矿工创建一个他们自己的链呢?

前面,我们定义了区块链就是一个具有共享状态的交易单机。使用这个定义,我们可以知道正确的当前状态是一个全球真相,所有人都必须要接受它。拥有多个状态(或多个链)会摧毁这个系统,因为它在哪个是正确状态的问题上不可能得到统一结果。如果链分叉了,你有可能在一条链上拥有10个币,一条链上拥有20个币,另一条链上拥有40个币。在这种场景下,是没有办法确定哪个链才是最”有效的“。

不论什么时候只要多个路径产生了,一个”分叉“就会出现。我们通常都想避免分叉,因为它们会破坏系统,强制人们去选择哪条链是他们相信的链。

为了确定哪个路径才是最有效的以及防止多条链的产生,以太坊使用了一个叫做“GHOST协议(GHOST protocol.)”的数学机制。

GHOST = Greedy Heaviest Observed Subtree

简单来说,GHOST协议就是让我们必须选择一个在其上完成计算最多的路径。一个方法确定路径就是使用最近一个区块(叶子区块)的区块号,区块号代表着当前路径上总的区块数(不包含创世纪区块)。区块号越大,路径就会越长,就说明越多的挖矿算力被消耗在此路径上以达到叶子区块。使用这种推理就可以允许我们赞同当前状态的权威版本。

现在你大概对区块链是什么有个理性的认识,让我们在再深入了地解一下以太坊系统主要组成部分:

账户(accounts)

状态(state)

损耗和费用(gas and fees)

交易(transactions)

区块(blocks)

交易执行(transaction execution)

挖矿(mining)

工作量证明(proof of work)

在开始之前需要注意的是:每当我说某某的hash, 我指的都是KECCAK-256 hash, 以太坊就是使用这个hash算法。

账户

以太坊的全局“共享状态”是有很多小对象(账户)来组成的,这些账户可以通过消息传递架构来与对方进行交互。每个账户都有一个与之关联的状态(state)和一个20字节的地址(address)。在以太坊中一个地址是160位的标识符,用来识别账户的。

这是两种类型的账户:

外部拥有的账户,被私钥控制且没有任何代码与之关联

合约账户,被它们的合约代码控制且有代码与之关联

外部拥有账户与合约账户的比较

理解外部拥有账户和合约账户的基本区别是很重要的。一个外部拥有账户可以通过创建和用自己的私钥来对交易进行签名,来发送消息给另一个外部拥有账户或合约账户。在两个外部拥有账户之间传送的消息只是一个简单的价值转移。但是从外部拥有账户到合约账户的消息会激活合约账户的代码,允许它执行各种动作。(比如转移代币,写入内部存储,挖出一个新代币,执行一些运算,创建一个新的合约等等)。

不像外部拥有账户,合约账户不可以自己发起一个交易。相反,合约账户只有在接收到一个交易之后(从一个外部拥有账户或另一个合约账户接),为了响应此交易而触发一个交易。我们将会在“交易和消息”部分来了解关于合约与合约之间的通信。

因此,在以太坊上任何的动作,总是被外部控制账户触发的交易所发动的。

账户状态

账户状态有四个组成部分,不论账户类型是什么,都存在这四个组成部分:

nonce:如果账户是一个外部拥有账户,nonce代表从此账户地址发送的交易序号。如果账户是一个合约账户,nonce代表此账户创建的合约序号

balance: 此地址拥有Wei的数量。1Ether=10^18Wei

storageRoot: Merkle Patricia树的根节点Hash值(我们后面在解释Merkle树)。Merkle树会将此账户存储内容的Hash值进行编码,默认是空值

codeHash:此账户EVM(以太坊虚拟机,后面细说)代码的hash值。对于合约账户,就是被Hash的代码并作为codeHash保存。对于外部拥有账户,codeHash域是一个空字符串的Hash值

世界状态

好了,我们知道了以太坊的全局状态就是由账户地址和账户状态的一个映射组成。这个映射被保存在一个叫做Merkle Patricia树的数据结构中

Merkle Tree(也被叫做Merkle trie)是一种由一系列节点组成的二叉树,这些节点包括:

在树底的包含了源数据的大量叶子节点

一系列的中间的节点,这些节点是两个子节点的Hash值

一个根节点,同样是两个子节点的Hash值,代表着整棵树

树底的数据是通过分开我们想要保存到chunks的数据产生的,然后将chunks分成buckets,再然后再获取每个bucket的hash值并一直重复直到最后只剩下一个Hash:根Hash。

这棵树要求存在里面的值(value)都有一个对应的key。从树的根节点开始,key会告诉你顺着哪个子节点可以获得对应的值,这个值存在叶子节点。在以太坊中,key/value是地址和与地址相关联的账户之间状态的映射,包括每个账户的balance, nonce, codeHash和storageRoot(storageRoot自己就是一颗树)。

同样的树结构也用来存储交易和收据。更具体的说,每个块都有一个头(header),保存了三个不同Merkle trie结构的根节点的Hash,包括:

状态树

交易树

收据树

在Merkle tries中存储所有信息的高效性在以太坊中的“轻客户端”和“轻节点”相当的有用。记住区块链就是一群节点来维持的。广泛的说,有两种节点类型:全节点和轻节点。

全节点通过下载整条链来进行同步,从创世纪块到当前块,执行其中包含的所有交易。通常,矿工会存储全节点,因为他们在挖矿过程中需要全节点。也有可能下载一个全节点而不用执行所有的交易。无论如何,一个全节点包含了整个链。

不过除非一个节点需要执行所有的交易或轻松访问历史数据,不然没必要保存整条链。这就是轻节点概念的来源。比起下载和存储整个链以及执行其中所有的交易,轻节点仅仅下载链的头,从创世纪块到当前块的头,不执行任何的交易或检索任何相关联的状态。由于轻节点可以访问块的头,而头中包含了3个tries的Hash,所有轻节点依然可以很容易生成和接收关于交易、事件、余额等可验证的答案。

 1/6    1 2 3 4 5 6 下一页 尾页