From 6cde7132f781acf971f61aa522397e97a6b0a324 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 16:21:18 -0400 Subject: [PATCH 01/44] =?UTF-8?q?Update=20accounts=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit add more explaination on it. --- ...20\347\240\201\345\210\206\346\236\220.md" | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" index 9f69037..e16a643 100644 --- "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" +++ "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" @@ -1,10 +1,61 @@ accounts包实现了以太坊客户端的钱包和账户管理。以太坊的钱包提供了keyStore模式和usb两种钱包。同时以太坊的 合约的ABI的代码也放在了account/abi目录。 abi项目好像跟账户管理没有什么关系。 这里暂时只分析了账号管理的接口。 具体的keystore和usb的实现代码暂时不会给出。 +# accounts支持的钱包类型 +在accounts中总共支持两大类共4种钱包类型。两大类包括keystore和usbwallet;其中keystore中的私钥存储可以分为加密的和不加密的;usbwallet支持ledger和trenzer两种硬件钱包。 +# keystore:本地文件夹 +keystore类型的钱包其实是一个本地文件夹目录。在这个目录下可以存放多个文件,每个文件都存储着一个私钥信息。这些文件都是json格式,其中的私钥可以是加密的,也可以是非加密的明文。但非加密的格式已经被废弃了(谁都不想把自己的私钥明文存放在某个文件里)。 +keystore的目录路径可以在配置文件中指定,默认路径是/keystore。每一个文件的文件名格式为:UTC----
。例如UTC--2016-03-22T12-57-55--7ef5a6135f1fd6a02593eedc869c6d41d934aef8。 keystore目录和目录内的文件是可以直接拷贝的。也就是说,如果你想把某个私钥转移到别的电脑上,你可以直接拷贝文件到其它电脑的keystore目录。拷贝整个keystore目录也是一样的。 +# HD:分层确定性(Hierarchical Deterministic)钱包 +我们首先解释一下HD(Hierarchical Deterministic)的概念。这个概念的中文名称叫做“分层确定性”,我的理解是这是一种key的派生方式,它可以在只使用一个公钥(我们称这个公钥为主公钥,其对应的私钥称为主私钥)的情况下,生成任意多个子公钥,而这些子公钥都是可以被主私钥控制的。HD的概念最早是从比特币的BIP-32提案中提出来的。 +每一个key都有自己的路径,即是是一个派生的key,这一点和keystore类型是一样的。我们先来看一下HD账户的路径格式: +m / purpose’ / coin_type’ / account’ / change / address_index +这种路径规范不是一下子形成的。虽然BIP-32提出了HD的概念,但实现者自由度比较大,导致相互之间兼容性很差。因此在BIP-43中增加了purpose字段;而在BIP-44中对路径规范进行了大量的扩展,使其可以用在不同币种上[1]。 +在BIP-43中推荐purpose的值为44’(0x8000002C);而在BIPSLIP-44中为以太坊类型的coin_type为配的值为60’(0x8000003c)。所以我们在以太坊中可能看到形如m/44'/60'/0'/0这样的路径。 +在accounts模块中共支持两种HD钱包:Ledger和Trenzer。它们都是非常有名的硬件钱包,有兴趣的朋友可以自己搜索一下,这是不作过多介绍。 + +# 目录结构 +accounts模块下的源文件比较多,这里不一一说明,只挑一些比较重要的聊一下。 +### accounts.go +accounts.go定义了accounts模块对外导出的一些结构体和接口,包括Account结构体、Wallet接口和Backend接口。其中Account由一个以太坊地址和钱包路径组成;而各种类型的钱包需要实现Wallet和Backend接口来接入账入管理。 +### hd.go +hd.go中定义了HD类型的钱包的路径解析等函数。这个文件中的注释还解析了HD路径一些知识,值得一看。(但我认为它关于哪个BIP提案提出的哪个规范说得不对,比如注释中提到BIP-32定义了路径规范m / purpose' / coin_type' / account' / change / address_index,这应该是错误的,我们前面提到过,purpose是在BIP-43中提出的,而整个路径规范是在BIP-44中提出的) +### manager.go +manager.go中定义了Manager结构及其方法。这是accounts模块对外导出的主要的结构和方法之一。其它模块(比如cmd/geth中)通过这个结构体提供的方法对钱包进行管理。 +### url.go +这个文件中的代码定义了代表以太坊钱包路径的URL结构体及相关函数。与hd.go中不同的是,URL结构体中保存了钱包的类型(scheme)和钱包路径的字符串形式的表示;而hd.go中定义了HD钱包路径的类型(非字符串类型)的解析及字符串转换等方法。 +### keystore +这是一个子目录,此目录下的代码实现了keystore类型的钱包。 +### account_cache.go +此文件中的代码实现了accountCache结构体及方法。accountCache的功能是在内存中缓存keystore钱包目录下所有账号信息。无论keystore目录中的文件无何变动(新建、删除、修改),accountCache都可以在扫描目录时将变动更新到内存中。 +### file_cache.go +此文件中的代码实现了fileCache结构体及相关代码。与account_cache.go类似,file_cache.go中实现了对keystore目录下所有文件的信息的缓存。accountCache就是通过fileCache来获取文件变动的信息,进而得到账号变动信息的。 +### key.go +key.go主要定义了Key结构体及其json格式的marshal/unmarshal方式。另外这个文件中还定义了通过keyStore接口将Key写入文件中的函数。keyStore接口中定义了Key被写入文件的具体细节,在passphrase.go和plain.go中都有实现。 +### keystore.go +这个文件里的代码定义了KeyStore结构体及其方法。KeyStore结构体实现了Backend接口,是keystore类型的钱包的后端实现。同时它也实现了keystore类型钱包的大多数功能。 +### passphrase.go +passphrase.go中定义了keyStorePassphrase结构体及其方法。keyStorePassphrase结构体是对keyStore接口(在key.go文件中)的一种实现方式,它会要求调用者提供一个密码,从而使用aes加密算法加密私钥后,将加密数据写入文件中。 +### plain.go +这个文件中的代码定义了keyStorePlain结构体及其方法。keyStorePlain与keyStorePassphrase类似,也是对keyStore接口的实现。不同的是,keyStorePlain直接将密码明文存储在文件中。目前这种方式已被标记弃用且整个以太坊项目中都没有调用这个文件里的函数的地方,确实谁也不想将自己的私钥明文存在本地磁盘上。 +### wallet.go +wallet.go中定义了keystoreWallet结构体及其方法。keystoreWallet是keystore类型的钱包的实现,但其功能基本都是调用KeyStore对象实现的。 +### watch.go +watch.go中定义了watcher结构体及其方法。watcher用来监控keystore目录下的文件,如果文件发生变化,则立即调用account_cache.go中的代码重新扫描账户信息。但watcher只在某些系统下有效,这是文件的build注释:// +build darwin,!ios freebsd linux,!arm64 netbsd solaris +### usbwallet +这是一个子目录,此目录下的代码实现了对通过usb接入的硬件钱包的访问,但只支持ledger和trezor两种类型的硬件钱包。 +### hub.go +hub.go中定义了Hub结构体及其方法。Hub结构体实现了Backend接口,是usbwallet类型的钱包的后端实现。 +### ledger.go +ledger.go中定义了ledgerDriver结构体及其方法。ledgerDriver结构体是driver接口的实现,它实现了与ledger类型的硬件钱包通信协议和代码。 +### trezor.go +trezor.go中定义了trezorDriver结构体及其方法。与ledgerDriver类似,trezorDriver结构体也是driver接口的实现,它实现了与trezor类型的硬件钱包的通信协议和代码。 +### wallet.go +wallet.go中定义了wallet结构体。wallet结构体实现了Wallet接口,是硬件钱包的具体实现。但它内部其实主要调用硬件钱包的driver实现相关功能。 账号是通过数据结构和接口来定义了 -## 数据结构 +# 数据结构 账号 // Account represents an Ethereum account located at a specific location defined From 4d7a72315af528e1fc71db23d49369e0e51b8eda Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 16:24:05 -0400 Subject: [PATCH 02/44] Update README.md update accounts code explaination --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 386ba4f..9d9a8a7 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ - [go-ethereum代码阅读环境搭建](/go-ethereum源码阅读环境搭建.md) - [以太坊黄皮书 符号索引](a黄皮书里面出现的所有的符号索引.md) +- [account源码解析](/accounts源码分析.md) - [rlp源码解析](/rlp源码解析.md) - [trie源码分析](/trie源码分析.md) - [ethdb源码分析](/ethdb源码分析.md) From 45f72222fac5c053924b2db6d94eb39190081464 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 16:43:51 -0400 Subject: [PATCH 03/44] Add files via upload update account png --- picture/accounts.png | Bin 0 -> 137877 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 picture/accounts.png diff --git a/picture/accounts.png b/picture/accounts.png new file mode 100644 index 0000000000000000000000000000000000000000..dc28b961ed8affba22467f51c4d2ac2a1a2fa818 GIT binary patch literal 137877 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 literal 0 HcmV?d00001 From 2055bfb17805aca41a0c8cc5e9897164ea3537c7 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 16:49:50 -0400 Subject: [PATCH 04/44] =?UTF-8?q?Update=20accounts=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update account structure --- "accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" index e16a643..54f1d1a 100644 --- "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" +++ "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" @@ -1,4 +1,6 @@ accounts包实现了以太坊客户端的钱包和账户管理。以太坊的钱包提供了keyStore模式和usb两种钱包。同时以太坊的 合约的ABI的代码也放在了account/abi目录。 abi项目好像跟账户管理没有什么关系。 这里暂时只分析了账号管理的接口。 具体的keystore和usb的实现代码暂时不会给出。 +# 组件关系 +![](https://github.com/Billy1900/go-ethereum-code-analysis/blob/master/picture/accounts.png) # accounts支持的钱包类型 在accounts中总共支持两大类共4种钱包类型。两大类包括keystore和usbwallet;其中keystore中的私钥存储可以分为加密的和不加密的;usbwallet支持ledger和trenzer两种硬件钱包。 # keystore:本地文件夹 From c3789382efd957af14ece2d9f3ee535267da4f26 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 17:08:18 -0400 Subject: [PATCH 05/44] =?UTF-8?q?Update=20accounts=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update some indent --- ...20\347\240\201\345\210\206\346\236\220.md" | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" index 54f1d1a..02eca31 100644 --- "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" +++ "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" @@ -4,16 +4,12 @@ accounts包实现了以太坊客户端的钱包和账户管理。以太坊的钱 # accounts支持的钱包类型 在accounts中总共支持两大类共4种钱包类型。两大类包括keystore和usbwallet;其中keystore中的私钥存储可以分为加密的和不加密的;usbwallet支持ledger和trenzer两种硬件钱包。 # keystore:本地文件夹 -keystore类型的钱包其实是一个本地文件夹目录。在这个目录下可以存放多个文件,每个文件都存储着一个私钥信息。这些文件都是json格式,其中的私钥可以是加密的,也可以是非加密的明文。但非加密的格式已经被废弃了(谁都不想把自己的私钥明文存放在某个文件里)。 -keystore的目录路径可以在配置文件中指定,默认路径是/keystore。每一个文件的文件名格式为:UTC----
。例如UTC--2016-03-22T12-57-55--7ef5a6135f1fd6a02593eedc869c6d41d934aef8。 keystore目录和目录内的文件是可以直接拷贝的。也就是说,如果你想把某个私钥转移到别的电脑上,你可以直接拷贝文件到其它电脑的keystore目录。拷贝整个keystore目录也是一样的。 +keystore类型的钱包其实是一个本地文件夹目录。在这个目录下可以存放多个文件,每个文件都存储着一个私钥信息。这些文件都是json格式,其中的私钥可以是加密的,也可以是非加密的明文。但非加密的格式已经被废弃了(谁都不想把自己的私钥明文存放在某个文件里)。 keystore的目录路径可以在配置文件中指定,默认路径是/keystore。每一个文件的文件名格式为:UTC----
。例如UTC--2016-03-22T12-57-55-- 7ef5a6135f1fd6a02593eedc869c6d41d934aef8。 keystore目录和目录内的文件是可以直接拷贝的。也就是说,如果你想把某个私钥转移到别的电脑上,你可以直接拷贝文件到其它电脑的keystore目录。拷贝整个keystore目录也是一样的。 # HD:分层确定性(Hierarchical Deterministic)钱包 -我们首先解释一下HD(Hierarchical Deterministic)的概念。这个概念的中文名称叫做“分层确定性”,我的理解是这是一种key的派生方式,它可以在只使用一个公钥(我们称这个公钥为主公钥,其对应的私钥称为主私钥)的情况下,生成任意多个子公钥,而这些子公钥都是可以被主私钥控制的。HD的概念最早是从比特币的BIP-32提案中提出来的。 -每一个key都有自己的路径,即是是一个派生的key,这一点和keystore类型是一样的。我们先来看一下HD账户的路径格式: -m / purpose’ / coin_type’ / account’ / change / address_index -这种路径规范不是一下子形成的。虽然BIP-32提出了HD的概念,但实现者自由度比较大,导致相互之间兼容性很差。因此在BIP-43中增加了purpose字段;而在BIP-44中对路径规范进行了大量的扩展,使其可以用在不同币种上[1]。 -在BIP-43中推荐purpose的值为44’(0x8000002C);而在BIPSLIP-44中为以太坊类型的coin_type为配的值为60’(0x8000003c)。所以我们在以太坊中可能看到形如m/44'/60'/0'/0这样的路径。 -在accounts模块中共支持两种HD钱包:Ledger和Trenzer。它们都是非常有名的硬件钱包,有兴趣的朋友可以自己搜索一下,这是不作过多介绍。 +我们首先解释一下HD(Hierarchical Deterministic)的概念。这个概念的中文名称叫做“分层确定性”,我的理解是这是一种key的派生方式,它可以在只使用一个公钥(我们称这个公钥为主公钥,其对应的私钥称为主私钥)的情况下,生成任意多个子公钥,而这些子公钥都是可以被主私钥控制的。HD的概念最早是从比特币的BIP-32提案中提出来的。每一个key都有自己的路径,即是是一个派生的key,这一点和keystore类型是一样的。我们先来看一下HD账户的路径格式: + m / purpose’ / coin_type’ / account’ / change / address_index +这种路径规范不是一下子形成的。虽然BIP-32提出了HD的概念,但实现者自由度比较大,导致相互之间兼容性很差。因此在BIP-43中增加了purpose字段;而在BIP-44中对路径规范进行了大量的扩展,使其可以用在不同币种上。在BIP-43中推荐purpose的值为44’(0x8000002C);而在BIPSLIP-44中为以太坊类型的coin_type为配的值为60’(0x8000003c)。所以我们在以太坊中可能看到形如m/44'/60'/0'/0这样的路径。在accounts模块中共支持两种HD钱包:Ledger和Trenzer。它们都是非常有名的硬件钱包,有兴趣的朋友可以自己搜索一下,这是不作过多介绍。 # 目录结构 accounts模块下的源文件比较多,这里不一一说明,只挑一些比较重要的聊一下。 @@ -24,8 +20,8 @@ hd.go中定义了HD类型的钱包的路径解析等函数。这个文件中的 ### manager.go manager.go中定义了Manager结构及其方法。这是accounts模块对外导出的主要的结构和方法之一。其它模块(比如cmd/geth中)通过这个结构体提供的方法对钱包进行管理。 ### url.go -这个文件中的代码定义了代表以太坊钱包路径的URL结构体及相关函数。与hd.go中不同的是,URL结构体中保存了钱包的类型(scheme)和钱包路径的字符串形式的表示;而hd.go中定义了HD钱包路径的类型(非字符串类型)的解析及字符串转换等方法。 -### keystore +这个文件中的代码定义了代表以太坊钱包路径的URL结构体及相关函数。与hd.go中不同的是,URL结构体中保存了钱包的类型(scheme)和钱包路径的字符串形式的表示;而hd.go中定义了HD钱包路径的类型(非字符串类型)的解析及字符串转换等方法。
+## keystore 这是一个子目录,此目录下的代码实现了keystore类型的钱包。 ### account_cache.go 此文件中的代码实现了accountCache结构体及方法。accountCache的功能是在内存中缓存keystore钱包目录下所有账号信息。无论keystore目录中的文件无何变动(新建、删除、修改),accountCache都可以在扫描目录时将变动更新到内存中。 @@ -42,8 +38,8 @@ passphrase.go中定义了keyStorePassphrase结构体及其方法。keyStorePassp ### wallet.go wallet.go中定义了keystoreWallet结构体及其方法。keystoreWallet是keystore类型的钱包的实现,但其功能基本都是调用KeyStore对象实现的。 ### watch.go -watch.go中定义了watcher结构体及其方法。watcher用来监控keystore目录下的文件,如果文件发生变化,则立即调用account_cache.go中的代码重新扫描账户信息。但watcher只在某些系统下有效,这是文件的build注释:// +build darwin,!ios freebsd linux,!arm64 netbsd solaris -### usbwallet +watch.go中定义了watcher结构体及其方法。watcher用来监控keystore目录下的文件,如果文件发生变化,则立即调用account_cache.go中的代码重新扫描账户信息。但watcher只在某些系统下有效,这是文件的build注释:// +build darwin,!ios freebsd linux,!arm64 netbsd solaris
+## usbwallet 这是一个子目录,此目录下的代码实现了对通过usb接入的硬件钱包的访问,但只支持ledger和trezor两种类型的硬件钱包。 ### hub.go hub.go中定义了Hub结构体及其方法。Hub结构体实现了Backend接口,是usbwallet类型的钱包的后端实现。 @@ -53,10 +49,9 @@ ledger.go中定义了ledgerDriver结构体及其方法。ledgerDriver结构体 trezor.go中定义了trezorDriver结构体及其方法。与ledgerDriver类似,trezorDriver结构体也是driver接口的实现,它实现了与trezor类型的硬件钱包的通信协议和代码。 ### wallet.go wallet.go中定义了wallet结构体。wallet结构体实现了Wallet接口,是硬件钱包的具体实现。但它内部其实主要调用硬件钱包的driver实现相关功能。 - +
账号是通过数据结构和接口来定义了 - # 数据结构 账号 From 684bfec32ef288e2b598b50538320e28ea97d3ca Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 17:24:01 -0400 Subject: [PATCH 06/44] =?UTF-8?q?Update=20accounts=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update scwallet backend abi --- ...unts\346\272\220\347\240\201\345\210\206\346\236\220.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" index 02eca31..4897ca2 100644 --- "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" +++ "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" @@ -49,6 +49,12 @@ ledger.go中定义了ledgerDriver结构体及其方法。ledgerDriver结构体 trezor.go中定义了trezorDriver结构体及其方法。与ledgerDriver类似,trezorDriver结构体也是driver接口的实现,它实现了与trezor类型的硬件钱包的通信协议和代码。 ### wallet.go wallet.go中定义了wallet结构体。wallet结构体实现了Wallet接口,是硬件钱包的具体实现。但它内部其实主要调用硬件钱包的driver实现相关功能。 +## scwallet +这个文件夹是关于不同account之间的互相安全通信(secure wallet),通过定义会话秘钥、二级秘钥来确保通话双方的信息真实、不被篡改、利用。 尤其是转账信息更不能被利用、被他人打开、和被篡改。 +## backend +此文件夹是为了和外部的其他账户进行通信 +## abi +ABI是Application Binary Interface的缩写,字面意思 应用二进制接口,可以通俗的理解为合约的接口说明。当合约被编译后,那么它的abi也就确定了。abi主要是处理智能合约与账户的交互。
账号是通过数据结构和接口来定义了 From 67d09997305f0f0917d2abe00069fbf6495f2c2d Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 17:25:23 -0400 Subject: [PATCH 07/44] =?UTF-8?q?Update=20accounts=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit delete something. --- "accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" index 4897ca2..9cfe719 100644 --- "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" +++ "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" @@ -57,7 +57,7 @@ wallet.go中定义了wallet结构体。wallet结构体实现了Wallet接口, ABI是Application Binary Interface的缩写,字面意思 应用二进制接口,可以通俗的理解为合约的接口说明。当合约被编译后,那么它的abi也就确定了。abi主要是处理智能合约与账户的交互。
-账号是通过数据结构和接口来定义了 + # 数据结构 账号 From b70a58a722a605eaf1b030bb233efc208581ebba Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 17:27:52 -0400 Subject: [PATCH 08/44] =?UTF-8?q?Update=20accounts=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" index 9cfe719..334aa55 100644 --- "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" +++ "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" @@ -1,4 +1,4 @@ -accounts包实现了以太坊客户端的钱包和账户管理。以太坊的钱包提供了keyStore模式和usb两种钱包。同时以太坊的 合约的ABI的代码也放在了account/abi目录。 abi项目好像跟账户管理没有什么关系。 这里暂时只分析了账号管理的接口。 具体的keystore和usb的实现代码暂时不会给出。 +accounts包实现了以太坊客户端的钱包和账户管理。以太坊的钱包提供了keyStore模式和usb两种钱包。同时以太坊的 合约的ABI的代码也放在了account/abi目录。 这里暂时只分析了账号管理的接口。 具体的keystore和usb的实现代码暂时不会给出。 # 组件关系 ![](https://github.com/Billy1900/go-ethereum-code-analysis/blob/master/picture/accounts.png) # accounts支持的钱包类型 From 89a031cafe4a6efb5c244066352e4614b964e93f Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 17:40:15 -0400 Subject: [PATCH 09/44] Update README.md update build explaination --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9d9a8a7..e0f2ab6 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ - [go-ethereum代码阅读环境搭建](/go-ethereum源码阅读环境搭建.md) - [以太坊黄皮书 符号索引](a黄皮书里面出现的所有的符号索引.md) -- [account源码解析](/accounts源码分析.md) +- [account文件解析](/accounts源码分析.md) +- build文件解析: 此文件主要用于编译安装使用 - [rlp源码解析](/rlp源码解析.md) - [trie源码分析](/trie源码分析.md) - [ethdb源码分析](/ethdb源码分析.md) From 8db62bf67eb90d25a5726929578d24d646706c2f Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 17:41:57 -0400 Subject: [PATCH 10/44] Update README.md --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index e0f2ab6..019f28b 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,5 @@ # go-ethereum-code-analysis - -**希望能够分析以太坊的代码来学习区块链技术和GO语言的使用** - -分析[go-ethereum](https://github.com/ethereum/go-ethereum)的过程,我希望从依赖比较少的底层技术组件开始,慢慢深入到核心逻辑。 +本文结合了一些网上资料,加上个人的原创结合而成。个人认为解释的比较清晰。若有疑问,还请及时批评指出。 ## 目录 From e67f0f50cc6560195281f3727cc4aae873a514f0 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 18:19:15 -0400 Subject: [PATCH 11/44] Create cmd update the cmd file structure and some explainations --- cmd | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 cmd diff --git a/cmd b/cmd new file mode 100644 index 0000000..088353f --- /dev/null +++ b/cmd @@ -0,0 +1,17 @@ +cmd 命令行工具,下面又分了很多的命令行工具 +cmd abigen 将智能合约源代码转换成容易使用的,编译时类型安全的Go语言包 +cmd bootnode 启动一个仅仅实现网络发现的节点 +cmd checkpoint-admin checkpoint-admin is a utility that can be used to query checkpoint information + and register stable checkpoints into an oracle contract. +cmd clef Clef is an account management tool +cmd devp2p ethereum p2p tool +cmd ethkey an Ethereum key manager +cmd evm 以太坊虚拟机的开发工具, 用来提供一个可配置的,受隔离的代码调试环境 +cmd faucet faucet is a Ether faucet backend by a light client. +cmd geth 以太坊命令行客户端,最重要的一个工具 +cmd p2psim 提供了一个工具来模拟http的API +cmd puppeth 创建一个新的以太坊网络的向导,一个命令组装和维护私人网路 +cmd rlpdump 提供了一个RLP数据的格式化输出 +cmd swarm swarm网络的接入点 +cmd util 提供了一些公共的工具,为Go-Ethereum命令提供说明 +cmd wnode 这是一个简单的Whisper节点。 它可以用作独立的引导节点。此外,可以用于不同的测试和诊断目的。 From 33461ec4a5cc65993f13f39e4751f83426d08d97 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 18:21:52 -0400 Subject: [PATCH 12/44] Create cmd.md --- cmd.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 cmd.md diff --git a/cmd.md b/cmd.md new file mode 100644 index 0000000..088353f --- /dev/null +++ b/cmd.md @@ -0,0 +1,17 @@ +cmd 命令行工具,下面又分了很多的命令行工具 +cmd abigen 将智能合约源代码转换成容易使用的,编译时类型安全的Go语言包 +cmd bootnode 启动一个仅仅实现网络发现的节点 +cmd checkpoint-admin checkpoint-admin is a utility that can be used to query checkpoint information + and register stable checkpoints into an oracle contract. +cmd clef Clef is an account management tool +cmd devp2p ethereum p2p tool +cmd ethkey an Ethereum key manager +cmd evm 以太坊虚拟机的开发工具, 用来提供一个可配置的,受隔离的代码调试环境 +cmd faucet faucet is a Ether faucet backend by a light client. +cmd geth 以太坊命令行客户端,最重要的一个工具 +cmd p2psim 提供了一个工具来模拟http的API +cmd puppeth 创建一个新的以太坊网络的向导,一个命令组装和维护私人网路 +cmd rlpdump 提供了一个RLP数据的格式化输出 +cmd swarm swarm网络的接入点 +cmd util 提供了一些公共的工具,为Go-Ethereum命令提供说明 +cmd wnode 这是一个简单的Whisper节点。 它可以用作独立的引导节点。此外,可以用于不同的测试和诊断目的。 From dd301eb45112569727e3b9bba5e6a5056c2175b5 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 18:22:14 -0400 Subject: [PATCH 13/44] Delete cmd --- cmd | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 cmd diff --git a/cmd b/cmd deleted file mode 100644 index 088353f..0000000 --- a/cmd +++ /dev/null @@ -1,17 +0,0 @@ -cmd 命令行工具,下面又分了很多的命令行工具 -cmd abigen 将智能合约源代码转换成容易使用的,编译时类型安全的Go语言包 -cmd bootnode 启动一个仅仅实现网络发现的节点 -cmd checkpoint-admin checkpoint-admin is a utility that can be used to query checkpoint information - and register stable checkpoints into an oracle contract. -cmd clef Clef is an account management tool -cmd devp2p ethereum p2p tool -cmd ethkey an Ethereum key manager -cmd evm 以太坊虚拟机的开发工具, 用来提供一个可配置的,受隔离的代码调试环境 -cmd faucet faucet is a Ether faucet backend by a light client. -cmd geth 以太坊命令行客户端,最重要的一个工具 -cmd p2psim 提供了一个工具来模拟http的API -cmd puppeth 创建一个新的以太坊网络的向导,一个命令组装和维护私人网路 -cmd rlpdump 提供了一个RLP数据的格式化输出 -cmd swarm swarm网络的接入点 -cmd util 提供了一些公共的工具,为Go-Ethereum命令提供说明 -cmd wnode 这是一个简单的Whisper节点。 它可以用作独立的引导节点。此外,可以用于不同的测试和诊断目的。 From a80468fe57449834e56823a5c13e135ffc97d505 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 18:37:34 -0400 Subject: [PATCH 14/44] Update cmd.md --- cmd.md | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/cmd.md b/cmd.md index 088353f..93e175c 100644 --- a/cmd.md +++ b/cmd.md @@ -1,17 +1,18 @@ -cmd 命令行工具,下面又分了很多的命令行工具 -cmd abigen 将智能合约源代码转换成容易使用的,编译时类型安全的Go语言包 -cmd bootnode 启动一个仅仅实现网络发现的节点 -cmd checkpoint-admin checkpoint-admin is a utility that can be used to query checkpoint information - and register stable checkpoints into an oracle contract. -cmd clef Clef is an account management tool -cmd devp2p ethereum p2p tool -cmd ethkey an Ethereum key manager -cmd evm 以太坊虚拟机的开发工具, 用来提供一个可配置的,受隔离的代码调试环境 -cmd faucet faucet is a Ether faucet backend by a light client. -cmd geth 以太坊命令行客户端,最重要的一个工具 -cmd p2psim 提供了一个工具来模拟http的API -cmd puppeth 创建一个新的以太坊网络的向导,一个命令组装和维护私人网路 -cmd rlpdump 提供了一个RLP数据的格式化输出 -cmd swarm swarm网络的接入点 -cmd util 提供了一些公共的工具,为Go-Ethereum命令提供说明 -cmd wnode 这是一个简单的Whisper节点。 它可以用作独立的引导节点。此外,可以用于不同的测试和诊断目的。 +|文件|package|说明| +|-----|----------|-----------------------------------------------------------------------------------| +|cmd | |命令行工具,下面又分了很多的命令行工具| +|cmd |abigen 将智能合约源代码转换成容易使用的,编译时类型安全的Go语言包| +|cmd |bootnode |启动一个仅仅实现网络发现的节点| +|cmd | checkpoint-admin| checkpoint-admin is a utility that can be used to query checkpoint information and register stable checkpoints into an oracle contract.| +|cmd | clef | Clef is an account management tool| +|cmd | devp2p | ethereum p2p tool| +|cmd | ethkey | an Ethereum key manager| +|cmd | evm |以太坊虚拟机的开发工具, 用来提供一个可配置的,受隔离的代码调试环境| +|cmd | faucet |faucet is a Ether faucet backend by a light client.| +|cmd |geth |以太坊命令行客户端,最重要的一个工具| +|cmd |p2psim |提供了一个工具来模拟http的API| +|cmd |puppeth |创建一个新的以太坊网络的向导,一个命令组装和维护私人网路| +|cmd |rlpdump |提供了一个RLP数据的格式化输出| +|cmd |swarm |swarm网络的接入点| +|cmd |util |提供了一些公共的工具,为Go-Ethereum命令提供说明| +|cmd |wnode |这是一个简单的Whisper节点。 它可以用作独立的引导节点。此外,可以用于不同的测试和诊断目的。| From 0649889ccb481819e056cc99f2e33a93e9c55aca Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Wed, 31 Jul 2019 18:38:42 -0400 Subject: [PATCH 15/44] Update README.md update cmd link --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 019f28b..f97a159 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ - [以太坊黄皮书 符号索引](a黄皮书里面出现的所有的符号索引.md) - [account文件解析](/accounts源码分析.md) - build文件解析: 此文件主要用于编译安装使用 +- [cmd文件解析](/cmd.md) - [rlp源码解析](/rlp源码解析.md) - [trie源码分析](/trie源码分析.md) - [ethdb源码分析](/ethdb源码分析.md) From 1121677a9c786b3f8ede3c69d6125827ff391f50 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Thu, 1 Aug 2019 12:16:27 -0400 Subject: [PATCH 16/44] Add files via upload update consensus architecture graph --- picture/Consensus-architecture.png | Bin 0 -> 168472 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 picture/Consensus-architecture.png diff --git a/picture/Consensus-architecture.png b/picture/Consensus-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..906ea1d9d5c29fe869ad16f9de105d1c10e73c51 GIT binary patch literal 168472 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
9`;wF;bzkfg9YtQiBkX`N?W1fBpzHp-Sc-0~X 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 M+_61NW9Q-j1xg~dmH+?% literal 0 HcmV?d00001 From 52ebf94dca64dc5afc639492e7cc4dbe97e40869 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Thu, 1 Aug 2019 12:23:24 -0400 Subject: [PATCH 17/44] Add files via upload update block verification process graph --- picture/block-verification-process.png | Bin 0 -> 92470 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 picture/block-verification-process.png diff --git a/picture/block-verification-process.png b/picture/block-verification-process.png new file mode 100644 index 0000000000000000000000000000000000000000..0c102c084e0a63a6fb19f4ddf4dd31b067cce41f GIT binary patch literal 92470 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 Date: Thu, 1 Aug 2019 12:26:47 -0400 Subject: [PATCH 18/44] Add files via upload update block seal process graph --- picture/block-seal-process.png | Bin 0 -> 57053 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 picture/block-seal-process.png diff --git a/picture/block-seal-process.png b/picture/block-seal-process.png new file mode 100644 index 0000000000000000000000000000000000000000..296fecdd4c1b688804cb85e2aefff1e0e5f54576 GIT binary patch literal 57053 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 I@4avTH{Qff(f|Me literal 0 HcmV?d00001 From 29a159cf88525b1400b6de9ab47f8ef6bc6494a6 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Thu, 1 Aug 2019 13:15:39 -0400 Subject: [PATCH 19/44] Create consensus.md update some explanation --- consensus.md | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 consensus.md diff --git a/consensus.md b/consensus.md new file mode 100644 index 0000000..7a083bc --- /dev/null +++ b/consensus.md @@ -0,0 +1,161 @@ +# Consensus + +clique 主要涉及POA,用于测试网络; ethash主要涉及POW,用于主网络; misc是用于之前DAO分叉的文件。 +下图是consensus文件中各组件的关系图: +![image](https://github.com/Billy1900/go-ethereum-code-analysis/blob/master/picture/Consensus-architecture.png) +Engine接口定义了共识引擎需要实现的所有函数,实际上按功能可以划分为2类: +- 区块验证类:以Verify开头,当收到新区块时,需要先验证区块的有效性 +- 区块盖章类:包括Prepare/Finalize/Seal等,用于最终生成有效区块(比如添加工作量证明) +与区块验证相关联的还有2个外部接口:Processor用于执行交易,而Validator用于验证区块内容和状态。另外,由于需要访问以前的区块链数据,抽象出了一个ChainReader接口,BlockChain和HeaderChain都实现了该接口以完成对数据的访问。 + +## 区块验证流程 +![image](https://github.com/Billy1900/go-ethereum-code-analysis/blob/master/picture/block-verification-process.png) +Downloader收到新区块后会调用BlockChain的InsertChain()函数插入新区块。在插入之前需要先要验证区块的有效性,基本分为4个步骤: +- 验证区块头:调用Ethash.VerifyHeaders() +- 验证区块内容:调用BlockValidator.VerifyBody()(内部还会调用Ethash.VerifyUncles()) +- 执行区块交易:调用BlockProcessor.Process()(基于其父块的世界状态) +- 验证状态转换:调用BlockValidator.ValidateState()
+如果验证成功,则往数据库中写入区块信息,然后广播ChainHeadEvent事件。 + +## 区块盖章流程 +![image](https://github.com/Billy1900/go-ethereum-code-analysis/blob/master/picture/block-seal-process.png) +新产生的区块必须经过“盖章(seal)”才能成为有效区块,具体到Ethash来说,就是要执行POW计算以获得低于设定难度的nonce值。这个其实在之前的挖矿流程分析中已经接触过了,主要分为3个步骤: +- 准备工作:调用Ethash.Prepare()计算难度值 +- 生成区块:调用Ethash.Finalize()打包新区块 +- 盖章:调用Ethash.Seal()进行POW计算,填充nonce值 + +## 实现分析 +### ethan/consensus.go/VerifyHeaders() +VerifyHeaders和VerifyHeader实现原理都差不多,只不过VerifyHeaders是处理一堆headers +
// Spawn as many workers as allowed threads
+    workers := runtime.GOMAXPROCS(0)
+    if len(headers) < workers {
+        workers = len(headers)
+    }
+首先根据待验证区块的个数确定需要创建的线程数,最大不超过CPU个数。 +
var (
+        inputs = make(chan int)
+        done   = make(chan int, workers)
+        errors = make([]error, len(headers))
+        abort  = make(chan struct{})
+    )
+    for i := 0; i < workers; i++ {
+        go func() {
+            for index := range inputs {
+                errors[index] = ethash.verifyHeaderWorker(chain, headers, seals, index)
+                done <- index
+            }
+        }()
+    }
+这一步就是创建线程了,每个线程会从inputs信道中获得待验证区块的索引号,然后调用verifyHeaderWorker()函数验证该区块,验证完后向done信道发送区块索引号。 +
errorsOut := make(chan error, len(headers))
+    go func() {
+        defer close(inputs)
+        var (
+            in, out = 0, 0
+            checked = make([]bool, len(headers))
+            inputs  = inputs
+        )
+        for {
+            select {
+            case inputs <- in:
+                if in++; in == len(headers) {
+                    // Reached end of headers. Stop sending to workers.
+                    inputs = nil
+                }
+            case index := <-done:
+                for checked[index] = true; checked[out]; out++ {
+                    errorsOut <- errors[out]
+                    if out == len(headers)-1 {
+                        return
+                    }
+                }
+            case <-abort:
+                return
+            }
+        }
+    }()
+    return abort, errorsOut
+这一步启动一个循环,首先往inputs信道中依次发送区块索引号,然后再从done信道中依次接收子线程处理完成的事件,最后返回验证结果。 +接下来我们就分析一下ethash.verifyHeaderWorker()主要做了哪些工作: +
func (ethash *Ethash) verifyHeaderWorker(chain consensus.ChainReader, headers []*types.Header, seals []bool, index int) error {
+    var parent *types.Header
+    if index == 0 {
+        parent = chain.GetHeader(headers[0].ParentHash, headers[0].Number.Uint64()-1)
+    } else if headers[index-1].Hash() == headers[index].ParentHash {
+        parent = headers[index-1]
+    }
+    if parent == nil {
+        return consensus.ErrUnknownAncestor
+    }
+    if chain.GetHeader(headers[index].Hash(), headers[index].Number.Uint64()) != nil {
+        return nil // known block
+    }
+    return ethash.verifyHeader(chain, headers[index], parent, false, seals[index])
+}
+首先通过ChainReader拿到父块的header,然后调用ethash.verifyHeader(),这个函数就是真正去验证区块头了,这个函数比较长,大概列一下有哪些检查项: +- 时间戳超前当前时间不得大于15s +- 时间戳必须大于父块时间戳 +- 通过父块计算出的难度值必须和区块头难度值相同 +- 消耗的gas必须小于gas limit +- 当前gas limit和父块gas limit的差值必须在规定范围内 +- 区块高度必须是父块高度+1 +- 调用ethash.VerifySeal()检查工作量证明 +- 验证硬分叉相关的数据 +- ethash.VerifySeal()函数,这个函数主要是用来检查工作量证明,用于校验难度的有效性nonce是否小于目标值(解题成功) +> verifyHeader +>- 校验extra大小 +>- 校验区块时间戳,跟当前时间比 +>- 校验难度值 +>- 校验gaslimit上线 +>- 校验区块的总gasuserd小于 gaslimit +>- 校验区块的gaslimit 是在合理范围 +>- 特殊的校验,比如dao分叉后的几个块extra里面写了特殊数据,来判断一下 + +### ethan/consensus.go/VerifyUncles() +这个函数是在BlockValidator.VerifyBody()内部调用的,主要是验证叔块的有效性。 +
    if len(block.Uncles()) > maxUncles {
+        return errTooManyUncles
+    }
+以太坊规定每个区块打包的叔块不能超过2个。
+    uncles, ancestors := set.New(), make(map[common.Hash]*types.Header)
+    number, parent := block.NumberU64()-1, block.ParentHash()
+    for i := 0; i < 7; i++ {
+        ancestor := chain.GetBlock(parent, number)
+        if ancestor == nil {
+            break
+        }
+        ancestors[ancestor.Hash()] = ancestor.Header()
+        for _, uncle := range ancestor.Uncles() {
+            uncles.Add(uncle.Hash())
+        }
+        parent, number = ancestor.ParentHash(), number-1
+    }
+    ancestors[block.Hash()] = block.Header()
+    uncles.Add(block.Hash())
+这段代码收集了当前块前7层的祖先块和叔块,用于后面的验证。 +
    for _, uncle := range block.Uncles() {
+        // Make sure every uncle is rewarded only once
+        hash := uncle.Hash()
+        if uncles.Has(hash) {
+            return errDuplicateUncle
+        }
+        uncles.Add(hash)
+        // Make sure the uncle has a valid ancestry
+        if ancestors[hash] != nil {
+            return errUncleIsAncestor
+        }
+        if ancestors[uncle.ParentHash] == nil || uncle.ParentHash == block.ParentHash() {
+            return errDanglingUncle
+        }
+        if err := ethash.verifyHeader(chain, uncle, ancestors[uncle.ParentHash], true, true); err != nil {
+            return err
+        }
+    }
+ 遍历当前块包含的叔块,做以下检查: +- 如果祖先块中已经包含过了该叔块,返回错误 +- 如果发现该叔块其实是一个祖先块(即在主链上),返回错误 +- 如果叔块的父块不在这7层祖先中,返回错误 +- 如果叔块和当前块拥有共同的父块,返回错误(也就是说不能打包和当前块相同高度的叔块) +- 最后验证一下叔块头的有效性 + From f87dc0115f194b088d2b96fca645a9b87421a865 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Thu, 1 Aug 2019 13:19:58 -0400 Subject: [PATCH 20/44] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f97a159..6c9441f 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ - [account文件解析](/accounts源码分析.md) - build文件解析: 此文件主要用于编译安装使用 - [cmd文件解析](/cmd.md) +- [consensus文件解析](/consensus.md) - [rlp源码解析](/rlp源码解析.md) - [trie源码分析](/trie源码分析.md) - [ethdb源码分析](/ethdb源码分析.md) From dfea98278309e65678cb1590a11085919550b59c Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Thu, 1 Aug 2019 14:53:34 -0400 Subject: [PATCH 21/44] Update consensus.md update the consensus --- consensus.md | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/consensus.md b/consensus.md index 7a083bc..1bf93ef 100644 --- a/consensus.md +++ b/consensus.md @@ -159,3 +159,151 @@ VerifyHeaders和VerifyHeader实现原理都差不多, - 如果叔块和当前块拥有共同的父块,返回错误(也就是说不能打包和当前块相同高度的叔块) - 最后验证一下叔块头的有效性 +### ethan/consensus.go/Prepare() +

+func (ethash *Ethash) Prepare(chain consensus.ChainReader, header *types.Header) error {
+    parent := chain.GetHeader(header.ParentHash, header.Number.Uint64()-1)
+    if parent == nil {
+        return consensus.ErrUnknownAncestor
+    }
+    header.Difficulty = ethash.CalcDifficulty(chain, header.Time.Uint64(), parent)
+    return nil
+}
+可以看到,会调用CalcDifficulty()计算难度值,继续跟踪: +
func (ethash *Ethash) CalcDifficulty(chain consensus.ChainReader, time uint64, parent *types.Header) *big.Int {
+    return CalcDifficulty(chain.Config(), time, parent)
+}
+
+func CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Header) *big.Int {
+    next := new(big.Int).Add(parent.Number, big1)
+    switch {
+    case config.IsByzantium(next):
+        return calcDifficultyByzantium(time, parent)
+    case config.IsHomestead(next):
+        return calcDifficultyHomestead(time, parent)
+    default:
+        return calcDifficultyFrontier(time, parent)
+    }
+}
+根据以太坊的Roadmap,会经历Frontier,Homestead,Metropolis,Serenity这几个大的版本,当前处于Metropolis阶段。Metropolis又分为2个小版本:Byzantium和Constantinople,目前的最新代码版本是Byzantium,因此会调用calcDifficultyByzantium()函数。
+计算难度的公式如下:
+diff = (parent_diff +(parent_diff / 2048 * max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99))) + 2^(periodCount - 2)
+>- parent_diff :上一个区块的难度 +>- block_timestamp :当前块的时间戳 +>- parent_timestamp:上一个块的时间戳 +>- periodCount :区块num/100000 +>- block_timestamp - parent_timestamp 差值小于10秒 变难
+ block_timestamp - parent_timestamp 差值10-20秒 不变
+ block_timestamp - parent_timestamp 差值大于20秒 变容易,并且大的越多,越容易,但是又上限 +>- 总体上块的难度是递增的 +>- seal 开始做挖矿的事情,“解题”直到成功或者退出.根据挖矿难度计算目标值,选取随机数nonce+区块头(不包含nonce)的hash,再做一次hash,结果小于目标值,则退出,否则循环重试.如果外部退出了(比如已经收到这个块了),则立马放弃当前块的打包.Finalize() 做挖矿成功后最后善后的事情,计算矿工的奖励:区块奖励,叔块奖励, + +前面一项是根据父块难度值继续难度调整,而后面一项就是传说中的“难度炸弹”。关于难度炸弹相关的具体细节可以参考下面这篇文章: +https://juejin.im/post/59ad6606f265da246f382b88
+由于PoS共识机制开发进度延迟,不得不减小难度炸弹从而延迟“冰川时代”的到来,具体做法就是把当前区块高度减小3000000,参见以下代码: +
   // calculate a fake block number for the ice-age delay:
+    //   https://github.com/ethereum/EIPs/pull/669
+    //   fake_block_number = min(0, block.number - 3_000_000
+    fakeBlockNumber := new(big.Int)
+    if parent.Number.Cmp(big2999999) >= 0 {
+        fakeBlockNumber = fakeBlockNumber.Sub(parent.Number, big2999999) // Note, parent is 1 less than the actual block number
+    }
+ + ### ethash/consensus.go/FinalizeAndAssemble() +
func (ethash *Ethash) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) {
+    // Accumulate any block and uncle rewards and commit the final state root
+    accumulateRewards(chain.Config(), state, header, uncles)
+    header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number))
+    // Header seems complete, assemble into a block and return
+    return types.NewBlock(header, txs, uncles, receipts), nil
+}
+这个挖矿流程是先计算收益,然后生成MPT的Merkle Root,最后创建新区块。 + +### ethash/consensus.go/sealer/seal() +这个函数就是真正执行POW计算的地方了,代码位于consensus/ethash/sealer.go。代码比较长,分段进行分析: +
    abort := make(chan struct{})
+    found := make(chan *types.Block)
+首先创建了两个channel,用于退出和发现nonce时发送事件。 +
    ethash.lock.Lock()
+    threads := ethash.threads
+    if ethash.rand == nil {
+        seed, err := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))
+        if err != nil {
+            ethash.lock.Unlock()
+            return nil, err
+        }
+        ethash.rand = rand.New(rand.NewSource(seed.Int64()))
+    }
+    ethash.lock.Unlock()
+    if threads == 0 {
+        threads = runtime.NumCPU()
+    }
+接着初始化随机数种子和线程数。 +
    var pend sync.WaitGroup
+    for i := 0; i < threads; i++ {
+        pend.Add(1)
+        go func(id int, nonce uint64) {
+            defer pend.Done()
+            ethash.mine(block, id, nonce, abort, found)
+        }(i, uint64(ethash.rand.Int63()))
+    }
+然后就是创建线程进行挖矿了,会调用ethash.mine()函数。 +
    // Wait until sealing is terminated or a nonce is found
+    var result *types.Block
+    select {
+    case <-stop:
+        // Outside abort, stop all miner threads
+        close(abort)
+    case result = <-found:
+        // One of the threads found a block, abort all others
+        close(abort)
+    case <-ethash.update:
+        // Thread count was changed on user request, restart
+        close(abort)
+        pend.Wait()
+        return ethash.Seal(chain, block, stop)
+    }
+    // Wait for all miners to terminate and return the block
+    pend.Wait()
+    return result, nil
+最后就是等待挖矿结果了,有可能找到nonce挖矿成功,也有可能别人先挖出了区块从而需要终止挖矿。 +
ethash.mine()函数的实现,先看一些变量声明: +
    var (
+        header  = block.Header()
+        hash    = header.HashNoNonce().Bytes()
+        target  = new(big.Int).Div(maxUint256, header.Difficulty)
+        number  = header.Number.Uint64()
+        dataset = ethash.dataset(number)
+    )
+    // Start generating random nonces until we abort or find a good one
+    var (
+        attempts = int64(0)
+        nonce    = seed
+    )
+其中hash指的是不带nonce的区块头hash值,nonce是一个随机数种子。target是目标值,等于2^256除以难度值,我们接下来要计算的hash值必须小于这个目标值才算挖矿成功。接下来就是不断修改nonce并计算hash值了: +
            digest, result := hashimotoFull(dataset.dataset, hash, nonce)
+     if new(big.Int).SetBytes(result).Cmp(target) <= 0 {
+     // Correct nonce found, create a new header with it
+     header = types.CopyHeader(header)
+     header.Nonce = types.EncodeNonce(nonce)
+     header.MixDigest = common.BytesToHash(digest)
+     // Seal and return a block (if still needed)
+     select {
+     case found <- block.WithSeal(header):
+     logger.Trace("Ethash nonce found and reported", "attempts", nonce-seed, "nonce", nonce)
+     case <-abort:
+                logger.Trace("Ethash nonce found but discarded", "attempts", nonce-seed, "nonce", nonce)
+                }
+                break search
+            }
+     nonce++
+hashimotoFull()函数内部会把hash和nonce拼在一起,计算出一个摘要(digest)和一个hash值(result)。如果hash值满足难度要求,挖矿成功,填充区块头的Nonce和MixDigest字段,然后调用block.WithSeal()生成盖过章的区块: +
func (b *Block) WithSeal(header *Header) *Block {
+    cpy := *header
+    return &Block{
+        header:       &cpy,
+        transactions: b.transactions,
+        uncles:       b.uncles,
+    }
+}
+ From c2ac59fd3855b77485f79835e590bea730b53cc4 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Thu, 1 Aug 2019 15:07:14 -0400 Subject: [PATCH 22/44] Update consensus.md --- consensus.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/consensus.md b/consensus.md index 1bf93ef..34313d1 100644 --- a/consensus.md +++ b/consensus.md @@ -25,6 +25,13 @@ Downloader收到新区块后会调用BlockChain的InsertChain()函数插入新 - 盖章:调用Ethash.Seal()进行POW计算,填充nonce值 ## 实现分析 +### consensus.go +该文件主要是定义整个consensus,chainReader是读取以前的区块数据,Engine是consensus工作的核心模块,POW是目前的一种机制,可以看到他的核心模块是Engine +
type PoW interface {
+	Engine
+	// Hashrate returns the current mining hashrate of a PoW consensus engine.
+	Hashrate() float64
+}
### ethan/consensus.go/VerifyHeaders() VerifyHeaders和VerifyHeader实现原理都差不多,只不过VerifyHeaders是处理一堆headers
// Spawn as many workers as allowed threads

From db467fda121b860329af74cd3914b81e220c54b5 Mon Sep 17 00:00:00 2001
From: Billy1900 <32431813+Billy1900@users.noreply.github.com>
Date: Thu, 1 Aug 2019 16:22:50 -0400
Subject: [PATCH 23/44] Update consensus.md

complete algorithm.go
---
 consensus.md | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 105 insertions(+)

diff --git a/consensus.md b/consensus.md
index 34313d1..a6bc51c 100644
--- a/consensus.md
+++ b/consensus.md
@@ -32,6 +32,111 @@ Downloader收到新区块后会调用BlockChain的InsertChain()函数插入新
 	// Hashrate returns the current mining hashrate of a PoW consensus engine.
 	Hashrate() float64
 }
+### ethan/algorithm.go +它涉及到挖矿算法的很多细节。 +
// cacheSize returns the size of the ethash verification cache that belongs to a certain
+// block number.
+func cacheSize(block uint64) uint64 {
+	epoch := int(block / epochLength)
+	if epoch < maxEpoch {
+		return cacheSizes[epoch]
+	}
+	return calcCacheSize(epoch)
+}
+
+// calcCacheSize calculates the cache size for epoch. The cache size grows linearly,
+// however, we always take the highest prime below the linearly growing threshold in order
+// to reduce the risk of accidental regularities leading to cyclic behavior.
+func calcCacheSize(epoch int) uint64 {
+	size := cacheInitBytes + cacheGrowthBytes*uint64(epoch) - hashBytes
+	for !new(big.Int).SetUint64(size / hashBytes).ProbablyPrime(1) { // Always accurate for n < 2^64
+		size -= 2 * hashBytes
+	}
+	return size
+}
+cache的具体作用涉及到挖矿计算的细节,如下: +Ethash 是以太坊使用的 PoW 算法,其原理可以用一个公式来概括:
+**RAND(h,n)<=M/d**
+其中 h 是区块头的哈希值(没有 Nonce),n 是 Nonce 值,M 是一个极大的数字,d 指挖矿难度,RAND 是一个根据参数生成随机值的操作,挖矿的过程简单来说就是寻找适合的 nonce,使上述不等式成立。原理和比特币的基本相同,但 Ethash 稍特别一点,因为 geth 的开发者在设计初期就考虑了抵制矿机的问题里 +
Ethash 的具体步骤为: +- 对于每个区块,先算出一个种子。种子的计算只依赖当前区块信息。 +- 使用种子生成伪随机数据集,称为 cache。轻客户端需要保存 cache +- 基于 cache 生成 1GB 大小的数据集,称为 the DAG。这个数据集的每一个元素都依赖于 cache 中的某几个元素,只要有 cache 就可以快速计算出 DAG 中指定位置的元素。完整可挖矿客户端需要保存 DAG。 +- 挖矿可以概括为从 DAG 中随机选择元素,然后暴力枚举选择一个 nonce 值,对其进行哈希计算,使其符合约定的难度,而这个难度其实就是要求哈希值的前缀包括多少个0。验证的时候,基于 cache 计算指定位置 DAG 元素,然后验证这个元素集合的哈希值结果小于某个值,这个过程只需要普通 CPU 和普通内存。 +- cache 和 DAG 每过一个周期更新一次,一个周期长度是 30000 个区块。DAG 只取决于区块数量,大小会随着时间推移线性增长,从 1GB 开始,每年大约增加 7GB。由于 DAG 需要很长时间生成,所以 geth 每次会维护2个 DAG 集合。 +
// datasetSize returns the size of the ethash mining dataset that belongs to a certain
+// block number.
+func datasetSize(block uint64) uint64 {
+	epoch := int(block / epochLength)
+	if epoch < maxEpoch {
+		return datasetSizes[epoch]
+	}
+	return calcDatasetSize(epoch)
+}
+
+// calcDatasetSize calculates the dataset size for epoch. The dataset size grows linearly,
+// however, we always take the highest prime below the linearly growing threshold in order
+// to reduce the risk of accidental regularities leading to cyclic behavior.
+func calcDatasetSize(epoch int) uint64 {
+	size := datasetInitBytes + datasetGrowthBytes*uint64(epoch) - mixBytes
+	for !new(big.Int).SetUint64(size / mixBytes).ProbablyPrime(1) { // Always accurate for n < 2^64
+		size -= 2 * mixBytes
+	}
+	return size
+}
+dataset就是上文中提到的数据集。datasetsize和cachesetsize都已经硬编码写进了文件当中, +
// hasher is a repetitive hasher allowing the same hash data structures to be
+// reused between hash runs instead of requiring new ones to be created.
+type hasher func(dest []byte, data []byte)
+
+// makeHasher creates a repetitive hasher, allowing the same hash data structures to
+// be reused between hash runs instead of requiring new ones to be created. The returned
+// function is not thread safe!
+func makeHasher(h hash.Hash) hasher {
+	// sha3.state supports Read to get the sum, use it to avoid the overhead of Sum.
+	// Read alters the state but we reset the hash before every operation.
+	type readerHash interface {
+		hash.Hash
+		Read([]byte) (int, error)
+	}
+	rh, ok := h.(readerHash)
+	if !ok {
+		panic("can't find Read method on hash")
+	}
+	outputLen := rh.Size()
+	return func(dest []byte, data []byte) {
+		rh.Reset()
+		rh.Write(data)
+		rh.Read(dest[:outputLen])
+	}
+}
+
+// seedHash is the seed to use for generating a verification cache and the mining
+// dataset.
+func seedHash(block uint64) []byte {
+	seed := make([]byte, 32)
+	if block < epochLength {
+		return seed
+	}
+	keccak256 := makeHasher(sha3.NewLegacyKeccak256())
+	for i := 0; i < int(block/epochLength); i++ {
+		keccak256(seed, seed)
+	}
+	return seed
+}
+seedHash也就是挖矿的第一步生成种子,makeHasher也就是生成种子(hash的过程) +
func generateCache(dest []uint32, epoch uint64, seed []byte) 
+generateCache是指从之前的种子中根据规则生成cache. The cache production process involves first sequentially filling up 32 MB of memory, then performing two passes of Sergio Demian Lerner's RandMemoHash algorithm from Strict Memory Hard Hashing Functions (2014). The output is a set of 524288 64-byte values. +
func generateDatasetItem(cache []uint32, index uint32, keccak512 hasher) []byte
+func generateDataset(dest []uint32, epoch uint64, cache []uint32) 
+generateDatasetItem combines data from 256 pseudorandomly selected cache nodes, and hashes that to compute a single dataset node. generateDataset generates the entire ethash dataset for mining. +
 func hashimoto(hash []byte, nonce uint64, size uint64, lookup func(index uint32) []uint32) ([]byte, []byte)
+func hashimotoLight(size uint64, cache []uint32, hash []byte, nonce uint64) ([]byte, []byte)
+func hashimotoFull(dataset []uint32, hash []byte, nonce uint64) ([]byte, []byte)
+
+- hashimoto aggregates data from the full dataset in order to produce our final value for a particular header hash and nonce. +- hashimotoLight aggregates data from the full dataset (using only a small in-memory cache) in order to produce our final value for a particular header hash and nonce. +- hashimotoFull aggregates data from the full dataset (using the full in-memory dataset) in order to produce our final value for a particular header hash and nonce. ### ethan/consensus.go/VerifyHeaders() VerifyHeaders和VerifyHeader实现原理都差不多,只不过VerifyHeaders是处理一堆headers
// Spawn as many workers as allowed threads

From e896143ec9a85accac5bfeadba10f75bdf2fc233 Mon Sep 17 00:00:00 2001
From: Billy1900 <32431813+Billy1900@users.noreply.github.com>
Date: Thu, 1 Aug 2019 16:56:42 -0400
Subject: [PATCH 24/44] Update consensus.md

update api.go
---
 consensus.md | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/consensus.md b/consensus.md
index a6bc51c..c514c95 100644
--- a/consensus.md
+++ b/consensus.md
@@ -130,14 +130,27 @@ seedHash也就是挖矿的第一步生成种子,makeHasher也就是生
 
func generateDatasetItem(cache []uint32, index uint32, keccak512 hasher) []byte
 func generateDataset(dest []uint32, epoch uint64, cache []uint32) 
generateDatasetItem combines data from 256 pseudorandomly selected cache nodes, and hashes that to compute a single dataset node. generateDataset generates the entire ethash dataset for mining. -
 func hashimoto(hash []byte, nonce uint64, size uint64, lookup func(index uint32) []uint32) ([]byte, []byte)
+
func hashimoto(hash []byte, nonce uint64, size uint64, lookup func(index uint32) []uint32) ([]byte, []byte)
 func hashimotoLight(size uint64, cache []uint32, hash []byte, nonce uint64) ([]byte, []byte)
 func hashimotoFull(dataset []uint32, hash []byte, nonce uint64) ([]byte, []byte)
 
- hashimoto aggregates data from the full dataset in order to produce our final value for a particular header hash and nonce. - hashimotoLight aggregates data from the full dataset (using only a small in-memory cache) in order to produce our final value for a particular header hash and nonce. - hashimotoFull aggregates data from the full dataset (using the full in-memory dataset) in order to produce our final value for a particular header hash and nonce. -### ethan/consensus.go/VerifyHeaders() +### ethan/api.go +the purpose is that API exposes ethash related methods for the RPC interface. +
func (api *API) GetWork() ([4]string, error)
+GetWork returns a work package for external miner. The work package consists of 3 strings: +- result[0] - 32 bytes hex encoded current block header pow-hash +- result[1] - 32 bytes hex encoded seed hash used for DAG +- result[2] - 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty +- result[3] - hex encoded block number +
func (api *API) SubmitWork(nonce types.BlockNonce, hash, digest common.Hash) bool 
+SubmitWork can be used by external miner to submit their POW solution. It returns an indication if the work was accepted. Note either an invalid solution, a stale work a non-existent work will return false. +
func (api *API) SubmitHashRate(rate hexutil.Uint64, id common.Hash) bool
+SubmitHashrate can be used for remote miners to submit their hash rate. This enables the node to report the combined hash rate of all miners which submit work through this node.![what is hash rate?](https://www.buybitcoinworldwide.com/mining/hash-rate/), simply it can be regared as computation. +### ethan/consensus.go +#### ethan/consensus.go/VerifyHeaders() VerifyHeaders和VerifyHeader实现原理都差不多,只不过VerifyHeaders是处理一堆headers
// Spawn as many workers as allowed threads
     workers := runtime.GOMAXPROCS(0)

From 67c125f32368f5a8f722fd76d92b5aea97c61f99 Mon Sep 17 00:00:00 2001
From: Billy1900 <32431813+Billy1900@users.noreply.github.com>
Date: Thu, 1 Aug 2019 18:21:44 -0400
Subject: [PATCH 25/44] Update consensus.md

update saler.go
---
 consensus.md | 34 +++++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 13 deletions(-)

diff --git a/consensus.md b/consensus.md
index c514c95..bb7716f 100644
--- a/consensus.md
+++ b/consensus.md
@@ -8,7 +8,7 @@ Engine接口定义了共识引擎需要实现的所有函数,实际上按功
 - 区块盖章类:包括Prepare/Finalize/Seal等,用于最终生成有效区块(比如添加工作量证明)
 与区块验证相关联的还有2个外部接口:Processor用于执行交易,而Validator用于验证区块内容和状态。另外,由于需要访问以前的区块链数据,抽象出了一个ChainReader接口,BlockChain和HeaderChain都实现了该接口以完成对数据的访问。
 
-## 区块验证流程
+## 1.区块验证流程
 ![image](https://github.com/Billy1900/go-ethereum-code-analysis/blob/master/picture/block-verification-process.png)
 Downloader收到新区块后会调用BlockChain的InsertChain()函数插入新区块。在插入之前需要先要验证区块的有效性,基本分为4个步骤:
 - 验证区块头:调用Ethash.VerifyHeaders()
@@ -17,22 +17,22 @@ Downloader收到新区块后会调用BlockChain的InsertChain()函数插入新
 - 验证状态转换:调用BlockValidator.ValidateState()
如果验证成功,则往数据库中写入区块信息,然后广播ChainHeadEvent事件。 -## 区块盖章流程 +## 2.区块盖章流程 ![image](https://github.com/Billy1900/go-ethereum-code-analysis/blob/master/picture/block-seal-process.png) 新产生的区块必须经过“盖章(seal)”才能成为有效区块,具体到Ethash来说,就是要执行POW计算以获得低于设定难度的nonce值。这个其实在之前的挖矿流程分析中已经接触过了,主要分为3个步骤: - 准备工作:调用Ethash.Prepare()计算难度值 - 生成区块:调用Ethash.Finalize()打包新区块 - 盖章:调用Ethash.Seal()进行POW计算,填充nonce值 -## 实现分析 -### consensus.go +## 3.实现分析 +### 3.1 consensus.go 该文件主要是定义整个consensus,chainReader是读取以前的区块数据,Engine是consensus工作的核心模块,POW是目前的一种机制,可以看到他的核心模块是Engine
type PoW interface {
 	Engine
 	// Hashrate returns the current mining hashrate of a PoW consensus engine.
 	Hashrate() float64
 }
-### ethan/algorithm.go +### 3.2 ethan/algorithm.go 它涉及到挖矿算法的很多细节。
// cacheSize returns the size of the ethash verification cache that belongs to a certain
 // block number.
@@ -137,7 +137,7 @@ func hashimotoFull(dataset []uint32, hash []byte, nonce uint64) ([]byte, []byte)
 - hashimoto aggregates data from the full dataset in order to produce our final value for a particular header hash and nonce.
 - hashimotoLight aggregates data from the full dataset (using only a small in-memory cache) in order to produce our final value for a particular header hash and nonce.
 - hashimotoFull aggregates data from the full dataset (using the full in-memory dataset) in order to produce our final value for a particular header hash and nonce.
-### ethan/api.go
+### 3.3 ethan/api.go
 the purpose is that API exposes ethash related methods for the RPC interface.
 
func (api *API) GetWork() ([4]string, error)
GetWork returns a work package for external miner. The work package consists of 3 strings: @@ -149,7 +149,8 @@ GetWork returns a work package for external miner. The work package consists of SubmitWork can be used by external miner to submit their POW solution. It returns an indication if the work was accepted. Note either an invalid solution, a stale work a non-existent work will return false.
func (api *API) SubmitHashRate(rate hexutil.Uint64, id common.Hash) bool
SubmitHashrate can be used for remote miners to submit their hash rate. This enables the node to report the combined hash rate of all miners which submit work through this node.![what is hash rate?](https://www.buybitcoinworldwide.com/mining/hash-rate/), simply it can be regared as computation. -### ethan/consensus.go +### 3.4 ethan/consensus.go +ethan/consensus.go实现的大多函数是对consensus/onsensus.go中Engine中的interface的函数具体实现.具体功能注释都已经写的很详尽,在此不过多赘述。故只挑了一些进行注释。 #### ethan/consensus.go/VerifyHeaders() VerifyHeaders和VerifyHeader实现原理都差不多,只不过VerifyHeaders是处理一堆headers
// Spawn as many workers as allowed threads
@@ -237,7 +238,7 @@ VerifyHeaders和VerifyHeader实现原理都差不多,
 >- 校验区块的gaslimit 是在合理范围
 >- 特殊的校验,比如dao分叉后的几个块extra里面写了特殊数据,来判断一下
 
-### ethan/consensus.go/VerifyUncles()
+#### ethan/consensus.go/VerifyUncles()
 这个函数是在BlockValidator.VerifyBody()内部调用的,主要是验证叔块的有效性。
 
    if len(block.Uncles()) > maxUncles {
         return errTooManyUncles
@@ -284,7 +285,7 @@ VerifyHeaders和VerifyHeader实现原理都差不多,
 - 如果叔块和当前块拥有共同的父块,返回错误(也就是说不能打包和当前块相同高度的叔块)
 - 最后验证一下叔块头的有效性
 
-### ethan/consensus.go/Prepare()
+#### ethan/consensus.go/Prepare()
 

 func (ethash *Ethash) Prepare(chain consensus.ChainReader, header *types.Header) error {
     parent := chain.GetHeader(header.ParentHash, header.Number.Uint64()-1)
@@ -334,7 +335,7 @@ https://juejin.im/post/59ad6606f265da246f382b88
fakeBlockNumber = fakeBlockNumber.Sub(parent.Number, big2999999) // Note, parent is 1 less than the actual block number }
- ### ethash/consensus.go/FinalizeAndAssemble() + #### ethash/consensus.go/FinalizeAndAssemble()
func (ethash *Ethash) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) {
     // Accumulate any block and uncle rewards and commit the final state root
     accumulateRewards(chain.Config(), state, header, uncles)
@@ -344,7 +345,7 @@ https://juejin.im/post/59ad6606f265da246f382b88
}
这个挖矿流程是先计算收益,然后生成MPT的Merkle Root,最后创建新区块。 -### ethash/consensus.go/sealer/seal() +#### ethash/consensus.go/sealer/seal() 这个函数就是真正执行POW计算的地方了,代码位于consensus/ethash/sealer.go。代码比较长,分段进行分析:
    abort := make(chan struct{})
     found := make(chan *types.Block)
@@ -363,7 +364,7 @@ https://juejin.im/post/59ad6606f265da246f382b88
if threads == 0 { threads = runtime.NumCPU() }
-接着初始化随机数种子和线程数。 +接着初始化随机数种子和线程数
    var pend sync.WaitGroup
     for i := 0; i < threads; i++ {
         pend.Add(1)
@@ -431,4 +432,11 @@ hashimotoFull()函数内部会把hash和nonce拼在一起,计算出一个摘
         uncles:       b.uncles,
     }
 }
- +### 3.5 ethan/sealer.go +sealer主要是用于最终为block打标签,也就是最终的挖矿计算的过程。主要的函数如下: +
func (ethash *Ethash) Seal(chain consensus.ChainReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}) error 
+- Seal implements consensus.Engine, attempting to find a nonce that satisfies the block's difficulty requirements. +
func (ethash *Ethash) mine(block *types.Block, id int, seed uint64, abort chan struct{}, found chan *types.Block) 
+- mine is the actual proof-of-work miner that searches for a nonce starting from seed that results in correct final block difficulty. +
func (ethash *Ethash) remote(notify []string, noverify bool)
+-remote is a standalone goroutine to handle remote mining related stuff. From 2557797ce4a5bea2e2c2be83589d7fbbf16b3697 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Thu, 1 Aug 2019 18:22:24 -0400 Subject: [PATCH 26/44] Update consensus.md --- consensus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus.md b/consensus.md index bb7716f..3baef5c 100644 --- a/consensus.md +++ b/consensus.md @@ -439,4 +439,4 @@ sealer主要是用于最终为block打标签,也就是最终的挖
func (ethash *Ethash) mine(block *types.Block, id int, seed uint64, abort chan struct{}, found chan *types.Block) 
- mine is the actual proof-of-work miner that searches for a nonce starting from seed that results in correct final block difficulty.
func (ethash *Ethash) remote(notify []string, noverify bool)
--remote is a standalone goroutine to handle remote mining related stuff. +- remote is a standalone goroutine to handle remote mining related stuff. From 1fc5cacfec44dbe0e4765b293219892838099480 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Thu, 1 Aug 2019 18:51:26 -0400 Subject: [PATCH 27/44] Update consensus.md --- consensus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus.md b/consensus.md index 3baef5c..435c01d 100644 --- a/consensus.md +++ b/consensus.md @@ -238,7 +238,7 @@ VerifyHeaders和VerifyHeader实现原理都差不多, >- 校验区块的gaslimit 是在合理范围 >- 特殊的校验,比如dao分叉后的几个块extra里面写了特殊数据,来判断一下 -#### ethan/consensus.go/VerifyUncles() +#### ethan/consensus.go/VerifyUncles() 这个函数是在BlockValidator.VerifyBody()内部调用的,主要是验证叔块的有效性。
    if len(block.Uncles()) > maxUncles {
         return errTooManyUncles

From ea9e480e0ed9ad5b44b4c141deed7eeda1d39572 Mon Sep 17 00:00:00 2001
From: Billy1900 <32431813+Billy1900@users.noreply.github.com>
Date: Thu, 1 Aug 2019 23:07:50 -0400
Subject: [PATCH 28/44] Update consensus.md
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

complete
---
 consensus.md | 32 +++++++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

diff --git a/consensus.md b/consensus.md
index 435c01d..007d351 100644
--- a/consensus.md
+++ b/consensus.md
@@ -285,7 +285,7 @@ VerifyHeaders和VerifyHeader实现原理都差不多,
 - 如果叔块和当前块拥有共同的父块,返回错误(也就是说不能打包和当前块相同高度的叔块)
 - 最后验证一下叔块头的有效性
 
-#### ethan/consensus.go/Prepare()
+#### ethan/consensus.go/Prepare()
 

 func (ethash *Ethash) Prepare(chain consensus.ChainReader, header *types.Header) error {
     parent := chain.GetHeader(header.ParentHash, header.Number.Uint64()-1)
@@ -345,7 +345,7 @@ https://juejin.im/post/59ad6606f265da246f382b88
}
这个挖矿流程是先计算收益,然后生成MPT的Merkle Root,最后创建新区块。 -#### ethash/consensus.go/sealer/seal() +#### ethash/consensus.go/sealer/seal() 这个函数就是真正执行POW计算的地方了,代码位于consensus/ethash/sealer.go。代码比较长,分段进行分析:
    abort := make(chan struct{})
     found := make(chan *types.Block)
@@ -432,7 +432,33 @@ hashimotoFull()函数内部会把hash和nonce拼在一起,计算出一个摘 uncles: b.uncles, } }
-### 3.5 ethan/sealer.go +### 3.5 ethan/ethash.go +将此文件内容分为几个大块进行理解
+1)memoryMap块
+memoryMapFile tries to memory map an already opened file descriptor, memoryMap tries to memory map a file of uint32s for read only access, memoryMapAndGenerate tries to memory map a temporary file of uint32s for write access, fill it with the data from a generator and then move it into the final path requested. +
func memoryMap(path string) (*os.File, mmap.MMap, []uint32, error)
+func memoryMapFile(file *os.File, write bool) (mmap.MMap, []uint32, error)
+func memoryMapAndGenerate(path string, size uint64, generator func(buffer []uint32)) (*os.File, mmap.MMap, []uint32, error)
+2)Lru块
+Lru是一个cache的存储策略,此处主要是用于优化dataset和cache中的存储数据方式
+3)cache块
+具体可以见文件中的注释,具体作用前面也已经说清楚,主要是cache的具体逻辑实现
+4)dataset块
+具体可以见文件中的注释,具体作用前面也已经说清楚,主要是函数的具体逻辑实现
+5)config块
+
// Config are the configuration parameters of the ethash.
+type Config struct {
+	CacheDir       string
+	CachesInMem    int
+	CachesOnDisk   int
+	DatasetDir     string
+	DatasetsInMem  int
+	DatasetsOnDisk int
+	PowMode        Mode
+}
+6)后续代码块
+后续代码多为挖矿所需定义的结构体,看注释就可以解决疑惑。 +### 3.6 ethan/sealer.go sealer主要是用于最终为block打标签,也就是最终的挖矿计算的过程。主要的函数如下:
func (ethash *Ethash) Seal(chain consensus.ChainReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}) error 
- Seal implements consensus.Engine, attempting to find a nonce that satisfies the block's difficulty requirements. From 447bc05525ef515cea0df0fbe4265effe7b5ee3c Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Thu, 1 Aug 2019 23:34:53 -0400 Subject: [PATCH 29/44] Update consensus.md --- consensus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus.md b/consensus.md index 007d351..e33a718 100644 --- a/consensus.md +++ b/consensus.md @@ -148,7 +148,7 @@ GetWork returns a work package for external miner. The work package consists of
func (api *API) SubmitWork(nonce types.BlockNonce, hash, digest common.Hash) bool 
SubmitWork can be used by external miner to submit their POW solution. It returns an indication if the work was accepted. Note either an invalid solution, a stale work a non-existent work will return false.
func (api *API) SubmitHashRate(rate hexutil.Uint64, id common.Hash) bool
-SubmitHashrate can be used for remote miners to submit their hash rate. This enables the node to report the combined hash rate of all miners which submit work through this node.![what is hash rate?](https://www.buybitcoinworldwide.com/mining/hash-rate/), simply it can be regared as computation. +SubmitHashrate can be used for remote miners to submit their hash rate. This enables the node to report the combined hash rate of all miners which submit work through this node.[what is hash rate?](https://www.buybitcoinworldwide.com/mining/hash-rate/), simply it can be regared as computation. ### 3.4 ethan/consensus.go ethan/consensus.go实现的大多函数是对consensus/onsensus.go中Engine中的interface的函数具体实现.具体功能注释都已经写的很详尽,在此不过多赘述。故只挑了一些进行注释。 #### ethan/consensus.go/VerifyHeaders() From d2fd74d52c9634f673f7155377345935894dc070 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Fri, 2 Aug 2019 16:56:22 -0400 Subject: [PATCH 30/44] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6c9441f..ee5b66c 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ - [rpc源码分析](/rpc源码分析.md) - [p2p源码分析](/p2p源码分析.md) - [eth协议源码分析](/eth源码分析.md) -- core源码分析 +- core文件源码分析 - [区块链索引 chain_indexer源码分析](/core-chain_indexer源码解析.md) - [布隆过滤器索引 bloombits源码分析](/core-bloombits源码分析.md) - [以太坊的trie树管理 回滚等操作 state源码分析](/core-state源码分析.md) From 894f2673825aca5c02c6d5119cc2ab277862bda1 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Fri, 2 Aug 2019 17:16:59 -0400 Subject: [PATCH 31/44] Create types.md update first --- types.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 types.md diff --git a/types.md b/types.md new file mode 100644 index 0000000..72dcbd2 --- /dev/null +++ b/types.md @@ -0,0 +1,60 @@ +# core/types +### core/types/block.go +block data stucture: +
type Block struct {
+	header       *Header
+	uncles       []*Header
+	transactions Transactions
+	hash atomic.Value
+	size atomic.Value
+	td *big.Int
+	ReceivedAt   time.Time
+	ReceivedFrom interface{}
+}
+|字段 |描述| +|--------|------------------------------| +|header |指向 Header 结构(之后会详细说明),header 存储一个区块的基本信息。| +|uncles |指向 Header 结构| +|transactions| 一组 transaction 结构| +|hash |当前区块的哈希值| +|size |当前区块的大小| +|td |当前区块高度| +|ReceivedAt| 接收时间| +|ReceivedFrom| 来源| +交易组成区块,一个一个区块以单向链表的形式连在一起组成区块链 +
Header data structure: +
type Header struct {
+	ParentHash  common.Hash    `json:"parentHash"       gencodec:"required"`
+	UncleHash   common.Hash    `json:"sha3Uncles"       gencodec:"required"`
+	Coinbase    common.Address `json:"miner"            gencodec:"required"`
+	Root        common.Hash    `json:"stateRoot"        gencodec:"required"`
+	TxHash      common.Hash    `json:"transactionsRoot" gencodec:"required"`
+	ReceiptHash common.Hash    `json:"receiptsRoot"     gencodec:"required"`
+	Bloom       Bloom          `json:"logsBloom"        gencodec:"required"`
+	Difficulty  *big.Int       `json:"difficulty"       gencodec:"required"`
+	Number      *big.Int       `json:"number"           gencodec:"required"`
+	GasLimit    uint64         `json:"gasLimit"         gencodec:"required"`
+	GasUsed     uint64         `json:"gasUsed"          gencodec:"required"`
+	Time        *big.Int       `json:"timestamp"        gencodec:"required"`
+	Extra       []byte         `json:"extraData"        gencodec:"required"`
+	MixDigest   common.Hash    `json:"mixHash"          gencodec:"required"`
+	Nonce       BlockNonce     `json:"nonce"            gencodec:"required"`
+}
+|字段| 描述| +|--------|-------| +|ParentHash| 父区块的哈希值| +|UncleHash |叔区块的哈希值| +|Coinbase |矿工得到奖励的账户,一般是矿工本地第一个账户| +|Root |表示当前所有用户状态| +|TxHash |本区块所有交易 Hash,即摘要| +|ReceiptHash |本区块所有收据 Hash,即摘要| +|Bloom |布隆过滤器,用来搜索收据| +|Difficulty |该区块难度,动态调整,与父区块和本区块挖矿时间有关。 +|Number |该区块高度| +|GasLimit gas |用量上限,该数值根据父区块 gas 用量调节,如果 parentGasUsed > parentGasLimit * (2/3) ,则增大该数值,反之则减小该数值。| +|GasUsed |实际花费的 gas| +|Time |新区块的出块时间,严格来说是开始挖矿的时间| +|Extra |额外数据| +|MixDigest| 混合哈希,与nonce 结合使用| +|Nonce |加密学中的概念| +ParentHash 表示该区块的父区块哈希,我们通过 ParentHash 这个字段将一个一个区块连接起来组成区块链,但实际上我们并不会直接将链整个的存起来,它是以一定的数据结构一块一块存放的,geth 的底层数据库用的是 LevelDB,这是一个 key-value 数据库,要得到父区块时,我们通过 ParentHash 以及其他字符串组成 key,在 LevelDB 中查询该 key 对应的值,就能拿到父区块。 From 5a550a58489eeaf05bc9e436d3d585dc5177252c Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Fri, 2 Aug 2019 17:25:58 -0400 Subject: [PATCH 32/44] =?UTF-8?q?Update=20core-blockchain=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update blockchain --- ...6\272\220\347\240\201\345\210\206\346\236\220.md" | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git "a/core-blockchain\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/core-blockchain\346\272\220\347\240\201\345\210\206\346\236\220.md" index 4594510..99cc424 100644 --- "a/core-blockchain\346\272\220\347\240\201\345\210\206\346\236\220.md" +++ "b/core-blockchain\346\272\220\347\240\201\345\210\206\346\236\220.md" @@ -1,3 +1,4 @@ +# core/blockchain.go 从测试案例来看,blockchain的主要功能点有下面几点. 1. import. @@ -9,15 +10,15 @@ 7. 支持Fast importing. 8. Light vs Fast vs Full processing 在处理区块头上面的效果相等. -可以看到blockchain的主要功能是维护区块链的状态, 包括区块的验证,插入和状态查询. +blockchain的主要功能是维护区块链的状态, 包括区块的验证,插入和状态查询. -名词解释: +>名词解释: -什么是规范的区块链 +>什么是规范的区块链 -因为在区块的创建过程中,可能在短时间内产生一些分叉, 在我们的数据库里面记录的其实是一颗区块树.我们会认为其中总难度最高的一条路径认为是我们的规范的区块链. 这样有很多区块虽然也能形成区块链,但是不是规范的区块链. +>因为在区块的创建过程中,可能在短时间内产生一些分叉, 在我们的数据库里面记录的其实是一颗区块树.我们会认为其中总难度最高的一条路径认为是我们的规范的区块链. 这样有很多区块虽然也能形成区块链,但是不是规范的区块链. -数据库结构: +**数据库结构:** 区块的hash值和区块头的hash值是同样的么。所谓的区块的Hash值其实就是Header的区块值。 // key -> value @@ -57,6 +58,7 @@ key | value|说明|插入|删除| 数据结构 +Blockchian structure: // BlockChain represents the canonical chain given a database with a genesis // block. The Blockchain manages chain imports, reverts, chain reorganisations. From e04b38200d4a681203a9bc6df8822d578597b5b9 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Fri, 2 Aug 2019 17:30:26 -0400 Subject: [PATCH 33/44] Update types.md update transaction.go --- types.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/types.md b/types.md index 72dcbd2..605e411 100644 --- a/types.md +++ b/types.md @@ -58,3 +58,25 @@ block data stucture: |MixDigest| 混合哈希,与nonce 结合使用| |Nonce |加密学中的概念| ParentHash 表示该区块的父区块哈希,我们通过 ParentHash 这个字段将一个一个区块连接起来组成区块链,但实际上我们并不会直接将链整个的存起来,它是以一定的数据结构一块一块存放的,geth 的底层数据库用的是 LevelDB,这是一个 key-value 数据库,要得到父区块时,我们通过 ParentHash 以及其他字符串组成 key,在 LevelDB 中查询该 key 对应的值,就能拿到父区块。 + +### core/types/transaction.go +
type Transaction struct {
+	data txdata
+	// caches
+	hash atomic.Value
+	size atomic.Value
+	from atomic.Value
+}
+type txdata struct {
+	AccountNonce uint64          `json:"nonce"    gencodec:"required"`
+	Price        *big.Int        `json:"gasPrice" gencodec:"required"`
+	GasLimit     uint64          `json:"gas"      gencodec:"required"`
+	Recipient    *common.Address `json:"to"       rlp:"nil"`
+	Amount       *big.Int        `json:"value"    gencodec:"required"`
+	Payload      []byte          `json:"input"    gencodec:"required"`
+	V *big.Int `json:"v" gencodec:"required"`
+	R *big.Int `json:"r" gencodec:"required"`
+	S *big.Int `json:"s" gencodec:"required"`
+	Hash *common.Hash `json:"hash" rlp:"-"`
+}
+转账的定义中只有转入方,转出方的地址没有直接暴露。每一笔转账都有独立的 Price 和 GasLimit,这是 Ethereum 的安全保护策略 From b2a9d9276c02ad44af237553ac834cb09ee81c3b Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Fri, 2 Aug 2019 18:41:27 -0400 Subject: [PATCH 34/44] Update cmd.md update geth --- cmd.md | 616 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 616 insertions(+) diff --git a/cmd.md b/cmd.md index 93e175c..9d41c87 100644 --- a/cmd.md +++ b/cmd.md @@ -1,3 +1,5 @@ +# Cmd +## file structure |文件|package|说明| |-----|----------|-----------------------------------------------------------------------------------| |cmd | |命令行工具,下面又分了很多的命令行工具| @@ -16,3 +18,617 @@ |cmd |swarm |swarm网络的接入点| |cmd |util |提供了一些公共的工具,为Go-Ethereum命令提供说明| |cmd |wnode |这是一个简单的Whisper节点。 它可以用作独立的引导节点。此外,可以用于不同的测试和诊断目的。| +## Cmd/geth +geth是cmd中最重要的命令,他是以太坊的入口。geth的命令行是通过urfave/cli这个库进行实现的,通过这个库,我们可以轻松定义命令行程序的子命令,命令选项,命令参数,描述信息等等。 + +geth 模块的入口在 cmd/geth/main.go 中,它会调用 urfave/cli 的中 app 的 run 方法,而 app 在 init 函数中初始化,在 Golang 中,如果有 init 方法,那么会在 main 函数之前执行 init 函数,它用于程序执行前的初始化工作。在 geth 模块中,init() 函数定义了命令行的入口是 geth,并且定义了 geth 的子命令、全局的命令选项、子命令的命令选项,按照 urfave/cli 的做法,不输入子命令会默认调用 geth,而 geth 方法其实就6行: +
func geth(ctx *cli.Context) error {
+	node := makeFullNode(ctx)
+	startNode(ctx, node)
+	node.Wait()
+	return nil
+}
+它会调用 makeFullNode 函数初始化一个全节点,接着通过 startNode 函数启动一个全节点,以阻塞的方式运行,等待着节点被终止。 +
func makeFullNode(ctx *cli.Context) *node.Node {
+	stack, cfg := makeConfigNode(ctx)
+	utils.RegisterEthService(stack, &cfg.Eth)
+	if ctx.GlobalBool(utils.DashboardEnabledFlag.Name) {
+		utils.RegisterDashboardService(stack, &cfg.Dashboard, gitCommit)
+	}
+	// whether enable whisper ...
+	// whether register eth stats ...
+	return stack
+}
+makeFullNode核心的逻辑是首先通过配置文件和 flag 生成系统级的配置,然后将服务注入到节点。 +
func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) {
+	cfg := gethConfig{
+		Eth:       eth.DefaultConfig,
+		Shh:       whisper.DefaultConfig,
+		Node:      defaultNodeConfig(),
+		Dashboard: dashboard.DefaultConfig,
+	}
+	if file := ctx.GlobalString(configFileFlag.Name); file != "" {
+		if err := loadConfig(file, &cfg); err != nil {
+			utils.Fatalf("%v", err)
+		}
+	}
+	utils.SetNodeConfig(ctx, &cfg.Node)
+	stack, err := node.New(&cfg.Node)
+	if err != nil {
+		utils.Fatalf("Failed to create the protocol stack: %v", err)
+	}
+	utils.SetEthConfig(ctx, stack, &cfg.Eth)
+	if ctx.GlobalIsSet(utils.EthStatsURLFlag.Name) {
+		cfg.Ethstats.URL = ctx.GlobalString(utils.EthStatsURLFlag.Name)
+	}
+	utils.SetShhConfig(ctx, stack, &cfg.Shh)
+	utils.SetDashboardConfig(ctx, &cfg.Dashboard)
+	return stack, cfg
+}
+makeConfigNode 会先载入默认配置,再载入配置文件中的配置,然后通过上下文的配置(在 cmd/geth/main.go 中的 init 方法中定义)进行设置。 +
func RegisterEthService(stack *node.Node, cfg *eth.Config) {
+	var err error
+	if cfg.SyncMode == downloader.LightSync {
+		err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
+			return les.New(ctx, cfg)
+		})
+	} else {
+		err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
+			fullNode, err := eth.New(ctx, cfg)
+			if fullNode != nil && cfg.LightServ > 0 {
+				ls, _ := les.NewLesServer(fullNode, cfg)
+				fullNode.AddLesServer(ls)
+			}
+			return fullNode, err
+		})
+	}
+	if err != nil {
+		Fatalf("Failed to register the Ethereum service: %v", err)
+	}
+}
+RegisterEthService 的代码在 cmd/utils/flags.go 中,如果同步模式是轻量级同步模式,启动轻量级客户端,否则启动全节点,实际的注册方法是 stack.Register。注入服务其实就是将新的服务注入到 node 对象的 serviceFuncs 数组中。 +### geth/main.go +
func startNode(ctx *cli.Context, stack *node.Node) {
+	debug.Memsize.Add("node", stack)
+	utils.StartNode(stack)
+	ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore)
+	passwords := utils.MakePasswordList(ctx)
+	unlocks := strings.Split(ctx.GlobalString(utils.UnlockedAccountFlag.Name), ",")
+	for i, account := range unlocks {
+		if trimmed := strings.TrimSpace(account); trimmed != "" {
+			unlockAccount(ctx, ks, trimmed, i, passwords)
+		}
+	}
+	events := make(chan accounts.WalletEvent, 16)
+	stack.AccountManager().Subscribe(events)
+	go func() {
+		rpcClient, err := stack.Attach()
+		if err != nil {
+			utils.Fatalf("Failed to attach to self: %v", err)
+		}
+		stateReader := ethclient.NewClient(rpcClient)
+		for _, wallet := range stack.AccountManager().Wallets() {
+			if err := wallet.Open(""); err != nil {
+				log.Warn("Failed to open wallet", "url", wallet.URL(), "err", err)
+			}
+		}
+		for event := range events {
+			switch event.Kind {
+			case accounts.WalletArrived:
+				if err := event.Wallet.Open(""); err != nil {
+					log.Warn("New wallet appeared, failed to open", "url", event.Wallet.URL(), "err", err)
+				}
+			case accounts.WalletOpened:
+				status, _ := event.Wallet.Status()
+				log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", status)
+				if event.Wallet.URL().Scheme == "ledger" {
+					event.Wallet.SelfDerive(accounts.DefaultLedgerBaseDerivationPath, stateReader)
+				} else {
+					event.Wallet.SelfDerive(accounts.DefaultBaseDerivationPath, stateReader)
+				}
+			case accounts.WalletDropped:
+				log.Info("Old wallet dropped", "url", event.Wallet.URL())
+				event.Wallet.Close()
+			}
+		}
+	}()
+	if ctx.GlobalBool(utils.MiningEnabledFlag.Name) || ctx.GlobalBool(utils.DeveloperFlag.Name) {
+		if ctx.GlobalBool(utils.LightModeFlag.Name) || ctx.GlobalString(utils.SyncModeFlag.Name) == "light" {
+			utils.Fatalf("Light clients do not support mining")
+		}
+		var ethereum *eth.Ethereum
+		if err := stack.Service(ðereum); err != nil {
+			utils.Fatalf("Ethereum service not running: %v", err)
+		}
+		if threads := ctx.GlobalInt(utils.MinerThreadsFlag.Name); threads > 0 {
+			type threaded interface {
+				SetThreads(threads int)
+			}
+			if th, ok := ethereum.Engine().(threaded); ok {
+				th.SetThreads(threads)
+			}
+		}
+		ethereum.TxPool().SetGasPrice(utils.GlobalBig(ctx, utils.GasPriceFlag.Name))
+		if err := ethereum.StartMining(true); err != nil {
+			utils.Fatalf("Failed to start mining: %v", err)
+		}
+	}
+}
+startNode 方法启动节点,会开启所有已经注册的协议,解锁请求的账户,开启 RPC/IPC 接口,并开始挖矿。 +### geth/chaincmd.go +
func initGenesis(ctx *cli.Context) error {
+	genesisPath := ctx.Args().First()
+	if len(genesisPath) == 0 {
+		utils.Fatalf("Must supply path to genesis JSON file")
+	}
+	file, err := os.Open(genesisPath)
+	if err != nil {
+		utils.Fatalf("Failed to read genesis file: %v", err)
+	}
+	defer file.Close()
+	genesis := new(core.Genesis)
+	if err := json.NewDecoder(file).Decode(genesis); err != nil {
+		utils.Fatalf("invalid genesis file: %v", err)
+	}
+	stack := makeFullNode(ctx)
+	for _, name := range []string{"chaindata", "lightchaindata"} {
+		chaindb, err := stack.OpenDatabase(name, 0, 0)
+		if err != nil {
+			utils.Fatalf("Failed to open database: %v", err)
+		}
+		_, hash, err := core.SetupGenesisBlock(chaindb, genesis)
+		if err != nil {
+			utils.Fatalf("Failed to write genesis block: %v", err)
+		}
+		log.Info("Successfully wrote genesis state", "database", name, "hash", hash)
+	}
+	return nil
+}
+initCommand会进行初始化,生成初始区块,调用了SetupGenesisBlock +
func importChain(ctx *cli.Context) error {
+	if len(ctx.Args()) < 1 {
+		utils.Fatalf("This command requires an argument.")
+	}
+	stack := makeFullNode(ctx)
+	chain, chainDb := utils.MakeChain(ctx, stack)
+	defer chainDb.Close()
+	var peakMemAlloc, peakMemSys uint64
+	go func() {
+		stats := new(runtime.MemStats)
+		for {
+			runtime.ReadMemStats(stats)
+			if atomic.LoadUint64(&peakMemAlloc) < stats.Alloc {
+				atomic.StoreUint64(&peakMemAlloc, stats.Alloc)
+			}
+			if atomic.LoadUint64(&peakMemSys) < stats.Sys {
+				atomic.StoreUint64(&peakMemSys, stats.Sys)
+			}
+			time.Sleep(5 * time.Second)
+		}
+	}()
+	start := time.Now()
+	if len(ctx.Args()) == 1 {
+		if err := utils.ImportChain(chain, ctx.Args().First()); err != nil {
+			log.Error("Import error", "err", err)
+		}
+	} else {
+		for _, arg := range ctx.Args() {
+			if err := utils.ImportChain(chain, arg); err != nil {
+				log.Error("Import error", "file", arg, "err", err)
+			}
+		}
+	}
+	chain.Stop()
+	fmt.Printf("Import done in %v.\n\n", time.Since(start))
+	db := chainDb.(*ethdb.LDBDatabase)
+	stats, err := db.LDB().GetProperty("leveldb.stats")
+	if err != nil {
+		utils.Fatalf("Failed to read database stats: %v", err)
+	}
+	fmt.Println(stats)
+	ioStats, err := db.LDB().GetProperty("leveldb.iostats")
+	if err != nil {
+		utils.Fatalf("Failed to read database iostats: %v", err)
+	}
+	fmt.Println(ioStats)
+	fmt.Printf("Trie cache misses:  %d\n", trie.CacheMisses())
+	fmt.Printf("Trie cache unloads: %d\n\n", trie.CacheUnloads())
+	mem := new(runtime.MemStats)
+	runtime.ReadMemStats(mem)
+	fmt.Printf("Object memory: %.3f MB current, %.3f MB peak\n", float64(mem.Alloc)/1024/1024, float64(atomic.LoadUint64(&peakMemAlloc))/1024/1024)
+	fmt.Printf("System memory: %.3f MB current, %.3f MB peak\n", float64(mem.Sys)/1024/1024, float64(atomic.LoadUint64(&peakMemSys))/1024/1024)
+	fmt.Printf("Allocations:   %.3f million\n", float64(mem.Mallocs)/1000000)
+	fmt.Printf("GC pause:      %v\n\n", time.Duration(mem.PauseTotalNs))
+	if ctx.GlobalIsSet(utils.NoCompactionFlag.Name) {
+		return nil
+	}
+	start = time.Now()
+	fmt.Println("Compacting entire database...")
+	if err = db.LDB().CompactRange(util.Range{}); err != nil {
+		utils.Fatalf("Compaction failed: %v", err)
+	}
+	fmt.Printf("Compaction done in %v.\n\n", time.Since(start))
+	stats, err = db.LDB().GetProperty("leveldb.stats")
+	if err != nil {
+		utils.Fatalf("Failed to read database stats: %v", err)
+	}
+	fmt.Println(stats)
+	ioStats, err = db.LDB().GetProperty("leveldb.iostats")
+	if err != nil {
+		utils.Fatalf("Failed to read database iostats: %v", err)
+	}
+	fmt.Println(ioStats)
+	return nil
+}
+ImportChain导入了一个区块链文件 +
func exportChain(ctx *cli.Context) error {
+	if len(ctx.Args()) < 1 {
+		utils.Fatalf("This command requires an argument.")
+	}
+	stack := makeFullNode(ctx)
+	chain, _ := utils.MakeChain(ctx, stack)
+	start := time.Now()
+	var err error
+	fp := ctx.Args().First()
+	if len(ctx.Args()) < 3 {
+		err = utils.ExportChain(chain, fp)
+	} else {
+		first, ferr := strconv.ParseInt(ctx.Args().Get(1), 10, 64)
+		last, lerr := strconv.ParseInt(ctx.Args().Get(2), 10, 64)
+		if ferr != nil || lerr != nil {
+			utils.Fatalf("Export error in parsing parameters: block number not an integer\n")
+		}
+		if first < 0 || last < 0 {
+			utils.Fatalf("Export error: block number must be greater than 0\n")
+		}
+		err = utils.ExportAppendChain(chain, fp, uint64(first), uint64(last))
+	}
+	if err != nil {
+		utils.Fatalf("Export error: %v\n", err)
+	}
+	fmt.Printf("Export done in %v\n", time.Since(start))
+	return nil
+}
+exportCommand导出一个区块链gz文件 +
func importPreimages(ctx *cli.Context) error {
+	if len(ctx.Args()) < 1 {
+		utils.Fatalf("This command requires an argument.")
+	}
+	stack := makeFullNode(ctx)
+	diskdb := utils.MakeChainDatabase(ctx, stack).(*ethdb.LDBDatabase)
+	start := time.Now()
+	if err := utils.ImportPreimages(diskdb, ctx.Args().First()); err != nil {
+		utils.Fatalf("Export error: %v\n", err)
+	}
+	fmt.Printf("Export done in %v\n", time.Since(start))
+	return nil
+}
+将一个preimages导入当前节点 +
func exportPreimages(ctx *cli.Context) error {
+	if len(ctx.Args()) < 1 {
+		utils.Fatalf("This command requires an argument.")
+	}
+	stack := makeFullNode(ctx)
+	diskdb := utils.MakeChainDatabase(ctx, stack).(*ethdb.LDBDatabase)
+	start := time.Now()
+	if err := utils.ExportPreimages(diskdb, ctx.Args().First()); err != nil {
+		utils.Fatalf("Export error: %v\n", err)
+	}
+	fmt.Printf("Export done in %v\n", time.Since(start))
+	return nil
+}
+从当前节点导出一个 image +
func copyDb(ctx *cli.Context) error {
+	if len(ctx.Args()) != 1 {
+		utils.Fatalf("Source chaindata directory path argument missing")
+	}
+	stack := makeFullNode(ctx)
+	chain, chainDb := utils.MakeChain(ctx, stack)
+	syncmode := *utils.GlobalTextMarshaler(ctx, utils.SyncModeFlag.Name).(*downloader.SyncMode)
+	dl := downloader.New(syncmode, chainDb, new(event.TypeMux), chain, nil, nil)
+	db, err := ethdb.NewLDBDatabase(ctx.Args().First(), ctx.GlobalInt(utils.CacheFlag.Name), 256)
+	if err != nil {
+		return err
+	}
+	hc, err := core.NewHeaderChain(db, chain.Config(), chain.Engine(), func() bool { return false })
+	if err != nil {
+		return err
+	}
+	peer := downloader.NewFakePeer("local", db, hc, dl)
+	if err = dl.RegisterPeer("local", 63, peer); err != nil {
+		return err
+	}
+	start := time.Now()
+	currentHeader := hc.CurrentHeader()
+	if err = dl.Synchronise("local", currentHeader.Hash(), hc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()), syncmode); err != nil {
+		return err
+	}
+	for dl.Synchronising() {
+		time.Sleep(10 * time.Millisecond)
+	}
+	fmt.Printf("Database copy done in %v\n", time.Since(start))
+	start = time.Now()
+	fmt.Println("Compacting entire database...")
+	if err = chainDb.(*ethdb.LDBDatabase).LDB().CompactRange(util.Range{}); err != nil {
+		utils.Fatalf("Compaction failed: %v", err)
+	}
+	fmt.Printf("Compaction done in %v.\n\n", time.Since(start))
+	return nil
+}
+复制一个本地区块文件到文件夹;在一个文件夹中创建一个本地区块链,但是这个过程并不是直接复制过去的,而是通过 downloader 模块里的 NewFakePeer 创建一个虚拟对等节点,然后再进行数据同步完成的。 +
func removeDB(ctx *cli.Context) error {
+	stack, _ := makeConfigNode(ctx)
+	for _, name := range []string{"chaindata", "lightchaindata"} {
+		logger := log.New("database", name)
+		dbdir := stack.ResolvePath(name)
+		if !common.FileExist(dbdir) {
+			logger.Info("Database doesn't exist, skipping", "path", dbdir)
+			continue
+		}
+		fmt.Println(dbdir)
+		confirm, err := console.Stdin.PromptConfirm("Remove this database?")
+		switch {
+		case err != nil:
+			utils.Fatalf("%v", err)
+		case !confirm:
+			logger.Warn("Database deletion aborted")
+		default:
+			start := time.Now()
+			os.RemoveAll(dbdir)
+			logger.Info("Database successfully deleted", "elapsed", common.PrettyDuration(time.Since(start)))
+		}
+	}
+	return nil
+}
+在当前数据库中移除区块链,删除数据库是直接通过 os 模块移除这个文件夹。 +
func dump(ctx *cli.Context) error {
+	stack := makeFullNode(ctx)
+	chain, chainDb := utils.MakeChain(ctx, stack)
+	for _, arg := range ctx.Args() {
+		var block *types.Block
+		if hashish(arg) {
+			block = chain.GetBlockByHash(common.HexToHash(arg))
+		} else {
+			num, _ := strconv.Atoi(arg)
+			block = chain.GetBlockByNumber(uint64(num))
+		}
+		if block == nil {
+			fmt.Println("{}")
+			utils.Fatalf("block not found")
+		} else {
+			state, err := state.New(block.Root(), state.NewDatabase(chainDb))
+			if err != nil {
+				utils.Fatalf("could not create new state: %v", err)
+			}
+			fmt.Printf("%s\n", state.Dump())
+		}
+	}
+	chainDb.Close()
+	return nil
+}
+dump 子命令可以移除一个或多个特定的区块,先根据区块号获取区块,然后调用 state 的 Dump 移除即可 + +### geth/accountCommand.go +这部分主要是管理账户 +
func accountList(ctx *cli.Context) error {
+	stack, _ := makeConfigNode(ctx)
+	var index int
+	for _, wallet := range stack.AccountManager().Wallets() {
+		for _, account := range wallet.Accounts() {
+			fmt.Printf("Account #%d: {%x} %s\n", index, account.Address, &account.URL)
+			index++
+		}
+	}
+	return nil
+}
+拿到wallets中的所有账户 +
func accountCreate(ctx *cli.Context) error {
+	cfg := gethConfig{Node: defaultNodeConfig()}
+	if file := ctx.GlobalString(configFileFlag.Name); file != "" {
+		if err := loadConfig(file, &cfg); err != nil {
+			utils.Fatalf("%v", err)
+		}
+	}
+	utils.SetNodeConfig(ctx, &cfg.Node)
+	scryptN, scryptP, keydir, err := cfg.Node.AccountConfig()
+	if err != nil {
+		utils.Fatalf("Failed to read configuration: %v", err)
+	}
+	password := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx))
+	address, err := keystore.StoreKey(keydir, password, scryptN, scryptP)
+	if err != nil {
+		utils.Fatalf("Failed to create account: %v", err)
+	}
+	fmt.Printf("Address: {%x}\n", address)
+	return nil
+}
+创建一个账户,成功后输出地址 +
func accountUpdate(ctx *cli.Context) error {
+	if len(ctx.Args()) == 0 {
+		utils.Fatalf("No accounts specified to update")
+	}
+	stack, _ := makeConfigNode(ctx)
+	ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore)
+	for _, addr := range ctx.Args() {
+		account, oldPassword := unlockAccount(ctx, ks, addr, 0, nil)
+		newPassword := getPassPhrase("Please give a new password. Do not forget this password.", true, 0, nil)
+		if err := ks.Update(account, oldPassword, newPassword); err != nil {
+			utils.Fatalf("Could not update the account: %v", err)
+		}
+	}
+	return nil
+}
+先通过 AccountManager 拿到 keystore,然后调用 Update 更新密码 +
func accountImport(ctx *cli.Context) error {
+	keyfile := ctx.Args().First()
+	if len(keyfile) == 0 {
+		utils.Fatalf("keyfile must be given as argument")
+	}
+	key, err := crypto.LoadECDSA(keyfile)
+	if err != nil {
+		utils.Fatalf("Failed to load the private key: %v", err)
+	}
+	stack, _ := makeConfigNode(ctx)
+	passphrase := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx))
+	ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore)
+	acct, err := ks.ImportECDSA(key, passphrase)
+	if err != nil {
+		utils.Fatalf("Could not create the account: %v", err)
+	}
+	fmt.Printf("Address: {%x}\n", acct.Address)
+	return nil
+}
+先通过 AccountManager 拿到 keystore,调用 ImportPreSaleKey 导入账户 + +### geth/consolecmd.go +
func localConsole(ctx *cli.Context) error {
+	node := makeFullNode(ctx)
+	startNode(ctx, node)
+	defer node.Stop()
+	client, err := node.Attach()
+	if err != nil {
+		utils.Fatalf("Failed to attach to the inproc geth: %v", err)
+	}
+	config := console.Config{
+		DataDir: utils.MakeDataDir(ctx),
+		DocRoot: ctx.GlobalString(utils.JSpathFlag.Name),
+		Client:  client,
+		Preload: utils.MakeConsolePreloads(ctx),
+	}
+	console, err := console.New(config)
+	if err != nil {
+		utils.Fatalf("Failed to start the JavaScript console: %v", err)
+	}
+	defer console.Stop(false)
+	if script := ctx.GlobalString(utils.ExecFlag.Name); script != "" {
+		console.Evaluate(script)
+		return nil
+	}
+	console.Welcome()
+	console.Interactive()
+	return nil
+}
+启动本地的一个交互式 Javascript 环境,功能是通过 console 模块提供的,而 console 模块是对 robertkrimen/otto 的一个封装。otto 是一个 Golang 实现的 Javascript 解释器,可以实现在 Golang 中执行 Javascript,并且可以让在虚拟机里的 Javascript 调用 Golang 函数,实现 Golang 和 Javascript 的相互操作 +
func remoteConsole(ctx *cli.Context) error {
+	endpoint := ctx.Args().First()
+	if endpoint == "" {
+		path := node.DefaultDataDir()
+		if ctx.GlobalIsSet(utils.DataDirFlag.Name) {
+			path = ctx.GlobalString(utils.DataDirFlag.Name)
+		}
+		if path != "" {
+			if ctx.GlobalBool(utils.TestnetFlag.Name) {
+				path = filepath.Join(path, "testnet")
+			} else if ctx.GlobalBool(utils.RinkebyFlag.Name) {
+				path = filepath.Join(path, "rinkeby")
+			}
+		}
+		endpoint = fmt.Sprintf("%s/geth.ipc", path)
+	}
+	client, err := dialRPC(endpoint)
+	if err != nil {
+		utils.Fatalf("Unable to attach to remote geth: %v", err)
+	}
+	config := console.Config{
+		DataDir: utils.MakeDataDir(ctx),
+		DocRoot: ctx.GlobalString(utils.JSpathFlag.Name),
+		Client:  client,
+		Preload: utils.MakeConsolePreloads(ctx),
+	}
+	console, err := console.New(config)
+	if err != nil {
+		utils.Fatalf("Failed to start the JavaScript console: %v", err)
+	}
+	defer console.Stop(false)
+	if script := ctx.GlobalString(utils.ExecFlag.Name); script != "" {
+		console.Evaluate(script)
+		return nil
+	}
+	console.Welcome()
+	console.Interactive()
+	return nil
+}
+启动一个 JS 交互式环境(连接到节点),通过指定 endpoint 的方式,连接到某个节点的交互式 Javascript 环境 +
func ephemeralConsole(ctx *cli.Context) error {
+	node := makeFullNode(ctx)
+	startNode(ctx, node)
+	defer node.Stop()
+	client, err := node.Attach()
+	if err != nil {
+		utils.Fatalf("Failed to attach to the inproc geth: %v", err)
+	}
+	config := console.Config{
+		DataDir: utils.MakeDataDir(ctx),
+		DocRoot: ctx.GlobalString(utils.JSpathFlag.Name),
+		Client:  client,
+		Preload: utils.MakeConsolePreloads(ctx),
+	}
+	console, err := console.New(config)
+	if err != nil {
+		utils.Fatalf("Failed to start the JavaScript console: %v", err)
+	}
+	defer console.Stop(false)
+	for _, file := range ctx.Args() {
+		if err = console.Execute(file); err != nil {
+			utils.Fatalf("Failed to execute %s: %v", file, err)
+		}
+	}
+	abort := make(chan os.Signal, 1)
+	signal.Notify(abort, syscall.SIGINT, syscall.SIGTERM)
+	go func() {
+		<-abort
+		os.Exit(0)
+	}()
+	console.Stop(true)
+	return nil
+}
+执行 Javascript 文件中的命令(可以为多个文件),通过遍历调用传输的文件路径,执行 console.Execute,执行 js 命令。 + +## geth/misccmd.go +
func makecache(ctx *cli.Context) error {
+	args := ctx.Args()
+	if len(args) != 2 {
+		utils.Fatalf(`Usage: geth makecache  `)
+	}
+	block, err := strconv.ParseUint(args[0], 0, 64)
+	if err != nil {
+		utils.Fatalf("Invalid block number: %v", err)
+	}
+	ethash.MakeCache(block, args[1])
+	return nil
+}
+生成 ethash 的验证缓存 +
func makedag(ctx *cli.Context) error {
+	args := ctx.Args()
+	if len(args) != 2 {
+		utils.Fatalf(`Usage: geth makedag  `)
+	}
+	block, err := strconv.ParseUint(args[0], 0, 64)
+	if err != nil {
+		utils.Fatalf("Invalid block number: %v", err)
+	}
+	ethash.MakeDataset(block, args[1])
+	return nil
+}
+通过调用 ethash 的 MakeDataset,生成挖矿需要的 DAG 数据集 +- versionCommand: 输出版本号 +- bugCommand: 给 https://github.com/ethereum/go-ethereum/issues/new 这个 url 拼接参数,给源代码仓库提一个 issue +- licenseCommand: 输出 License 信息 + +### geth/config.go +
func dumpConfig(ctx *cli.Context) error {
+	_, cfg := makeConfigNode(ctx)
+	comment := ""
+	if cfg.Eth.Genesis != nil {
+		cfg.Eth.Genesis = nil
+		comment += "# Note: this config doesn't contain the genesis block.\n\n"
+	}
+	out, err := tomlSettings.Marshal(&cfg)
+	if err != nil {
+		return err
+	}
+	io.WriteString(os.Stdout, comment)
+	os.Stdout.Write(out)
+	return nil
+}
+dumpConfig 函数通过 makeConfigNode 获取配置,然后将其输出在屏幕 From e91367512814da02e0f86a6cae26512f3cf2910f Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Fri, 2 Aug 2019 18:42:43 -0400 Subject: [PATCH 35/44] Update cmd.md --- cmd.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd.md b/cmd.md index 9d41c87..817def9 100644 --- a/cmd.md +++ b/cmd.md @@ -1,5 +1,5 @@ # Cmd -## file structure +## File structure |文件|package|说明| |-----|----------|-----------------------------------------------------------------------------------| |cmd | |命令行工具,下面又分了很多的命令行工具| @@ -18,6 +18,7 @@ |cmd |swarm |swarm网络的接入点| |cmd |util |提供了一些公共的工具,为Go-Ethereum命令提供说明| |cmd |wnode |这是一个简单的Whisper节点。 它可以用作独立的引导节点。此外,可以用于不同的测试和诊断目的。| + ## Cmd/geth geth是cmd中最重要的命令,他是以太坊的入口。geth的命令行是通过urfave/cli这个库进行实现的,通过这个库,我们可以轻松定义命令行程序的子命令,命令选项,命令参数,描述信息等等。 @@ -584,7 +585,7 @@ dump 子命令可以移除一个或多个特定的区块,先根据区块号获 }
执行 Javascript 文件中的命令(可以为多个文件),通过遍历调用传输的文件路径,执行 console.Execute,执行 js 命令。 -## geth/misccmd.go +### geth/misccmd.go
func makecache(ctx *cli.Context) error {
 	args := ctx.Args()
 	if len(args) != 2 {

From 4ad67e2ee57a21829274069ab7aea31a70b7838e Mon Sep 17 00:00:00 2001
From: Billy1900 <32431813+Billy1900@users.noreply.github.com>
Date: Mon, 5 Aug 2019 12:31:25 -0400
Subject: [PATCH 36/44] Update README.md

---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index ee5b66c..df2c2a4 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,7 @@
 - [p2p源码分析](/p2p源码分析.md)
 - [eth协议源码分析](/eth源码分析.md)
 - core文件源码分析
+	- [types文件解析](/types.md)        
 	- [区块链索引 chain_indexer源码分析](/core-chain_indexer源码解析.md)
 	- [布隆过滤器索引 bloombits源码分析](/core-bloombits源码分析.md)
 	- [以太坊的trie树管理 回滚等操作 state源码分析](/core-state源码分析.md)

From b1733511b817df95dd0ae2b2bd5d2d9b92a14cd4 Mon Sep 17 00:00:00 2001
From: Billy1900 <32431813+Billy1900@users.noreply.github.com>
Date: Mon, 5 Aug 2019 12:34:43 -0400
Subject: [PATCH 37/44] Update types.md

---
 types.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/types.md b/types.md
index 605e411..b9fa249 100644
--- a/types.md
+++ b/types.md
@@ -21,6 +21,7 @@ block data stucture:
 |td	|当前区块高度|
 |ReceivedAt|	接收时间|
 |ReceivedFrom|	来源|
+
 交易组成区块,一个一个区块以单向链表的形式连在一起组成区块链
 
Header data structure:
type Header struct {

From a8f0b8964cc8d02350bc3cb1ae1e1dc6fd52aac8 Mon Sep 17 00:00:00 2001
From: Billy1900 <32431813+Billy1900@users.noreply.github.com>
Date: Mon, 5 Aug 2019 12:47:43 -0400
Subject: [PATCH 38/44] =?UTF-8?q?Update=20core-genesis=E5=88=9B=E4=B8=96?=
 =?UTF-8?q?=E5=8C=BA=E5=9D=97=E6=BA=90=E7=A0=81=E5=88=86=E6=9E=90.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...2\220\347\240\201\345\210\206\346\236\220.md" | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git "a/core-genesis\345\210\233\344\270\226\345\214\272\345\235\227\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/core-genesis\345\210\233\344\270\226\345\214\272\345\235\227\346\272\220\347\240\201\345\210\206\346\236\220.md"
index 67d6b3b..a46e0ae 100644
--- "a/core-genesis\345\210\233\344\270\226\345\214\272\345\235\227\346\272\220\347\240\201\345\210\206\346\236\220.md"
+++ "b/core-genesis\345\210\233\344\270\226\345\214\272\345\235\227\346\272\220\347\240\201\345\210\206\346\236\220.md"
@@ -1,3 +1,5 @@
+# core/genesis.go
+
 genesis 是创世区块的意思. 一个区块链就是从同一个创世区块开始,通过规则形成的.不同的网络有不同的创世区块, 主网络和测试网路的创世区块是不同的.
 
 这个模块根据传入的genesis的初始值和database,来设置genesis的状态,如果不存在创世区块,那么在database里面创建它。
@@ -29,6 +31,16 @@ genesis 是创世区块的意思. 一个区块链就是从同一个创世区块
 	// GenesisAlloc 指定了最开始的区块的初始状态.
 	type GenesisAlloc map[common.Address]GenesisAccount
 
+genesisaccount,
+
type GenesisAlloc map[common.Address]GenesisAccount
+type GenesisAccount struct {
+	Code       []byte                      `json:"code,omitempty"`
+	Storage    map[common.Hash]common.Hash `json:"storage,omitempty"`
+	Balance    *big.Int                    `json:"balance" gencodec:"required"`
+	Nonce      uint64                      `json:"nonce,omitempty"`
+	PrivateKey []byte                      `json:"secretKey,omitempty"`
+}
+ SetupGenesisBlock, @@ -115,9 +127,9 @@ SetupGenesisBlock, // 如果是主网络会从这里退出。 return newcfg, stored, WriteChainConfig(db, stored, newcfg) } +SetupGenesisBlock 会根据创世区块返回一个区块链的配置。从 db 参数中拿到的区块里如果没有创世区块的话,首先提交一个新区块。接着通过调用 genesis.configOrDefault(stored) 拿到当前链的配置,测试兼容性后将配置写回 DB 中。最后返回区块链的配置信息。 - -ToBlock, 这个方法使用genesis的数据,使用基于内存的数据库,然后创建了一个block并返回。 +ToBlock, 这个方法使用genesis的数据,使用基于内存的数据库,然后创建了一个block并返回(通过 types.NewBlock) // ToBlock creates the block and state of a genesis specification. From 693237e778b97001f9f8d0cdb8496146111bb67c Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Mon, 5 Aug 2019 12:48:44 -0400 Subject: [PATCH 39/44] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index df2c2a4..3f9b0d4 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,8 @@ - [p2p源码分析](/p2p源码分析.md) - [eth协议源码分析](/eth源码分析.md) - core文件源码分析 - - [types文件解析](/types.md) + - [types文件解析](/types.md) + - [core/genesis.go](core-genesis.md) - [区块链索引 chain_indexer源码分析](/core-chain_indexer源码解析.md) - [布隆过滤器索引 bloombits源码分析](/core-bloombits源码分析.md) - [以太坊的trie树管理 回滚等操作 state源码分析](/core-state源码分析.md) From 491226e2379dbf25ceb4ff0100594d20767832f1 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Mon, 5 Aug 2019 13:16:36 -0400 Subject: [PATCH 40/44] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f9b0d4..b19650b 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ - [eth协议源码分析](/eth源码分析.md) - core文件源码分析 - [types文件解析](/types.md) - - [core/genesis.go](core-genesis.md) + - [core/genesis.go](/core-genesis创世区块源码分析.md) - [区块链索引 chain_indexer源码分析](/core-chain_indexer源码解析.md) - [布隆过滤器索引 bloombits源码分析](/core-bloombits源码分析.md) - [以太坊的trie树管理 回滚等操作 state源码分析](/core-state源码分析.md) From 145fc63051f909e554b8e01d395b3b014e61ae64 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Mon, 5 Aug 2019 13:20:42 -0400 Subject: [PATCH 41/44] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b19650b..69d78db 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ - core文件源码分析 - [types文件解析](/types.md) - [core/genesis.go](/core-genesis创世区块源码分析.md) + - [core/blockchain.go](/core-blockchain源码分析.md) - [区块链索引 chain_indexer源码分析](/core-chain_indexer源码解析.md) - [布隆过滤器索引 bloombits源码分析](/core-bloombits源码分析.md) - [以太坊的trie树管理 回滚等操作 state源码分析](/core-state源码分析.md) @@ -30,7 +31,6 @@ - [交易执行和处理部分源码分析](/core-txlist交易池的一些数据结构源码分析.md) - [交易执行和处理部分源码分析](/core-txpool交易池源码分析.md) - [创世区块的源码分析](/core-genesis创世区块源码分析.md) - - [blockchain 源码分析](/core-blockchain源码分析.md) - [miner挖矿部分源码分析CPU挖矿](/miner挖矿部分源码分析CPU挖矿.md) - [pow一致性算法](/pow一致性算法.md) - [以太坊测试网络Clique_PoA介绍](/以太坊测试网络Clique_PoA介绍.md) From a34814a79ecb53acbee5f4cc2c42f945238d61d5 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Mon, 5 Aug 2019 13:42:17 -0400 Subject: [PATCH 42/44] =?UTF-8?q?Update=20core-blockchain=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...272\220\347\240\201\345\210\206\346\236\220.md" | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git "a/core-blockchain\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/core-blockchain\346\272\220\347\240\201\345\210\206\346\236\220.md" index 99cc424..07e202a 100644 --- "a/core-blockchain\346\272\220\347\240\201\345\210\206\346\236\220.md" +++ "b/core-blockchain\346\272\220\347\240\201\345\210\206\346\236\220.md" @@ -181,6 +181,8 @@ Blockchian structure: go bc.update() return bc, nil } + +BlockChain 的初始化需要 ethdb.Database, *CacheConfig, params.ChainConfig, consensus.Engine,vm.Config 参数。它们分别表示 db 对象;缓存配置(在 core/blockchain.go 中定义);区块链配置(可通过 core/genesis.go 中的 SetupGenesisBlock 拿到);一致性引擎(可通过 core/blockchain.go 中的 CreateConsensusEngine 得到);虚拟机配置(通过 core/vm 定义)这些实参需要提前定义.回到 NewBlockChain 的具体代码,首先判断是否有默认 cacheConfig,如果没有根据默认配置创建 cacheConfig,再通过 hashicorp 公司的 lru 模块创建 bodyCache, bodyRLPCache 等缓存对象(lru 是 last recently used 的缩写,常见数据结构,不了解的朋友请自行查阅相关资料),根据这些信息创建 BlockChain 对象,然后通过调用 BlockChain 的 SetValidator 和 SetProcessor 方法创建验证器和处理器,接下来通过 NewHeaderChain 获得区块头,尝试判断创始区块是否存在,bc.loadLastState() 加载区块最新状态,最后检查当前状态,确保本地运行的区块链上没有非法的区块。 loadLastState, 加载数据库里面的最新的我们知道的区块链状态. 这个方法假设已经获取到锁了. @@ -244,7 +246,9 @@ loadLastState, 加载数据库里面的最新的我们知道的区块链状态. return nil } -goroutine update的处理非常简单. 定时处理future blocks. +loadLastState 会从数据库中加载区块链状态,首先通过 GetHeadBlockHash 从数据库中取得当前区块头,如果当前区块不存在,即数据库为空的话,通过 Reset 将创始区块写入数据库以达到重置目的。如果当前区块不存在,同样通过 Reset 重置。接下来确认当前区块的世界状态是否正确;如果有问题,则通过 repair 进行修复,repair 中是一个死循环,它会一直回溯当前区块,直到找到对应的世界状态。然后通过 bc.hc.SetCurrentHeader 设置当前区块头,并恢复快速同步区块。 + +update() 的作用是定时处理 Future 区块,简单地来说就是定时调用 procFutureBlocks。procFutureBlocks 可以从 futureBlocks 拿到需要插入的区块,最终会调用 InsertChain 将区块插入到区块链中。 func (bc *BlockChain) update() { futureTimer := time.Tick(5 * time.Second) @@ -349,8 +353,8 @@ SetHead将本地链回卷到新的头部。 在给定新header之上的所有内 return bc.loadLastState() } -InsertChain,插入区块链, 插入区块链尝试把给定的区块插入到规范的链条,或者是创建一个分叉. 如果发生错误,那么会返回错误发生时候的index和具体的错误信息. - +InsertChain 将尝试将给定的区块插入到规范的区块链中,或者创建一个分支,插入后,会通过 PostChainEvents 触发所有事件 + // InsertChain attempts to insert the given batch of blocks in to the canonical // chain or, otherwise, create a fork. If an error is returned it will return // the index number of the failing block as well an error describing what went @@ -521,6 +525,7 @@ insertChain方法会执行区块链插入,并收集事件信息. 因为需要使 } return 0, events, coalescedLogs, nil } +首先做一个健康检查,确保要插入的链是有序且相互连接的。接下来通过 bc.engine.VerifyHeaders 调用一致性引擎来验证区块头是有效的。进入 for i, block := range chain 循环后,接收 results 这个 chan,可以获得一致性引擎获得区块头的结果,如果是已经插入的区块,跳过;如果是未来的区块,时间距离不是很长,加入到 futureBlocks 中,否则返回一条错误信息;如果没能找到该区块祖先,但在 futureBlocks 能找到,也加入到 futureBlocks 中。加入 futureBlocks 的过程结束后,通过 core/state_processor.go 中的 Process 改变世界状态. 在返回收据,日志,使用的 Gas 后。通过 bc.Validator().ValidateState 再次验证,通过后,通过 WriteBlockAndState 写入区块以及相关状态到区块链。最后,如果生成了一个新的区块头,最新的区块头等于 lastCanon 的哈希值,发布一个 ChainHeadEvent 的事件。 WriteBlockAndState,把区块写入区块链. @@ -602,6 +607,7 @@ WriteBlockAndState,把区块写入区块链. bc.futureBlocks.Remove(block.Hash()) return status, nil } +WriteBlockWithState 将区块以及相关所有的状态写入数据库。首先通过 bc.GetTd(block.ParentHash(), block.NumberU64()-1) 获取待插入区块的总难度,bc.GetTd(bc.currentBlock.Hash(), bc.currentBlock.NumberU64()) 计算当前区块的区块链的总难度,externTd := new(big.Int).Add(block.Difficulty(), ptd) 获得新的区块链的总难度。通过 bc.hc.WriteTd(block.Hash(), block.NumberU64(), externTd) 写入区块 hash,高度,对应总难度。然后使用 batch 的方式写入区块的其他数据。插入数据后,判断这个区块的父区块是否为当前区块,如果不是,说明存在分叉,调用 reorg 重新组织区块链。插入成功后,调用 bc.futureBlocks.Remove(block.Hash()) 从 futureBlocks 中移除区块。 reorgs方法是在新的链的总难度大于本地链的总难度的情况下,需要用新的区块链来替换本地的区块链为规范链。 @@ -724,4 +730,4 @@ reorgs方法是在新的链的总难度大于本地链的总难度的情况下 return nil } - +reorg 方法用来将新区块链替换本地区块链为规范链。对于老链比新链高的情况,减少老链,让它和新链一样高;否则的话减少新链,待后续插入。潜在的会丢失的交易会被当做事件发布。接着进入一个 for 循环,找到两条链共同的祖先。再将上述减少新链阶段保存的 newChain 一块块插入到链中,更新规范区块链的 key,并且写入交易的查询信息。最后是清理工作,删除交易查询信息,删除日志,并通过 bc.rmLogsFeed.Send 发送消息通知,删除了哪些旧链则通过 bc.chainSideFeed.Send 进行消息通知。 From 3feadd83e198eba6766da05b15b846187663cac1 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Mon, 5 Aug 2019 14:35:49 -0400 Subject: [PATCH 43/44] Create Internal-ethapi update internal api --- Internal-ethapi | 213 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 Internal-ethapi diff --git a/Internal-ethapi b/Internal-ethapi new file mode 100644 index 0000000..b2349ef --- /dev/null +++ b/Internal-ethapi @@ -0,0 +1,213 @@ +在 internal/ethapi/api.go 中,可以通过 NewAccount 获取新账户,这个 api 可以通过交互式命令行或 rpc 接口调用。 + +func (s *PrivateAccountAPI) NewAccount(password string) (common.Address, error) { + acc, err := fetchKeystore(s.am).NewAccount(password) + if err == nil { + return acc.Address, nil + } + return common.Address{}, err +} + +首先调用 fetchKeystore,通过 backends 获得 KeyStore 对象,最后通过调用 keystore.go 中的 NewAccount 获得新账户。 +func (ks *KeyStore) NewAccount(passphrase string) (accounts.Account, error) { + _, account, err := storeNewKey(ks.storage, crand.Reader, passphrase) + if err != nil { + return accounts.Account{}, err + } + ks.cache.add(account) + ks.refreshWallets() + return account, nil +} +NewAccount 会调用 storeNewKey。 + +func storeNewKey(ks keyStore, rand io.Reader, auth string) (*Key, accounts.Account, error) { + key, err := newKey(rand) + if err != nil { + return nil, accounts.Account{}, err + } + a := accounts.Account{Address: key.Address, URL: accounts.URL{Scheme: KeyStoreScheme, Path: ks.JoinPath(keyFileName(key.Address))}} + if err := ks.StoreKey(a.URL.Path, key, auth); err != nil { + zeroKey(key.PrivateKey) + return nil, a, err + } + return key, a, err +} +注意第一个参数是 keyStore,这是一个接口类型。 + +type keyStore interface { + GetKey(addr common.Address, filename string, auth string) (*Key, error) + StoreKey(filename string, k *Key, auth string) error + JoinPath(filename string) string +} +storeNewKey 首先调用 newKey,通过椭圆曲线加密算法获取公私钥对。 + +func newKey(rand io.Reader) (*Key, error) { + privateKeyECDSA, err := ecdsa.GenerateKey(crypto.S256(), rand) + if err != nil { + return nil, err + } + return newKeyFromECDSA(privateKeyECDSA), nil +} +然后会根据参数 ks 的类型调用对应的实现,通过 geth account new 命令创建新账户,调用的就是 accounts/keystore/keystore_passphrase.go 中的实现。即 + +func (ks keyStorePassphrase) StoreKey(filename string, key *Key, auth string) error { + keyjson, err := EncryptKey(key, auth, ks.scryptN, ks.scryptP) + if err != nil { + return err + } + return writeKeyFile(filename, keyjson) +} + +我们可以深入到 EncryptKey 中 +func EncryptKey(key *Key, auth string, scryptN, scryptP int) ([]byte, error) { + authArray := []byte(auth) + salt := randentropy.GetEntropyCSPRNG(32) + derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen) + if err != nil { + return nil, err + } + encryptKey := derivedKey[:16] + keyBytes := math.PaddedBigBytes(key.PrivateKey.D, 32) + iv := randentropy.GetEntropyCSPRNG(aes.BlockSize) // 16 + cipherText, err := aesCTRXOR(encryptKey, keyBytes, iv) + if err != nil { + return nil, err + } + mac := crypto.Keccak256(derivedKey[16:32], cipherText) + scryptParamsJSON := make(map[string]interface{}, 5) + scryptParamsJSON["n"] = scryptN + scryptParamsJSON["r"] = scryptR + scryptParamsJSON["p"] = scryptP + scryptParamsJSON["dklen"] = scryptDKLen + scryptParamsJSON["salt"] = hex.EncodeToString(salt) + cipherParamsJSON := cipherparamsJSON{ + IV: hex.EncodeToString(iv), + } + cryptoStruct := cryptoJSON{ + Cipher: "aes-128-ctr", + CipherText: hex.EncodeToString(cipherText), + CipherParams: cipherParamsJSON, + KDF: keyHeaderKDF, + KDFParams: scryptParamsJSON, + MAC: hex.EncodeToString(mac), + } + encryptedKeyJSONV3 := encryptedKeyJSONV3{ + hex.EncodeToString(key.Address[:]), + cryptoStruct, + key.Id.String(), + version, + } + return json.Marshal(encryptedKeyJSONV3) +} +EncryptKey 的 key 参数是加密的账户,包括 ID,公私钥,地址,auth 参数是用户输入的密码,scryptN 参数是 scrypt 算法中的 N,scryptP 参数是 scrypt 算法中的 P。整个过程,首先对密码使用 scrypt 算法加密,得到加密后的密码 derivedKey,然后用 derivedKey 对私钥使用 AES-CTR 算法加密,得到密文 cipherText,再对 derivedKey 和 cipherText 进行哈希运算得到 mac,mac 起到签名的作用,在解密的时候可以验证合法性,防止别人篡改。EncryptKey 最终返回 json 字符串,Storekey 方法接下来会将其保存在文件中。 + +列出所有账户 +列出所有账户的入口也在 internal/ethapi/api.go 里。 +func (s *PrivateAccountAPI) ListAccounts() []common.Address { + addresses := make([]common.Address, 0) // return [] instead of nil if empty + for _, wallet := range s.am.Wallets() { + for _, account := range wallet.Accounts() { + addresses = append(addresses, account.Address) + } + } + return addresses +} +该方法会从 Account Manager 中读取所有钱包信息,获取其对应的所有地址信息。 + +如果读者对 geth account 命令还有印象的话,geth account 命令还有 update,import 等方法,这里就不再讨论了。 + +发起转账 +发起一笔转账的函数入口在 internal/ethapi/api.go 中。 +func (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args SendTxArgs) (common.Hash, error) { + account := accounts.Account{Address: args.From} + wallet, err := s.b.AccountManager().Find(account) + if err != nil { + return common.Hash{}, err + } + if args.Nonce == nil { + s.nonceLock.LockAddr(args.From) + defer s.nonceLock.UnlockAddr(args.From) + } + if err := args.setDefaults(ctx, s.b); err != nil { + return common.Hash{}, err + } + tx := args.toTransaction() + var chainID *big.Int + if config := s.b.ChainConfig(); config.IsEIP155(s.b.CurrentBlock().Number()) { + chainID = config.ChainId + } + signed, err := wallet.SignTx(account, tx, chainID) + if err != nil { + return common.Hash{}, err + } + return submitTransaction(ctx, s.b, signed) +} +转账时,首先利用传入的参数 from 构造一个 account,表示转出方。然后通过 accountMananger 的 Find 方法获得这个账户的钱包(Find 方法在上面有介绍),接下来有一个稍特别的地方。我们知道以太坊采用的是账户余额的体系,对于 UTXO 的方式来说,防止双花的方式很直观,一个输出不能同时被两个输入而引用,这种方式自然而然地就防止了发起转账时可能出现的双花,采用账户系统的以太坊没有这种便利,以太坊的做法是,每个账户有一个 nonce 值,它等于账户累计发起的交易数量,账户发起交易时,交易数据里必须包含 nonce,而且该值必须大于账户的 nonce 值,否则为非法,如果交易的 nonce 值减去账户的 nonce 值大于1,这个交易也不能打包到区块中,这确保了交易是按照一定的顺序执行的。如果有两笔交易有相同 nonce,那么其中只有一笔交易能够成功,通过给 nonce 加锁就是用来防止双花的问题。接着调用 args.setDefaults(ctx, s.b) 方法设置一些交易默认值。最后调用 toTransaction 方法创建交易: + +func (args *SendTxArgs) toTransaction() *types.Transaction { + var input []byte + if args.Data != nil { + input = *args.Data + } else if args.Input != nil { + input = *args.Input + } + if args.To == nil { + return types.NewContractCreation(uint64(*args.Nonce), (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input) + } + return types.NewTransaction(uint64(*args.Nonce), *args.To, (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input) +} +这里有两个分支,如果传入的交易的 to 参数不存在,那就表明这是一笔合约转账;如果有 to 参数,就是一笔普通的转账,深入后你会发现这两种转账最终调用的都是 newTransaction + +func NewTransaction(nonce uint64, to common.Address, amount *big.Int, gasLimit uint64, gasPrice *big.Int, data []byte) *Transaction { + return newTransaction(nonce, &to, amount, gasLimit, gasPrice, data) +} +func NewContractCreation(nonce uint64, amount *big.Int, gasLimit uint64, gasPrice *big.Int, data []byte) *Transaction { + return newTransaction(nonce, nil, amount, gasLimit, gasPrice, data) +} +newTransaction 的功能很简单,实际上就是返回一个 Transaction 实例。我们接着看 SendTransaction 方法接下来的部分。创建好一笔交易,接着我们通过 ChainConfig 方法获得区块链的配置信息,如果是 EIP155 里描述的配置,需要做特殊处理(待深入),然后调用 SignTx 对交易签名来确保这笔交易是真实有效的。SignTx 的接口定义在 accounts/accounts.go 中,这里我们看 keystore 的实现。 + +func (ks *KeyStore) SignTx(a accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + ks.mu.RLock() + defer ks.mu.RUnlock() + unlockedKey, found := ks.unlocked[a.Address] + if !found { + return nil, ErrLocked + } + if chainID != nil { + return types.SignTx(tx, types.NewEIP155Signer(chainID), unlockedKey.PrivateKey) + } + return types.SignTx(tx, types.HomesteadSigner{}, unlockedKey.PrivateKey) +} +首先验证账户是否已解锁,若没有解锁,直接报异常退出。接着根据 chainID 判断使用哪一种签名方式,调用相应 SignTx 方法进行签名。 + +func SignTx(tx *Transaction, s Signer, prv *ecdsa.PrivateKey) (*Transaction, error) { + h := s.Hash(tx) + sig, err := crypto.Sign(h[:], prv) + if err != nil { + return nil, err + } + return tx.WithSignature(s, sig) +} +SignTx 的功能是调用椭圆加密函数获得签名,得到带签名的交易后,通过 SubmitTrasaction 提交交易。 + + +func submitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (common.Hash, error) { + if err := b.SendTx(ctx, tx); err != nil { + return common.Hash{}, err + } + if tx.To() == nil { + signer := types.MakeSigner(b.ChainConfig(), b.CurrentBlock().Number()) + from, err := types.Sender(signer, tx) + if err != nil { + return common.Hash{}, err + } + addr := crypto.CreateAddress(from, tx.Nonce()) + log.Info("Submitted contract creation", "fullhash", tx.Hash().Hex(), "contract", addr.Hex()) + } else { + log.Info("Submitted transaction", "fullhash", tx.Hash().Hex(), "recipient", tx.To()) + } + return tx.Hash(), nil +} +submitTransaction 首先调用 SendTx,这个接口在 internal/ethapi/backend.go 中定义,而实现在 eth/api_backend.go 中,这部分代码涉及到交易池,我们在单独的交易池章节进行探讨,这里就此打住。 + +将交易写入交易池后,如果没有因错误退出,submitTransaction 会完成提交交易,返回交易哈希值。发起交易的这个过程就结束了,剩下的就交给矿工将交易上链。 From 39ae52a197b3d9b2b3d4832c97174d589239e6a4 Mon Sep 17 00:00:00 2001 From: Billy1900 <32431813+Billy1900@users.noreply.github.com> Date: Mon, 5 Aug 2019 16:03:28 -0400 Subject: [PATCH 44/44] =?UTF-8?q?Update=20accounts=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\347\240\201\345\210\206\346\236\220.md" | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" index 334aa55..ef63ff4 100644 --- "a/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" +++ "b/accounts\346\272\220\347\240\201\345\210\206\346\236\220.md" @@ -212,7 +212,7 @@ ABI是Application Binary Interface的缩写,字面意思 应用二进制接口 // 订阅创建异步订阅,以便在后端检测到钱包的到达或离开时接收通知。 Subscribe(sink chan<- WalletEvent) event.Subscription } - +Backend 接口是一个钱包 provider,它包含一个钱包列表,在检测到钱包开启或关闭时可以接收到通知,可以用来请求签名交易。其中 Wallets() 返回当前可用的钱包,按字母顺序排序,Subscribe() 创建异步订阅的方法,当钱包发生变动时通过 chan 接收消息。 ## manager.go Manager是一个包含所有东西的账户管理工具。 可以和所有的Backends来通信来签署交易。 @@ -236,7 +236,7 @@ Manager是一个包含所有东西的账户管理工具。 可以和所有的Bac quit chan chan error lock sync.RWMutex } - +其中 backends 是当前已注册的所有 Backend,updaters 是所有 Backend 的更新订阅器,updates 是 Backend 对应 wallet 事件更新的 chan,wallets 是所有已经注册的 Backends 的钱包的缓存,feed 用于钱包事件的通知,quit 用于退出的事件。manager.go 的代码没有什么很特别的地方,有兴趣的话可以自行查看源代码,这里只做概述。这里只挑几个典型的,下面讲解业务实例时会用到的方法。 创建Manager @@ -272,8 +272,9 @@ Manager是一个包含所有东西的账户管理工具。 可以和所有的Bac return am } +NewManager 会将所有 backends 的 wallets 收集起来,获取所有的 backends 的时间订阅,然后根据这些参数创建新的 manager。 -update方法。 是一个goroutine。会监听所有backend触发的更新信息。 然后转发给feed. +update在 NewManager 作为一个 goroutine 被调用,一直运行,监控所有 backend 触发的更新消息,发给 feed 用来进行进一步的处理。 // update is the wallet event loop listening for notifications from the backends // and updating the cache of wallets. @@ -330,7 +331,7 @@ update方法。 是一个goroutine。会监听所有backend触发的更新信息 } -对于node来说。是什么时候创建的账号管理器。 +对node来说是什么时候创建的账号管理器 // New creates a new P2P node, ready for protocol registration. func New(conf *Config) (*Node, error) { @@ -397,3 +398,26 @@ update方法。 是一个goroutine。会监听所有backend触发的更新信息 } return accounts.NewManager(backends...), ephemeral, nil } + +首先获取配置信息,通过 getPassPhrase 获取密码后,通过 keystore.StoreKey 获得账户地址 +

+unc accountCreate(ctx *cli.Context) error {
+	cfg := gethConfig{Node: defaultNodeConfig()}
+	if file := ctx.GlobalString(configFileFlag.Name); file != "" {
+		if err := loadConfig(file, &cfg); err != nil {
+			utils.Fatalf("%v", err)
+		}
+	}
+	utils.SetNodeConfig(ctx, &cfg.Node)
+	scryptN, scryptP, keydir, err := cfg.Node.AccountConfig()
+	if err != nil {
+		utils.Fatalf("Failed to read configuration: %v", err)
+	}
+	password := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx))
+	address, err := keystore.StoreKey(keydir, password, scryptN, scryptP)
+	if err != nil {
+		utils.Fatalf("Failed to create account: %v", err)
+	}
+	fmt.Printf("Address: {%x}\n", address)
+	return nil
+}