[TOC]
节点认证
从Angine的说明来看,节点是分为普通节点和CA节点两种,只有CA节点才有资格出块,在文件 /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/angine.go 中可以看到下面一个函数,判断节点是否是一个可以出块的节点:
func (ang *Angine) IsNodeValidator(pub crypto.PubKey) bool {
edPub := pub.(*crypto.PubKeyEd25519)
_, vals := ang.consensus.GetValidators()
for _, v := range vals {
if edPub.KeyString() == v.PubKey.KeyString() {
return true
}
}
return false
}
它是通过下面函数来判断的:
func (cs *ConsensusState) GetValidators() (agtypes.INT, []*agtypes.Validator) {
cs.mtx.Lock()
defer cs.mtx.Unlock()
return cs.state.LastBlockHeight, cs.state.Validators.Copy().Validators
}
那么就有对应的设置函数:
// Sets our private validator account for signing votes.
func (cs *ConsensusState) SetPrivValidator(priv PrivValidator) {
cs.mtx.Lock()
defer cs.mtx.Unlock()
cs.privValidator = priv
}
设置函数在assembleStateMachine中被调用,也就是我们上面启动Angine过程中的一个函数:
func (ang *Angine) assembleStateMachine(stateM *state.State) {
conf := ang.tune.Conf
fastSync := fastSyncable(conf, ang.privValidator.GetAddress(), stateM.Validators)
stateM.SetLogger(ang.logger)
blockStore := blockchain.NewBlockStore(ang.dbs["blockstore"], ang.dbs["archive"])
_, stateLastHeight, _ := stateM.GetLastBlockInfo()
bcReactor := blockchain.NewBlockchainReactor(ang.logger, conf, stateLastHeight, blockStore, fastSync, ang.dataArchive)
mem := mempool.NewMempool(ang.logger, conf)
memReactor := mempool.NewMempoolReactor(ang.logger, conf, mem)
consensusState := consensus.NewConsensusState(ang.logger, conf, stateM, blockStore, mem)
consensusState.SetPrivValidator(ang.privValidator)
读取的配置文件路径为: /home/pct/.angine/priv_validator.json,这个文件是代码生成的,是不是需要修改代码,配置文件内容如下:
pct@Chandler:~/.angine$ cat priv_validator.json
{
"address": "2EE33E606BD199AC9283679664A9C357CC6C95EA",
"pub_key": [
1,
"89D7A161263A980512994F23E83AF59D58AC1E3D21A33DB14224558F98959280"
],
"coin_base": [
1,
"89D7A161263A980512994F23E83AF59D58AC1E3D21A33DB14224558F98959280"
],
"last_height": 0,
"last_round": 0,
"last_step": 0,
"last_signature": null,
"last_signbytes": "",
"priv_key": [
1,
"705EB223E0D6293CF622A2E2F0ADB1F73BECB4477EA86521245ACF5C18E17AE989D7A161263A980512994F23E83AF59D58AC1E3D21A33DB14224558F98959280"
]
}
我们查找调用节点认证的部分,最后发现它的调用是在路由表中的一个压缩请求中:
"za_surveillance": rpc.NewRPCFunc(h.ZaSurveillance, argsWithChainID("")),
那么这个认证部分就不是我们需要关注的重点,因为我们需要不发送RPC命令就可以出块,这个PRC部分在代码中没有被调用。