前面的章节 go-ethereum 源码笔记(core 模块-区块链操作) 描述了区块链世界的核心:区块,区块链。我们已经知道区块链可以用来存储交易的数据,也知道了如何在区块链里发起一笔交易,而问题是,往区块链中增加数据应该是一个较困难的操作,按照比特币论文里的说法,即需要一个 PoW(Proof of Work,工作量证明),否则每个人都能轻易往区块链中增加数据,安全性和一致性无法保证。这一点上,以太坊法和比特币类似,尽管略有不同,但大致都需要矿工的角色贡献计算力,完成一个复杂的计算,即找到一个区块的哈希值,验证正确之后才能加入到区块链中。这个过程就叫做挖矿。矿工们去做这件事当然是有一定利益驱使的,每完成一次挖矿,他们就能获得一些以太币奖励。

阅读全文 »

这一篇分析 geth 中与账户和转账相关的源代码。

交易是以太坊里的一个很核心的概念,它不仅仅体现在价值的转移上。我们知道智能合约是以太坊的一个重大创新,而智能合约的执行是依靠交易来触发的,可以这么说,在以太坊中,大部分场景的状态转换都依靠交易实现,而交易又与账户紧密相关,所以这一篇我们将账户,转账这两个模块结合在一起来探讨。

阅读全文 »

默克尔树是区块链的基础结构,在比特币里它用来存放区块内的所有交易,用一个数字指纹(hash)来表示整个交易集合,在以太坊中,提出了一种新的数据结构叫做 Merkle Patricia Tree(常用翻译:默克尔帕特里夏树,缩写是 MPT),在以太坊中它用来组织管理账户,交易,收据等数据。从名字或许可以看出来它是一个组合名字,它实际上是默克尔树和帕特里夏树两种数据结构的结合,在阅读 trie 模块之前,读者应该对默克尔树,帕特里夏树这两个数据结构有一定了解,这些是阅读源代码的基础知识,这里只做概述。下面我们先分别介绍这两种数据结构。

阅读全文 »

区块链区块链,即区块组成的链,不妨先从区块谈起。这一篇我们将着眼于区块链的一些基本操作。在区块链中,区块存储有效信息,在阅读源代码之前,我们应该对区块头,区块体,区块链这些基本的数据结构有所了解。

阅读全文 »

cmd 模块包含了很多子模块,基本上每个子模块表示一个可执行的命令,其中最重要的是 geth 命令,它是以太坊的命令行客户端。

geth 命令是以太坊提供的一个强大的命令行工具,它是使用以太坊的入口。它包括了很多子命令,你可以通过 geth --help 获得更多帮助信息。其运行方法是:geth [选项] 命令 [命令选项][参数…]

阅读全文 »

本篇将梳理以太坊的基本概念,说明一些值得注意的地方,这里不会讲解比特币的原理,代码,但会介绍以太坊与比特币的差异,所以最好看过比特币的论文,对比特币的基本原理、实现有所了解。这一篇将以太坊的白皮书作为重要参考,可以看做是以太坊白皮书的概述。以太坊的白皮书是一个非常好的学习资料,它在介绍以太坊前分析了比特币存在的问题,因此我们可以通过这份白皮书了解整个加密货币的生态。

阅读全文 »

花了一点时间读以太坊的源代码,内容太多,所以一边看一边写,没想到越写越多,于是想着把笔记整理出来。

源码解读是一件费力不讨好的事情,因为看代码的时候我们看到的是最终解决方案,虽然可以看到 commit 的历史,但我们看不到作者的思路,踩过的坑,而且 geth 的设计文档,功能的相关讨论等信息不像 Kubernetes 那么规范透明,所以我看这些代码的时候很多地方也只是一知半解,欢迎有更多经验的朋友批评指正,不吝赐教,也欢迎有价值的讨论。看了一些书和文章,所以我这也算不上多原创,基本上所有看过的链接都记在 reference 里面了。有的代码暂时看不懂就只能靠猜了,等待之后的实践中验证想法。尽管如此,对于同样想要阅读 geth 的源代码的人来说总还是有些作用,对于我个人来说整理出来这些文章也是一个总结知识,把点连成面的过程,希望同时能帮到其他人。

geth 版本:master 分支,a1eb9c7d13240fd250866219a502d0cdc9924e06

阅读全文 »