func (pow *Ethash) full(nonce uint64, miningHash []byte) []byte { cMiningHash := (*C.uint8_t)(unsafe.Pointer(&miningHash)) cnonce := C.uint64_t(nonce) log.Println("seed hash, nonce:", miningHash, nonce) // pow.hash is the output/return of ethash_full C.ethash_full(pow.hash, pow.cache.mem, pow.params, cMiningHash, cnonce) ghash_full := C.GoBytes(unsafe.Pointer(pow.hash), 32) return ghash_full }
func (pow *Ethash) Search(block pow.Block, stop <-chan struct{}) []byte { //r := rand.New(rand.NewSource(time.Now().UnixNano())) miningHash := block.HashNoNonce() diff := block.Difficulty() //diff = big.NewInt(10000) log.Println("difficulty", diff) i := int64(0) start := time.Now().UnixNano() t := time.Now() nonce := uint64(0) //uint64(r.Int63()) for { select { case <-stop: powlogger.Infoln("Breaking from mining") pow.HashRate = 0 return nil default: i++ if time.Since(t) > (1 * time.Second) { elapsed := time.Now().UnixNano() - start hashes := ((float64(1e9) / float64(elapsed)) * float64(i)) / 1000 pow.HashRate = int64(hashes) powlogger.Infoln("Hashing @", pow.HashRate, "khash") t = time.Now() } cMiningHash := (*C.uint8_t)(unsafe.Pointer(&miningHash)) cnonce := C.uint64_t(nonce) log.Println("seed hash, nonce:", miningHash, nonce) // pow.hash is the output/return of ethash_full C.ethash_full(pow.hash, pow.cache.mem, pow.params, cMiningHash, cnonce) ghash := C.GoBytes(unsafe.Pointer(pow.hash), 32) log.Println("ethhash full (on nonce):", ghash, nonce) if pow.verify(miningHash, diff, nonce) { return ghash } nonce += 1 } if !pow.turbo { time.Sleep(20 * time.Microsecond) } } return nil }