I’m trying to understand the khovratovich’s implementation of Equihash (link) becasue I want to write a simple Zcash miner (for now I’m not interested to optimization aspects but only understand how the mining works).
Analyzing the implementation I can see that insider the FillMemory()
method, at each iteration the following elements are hashed together (using Blake2b hash function):
- Seed
- Nonce
- index
The resulting hash is then stored in an array of 32-bit elements of length 8 called buff[]
(obtaining so a 256 bit buffer). What I cannot understand is the reason why then, the tuples considered are arrays obtained copying the content of array buff[]
but considering only the n/(k+1) least significant bit of each cell of the array buff[]
(it corresponds to perform a right shift operation of 32-(n/k+1) bits).
The algorithm than proceeds iterating and checking collisions for the first n/(k+1) bits, the second n/(k+1) bits and so on of each tuple.
In the equihash implementation of Zcash is that shift register operation performed? How the tuples are obtained?