HPB在创建帐号时使用的命令是 ./ghpb --datadir node/data init gensis.json
通过代码看下节点初始化做了什么事情
init命令定义在chaincmd.go文件中,关于urfave和utils.MigrateFlags在创建帐号中做过说明,这里直接看下initGenesis做了什么事情。
initGenesis方法流程:
- MakeConfigNode方法配置节点的默认参数信息,这个时候如果很多参数没有通过命令很输入进来,程序会把所有的参数信息设置为默认值
- 加载文件gensis.json文件,文件名通过init的flag参数输入进行。后边我们对gensis.json文件解读一下。
- 创建bc.Genesis对象,然后通过gensis.json文件的信息进行赋值
- db.OpenDatabase创建数据库
- bc.SetupGenesisBlockf进行初始块的生成和写入文件
github.com\hpb-project\go-hpb\cmd\chaincmd.go
1 | initCommand = cli.Command{ |
看下创建数据库的代码,数据库实例通过atomic.Value{}来实现线程安全操作。当没有传入–datadir参数时,会直接返回内存数据库,否则会创建chaindata数据库文件。ResolvePath方法会在chaindata路径前加个ghpb路径。数据库使用的是Google的levelDB,
1 | // OpenDatabase opens an existing database with the given name (or creates one |
SetupGenesisBlock方法主要是对初始区块的文件写入。
- GetCanonicalHash(db, 0)首先从数据库获取第0个hash,如果没有则返回一个初始hash,即[32]byte{0}
- 把初始的genesis信息生成初始区块提交到数据库
- …
- …
- …后续再读
1 | func SetupGenesisBlock(db hpbdb.Database, genesis *Genesis) (*config.ChainConfig, common.Hash, error) { |
genesis.Commit(db)方法中,首先将genesis转化成一个区块,然后再将区块信息写入数据库,同时包含其他一些数据内容,比如blockReceipts、GetCanonicalHash,WriteHeadBlockHash等等。此时已接触到初始block,后续文章我们对相关数据结构进行详细说明
1 | // Commit writes the block and state of a genesis specification to the database. |