Class: Base58GMP

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

Constant Summary collapse

VERSION =
'1.0.0'
ALPHABETS =
{
  bitcoin: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',
  flickr:  '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ',
  ripple:  'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz',
  gmp:     '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv'
}
DEFAULT_ALPHABET =
:flickr
GMP_ALPHABET =
:gmp
BASE58_LENGTH_MD5 =
22

Class Method Summary collapse

Class Method Details

.alphabet_digits(alphabet) ⇒ Object



62
63
64
65
66
67
68
69
70
# File 'lib/base58_gmp.rb', line 62

def self.alphabet_digits(alphabet)
  alphabet = normalize_alphabet alphabet

  unless ALPHABETS.key? alphabet
    fail ArgumentError, "Alphabet is invalid: #{alphabet}"
  end

  return ALPHABETS[alphabet]
end

.base58_to_integer(base58, alphabet = DEFAULT_ALPHABET) ⇒ Object Also known as: decode



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/base58_gmp.rb', line 33

def self.base58_to_integer(base58, alphabet = DEFAULT_ALPHABET)
  unless base58.is_a? String
    fail ArgumentError, 'Base58 argument is not a string.'
  end

  unless normalize_alphabet(alphabet) == GMP_ALPHABET
    base58 = from_to(base58, alphabet, GMP_ALPHABET)
  end

  GMP::Z.new(base58, 58)
end

.from_to(base58, from_alphabet, to_alphabet) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/base58_gmp.rb', line 45

def self.from_to(base58, from_alphabet, to_alphabet)
  unless base58.is_a? String
    fail ArgumentError, 'Base58 argument is not a string.'
  end

  from_digits = alphabet_digits from_alphabet
  to_digits = alphabet_digits to_alphabet

  from_digits != to_digits \
    ? base58.tr(from_digits, to_digits) \
    : base58
end

.integer_to_base58(integer, alphabet = DEFAULT_ALPHABET) ⇒ Object Also known as: encode



23
24
25
26
27
28
29
30
31
# File 'lib/base58_gmp.rb', line 23

def self.integer_to_base58(integer, alphabet = DEFAULT_ALPHABET)
  base58 = integer.is_a?(GMP::Z) \
         ? integer.to_s(58) \
         : GMP::Z(integer).to_s(58)

  normalize_alphabet(alphabet) == GMP_ALPHABET \
    ? base58 \
    : from_to(base58, GMP_ALPHABET, alphabet)
end

.md5_base58(data, alphabet = DEFAULT_ALPHABET, opts = {}) ⇒ Object Also known as: md5



72
73
74
75
76
77
78
# File 'lib/base58_gmp.rb', line 72

def self.md5_base58(data, alphabet = DEFAULT_ALPHABET, opts = {})
  base58 = integer_to_base58(Digest::MD5.hexdigest(data).hex, alphabet)

  opts.key?(:pad) && opts[:pad] \
    ? base58.rjust(BASE58_LENGTH_MD5, alphabet_digits(alphabet)[0]) \
    : base58
end

.normalize_alphabet(alphabet) ⇒ Object



58
59
60
# File 'lib/base58_gmp.rb', line 58

def self.normalize_alphabet(alphabet)
  alphabet.to_sym.downcase
end