简体   繁体   中英

How to broadcast raw transaction using bitcoin-ruby?

How to broadcast raw transaction using bitcoin-ruby? I used bitcoin-ruby gem from https://github.com/lian/bitcoin-ruby

    Bitcoin.network = :testnet

    address="muLGqMS6tkqb9sBQ4sqeXjMzaV8rk8o3gv"

    url = "https://testnet.blockexplorer.com/api/addr/#{address}"
    uri = URI(url)
    response = Net::HTTP.get(uri)
    if Connect.valid_json(response)
      response = JSON.parse(response)
      $transactions = response["transactions"]
    end

    prev_hash = $transactions[0]

    url = "https://testnet.blockexplorer.com/api/rawtx/#{prev_hash}"
    uri = URI(url)
    response = Net::HTTP.get(uri)
    if Connect.valid_json(response)
      response = JSON.parse(response)
      response = response['rawtx'].to_s
      $prev_tx = Bitcoin::P::Tx.new(response.htb)
    end

    prev_tx = $prev_tx
    prev_tx_output_index = 0
    value = 50000 #0.0005 btc

    tx = Bitcoin::Protocol::Tx.new
    tx.add_in Bitcoin::Protocol::TxIn.new(prev_tx.binary_hash, prev_tx_output_index, 0)

    tx.add_out Bitcoin::Protocol::TxOut.value_to_address(value, "msPHTrHSktDLMwPXcMYwWTqth3ZyykN17H") # <- dest address (our donation address)

    # if all in and outputs are defined, start signing inputs.
    key = Bitcoin.open_key(Connect.get_private_key) # <- privkey
    sig = Bitcoin.sign_data(key, tx.signature_hash_for_input(0, prev_tx))
    tx.in[0].script_sig = Bitcoin::Script.to_signature_pubkey_script(sig, [key.public_key_hex].pack("H*"))
    #tx.in[0].add_signature_pubkey_script(sig, key.public_key_hex)

    # finish check
    tx = Bitcoin::Protocol::Tx.new( tx.to_payload )
    p tx.verify_input_signature(0, prev_tx) == true
    hex =  tx.to_payload.unpack("H*")[0] # hex binary
    puts hex.to_s
#Error sending transaction: Transaction 4a762238529450737b85ad481deae0e836e623afd63e04a29a5b90363c0345fd has too high fees: 12372992.

The fee of a transaction is just the difference between the input and the output value. In you case, your output value is 0.0005 BTC. If you choose an input which is larger than the output you want to send as well as the fee, you have to create a change output to send the rest back to your wallet as well, otherwise it will all go to the miners as fees. For example, if your input was 0.25 BTC, and you wanted to send 0.15 BTC and only pay 0.01 BTC fee, your transaction would need to have two outputs, one for 0.15 BTC, and one for 0.09 BTC back to an address you own, so that the total fee is just (0.25-(0.15+0.9) = 0.01)

You can use sibit , my Ruby gem:

require 'sibit'
sibit = Sibit.new
pkey = sibit.generate
address = sibit.create(pkey)
balance = sibit.balance(address)
target = sibit.create(pkey) # where to send coins to
change = sibit.create(pkey) # where the change will sent to
tx = sibit.pay(pkey, 10_000_000, 'XL', [address], target, change)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM