Как отправить биткойн в тестовой сети?

Я использую эту библиотеку: https://github.com/lian/bitcoin-ruby

И вот мой код:

require 'open-uri'
require 'net/http'
require 'net/https'
require 'json'

require 'bitcoin'

Bitcoin.network = :testnet3

def get_response(prev_tx)
  url = "https://testnet.blockexplorer.com/api/rawtx/#{prev_tx}"
  uri = URI(url)
  response = Net::HTTP.get(uri)
  response = JSON.parse(response)
  response = response['rawtx'].to_s
  return response
end

def build_transaction(prev_tx, prev_out_index, key, satoshi_to_spend, addr, message)
  include Bitcoin::Builder

  new_tx = build_tx do |t|
    t.input do |i|
      i.prev_out prev_tx
      i.prev_out_index prev_out_index
      i.signature_key key
    end
    t.output do |o|
      o.value satoshi_to_spend
      o.script {|s| s.type :address; s.recipient addr }
    end
  end
  puts ""
  puts "--- new tx ---"
  puts new_tx.to_json
  return new_tx
end

def bin_to_hex(s)
  s.unpack('H*').first
end

bitcoin_key_1_pub = "0367e6251a89c5afc1212c3e2169866ccfe9d6059a4cfc15dc139b534b974fd7ca"
bitcoin_key_1_priv = "*****24c56528becd02d23076123a2edc2f3cf52c3c0202178c1b7fa9ac*****"
bitcoin_key_1_addr = "mxz4hu6JrTHevn22W4GDVjS3ko9MwXuHND"

# the previous transaction that has an output to your address #1
prev_tx_1 = "427138ed5f2443fbfbf8065e990f1bf9ce0236e14376e8abca0b2876eabca653"

# the number of the output you want to use
prev_out_index = 1

# 0.5 BTC in satoshis
btc_to_spend = 0.5
satoshi_to_spend = btc_to_spend * 100000000

bitcoin_key_2_pub = "02989d0578f715a1980d4d6e968bcba487077e74aaf8a219d11ee4384ea1fc1eda"
bitcoin_key_2_priv = "*****cb521a27f9782cc503b461bf5c6b470469ca00ba1d7dc26f4ab61b*****"
bitcoin_key_2_addr = "n4SYP6TJyK7pUouW65fnC1hDBrbb7Za8RR"

# fetch the tx from whereever you like and parse it
response = get_response(prev_tx_1)
$prev_tx = Bitcoin::P::Tx.new(response.htb)
prev_tx = $prev_tx

tx_value = prev_tx.outputs[prev_out_index].value
puts "tx_value: #{tx_value}"

key = Bitcoin::Key.new(bitcoin_key_1_priv, bitcoin_key_1_pub)
tx = build_transaction(prev_tx, prev_out_index, key, satoshi_to_spend, bitcoin_key_2_addr, "hello")

puts ""
puts "--- bin_to_hex ---"
puts bin_to_hex(tx.to_payload)

Вот результат:

➜  examples git:(master) ✗ ruby sandbox.rb

tx_value: 75972791
/Users/glaksmono/.rvm/gems/ruby-2.4.2/gems/bitcoin-ruby-0.0.18/lib/bitcoin/script.rb:281: warning: constant ::Fixnum is deprecated
/Users/glaksmono/.rvm/gems/ruby-2.4.2/gems/bitcoin-ruby-0.0.18/lib/bitcoin/script.rb:455: warning: constant ::Fixnum is deprecated

--- new tx ---
/Users/glaksmono/.rvm/gems/ruby-2.4.2/gems/bitcoin-ruby-0.0.18/lib/bitcoin/script.rb:261: warning: constant ::Fixnum is deprecated
{
  "hash":"88217866a40829f144e2d2c19b2e506812ae013d08d9335ce8fa839582f1b18e",
  "ver":1,
  "vin_sz":1,
  "vout_sz":1,
  "lock_time":0,
  "size":191,
  "in":[
    {
      "prev_out":{
        "hash":"427138ed5f2443fbfbf8065e990f1bf9ce0236e14376e8abca0b2876eabca653",
        "n":1
      },
      "scriptSig":"304402201cf2d99b7f10c71a1c77ae629ec134a3f255c0027f47815aff3e43d500e6da46022008409ea148d6cce6876910c7a7218b8197c3a827a6a7bf3d5f064a3ed3a0616701 0367e6251a89c5afc1212c3e2169866ccfe9d6059a4cfc15dc139b534b974fd7ca"
    }
  ],
  "out":[
    {
      "value":"0.50000000",
      "scriptPubKey":"OP_DUP OP_HASH160 fb75447d6038b05bb736e5b05f18a3c9da2b34db OP_EQUALVERIFY OP_CHECKSIG"
    }
  ]
}

--- bin_to_hex ---
010000000153a6bcea76280bcaabe87643e13602cef91b0f995e06f8fbfb43245fed387142010000006a47304402201cf2d99b7f10c71a1c77ae629ec134a3f255c0027f47815aff3e43d500e6da46022008409ea148d6cce6876910c7a7218b8197c3a827a6a7bf3d5f064a3ed3a0616701210367e6251a89c5afc1212c3e2169866ccfe9d6059a4cfc15dc139b534b974fd7caffffffff0180f0fa02000000001976a914fb75447d6038b05bb736e5b05f18a3c9da2b34db88ac00000000

Это кажется успешным, но я не вижу фактического перевода BTC из Blockcypher Explorer в bitcoin_key_1_addr:bitcoin_key_2_addr

Как вы заметили в Blockcypher Explorer, сумма BTC еще не переведена из bitcoin_key_1_addrв bitcoin_key_2_addr. Идеи?

Вы транслировали транзакцию? Я не вижу никакого кода, похожего на то, что транзакция действительно отправляется в сеть. Транзакция должна быть широковещательной, прежде чем ее увидят обозреватели блоков и включат в блокчейн майнеры.
@AndrewChow очень хороший момент - есть идеи, как это сделать в биткойн-рубине?
Я подумал, вам нужно использовать это: live.blockcypher.com/btc-testnet/pushtx , но затем я получаю сообщение об ошибке, говорящее о том, что транзакция имеет «слишком высокие комиссии», идеи? @ЭндрюЧоу
Вы можете использовать это для трансляции. Если вы получили сообщение об ошибке, возможно, вы неправильно построили транзакцию. Слишком высокие комиссионные обычно означают, что вы не создали вывод сдачи, поэтому вся сдача идет на комиссию.
Вы видели что-то не так с моим кодом выше? Не совсем уверен, что именно было не так @AndrewChow
Проблема в том, что вы создаете только один вывод, тогда как вам нужно иметь два вывода, второй предназначен для вывода сдачи. Вывод сдачи точно такой же, как и любой другой вывод, за исключением того, что вывод может быть потрачен вами, а не вашим получателем.
@AndrewChow Я не понимаю. У вас есть пример кода, который я могу посмотреть?
Кажется, вам трудно понять идею перемен. Поскольку это тестовая сеть, просто сделайте так, чтобы выходное значение почти совпадало с входным значением. Я говорю почти совпадает, потому что вам все равно потребуется комиссия за транзакцию.

Ответы (1)

Решил использовать BlockCypher API, и он просто работает. Просто следуйте этому примеру CURL: https://gist.githubusercontent.com/matthieu/b07c5ba27bc99188a15f/raw/870a9d0e1bdd05a6230acde359e6953add15621a/gistfile1.sh

И вы всегда можете перевести это на любой язык, который вы хотите использовать. В моем случае я использую Ruby.