Documentation
¶
Overview ¶
Package core implements the Ethereum consensus protocol.
Index ¶
- Constants
- Variables
- func ApplyMessage(evm *vm.EVM, msg Message, gp *GasPool) ([]byte, uint64, bool, error)
- func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, author *common.Address, ...) (*types.Receipt, uint64, error)
- func CalcGasLimit(parent *types.Block) uint64
- func CanTransfer(db vm.StateDB, addr common.Address, amount *big.Int) bool
- func GenerateChain(config *params.ChainConfig, parent *types.Block, engine consensus.Engine, ...) ([]*types.Block, []types.Receipts)
- func GenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big.Int) *types.Block
- func GetHashFn(ref *types.Header, chain ChainContext) func(n uint64) common.Hash
- func IntrinsicGas(data []byte, contractCreation, homestead bool) (uint64, error)
- func NewEVMContext(msg Message, header *types.Header, chain ChainContext, author *common.Address) vm.Context
- func SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts types.Receipts) error
- func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error)
- func Transfer(db vm.StateDB, sender, recipient common.Address, amount *big.Int)
- type BadBlockArgs
- type BlockChain
- func (bc *BlockChain) BadBlocks() ([]BadBlockArgs, error)
- func (bc *BlockChain) Config() *params.ChainConfig
- func (bc *BlockChain) CurrentBlock() *types.Block
- func (bc *BlockChain) CurrentFastBlock() *types.Block
- func (bc *BlockChain) CurrentHeader() *types.Header
- func (bc *BlockChain) Engine() consensus.Engine
- func (bc *BlockChain) Export(w io.Writer) error
- func (bc *BlockChain) ExportN(w io.Writer, first uint64, last uint64) error
- func (bc *BlockChain) FastSyncCommitHead(hash common.Hash) error
- func (bc *BlockChain) GasLimit() uint64
- func (bc *BlockChain) Genesis() *types.Block
- func (bc *BlockChain) GetBlock(hash common.Hash, number uint64) *types.Block
- func (bc *BlockChain) GetBlockByHash(hash common.Hash) *types.Block
- func (bc *BlockChain) GetBlockByNumber(number uint64) *types.Block
- func (bc *BlockChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash
- func (bc *BlockChain) GetBlocksFromHash(hash common.Hash, n int) (blocks []*types.Block)
- func (bc *BlockChain) GetBody(hash common.Hash) *types.Body
- func (bc *BlockChain) GetBodyRLP(hash common.Hash) rlp.RawValue
- func (bc *BlockChain) GetHeader(hash common.Hash, number uint64) *types.Header
- func (bc *BlockChain) GetHeaderByHash(hash common.Hash) *types.Header
- func (bc *BlockChain) GetHeaderByNumber(number uint64) *types.Header
- func (bc *BlockChain) GetReceiptsByHash(hash common.Hash) types.Receipts
- func (bc *BlockChain) GetTd(hash common.Hash, number uint64) *big.Int
- func (bc *BlockChain) GetTdByHash(hash common.Hash) *big.Int
- func (bc *BlockChain) GetUnclesInChain(block *types.Block, length int) []*types.Header
- func (bc *BlockChain) HasBlock(hash common.Hash, number uint64) bool
- func (bc *BlockChain) HasBlockAndState(hash common.Hash, number uint64) bool
- func (bc *BlockChain) HasHeader(hash common.Hash, number uint64) bool
- func (bc *BlockChain) HasState(hash common.Hash) bool
- func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error)
- func (bc *BlockChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error)
- func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain []types.Receipts) (int, error)
- func (bc *BlockChain) PostChainEvents(events []interface{}, logs []*types.Log)
- func (bc *BlockChain) Processor() Processor
- func (bc *BlockChain) Reset() error
- func (bc *BlockChain) ResetWithGenesisBlock(genesis *types.Block) error
- func (bc *BlockChain) Rollback(chain []common.Hash)
- func (bc *BlockChain) SetHead(head uint64) error
- func (bc *BlockChain) SetProcessor(processor Processor)
- func (bc *BlockChain) SetValidator(validator Validator)
- func (bc *BlockChain) State() (*state.StateDB, error)
- func (bc *BlockChain) StateAt(root common.Hash) (*state.StateDB, error)
- func (bc *BlockChain) Stop()
- func (bc *BlockChain) SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription
- func (bc *BlockChain) SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription
- func (bc *BlockChain) SubscribeChainSideEvent(ch chan<- ChainSideEvent) event.Subscription
- func (bc *BlockChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription
- func (bc *BlockChain) SubscribeRemovedLogsEvent(ch chan<- RemovedLogsEvent) event.Subscription
- func (bc *BlockChain) TrieNode(hash common.Hash) ([]byte, error)
- func (bc *BlockChain) Validator() Validator
- func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types.Receipt, state *state.StateDB) (status WriteStatus, err error)
- func (bc *BlockChain) WriteBlockWithoutState(block *types.Block, td *big.Int) (err error)
- type BlockGen
- func (b *BlockGen) AddTx(tx *types.Transaction)
- func (b *BlockGen) AddTxWithChain(bc *BlockChain, tx *types.Transaction)
- func (b *BlockGen) AddUncheckedReceipt(receipt *types.Receipt)
- func (b *BlockGen) AddUncle(h *types.Header)
- func (b *BlockGen) Number() *big.Int
- func (b *BlockGen) OffsetTime(seconds int64)
- func (b *BlockGen) PrevBlock(index int) *types.Block
- func (b *BlockGen) SetCoinbase(addr common.Address)
- func (b *BlockGen) SetExtra(data []byte)
- func (b *BlockGen) TxNonce(addr common.Address) uint64
- type BlockValidator
- type CacheConfig
- type ChainContext
- type ChainEvent
- type ChainHeadEvent
- type ChainIndexer
- func (c *ChainIndexer) AddChildIndexer(indexer *ChainIndexer)
- func (c *ChainIndexer) AddKnownSectionHead(section uint64, shead common.Hash)
- func (c *ChainIndexer) Close() error
- func (c *ChainIndexer) SectionHead(section uint64) common.Hash
- func (c *ChainIndexer) Sections() (uint64, uint64, common.Hash)
- func (c *ChainIndexer) Start(chain ChainIndexerChain)
- type ChainIndexerBackend
- type ChainIndexerChain
- type ChainSideEvent
- type DeleteCallback
- type GasPool
- type Genesis
- type GenesisAccount
- type GenesisAlloc
- type GenesisMismatchError
- type HeaderChain
- func (hc *HeaderChain) Config() *params.ChainConfig
- func (hc *HeaderChain) CurrentHeader() *types.Header
- func (hc *HeaderChain) Engine() consensus.Engine
- func (hc *HeaderChain) GetBlock(hash common.Hash, number uint64) *types.Block
- func (hc *HeaderChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash
- func (hc *HeaderChain) GetBlockNumber(hash common.Hash) *uint64
- func (hc *HeaderChain) GetHeader(hash common.Hash, number uint64) *types.Header
- func (hc *HeaderChain) GetHeaderByHash(hash common.Hash) *types.Header
- func (hc *HeaderChain) GetHeaderByNumber(number uint64) *types.Header
- func (hc *HeaderChain) GetTd(hash common.Hash, number uint64) *big.Int
- func (hc *HeaderChain) GetTdByHash(hash common.Hash) *big.Int
- func (hc *HeaderChain) HasHeader(hash common.Hash, number uint64) bool
- func (hc *HeaderChain) InsertHeaderChain(chain []*types.Header, writeHeader WhCallback, start time.Time) (int, error)
- func (hc *HeaderChain) SetCurrentHeader(head *types.Header)
- func (hc *HeaderChain) SetGenesis(head *types.Header)
- func (hc *HeaderChain) SetHead(head uint64, delFn DeleteCallback)
- func (hc *HeaderChain) ValidateHeaderChain(chain []*types.Header, checkFreq int) (int, error)
- func (hc *HeaderChain) WriteHeader(header *types.Header) (status WriteStatus, err error)
- func (hc *HeaderChain) WriteTd(hash common.Hash, number uint64, td *big.Int) error
- type Message
- type NewMinedBlockEvent
- type NewTxsEvent
- type PendingLogsEvent
- type PendingStateEvent
- type Processor
- type RemovedLogsEvent
- type StateProcessor
- type StateTransition
- type TxPool
- func (pool *TxPool) AddLocal(tx *types.Transaction) error
- func (pool *TxPool) AddLocals(txs []*types.Transaction) []error
- func (pool *TxPool) AddRemote(tx *types.Transaction) error
- func (pool *TxPool) AddRemotes(txs []*types.Transaction) []error
- func (pool *TxPool) Content() (map[common.Address]types.Transactions, map[common.Address]types.Transactions)
- func (pool *TxPool) GasPrice() *big.Int
- func (pool *TxPool) Get(hash common.Hash) *types.Transaction
- func (pool *TxPool) Pending() (map[common.Address]types.Transactions, error)
- func (pool *TxPool) SetGasPrice(price *big.Int)
- func (pool *TxPool) State() *state.ManagedState
- func (pool *TxPool) Stats() (int, int)
- func (pool *TxPool) Status(hashes []common.Hash) []TxStatus
- func (pool *TxPool) Stop()
- func (pool *TxPool) SubscribeNewTxsEvent(ch chan<- NewTxsEvent) event.Subscription
- type TxPoolConfig
- type TxStatus
- type Validator
- type WhCallback
- type WriteStatus
Examples ¶
Constants ¶
const (
// BlockChainVersion ensures that an incompatible database forces a resync from scratch.
BlockChainVersion = 3
)
Variables ¶
var ( // ErrKnownBlock is returned when a block to import is already known locally. ErrKnownBlock = errors.New("block already known") // ErrGasLimitReached is returned by the gas pool if the amount of gas required // by a transaction is higher than what's left in the block. ErrGasLimitReached = errors.New("gas limit reached") // ErrBlacklistedHash is returned if a block to import is on the blacklist. ErrBlacklistedHash = errors.New("blacklisted hash") // ErrNonceTooHigh is returned if the nonce of a transaction is higher than the // next one expected based on the local chain. ErrNonceTooHigh = errors.New("nonce too high") )
var ( // ErrInvalidSender is returned if the transaction contains an invalid signature. ErrInvalidSender = errors.New("invalid sender") // ErrNonceTooLow is returned if the nonce of a transaction is lower than the // one present in the local chain. ErrNonceTooLow = errors.New("nonce too low") // ErrUnderpriced is returned if a transaction's gas price is below the minimum // configured for the transaction pool. ErrUnderpriced = errors.New("transaction underpriced") // ErrReplaceUnderpriced is returned if a transaction is attempted to be replaced // with a different one without the required price bump. ErrReplaceUnderpriced = errors.New("replacement transaction underpriced") // ErrInsufficientFunds is returned if the total cost of executing a transaction // is higher than the balance of the user's account. ErrInsufficientFunds = errors.New("insufficient funds for gas * price + value") // ErrIntrinsicGas is returned if the transaction is specified to use less gas // than required to start the invocation. ErrIntrinsicGas = errors.New("intrinsic gas too low") // ErrGasLimit is returned if a transaction's requested gas limit exceeds the // maximum allowance of the current block. ErrGasLimit = errors.New("exceeds block gas limit") // ErrNegativeValue is a sanity error to ensure noone is able to specify a // transaction with a negative value. ErrNegativeValue = errors.New("negative value") // ErrOversizedData is returned if the input data of a transaction is greater // than some meaningful limit a user might use. This is not a consensus error // making the transaction invalid, rather a DOS protection. ErrOversizedData = errors.New("oversized data") )
var BadHashes = map[common.Hash]bool{ common.HexToHash("05bef30ef572270f654746da22639a7a0c97dd97a7050b9e252391996aaeb689"): true, common.HexToHash("7d05d08cbc596a2e5e4f13b80a743e53e09221b5323c3a61946b20873e58583f"): true, }
BadHashes represent a set of manually tracked bad hashes (usually hard forks)
var DefaultTxPoolConfig = TxPoolConfig{ Journal: "transactions.rlp", Rejournal: time.Hour, PriceLimit: 1, PriceBump: 10, AccountSlots: 16, GlobalSlots: 4096, AccountQueue: 64, GlobalQueue: 1024, Lifetime: 3 * time.Hour, }
DefaultTxPoolConfig contains the default configurations for the transaction pool.
var (
ErrNoGenesis = errors.New("Genesis not found in chain")
)
Functions ¶
func ApplyMessage ¶
ApplyMessage computes the new state by applying the given message against the old state within the environment.
ApplyMessage returns the bytes returned by any EVM execution (if it took place), the gas used (which includes gas refunds) and an error if it failed. An error always indicates a core error meaning that the message would always fail for that particular state and would never be accepted within a block.
func ApplyTransaction ¶
func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, author *common.Address, gp *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *uint64, cfg vm.Config) (*types.Receipt, uint64, error)
ApplyTransaction attempts to apply a transaction to the given state database and uses the input parameters for its environment. It returns the receipt for the transaction, gas used and an error if the transaction failed, indicating the block was invalid.
func CalcGasLimit ¶
CalcGasLimit computes the gas limit of the next block after parent. This is miner strategy, not consensus protocol.
func CanTransfer ¶
CanTransfer checks wether there are enough funds in the address' account to make a transfer. This does not take the necessary gas in to account to make the transfer valid.
func GenerateChain ¶
func GenerateChain(config *params.ChainConfig, parent *types.Block, engine consensus.Engine, db ethdb.Database, n int, gen func(int, *BlockGen)) ([]*types.Block, []types.Receipts)
GenerateChain creates a chain of n blocks. The first block's parent will be the provided parent. db is used to store intermediate states and should contain the parent's state trie.
The generator function is called with a new block generator for every block. Any transactions and uncles added to the generator become part of the block. If gen is nil, the blocks will be empty and their coinbase will be the zero address.
Blocks created by GenerateChain do not contain valid proof of work values. Inserting them into BlockChain requires use of FakePow or a similar non-validating proof of work implementation.
Example ¶
var (
key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
key2, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a")
key3, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee")
addr1 = crypto.PubkeyToAddress(key1.PublicKey)
addr2 = crypto.PubkeyToAddress(key2.PublicKey)
addr3 = crypto.PubkeyToAddress(key3.PublicKey)
db = ethdb.NewMemDatabase()
)
// Ensure that key1 has some funds in the genesis block.
gspec := &Genesis{
Config: ¶ms.ChainConfig{HomesteadBlock: new(big.Int)},
Alloc: GenesisAlloc{addr1: {Balance: big.NewInt(1000000)}},
}
genesis := gspec.MustCommit(db)
// This call generates a chain of 5 blocks. The function runs for
// each block and adds different features to gen based on the
// block index.
signer := types.HomesteadSigner{}
chain, _ := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, 5, func(i int, gen *BlockGen) {
switch i {
case 0:
// In block 1, addr1 sends addr2 some ether.
tx, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr1), addr2, big.NewInt(10000), params.TxGas, nil, nil), signer, key1)
gen.AddTx(tx)
case 1:
// In block 2, addr1 sends some more ether to addr2.
// addr2 passes it on to addr3.
tx1, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr1), addr2, big.NewInt(1000), params.TxGas, nil, nil), signer, key1)
tx2, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr2), addr3, big.NewInt(1000), params.TxGas, nil, nil), signer, key2)
gen.AddTx(tx1)
gen.AddTx(tx2)
case 2:
// Block 3 is empty but was mined by addr3.
gen.SetCoinbase(addr3)
gen.SetExtra([]byte("yeehaw"))
case 3:
// Block 4 includes blocks 2 and 3 as uncle headers (with modified extra data).
b2 := gen.PrevBlock(1).Header()
b2.Extra = []byte("foo")
gen.AddUncle(b2)
b3 := gen.PrevBlock(2).Header()
b3.Extra = []byte("foo")
gen.AddUncle(b3)
}
})
// Import the chain. This runs all block validation rules.
blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
defer blockchain.Stop()
if i, err := blockchain.InsertChain(chain); err != nil {
fmt.Printf("insert error (block %d): %v\n", chain[i].NumberU64(), err)
return
}
state, _ := blockchain.State()
fmt.Printf("last block: #%d\n", blockchain.CurrentBlock().Number())
fmt.Println("balance of addr1:", state.GetBalance(addr1))
fmt.Println("balance of addr2:", state.GetBalance(addr2))
fmt.Println("balance of addr3:", state.GetBalance(addr3))
Output: last block: #5 balance of addr1: 989000 balance of addr2: 10000 balance of addr3: 19687500000000001000
func GenesisBlockForTesting ¶
GenesisBlockForTesting creates and writes a block in which addr has the given wei balance.
func IntrinsicGas ¶
IntrinsicGas computes the 'intrinsic gas' for a message with the given data.
func NewEVMContext ¶
func NewEVMContext(msg Message, header *types.Header, chain ChainContext, author *common.Address) vm.Context
NewEVMContext creates a new context for use in the EVM.
func SetReceiptsData ¶
SetReceiptsData computes all the non-consensus fields of the receipts
func SetupGenesisBlock ¶
func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error)
SetupGenesisBlock writes or updates the genesis block in db. The block that will be used is:
genesis == nil genesis != nil
+------------------------------------------
db has no genesis | main-net default | genesis
db has genesis | from DB | genesis (if compatible)
The stored chain configuration will be updated if it is compatible (i.e. does not specify a fork block below the local head block). In case of a conflict, the error is a *params.ConfigCompatError and the new, unwritten config is returned.
The returned chain configuration is never nil.
Types ¶
type BadBlockArgs ¶
BadBlockArgs represents the entries in the list returned when bad blocks are queried.
type BlockChain ¶
type BlockChain struct {
// contains filtered or unexported fields
}
BlockChain represents the canonical chain given a database with a genesis block. The Blockchain manages chain imports, reverts, chain reorganisations.
Importing blocks in to the block chain happens according to the set of rules defined by the two stage Validator. Processing of blocks is done using the Processor which processes the included transaction. The validation of the state is done in the second part of the Validator. Failing results in aborting of the import.
The BlockChain also helps in returning blocks from **any** chain included in the database as well as blocks that represents the canonical chain. It's important to note that GetBlock can return any block and does not need to be included in the canonical one where as GetBlockByNumber always represents the canonical chain.
func NewBlockChain ¶
func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *params.ChainConfig, engine consensus.Engine, vmConfig vm.Config) (*BlockChain, error)
NewBlockChain returns a fully initialised block chain using information available in the database. It initialises the default Ethereum Validator and Processor.
func (*BlockChain) BadBlocks ¶
func (bc *BlockChain) BadBlocks() ([]BadBlockArgs, error)
BadBlocks returns a list of the last 'bad blocks' that the client has seen on the network
func (*BlockChain) Config ¶
func (bc *BlockChain) Config() *params.ChainConfig
Config retrieves the blockchain's chain configuration.
func (*BlockChain) CurrentBlock ¶
func (bc *BlockChain) CurrentBlock() *types.Block
CurrentBlock retrieves the current head block of the canonical chain. The block is retrieved from the blockchain's internal cache.
func (*BlockChain) CurrentFastBlock ¶
func (bc *BlockChain) CurrentFastBlock() *types.Block
CurrentFastBlock retrieves the current fast-sync head block of the canonical chain. The block is retrieved from the blockchain's internal cache.
func (*BlockChain) CurrentHeader ¶
func (bc *BlockChain) CurrentHeader() *types.Header
CurrentHeader retrieves the current head header of the canonical chain. The header is retrieved from the HeaderChain's internal cache.
func (*BlockChain) Engine ¶
func (bc *BlockChain) Engine() consensus.Engine
Engine retrieves the blockchain's consensus engine.
func (*BlockChain) Export ¶
func (bc *BlockChain) Export(w io.Writer) error
Export writes the active chain to the given writer.
func (*BlockChain) FastSyncCommitHead ¶
func (bc *BlockChain) FastSyncCommitHead(hash common.Hash) error
FastSyncCommitHead sets the current head block to the one defined by the hash irrelevant what the chain contents were prior.
func (*BlockChain) GasLimit ¶
func (bc *BlockChain) GasLimit() uint64
GasLimit returns the gas limit of the current HEAD block.
func (*BlockChain) Genesis ¶
func (bc *BlockChain) Genesis() *types.Block
Genesis retrieves the chain's genesis block.
func (*BlockChain) GetBlock ¶
GetBlock retrieves a block from the database by hash and number, caching it if found.
func (*BlockChain) GetBlockByHash ¶
func (bc *BlockChain) GetBlockByHash(hash common.Hash) *types.Block
GetBlockByHash retrieves a block from the database by hash, caching it if found.
func (*BlockChain) GetBlockByNumber ¶
func (bc *BlockChain) GetBlockByNumber(number uint64) *types.Block
GetBlockByNumber retrieves a block from the database by number, caching it (associated with its hash) if found.
func (*BlockChain) GetBlockHashesFromHash ¶
GetBlockHashesFromHash retrieves a number of block hashes starting at a given hash, fetching towards the genesis block.
func (*BlockChain) GetBlocksFromHash ¶
GetBlocksFromHash returns the block corresponding to hash and up to n-1 ancestors. [deprecated by eth/62]
func (*BlockChain) GetBody ¶
func (bc *BlockChain) GetBody(hash common.Hash) *types.Body
GetBody retrieves a block body (transactions and uncles) from the database by hash, caching it if found.
func (*BlockChain) GetBodyRLP ¶
func (bc *BlockChain) GetBodyRLP(hash common.Hash) rlp.