前面的章节 go-ethereum 源码笔记(core 模块-区块链操作) 描述了区块链世界的核心:区块,区块链。我们已经知道区块链可以用来存储交易的数据,也知道了如何在区块链里发起一笔交易,而问题是,往区块链中增加数据应该是一个较困难的操作,按照比特币论文里的说法,即需要一个 PoW(Proof of Work,工作量证明),否则每个人都能轻易往区块链中增加数据,安全性和一致性无法保证。这一点上,以太坊法和比特币类似,尽管略有不同,但大致都需要矿工的角色贡献计算力,完成一个复杂的计算,即找到一个区块的哈希值,验证正确之后才能加入到区块链中。这个过程就叫做挖矿。矿工们去做这件事当然是有一定利益驱使的,每完成一次挖矿,他们就能获得一些以太币奖励。
go-ethereum 源码笔记(core 模块-交易池)
上一篇我们探究了以太坊账户,转账的实现,在文末的时候挖了一个坑,调用了提交转账的 api 后我们就没有再继续往下走了。这一篇我们更进一步,看看交易池是怎么实现的。
go-ethereum 源码笔记(accounts, transaction 模块-账户和转账)
这一篇分析 geth
中与账户和转账相关的源代码。
交易是以太坊里的一个很核心的概念,它不仅仅体现在价值的转移上。我们知道智能合约是以太坊的一个重大创新,而智能合约的执行是依靠交易来触发的,可以这么说,在以太坊中,大部分场景的状态转换都依靠交易实现,而交易又与账户紧密相关,所以这一篇我们将账户,转账这两个模块结合在一起来探讨。
go-ethereum 源码笔记(trie 模块-MPT 的实现)
默克尔树是区块链的基础结构,在比特币里它用来存放区块内的所有交易,用一个数字指纹(hash)来表示整个交易集合,在以太坊中,提出了一种新的数据结构叫做 Merkle Patricia Tree(常用翻译:默克尔帕特里夏树,缩写是 MPT),在以太坊中它用来组织管理账户,交易,收据等数据。从名字或许可以看出来它是一个组合名字,它实际上是默克尔树和帕特里夏树两种数据结构的结合,在阅读 trie 模块之前,读者应该对默克尔树,帕特里夏树这两个数据结构有一定了解,这些是阅读源代码的基础知识,这里只做概述。下面我们先分别介绍这两种数据结构。
go-ethereum 源码笔记(rlp 模块-序列化与反序列化)
go-ethereum 源码笔记(core 模块-区块链操作)
区块链区块链,即区块组成的链,不妨先从区块谈起。这一篇我们将着眼于区块链的一些基本操作。在区块链中,区块存储有效信息,在阅读源代码之前,我们应该对区块头,区块体,区块链这些基本的数据结构有所了解。
go-ethereum 源码笔记(cmd 模块-其他命令)
cmd 包中除了 ethereum cli 客户端还包括很多其他可执行命令。下面我们将一一分析这些子命令,与上一篇 go-ethereum 源码笔记(cmd 模块-geth 命令)一样,我们不会深入到其他模块中,这一篇仅限于 cmd 模块。
go-ethereum 源码笔记(cmd 模块-geth 命令)
cmd 模块包含了很多子模块,基本上每个子模块表示一个可执行的命令,其中最重要的是 geth 命令,它是以太坊的命令行客户端。
geth 命令是以太坊提供的一个强大的命令行工具,它是使用以太坊的入口。它包括了很多子命令,你可以通过 geth --help
获得更多帮助信息。其运行方法是:geth [选项] 命令 [命令选项][参数…]
。
go-ethereum 源码笔记(基础知识)
本篇将梳理以太坊的基本概念,说明一些值得注意的地方,这里不会讲解比特币的原理,代码,但会介绍以太坊与比特币的差异,所以最好看过比特币的论文,对比特币的基本原理、实现有所了解。这一篇将以太坊的白皮书作为重要参考,可以看做是以太坊白皮书的概述。以太坊的白皮书是一个非常好的学习资料,它在介绍以太坊前分析了比特币存在的问题,因此我们可以通过这份白皮书了解整个加密货币的生态。
go-ethereum 源码笔记(概览)
花了一点时间读以太坊的源代码,内容太多,所以一边看一边写,没想到越写越多,于是想着把笔记整理出来。
源码解读是一件费力不讨好的事情,因为看代码的时候我们看到的是最终解决方案,虽然可以看到 commit 的历史,但我们看不到作者的思路,踩过的坑,而且 geth 的设计文档,功能的相关讨论等信息不像 Kubernetes 那么规范透明,所以我看这些代码的时候很多地方也只是一知半解,欢迎有更多经验的朋友批评指正,不吝赐教,也欢迎有价值的讨论。看了一些书和文章,所以我这也算不上多原创,基本上所有看过的链接都记在 reference 里面了。有的代码暂时看不懂就只能靠猜了,等待之后的实践中验证想法。尽管如此,对于同样想要阅读 geth 的源代码的人来说总还是有些作用,对于我个人来说整理出来这些文章也是一个总结知识,把点连成面的过程,希望同时能帮到其他人。
geth 版本:master 分支,a1eb9c7d13240fd250866219a502d0cdc9924e06