aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-01-09 23:19:16 +0800
committerobscuren <geffobscura@gmail.com>2014-01-09 23:19:16 +0800
commitd895f83136eccc7e440792fdb45fd4d40876d82e (patch)
treeac774926bdb194a3571e83ef99b9eaae0f655cd9
parentd2b3071b4d820b9530b3de891078970ea036767c (diff)
downloaddexon-d895f83136eccc7e440792fdb45fd4d40876d82e.tar.gz
dexon-d895f83136eccc7e440792fdb45fd4d40876d82e.tar.zst
dexon-d895f83136eccc7e440792fdb45fd4d40876d82e.zip
Dagger improvements
-rw-r--r--dagger.go52
-rw-r--r--dagger_test.go17
-rw-r--r--ethereum.go13
-rw-r--r--vm_test.go3
4 files changed, 66 insertions, 19 deletions
diff --git a/dagger.go b/dagger.go
index b161ef733..9fef78a36 100644
--- a/dagger.go
+++ b/dagger.go
@@ -14,7 +14,33 @@ type Dagger struct {
xn *big.Int
}
+var Found bool
+func (dag *Dagger) Find(obj *big.Int, resChan chan int64) {
+ r := rand.New(rand.NewSource(time.Now().UnixNano()))
+
+ for i := 0; i < 1000; i++ {
+ rnd := r.Int63()
+
+ if dag.Eval(big.NewInt(rnd)).Cmp(obj) < 0 {
+ // Post back result on the channel
+ resChan <- rnd
+ // Notify other threads we've found a valid nonce
+ Found = true
+ } else {
+ fmt.Printf(".")
+ }
+
+ // Break out if found
+ if Found { break }
+ }
+
+ resChan <- 0
+}
+
func (dag *Dagger) Search(diff *big.Int) *big.Int {
+ // TODO fix multi threading. Somehow it results in the wrong nonce
+ amountOfRoutines := 1
+
dag.hash = big.NewInt(0)
obj := BigPow(2, 256)
@@ -22,23 +48,25 @@ func (dag *Dagger) Search(diff *big.Int) *big.Int {
fmt.Println("diff", diff, "< objective", obj)
- r := rand.New(rand.NewSource(time.Now().UnixNano()))
- rnd := big.NewInt(r.Int63())
- fmt.Println("init rnd =", rnd)
+ Found = false
+ resChan := make(chan int64, 3)
+ var res int64
- for i := 0; i < 1000; i++ {
- if dag.Eval(rnd).Cmp(obj) < 0 {
- fmt.Println("Found result! nonce = ", rnd)
+ for k := 0; k < amountOfRoutines; k++ {
+ go dag.Find(obj, resChan)
+ }
- return rnd
- } else {
- fmt.Println("Not found :( nonce = ", rnd)
+ // Wait for each go routine to finish
+ for k := 0; k < amountOfRoutines; k++ {
+ // Get the result from the channel. 0 = quit
+ if r := <- resChan; r != 0 {
+ res = r
}
-
- rnd = rnd.Add(rnd, big.NewInt(1))
}
- return big.NewInt(0)
+ fmt.Println("\n")
+
+ return big.NewInt(res)
}
func DaggerVerify(hash, diff, nonce *big.Int) bool {
diff --git a/dagger_test.go b/dagger_test.go
new file mode 100644
index 000000000..7953ec1da
--- /dev/null
+++ b/dagger_test.go
@@ -0,0 +1,17 @@
+package main
+
+import (
+ "testing"
+ "math/big"
+)
+
+func BenchmarkDaggerSearch(b *testing.B) {
+ hash := big.NewInt(0)
+ diff := BigPow(2, 36)
+ o := big.NewInt(0) // nonce doesn't matter. We're only testing against speed, not validity
+
+ // Reset timer so the big generation isn't included in the benchmark
+ b.ResetTimer()
+ // Validate
+ DaggerVerify(hash, diff, o)
+}
diff --git a/ethereum.go b/ethereum.go
index b31ff751d..e3e5005eb 100644
--- a/ethereum.go
+++ b/ethereum.go
@@ -11,10 +11,10 @@ import (
const Debug = true
-var StartDBQueryInterface bool
+var StartConsole bool
var StartMining bool
func Init() {
- flag.BoolVar(&StartDBQueryInterface, "c", false, "console interface")
+ flag.BoolVar(&StartConsole, "c", false, "debug and testing console")
flag.BoolVar(&StartMining, "mine", false, "start dagger mining")
flag.Parse()
@@ -42,12 +42,13 @@ func main() {
Init()
- if StartDBQueryInterface {
- dbInterface := NewDBInterface()
- dbInterface.Start()
+ if StartConsole {
+ console := NewConsole()
+ console.Start()
} else if StartMining {
dagger := &Dagger{}
- dagger.Search(BigPow(2, 36))
+ res := dagger.Search(BigPow(2, 36))
+ fmt.Println("nonce =", res)
} else {
fmt.Println("[DBUG]: Starting Ethereum")
server, err := NewServer()
diff --git a/vm_test.go b/vm_test.go
index efcd875cd..cb70220e1 100644
--- a/vm_test.go
+++ b/vm_test.go
@@ -1,5 +1,6 @@
package main
+/*
import (
_"fmt"
"testing"
@@ -72,4 +73,4 @@ func TestVm(t *testing.T) {
bm := NewBlockManager()
bm.ProcessBlock( block )
}
-
+*/