创建创世块的代码解析
在cmd的geth目录下的main.go中
init函数先于main函数执行,做命令的初始化,其中比较重要的有三个地方,app.Action=geth,app.Commands中consoleCommand,以及App.Before指向的匿名函数
main函数中的内容比较简单,这里不多做任何解释。
通过gopkg.in/urfave/cli.v1包中的代码来衔接到cmd/geth/chaincmd包中的代码,APP包中中HandleAction函数action的类型是「func(*Context) error」,此时将执行a(context)方法,那么此时调用那个Action呢,就是我们前面提到的App.init()初始化命令时的initCommand,接下来我们来看看cmd/geth/chaincmd中的initCommand:
指定数据的存储目录命令行参数 --datadir的代码
当用户没有指定存储目录,下面代码是数据存储默认存放指定的代码:
获取用户当前目录的地址
这允许使用现有的配置功能。当所有标志被迁移时,该功能可以被删除,并且必须改变现有的配置功能,即使用本地标志
根据给定的JSon格式文件初始化创世块
将初始创世块存储
涉及到的Core层次的代码
创世块的数据结构
检查创世块的相关处理逻辑,符合逻辑写创世块,或者反馈控制台相应的问题
ToBlock, 这个方法使用genesis的数据,使用基于内存的数据库,然后创建了一个block并返回。
Commit方法和MustCommit方法, Commit方法把给定的genesis的block和state写入数据库, 这个block被认为是规范的区块链头。
返回各种模式的默认Genesis
由于代码分析者水平有限,如果其中有问题,欢迎大家一起交流
GitHub地址:https://github.com/guoshijiang/go-ethereum-code-analysis
领取专属 10元无门槛券
私享最新 技术干货