|
|
|
@ -1,15 +1,16 @@ |
|
|
|
|
package ethchain |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"hash" |
|
|
|
|
"math/big" |
|
|
|
|
"math/rand" |
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
"github.com/ethereum/eth-go/ethcrypto" |
|
|
|
|
"github.com/ethereum/eth-go/ethlog" |
|
|
|
|
"github.com/ethereum/eth-go/ethreact" |
|
|
|
|
"github.com/ethereum/eth-go/ethutil" |
|
|
|
|
"github.com/obscuren/sha3" |
|
|
|
|
"hash" |
|
|
|
|
"math/big" |
|
|
|
|
"math/rand" |
|
|
|
|
"time" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
var powlogger = ethlog.NewLogger("POW") |
|
|
|
@ -18,23 +19,30 @@ type PoW interface { |
|
|
|
|
Search(block *Block, reactChan chan ethreact.Event) []byte |
|
|
|
|
Verify(hash []byte, diff *big.Int, nonce []byte) bool |
|
|
|
|
GetHashrate() int64 |
|
|
|
|
Turbo(bool) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type EasyPow struct { |
|
|
|
|
hash *big.Int |
|
|
|
|
HashRate int64 |
|
|
|
|
turbo bool |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (pow *EasyPow) GetHashrate() int64 { |
|
|
|
|
return pow.HashRate |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (pow *EasyPow) Turbo(on bool) { |
|
|
|
|
pow.turbo = on |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (pow *EasyPow) Search(block *Block, reactChan chan ethreact.Event) []byte { |
|
|
|
|
r := rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
|
|
hash := block.HashNoNonce() |
|
|
|
|
diff := block.Difficulty |
|
|
|
|
i := int64(0) |
|
|
|
|
start := time.Now().UnixNano() |
|
|
|
|
t := time.Now() |
|
|
|
|
|
|
|
|
|
for { |
|
|
|
|
select { |
|
|
|
@ -43,11 +51,14 @@ func (pow *EasyPow) Search(block *Block, reactChan chan ethreact.Event) []byte { |
|
|
|
|
return nil |
|
|
|
|
default: |
|
|
|
|
i++ |
|
|
|
|
if i%1234567 == 0 { |
|
|
|
|
|
|
|
|
|
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 @", int64(pow.HashRate), "khash") |
|
|
|
|
|
|
|
|
|
t = time.Now() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sha := ethcrypto.Sha3Bin(big.NewInt(r.Int63()).Bytes()) |
|
|
|
@ -55,6 +66,10 @@ func (pow *EasyPow) Search(block *Block, reactChan chan ethreact.Event) []byte { |
|
|
|
|
return sha |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if !pow.turbo { |
|
|
|
|
time.Sleep(20 * time.Microsecond) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|