github.com/cuiweixie/go-ethereum@v1.8.2-0.20180303084001-66cd41af1e38/consensus/consensus.go (about) 1 // Copyright 2017 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 // Package consensus implements different Ethereum consensus engines. 18 package consensus 19 20 import ( 21 "github.com/ethereum/go-ethereum/common" 22 "github.com/ethereum/go-ethereum/core/state" 23 "github.com/ethereum/go-ethereum/core/types" 24 "github.com/ethereum/go-ethereum/params" 25 "github.com/ethereum/go-ethereum/rpc" 26 "math/big" 27 ) 28 29 // ChainReader defines a small collection of methods needed to access the local 30 // blockchain during header and/or uncle verification. 31 type ChainReader interface { 32 // Config retrieves the blockchain's chain configuration. 33 Config() *params.ChainConfig 34 35 // CurrentHeader retrieves the current header from the local chain. 36 CurrentHeader() *types.Header 37 38 // GetHeader retrieves a block header from the database by hash and number. 39 GetHeader(hash common.Hash, number uint64) *types.Header 40 41 // GetHeaderByNumber retrieves a block header from the database by number. 42 GetHeaderByNumber(number uint64) *types.Header 43 44 // GetHeaderByHash retrieves a block header from the database by its hash. 45 GetHeaderByHash(hash common.Hash) *types.Header 46 47 // GetBlock retrieves a block from the database by hash and number. 48 GetBlock(hash common.Hash, number uint64) *types.Block 49 } 50 51 // Engine is an algorithm agnostic consensus engine. 52 type Engine interface { 53 // Author retrieves the Ethereum address of the account that minted the given 54 // block, which may be different from the header's coinbase if a consensus 55 // engine is based on signatures. 56 Author(header *types.Header) (common.Address, error) 57 58 // VerifyHeader checks whether a header conforms to the consensus rules of a 59 // given engine. Verifying the seal may be done optionally here, or explicitly 60 // via the VerifySeal method. 61 VerifyHeader(chain ChainReader, header *types.Header, seal bool) error 62 63 // VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers 64 // concurrently. The method returns a quit channel to abort the operations and 65 // a results channel to retrieve the async verifications (the order is that of 66 // the input slice). 67 VerifyHeaders(chain ChainReader, headers []*types.Header, seals []bool) (chan<- struct{}, <-chan error) 68 69 // VerifyUncles verifies that the given block's uncles conform to the consensus 70 // rules of a given engine. 71 VerifyUncles(chain ChainReader, block *types.Block) error 72 73 // VerifySeal checks whether the crypto seal on a header is valid according to 74 // the consensus rules of the given engine. 75 VerifySeal(chain ChainReader, header *types.Header) error 76 77 // Prepare initializes the consensus fields of a block header according to the 78 // rules of a particular engine. The changes are executed inline. 79 Prepare(chain ChainReader, header *types.Header) error 80 81 // Finalize runs any post-transaction state modifications (e.g. block rewards) 82 // and assembles the final block. 83 // Note: The block header and state database might be updated to reflect any 84 // consensus rules that happen at finalization (e.g. block rewards). 85 Finalize(chain ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, 86 uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) 87 88 // Seal generates a new block for the given input block with the local miner's 89 // seal place on top. 90 Seal(chain ChainReader, block *types.Block, stop <-chan struct{}) (*types.Block, error) 91 92 // CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty 93 // that a new block should have. 94 CalcDifficulty(chain ChainReader, time uint64, parent *types.Header) *big.Int 95 96 // APIs returns the RPC APIs this consensus engine provides. 97 APIs(chain ChainReader) []rpc.API 98 } 99 100 // PoW is a consensus engine based on proof-of-work. 101 type PoW interface { 102 Engine 103 104 // Hashrate returns the current mining hashrate of a PoW consensus engine. 105 Hashrate() float64 106 }