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) - - return rnd - } else { - fmt.Println("Not found :( nonce = ", rnd) - } - - rnd = rnd.Add(rnd, big.NewInt(1)) + for k := 0; k < amountOfRoutines; k++ { + go dag.Find(obj, resChan) } - return big.NewInt(0) + // 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 + } + } + + 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 ) } - +*/