《以太坊技术详解与实战》第2章 - 太坊架构和组成

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yzpbright/article/details/82855245

2.1 以太坊整体架构

以太坊的整体架构如图 2-1 所示,分为三层:底层服务、核心层、顶层应用 。
在这里插入图片描述

( 1 )底层服务
底层服务包含 P2P 网络服务 、 LeveIDB 数据库、密码学算法以及分片( Sharding )优化等基础服务 。 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 )等 。
以太坊区块链上区块数据结构的一个重大改变就是保存了 三棵 Merkle树根,分别是状态树、交易树和收据树 。 存储三棵树可方便账户做更多查询 。 交易列表是由矿工从交易池中选择收入区块中的一系列交易 。 区块链上的第一个区块称为“创世区块”,区块链上除了创世区块以外每个区块都有它的父区块,这些区块连接起来组成一个区块链 。 以太坊大约每 15s 可以挖出一个新的区块 。 图 2-3 显示了以太坊区块结构中状态树的更新 。
在这里插入图片描述

2.3账户

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

  • 外部账户一般简称为“账户”,它们都是由人创建的,可以存储以太币, 是由公钥和私钥控制的账户 。
  • 合约账户是由外部账户创建的账户 。

以太坊中这两种账户统称为“状态对象”(存储状态) 。 其中外部账户存储以太币余额状态,而合约账户除了余额还有智能合约及其变量的状态 。 通过交易的执行,这些状态对象发生变化,而 Merkle 树用于索引和验证状态对象的更新。一个以太坊的账户包含四个部分。

  • 该地址交易的次数( nonce ),它是用于保障每笔交易能且只能被处理一次的计数器,有效避免重放( replay )攻击。
  • 账户目前的以太币余额 。
  • 账户的合约二进制代码(合约账户) 。
  • 账户的存储(默认为空) 。

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

2.3.1外部账户
外部账户( EOA )由私钥来控制,是由用户实际控制的账户 。 每个外部账户拥有一对公私钥,这对密钥用于签署交易,它的地址由公钥决定 。 外部账户不能包含以太坊虚拟机(EVM )代码 。 我们可以做一个简单的类比,把外部账户看作用户在某个银行办理的一个账户,公钥就是用户为该账户设置的卡号,而私钥则是用户设置的密码 。 一个外部账户具有以下特性:拥有一定的账户余额、可以发送交易、通过私钥控制,以及没有相关联的代码 。
用户可以使用 Geth 指令创建一个外部账户 。 生成一个账户地址的过程主要有三步 。
1 )设置账户的私钥,也就是通常意义的用户密码 。
2 )使用加密算法由私钥生成对应的公钥 。
3 )根据公钥得出相应的账户地址 。
其中第 2 步中使用的加密算法是 secp256kl 椭圆曲线密码算法,而不是 RSA 加密算法,因为前者相对于后者更加高效安全 。 对于由公钥得到账户地址,在以太坊中使用 SHA3方法 。
https://etherscan.io/address/0xb794f5ea0ba39494ce839613fffba74279579268 是 一个显示以太币( ETH )的账户实例,其列出了该账户的以太币余额,以及该账户相关的所有历史交易 。

2.3.2合约账户
合约账户是一个包含合约代码的账户 。 合约账户不是由私钥文件直接控制,而是由合约代码控制 。 合约账户的地址是由合约创建时合约创建者的地址,以及该地址发出的交易共同计算得出的 。 一个合约账户具有下列特性:拥有一定的以太币余额;有相关联的代码,代码通过交易或者其他合约发送的调用来激活;当合约被执行时,只能操作合约账户拥有的特定存储。 合约账户和普通账户最大的不同就是它还存有智能合约 。
以太坊区块链上的所有操作都是根据从账户发出的交易来执行的 。 每当合约账户收到一条交易消息时,其合约代码将被交易输入的参数调用执行 。 而合约代码将会在参与到网络中的每一个节点上执行,并将执行结果作为新块验证的一部分。
https://etherscan.io/address/0x744d70fdbe2ba4cf95131626614a1763df805b9e 是一个合约账户的实例( SNT ),介绍了合约账户的余额、账户交易详情以及合约的发起人等内容 。

2.3.3 私钥和公钥
公钥和私钥都是属于密码学的概念。在现代密码学体系中,加密和解密采用了不同的密钥,也就是非对称密钥加密系统,每个通信方都需要两个密钥,这两个密钥就是公钥和私钥 。 公钥是公开的,不需要保密,而私钥是私有的,对其需要保管和隐蔽,以防别人知道 。
每一个公钥对应一个私钥 。 在密钥对中,如果一个用作加密,则另一个用作解密 。 非对称密钥加密系统的主要应用有两个,分别是公钥加密和公钥认证。 公钥加密和公钥认证的过程并不一样,下面分别进行简单介绍 。

为了让读者更容易理解什么是公钥加密,先来看一个简单的例子 。 若有两个用户 Jack和 Michael, Jack 想把一段文字通过公钥加密技术发送给 Michael ,而 Michael 有一对公钥和私钥,那么这个加密和解密过程如下:首先, Michael 将他的公钥发送给 Jack ,接着 Jack就用他收到的公钥对文字进行加密,将加密后的结果发送给 Michael ,最后 Michael 用他的私钥解密 Jack 发送给他的消息 。 整体过程如图 2-4 所示 。
在这里插入图片描述

公钥认证即通过鉴别一个用户的私钥是否正确来鉴别这个用户的真伪 。 列举一个简单的例子, Michael 想让 Jack 知道自己是真实的 Michael ,而不是其他人假 冒的,所以Michael 使用私钥对文件进行签名,发送给 Jack, Jack 再用 Michael 的公钥解密文件,从而验证签名是否来自真实的 M ichael 。 整体流程如图 2-5 所示 。
在这里插入图片描述

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

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

目前常见的私钥有三种形态: Private key、 Keystore & Password 以及 Memonic code 。
1 ) Private key 就是一份随机生成的 256 位二进制数字,用户甚至可以用纸笔来随机地生成一个私钥,即随机写下一串 256 位的仅包含“0”或“ 1 ”的字符串 。 该 256 位二进制数字就是私钥最初始的状态 。
2 )而在以太坊官方钱包中,私钥和公钥将会以加密的方式保存一份 JSON 文件,存储在 keystore 子目录下 。 这份 JSON 文件就是 Keystore ,所以用户需要同时备份 Keystore和对应的 Password (创建钱包时设置的密码) 。
3 )最后一种 Memonic code 是由 BIP 39 方案提出的,目的是随机生成 12 ~ 24 个比较容易记住的单词,该单词序列通过 PBKDF2 与 HMAC-SHA512 函数创建出随机种子,该种子通过 BIP-0032 提案的方式生成确定性钱包 。

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

2.4 数据结构与存储
包括以太坊和比特币在内的大多数区块链项目,会使用 Merkle 树或基于 Merkle 树的数据结构,比特币中保存了一棵 Merkle 树,而以太坊针对三种对象设计了 三棵 Merkle 树( Merkle Patrcia 树),分别是状态树、交易树和收据树,这三种树可以帮助以太坊客户端做一些简易的查询,如查询某个账户的余额 、 某笔交易是否被包含在区块中等 。 区块 、 交易等数据最终都是存储在 LeveIDB 数据库中 。 LeveIDB 数据库是一个键值对( key-value )数
据库, key 一般与散列相关, value 则是存储内容的 RLP 编码 。

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

  1. Merkle 树
  2. Trie 树
  3. Merkle Patricia 树

2.4.2 状态树

2.4.3 交易树

2.4.4 收据树

2.4.5 数据库支持一一LevelDB

猜你喜欢

转载自blog.csdn.net/yzpbright/article/details/82855245
今日推荐