Class: BitcoinAddrgen::Addrgen

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

Class Method Summary collapse

Class Method Details

.addr_from_mpk(mpk, idx) ⇒ Object



271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
# File 'lib/bitcoin_addrgen/addrgen.rb', line 271

def self.addr_from_mpk(mpk, idx)
  _p  = gmp_init('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F', 16)
  _r  = gmp_init('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141', 16)
  _b  = gmp_init('0000000000000000000000000000000000000000000000000000000000000007', 16)
  _Gx = gmp_init('79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798', 16)
  _Gy = gmp_init('483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8', 16)
  curve = Curve.new(_p, 0, _b)
  gen = Point.new(curve, _Gx, _Gy, _r)

  # prepare the input values
  x = gmp_init(mpk[0, 64], 16)
  y = gmp_init(mpk[64, 64], 16)
  z = gmp_init(sha256(sha256_raw(idx.to_s + ':0:' + hex_to_bin(mpk))), 16)

  # generate the new public key based off master and sequence points
  pt = Point.add(Point.new(curve, x, y), Point.mul(z, gen))
  keystr = hex_to_bin('04' + gmp_strval(pt.x, 16).rjust(64, '0') + gmp_strval(pt.y, 16).rjust(64, '0'))
  vh160 =  '00' + ripemd160(sha256_raw(keystr))
  addr = vh160 + sha256(sha256_raw(hex_to_bin(vh160)))[0, 8]

  num = gmp_strval(gmp_init(addr, 16), 58)
  num = num.tr('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv', '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz')

  pad = ''
  n = 0
  while addr[n] == '0' and addr[n+1] == '0'
    pad += '1'
    n += 2
  end

  pad + num
end

.hex_to_bin(s) ⇒ Object



255
256
257
# File 'lib/bitcoin_addrgen/addrgen.rb', line 255

def self.hex_to_bin(s)
  [s].pack('H*')
end

.ripemd160(data) ⇒ Object



267
268
269
# File 'lib/bitcoin_addrgen/addrgen.rb', line 267

def self.ripemd160(data)
  Digest::RMD160.hexdigest(data)
end

.sha256(data) ⇒ Object



263
264
265
# File 'lib/bitcoin_addrgen/addrgen.rb', line 263

def self.sha256(data)
  Digest::SHA256.hexdigest(data)
end

.sha256_raw(data) ⇒ Object



259
260
261
# File 'lib/bitcoin_addrgen/addrgen.rb', line 259

def self.sha256_raw(data)
  Digest::SHA256.digest(data)
end