Class: Ethereum::EthashRuby::Cache

Inherits:
Object
  • Object
show all
Includes:
Utils
Defined in:
lib/ethereum/ethash_ruby/cache.rb

Instance Method Summary collapse

Methods included from Utils

#decode_int, #deserialize_hash, #encode_int, #hash_words, #keccak256, #keccak512, #serialize_hash, #zpad

Constructor Details

#initialize(block_number) ⇒ Cache

Returns a new instance of Cache.



11
12
13
# File 'lib/ethereum/ethash_ruby/cache.rb', line 11

def initialize(block_number)
  @block_number = block_number
end

Instance Method Details

#seedObject



32
33
34
# File 'lib/ethereum/ethash_ruby/cache.rb', line 32

def seed
  @seed ||= self.class.get_seed(@block_number)
end

#sizeObject



36
37
38
39
40
41
42
# File 'lib/ethereum/ethash_ruby/cache.rb', line 36

def size
  sz = CACHE_BYTES_INIT + CACHE_BYTES_GROWTH * (@block_number / EPOCH_LENGTH)
  sz -= HASH_BYTES

  sz -= 2 * HASH_BYTES while !Prime.prime?(sz / HASH_BYTES)
  sz
end

#to_aObject



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/ethereum/ethash_ruby/cache.rb', line 15

def to_a
  n = size / HASH_BYTES

  o = [keccak512(seed)]
  (1...n).each {|i| o.push keccak512(o.last) }

  CACHE_ROUNDS.times do
    n.times do |i|
      v = o[i][0] % n
      xor = o[(i-1+n) % n].zip(o[v]).map {|(a,b)| a^b }
      o[i] = keccak512 xor
    end
  end

  o
end