18

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?

3
  • Perhaps take a look at python-bitcoinlib.
    – Claris
    Commented Nov 3, 2015 at 21:51
  • The exact procedure is documented in this question: bitcoin.stackexchange.com/questions/3374/…
    – Jimmy Song
    Commented Nov 4, 2015 at 3:30
  • 2
    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. Commented Nov 4, 2015 at 13:08

3 Answers 3

20

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.

3
  • 1
    Dude, I've been researching this all friggin' day. I wish I would've seen this five hours ago. Thanks so much. Commented Feb 23, 2017 at 0:09
  • Same! I couldn't be more happy to find this.
    – rllola
    Commented Jul 14, 2019 at 17:27
  • So what do you do with the two hashes?
    – mancini0
    Commented Apr 24, 2020 at 14:11
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

1

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 and acknowledge you have read our privacy policy.

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