diff --git a/whisper/whisperv6/envelope.go b/whisper/whisperv6/envelope.go index 5d9d35081..5b6925edb 100644 --- a/whisper/whisperv6/envelope.go +++ b/whisper/whisperv6/envelope.go @@ -91,16 +91,18 @@ func (e *Envelope) Seal(options *MessageParams) error { target = e.powToFirstBit(options.PoW) } - buf := make([]byte, 64) - h := crypto.Keccak256(e.rlpWithoutNonce()) - copy(buf[:32], h) + rlp := e.rlpWithoutNonce() + buf := make([]byte, len(rlp)+8) + copy(buf, rlp) + asAnInt := new(big.Int) finish := time.Now().Add(time.Duration(options.WorkTime) * time.Second).UnixNano() for nonce := uint64(0); time.Now().UnixNano() < finish; { for i := 0; i < 1024; i++ { - binary.BigEndian.PutUint64(buf[56:], nonce) - d := new(big.Int).SetBytes(crypto.Keccak256(buf)) - leadingZeros := 256 - d.BitLen() + binary.BigEndian.PutUint64(buf[len(rlp):], nonce) + h := crypto.Keccak256(buf) + asAnInt.SetBytes(h) + leadingZeros := 256 - asAnInt.BitLen() if leadingZeros > bestLeadingZeros { e.Nonce, bestLeadingZeros = nonce, leadingZeros if target > 0 && bestLeadingZeros >= target { @@ -128,11 +130,10 @@ func (e *Envelope) PoW() float64 { } func (e *Envelope) calculatePoW(diff uint32) { - buf := make([]byte, 64) rlp := e.rlpWithoutNonce() - h := crypto.Keccak256(rlp) - copy(buf[:32], h) - binary.BigEndian.PutUint64(buf[56:], e.Nonce) + buf := make([]byte, len(rlp)+8) + copy(buf, rlp) + binary.BigEndian.PutUint64(buf[len(rlp):], e.Nonce) powHash := new(big.Int).SetBytes(crypto.Keccak256(buf)) leadingZeroes := 256 - powHash.BitLen() x := gmath.Pow(2, float64(leadingZeroes)) diff --git a/whisper/whisperv6/envelope_test.go b/whisper/whisperv6/envelope_test.go index d6e38e683..c0bb4373b 100644 --- a/whisper/whisperv6/envelope_test.go +++ b/whisper/whisperv6/envelope_test.go @@ -43,12 +43,12 @@ func TestPoWCalculationsWith8LeadingZeros(t *testing.T) { e := Envelope{ TTL: 1, Data: []byte{0xde, 0xad, 0xbe, 0xef}, - Nonce: 48159, + Nonce: 276, } e.calculatePoW(0) - if e.pow != 40329.846153846156 { - t.Fatalf("invalid PoW calculation. Expected 0.07692307692307693, got %v", e.pow) + if e.pow != 19.692307692307693 { + t.Fatalf("invalid PoW calculation. Expected 19.692307692307693, got %v", e.pow) } }