forked from cerc-io/plugeth
115 lines
3.5 KiB
Go
115 lines
3.5 KiB
Go
package main
|
|
|
|
import(
|
|
"errors"
|
|
"math/big"
|
|
|
|
"github.com/openrelayxyz/plugeth-utils/core"
|
|
"github.com/openrelayxyz/plugeth-utils/restricted"
|
|
"github.com/openrelayxyz/plugeth-utils/restricted/types"
|
|
"github.com/openrelayxyz/plugeth-utils/restricted/hasher"
|
|
"github.com/openrelayxyz/plugeth-utils/restricted/consensus"
|
|
"github.com/openrelayxyz/plugeth-utils/restricted/params"
|
|
)
|
|
|
|
var (
|
|
pl core.PluginLoader
|
|
backend restricted.Backend
|
|
log core.Logger
|
|
events core.Feed
|
|
createEngineCalled bool
|
|
)
|
|
|
|
var httpApiFlagName = "http.api"
|
|
|
|
func Initialize(ctx core.Context, loader core.PluginLoader, logger core.Logger) {
|
|
pl = loader
|
|
events = pl.GetFeed()
|
|
log = logger
|
|
v := ctx.String(httpApiFlagName)
|
|
if v != "" {
|
|
ctx.Set(httpApiFlagName, v+",plugeth")
|
|
} else {
|
|
ctx.Set(httpApiFlagName, "eth,net,web3,plugeth")
|
|
log.Info("Loaded consensus engine plugin")
|
|
}
|
|
}
|
|
|
|
type engine struct {
|
|
}
|
|
|
|
func (e *engine) Author(header *types.Header) (core.Address, error) {
|
|
return header.Coinbase, nil
|
|
}
|
|
func (e *engine) VerifyHeader(chain consensus.ChainHeaderReader, header *types.Header, seal bool) error {
|
|
return nil
|
|
}
|
|
func (e *engine) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*types.Header, seals []bool) (chan<- struct{}, <-chan error) {
|
|
quit := make(chan struct{})
|
|
err := make(chan error)
|
|
go func () {
|
|
for i, h := range headers {
|
|
select {
|
|
case <-quit:
|
|
return
|
|
case err<- e.VerifyHeader(chain, h, seals[i]):
|
|
}
|
|
}
|
|
} ()
|
|
return quit, err
|
|
}
|
|
func (e *engine) VerifyUncles(chain consensus.ChainReader, block *types.Block) error {
|
|
return nil
|
|
}
|
|
func (e *engine) Prepare(chain consensus.ChainHeaderReader, header *types.Header) error {
|
|
if header.BaseFee == nil {
|
|
header.BaseFee = new(big.Int)
|
|
|
|
}
|
|
header.Difficulty = new(big.Int).SetUint64(123456789)
|
|
header.UncleHash = core.HexToHash("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347")
|
|
return nil
|
|
}
|
|
func (e *engine) Finalize(chain consensus.ChainHeaderReader, header *types.Header, state core.RWStateDB, txs []*types.Transaction,uncles []*types.Header, withdrawals []*types.Withdrawal) {
|
|
}
|
|
func (e *engine) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *types.Header, state core.RWStateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt, withdrawals []*types.Withdrawal) (*types.Block, error) {
|
|
if header.BaseFee == nil {
|
|
header.BaseFee = new(big.Int)
|
|
|
|
}
|
|
header.Root = state.IntermediateRoot(false)
|
|
hasher := hasher.NewStackTrie(nil)
|
|
block := types.NewBlockWithWithdrawals(header, txs, uncles, receipts, withdrawals, hasher)
|
|
return block, nil
|
|
|
|
}
|
|
func (e *engine) Seal(chain consensus.ChainHeaderReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}) error {
|
|
if len(block.Transactions()) == 0 {
|
|
return errors.New("sealing paused while waiting for transactions")
|
|
}
|
|
go func () {
|
|
results <- block
|
|
close(results)
|
|
} ()
|
|
// TO DO: the stop channel will need to be addressed in a non test case scenerio
|
|
return nil
|
|
}
|
|
func (e *engine) SealHash(header *types.Header) core.Hash {
|
|
return header.Hash()
|
|
}
|
|
func (e *engine) CalcDifficulty(chain consensus.ChainHeaderReader, time uint64, parent *types.Header) *big.Int {
|
|
return new(big.Int).SetUint64(uint64(123456789))
|
|
}
|
|
func (e *engine) APIs(chain consensus.ChainHeaderReader) []core.API {
|
|
return []core.API{}
|
|
}
|
|
func (e *engine) Close() error {
|
|
return nil
|
|
}
|
|
|
|
func CreateEngine(chainConfig *params.ChainConfig, db restricted.Database) consensus.Engine {
|
|
createEngineCalled = true
|
|
return &engine{}
|
|
}
|
|
|