引言 可能你已经听说过以太坊了,不管你是否知道它是什么,它最近经常出现在新闻中,登上一些杂志封面,但是如果你没有一个关于以太坊的基础知识,那这篇文章可能会让你读的云里雾里,不知所云。区块链本质上,是一个公共数据库,保存着数字交易的永久记录。重要的是,这个数据库不需要任何中央来维护和保护。相反,在这个框架中,个人可以进行点对点交易,而无需相互信任第三方。 你是不是仍然困惑吗?那这就是我问什么要写这篇文章 。我的目的是解释以太坊如何在技术层面上运行,而不需要复杂的数学或可怕的公式。即使你不是程序员,我也希望你看看完文章能够更好地掌握这项技术。如果有些地方太技术性且难以理解,那完全没问题!没有必要去了解每一个细节。我建议你从广义上理解事物。 这篇文章中涉及的许多话题都是对黄皮书中讨论的概念的分类。我已经添加了我自己的解释和图表,使理解以太坊更容易。 开始吧。 区块链的定义 区块链就是一个具有共享状态的密码性安全交易的单机(cryptographically secure transactional singleton machine with shared-state)。1这有点长,是吧?让我们将它分开来看:
以太坊实现了这个区块链范例。 以太坊本质上是一个基于事务的状态机。在计算机科学中,状态机指的是能够读取一系列输入的东西,并且基于这些输入,将转换到一个新的状态。 根据以太坊的状态机,我们从创世纪状态(genesis state)开始。这差不多类似于一张白纸,在网络中还没有任何交易的产生状态。当交易被执行后,这个创世纪状态就会转变成最终状态。在任何时刻,这个最终状态都代表着以太坊当前的状态。 以太坊的状态有百万个交易。这些交易都被“组团”到一个区块中。一个区块包含了一系列的交易,每个区块都与它的前一个区块链接起来。 为了让一个状态转换成下一个状态,交易必须是有效的。为了让一个交易被认为是有效的,它必须要经过一个验证过程,此过程也就是挖矿。挖矿就是一组节点(即电脑)用它们的计算资源来创建一个包含有效交易的区块出来。 任何在网络上宣称自己是矿工的节点都可以尝试创建和验证区块。世界各地的很多矿工都在同一时间创建和验证区块。每个矿工在提交一个区块到区块链上的时候都会提供一个数学机制的“证明”,这个证明就像一个保证:如果这个证明存在,那么这个区块一定是有效的。 要想将一个区块添加到主区块链中,矿机必须证明它比任何竞争对手都要快。通过让矿工提供数学证明来验证每个块的过程称为“工作量证明”。 证实了一个新区块的矿工都会被奖励一定价值的奖赏。奖赏是什么?以太坊使用一种内在数字代币—以太币(Ether)作为奖赏。每次矿工证明了一个新区块,那么就会产生一个新的以太币并被奖励给矿工。 你也许会在想:什么能确保每个人都只在区块的同一条链上呢?我们怎么能确定不会存在一部分矿工创建一个他们自己的链呢? 前面,我们定义了区块链就是一个具有共享状态的交易单机。使用这个定义,我们可以知道正确的当前状态是一个全球真相,所有人都必须要接受它。拥有多个状态(或多个链)会摧毁这个系统,因为它在哪个是正确状态的问题上不可能得到统一结果。如果链分叉了,你有可能在一条链上拥有10个币,一条链上拥有20个币,另一条链上拥有40个币。在这种场景下,是没有办法确定哪个链才是最”有效的“。 不论什么时候只要多个路径产生了,一个”分叉“就会出现。我们通常都想避免分叉,因为它们会破坏系统,强制人们去选择哪条链是他们相信的链。 为了确定哪条路径最有效并防止多链,以太坊使用了一种称为“GHOST protocol”的机制。 简单来说,GHOST协议就是让我们必须选择一个在其上完成计算最多的路径。一个方法确定路径就是使用最近一个区块(叶子区块)的区块号,区块号代表着当前路径上总的区块数(不包含创世纪区块)。区块号越大,路径就会越长,就说明越多的挖矿算力被消耗在此路径上以达到叶子区块。使用这种推理就可以允许我们赞同当前状态的权威版本。 现在你已经了解了区块链是什么,让我们深入了解以太坊系统的主要组成部分:
开始之前请注意:每当我说X的“哈希”时,我指的是以太坊使用的kecakk -256哈希。 账户Accounts 在以太坊中,状态是由被称为“账户”的对象组成的,每个账户有一个20字节的地址,还有可以在账户之间直接传输价值和信息的状态转换器。 通常来讲,有两种账户类型:私钥控制的外部账户,合约代码控制的合约账户。 外部账户没有代码,一个人可以通过创建和签名一笔交易来从外部账户发送信息;而在合约账户内,每次合约账户接收到一条信息,代码就会被激活,允许合约账户对内部存储空间进行读取和写入,并且允许发送其他消息或者依次创建合约。 与外部拥有的账户不同,合同账户不能自己启动新的交易。相反,合同账户只能在收到其他交易(来自外部拥有的账户或其他合同账户)时触发交易。 因此,在以太坊上任何的动作,总是被外部控制账户触发的交易所发动的。 帐户状态 帐户状态由四个组成部分组成,不管帐户类型如何,这些组成部分都存在: ● 随机数,用来确认每笔交易只能被处理一次的计算器 好了,我们知道了以太坊的全局状态就是由账户地址和账户状态的一个映射组成。这个映射被保存在一个叫做Merkle Patricia树的数据结构中 Merkle Tree(也被叫做Merkle trie)是一种由一系列节点组成的二叉树,这些节点包括:
树底的数据是通过分开我们想要保存到chunks的数据产生的,然后将chunks分成buckets,再然后再获取每个bucket的hash值并一直重复直到最后只剩下一个Hash:根Hash。 这棵树要求存在里面的值(value)都有一个对应的key。从树的根节点开始,key会告诉你顺着哪个子节点可以获得对应的值,这个值存在叶子节点。在以太坊中,key/value是地址和与地址相关联的账户之间状态的映射,包括每个账户的balance, nonce, codeHash和storageRoot(storageRoot自己就是一颗树)。 同样的树结构也用来存储交易和收据。更具体的说,每个块都有一个头(header),保存了三个不同Merkle trie结构的根节点的Hash,包括:状态树 交易树 收据树 区块链就是一群节点来维持的。广泛的说,有两种节点类型:全节点和轻节点。 全节点通过下载整条链来进行同步,从创世纪块到当前块,执行其中包含的所有交易。通常,矿工会存储全节点,因为他们在挖矿过程中需要全节点。也有可能下载一个全节点而不用执行所有的交易。无论如何,一个全节点包含了整个链。 不过除非一个节点需要执行所有的交易或轻松访问历史数据,不然没必要保存整条链。这就是轻节点概念的来源。比起下载和存储整个链以及执行其中所有的交易,轻节点仅仅下载链的头,从创世纪块到当前块的头,不执行任何的交易或检索任何相关联的状态。由于轻节点可以访问块的头,而头中包含了3个tries的Hash,所有轻节点依然可以很容易生成和接收关于交易、事件、余额等可验证的答案。 这个可以行的通是因为在Merkle树中hash值是向上传播的—如果一个恶意用户试图用一个假交易来交换Merkle树底的交易,这个会改变它上面节点的hash值,而它上面节点的值的改变也会导致上上一个节点Hash值的改变,以此类推,一直到树的根节点. 总之,使用Merkle Patricia树的好处就是该结构的根节点加密取决于存储在树中的数据,而且根据点的hash还可以作为该数据的安全标识。由于块的头包含了状态、交易、收据树的根hash,所有任何节点都可以验证以太坊的一小部分状态而不用保存整个状态,这整个状态的的大小可能是非常大的。 (今天完,内容太长,下期分解) |
【币范·科普】以太坊到底是如何工作的(上 )
2021-03-02 币范 来源:区块链网络
- 上一篇:zkSync澄清:与ZKSwap没有任何关系
- 下一篇:3/2早间以太策略
LOADING...
相关阅读:
- 王团长区块链日记1128篇:比特币稳住了2021-03-02
- 老王说币:ETH早间行情分析2021-03-02
- 币上丞:3.2牛市是否为昙花一现?主流端口再度开启回调继续多才是永2021-03-02
- 3.2比特币单边上涨行情能否继续?日间多空布局思路2021-03-02
- 欧科云链 OKLink:以太坊矿工在二月的收入超过比特币2021-03-02