class MoneyTree::Master

Constants

HD_WALLET_BASE_KEY
RANDOM_SEED_SIZE

Attributes

seed[R]
seed_hash[R]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/money-tree/node.rb, line 239
def initialize(opts = {})
  @depth = 0
  @index = 0
  opts[:seed] = [opts[:seed_hex]].pack("H*") if opts[:seed_hex]
  if opts[:seed]
    @seed = opts[:seed]
    @seed_hash = generate_seed_hash(@seed)
    raise SeedGeneration::ImportError unless seed_valid?(@seed_hash)
    set_seeded_keys
  elsif opts[:private_key] || opts[:public_key]
    raise ImportError, 'chain code required' unless opts[:chain_code]
    @chain_code = opts[:chain_code]
    if opts[:private_key]
      @private_key = opts[:private_key]
      @public_key = MoneyTree::PublicKey.new @private_key
    else opts[:public_key]
      @public_key = if opts[:public_key].is_a?(MoneyTree::PublicKey)
        opts[:public_key]
      else
        MoneyTree::PublicKey.new(opts[:public_key])
      end
    end
  else
    generate_seed
    set_seeded_keys
  end
end

Public Instance Methods

generate_seed() click to toggle source
# File lib/money-tree/node.rb, line 271
def generate_seed
  @seed = OpenSSL::Random.random_bytes(32)
  @seed_hash = generate_seed_hash(@seed)
  raise SeedGeneration::ValidityError unless seed_valid?(@seed_hash)
end
generate_seed_hash(seed) click to toggle source
# File lib/money-tree/node.rb, line 277
def generate_seed_hash(seed)
  hmac_sha512 HD_WALLET_BASE_KEY, seed
end
is_private?() click to toggle source
# File lib/money-tree/node.rb, line 267
def is_private?
  true
end
seed_hex() click to toggle source
# File lib/money-tree/node.rb, line 293
def seed_hex
  bytes_to_hex(seed)
end
seed_valid?(seed_hash) click to toggle source
# File lib/money-tree/node.rb, line 281
def seed_valid?(seed_hash)
  return false unless seed_hash.bytesize == 64
  master_key = left_from_hash(seed_hash)
  !master_key.zero? && master_key < MoneyTree::Key::ORDER
end
set_seeded_keys() click to toggle source
# File lib/money-tree/node.rb, line 287
def set_seeded_keys
  @private_key = MoneyTree::PrivateKey.new key: left_from_hash(seed_hash)
  @chain_code = right_from_hash(seed_hash)
  @public_key = MoneyTree::PublicKey.new @private_key
end