Почему я не могу подписать биткойн-транзакцию в Ruby?

Что не так с моим кодом (я использую этот драгоценный камень)?

require 'bitcoin'
include Bitcoin::Builder
key = Bitcoin::Key.from_base58('...')
txn = build_tx do |tx|
  tx.input do |i|
    i.prev_out(Bitcoin::P::Tx.from_hash(...))
    i.prev_out_index(0)
    i.signature_key(Bitcoin::Key.from_base58(...))
  end
  tx.output do |o|
    o.value(50000)
    o.to('1GzqkR2zNQUzHLpE7PLPjVNJ51FHC3bpDH')
  end
end

Я собираюсь:

RuntimeError: Script type must be hash160, pubkey, p2wpkh or multisig
    /Users/yegor/.rvm/gems/ruby-2.6.0/gems/bitcoin-ruby-0.0.19/lib/bitcoin/builder.rb:239:in `sig_hash_and_all_keys_exist?'
    /Users/yegor/.rvm/gems/ruby-2.6.0/gems/bitcoin-ruby-0.0.19/lib/bitcoin/builder.rb:308:in `sign_input'
    /Users/yegor/.rvm/gems/ruby-2.6.0/gems/bitcoin-ruby-0.0.19/lib/bitcoin/builder.rb:208:in `block in tx'
    /Users/yegor/.rvm/gems/ruby-2.6.0/gems/bitcoin-ruby-0.0.19/lib/bitcoin/builder.rb:207:in `each'
    /Users/yegor/.rvm/gems/ruby-2.6.0/gems/bitcoin-ruby-0.0.19/lib/bitcoin/builder.rb:207:in `each_with_index'
    /Users/yegor/.rvm/gems/ruby-2.6.0/gems/bitcoin-ruby-0.0.19/lib/bitcoin/builder.rb:207:in `tx'
    /Users/yegor/.rvm/gems/ruby-2.6.0/gems/bitcoin-ruby-0.0.19/lib/bitcoin/builder.rb:21:in `build_tx'

Что я делаю неправильно? Кстати, независимо от того, какой закрытый ключ я предоставляю signature_key, я получаю ту же ошибку. Если я уберу строку с singature_key, я не получу ошибки.

Я тоже отправил тикет в их репозиторий: https://github.com/lian/bitcoin-ruby/issues/287

В выводе вашего исключения, похоже, что-то отсутствует. Вы пропустили несколько строк? В частности, я не вижу ни одной строки, соответствующей вашему собственному коду.

Michael Hampton 09.04.2019 18:35

@MichaelHampton, я тоже, и в этом проблема...

yegor256 10.04.2019 09:18
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
2
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема была с форматом скрипта. Этот код работает:

utxo = # coming from https://www.blockchain.info/api/unspent
  builder.input do |i|
    i.prev_out(utxo['tx_hash_big_endian'])
    i.prev_out_index(utxo['tx_output_n'])
    i.prev_out_script = [utxo['script']].pack('H*')
    i.signature_key(key)
  end

Другие вопросы по теме