2017-07-25 47 views
0

我用C#語言製作了一個礦工,用於製作BCN和XMR,並且它可以與所有Pool一起使用。如何在發送前檢查哈希生成的Cryptonight?

但我想檢查我的代碼與從池中收到的目標生成的哈希值。

我做了這樣的事情:

 public bool CheckHash(byte[] hash, byte[] target) 
     { 
     for (int i = 0; i < target.Length; i++) 
     { 
      for (int k = hash.Length-1; k >= 0; k--) 
      { 
       Log("test de: " + (hash[k] & 0x20)); 
       if ((hash[k] & 0x20) > (target[i] & 0x04)) 
       { 
        Log("Hash invalid: " + _cryptonightLib.ToHexString(hash)); 
        return false; 
       } 
       if ((hash[k] & 0x20) < (target[i] & 0x04)) 
       { 
        Log("Hash is valid: " + _cryptonightLib.ToHexString(hash)); 
        return true; 
       } 
      } 
     } 
     Log("Hash invalid: "+_cryptonightLib.ToHexString(hash)); 
     return false; 
    } 

但是,這並不真正發揮作用。在礦工收到

例起源哈希:0505efcfdccb0506180897d587b02f9c97037e66ea638990b2b3a0efab7bab0bff4e3f3dfe1c7d00000000a6788e66eb9b82325f95fc7a2007d3fed7152a3590366cc2a9577dcadf3544a804

例哈希生成併成功礦工送:960A7A3A1826B0AA70E8043FFE7B9E23EE2E028BBA75F3D7557CCDFF9C7F1A00

實例目標:e4a63d00

預先感謝您。

回答

0

我將嘗試使用JavaScript示例演示算法的工作原理。我對CryptoNight很新,但我盡我所能:

您的示例哈希實際上是兩個哈希,每個哈希長度爲32個字符。

var hash1 = '960A7A3A1826B0AA70E8043FFE7B9E23EE2E028BBA75F3D7557CCDFF9C7F1A00' 
    .slice(0, 32); 

var hash2 = '960A7A3A1826B0AA70E8043FFE7B9E23EE2E028BBA75F3D7557CCDFF9C7F1A00' 
    .slice(-32); 

然後找出各該散列已「達到」,你需要採取的最後8個字符,並轉換成整數

var reached1 = parseInt(hash1.slice(24), 16) 
var reached2 = parseInt(hash2.slice(24), 16) 

現在你只需將其與比較目標:

parseInt(reached1, 16) < parseInt("e4a63d00", 16) 
    -> false 
parseInt(reached2, 16) < parseInt("e4a63d00", 16) 
    -> true