13

I have been able to program an application in python that sends valid transactions that spend 1 input, but I really can't get it to work with 2 or more inputs.

So my question is, how exactly is the hash that has to be signed for each input calculated?

What I have been doing so far, is, for example, if we have 2 inputs, we generate a transaction that spends only that first input, and thats the hash that has to be signed for the first input. And the same with the second input, we generate a transaction that only spends that second input. Both transactions need to have the same outputs.

Is that correct? For example, we want to spend input aaaa:0 and input bbbb:1 and we want to send them to some address:

To calculate the hash that the first input has to sign, we need to generate this transaction:

'version': 1,
'inputs': (1)
    'output_tx_hash': 'aaaa',
    'output_position': 0,
    'script': the original script, like: '76a914' + hash + '88ac',
    'sequence': ffffffff,
'outputs': (1)
    'value' : 100000
    'script' : '76a914' + hash of btc pub key + '88ac'
'locktime': 0

And to calculate the hash that the second input has to sign:

'version': 1,
'inputs': (1)
    'output_tx_hash': 'bbbb', # this changes
    'output_position': 1,     # this changes
    'script': the original script, like: '76a914' + hash + '88ac',
    'sequence': ffffffff,
'outputs': (1)
    'value' : 100000
    'script' : '76a914' + hash of btc pub key + '88ac'
'locktime': 0

We serialize them, add them 01000000 (SIGHASH_ALL), double sha256 that, sign it, and add 01. That way we get the two signatures that we will use on each input respectively. My application does exactly that and doesn't work. What am I missing?

  • Perhaps take a look at python-bitcoinlib. – Anonymous Nov 3 '15 at 21:51
  • The exact procedure is documented in this question: bitcoin.stackexchange.com/questions/3374/… – Jimmy Song Nov 4 '15 at 3:30
  • 1
    That procedure shows how to sign a transaction with only one input. Thats the answer I used to learn how to sign 1 input, and I achieved it, but with 2 or more inputs I just can't make it work, and that answer doesn't say how it should be done. – Nathan Parker Nov 4 '15 at 13:08
14

I found the way to do it, so, if anyone is interested, here is how to do it:

When you have more than 1 input, you don't have to remove the inputs that you are not going to sign, you have to remove only their scripts. So, if you want to sign the transaction posted in the question, the first hash would be calculated like so:

'version': 1,
'inputs': (2)
    {
    'output_tx_hash': 'aaaa',
    'output_position': 0,
    'script': the original script, like: '76a914' + hash + '88ac',
    'sequence': ffffffff,
    }, {
    'output_tx_hash': 'bbbb',
    'output_position': 1,
    'script': '', # Nothing
    'sequence': ffffffff,
    }
'outputs': (1)
    'value' : 100000
    'script' : '76a914' + hash of btc pub key + '88ac'
'locktime': 0

And the second hash:

'version': 1,
'inputs': (2)
    {
    'output_tx_hash': 'aaaa',
    'output_position': 0,
    'script': '', # Nothing
    'sequence': ffffffff,
    }, {
    'output_tx_hash': 'bbbb',
    'output_position': 1,
    'script': the original script, like: '76a914' + hash + '88ac',
    'sequence': ffffffff,
    }
'outputs': (1)
    'value' : 100000
    'script' : '76a914' + hash of btc pub key + '88ac'
'locktime': 0

Hope it helps anyone.

  • 1
    Dude, I've been researching this all friggin' day. I wish I would've seen this five hours ago. Thanks so much. – Festus Martingale Feb 23 '17 at 0:09
1

It worked for me too.

You just have to

1) Compose signable for the first input, with zero length string as script for all inputs besides the one that is signed

2) Sign the first input with der encoding of signed signable from 1.

3) Have the same operation on every input

0

Yes, this does work, just beware that when it says

'script': '' # Nothing

you should actually place a 0x00 there. Once I did that, I successfully managed to broadcast my multiple inputs transaction. Initially, I literally had nothing there (not a single byte), which is not gonna work.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.