Below you will find pages that utilize the taxonomy term “Golang”
Read Go Ethereum Source Code 7.1
从 commit f6fa4f88797030b8e83066cb262a68958953974e 后,go-ethereum 将功能比较独立的代码分装为模块了。
后面的几次提交 分别独立出来了一下几个模块:
- github.com/ethereum/ethwire-go wire协议处理
- github.com/ethereum/ethutil-go 编解码等功能处理
- github.com/ethereum/ethdb-go 数据库处理
所以我们选择模块拆分后,并通过编译的版本分析代码变化。
git checkout 4ea93eba501cf996395e4c0829e21cab77267cf9
commit 4ea93eba501cf996395e4c0829e21cab77267cf9 (HEAD)
Author: obscuren <geffobscura@gmail.com>
Date: Wed Jan 15 23:32:30 2014 +0100
Updated tests
以上三个独立模块,在github上原仓库已经没有了。 有部分用户在github上克隆了一份。我们将代码clone下来并按照原包名放置。
Read Go Ethereum Source Code 6
go-ethereum 网络的雏形。 代码仍然停留在
commit ba385ccdf15f8379c54d65061c3d62353baffc2b (HEAD)
Author: obscuren <geffobscura@gmail.com>
Date: Fri Jan 10 10:59:57 2014 +0100
sudo not udo
Read Go Ethereum Source Code 5
dagger.go (Dagger工作量证明 )
Ethash 是 Ethereum 的PoW(工作量证明)算法。 该算法需要大量的数据集合,该集合被称为DAG. Ethash 算法由Dagger-Hashimoto 算法改进而得,Dagger Hashimoto是Ethereum 1.0 挖矿算法的推荐规范 。
Dagger Hashimoto 基于已经存在的关键算法:Hashimoto 和 Dagger。
在go-ethereum 提交记录 9f133a92d0853102863b77dd7c884d1462cf73a4 中,第一次提交了dagger的实现。
commit 9f133a92d0853102863b77dd7c884d1462cf73a4 (HEAD)
Author: obscuren <geffobscura@gmail.com>
Date: Wed Jan 8 23:41:03 2014 +0100
First dagger impl
Read Go Ethereum Source Code 4
Trie.go (Merkle-patricia-tree )
Merkle Patricia Tree(简称MPT树,实际上是一种trie前缀树)是以太坊中的一种加密认证的数据结构,可以用来存储所有的(key,value)对。
以太坊区块链中的区块由标题,交易列表和叔区块列表组成。区块头中包含交易的根哈希,它用于验证交易列表。在区块头部包括了交易的hash树根,用来校验交易的列表。在p2p网络上传输的交易是一个简单的列表,它们被组装成一个叫做trie树的特殊数据结构,来计算根hash。值得注意的是,除了校验区块外,这个数据结构并不是必须的,一旦区块被验证正确,那么它在技术上是可以忽略的。但是,这意味着交易列表在本地以trie树的形式存储,发送给客户端的时候序列化成列表。客户端接收到交易列表后重新构建交易列表trie树来验证根hash。RLP(Recursive length prefix encoding,递归长度前缀编码),用来对trie树种所有的条目进行编码。对RLP的介绍和源码实现阅读可参考阅读 go-ethereum 源码 - 2 。
Merkle Patricia Tree的Wiki可在https://github.com/ethereum/wiki/wiki/Patricia-Tree查看。
go-ethereum源码中对MPT数的处理时在文件 **trie.go **中。 进入go-ethereum 源码查看trie.go .
git checkout 9f133a92d0853102863b77dd7c884d1462cf73a4
或通过如下方式在线浏览:
https://github.com/ethereum/go-ethereum/blob/9f133a92d0853102863b77dd7c884d1462cf73a4/trie.go
Read Go Ethereum Source Code 3
从初始代码提交到commit ad048e9f445ff96b7bfd75c104ab923e1e06754b,go-ethereum的结构&功能变化不大。主要变化有:
- 将rlp编解码移动到 rlp.go文件中
- 完善 transaction、block的rlp编解码
到了commit a926686445929d091c2d9e019b017600168e9e47,源码中出现了较大的功能加入。
Added sample server, genesis block, and database interface
但是本次提交出现,无法编译通过。错误为:
./database.go:65: cannot use k (type []int) as type string in function argument
所以迁出下一次提交 并逐一分析源码、功能。
git checkout f17930eb4661721cd0e1b92765448c589441907b
或在线浏览:
https://github.com/ethereum/go-ethereum/tree/f17930eb4661721cd0e1b92765448c589441907b
Read Go Ethereum Source Code 2
RLP(递归长度前缀)的目的是编码任意嵌套的二进制数据数组,RLP是以太坊中用于序列化对象的主要编码方法。 RLP的唯一目的是编码结构; 对于编码的数据的具体类型(例如字符串,浮点数)则留给高阶协议自己负责处理。(简单来说编码的二进制数据,代表的是字符串、浮点数还是其他类型。由使用该编码的高级协议定义);RLP编码的整数必须以大端二进制形式(big endian)表示,且不包含前导零(整数值零等于空字节数组)。 反序列化正整数时如发现前缀有零的必须视为无效。 字符串长度的整数表示也必须以这种方式进行编码,其他部分的整数同样如此。 更多信息可以在Ethereum黄皮书 附录B中找到。
如果有人希望使用RLP对字典进行编码,有两个建议
- 按照字典顺序使用[[k1,v1],[k2,v2]…]进行编码
- 或者使用更高级别的Patricia Tree编码
Read Go Ethereum Source Code 1
如何理解系统的设计?最好的方法当然是:
Read The Fucking Source Code
Go Ethereum 是什么
以太坊从项目早起,就有不同操作系统下的多客户端实现。这些客户端可以互相验证以太坊的协议正确性。go-ethereum 是以太坊协议的go语言实现的客户端。
截止2016年9月,go-ethereum(go语言实现) 和 Parity(Rust语言实现) 是领先的实现方案。
以太坊的协议标准在其黄皮书中定义。
go-ethereum 由 Jeffrey Wilcke 领导开发,项目启动与2013年,开发语言为Go。go-ethereum在2015年7月30日成功发布,标志着创世区块和以太坊平台的发布。
Jeff Wilcke 为以太坊的创始人之一,并是以太坊的三位董事之一。