HPB在创建帐号时使用的命令是 ./ghpb --datadir node/data account init
通过代码看下创建流程
go-hpb源码命令架构使用的是urfave/cli,不知道是不是这样读这个名称:you are 废物,这里有个不错的帖子介绍,可以学习下。主要对命令进行了封装,我们主要关心命令所对应的业务实现逻辑即可,使用起来非常方便。阅读也从这个地方开始。
account命令定义在accountcmd.go文件中,通过源码可以看到account命令有list、new、update、import四个子命令。每一个命令都有flags参数。
github.com\hpb-project\go-hpb\cmd\accountcmd.go
1 | accountCommand = cli.Command{ |
现在主要看一下new这个子命令,Action属性主要用来指定new命令的所需要执行的动作。这里可以看到是utils.MigrateFlags(accountCreate), MigrateFlags方法是把account命令的flag参数设置到全局参数里。比如命令hpb account new –keystore /tmp/mykeystore –lightkdf是等价于hpb –keystore /tmp/mykeystore –lightkdf account new。主要的业务实现需要查看accountCreate
1 | { |
accountCreate方法首先初始化节点配置对象,并实例化一下节点对象,getPassPhrase接收一个用户输入的口令。接下来通过口令参数生成用户帐户信息.
1 | // accountCreate creates a new account into the keystore defined by the CLI flags. |
NewAccount方法用来生成一个密钥,并把他保存在文件中,也就是命令执行后生成的文件,比如node/data/keystore/UTC–2018-11-25T14-05-44.446434210Z–a0603b3443c89a6e2eff7614acec5a59f9f70ebb。生成之后返回的account需要加载到当前cache里,并刷新wallet信息
1 | // NewAccount generates a new key and stores it into the key directory, |
关键方法storeNewKey,第一步newKey会随机生成非对称密钥,使用的是大名顶顶的ECDSA算法。然后创建 一个account对象,并进行保存。保存完成需要把当前内存信息进行清除,以防安全隐患。
1 | func storeNewKey(ks keyStore, rand io.Reader, auth string) (*Key, accounts.Account, error) { |
newKey方法生成非对称密钥,并转成一个用户帐户信息,主要是需要通过公钥生成一个用户帐户地址,在newKeyFromECDSA方法里,可以看到的是ECDSA.PublicKey生成Address
1 | func newKey(rand io.Reader) (*Key, error) { |
StoreKey主要完成非对称密钥通过用户输入口令进行加密保存到文件
1 | func (ks keyStorePassphrase) StoreKey(filename string, key *Key, auth string) error { |
文件保存后,业务就基本完成,程序退出执行。