Edit me

[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部分在代码中没有被调用。

Tags: