
Ethereum源码分析
boss2967
慎独
展开
-
52.以太坊源码分析(52)trie源码分析
包trie 实现了Merkle Patricia Tries,这里用简称MPT来称呼这种数据结构,这种数据结构实际上是一种Trie树变种,MPT是以太坊中一种非常重要的数据结构,用来存储用户账户的状态以及状态的变更,用来存储交易信息,用来存储交易的收据信息。MPT实际上是三种数据结构的组合,分别是Trie树, Patricia Trie, 和Merkle树。下面分别介绍这三种数据结构。Trie树...转载 2019-05-20 14:15:33 · 418 阅读 · 0 评论 -
37.以太坊源码分析(37)eth以太坊协议分析
node中的服务的定义, eth其实就是实现了一个服务。type Service interface { // Protocols retrieves the P2P protocols the service wishes to start. Protocols() []p2p.Protocol // APIs retrieves the list of RPC de...转载 2018-11-24 20:37:30 · 788 阅读 · 0 评论 -
36.以太坊源码分析(36)ethdb源码分析
go-ethereum所有的数据存储在levelDB这个Google开源的KeyValue文件数据库中,整个区块链的所有数据都存储在一个levelDB的数据库中,levelDB支持按照文件大小切分文件的功能,所以我们看到的区块链的数据都是一个一个小文件,其实这些小文件都是一个同一个levelDB实例。这里简单的看下levelDB的go封装代码。levelDB官方网站介绍的特点特点:key和...转载 2018-11-24 20:36:13 · 329 阅读 · 0 评论 -
35.以太坊源码分析(35)eth-fetcher源码分析
fetcher包含基于块通知的同步。当我们接收到NewBlockHashesMsg消息得时候,我们只收到了很多Block的hash值。 需要通过hash值来同步区块,然后更新本地区块链。 fetcher就提供了这样的功能。数据结构// announce is the hash notification of the availability of a new block in the// n...转载 2018-11-24 20:38:22 · 276 阅读 · 0 评论 -
34.以太坊源码分析(34)eth-downloader源码分析
downloader主要负责区块链最开始的同步工作,当前的同步有两种模式,一种是传统的fullmode,这种模式通过下载区块头,和区块体来构建区块链,同步的过程就和普通的区块插入的过程一样,包括区块头的验证,交易的验证,交易执行,账户状态的改变等操作,这其实是一个比较消耗CPU和磁盘的一个过程。 另一种模式就是 快速同步的fast sync模式, 这种模式有专门的文档来描述。请参考fast syn...转载 2018-11-24 20:36:02 · 424 阅读 · 0 评论 -
33.以太坊源码分析(33)eth-downloader-statesync源码分析
statesync 用来获取pivot point所指定的区块的所有的state 的trie树,也就是所有的账号的信息,包括普通账号和合约账户。数据结构stateSync调度下载由给定state root所定义的特定state trie的请求。// stateSync schedules requests for downloading a particular state trie def...转载 2018-11-24 20:35:48 · 261 阅读 · 0 评论 -
32.以太坊源码分析(32)eth-downloader-peer源码分析
queue给downloader提供了调度功能和限流的功能。 通过调用Schedule/ScheduleSkeleton来申请对任务进行调度,然后调用ReserveXXX方法来领取调度完成的任务,并在downloader里面的线程来执行,调用DeliverXXX方法把下载完的数据给queue。 最后通过WaitResults来获取已经完成的任务。中间还有一些对任务的额外控制,ExpireXXX用来...转载 2018-11-24 20:35:36 · 273 阅读 · 0 评论 -
31.以太坊源码分析(31)eth-downloader-peer源码分析
peer模块包含了downloader使用的peer节点,封装了吞吐量,是否空闲,并记录了之前失败的信息。peer// peerConnection represents an active peer from which hashes and blocks are retrieved.type peerConnection struct { id string // Unique ...转载 2018-11-24 20:32:20 · 172 阅读 · 0 评论 -
30.以太坊源码分析(30)eth-bloombits和filter源码分析
以太坊的布隆过滤器以太坊的区块头中包含了一个叫做logsBloom的区域。 这个区域存储了当前区块中所有的收据的日志的布隆过滤器,一共是2048个bit。也就是256个字节。而我们的一个交易的收据包含了很多的日志记录。 每个日志记录包含了 合约的地址, 多个Topic。 而在我们的收据中也存在一个布隆过滤器,这个布隆过滤器记录了所有的日志记录的信息。如果我们看黄皮书里面对日志记录的形式化定义...转载 2018-11-23 08:16:09 · 358 阅读 · 0 评论 -
29.以太坊源码分析(29)core-vm源码分析
contract.gocontract 代表了以太坊 state database里面的一个合约。包含了合约代码,调用参数。结构// ContractRef is a reference to the contract's backing objecttype ContractRef interface { Address() common.Address}// Accoun...转载 2018-11-23 08:15:58 · 326 阅读 · 0 评论 -
28.以太坊源码分析(28)core-vm-stack-memory源码分析
vm使用了stack.go里面的对象Stack来作为虚拟机的堆栈。memory代表了虚拟机里面使用的内存对象。stack比较简单,就是用1024个big.Int的定长数组来作为堆栈的存储。构造// stack is an object for basic stack operations. Items popped to the stack are// expected to be ch...转载 2018-11-23 08:15:48 · 111 阅读 · 0 评论 -
38.以太坊源码分析(38)event源码分析
event包实现了同一个进程内部的事件发布和订阅模式。event.go目前这部分代码被标记为Deprecated,告知用户使用Feed这个对象。 不过在代码中任然有使用。 而且这部分的代码也不多。 就简单介绍一下。数据结构TypeMux是主要的使用。 subm记录了所有的订阅者。 可以看到每中类型都可以有很多的订阅者。// TypeMuxEvent is a time-tagged no...转载 2018-11-24 20:38:33 · 251 阅读 · 0 评论 -
39.以太坊源码分析(39)geth启动流程分析
geth是我们的go-ethereum最主要的一个命令行工具。 也是我们的各种网络的接入点(主网络main-net 测试网络test-net 和私有网络)。支持运行在全节点模式或者轻量级节点模式。 其他程序可以通过它暴露的JSON RPC调用来访问以太坊网络的功能。如果什么命令都不输入直接运行geth。 就会默认启动一个全节点模式的节点。 连接到主网络。 我们看看启动的主要流程是什么,涉及到了那...转载 2018-11-24 20:38:48 · 240 阅读 · 0 评论 -
41.以太坊源码分析(41)hashimoto源码分析
Hashimoto :I/O bound proof of workAbstract: Using a cryptographic hash function not as a proofofwork by itself, butrather as a generator of pointers to a shared data set, allows for an I/O boundpro...转载 2018-11-24 20:39:01 · 238 阅读 · 0 评论 -
51.以太坊源码分析(51)rpc源码分析
RPC包的官方文档Package rpc provides access to the exported methods of an object across a networkor other I/O connection. After creating a server instance objects can be registered,making it visible from ...转载 2018-11-27 14:27:45 · 255 阅读 · 0 评论 -
50.以太坊源码分析(50)p2p-udp.go源码分析
p2p的网络发现协议使用了Kademlia protocol 来处理网络的节点发现。节点查找和节点更新。Kademlia protocol使用了UDP协议来进行网络通信。阅读这部分的代码建议先看看references里面的Kademlia协议简介来看看什么是Kademlia协议。首先看看数据结构。 网络传输了4种数据包(UDP协议是基于报文的协议。传输的是一个一个数据包),分别是ping,po...转载 2018-11-27 14:27:24 · 439 阅读 · 0 评论 -
49.以太坊源码分析(49)p2p-table.go源码分析
table.go主要实现了p2p的Kademlia协议。Kademlia协议简介(建议阅读references里面的pdf文档)Kademlia协议(以下简称Kad) 是美国纽约大学的PetarP. Maymounkov和David Mazieres.在2002年发布的一项研究结果《Kademlia: A peerto -peer information system based onth...转载 2018-11-27 14:27:07 · 286 阅读 · 0 评论 -
48.以太坊源码分析(48)p2p-server.go源码分析
server是p2p的最主要的部分。集合了所有之前的组件。首先看看Server的结构// Server manages all peer connections.type Server struct { // Config fields may not be modified while the server is running. Config // Hooks ...转载 2018-11-27 14:26:22 · 238 阅读 · 0 评论 -
47.以太坊源码分析(47)p2p-rlpx节点之间的加密链路
RLPx Encryption(RLPx加密)之前介绍的discover节点发现协议, 因为承载的数据不是很重要,基本是明文传输的。每一个节点会开启两个同样的端口,一个是UDP端口,用来节点发现,一个是TCP端口,用来承载业务数据。 UDP的端口和TCP的端口的端口号是同样的。 这样只要通过UDP发现了端口,就等于可以用TCP来连接到对应的端口。RLPx协议就定义了TCP链接的加密过程。R...转载 2018-11-27 08:30:34 · 287 阅读 · 0 评论 -
46.以太坊源码分析(46)p2p-peer.go源码分析
nat是网络地址转换的意思。 这部分的源码比较独立而且单一,这里就暂时不分析了。 大家了解基本的功能就行了。nat下面有upnp和pmp两种网络协议。upnp的应用场景(pmp是和upnp类似的协议)如果用户是通过NAT接入Internet的,同时需要使用BC、电骡eMule等P2P这样的软件,这时UPnP功能就会带来很大的便利。利用UPnP能自动的把BC、电骡eMule等侦听的端口号映射...转载 2018-11-27 14:26:05 · 301 阅读 · 0 评论 -
45.以太坊源码分析(45)p2p-dial.go源码分析
dial.go在p2p里面主要负责建立链接的部分工作。 比如发现建立链接的节点。 与节点建立链接。 通过discover来查找指定节点的地址。等功能。dial.go里面利用一个dailstate的数据结构来存储中间状态,是dial功能里面的核心数据结构。// dialstate schedules dials and discovery lookups.// it get's a chanc...转载 2018-11-27 14:25:49 · 156 阅读 · 0 评论 -
44.以太坊源码分析(44)p2p-database.go源码分析
p2p包实现了通用的p2p网络协议。包括节点的查找,节点状态的维护,节点连接的建立等p2p的功能。p2p 包实现的是通用的p2p协议。 某一种具体的协议(比如eth协议。 whisper协议。 swarm协议)被封装成特定的接口注入p2p包。所以p2p内部不包含具体协议的实现。 只完成了p2p网络应该做的事情。discover / discv5 节点发现目前使用的包是discover。 dis...转载 2018-11-27 14:25:27 · 180 阅读 · 0 评论 -
43.以太坊源码分析(43)node源码分析
node在go ethereum中代表了一个节点。 可能是全节点,可能是轻量级节点。 node可以理解为一个进程,以太坊由运行在世界各地的很多中类型的node组成。一个典型的node就是一个p2p的节点。 运行了p2p网络协议,同时根据节点类型不同,运行了不同的业务层协议(以区别网络层协议。 参考p2p peer中的Protocol接口)。node的结构。// Node is a conta...转载 2018-11-27 14:25:12 · 241 阅读 · 0 评论 -
27.以太坊源码分析(27)core-vm-jumptable-instruction源码分析
jumptable. 是一个 [256]operation 的数据结构. 每个下标对应了一种指令, 使用operation来存储了指令对应的处理逻辑, gas消耗, 堆栈验证方法, memory使用的大小等功能.jumptable数据结构operation存储了一条指令的所需要的函数.type operation struct { // op is the operation fun...转载 2018-11-23 08:11:28 · 294 阅读 · 0 评论 -
11.以太坊源码分析(11)eth目前的共识算法pow的整理
eth目前的共识算法pow的整理涉及的代码子包主要有consensus,miner,core,geth/consensus 共识算法 consensus.go 1. Prepare方法 2. CalcDifficulty方法:计算工作量 3. AccumulateRewards方法:计算每个块的出块奖励 4. Ve...转载 2018-11-22 14:53:32 · 1356 阅读 · 0 评论 -
09.以太坊源码分析(9)cmd包分析
cmd包概述geth主要Ethereum CLI客户端。它是Ethereum网络(以太坊主网,测试网络或私有网)的入口点,使用此命令可以使节点作为full node(默认),或者archive node(保留所有历史状态)或light node(检索数据实时)运行。 其他进程可以通过暴露在HTTP,WebSocket和/或IPC传输之上的JSON RPC端点作为通向Ethereum网络的网...转载 2018-11-20 08:49:08 · 153 阅读 · 0 评论 -
08.以太坊源码分析(8)区块分析
区块存储区块的存储是由leveldb完成的,leveldb的数据是以键值对存储的。在这里保存区块信息时,key一般是与hash相关的,value所保存的数据结构是经过RLP编码的。在代码中,core/database_util.go中封装了区块存储和读取相关的代码。在存储区块信息时,会将区块头和区块体分开进行存储。因此在区块的结构体中,能够看到Header和Body两个结构体。区块头(He...转载 2018-11-20 08:30:49 · 305 阅读 · 1 评论 -
07.以太坊源码分析(7)Ethereum 资源分享
Awesome Ethereum collection of best resources for ethereum developmentPlease read the contribution guidelines before contributing.Contents架构教程视频工具文档SDK优化案例Architect以太坊白皮书The Ethere...转载 2018-11-20 08:30:41 · 405 阅读 · 1 评论 -
06.以太坊源码分析(6)accounts账户管理分析
数据结构分析以太坊的账户管理定义在accounts/manager.go中,其数据结构为:// Manager is an overarching account manager that can communicate with various// backends for signing transactions. type Manager struct { ba...转载 2018-11-20 08:30:29 · 254 阅读 · 0 评论 -
03.以太坊源码分析(3)以太坊交易手续费明细
转载 2018-11-20 08:28:58 · 544 阅读 · 0 评论 -
02.以太坊源码分析(2)go ethereum 目录大概介绍
go-ethereum项目的组织结构基本上是按照功能模块划分的目录,下面简单介绍一下各个目录的结构accounts 实现了一个高等级的以太坊账户管理bmt 二进制的默克尔树的实现build 主要是编译和构建的一些脚本和配置cmd 命令行工具,又分了很多的命令行工具,下面一个一个介绍 /abigen S...转载 2018-11-20 08:28:45 · 255 阅读 · 0 评论 -
13.以太坊源码分析(13)RPC分析
这是一个交互式的 JavaScript 执行环境,在这里面可以执行 JavaScript 代码,其中 > 是命令提示符。在这个环境里也内置了一些用来操作以太坊的 JavaScript 对象,可以直接使用这些对象。这些对象主要包括:eth:包含一些跟操作区块链相关的方法;net:包含一些查看p2p网络状态的方法;admin:包含一些与管理节点相关的方法;miner:包含启动&停...转载 2018-11-22 14:54:51 · 210 阅读 · 0 评论 -
14.以太坊源码分析(14)P2P分析
概述Kademlia(简称Kad)是一种分布式哈希表技术,用于建立p2p网络拓扑结构。基本原理就是以两个节点ID的异或值作为两节点间的距离d,每个节点都将其他节点的信息存储到称之为K桶的表结构中,该表结构按照d的为1的最高bit位分层(可理解为桶索引),每层中存储最多K个节点信息。如下:I距离范围邻居0[2^0, 2^1 )(IP,UDP,NodeID) …...转载 2018-11-22 14:58:16 · 236 阅读 · 0 评论 -
25.以太坊源码分析(25)core-txlist交易池的一些数据结构源码分析
nonceHeapnonceHeap实现了一个heap.Interface的数据结构,用来实现了一个堆的数据结构。 在heap.Interface的文档介绍中,默认实现的是最小堆。如果h是一个数组,只要数组中的数据满足下面的要求。那么就认为h是一个最小堆。!h.Less(j, i) for 0 <= i < h.Len() and 2*i+1 <= j <= 2*i+...转载 2018-11-23 08:07:34 · 248 阅读 · 0 评论 -
24.以太坊源码分析(24)core-state源码分析
core/state 包主要为以太坊的state trie提供了一层缓存层(cache)database主要提供了trie树的抽象,提供trie树的缓存和合约代码长度的缓存。journal主要提供了操作日志,以及操作回滚的功能。state_object是account对象的抽象,提供了账户的一些功能。statedb主要是提供了state trie的部分功能。database.god...转载 2018-11-23 08:07:19 · 409 阅读 · 0 评论 -
23.以太坊源码分析(23)core-state-process源码分析
StateTransition状态转换模型/*The State Transitioning Model状态转换模型A state transition is a change made when a transaction is applied to the current world state状态转换 是指用当前的world state来执行交易,并改变当前的world stat...转载 2018-11-23 08:07:10 · 222 阅读 · 0 评论 -
22.以太坊源码分析(22)core-genesis创世区块源码分析
genesis 是创世区块的意思. 一个区块链就是从同一个创世区块开始,通过规则形成的.不同的网络有不同的创世区块, 主网络和测试网路的创世区块是不同的.这个模块根据传入的genesis的初始值和database,来设置genesis的状态,如果不存在创世区块,那么在database里面创建它。数据结构// Genesis specifies the header fields, state...转载 2018-11-23 08:06:59 · 259 阅读 · 0 评论 -
21.以太坊源码分析(21)chain_indexer 区块链索引
chain_indexer 区块链索引chain_indexer.go 源码解析chain_indexer 顾名思义, 就是用来给区块链创建索引的功能。 之前在eth协议的时候,介绍过BloomIndexer的功能,其实BloomIndexer是chain_indexer的一个特殊的实现, 可以理解为派生类, 主要的功能其实实在chain_indexer这里面实现的。虽说是派生类,但是chai...转载 2018-11-23 08:06:44 · 302 阅读 · 0 评论 -
20.以太坊源码分析(20)core-bloombits源码分析
scheduler.goscheduler是基于section的布隆过滤器的单个bit值检索的调度。 除了调度检索操作之外,这个结构还可以对请求进行重复数据删除并缓存结果,从而即使在复杂的过滤情况下也可以将网络/数据库开销降至最低。数据结构request表示一个bloom检索任务,以便优先从本地数据库中或从网络中剪检索。 section 表示区块段号,每段4096个区块, bit代表检索的是...转载 2018-11-22 15:02:46 · 382 阅读 · 0 评论 -
19.以太坊源码分析(19)core-blockchain分析
从测试案例来看,blockchain的主要功能点有下面几点.import.GetLastBlock的功能.如果有多条区块链,可以选取其中难度最大的一条作为规范的区块链.BadHashes 可以手工禁止接受一些区块的hash值.在blocks.go里面.如果新配置了BadHashes. 那么区块启动的时候会自动禁止并进入有效状态.错误的nonce会被拒绝.支持Fast importi...转载 2018-11-22 15:02:09 · 1550 阅读 · 0 评论