forked from cerc-io/plugeth
Miner fixes and updates (including miner)
This commit is contained in:
parent
15f491e500
commit
c47866d251
@ -159,8 +159,6 @@ func (gui *Gui) Stop() {
|
|||||||
gui.win.Hide()
|
gui.win.Hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
gui.uiLib.jsEngine.Stop()
|
|
||||||
|
|
||||||
guilogger.Infoln("Stopped")
|
guilogger.Infoln("Stopped")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +58,8 @@ type UiLib struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib {
|
func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib {
|
||||||
lib := &UiLib{XEth: xeth.New(eth), engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth), filterCallbacks: make(map[int][]int)} //, filters: make(map[int]*xeth.JSFilter)}
|
x := xeth.New(eth)
|
||||||
|
lib := &UiLib{XEth: x, engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(x), filterCallbacks: make(map[int][]int)} //, filters: make(map[int]*xeth.JSFilter)}
|
||||||
lib.filterManager = filter.NewFilterManager(eth.EventMux())
|
lib.filterManager = filter.NewFilterManager(eth.EventMux())
|
||||||
go lib.filterManager.Start()
|
go lib.filterManager.Start()
|
||||||
|
|
||||||
|
@ -253,9 +253,6 @@ func (sm *BlockProcessor) ValidateHeader(block, parent *types.Header) error {
|
|||||||
return fmt.Errorf("Difficulty check failed for block %v, %v", block.Difficulty, expd)
|
return fmt.Errorf("Difficulty check failed for block %v, %v", block.Difficulty, expd)
|
||||||
}
|
}
|
||||||
|
|
||||||
//expl := CalcGasLimit(parent, block)
|
|
||||||
//if expl.Cmp(block.Header().GasLimit) != 0 {
|
|
||||||
|
|
||||||
// block.gasLimit - parent.gasLimit <= parent.gasLimit / 1024
|
// block.gasLimit - parent.gasLimit <= parent.gasLimit / 1024
|
||||||
a := new(big.Int).Sub(block.GasLimit, parent.GasLimit)
|
a := new(big.Int).Sub(block.GasLimit, parent.GasLimit)
|
||||||
b := new(big.Int).Div(parent.GasLimit, big.NewInt(1024))
|
b := new(big.Int).Div(parent.GasLimit, big.NewInt(1024))
|
||||||
@ -263,8 +260,8 @@ func (sm *BlockProcessor) ValidateHeader(block, parent *types.Header) error {
|
|||||||
return fmt.Errorf("GasLimit check failed for block %v (%v > %v)", block.GasLimit, a, b)
|
return fmt.Errorf("GasLimit check failed for block %v (%v > %v)", block.GasLimit, a, b)
|
||||||
}
|
}
|
||||||
|
|
||||||
if block.Time < parent.Time {
|
if block.Time <= parent.Time {
|
||||||
return ValidationError("Block timestamp not after prev block (%v - %v)", block.Time, parent.Time)
|
return ValidationError("Block timestamp not after or equal to prev block (%v - %v)", block.Time, parent.Time)
|
||||||
}
|
}
|
||||||
|
|
||||||
if int64(block.Time) > time.Now().Unix() {
|
if int64(block.Time) > time.Now().Unix() {
|
||||||
|
@ -31,15 +31,18 @@ type StateQuery interface {
|
|||||||
func CalcDifficulty(block, parent *types.Header) *big.Int {
|
func CalcDifficulty(block, parent *types.Header) *big.Int {
|
||||||
diff := new(big.Int)
|
diff := new(big.Int)
|
||||||
|
|
||||||
//adjust := new(big.Int).Rsh(parent.Difficulty(), 10)
|
min := big.NewInt(2048)
|
||||||
//if block.Time() >= parent.Time()+8 {
|
adjust := new(big.Int).Div(parent.Difficulty, min)
|
||||||
adjust := new(big.Int).Div(parent.Difficulty, big.NewInt(2048))
|
|
||||||
if (block.Time - parent.Time) < 8 {
|
if (block.Time - parent.Time) < 8 {
|
||||||
diff.Add(parent.Difficulty, adjust)
|
diff.Add(parent.Difficulty, adjust)
|
||||||
} else {
|
} else {
|
||||||
diff.Sub(parent.Difficulty, adjust)
|
diff.Sub(parent.Difficulty, adjust)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if diff.Cmp(GenesisDiff) < 0 {
|
||||||
|
return GenesisDiff
|
||||||
|
}
|
||||||
|
|
||||||
return diff
|
return diff
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -378,9 +381,12 @@ func (bc *ChainManager) Stop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *ChainManager) InsertChain(chain types.Blocks) error {
|
func (self *ChainManager) InsertChain(chain types.Blocks) error {
|
||||||
|
println("insert chain start")
|
||||||
self.tsmu.Lock()
|
self.tsmu.Lock()
|
||||||
defer self.tsmu.Unlock()
|
defer self.tsmu.Unlock()
|
||||||
|
|
||||||
|
defer println("insert chain end")
|
||||||
|
|
||||||
for _, block := range chain {
|
for _, block := range chain {
|
||||||
// Call in to the block processor and check for errors. It's likely that if one block fails
|
// Call in to the block processor and check for errors. It's likely that if one block fails
|
||||||
// all others will fail too (unless a known block is returned).
|
// all others will fail too (unless a known block is returned).
|
||||||
@ -422,14 +428,18 @@ func (self *ChainManager) InsertChain(chain types.Blocks) error {
|
|||||||
self.mu.Unlock()
|
self.mu.Unlock()
|
||||||
|
|
||||||
if canonical {
|
if canonical {
|
||||||
jsonlogger.LogJson(&logger.EthChainNewHead{
|
/*
|
||||||
BlockHash: ethutil.Bytes2Hex(block.Hash()),
|
jsonlogger.LogJson(&logger.EthChainNewHead{
|
||||||
BlockNumber: block.Number(),
|
BlockHash: ethutil.Bytes2Hex(block.Hash()),
|
||||||
ChainHeadHash: ethutil.Bytes2Hex(cblock.Hash()),
|
BlockNumber: block.Number(),
|
||||||
BlockPrevHash: ethutil.Bytes2Hex(block.ParentHash()),
|
ChainHeadHash: ethutil.Bytes2Hex(cblock.Hash()),
|
||||||
})
|
BlockPrevHash: ethutil.Bytes2Hex(block.ParentHash()),
|
||||||
|
})
|
||||||
|
*/
|
||||||
self.setTransState(state.New(block.Root(), self.db))
|
self.setTransState(state.New(block.Root(), self.db))
|
||||||
self.eventMux.Post(ChainEvent{block, td})
|
self.eventMux.Post(ChainEvent{block, td})
|
||||||
|
} else {
|
||||||
|
//self.eventMux.
|
||||||
}
|
}
|
||||||
|
|
||||||
if split {
|
if split {
|
||||||
|
@ -22,8 +22,10 @@ var ZeroHash512 = make([]byte, 64)
|
|||||||
var EmptyShaList = crypto.Sha3(ethutil.Encode([]interface{}{}))
|
var EmptyShaList = crypto.Sha3(ethutil.Encode([]interface{}{}))
|
||||||
var EmptyListRoot = crypto.Sha3(ethutil.Encode(""))
|
var EmptyListRoot = crypto.Sha3(ethutil.Encode(""))
|
||||||
|
|
||||||
|
var GenesisDiff = big.NewInt(131072)
|
||||||
|
|
||||||
func GenesisBlock(db ethutil.Database) *types.Block {
|
func GenesisBlock(db ethutil.Database) *types.Block {
|
||||||
genesis := types.NewBlock(ZeroHash256, ZeroHash160, nil, big.NewInt(2048), 42, "")
|
genesis := types.NewBlock(ZeroHash256, ZeroHash160, nil, GenesisDiff, 42, "")
|
||||||
genesis.Header().Number = ethutil.Big0
|
genesis.Header().Number = ethutil.Big0
|
||||||
genesis.Header().GasLimit = big.NewInt(1000000)
|
genesis.Header().GasLimit = big.NewInt(1000000)
|
||||||
genesis.Header().GasUsed = ethutil.Big0
|
genesis.Header().GasUsed = ethutil.Big0
|
||||||
@ -53,7 +55,6 @@ func GenesisBlock(db ethutil.Database) *types.Block {
|
|||||||
}
|
}
|
||||||
statedb.Sync()
|
statedb.Sync()
|
||||||
genesis.Header().Root = statedb.Root()
|
genesis.Header().Root = statedb.Root()
|
||||||
fmt.Println(genesis)
|
|
||||||
|
|
||||||
return genesis
|
return genesis
|
||||||
}
|
}
|
||||||
|
@ -40,12 +40,12 @@ type Header struct {
|
|||||||
Time uint64
|
Time uint64
|
||||||
// Extra data
|
// Extra data
|
||||||
Extra string
|
Extra string
|
||||||
// Nonce
|
|
||||||
Nonce []byte
|
|
||||||
// Mix digest for quick checking to prevent DOS
|
|
||||||
MixDigest ethutil.Bytes
|
|
||||||
// SeedHash used for light client verification
|
// SeedHash used for light client verification
|
||||||
SeedHash ethutil.Bytes
|
SeedHash ethutil.Bytes
|
||||||
|
// Mix digest for quick checking to prevent DOS
|
||||||
|
MixDigest ethutil.Bytes
|
||||||
|
// Nonce
|
||||||
|
Nonce []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Header) rlpData(withNonce bool) []interface{} {
|
func (self *Header) rlpData(withNonce bool) []interface{} {
|
||||||
@ -62,9 +62,11 @@ func (self *Header) rlpData(withNonce bool) []interface{} {
|
|||||||
self.GasLimit,
|
self.GasLimit,
|
||||||
self.GasUsed,
|
self.GasUsed,
|
||||||
self.Time,
|
self.Time,
|
||||||
self.Extra}
|
self.Extra,
|
||||||
|
self.SeedHash,
|
||||||
|
}
|
||||||
if withNonce {
|
if withNonce {
|
||||||
fields = append(fields, self.SeedHash, self.MixDigest, self.Nonce)
|
fields = append(fields, self.MixDigest, self.Nonce)
|
||||||
}
|
}
|
||||||
|
|
||||||
return fields
|
return fields
|
||||||
|
@ -19,7 +19,6 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/p2p"
|
"github.com/ethereum/go-ethereum/p2p"
|
||||||
"github.com/ethereum/go-ethereum/p2p/discover"
|
"github.com/ethereum/go-ethereum/p2p/discover"
|
||||||
"github.com/ethereum/go-ethereum/p2p/nat"
|
"github.com/ethereum/go-ethereum/p2p/nat"
|
||||||
"github.com/ethereum/go-ethereum/pow/ezp"
|
|
||||||
"github.com/ethereum/go-ethereum/rpc"
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
"github.com/ethereum/go-ethereum/whisper"
|
"github.com/ethereum/go-ethereum/whisper"
|
||||||
)
|
)
|
||||||
@ -189,7 +188,7 @@ func New(config *Config) (*Ethereum, error) {
|
|||||||
|
|
||||||
hasBlock := eth.chainManager.HasBlock
|
hasBlock := eth.chainManager.HasBlock
|
||||||
insertChain := eth.chainManager.InsertChain
|
insertChain := eth.chainManager.InsertChain
|
||||||
eth.blockPool = blockpool.New(hasBlock, insertChain, ezp.Verify)
|
eth.blockPool = blockpool.New(hasBlock, insertChain, pow.Verify)
|
||||||
|
|
||||||
netprv, err := config.nodeKey()
|
netprv, err := config.nodeKey()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -250,7 +250,7 @@ func (self *ethProtocol) handle() error {
|
|||||||
return self.protoError(ErrDecode, "msg %v: %v", msg, err)
|
return self.protoError(ErrDecode, "msg %v: %v", msg, err)
|
||||||
}
|
}
|
||||||
hash := request.Block.Hash()
|
hash := request.Block.Hash()
|
||||||
fmt.Println("received block: %x", hash)
|
fmt.Printf("received block: %x\n", hash)
|
||||||
_, chainHead, _ := self.chainManager.Status()
|
_, chainHead, _ := self.chainManager.Status()
|
||||||
|
|
||||||
jsonlogger.LogJson(&logger.EthChainReceivedNewBlock{
|
jsonlogger.LogJson(&logger.EthChainReceivedNewBlock{
|
||||||
|
@ -25,12 +25,13 @@ func Big(num string) *big.Int {
|
|||||||
// BigD
|
// BigD
|
||||||
//
|
//
|
||||||
// Shortcut for new(big.Int).SetBytes(...)
|
// Shortcut for new(big.Int).SetBytes(...)
|
||||||
func BigD(data []byte) *big.Int {
|
func Bytes2Big(data []byte) *big.Int {
|
||||||
n := new(big.Int)
|
n := new(big.Int)
|
||||||
n.SetBytes(data)
|
n.SetBytes(data)
|
||||||
|
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
func BigD(data []byte) *big.Int { return Bytes2Big(data) }
|
||||||
|
|
||||||
func BitTest(num *big.Int, i int) bool {
|
func BitTest(num *big.Int, i int) bool {
|
||||||
return num.Bit(i) > 0
|
return num.Bit(i) > 0
|
||||||
|
@ -7,6 +7,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/ethereum/ethash"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/ethutil"
|
"github.com/ethereum/go-ethereum/ethutil"
|
||||||
@ -138,7 +139,7 @@ out:
|
|||||||
}
|
}
|
||||||
break out
|
break out
|
||||||
case <-timer.C:
|
case <-timer.C:
|
||||||
minerlogger.Debugln("Hash rate:", self.HashRate(), "Khash")
|
minerlogger.Infoln("Hash rate:", self.HashRate(), "Khash")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,7 +165,6 @@ func (self *worker) wait() {
|
|||||||
|
|
||||||
if err := self.chain.InsertChain(types.Blocks{self.current.block}); err == nil {
|
if err := self.chain.InsertChain(types.Blocks{self.current.block}); err == nil {
|
||||||
self.mux.Post(core.NewMinedBlockEvent{self.current.block})
|
self.mux.Post(core.NewMinedBlockEvent{self.current.block})
|
||||||
fmt.Println("GOOD BLOCK", self.current.block)
|
|
||||||
} else {
|
} else {
|
||||||
self.commitNewWork()
|
self.commitNewWork()
|
||||||
}
|
}
|
||||||
@ -190,7 +190,11 @@ func (self *worker) commitNewWork() {
|
|||||||
self.mu.Lock()
|
self.mu.Lock()
|
||||||
defer self.mu.Unlock()
|
defer self.mu.Unlock()
|
||||||
|
|
||||||
self.current = env(self.chain.NewBlock(self.coinbase), self.eth)
|
block := self.chain.NewBlock(self.coinbase)
|
||||||
|
seednum := ethash.GetSeedBlockNum(block.NumberU64())
|
||||||
|
block.Header().SeedHash = self.chain.GetBlockByNumber(seednum).SeedHash()
|
||||||
|
|
||||||
|
self.current = env(block, self.eth)
|
||||||
parent := self.chain.GetBlock(self.current.block.ParentHash())
|
parent := self.chain.GetBlock(self.current.block.ParentHash())
|
||||||
self.current.coinbase.SetGasPool(core.CalcGasLimit(parent, self.current.block))
|
self.current.coinbase.SetGasPool(core.CalcGasLimit(parent, self.current.block))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user