edgecase_datafeed1752020-09-12
This is the date at the time of creation of this datafeed article. A checkpoint article containing a hash of this datafeed article may be created on this date or at a later date.14492020-05-28bitcoinb27618deae05910f529240cc6960aeb87f017b12d302327253ee893825ce2bd46321001HtwyqFWNVDoSEVqZwjBRRAV2oEsi8aQXr13MfGs39pR5aEK4iKdoLjVYXKwi6Y3uyPqRecipe_for_looking_up_the_unspent_outputs_in_a_Bitcoin_addressstjohn_piano2020-09-12no
Parts
- Description
- Notes
- Recipe
- Examples
Description
This recipe describes a method of looking up the unspent outputs associated with a Bitcoin address.
The unspent outputs can be used:
- to calculate the balance of the address.
- as inputs to a new Bitcoin transaction.
Notes
Bitcoin is stored in a Bitcoin address.
An address holds "unspent outputs", which have been created by previous Bitcoin transactions.
(The sum of the values in the unspent outputs) = (the amount of bitcoin that is held in the address).
Any unspent output used as an input in a transaction becomes "spent".
Recipe
Block explorers usually:
- allow a user to look up an address and see a list of all related transactions.
- look up a transaction and get information about its inputs and outputs.
These two features can be used to derive the list of unspent outputs in an address.
1) Look up the address on a block explorer.
The address page should contain a list of transactions in which this address appears. This list will probably be in reverse chronological order and may be paginated.
2) Create lists
Make a list of inputs. Label each input.
Example: A1/T1/Input0 (Address 1, Transaction 1, Input 0)
Make a list of outputs. Label each output.
Example: A1/T1/Output0 (Address 1, Transaction 1, Output 0)
3) Look up each transaction on the block explorer.
Find these details for each of its inputs:
- txid
- previous_output_index
- satoshi_value
Notes:
- The txid is the txid of the previous transaction that created this input, not the current transaction, which spends it. When the input was created, it was an "unspent output".
- The previous_output_index is the implicit 0-indexed position of the input in the previous transaction's output list.
Add each input to the list of inputs.
Example:
A1/T1/Input0:
- txid:
9d64ba7c5afdb3caa79bb79c35dde09af70b27829241b2823e4ffb918c75d153
- previous_output_index: 0
- satoshi_value: 1000000
Find these details for each of its outputs:
- txid
- address
- satoshi_value
- output_index (the 0-indexed position of the output in the transaction's output list)
Notes:
- The txid is the txid of the current transaction. The other details are specific to the output.
- If the output list is long, it can be difficult to count the output_index without making a mistake. Suggestion: Copy the output list to a new text file and add an "output_index" field for each output, starting at 0, and incrementing by 1 each time.
Add each output to the list of outputs.
Example:
A1/T1/Output0:
- txid:
585f054c01139bdae20ff8fa233c4cda47db6d891a387e37dfd56f9cb39d1bea
- address:
12YCFdpsRDvEHNcj5rsmvJ5G2XXkW1icJP
- satoshi_value: 474300
- output_index: 0
The block explorer may use different names for the various details.
4) Create a second list of outputs.
Go through the first list. Copy over any outputs that sent bitcoin to the address to this second list.
5) Remove any spent outputs.
Remove all outputs from the second list of outputs where:
- the output's txid is identical to a txid of an input in the list of inputs.
and
- the output's output_index is identical to the same input's previous_output_index.
6) Result.
The second output list should now contain only unspent outputs.
The balance of the address can be calculated by summing the satoshi_values of the unspent outputs.
Each of these unspent outputs can be used as an input in a new Bitcoin transaction (assuming of course that you have the Bitcoin private key that controls the address).
Examples
This recipe was written during the previous project
articleCreating_and_signing_a_standard_Bitcoin_transaction_with_two_inputs_and_two_outputsedgecase173Creating and signing a standard Bitcoin transaction with two inputs and two outputs
, so I was able to test these examples while some of the test addresses still contained unspent outputs.
I'll use this block explorer:
hyperlinkhttp://live.blockcypher.comlive.blockcypher.com
I'll look up the unspent outputs in address A1:
1BB66Gx4833uKx8Lo2k8Mt4TRk42WTr7cZ
Search for A1 in the block explorer.
Address page:
hyperlinkhttp://live.blockcypher.com/btc/address/1BB66Gx4833uKx8Lo2k8Mt4TRk42WTr7cZlive.blockcypher.com/btc/address/1BB66Gx4833uKx8Lo2k8Mt4TRk42WTr7cZ
Currently, there are 2 transactions listed, with these txids:
585f054c01139bdae20ff8fa233c4cda47db6d891a387e37dfd56f9cb39d1bea
9d64ba7c5afdb3caa79bb79c35dde09af70b27829241b2823e4ffb918c75d153
Each transaction has 1 input and 2 outputs.
The transactions are in reverse chronological order.
The balance is 0, so we know that this address contains 0 unspent outputs. Nonetheless, we'll go through the recipe, and confirm that it produces 0 unspent outputs. Afterwards, we'll use the same procedure on an address with a non-zero balance.
Each txid is a link to a page for the corresponding transaction.
Transaction pages:
hyperlinkhttp://live.blockcypher.com/btc/tx/585f054c01139bdae20ff8fa233c4cda47db6d891a387e37dfd56f9cb39d1bealive.blockcypher.com/btc/tx/585f054c01139bdae20ff8fa233c4cda47db6d891a387e37dfd56f9cb39d1beahyperlinkhttp://live.blockcypher.com/btc/tx/9d64ba7c5afdb3caa79bb79c35dde09af70b27829241b2823e4ffb918c75d153live.blockcypher.com/btc/tx/9d64ba7c5afdb3caa79bb79c35dde09af70b27829241b2823e4ffb918c75d153
For each transaction, click Advanced Details / API Call. This supplies the raw transaction information in JSON format.
This particular block explorer uses these names in the inputs:
- "prev_hash" (txid)
- "output_index" (previous_output_index)
- "output_value" (satoshi_value)
In the transaction, it uses the name "hash" instead of "txid".
And in the outputs, it:
- supplies an "addresses" list instead of a single "address" for the output.
- uses the name "value" instead of "satoshi_value".
List of inputs:
A1/T1/Input0: (Address 1, Transaction 1, Input 0)
- txid:
9d64ba7c5afdb3caa79bb79c35dde09af70b27829241b2823e4ffb918c75d153
- previous_output_index: 0
- satoshi_value: 1000000
A1/T2/Input0:
- txid:
3825d2a6007b788adca311c4a3c8c6d085b2c3e74deca17eb2d7f73f236217d8
- previous_output_index: 2
- satoshi_value: 31634145
List of outputs:
A1/T1/Output0:
- txid:
585f054c01139bdae20ff8fa233c4cda47db6d891a387e37dfd56f9cb39d1bea
- address:
12YCFdpsRDvEHNcj5rsmvJ5G2XXkW1icJP
- satoshi_value: 474300
- output_index: 0
A1/T1/Output1:
- txid:
585f054c01139bdae20ff8fa233c4cda47db6d891a387e37dfd56f9cb39d1bea
- address:
1H5SUR7Fv7x252WuJPqBjewwpeHuJ218Ky
- satoshi_value: 500000
- output_index: 1
A1/T2/Output0:
- txid:
9d64ba7c5afdb3caa79bb79c35dde09af70b27829241b2823e4ffb918c75d153
- address:
1BB66Gx4833uKx8Lo2k8Mt4TRk42WTr7cZ
- satoshi_value: 1000000
- output_index: 0
A1/T2/Output1:
- txid:
9d64ba7c5afdb3caa79bb79c35dde09af70b27829241b2823e4ffb918c75d153
- address:
1FMfKo3ArFcuaFHXw5zmgYCeLpqefVQdg8
- satoshi_value: 30604848
- output_index: 1
Second list of outputs (those that sent bitcoin to address A1):
A1/T2/Output0:
- txid:
9d64ba7c5afdb3caa79bb79c35dde09af70b27829241b2823e4ffb918c75d153
- address:
1BB66Gx4833uKx8Lo2k8Mt4TRk42WTr7cZ
- satoshi_value: 1000000
- output_index: 0
Look through the list of inputs. If any input has the same txid and output_index, then this output has been spent.
Yup, here it is:
A1/T1/Input0:
- txid:
9d64ba7c5afdb3caa79bb79c35dde09af70b27829241b2823e4ffb918c75d153
- previous_output_index: 0
- satoshi_value: 1000000
So: Address A1 contains no unspent outputs. It therefore has a balance of 0 bitcoin, and cannot supply any inputs for a new Bitcoin transaction.
Now, let's go through the recipe again, but with address A2 from the previous project.
Address A2:
12YCFdpsRDvEHNcj5rsmvJ5G2XXkW1icJP
Search for A2 in the block explorer.
Address page:
hyperlinkhttp://live.blockcypher.com/btc/address/12YCFdpsRDvEHNcj5rsmvJ5G2XXkW1icJPlive.blockcypher.com/btc/address/12YCFdpsRDvEHNcj5rsmvJ5G2XXkW1icJP
Currently, there is 1 transaction listed, with this txid:
585f054c01139bdae20ff8fa233c4cda47db6d891a387e37dfd56f9cb39d1bea
The balance is 0.004743, so we know that this address contains at least unspent output.
Transaction page:
hyperlinkhttp://live.blockcypher.com/btc/tx/585f054c01139bdae20ff8fa233c4cda47db6d891a387e37dfd56f9cb39d1bealive.blockcypher.com/btc/tx/585f054c01139bdae20ff8fa233c4cda47db6d891a387e37dfd56f9cb39d1bea
Click Advanced Details / API Call. This leads to a page containing the raw transaction information in JSON format.
List of inputs:
A2/T1/Input0:
- txid:
9d64ba7c5afdb3caa79bb79c35dde09af70b27829241b2823e4ffb918c75d153
- previous_output_index: 0
- satoshi_value: 1000000
List of outputs:
A2/T1/Output0:
- txid:
585f054c01139bdae20ff8fa233c4cda47db6d891a387e37dfd56f9cb39d1bea
- address:
12YCFdpsRDvEHNcj5rsmvJ5G2XXkW1icJP
- satoshi_value: 474300
- output_index: 0
A2/T1/Output1:
- txid:
585f054c01139bdae20ff8fa233c4cda47db6d891a387e37dfd56f9cb39d1bea
- address:
1H5SUR7Fv7x252WuJPqBjewwpeHuJ218Ky
- satoshi_value: 500000
- output_index: 1
Second list of outputs (those that sent bitcoin to address A2):
A2/T1/Output0:
- txid:
585f054c01139bdae20ff8fa233c4cda47db6d891a387e37dfd56f9cb39d1bea
- address:
12YCFdpsRDvEHNcj5rsmvJ5G2XXkW1icJP
- satoshi_value: 474300
- output_index: 0
Look through the list of inputs. If any input has the same txid and output_index, then this output has been spent.
Nope. This output is unspent.
The bitcoin in address A2 is the sum of the values of the unspent outputs stored in the address.
In this case, the sum is the satoshi_value of A2/T1/Output0: 474300 satoshi (0.00474300 bitcoin).
This unspent output can be used as an input for a new Bitcoin transaction.
iQIcBAABCgAGBQJfXRIfAAoJECL1OzZgiBhwpcYP/j9WHGDJBOognjSEunHjq217
o0WswoaQzyzzh1iJk3KV6NRE/ZoCf/46mMJ0K7yIraJWaS6p86PQ6I7y8zkZCzXd
CVcTPFFLwj5Gc2Kzt+QP97B+L0IQT/uZX/5LoxNtv/Re+wWWl9xg9jdeLhUuiiGN
EDfNOqwAxocY92Br3LuivZCzfmwjL8UKuGrARcK2xxG5sgai54VnLELXpVf3MRtV
pKzRFOZPrbKDg6oBnHsj4GlX1FIwD6WQq+pIPtPRJq77In4W1HUqVMAQU5p8pCu8
s6dv/cpqVnZOmEdzYMyMVHJR0+Jx1I/5U5pnj4M60JjQHgTg0FdXtiYbInNWfX/R
suah9wrseNfqCXaAMEZNBZparuuiJApxC9QyF71V8x2aaTTvDREZqKbW2AABGlc9
Nvu6bIUwDcZzfj1BGJYnYFhtB5lcLgY0uZQNQBn4E9vyxBpGLRw10kraAuMlYCPS
xSrO8xUTZ+Lsv4PTIso7IATYK1zcH+06y174b7NR+ttzGJpsEXTdMArkyFi49zYQ
aCGrUgvL2yxSfgpKiBFYTcsw0FKtKjt4OjfA2eubCDVn7zdQb+q3n3dOBdV5x5Fn
ZxnIqk3e5WtOfkmE0hh3gy9aGxm7kFlDt55qFTz5IYCyhKqYiKFzO+zW3GYXaTXh
+O12kVJwVOeHptaoOPzO
=Dd72