以太坊技术详解与实践第2章——以太坊架构与组成

imToken 是一款全球领先的区块链数字资产管理工具[ZB],帮助你安全管理BTC, ETH, ATOM, EOS, TRX, CKB, BCH, LTC, DOT, KSM, FIL, XTZ 资产,同时支持去中心化币币兑换功能 ...

2.1 以太坊整体架构

比特币钱包和以太坊钱包

以太坊整体架构如图2-1所示,分为三层:底层服务、核心层、顶层应用程序。

区块链比特币以太坊

在这里插入图片描述

(1)底层服务

底层服务包括P2P网络服务、数据库、密码算法、分片优化等基础服务。P2P网络中的每个节点都是相互平等的,各个节点共同提供服​​务。没有特殊的节点,网络中的节点可以生成或审核新的数据。在以太坊中,区块、交易等数据最终都存储在数据库中。密码算法用于确保数据隐私和区块链安全。分片优化允许并行验证交易,大大加快了区块生成速度。这些底层服务共同确保了区块链系统的平稳运行。

(2)核心层

核心层包括区块链、共识算法、以太坊虚拟机等核心组件,以区块链技术为基础,辅以以太坊独有的共识算法,以EVM(以太坊虚拟机)作为运行智能合约的载体。该层是以太坊的核心组件。区块链构建的去中心化账本首先需要解决的问题是如何保证不同节点上账本数据的一致性和正确性,共识算法就是为了解决这个问题而生的。EVM是以太坊的一大创新,它是以太坊中智能合约的运行环境,让以太坊可以实现更复杂的逻辑。

(3)顶层应用

这一层包括API接口、智能合约、去中心化应用等,以太坊的DApp通过Web3.js与智能合约层进行信息交互,智能合约全部运行在EVM上以太坊和比特币区块链钱包,使用RPC调用,这一层是最贴近用户的,企业可以根据自身业务逻辑实现独特的智能合约,帮助企业高效执行业务。

底层服务中的数据库存储交易、区块等数据,密码算法对区块的生成、交易的传输进行加密,分片优化加速交易验证,共识算法用于解决P2P网络节点间账本的一致性问题。顶层应用中的去中心化应用(DApp)需要在以太坊虚拟机(EVM)上执行,因此结构各层相互配合、各司其职,构成完整的以太坊体系。

2.2 区块

每个比特币区块由两部分组成:区块头( )和区块主体( Body )。

以太坊也采用了比特币区块链技术,但是对比特币区块链技术做了一些调整。

一个区块主要由三部分组成:区块头、交易列表、叔块头。

区块头包含以下信息:父块的哈希值(Prev Hash)、叔块的哈希值(Hash)、状态树根哈希值()、交易树根哈希值(Root)、收据树根哈希值(Root)、时间戳()、随机数(Nonce)等。

以太坊区块链上区块数据结构的一个重大变化是存储了三棵树根,分别是状态树、交易树、收据树。存储三棵树方便了对账户的更多查询。交易列表是矿工从交易池中挑选出的一系列交易,以纳入收入区块。区块链上的第一个区块被称为“创世区块”,除了创世区块之外,区块链上的每个区块都有其父区块,这些区块连接起来就构成了区块链。以太坊大约每15秒就能挖出一个新区块。图2-3展示了以太坊区块结构中状态树的更新情况。

在这里插入图片描述

2.3 账户

在以太坊中,一个重要的概念是账户()。账户通过地址来索引,地址由公钥派生而来,取公钥的后20个字节(公钥将在2.3.3节详细介绍)。以太坊系统中有两种类型的账户,分别是外部账户(Owned,EOA)和合约账户(关于智能合约的内容将在第4章详细介绍)。

以太坊中这两类账户统称为“状态对象”(存储状态)。外部账户存储以太币的余额状态,合约账户存储余额以及智能合约的状态及其变量。通过交易的执行,这些状态对象发生变化,树用于索引和验证状态对象的更新。以太坊账户由四部分组成。

.io()是一个以太坊区块浏览、查询、分析平台,读者可以在其上查看以太坊中的账户、交易、代币等信息。我们将在第 8 章介绍.io。

2.3.1 外部账户

外部账户(EOA)由私钥控制,是用户实际控制的账户。每个外部账户都有一对公钥和私钥,用于对交易进行签名,其地址由公钥决定。外部账户不能包含以太坊虚拟机(EVM)代码。我们可以做一个简单的类比,把外部账户看作用户在银行开设的账户,公钥是用户为该账户设置的卡号,私钥是用户设置的密码。外部账户具有以下特点:有一定的账户余额、可以发送交易、由私钥控制、没有关联代码。

用户可以使用Geth指令创建外部账户,生成账户地址的过程主要包括三个步骤。

1)设置账户的私钥,一般就是用户密码。

2)使用加密算法从私钥生成相应的公钥。

3)根据公钥获取对应的账户地址。

步骤2中采用的加密算法是椭圆曲线密码算法,而不是RSA加密算法,因为前者比后者更高效、更安全。而从公钥获取账户地址,在以太坊中使用SHA3方法。

是一个显示以太币(ETH)的账户示例,其中列出了该账户的以太币余额以及与该账户相关的所有历史交易。

2.3.2 合约账户

合约账户是包含合约代码的账户。合约账户不是由私钥文件直接控制,而是由合约代码控制。合约账户的地址由合约创建者在创建合约时的地址,以及该地址发送的交易计算得出。合约账户有以下特点:拥有一定数量的以太币余额;拥有关联的代码,由其他合约发送的交易或调用激活;合约执行时只能操作合约账户拥有的特定存储。合约账户和普通账户最大的区别在于它还包含智能合约。

以太坊区块链上的所有操作都是基于账户发送的交易来执行的。每当合约账户收到交易消息时,其合约代码就会被交易输入的参数调用并执行。合约代码会在参与网络的每一个节点上执行,执行结果会作为新区块验证的一部分。

它是一个合约账户(SNT)的实例,介绍合约账户的余额,账户交易详情,以及合约的发起者。

2.3.3 私钥与公钥

公钥和私钥都是密码学概念imToken,现代密码体制中,加密和解密使用不同的密钥,即非对称密钥加密体制。每个通信方都需要两把密钥,分别是公钥和私钥。公钥是公开的,不需要保密,而私钥是私人的,需要妥善保管和隐藏,不让别人知晓。

每把公钥对应一把私钥,一对密钥中,一把用于加密,另一把用于解密。非对称密钥加密系统主要有两种应用,即公钥加密和公钥认证。公钥加密和公钥认证的过程不同,下面分别进行简单介绍。

为了让读者更容易理解什么是公钥加密,我们先看一个简单的例子。假如有两个用户,Jack和,Jack想通过公钥加密技术发送一封短信给,并且有一对公钥和私钥,那么加密解密的过程如下:首先,Jack将自己的公钥发送给Jack,然后Jack用收到的公钥对短信进行加密,将加密结果发送给,最后用自己的私钥解密Jack发来的消息。整体流程如图2-4所示。

在这里插入图片描述

公钥认证是通过验证用户的私钥是否正确来验证用户的真实性。例如,如果你想让Jack知道他是真实的,而不是别人的假冒,你就用私钥对文件进行签名并发送给Jack。Jack再用公钥解密文件,以验证签名是否来自真正的M。整体流程如图2-5所示。

在这里插入图片描述

从上面两个例子我们可以看出,公钥加密是发送者先用公钥加密,接收者再用私钥解密;而公钥认证则是发送者先用私钥加密,接收者再用公钥解密进行验证。

以太坊中的每个外部账户都由一对密钥定义,一个私钥和一个公钥。每对密钥都编码在一个密钥文件中。密钥文件是 JSON 文本文件,可以用任何文本编辑器打开和浏览。密钥文件的密钥部分是账户私钥,通常使用创建账户时设置的密码进行加密。最新的密钥文件格式为:UTC---。密钥文件可以在以太坊节点数据目录的一个子目录中找到。

目前私钥常见的形式有三种:key,&,code。

1)密钥是一个随机生成的256位二进制数。用户甚至可以用纸笔随机生成一个私钥,即随机写下一个只包含“0”或“1”的256位字符串。这个256位二进制数就是私钥的初始状态。

2)在以太坊官方钱包中,私钥和公钥会保存在子目录下的一个加密的JSON文件中,这个JSON文件是,所以用户需要同时备份和对应的(创建钱包时设置的密码)。

3)最后一种代码由BIP-39方案提出,旨在随机生成12到24个容易记忆的单词,该单词序列与HMAC函数配合使用生成随机种子,通过BIP-0032方案生成确定性钱包。

2.3.4 钱包

钱包是一个比较形象的概念,一个外部账户通常由一个私钥文件控制,拥有私钥的用户就有权使用对应地址的账户中的以太币。我们通常把管理这些数字钥匙的软件称为“钱包”,而我们所说的“备份钱包”其实就是备份账户的私钥文件。

2.4 数据结构与存储

大部分区块链项目,包括以太坊和比特币,都是采用树或者基于树的数据结构。比特币存储的是一棵树,而以太坊则为三个对象设计了三棵树:状态树、交易树、收据树。这三棵树可以帮助以太坊客户端进行一些简单的查询,比如查询账户的余额、交易是否包含在区块中等。区块、交易等数据最终都存储在数据库中。数据库是一个键值数据库。

在数据库中,键通常与哈希相关,而值是存储内容的 RLP 编码。

2.4.1 数据组织

以太坊采用树(又称 Trie,简称 MPT)作为数据组织形式,用于组织和管理用户账户状态、交易信息等重要数据。MPT 是一种加密认证数据结构,它兼具了树和 Trie(前缀树)两种数据类型的优点。我们先来介绍一下这两种数据结构。

树 Trie 树 树

2.4.2 状态树

2.4.3 交易树

2.4.4 收据树

2.4.5 数据库支持

2.5 共识机制

共识机制是区块链交易达成分布式共识的算法。由于点对点网络中网络延迟高低不一,各个节点收到的交易顺序可能不一样。因此区块链系统需要设计一种机制,让节点对大约同时发生的交易顺序达成共识。这就是共识机制。

2.5.1 工作量证明

PoW 即通过工作结果来证明自己完成了相应的工作。由于工作过程繁琐低效,且其验证忽略了工作过程而直接验证结果,虽然工作者需要花费一定的时间来完成工作,但验证者可以在瞬间完成验证,因此这种方式往往简单高效。

在以太坊中,有一种专门设计的PoW算法,称为该算法。之所以用该算法来取代原来的PoW算法,是为了解决挖矿中心化的问题。目前的情况是,在PoW算法下,少数硬件公司和挖矿组织通过挖矿资源的集中获得了能够“操纵”现有网络内经济力量的优势,并由此获取高额利润(如比特币和莱特币)。这些组织可以生产出具有超高哈希计算性能的ASIC(专用应用集成电路)来为自己牟取利润,这意味着挖矿不再是高度去中心化、追求平均主义的,而是需要巨额资本的有效参与。在这种情况下,很可能会出现一种现象:一个旨在实现“去中心化”的系统,因为现实生活中矿机资源的集中而出现了中心化。为了解决这个问题,以太坊基金会专门设计了一种可以“抵抗ASIC”、可以被轻客户端快速验证的PoW算法,希望降低以太坊中心化挖矿所获得的经济回报。这就是该算法。

以太坊试图让矿工从区块链状态中获取随机数据,计算从区块链最后 N 个区块中随机选择的一些交易,并返回得到的哈希值。这样做有两个好处。首先,以太坊合约可以包含任何一种计算方法,因此以太坊的 ASIC 本质上是一种提供普通计算的专用集成电路,相当于性能良好的 CPU。其次,挖矿需要访问整个区块链,这迫使矿工必须保存整个区块链。

该算法的特点是挖矿效率基本与CPU无关,但与内存大小、带宽正相关,目的是为了消除专用硬件的优势,抵抗ASIC,算法基本流程如下。

1)对于每个区块,可以通过扫描区块头来计算一个种子,这个种子只与当前区块相关。

2)利用种子,生成一个16MB的伪随机缓存,轻客户端存储该缓存。

3)基于缓存生成1GB的数据集,称为DAG。数据集中的每个元素只依赖于缓存中的少数元素,也就是说,只要有缓存,就可以快速计算出DAG中指定位置的元素。矿工存储数据集,数据集随着时间的推移呈线性增长。

4)挖矿可以概括为“矿工”从DAG中随机选取元素并进行哈希运算的过程。DAG也可以理解为一个完整的搜索空间。挖矿的过程就是从DAG中随机选取元素(类似比特币挖矿中尝试一个合适的nonce的过程)并进行哈希运算。

5)验证者只需要花费很少的内存来存储缓存,因为验证者可以根据缓存计算出自己所需要的DAG中指定位置的元素,然后验证这些指定元素的哈希值是否小于某个哈希值,也就是验证“矿工”的劳动是否满足要求。

缓存和 DAG 每 30,000 个区块更新一次,因此绝大多数“矿工”将专注于读取数据集而不是更改它。

2.5.2 权益证明

PoS 是一种根据网络参与者当前持有的数字货币数量和时间来分配收益的方式,是一种货币所有权的证明。PoS 可以说是虚拟挖矿,一般和 PoW 一样,用户获得的收益和购买成本成正比,即买得越多,收益越大。不过和 PoW 机制下的挖矿相比,虚拟挖矿所消耗的电力可以忽略不计。

在以太坊中,PoS 算法可以这样描述:以太坊区块链由一组验证者决定,任何持有 Ether 的用户都可以发起一种特殊的交易形式,将自己的 Ether 锁定在存储中,从而让自己成为验证者,然后通过所有当前验证者都可以参与的共识算法完成新区块的生成和验证过程。

为激励以太坊用户支持 PoS,共识算法和验证者奖励方式有很多种。从算法角度来看,主要有两种类型:基于链的 PoS 和 BFT(故障,拜占庭容错)风格的 PoS。

在基于链的 PoS 中,算法在每个时间段(例如设定 10s 为一个周期,每个周期为一个时间段)伪随机地从验证者集合中选择一个验证者,赋予该验证者创建新区块的权利,但验证者必须确保该区块指向最多的区块(指向的前一个区块通常是最长链的最后一个区块)。因此,随着时间的推移,大多数区块会收敛到一条链上。

在 BFT 式的 PoS 中,验证者被赋予相对的权利,允许他们提议区块并对提议的区块进行投票,从而决定哪个区块是新区块,并在每一轮中选择一个新区块添加到区块链中。在每一轮中,每个验证者都会为特定的区块“投票”,最终所有在线且诚实的验证者将“协商”给定的区块是否可以添加到区块链中,并且意见无法更改。

与PoW相比,PoS具有以下优势。

2.6 以太坊

以太币(ETH)是由以太坊发行的数字货币,被认为是“比特币2.0”。以太币是以太坊中的重要元素,在公链上发起的任何交易都需要一定数量的以太币。

以太币的总量和发行率由2014年的预售决定,以太币的来源包括“预挖+区块奖励+叔块奖励+叔块引用奖励”,具体分配如下:

2.7 交易

以太坊交易主要是指区块链上一个外部账户向另一个账户发送消息的签名数据包,主要包含发送方签名、接收方地址以及发送方向接收方转账的以太币数量。以太坊上的每笔交易都需要支付一定的费用,以支付交易执行所需的计算开销。计算开销的成本并不直接以以太币计算,而是通过引入Gas作为执行开销的基本单位,折算成以太币,并根据市场波动进行调整,避免以太币的价值受到市场价格的影响。交易是以太坊整体架构的重要组成部分,连接以太坊账户,起到价值转移的作用。

2.7.1 交易费用

为了防止用户在区块链公链中发送过多无意义的交易,浪费矿工的计算资源,例如转账金额为0的转账交易,各公链技术都采用了交易收费策略,要求交易的发送者为每一笔交易支付一定的费用。

2.7.2 交易内容

以太坊中的交易是一个经过签名的数据包,其中存储了从外部账户发送到区块链上另一个账户的消息。它可以是简单的数字货币、以太币的转账,也可以是包含智能合约代码的消息。

一笔交易包含以下内容。

以上就是以太坊中一笔交易可能包含的内容,在不同场景下,交易有三种类型。

1)转账交易:转账是最简单的交易类型,将以太币从一个账户发送到另一个账户。发送转账交易时,只需要指定发送者、接收者、需要转账的以太币数量即可(在客户端发送交易时,默认可以生成 Gas Limit、Gas Price、nonce、hash、签名),如下所示。

web3.eth.sendTransaction({
	from:”0xb60e8dd6lc5d32be8058bb8eb970870f07233155”,
	to:”0xd46e8dd67c5d32be8058bb8eb970870f07244567”,
	value: 10000000000000000
});

2)创建智能合约交易:创建合约就是将合约部署到区块链上,也是通过发送交易来实现的。在创建合约的交易中,“to”字段为空字符串,“data”字段指定初始化合约的二进制代码。在后续调用合约时,代码的执行结果将作为合约代码。如下图所示。

web3.eth.sendTransaction({
	from:” 0xb60e8dd6lc5d32be8058bb8eb970870f07233155”,
	data:”contract binary code”
});

3)执行智能合约的交易:顾名思义,此交易就是执行已经部署到区块链上的智能合约。此交易中,to 字段需要指定为需要调用的智能合约的地址,data 字段需要指定需要调用的方法以及需要传递给该方法的参数。如下所示。

web3.eth.sendTransaction({
	from:” 0xb60e8dd6lc5d32be8058bb8eb970870f07233155”,
	to:”0xb4259e5d9bc67a0f2ce3ed372ffc5lbe46c33c4d",
	data:“hash of the invoked method signature and encoded parameters ”
});

2.7.3 以太坊中交易的“旅程”

在以太坊中,交易处理是一个过程,从账户发起交易请求开始,直到共识节点同步包含该交易的区块(一般来说,出于安全考虑,需要在该区块后面“挖出”更多区块,交易才会最终确定),只有满足这个过程,一笔“交易”才算完成。

正常转账或合约调用交易的流程

在以太坊中创建智能合约的交易流程

2.8 数据编码和压缩

RLP()是一种用于对具有嵌套结构的任意二进制数据进行编码的编码算法,是以太坊数据序列化的主要方法。

2.9 以太坊客户端和API 2.10 以太坊域名服务

ENS(Name,以太坊域名服务)是一个建立在以太坊区块链上的分布式、开放的命名系统。

2.11 章节摘要

以太坊区块链作为先进公链的代表之一,本质上是一系列相连的数据块,这些数据块之间通过密码算法生成的哈希指针链接起来。本章主要向读者介绍以太坊的基本架构和组成,让用户对区块、交易、账户等以太坊的基本组成部分有一定的了解。此外,还向用户介绍了以太坊的数据结构和存储支持,让读者对其底层结构有一定的了解。最后,本章还介绍了以太坊的人口客户端和以太坊名称服务(ENS),让用户了解以太坊的顶层应用。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

返回顶部
跳到底部

Copyright © 2002-2024 imToken钱包下载官网 Rights Reserved.
备案号:晋ICP备13003952号

谷歌地图 | 百度地图
Powered by Z-BlogPHP Theme By open开发