Procházet zdrojové kódy

Fixed bloom, updated mining & block processing

* Reverted back to process blocks in batches method
* Bloom generation and lookup fix
* Minor UI changed (mainly debug)
obscuren před 11 roky
rodič
revize
cbeebcd47d

+ 2 - 2
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())
 					}

+ 7 - 7
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, bloom9(b))
+			bin.Or(bin, ethutil.BigD(bloom9(crypto.Sha3(b)).Bytes()))
 		}
+
+		//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
 }

+ 10 - 20
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

+ 5 - 1
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
 			}

+ 1 - 1
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
 	}
 

+ 1 - 1
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"});

+ 13 - 5
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: '<h3>Block details</h3>'; color: "#F2F2F2"}
 					Text { text: '<b>Block number:</b> ' + number + " (Size: " + size + ")"; color: "#F2F2F2"}
 					Text { text: '<b>Hash:</b> ' + hash; color: "#F2F2F2"}
+					Text { text: '<b>Bloom:</b> ' + bloom; color: "#F2F2F2"}
 					Text { text: '<b>Coinbase:</b> &lt;' + name + '&gt; ' + coinbase; color: "#F2F2F2"}
 					Text { text: '<b>Block found at:</b> ' + prettyTime; color: "#F2F2F2"}
 					Text { text: '<b>Gas used:</b> ' + 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;
 		}
 	}
 }

+ 0 - 2
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});
 						}
-						*/
 					}
 				}
 			}

+ 1 - 12
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 {

+ 5 - 1
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

+ 1 - 1
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)
 	}
 }

+ 26 - 3
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 <http://www.gnu.org/licenses/>.
+*/
+/**
+ * @authors
+ * 	Jeffrey Wilcke <i@jev.io>
+ * @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())

+ 0 - 1
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),

+ 4 - 0
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(),
 	}
 }