class Cryptocurrency::Base58

Constants

ALPHABET

Public Class Methods

decode58(data) click to toggle source
# File lib/cryptocurrency/base58.rb, line 24
def self.decode58(data)
  prefix = ''
  in_prefix = true

  value = 0

  data.chars.each do |ch|
    if ch == '1' && in_prefix
      prefix += "\x00"
    else
      in_prefix = false

      n = ALPHABET.index(ch)
      value = (value * 58) + n
    end
  end

  prefix + Utils.integer_to_bytes(value)
end
decode58_check(data) click to toggle source
# File lib/cryptocurrency/base58.rb, line 49
def self.decode58_check(data)
  bin = decode58(data)
  value = bin[0...-4]
  checksum = bin[-4..]

  return unless checksum == Utils.double_sha256(value)[0...4]

  value
end
encode58(data) click to toggle source
# File lib/cryptocurrency/base58.rb, line 7
def self.encode58(data)
  return '' if data.empty?

  n = Utils.bytes_to_integer(data)

  b58_bytes = []
  while n > 0
    b58_bytes << n % 58
    n /= 58
  end

  zeroes = data.bytes.find_index { |b| b != 0 } || data.length
  '1' * zeroes + b58_bytes.map do |v|
    ALPHABET[v]
  end.join.reverse
end
encode58_check(data) click to toggle source
# File lib/cryptocurrency/base58.rb, line 44
def self.encode58_check(data)
  checksum = Utils.double_sha256(data)[0...4]
  encode58(data + checksum)
end