以太坊源码分析报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

以太坊源码分析报告

一、 前言

以比特币为代表的虚拟货币时代,代表着区块链1.0,基于P2P 网络构建,实现了去中心化的数字货币交易功能。但是1.0只满足了虚拟货币的需要,很难普及到其他行业。比如比特币只提供了有限的非图灵完备的脚本能力,不大可能在其上搭建第三方的应用。发展到区块链2.0,便出现了以以太坊为代表的智能合约平台,提供强大的合约编程环境,可以实现复杂的业务逻辑。与比特币系统相比以太坊并没有本质的区别,只是全面实现和支持智能合约,让区块链技术不只是发币。

本文以以太坊的官方go 语言版本实现go-ethereum 为目标,分析其源码实现。

二、 以太坊架构简介 1. 最顶层是去中心化应用层,即DApp 。它使用truffle 开发测试框架(最流行)编写部署和测试客户端,并通过web3.js 和智能合约层交互;

2. 智能合约层通过以太坊虚拟机EVM 交互处理BlockChain 及共识相关的事务,同时通过RPC 协议进行挖矿和网络层事务的交互;

以太坊实现 Web3.js

核心

去中心化应用层

智能合约层

EVM

RPC 区块链

管理模块 共识模块 挖矿模块 网络模块

P2P 加解密库 levelDB Solidity Math & Number

账户

管理模块

3.区块链管理模块围绕交易、块和状态进行管理,包括区块的同步验证及异常和分叉

处理、交易的广播接收处理和验证及执行、底层数据的读写更新等;

4.共识模块是制定的认定区块合法的机制,包括PoW(Proof Of Work 工作量证明,以

太坊使用变种的Ethash算法)及PoS(Proof Of Stake 权益证明,只在测试网络中使

用),符合共识算法的新区块才会被节点认可和接纳,链接到分布式账本中,同时才

能让矿工得到收益;

5.挖矿模块管理挖矿工作,将争夺记账权的过程分解成多个并行子任务进行;

6.账户管理模块管理以太坊系统中的账户,包括普通账户及合约账户的生成和管理,

还有钱包及密钥的生成、导入和导出;

7.网络模块管理着系统中的Peer、Protocol、Downloader、Sync等角色,为整个分布

式网络提供节点间的共识基础。包括节点对端连接的动态管理、ETH/LES/LES2协议

的支持、各类数据包的下载和同步;

8.架构的最底层功能为上层模块提供了基础P2P网络的通讯、secp251和sha3等加解

密算法、高效的LevelDB键值对存储数据库、合约语言基础及大数字的基本运算。

三、源码目录结构

四、 基本概念

在以太坊的YellowPaper 中,把整个以太坊看成是一个基于交易的状态机。从创世状态开始,在一批交易执行后便进入到下一个新的状态,直到当前的终态。

1. 交易

当一个账户向另一个账户发送一笔被签名的消息数据包时,就产生了一笔交易。账户可以是普通账户,也可以是合约账户。交易执行时需要花费手续费。

交易Transaction 定义在 core/types/transaction.go 中:

Transaction 的主体定义在txdata 中,其它成员都只是交易常用信息的缓存: hash: 交易RLP 编码后的哈希值;

创世态 状态1 交易

状态N

…….

. 交易 交易 Block 0

Header TXs Block 1 Header TXs Block N Header TXs

…… BlockChain

size: 交易RLP编码后的大小;

from: 交易的发送地址,它并不存储在交易体里,而是由txdata中的V,R,S值推导出来;

交易的主要信息包含在txdata中,包括如下字段:

AccountNonce: 代表发送账户发出的第几笔交易;

Price: 交易发送者愿意支付的一单位gas费用的价格;

GasLimit: 交易执行所花费最大的gas值。如果超过该值则交易失败;

Receipient: 交易的接收地址;

Amount: 从发送地址向接收地址转移的以太币数量;

Payload: 可选,在创建合约时表示合约代码,或者调用合约时调用参数;

V|R|S: secp256k1签名数据;

Hash: 同Transaction.hash,在转换为Json格式时用到;

2.区块

一个区块包含了一系列的交易,矿工节点收集本地发起的及网络中其它节点广播的新交易,验证交易的有效性,然后将它们打包到一个原始区块中,最后通过挖矿得到一个数学机制的“工作量证明”写到该区块,从而得到一个新的合法区块,广播到网络中,在其它矿工验证区块有效后添加到主链上。

区块的定义在core/types/block.go 中:

header: Block的核心,由后面给出其定义;

uncles: 叔块,以太坊对孤块(发现晚但是合法的新块)的处理和比特币的抛弃式处理不同,因为以太坊十几秒的出块间隔会导致大量的孤块,因此以太坊鼓励矿工引用孤块成为叔块并支付报酬,减少昂贵成本的浪费,使得主链更重提升安全性,也缓解矿池中心化问题;

transactions: 区块打包的一批交易;

td: Total Difficulty,总难度值,主链是td值最大的链;

ReceivedAt: 记录块的接收时间;

ReceivedFrom: 记录块的发送peer;

Header的定义也在core/types/block.go中:

相关文档
最新文档