:: Re: [Libbitcoin] How to fill in scr…
Page principale
Supprimer ce message
Répondre à ce message
Auteur: Amir Taaki
Date:  
À: libbitcoin
Sujet: Re: [Libbitcoin] How to fill in scriptSig
Firstly that error should disappear if you use the git version of sx.
The Obelisk server format was changed recently and sx was not updated
(now fixed in git).

The public key in that transaction (which starts with 03, not 04) is a
compressed public key. Both public keys are valid.

Have you tried creating a transaction on Bitcoin mainnet?

Were you successful with this tutorial on testnet?
http://sx.dyne.org/offlinetx.html
If not, then try mainnet.

Then if you are successful with that tutorial, try constructing the same
transaction as your code using only command line tools.

If that works, then try your code (without signing). Is it the same
transaction as when you used the command line tools?

Try signing the transaction using command line tools. Note: the
script_code which you sign for the inputs should be the address for the
previous output of that input (which you are doing correctly in your
code by getting the address of your key).

If you get the command line signing working then it should be easy to
identify the problem in your code. If you can't get the command line
signing working, then try performing the entire steps for normal mainnet
(not testnet) transactions.

Use this to push non standard transactions to the blockchain instead of
normal broadcast to get around the bitcoind relay rules:

http://eligius.st/~wizkid057/newstats/pushtxn.php

On 09/12/13 02:26, Chang Lan wrote:
> Same result when I tried with smaller amount of testcoins.
>
> I noticed that the input script might wrong, but I couldn't use validtx,
> since I always got "terminate called after throwing an instance of
> 'libbitcoin::end_of_stream’”.
>
> For example, for this transaction:
> 010000000188fd0fc89dcd3f405c151ca59e97995cf85749b7ab600cf52b62bcf83405d915010000008b4830450220408bd8359dfe03a55f881f99b25a28cc691ccb4e29c825947e835c4a03f9bda20221008000ba23c20d19225a3e6f4f7351b0fbb9f7fc2bcb110605653d36ea8ac12a34014104b6d4cb502f6b016e310293dfe16336543f69d0b9afbf1f65f8eb7210753e925ef2e72af93ddf9ab626251a589246107a7524faa00dfc07bc41026c082b07714fffffffff020a0000000000000087524104b6d4cb502f6b016e310293dfe16336543f69d0b9afbf1f65f8eb7210753e925ef2e72af93ddf9ab626251a589246107a7524faa00dfc07bc41026c082b07714f4104b6d4cb502f6b016e310293dfe16336543f69d0b9afbf1f65f8eb7210753e925ef2e72af93ddf9ab626251a589246107a7524faa00dfc07bc41026c082b07714f52aef66c7c4d000000001976a9146afaed9a226fc9e1550278b739b278a9590fccba88ac00000000
>
> showtx shows:
> Input:
> previous output:
> 15d90534f8bc622bf50c60abb74957f85c99979ea51c155c403fcd9dc80ffd88:1
> script: [
> 30450220408bd8359dfe03a55f881f99b25a28cc691ccb4e29c825947e835c4a03f9bda20221008000ba23c20d19225a3e6f4f7351b0fbb9f7fc2bcb110605653d36ea8ac12a3401
> ] [
> 04b6d4cb502f6b016e310293dfe16336543f69d0b9afbf1f65f8eb7210753e925ef2e72af93ddf9ab626251a589246107a7524faa00dfc07bc41026c082b07714f
> ]
>
> However, when I retrieve an arbitrary transaction from network:
> $ sx fetch-transaction
> 15d90534f8bc622bf50c60abb74957f85c99979ea51c155c403fcd9dc80ffd88 | sx showtx
>
> hash: 15d90534f8bc622bf50c60abb74957f85c99979ea51c155c403fcd9dc80ffd88
> version: 1
> locktime: 0
> Input:
> previous output:
> 36d162f6292c62d9d60cd9ea152aaddb94de0301f5dbe0ff3f055a35bc4ee54e:0
> script: [
> 3046022100c6fd593068adaa263aa0b98af6b83fd29cf15df7cdeb7d31dc7b44c9c3b4307a022100a50990f3c60df0d3ee8d11d93d39ee07ec4623880ac7e191c9e680562bcfff6f01
> ] [ 03cc32d912091b053d34aa12d0a272eb40a1ff9a0309ddcb32a98f39af74af6924 ]
>
> Why its public key (second part of the script) is shorter than mine?
>
> (My
> code: https://github.com/changlan/tor-incentive/blob/master/main.cpp#L87)
>
> Best,
> Chang
>
> On Sunday, December 8, 2013 at 5:17 PM, Amir Taaki wrote:
>
>> aha ok. I would just use the normal main net. I've got mine built for
>> mainnet which is why it interprets your addresses as normal bitcoin
>> addresses.
>>
>> I'll look into that message. have you tried your code with a tiny amount
>> of BTC? don't forget to put a fee too.
>>
>> On 09/12/13 00:34, Chang Lan wrote:
>>> The “address” in both input and the second output
>>> is mnRQG7kRAapsriWL8hKHRWpw6AgSyWWmn4 in my machine. I have no idea why
>>> we saw difference. I built the libbitcoin with ‘—enable-testnet’.
>>>
>>> I tried to make the transaction using ‘mktx’. Here is we I got:
>>>
>>> $ sx mktx txfile.tx --input
>>> cb502ebca60cfe43bf0cd1c91a50ab07590eb8d35c3b2d29306693dfa36047d0:0
>>> --output mnRQG7kRAapsriWL8hKHRWpw6AgSyWWmn4:309999990
>>>
>>> Added input
>>> cb502ebca60cfe43bf0cd1c91a50ab07590eb8d35c3b2d29306693dfa36047d0:0
>>> mktx: Unsupported address type.
>>>
>>> mnRQG7kRAapsriWL8hKHRWpw6AgSyWWmn4 is the address I have:
>>> https://blockexplorer.com/testnet/address/mnRQG7kRAapsriWL8hKHRWpw6AgSyWWmn4
>>>
>>> Best,
>>> Chang
>>>
>>> On Sunday, December 8, 2013 at 1:21 PM, Amir Taaki wrote:
>>>
>>>> Are you able to construct the tx using the command line tools sx?
>>>>
>>>> Then you can port the code as you use it piece by piece into your own
>>>> application.
>>>>
>>>> You need to update sx from the git repository (that should be fixed).
>>>> Here's what I see:
>>>>
>>>> hash: 43919afd984bf86a421bc5d32ddc25bbaad996d6429a0e6a81b6d6059aa86db2
>>>> version: 1
>>>> locktime: 0
>>>> Input:
>>>> previous output:
>>>> cb502ebca60cfe43bf0cd1c91a50ab07590eb8d35c3b2d29306693dfa36047d0:0
>>>> script: [
>>>> 3045022100b4760147383d74cc68c1004755d3e210949370358309d5d64e81f3ec0e54ba470220540d21755a68946f19eaebb1b7b3c5649ee5825ac7363bdededcf445f2912a3001
>>>> ] [
>>>> 04a0160a564377fc9af6100827cf0726bf794aa57c6b908731b0cd6057da8a8ae01597c54fdce5b0b58cbd87de98821c71c638724dac5c93c7539d7f3351c20a5f
>>>> ]
>>>> sequence: 4294967295
>>>> address: 17uSy4fSMZPd5c2iR8LubbccEB5jyJi9rc
>>>> Output:
>>>> value: 10
>>>> script: 2 [
>>>> 04a0160a564377fc9af6100827cf0726bf794aa57c6b908731b0cd6057da8a8ae01597c54fdce5b0b58cbd87de98821c71c638724dac5c93c7539d7f3351c20a5f
>>>> ] [
>>>> 04a0160a564377fc9af6100827cf0726bf794aa57c6b908731b0cd6057da8a8ae01597c54fdce5b0b58cbd87de98821c71c638724dac5c93c7539d7f3351c20a5f
>>>> ] 2 checkmultisig
>>>> Output:
>>>> value: 309999990
>>>> script: dup hash160 [ 4bbc0f7fff6b9135e3bf1a472b464ec127947cfb ]
>>>> equalverify checksig
>>>> address: 17uSy4fSMZPd5c2iR8LubbccEB5jyJi9rc
>>>>
>>>>
>>>> On 08/12/13 21:18, Chang Lan wrote:
>>>>> Thanks Amir!
>>>>>
>>>>> I am using testnet so the TXDATA is for testnet:
>>>>>
>>>>> 0100000001d04760a3df936630292d3b5cd3b80e5907ab501ac9d10cbf43fe0ca6bc2e50cb000000008b483045022100b4760147383d74cc68c1004755d3e210949370358309d5d64e81f3ec0e54ba470220540d21755a68946f19eaebb1b7b3c5649ee5825ac7363bdededcf445f2912a30014104a0160a564377fc9af6100827cf0726bf794aa57c6b908731b0cd6057da8a8ae01597c54fdce5b0b58cbd87de98821c71c638724dac5c93c7539d7f3351c20a5fffffffff020a0000000000000087524104a0160a564377fc9af6100827cf0726bf794aa57c6b908731b0cd6057da8a8ae01597c54fdce5b0b58cbd87de98821c71c638724dac5c93c7539d7f3351c20a5f4104a0160a564377fc9af6100827cf0726bf794aa57c6b908731b0cd6057da8a8ae01597c54fdce5b0b58cbd87de98821c71c638724dac5c93c7539d7f3351c20a5f52ae76397a12000000001976a9144bbc0f7fff6b9135e3bf1a472b464ec127947cfb88ac00000000
>>>>>
>>>>> sx showtx worked well but when I used the command
>>>>>
>>>>> echo TXDATA | sx validsx
>>>>>
>>>>> I got
>>>>>
>>>>> terminate called after throwing an instance of
>>>>> 'libbitcoin::end_of_stream’
>>>>>
>>>>> Best,
>>>>> Chang
>>>>>
>>>>> On Sunday, December 8, 2013 at 12:59 PM, Amir Taaki wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> Your code looks correct. You can use the command:
>>>>>>
>>>>>> echo TXDATA | sx validtx
>>>>>>
>>>>>> to check the correctness of the tx (but I'm not sure if the reported
>>>>>> erros are always correct - I need to investigate that).
>>>>>>
>>>>>> You can also examine the data using:
>>>>>>
>>>>>> echo TXDATA | sx showtx
>>>>>>
>>>>>> your sign code is correct, and the other code looks good. If you
>>>>>> give me
>>>>>> the hex I can see if I spot anything.
>>>>>>
>>>>>> Here's some code for constructing transactions:
>>>>>>
>>>>>> https://github.com/spesmilo/sx/blob/master/src/wallet.cpp
>>>>>> (see line 361 to 521)
>>>>>>
>>>>>> https://github.com/darkwallet/python-obelisk/blob/master/examples/mktx.py
>>>>>> https://github.com/darkwallet/python-obelisk/blob/master/obelisk/bitcoin.py
>>>>>> (see line 998)
>>>>>>
>>>>>> On 08/12/13 20:50, Chang Lan wrote:
>>>>>>> Hi there,
>>>>>>>
>>>>>>> I tried making a valid transaction using libbitcoin, but it seems
>>>>>>> that
>>>>>>> the transaction turns out to be invalid. Below is the code
>>>>>>> snippet that
>>>>>>> I used to create a transaction. Can anyone point out if I did it
>>>>>>> wrong?
>>>>>>> Thanks!
>>>>>>>
>>>>>>> void add_input(transaction_type& tx, const output_point& output)
>>>>>>> {
>>>>>>> transaction_input_type input;
>>>>>>> output_point& prevout = input.previous_output;
>>>>>>> prevout = output;
>>>>>>> input.sequence = 4294967295;
>>>>>>> tx.inputs.push_back(input);
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> bool sign(transaction_type& tx, size_t input_index, const
>>>>>>> elliptic_curve_key& key, const script_type& script_code)
>>>>>>> {
>>>>>>> transaction_input_type& input = tx.inputs[input_index];
>>>>>>> const data_chunk public_key = key.public_key();
>>>>>>> if (public_key.empty())
>>>>>>> {
>>>>>>> std::cerr << "internal error getting public key" << std::endl;
>>>>>>> return false;
>>>>>>> }
>>>>>>> hash_digest tx_hash = script_type::generate_signature_hash(tx,
>>>>>>> input_index, script_code, 1);
>>>>>>> if (tx_hash == null_hash)
>>>>>>> {
>>>>>>> std::cerr << "error generating signature hash" << std::endl;
>>>>>>> return false;
>>>>>>> }
>>>>>>> data_chunk signature = key.sign(tx_hash);
>>>>>>> signature.push_back(0x01);
>>>>>>>
>>>>>>> script_type input_script;
>>>>>>> input_script.push_operation({opcode::special, signature});
>>>>>>> std::cout << key.public_key().size() << std::endl;
>>>>>>> input_script.push_operation({opcode::special, key.public_key()});
>>>>>>> tx.inputs[input_index].script = input_script;
>>>>>>>
>>>>>>> return true;
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> bool create_channel_tx(transaction_type& tx, const data_chunk&
>>>>>>> payee_public_key, const data_chunk& payer_public_key, uint64_t value)
>>>>>>> {
>>>>>>> /* … */
>>>>>>> */* called add_input() for each input */*
>>>>>>> // output 1
>>>>>>> script_type out_script = build_contract_script(acc.key.public_key(),
>>>>>>> remote_public_key);
>>>>>>> transaction_output_type output;
>>>>>>> output.value = value;
>>>>>>> output.script = out_script;
>>>>>>> tx.outputs.push_back(output);
>>>>>>> // output 2
>>>>>>> payment_address payaddr;
>>>>>>> set_public_key(payaddr, acc.key.public_key());
>>>>>>> script_type back_script = build_pubkey_hash_script(payaddr.hash());
>>>>>>> transaction_output_type back_output;
>>>>>>> back_output.value = collected_value - value;
>>>>>>> back_output.script = back_script;
>>>>>>> tx.outputs.push_back(back_output);
>>>>>>>
>>>>>>> // sign each input
>>>>>>> for (size_t i = 0; i < tx.inputs.size(); ++i)
>>>>>>> {
>>>>>>> sign(tx, i, acc.key, back_script);
>>>>>>> }
>>>>>>> return true;
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> Chang
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Libbitcoin mailing list
>>>>>>> Libbitcoin@??? <mailto:Libbitcoin@lists.dyne.org>
>>>>>>> https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/libbitcoin
>>>>>> _______________________________________________
>>>>>> Libbitcoin mailing list
>>>>>> Libbitcoin@??? <mailto:Libbitcoin@lists.dyne.org>
>>>>>> https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/libbitcoin
>>>
>>>
>>>
>>> _______________________________________________
>>> Libbitcoin mailing list
>>> Libbitcoin@??? <mailto:Libbitcoin@lists.dyne.org>
>>> https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/libbitcoin
>> _______________________________________________
>> Libbitcoin mailing list
>> Libbitcoin@??? <mailto:Libbitcoin@lists.dyne.org>
>> https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/libbitcoin
>
>
>
> _______________________________________________
> Libbitcoin mailing list
> Libbitcoin@???
> https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/libbitcoin
>