Class: WaffleAPI::AddressValidator::DigestUtilities

Inherits:
Object
  • Object
show all
Defined in:
lib/waffle_api/address_validator.rb

Overview

Utilities are in a class to make them private

Constant Summary collapse

B58_CHARS =
'123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
B58_BASE =
B58_CHARS.length

Class Method Summary collapse

Class Method Details

.b58_decode(value, length) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/waffle_api/address_validator.rb', line 29

def self.b58_decode(value, length)
  long_value = 0
  result = ''

  value.reverse.each_char.with_index do |c, index|
    long_value += B58_CHARS.index(c) * (B58_BASE**index)
  end

  while long_value >= 256
    long_value, mod = long_value.divmod 256
    result = mod.chr + result
  end

  result = long_value.chr + result

  if result.length < length
    result = 0.chr * (length - result.length) + result
  end

  result
end

.version(address) ⇒ Object



18
19
20
21
22
23
24
25
26
27
# File 'lib/waffle_api/address_validator.rb', line 18

def self.version(address)
  decoded  = b58_decode(address, 25)
  version  = decoded[0, 1]
  checksum = decoded[-4, decoded.length]
  vh160    = decoded[0, decoded.length - 4]
  vh160_digest = (Digest::SHA2.new << vh160).digest
  hashed   = (Digest::SHA2.new << vh160_digest).digest

  hashed[0, 4] == checksum ? version[0] : nil
end