Wie versendet man Bitcoin im Testnet?

Ich verwende diese Bibliothek: https://github.com/lian/bitcoin-ruby

Und hier ist mein Code:

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)

Hier ist die Ausgabe:

➜  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

Es scheint erfolgreich zu sein, aber ich sehe nicht, dass die BTC im Blockcypher Explorer tatsächlich von bitcoin_key_1_addrnach übertragen wird:bitcoin_key_2_addr

Wie Sie im Blockcypher Explorer feststellen, wird der BTC-Betrag noch nicht von bitcoin_key_1_addrnach transferiert bitcoin_key_2_addr. Ideen?

Haben Sie die Transaktion übertragen? Ich sehe keinen Code, der so aussieht, als würde die Transaktion tatsächlich an das Netzwerk gesendet. Eine Transaktion muss gesendet werden, bevor sie von Block-Explorern gesehen und von Minern in die Blockchain aufgenommen werden kann.
@AndrewChow sehr guter Punkt - irgendwelche Ideen, wie man das in Bitcoin-Ruby macht?
Ich dachte, Sie müssen dies verwenden: live.blockcypher.com/btc-testnet/pushtx , aber dann erhalte ich eine Fehlermeldung, die besagt, dass die Transaktion "zu hohe Gebühren" hat, Ideen? @AndrewChow
Sie können das zum Senden verwenden. Wenn Sie eine Fehlermeldung erhalten, haben Sie Ihre Transaktion wahrscheinlich falsch erstellt. Zu hohe Gebühren bedeuten normalerweise, dass Sie keine Änderungsausgabe erstellt haben, sodass die Änderung letztendlich zu Gebühren wird.
Haben Sie etwas falsch mit meinem Code oben gesehen? Ich bin mir nicht sicher, welcher Teil davon falsch war @AndrewChow
Das Problem ist, dass Sie nur eine Ausgabe erstellen, während Sie zwei Ausgaben haben müssen, die zweite für die Änderungsausgabe. Die Änderungsausgabe ist genau wie jede andere Ausgabe, außer dass die Ausgabe von Ihnen ausgegeben werden kann, nicht von Ihrem Empfänger.
@AndrewChow Ich verstehe nicht. Hast du einen Beispielcode den ich mir anschauen kann?
Es scheint, dass Sie Schwierigkeiten haben, die Idee der Veränderung zu begreifen. Da dies ein Testnet ist, passen Sie einfach Ihren Ausgabewert fast an den Eingabewert an. Ich sage fast übereinstimmen, weil Sie immer noch eine Transaktionsgebühr benötigen.

Antworten (1)

Beschlossen, die BlockCypher-API zu verwenden, und es funktioniert einfach. Folgen Sie einfach diesem CURL-Beispiel: https://gist.githubusercontent.com/matthieu/b07c5ba27bc99188a15f/raw/870a9d0e1bdd05a6230acde359e6953add15621a/gistfile1.sh

Und Sie können das immer in die Sprache übersetzen, die Sie verwenden möchten. In meinem Fall verwende ich Ruby.