Как кодировать base58 в рубине?

Я пытаюсь закодировать адрес кошелька Protoshares в необработанном формате, как описано в Биткойн вики в формате Base58.

Адреса Protoshares начинаются с P (номер версии 56).

Я дал необработанный адрес из транзакции. Это выглядит так:

028401a2e512b1b91b882ee1c9291cd407c10916bf791662f7189c9c805643e51c

Теперь я шаг за шагом следовал руководству из вики, и мой рубиновый код выглядит так:

# 1 - Take the corresponding public key generated with it (65 bytes, 1 byte 0x04, 32 bytes corresponding to X coordinate, 32 bytes corresponding to Y coordinate)
  sender = '028401a2e512b1b91b882ee1c9291cd407c10916bf791662f7189c9c805643e51c'
# 2 - Perform SHA-256 hashing on the public key 
  sender = Digest::SHA256.new.update(sender)
# 3 - Perform RIPEMD-160 hashing on the result of SHA-256
  sender = Digest::RMD160.new.update(sender.to_s)
# 4 - Add version byte in front of RIPEMD-160 hash (0x00 for Main Network) 
  sender = '00' + sender.to_s
# 5 - Perform SHA-256 hash on the extended RIPEMD-160 result 
  checksum = Digest::SHA256.new.update(sender.to_s)
# 6 - Perform SHA-256 hash on the result of the previous SHA-256 hash 
  checksum = Digest::SHA256.new.update(checksum.to_s)
# 7 - Take the first 4 bytes of the second SHA-256 hash. This is the address checksum 
  checksum = checksum.to_s[0,8]
# 8 - Add the 4 checksum bytes from point 7 at the end of extended RIPEMD-160 hash from point 4. This is the 25-byte binary Bitcoin Address. 
  sender += checksum

Кажется, пока это работает хорошо. Мой текущий результат выглядит так:

0073eb40b21b02c08e93f6ef1bec5828763ac89e456c2f6fec

Но теперь я застрял. Я использую гем base58 от dougal и пытаюсь окончательно закодировать адрес:

# 9 - Convert the result from a byte string into a base58 string using Base58Check encoding. This is the most commonly used Bitcoin Address format 
  sender = Base58.encode(sender)

Но я получаю следующую проблему:

/path/to/base58.rb:23:in `int_to_base58': Value passed is not an Integer. (ArgumentError)

Конечно, это не целое число. Я напортачил с типами данных здесь? Что сделать, чтобы это работало корректно?

Спасибо!


person Afr    schedule 31.12.2013    source источник


Ответы (1)


Мне кажется, что в строке застряло шестнадцатеричное число, сделайте его числом:

2.0.0p247 :001 > require 'base58'
 => true 
2.0.0p247 :002 > x = '0073eb40b21b02c08e93f6ef1bec5828763ac89e456c2f6fec'
 => "0073eb40b21b02c08e93f6ef1bec5828763ac89e456c2f6fec" 
2.0.0p247 :003 > Base58.encode(x.to_i(16))
 => "byVwGWzMZZ7HwsufSQx6T2pRapGZWdkAL" 

Не уверен, каков ваш ожидаемый результат, но это выполняется...

person Nick Veys    schedule 31.12.2013
comment
Также есть x.hex. - person steenslag; 03.01.2014