主页 > imtoken钱包最新下载 > 《以太坊技术详解与实战》第二章——以太坊架构与组成

《以太坊技术详解与实战》第二章——以太坊架构与组成

imtoken钱包最新下载 2023-07-06 05:12:01

2.1 以太坊整体架构

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

在这里插入图片描述

(一)底层服务

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

(2) 核心层

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

(3) 顶层应用

该层包括 API 接口、智能合约和去中心化应用程序。以太坊的 DApp 通过 Web3.js 与智能合约层交换信息。所有的智能合约都运行在 EVM 上,并且会使用 RPC 调用,这一层是离用户最近的一层。企业可以根据自己的业务逻辑实现自己独特的智能合约,帮助企业高效执行业务。

在底层服务中,LeveIDB 数据库存储交易、区块等数据。加密算法对区块的生成和交易的传输进行加密。分片优化加速交易验证。共识算法用于解决P2P网络节点问题。为了保证账本的一致性,顶层应用中的去中心化应用(DApp)需要在以太坊虚拟机(EVM)上执行。

2.2 块

每个比特币区块包含两部分:区块头(Header)和区块体(Body)。

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

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

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

以太坊区块链上区块数据结构的一个重大变化是保留了三个默克尔树根,即状态树、交易树和收据树。存储三棵树可以方便账户做更多的查询。交易列表是矿工从交易池中选择并包含在区块中的一系列交易。区块链上的第一个区块称为“创世区块”。除了创世块之外,区块链上的每个块都有其父块。这些块连接起来形成一个块。链。以太坊大约每 15 秒就可以挖出一个新区块。图 2-3 显示了对以太坊区块结构中状态树的更新。

在这里插入图片描述

2.3 个帐户

在以太坊中,一个重要的概念是账户。账户以地址为索引,地址由公钥导出,取公钥的后20个字节(公钥将在2.3.3节详细介绍)。以太坊系统中有两种账户,即外部账户(Externally Owned Account,EOA)和合约账户(智能合约的内容将在第四章详细介绍)。

这两类账户在以太坊中统称为“状态对象”(stored state)。外部账户存储以太币余额的状态,合约账户除了余额之外还有智能合约及其变量的状态。这些状态对象通过事务的执行而改变,Merkle 树用于索引和验证状态对象的更新。一个以太坊账户由四个部分组成。

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

2.3.1外部账户

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

用户可以使用 Geth 命令创建外部帐户。生成帐户地址的过程主要分为三个步骤。

1) 设置账户的私钥,也就是通常的用户密码。

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

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

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

是一个显示 Ether (ETH) 的帐户实例,其中列出了帐户的 Ether 余额,以及与该帐户关联的所有历史交易。

2.3.2 合约账户

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

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

它是一个合约账户(SNT)的实例,介绍了合约账户的余额、账户交易明细、合约的发起人。

2.3.3 私钥和公钥

公钥和私钥都是密码学的概念。在现代密码系统中,加密和解密使用不同的密钥,即非对称密钥加密系统。每个通信方都需要两把密钥,分别是公钥和私钥。公钥是公开的,不需要保密以太坊区块能挖出多少个,而私钥是私有的,需要保密,防止别人知道。

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

为了让读者更容易理解什么是公钥加密,我们先来看一个简单的例子。如果有两个用户 Jack 和 Michael,Jack 想通过公钥加密技术向 Michael 发送一段文本,而 Michael 有一对公钥和私钥,那么加解密过程如下: 首先,Michael将他的公钥发送给杰克,然后杰克用他收到的公钥加密文本,将加密结果发送给迈克尔,最后迈克尔用他的私钥解密杰克发送给他的消息。整体流程如图2-4所示。

在这里插入图片描述

公钥认证是通过识别用户的私钥是否正确来识别用户的真实性。举个简单的例子,迈克尔想让杰克知道他是真正的迈克尔,而不是别人的假冒,所以迈克尔用他的私钥对文件签名,发送给杰克,杰克用迈克尔的公钥解密文件以验证签名是否来自真正的迈克尔。整体流程如图2-5所示。

在这里插入图片描述

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

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

共有三种形式的常用私钥:私钥、Keystore & Password 和记忆密码。

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

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

3)最后一个Memonic代码由BIP 39方案提出。目的是随机生成12到24个更容易记住的单词。单词序列通过 PBKDF2 和 HMAC-SHA512 函数创建随机种子。0032 建议生成确定性钱包。

2.3.4 个钱包

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

2.4 数据结构与存储

大多数区块链项目,包括以太坊和比特币,将使用默克尔树或基于默克尔树的数据结构。比特币保存了一棵默克尔树,而以太坊为三种类型的对象设计了三棵默克尔树。树(Merkle Patrcia 树),即状态树、交易树和收据树。这三棵树可以帮助以太坊客户端做一些简单的查询,比如查询一个账户的余额,以及某笔交易是否包含在zone中。块是中等的。区块和交易等数据最终存储在 LeveIDB 数据库中。LeveIDB 数据库是一个键值对

在数据库中,key一般与hash相关,value是存储内容的RLP编码。

2.4.1 数据组织

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

默克尔树特里树默克尔帕特里夏树

2.4.2 状态树

2.4.3 事务树

2.4.4 收据树

2.4.5 数据库支持LevelDB

2.5 共识机制

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

2.5.1 战俘

PoW就是通过工作的结果来证明你已经完成了相应的工作。由于工作流程繁琐且效率低下,其验证忽略工作流程,直接验证结果,虽然工作人员需要花费一定的时间来完成工作,但验证者可以在瞬间完成检查,所以这种方法是通常简单而高效。

在以太坊中,有一种专门设计的 PoW 算法以太坊区块能挖出多少个,Ethash 算法。之所以用Ethash算法代替原来的PoW算法,是为了解决挖矿中心化的问题。目前的情况是,在 Pow 算法下,少数硬件公司和挖矿机构通过集中挖矿资源,获得“操纵”现有网络中的经济力量的优势,从而获得高额利润(如比特币) )。硬币和莱特币)。这些组织可以生产出具有超高哈希性能的ASIC(Application Specific Integrated Circuits)来为自己谋取利润,这意味着挖矿不再是高度去中心化和平等主义的,而是需要大量资金的有效参与。在这种情况下,很可能会出现一个现象:一个旨在实现“去中心化”的系统,由于现实生活中矿机资源的集中,有一个中心。为了解决这个问题,以太坊基金会专门设计了一种可以“抵抗ASIC”并且可以被轻客户端快速验证的PoW算法,希望减少以太坊中心化挖矿所获得的经济回报。这就是 Ethash 算法。

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

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

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

2)使用种子可以生成16MB的伪随机缓存,轻客户端会存储缓存。

3)基于缓存重新生成一个1GB的数据集,称为DAG。数据集中的每个元素只依赖于缓存中的几个元素,即只要有缓存,就可以快速计算出 DAG 中指定位置的元素。矿工存储随时间线性增长的数据集。

4) 挖矿可以概括为“矿工”从 DAG 中随机选择元素并对其进行哈希处理的过程。DAG 也可以理解为一个完整的搜索空间。挖矿的过程是从 DAG 中随机选择元素(类似于比特币挖矿中试图找到合适的 nonce 的过程)进行散列。

5)验证者只需要花费少量内存来存储缓存,因为验证者可以根据缓存计算计算出DAG中指定位置的元素,然后验证这些指定元素的hash是否小于比某个哈希值。,即验证“矿工”的工作是否符合要求。

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

2.5.2 PoS

PoS是根据网络参与者当前持有的数字货币的数量和时间进行利益分配,是货币所有权的证明。PoS 可以说是虚拟挖矿。一般来说,像PoW一样,用户的收益与购买成本成正比,即买的越多,收益就越大。但是,相比于 PoW 机制下的挖矿,虚拟挖矿的功耗可以忽略不计。

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

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

在基于链的 PoS 中,算法在每个时隙内从验证者集合中伪随机选择一个验证者(例如,设置每 10s 一个周期,每个周期为一个时隙),并赋予该验证者一个创建权一个新块,但验证器确保该块指向最多的块(指向的前一个块通常是最长链的最后一个块)。因此,随着时间的推移,大部分区块会汇聚在一条链上。

在 BFT 风格的 PoS 中,验证者被分配了相对权利,赋予他们提出区块和对提议的区块进行投票的权利,从而决定哪个区块是新区块,并在每轮链中选举一个新区块加入该区块。在每一轮中,每个验证者对特定区块“投票”,最后所有在线和诚实的验证者“协商”给定区块是否可以添加到区块链中,并且意见不能更改。

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

2.6 以太币

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

以太币的总供应量及其发行率由2014年的预售决定。以太币的来源包括“预挖+区块奖励+叔块奖励+叔块参考奖励”。具体分布大致如下:

2.7 笔交易

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

2.7.1笔交易费

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

2.7.2 交易内容

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

一笔交易包括以下内容。

以上是以太坊中可能的交易内容。在不同的场景下,交易分为三种。

1) 转账交易:转账是最简单的一种交易,将以太币从一个账户发送到另一个账户。发送转账交易时,只需要指定发送者、接收者、转账的以太币数量(客户端发送交易时,默认可以生成Gas Limit、Gas Price、nonce、hash、signature),如跟随秀。

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(Recursive Length Prefix)是一种用于对任意二进制数据进行嵌套结构编码的编码算法,是以太坊中数据序列化的主要方法。

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

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

2.11 章节总结

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