From d2b3071b4d820b9530b3de891078970ea036767c Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 9 Jan 2014 11:57:35 +0100 Subject: [PATCH] db console is now a general console. --- dagger.go | 45 +++++++++++++++++++++++++++++++------------ db_query_interface.go | 5 +++++ ethereum.go | 7 +++---- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/dagger.go b/dagger.go index 750a781b04..b161ef7331 100644 --- a/dagger.go +++ b/dagger.go @@ -6,6 +6,7 @@ import ( "math/rand" "time" "github.com/obscuren/sha3" + "hash" ) type Dagger struct { @@ -27,8 +28,11 @@ func (dag *Dagger) Search(diff *big.Int) *big.Int { for i := 0; i < 1000; i++ { if dag.Eval(rnd).Cmp(obj) < 0 { - fmt.Println("Found result! i = ", i) + fmt.Println("Found result! nonce = ", rnd) + return rnd + } else { + fmt.Println("Not found :( nonce = ", rnd) } rnd = rnd.Add(rnd, big.NewInt(1)) @@ -37,6 +41,16 @@ func (dag *Dagger) Search(diff *big.Int) *big.Int { return big.NewInt(0) } +func DaggerVerify(hash, diff, nonce *big.Int) bool { + dagger := &Dagger{} + dagger.hash = hash + + obj := BigPow(2, 256) + obj = obj.Div(obj, diff) + + return dagger.Eval(nonce).Cmp(obj) < 0 +} + func (dag *Dagger) Node(L uint64, i uint64) *big.Int { if L == i { return dag.hash @@ -63,16 +77,21 @@ func (dag *Dagger) Node(L uint64, i uint64) *big.Int { d.Write(big.NewInt(int64(i)).Bytes()) d.Write(big.NewInt(int64(k)).Bytes()) - b.SetBytes(d.Sum(nil)) + b.SetBytes(Sum(d)) pk := b.Uint64() & ((1 << ((L - 1) * 3)) - 1) sha.Write(dag.Node(L - 1, pk).Bytes()) } - ret.SetBytes(sha.Sum(nil)) + ret.SetBytes(Sum(sha)) return ret } +func Sum(sha hash.Hash) []byte { + in := make([]byte, 32) + return sha.Sum(in) +} + func (dag *Dagger) Eval(N *big.Int) *big.Int { pow := BigPow(2, 26) dag.xn = N.Div(N, pow) @@ -81,10 +100,11 @@ func (dag *Dagger) Eval(N *big.Int) *big.Int { sha.Reset() ret := new(big.Int) - doneChan := make(chan bool, 3) + //doneChan := make(chan bool, 3) for k := 0; k < 4; k++ { - go func(_k int) { + //go func(_k int) { + _k := k d := sha3.NewKeccak224() b := new(big.Int) @@ -94,17 +114,18 @@ func (dag *Dagger) Eval(N *big.Int) *big.Int { d.Write(N.Bytes()) d.Write(big.NewInt(int64(_k)).Bytes()) - b.SetBytes(d.Sum(nil)) + b.SetBytes(Sum(d)) pk := (b.Uint64() & 0x1ffffff) sha.Write(dag.Node(9, pk).Bytes()) - doneChan <- true - }(k) + //doneChan <- true + //}(k) } - for k := 0; k < 4; k++ { - <- doneChan - } + //for k := 0; k < 4; k++ { + // <- doneChan + //} + - return ret.SetBytes(sha.Sum(nil)) + return ret.SetBytes(Sum(sha)) } diff --git a/db_query_interface.go b/db_query_interface.go index 007f4bf28f..ec1d7feb56 100644 --- a/db_query_interface.go +++ b/db_query_interface.go @@ -32,6 +32,9 @@ func (i *DbInterface) ValidateInput(action string, argumentLength int) error { case action == "get" && argumentLength != 1: err = true expArgCount = 1 + case action == "dag" && argumentLength != 2: + err = true + expArgCount = 2 } if err { @@ -74,6 +77,8 @@ func (i *DbInterface) ParseInput(input string) bool { fmt.Println(i.trie.root) case "print": i.db.Print() + case "dag": + fmt.Println(DaggerVerify(Big(tokens[1]), BigPow(2, 36), Big(tokens[2]))) case "exit", "quit", "q": return false case "help": diff --git a/ethereum.go b/ethereum.go index b10415fd1b..b31ff751d2 100644 --- a/ethereum.go +++ b/ethereum.go @@ -6,6 +6,7 @@ import ( "os/signal" "flag" "runtime" + _"math/big" ) const Debug = true @@ -13,7 +14,7 @@ const Debug = true var StartDBQueryInterface bool var StartMining bool func Init() { - flag.BoolVar(&StartDBQueryInterface, "db", false, "start db query interface") + flag.BoolVar(&StartDBQueryInterface, "c", false, "console interface") flag.BoolVar(&StartMining, "mine", false, "start dagger mining") flag.Parse() @@ -46,9 +47,7 @@ func main() { dbInterface.Start() } else if StartMining { dagger := &Dagger{} - seed := dagger.Search(BigPow(2, 36)) - - fmt.Println("dagger res = ", seed) + dagger.Search(BigPow(2, 36)) } else { fmt.Println("[DBUG]: Starting Ethereum") server, err := NewServer()