简体   繁体   English

如何使用比特币-卢比广播原始交易?

[英]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 我使用了https://github.com/lian/bitcoin-ruby的 bitcoin-ruby gem

    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. 在这种情况下,您的输出值为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) 例如,如果您输入的是0.25 BTC,而您想发送0.15 BTC且仅支付0.01 BTC费用,则您的交易将需要有两个输出,一个为0.15 BTC,一个为0.09 BTC,返回到您拥有的地址,因此总费用仅为(0.25-(0.15 + 0.9)= 0.01)

You can use sibit , my Ruby gem: 您可以使用sibit ,这是我的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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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