aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-11-10 08:17:31 +0800
committerobscuren <geffobscura@gmail.com>2014-11-10 08:17:31 +0800
commitcbeebcd47da846e1b8990313f1ff1ffe7d0bf00f (patch)
tree95db04f468e66ebb26afd81bc72abea8fbcf7c0e
parentf538ea25e46d59dfa225ed105343d9c6a9909c2c (diff)
downloadgo-tangerine-cbeebcd47da846e1b8990313f1ff1ffe7d0bf00f.tar.gz
go-tangerine-cbeebcd47da846e1b8990313f1ff1ffe7d0bf00f.tar.zst
go-tangerine-cbeebcd47da846e1b8990313f1ff1ffe7d0bf00f.zip
Fixed bloom, updated mining & block processing
* Reverted back to process blocks in batches method * Bloom generation and lookup fix * Minor UI changed (mainly debug)
-rw-r--r--block_pool.go4
-rw-r--r--chain/bloom9.go14
-rw-r--r--chain/chain_manager.go30
-rw-r--r--chain/filter.go6
-rw-r--r--chain/transaction.go2
-rw-r--r--cmd/mist/assets/qml/main.qml2
-rw-r--r--cmd/mist/assets/qml/views/chain.qml18
-rw-r--r--cmd/mist/assets/qml/views/miner.qml2
-rw-r--r--cmd/mist/gui.go13
-rw-r--r--cmd/mist/ui_lib.go6
-rw-r--r--ethereum.go2
-rw-r--r--miner/miner.go29
-rw-r--r--peer.go1
-rw-r--r--xeth/js_types.go4
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, 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
}
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: '<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;
}
}
}
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 <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())
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(),
}
}