eth目前的共识算法pow的整理

涉及的代码子包主要有consensus,miner,core,geth
  1. /consensus 共识算法
  2.    consensus.go
  3. 1. Prepare方法
  4. 2. CalcDifficulty方法:计算工作量
  5. 3. AccumulateRewards方法:计算每个块的出块奖励
  6. 4. VerifySeal方法:校验pow的工作量难度是否符合要求,返回nil则通过
  7. 5. verifyHeader方法:校验区块头是否符合共识规则

/miner 挖矿 work.go commitNewWork():提交新的块,新的交易,从交易池中获取未打包的交易,然后提交交易,进行打包 核心代码:

  1. // Create the current work task and check any fork transitions needed
  2. work := self.current
  3. if self.config.DAOForkSupport && self.config.DAOForkBlock != nil && self.config.DAOForkBlock.Cmp(header.Number) == 0 {
  4. misc.ApplyDAOHardFork(work.state)
  5. }
  6. pending, err := self.eth.TxPool().Pending()
  7. if err != nil {
  8. log.Error("Failed to fetch pending transactions", "err", err)
  9. return
  10. }
  11. txs := types.NewTransactionsByPriceAndNonce(self.current.signer, pending)
  12. work.commitTransactions(self.mux, txs, self.chain, self.coinbase)
  1. eth/handler.go
  2. NewProtocolManager --> verifyHeader --> VerifySeal

整条链的运行,打包交易,出块的流程

  1. /cmd/geth/main.go/main
  2. makeFullNode-->RegisterEthService-->eth.New-->NewProtocolManager --> verifyHeader --> VerifySeal