good morning!!!!

Skip to content
Snippets Groups Projects
Commit d895f831 authored by Jeffrey Wilcke's avatar Jeffrey Wilcke
Browse files

Dagger improvements

parent d2b3071b
Branches
Tags
No related merge requests found
...@@ -14,7 +14,33 @@ type Dagger struct { ...@@ -14,7 +14,33 @@ type Dagger struct {
xn *big.Int 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 { 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) dag.hash = big.NewInt(0)
obj := BigPow(2, 256) obj := BigPow(2, 256)
...@@ -22,23 +48,25 @@ func (dag *Dagger) Search(diff *big.Int) *big.Int { ...@@ -22,23 +48,25 @@ func (dag *Dagger) Search(diff *big.Int) *big.Int {
fmt.Println("diff", diff, "< objective", obj) fmt.Println("diff", diff, "< objective", obj)
r := rand.New(rand.NewSource(time.Now().UnixNano())) Found = false
rnd := big.NewInt(r.Int63()) resChan := make(chan int64, 3)
fmt.Println("init rnd =", rnd) var res int64
for i := 0; i < 1000; i++ { for k := 0; k < amountOfRoutines; k++ {
if dag.Eval(rnd).Cmp(obj) < 0 { go dag.Find(obj, resChan)
fmt.Println("Found result! nonce = ", rnd)
return rnd
} else {
fmt.Println("Not found :( nonce = ", rnd)
} }
rnd = rnd.Add(rnd, big.NewInt(1)) // 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(0) return big.NewInt(res)
} }
func DaggerVerify(hash, diff, nonce *big.Int) bool { func DaggerVerify(hash, diff, nonce *big.Int) bool {
......
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)
}
...@@ -11,10 +11,10 @@ import ( ...@@ -11,10 +11,10 @@ import (
const Debug = true const Debug = true
var StartDBQueryInterface bool var StartConsole bool
var StartMining bool var StartMining bool
func Init() { 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.BoolVar(&StartMining, "mine", false, "start dagger mining")
flag.Parse() flag.Parse()
...@@ -42,12 +42,13 @@ func main() { ...@@ -42,12 +42,13 @@ func main() {
Init() Init()
if StartDBQueryInterface { if StartConsole {
dbInterface := NewDBInterface() console := NewConsole()
dbInterface.Start() console.Start()
} else if StartMining { } else if StartMining {
dagger := &Dagger{} dagger := &Dagger{}
dagger.Search(BigPow(2, 36)) res := dagger.Search(BigPow(2, 36))
fmt.Println("nonce =", res)
} else { } else {
fmt.Println("[DBUG]: Starting Ethereum") fmt.Println("[DBUG]: Starting Ethereum")
server, err := NewServer() server, err := NewServer()
......
package main package main
/*
import ( import (
_"fmt" _"fmt"
"testing" "testing"
...@@ -72,4 +73,4 @@ func TestVm(t *testing.T) { ...@@ -72,4 +73,4 @@ func TestVm(t *testing.T) {
bm := NewBlockManager() bm := NewBlockManager()
bm.ProcessBlock( block ) bm.ProcessBlock( block )
} }
*/
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment