以太坊源码分析(四) - 以太坊整体架构和核心概念

以太坊目标

以太坊的目标是基于区块链技术打造一个运行智能合约的去中心化平台。

以太坊核心概念

在这里插入图片描述

EVM
EVM是以太坊中智能合约的运行环境。它不仅被沙箱封装起来,事实上它被完全隔离,也就是说运行在EVM内部的代码不能接触到网络、文件系统或者其它进程。甚至智能合约之间也只有有限的调用。

EVM不是基于寄存器,而是基于栈的虚拟机。因此所有的计算都在一个被称为栈的区域执行。栈最大有1024个元素,每个元素256比特。对栈的访问只限于其顶端,无法只访问栈上指定深度的那个元素,在那之前必须要把指定深度之上的所有元素都从栈中移除才行。当然可以把栈上的元素放到storage或者memory中。

存储,主存(Storage, Memory )
每个账户有一块持久化内存区域被称为存储。其形式为key-value,key和value的长度均为256比特。在合约里,不能遍历账户的存储。相对于另外两种,存储的读操作相对来说开销较大,修改存储更甚。一个合约只能对它自己的存储进行读写。

第二个内存区被称为主存。合约执行每次消息调用时,都有一块新的,被清除过的主存。主存可以以字节粒度寻址,但是读写粒度为32字节(256比特)。操作主存的开销随着其增长而变大(平方级别)。

账户(Account)
外部账户:存储以太币,被公钥-私钥对控制,其地址由公钥决定,没有代码,可通过创建和签名一笔交易从一个外部账户发送消息。
合约账户:主要存储执行的合约代码,被存储在账户中的代码控制,每当合约账户收到消息,合约内部的代码就会被激活,允许它对内部存储进行读取/写入/发送其他消息和创建合约。

交易(Transaction)
交易是指从外部账户发出的签名数据包,包含交易接收者、用于确认发送者的签名、交易额度、要发送的数据、GasLimit、GasPrice。GasLimit通过需要支付的燃料来对计算步骤进行限制,防止合约代码出现指数型爆炸和无限循环。
当一个交易的目标账户是一个合约账户,那么合约账户里的代码就会与交易里的数据(payload)一同执行。如果交易目标账户是零账户,代表要创建一个合约,交易的payload就是一个合约代码的ABI,ABI作为EVM字节码执行,输出真正的合约代码被永久储存。这个过程就是“部署合约”。

Gas
以太坊上的每笔交易都会被收取一定数量的gas,gas的目的是限制执行交易所需的工作量,同时为执行支付费用。当EVM执行交易时,gas将按照特定规则被逐渐消耗。
gas price(gas价格,以太币计)是由交易创建者设置的,发送账户需要预付的交易费用 = gas price * gas amount。 如果执行结束还有gas剩余,这些gas将被返还给发送账户。
无论执行到什么位置,一旦gas被耗尽(比如降为负值),将会触发一个out-of-gas异常。当前调用帧所做的所有状态修改都将被回滚。

指令集
EVM所支持的指令编码,EVM所有的指令都针对256位这个基本的数据单位进行操作。此外合约可以访问当前区块的相关属性,比如它的编号和时间戳。

P2P网络
以太坊分布式网络中的所有节点都地位平等,没有中心服务器。

日志(Logs)
在区块层面,可以用一种特殊的可索引的数据结构来存储数据。这个特性被称为日志,Solidity用它来实现事件。合约创建之后就无法访问日志数据,但是这些数据可以从区块链外高效的访问。因为部分日志数据被存储在布隆过滤器(Bloom filter) 中,我们可以高效并且安全的搜索日志,所以那些没有下载整个区块链的网络节点(轻客户端)也可以找到这些日志。

以太坊的世界状态
包括每一个账户的余额、合约代码、账户的储存、Nonce值。
以太坊的状态转换是指在一个交易发生时,以太坊从一个正确的状态S转到下一个正确的状态S’的转换过程。

挖矿(Mine)
以太坊网络通过工作量证明算法来保证网络的安全运行。

共识算法的两种实现
以太坊共识算法对外暴露的接口是Engine接口,共识算法由两种实现体:
1、Ethash算法(POW):基础运算能力,是目前以太坊基于POW工作量证明的一个共识引擎(也叫挖矿算法)。
2、Clique算法(POS):基于“同行”认证,网络中的每一个区块是由某一个认证节点进行认证的,其他节点仅需要验证认证信息来判断该区块是否合法。
也就是说,以太坊的共识算法是系统提供的一个接口,实现可插拔式的,只要实现了共识算法就可以被引用。Ethash和Clique都是Engine接口的两种实现。

以太坊模型

以太坊本质是一个基于交易的状态机(transaction-based state machine),以太坊的状态中有百万个交易,
这些交易被打包到一个区块中,每个区块都和之前的区块链接起来,形成一个反向链表,所以叫区块链。在区块链的基础上增加了智能合约打造出以太坊。

为了让一笔交易被认为是有效的,它必须要经过一个验证过程,也就是挖矿(Mine)。 任何一个以太坊网络上的矿工都可以尝试创建和验证区块,如果一个区块被认为是有效的,并且是最快完成验证的,那么就会添加到主链上,主链是以太坊网络上最长的一条链。如果同时有多个矿工打包了一个区块,加上区块在网络中传播需要一定时间,难免会产生多条路径,就是所谓的分叉。

为了防止多条链的产生,以太坊使用了 GHOST 协议 (Greedy Heaviest Observed Subtree),也就是选择一条完成计算最多的路径,区块号越大, 路径就越长,说明挖矿消耗的算力越多。
因为成功证实了一个新区块会得到一定以太币的奖励,所以从经济学和博弈论的角度,选择主链是最优的。

以太坊的架构

以太坊的架构设计可以简单的分为三个层次,协议层接口层应用层。而协议层又可以分为网络层和存储层。
从技术角度看,协议层主要包括P2P网络通信,分布式算法,加密签名和数据存储技术。数据存储底层,比特币和以太坊都选用了Google开源的LevelDB数据库。
接口层与协议层完全分离,除了交易时与协议层进行交互,保证开发各种基于区块链的应用层业务不受约束,包括分布式存储业务,机器学习,物联网等。
应用层主要是从区块链自身的特性出发,在不引用第三方机构的前提下,提供去中心化,不可篡改,安全可靠的场景应用。 主要包括金融服务,征信和权属管理,资源共享,投资管理以及物联网和供应链等。

以太坊核心数据结构

  1. 区块(Block)是以太坊的核心数据结构之一,Block包含Header和Body两部分。
  2. Blockchain和HeaderChain, Blockchain管理所有的Block, 让其组成一个单向链表。Headerchain管理所有的Header,也形成一个单向链表, Headerchain是Blockchain里面的一部分。
  3. Transaction是Body的重要数据结构,一个交易就是被外部拥有账户生成的加密签名的一段指令,序列化,然后提交给区块链。
  4. 以太坊的数据库体系-Merkle-Patricia Trie(MPT), 它是由一系列节点组成的二叉树,在树底包含了源数据的大量叶子节点, 父节点是两个子节点的Hash值,一直到根节点。

go ethereum 源码的目录结构

accounts        	实现了一个高等级的以太坊账户管理
bmt			二进制的默克尔树的实现
build			主要是编译和构建的一些脚本和配置
cmd			命令行工具,又分了很多的命令行工具,下面一个一个介绍
	/abigen		Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages
	/bootnode	启动一个仅仅实现网络发现的节点
	/evm		以太坊虚拟机的开发工具, 用来提供一个可配置的,受隔离的代码调试环境
	/faucet		
	/geth		以太坊命令行客户端,最重要的一个工具
	/p2psim		提供了一个工具来模拟http的API
	/puppeth	创建一个新的以太坊网络的向导
	/rlpdump 	提供了一个RLP数据的格式化输出
	/swarm		swarm网络的接入点
	/util		提供了一些公共的工具
	/wnode		这是一个简单的Whisper节点。 它可以用作独立的引导节点。此外,可以用于不同的测试和诊断目的。
common			提供了一些公共的工具类
compression		Package rle implements the run-length encoding used for Ethereum data.
consensus		提供了以太坊的一些共识算法,比如ethhash, clique(proof-of-authority)
console			console类
contracts	
core			以太坊的核心数据结构和算法(虚拟机,状态,区块链,布隆过滤器)
crypto			加密和hash算法,
eth			实现了以太坊的协议
ethclient		提供了以太坊的RPC客户端
ethdb			eth的数据库(包括实际使用的leveldb和供测试使用的内存数据库)
ethstats		提供网络状态的报告
event			处理实时的事件
les			实现了以太坊的轻量级协议子集
light			实现为以太坊轻量级客户端提供按需检索的功能
log			提供对人机都友好的日志信息
metrics			提供磁盘计数器
miner			提供以太坊的区块创建和挖矿
mobile			移动端使用的一些warpper
node			以太坊的多种类型的节点
p2p			以太坊p2p网络协议
rlp			以太坊序列化处理
rpc			远程方法调用
swarm			swarm网络处理
tests			测试
trie			以太坊重要的数据结构Package trie implements Merkle Patricia Tries.
whisper			提供了whisper节点的协议。

参考:
go-ethereum-code-analysis
以太坊源码分析(1)go-ethereum的设计思路及模块组织形式
以太坊源码解读(1)以太坊核心概念

以太坊网络架构解析

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值