From cbeebcd47da846e1b8990313f1ff1ffe7d0bf00f Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 10 Nov 2014 01:17:31 +0100 Subject: [PATCH] Fixed bloom, updated mining & block processing * Reverted back to process blocks in batches method * Bloom generation and lookup fix * Minor UI changed (mainly debug) --- block_pool.go | 4 ++-- chain/bloom9.go | 14 +++++++------- chain/chain_manager.go | 30 ++++++++++------------------- chain/filter.go | 6 +++++- chain/transaction.go | 2 +- cmd/mist/assets/qml/main.qml | 2 +- cmd/mist/assets/qml/views/chain.qml | 18 ++++++++++++----- cmd/mist/assets/qml/views/miner.qml | 2 -- cmd/mist/gui.go | 13 +------------ cmd/mist/ui_lib.go | 6 +++++- ethereum.go | 2 +- miner/miner.go | 29 +++++++++++++++++++++++++--- peer.go | 1 - xeth/js_types.go | 4 ++++ 14 files changed, 76 insertions(+), 57 deletions(-) diff --git a/block_pool.go b/block_pool.go index ec945fa6e..52f2f4f86 100644 --- a/block_pool.go +++ b/block_pool.go @@ -317,7 +317,7 @@ out: chainManager := self.eth.ChainManager() // Test and import chain := chain.NewChain(blocks) - _, err := chainManager.TestChain(chain, true) + _, err := chainManager.TestChain(chain) if err != nil { poollogger.Debugln(err) @@ -330,7 +330,7 @@ out: self.td = ethutil.Big0 self.peer = nil } else { - //chainManager.InsertChain(chain) + chainManager.InsertChain(chain) for _, block := range blocks { self.Remove(block.Hash()) } diff --git a/chain/bloom9.go b/chain/bloom9.go index 2bbc9409d..4c029b56b 100644 --- a/chain/bloom9.go +++ b/chain/bloom9.go @@ -21,18 +21,18 @@ func CreateBloom(block *Block) []byte { func LogsBloom(logs state.Logs) *big.Int { bin := new(big.Int) for _, log := range logs { - data := [][]byte{crypto.Sha3(log.Address)} + data := [][]byte{log.Address} for _, topic := range log.Topics { data = append(data, topic) } - if log.Data != nil { - data = append(data, log.Data) + for _, b := range data { + bin.Or(bin, ethutil.BigD(bloom9(crypto.Sha3(b)).Bytes())) } - for _, b := range data { - bin.Or(bin, bloom9(b)) - } + //if log.Data != nil { + // data = append(data, log.Data) + //} } return bin @@ -51,7 +51,7 @@ func bloom9(b []byte) *big.Int { func BloomLookup(bin, topic []byte) bool { bloom := ethutil.BigD(bin) - cmp := bloom9(topic) + cmp := bloom9(crypto.Sha3(topic)) return bloom.And(bloom, cmp).Cmp(cmp) == 0 } diff --git a/chain/chain_manager.go b/chain/chain_manager.go index 5e62e6771..18961400c 100644 --- a/chain/chain_manager.go +++ b/chain/chain_manager.go @@ -138,6 +138,7 @@ func (self *ChainManager) GetChainHashesFromHash(hash []byte, max uint64) (chain // XXX Could be optimised by using a different database which only holds hashes (i.e., linked list) for i := uint64(0); i < max; i++ { + chain = append(chain, block.Hash()) if block.Number.Cmp(ethutil.Big0) <= 0 { @@ -321,32 +322,28 @@ func NewChain(blocks Blocks) *BlockChain { } // This function assumes you've done your checking. No checking is done at this stage anymore -/* func (self *ChainManager) InsertChain(chain *BlockChain) { for e := chain.Front(); e != nil; e = e.Next() { link := e.Value.(*link) self.SetTotalDifficulty(link.td) self.add(link.block) + self.Ethereum.EventMux().Post(NewBlockEvent{link.block}) } } -*/ -func (self *ChainManager) TestChain(chain *BlockChain, imp bool) (td *big.Int, err error) { +func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error) { self.workingChain = chain for e := chain.Front(); e != nil; e = e.Next() { var ( l = e.Value.(*link) block = l.block - parent *Block - prev = e.Prev() - ) - if prev == nil { parent = self.GetBlock(block.PrevHash) - } else { - parent = prev.Value.(*link).block - } + ) + + //fmt.Println("parent", parent) + //fmt.Println("current", block) if parent == nil { err = fmt.Errorf("incoming chain broken on hash %x\n", block.PrevHash[0:4]) @@ -363,18 +360,11 @@ func (self *ChainManager) TestChain(chain *BlockChain, imp bool) (td *big.Int, e return } l.td = td - - if imp { - self.SetTotalDifficulty(td) - self.add(block) - } } - if !imp { - if td.Cmp(self.TD) <= 0 { - err = &TDError{td, self.TD} - return - } + if td.Cmp(self.TD) <= 0 { + err = &TDError{td, self.TD} + return } self.workingChain = nil diff --git a/chain/filter.go b/chain/filter.go index 3494e4dcc..71e32c32f 100644 --- a/chain/filter.go +++ b/chain/filter.go @@ -2,8 +2,11 @@ package chain import ( "bytes" + "fmt" "math" + "math/big" + "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/state" ) @@ -99,6 +102,7 @@ func (self *Filter) Find() []*state.Message { // Use bloom filtering to see if this block is interesting given the // current parameters if self.bloomFilter(block) { + fmt.Println("block", block.Number, "has something interesting") // Get the messages of the block msgs, err := self.eth.BlockManager().GetMessages(block) if err != nil { @@ -184,7 +188,7 @@ func (self *Filter) bloomFilter(block *Block) bool { if len(self.to) > 0 { for _, to := range self.to { - if BloomLookup(block.LogsBloom, to) { + if BloomLookup(block.LogsBloom, ethutil.U256(new(big.Int).Add(ethutil.Big1, ethutil.BigD(to))).Bytes()) { toIncluded = true break } diff --git a/chain/transaction.go b/chain/transaction.go index d393f0384..d2d6a8e14 100644 --- a/chain/transaction.go +++ b/chain/transaction.go @@ -117,7 +117,7 @@ func (tx *Transaction) Sender() []byte { // Validate the returned key. // Return nil if public key isn't in full format - if pubkey[0] != 4 { + if len(pubkey) != 0 && pubkey[0] != 4 { return nil } diff --git a/cmd/mist/assets/qml/main.qml b/cmd/mist/assets/qml/main.qml index d2a8d1d63..9f1f214a6 100644 --- a/cmd/mist/assets/qml/main.qml +++ b/cmd/mist/assets/qml/main.qml @@ -46,8 +46,8 @@ ApplicationWindow { Component.onCompleted: { var wallet = addPlugin("./views/wallet.qml", {noAdd: true, close: false, section: "ethereum", active: true}); var browser = addPlugin("./webapp.qml", {noAdd: true, close: false, section: "ethereum", active: true}); - var browser = addPlugin("./views/miner.qml", {noAdd: true, close: false, section: "ethereum", active: true}); root.browser = browser; + addPlugin("./views/miner.qml", {noAdd: true, close: false, section: "ethereum", active: true}); addPlugin("./views/transaction.qml", {noAdd: true, close: false, section: "legacy"}); addPlugin("./views/chain.qml", {noAdd: true, close: false, section: "legacy"}); diff --git a/cmd/mist/assets/qml/views/chain.qml b/cmd/mist/assets/qml/views/chain.qml index c4ceecfc0..6baf757a5 100644 --- a/cmd/mist/assets/qml/views/chain.qml +++ b/cmd/mist/assets/qml/views/chain.qml @@ -109,9 +109,9 @@ Rectangle { } if(initial){ - blockModel.append({size: block.size, number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)}) + blockModel.append({raw: block.raw, bloom: block.bloom, size: block.size, number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)}) } else { - blockModel.insert(0, {size: block.size, number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)}) + blockModel.insert(0, {bloom: block.bloom, size: block.size, number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)}) } } @@ -136,6 +136,7 @@ Rectangle { Text { text: '

Block details

'; color: "#F2F2F2"} Text { text: 'Block number: ' + number + " (Size: " + size + ")"; color: "#F2F2F2"} Text { text: 'Hash: ' + hash; color: "#F2F2F2"} + Text { text: 'Bloom: ' + bloom; color: "#F2F2F2"} Text { text: 'Coinbase: <' + name + '> ' + coinbase; color: "#F2F2F2"} Text { text: 'Block found at: ' + prettyTime; color: "#F2F2F2"} Text { text: 'Gas used: ' + gasUsed + " / " + gasLimit; color: "#F2F2F2"} @@ -222,11 +223,17 @@ Rectangle { text: "Contract" anchors.top: contractLabel.bottom anchors.left: parent.left - anchors.bottom: popup.bottom + anchors.right: parent.right wrapMode: Text.Wrap - width: parent.width - 30 height: 80 - anchors.leftMargin: 10 + } + TextArea { + id: dumpData + anchors.top: contractData.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 300 } } property var transactionModel: ListModel { @@ -248,6 +255,7 @@ Rectangle { } } txView.forceActiveFocus() + dumpData.text = bl.raw; } } } diff --git a/cmd/mist/assets/qml/views/miner.qml b/cmd/mist/assets/qml/views/miner.qml index e162d60a4..2d59bb3a4 100644 --- a/cmd/mist/assets/qml/views/miner.qml +++ b/cmd/mist/assets/qml/views/miner.qml @@ -119,14 +119,12 @@ Rectangle { } } Component.onCompleted: { - /* interface test stuff // XXX Temp. replace with above eventually var tmpItems = ["JEVCoin", "Some coin", "Other coin", "Etc coin"]; var address = "e6716f9544a56c530d868e4bfbacb172315bdead"; for (var i = 0; i < tmpItems.length; i++) { mergedMiningModel.append({checked: false, name: tmpItems[i], address: address, id: 0, itemId: i}); } - */ } } } diff --git a/cmd/mist/gui.go b/cmd/mist/gui.go index 295011244..7e867395e 100644 --- a/cmd/mist/gui.go +++ b/cmd/mist/gui.go @@ -250,17 +250,6 @@ func (gui *Gui) setInitialChainManager() { blk := gui.eth.ChainManager().GetBlock(sBlk) for ; blk != nil; blk = gui.eth.ChainManager().GetBlock(sBlk) { sBlk = blk.PrevHash - addr := gui.address() - - // Loop through all transactions to see if we missed any while being offline - for _, tx := range blk.Transactions() { - if bytes.Compare(tx.Sender(), addr) == 0 || bytes.Compare(tx.Recipient, addr) == 0 { - if ok, _ := gui.txDb.Get(tx.Hash()); ok == nil { - gui.txDb.Put(tx.Hash(), tx.RlpEncode()) - } - - } - } gui.processBlock(blk, true) } @@ -404,7 +393,7 @@ func (gui *Gui) update() { gui.loadAddressBook() gui.loadMergedMiningOptions() gui.setPeerInfo() - gui.readPreviousTransactions() + //gui.readPreviousTransactions() }() for _, plugin := range gui.plugins { diff --git a/cmd/mist/ui_lib.go b/cmd/mist/ui_lib.go index bdf551325..4e480144f 100644 --- a/cmd/mist/ui_lib.go +++ b/cmd/mist/ui_lib.go @@ -229,7 +229,11 @@ func (self *UiLib) NewFilter(object map[string]interface{}) (id int) { func (self *UiLib) NewFilterString(typ string) (id int) { filter := chain.NewFilter(self.eth) filter.BlockCallback = func(block *chain.Block) { - self.win.Root().Call("invokeFilterCallback", "{}", id) + if self.win != nil && self.win.Root() != nil { + self.win.Root().Call("invokeFilterCallback", "{}", id) + } else { + fmt.Println("QML is lagging") + } } id = self.eth.InstallFilter(filter) return id diff --git a/ethereum.go b/ethereum.go index 54949d195..a919c3191 100644 --- a/ethereum.go +++ b/ethereum.go @@ -419,6 +419,7 @@ func (s *Ethereum) Start(seed bool) { if seed { s.Seed() } + s.ConnectToPeer("localhost:40404") loggerger.Infoln("Server started") } @@ -471,7 +472,6 @@ func (s *Ethereum) Seed() { s.ProcessPeerList(peers) } - // XXX tmp s.ConnectToPeer(seedNodeAddress) } } diff --git a/miner/miner.go b/miner/miner.go index 2ab74e516..a678a6895 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -1,3 +1,26 @@ +/* + This file is part of go-ethereum + + go-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + go-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with go-ethereum. If not, see . +*/ +/** + * @authors + * Jeffrey Wilcke + * @date 2014 + * + */ + package miner import ( @@ -190,12 +213,12 @@ func (self *Miner) mine() { if nonce != nil { block.Nonce = nonce lchain := chain.NewChain(chain.Blocks{block}) - _, err := chainMan.TestChain(lchain, true) + _, err := chainMan.TestChain(lchain) if err != nil { minerlogger.Infoln(err) } else { - //chainMan.InsertChain(lchain) - self.eth.EventMux().Post(chain.NewBlockEvent{block}) + chainMan.InsertChain(lchain) + //self.eth.EventMux().Post(chain.NewBlockEvent{block}) self.eth.Broadcast(wire.MsgBlockTy, []interface{}{block.Value().Val}) minerlogger.Infof("🔨 Mined block %x\n", block.Hash()) diff --git a/peer.go b/peer.go index e0b2f7355..c8fee2db4 100644 --- a/peer.go +++ b/peer.go @@ -673,7 +673,6 @@ func (p *Peer) pushPeers() { } func (self *Peer) pushStatus() { - fmt.Println("push status") msg := wire.NewMessage(wire.MsgStatusTy, []interface{}{ uint32(ProtocolVersion), uint32(NetVersion), diff --git a/xeth/js_types.go b/xeth/js_types.go index 1a1938648..ff240e21c 100644 --- a/xeth/js_types.go +++ b/xeth/js_types.go @@ -26,6 +26,8 @@ type JSBlock struct { GasLimit string `json:"gasLimit"` GasUsed string `json:"gasUsed"` PrevHash string `json:"prevHash"` + Bloom string `json:"bloom"` + Raw string `json:"raw"` } // Creates a new QML Block from a chain block @@ -54,6 +56,8 @@ func NewJSBlock(block *chain.Block) *JSBlock { Time: block.Time, Coinbase: ethutil.Bytes2Hex(block.Coinbase), PrevHash: ethutil.Bytes2Hex(block.PrevHash), + Bloom: ethutil.Bytes2Hex(block.LogsBloom), + Raw: block.String(), } }