以太坊源码分析报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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中: