<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.bitcoin.it/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Etotheipi</id>
	<title>Bitcoin Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://en.bitcoin.it/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Etotheipi"/>
	<link rel="alternate" type="text/html" href="https://en.bitcoin.it/wiki/Special:Contributions/Etotheipi"/>
	<updated>2026-04-13T01:18:16Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Deterministic_wallet&amp;diff=37828</id>
		<title>Deterministic wallet</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Deterministic_wallet&amp;diff=37828"/>
		<updated>2013-05-15T20:03:43Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: Updating details on the Electrum and Armory wallets&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A deterministic wallet is a wallet where private and public keys are all derived from a starting seed value. This could be a long passcode/password, or be a random series of letters and numbers. &lt;br /&gt;
&lt;br /&gt;
== Benefits ==&lt;br /&gt;
&lt;br /&gt;
A typical wallet creates private and public keys on demand for the user. This means that the wallet needs to be backed up frequently, otherwise coins may be lost. Also, having multiple machines with wallets on them means it is difficult to manage all of your coins together.&lt;br /&gt;
&lt;br /&gt;
A deterministic wallet can be backed up by simply copying the starting seed value to a secure location, and this only needs to be done once. If the wallet ever gets lost, all private and public keys can be regenerated from the initial seed.&lt;br /&gt;
&lt;br /&gt;
Also, multiple devices could host the same wallet based off of the same seed and automatically stay in sync with eachother. Non-critical information such as address books would need to be stored and copied between wallets.&lt;br /&gt;
&lt;br /&gt;
==Drawbacks==&lt;br /&gt;
&lt;br /&gt;
If the initial seed value was either guessed or taken, the attacker could take all of the coins from the wallet. Also, they could retain that seed value, and wait until some future date to take all of the coins. &lt;br /&gt;
&lt;br /&gt;
==Passwords vs Random Strings==&lt;br /&gt;
&lt;br /&gt;
The passcode/password has the benefit of being memorizable by the user, but at the expense of being either forgotten, or weak enough that the password could be guessed or brute forced. If a user used a password such as abc123, and an attacker might simply go through a list of common passwords, create wallets for them, and see if the public addresses match anything currently in the blockchain.&lt;br /&gt;
&lt;br /&gt;
A long string of letters and numbers would be a way to prevent a brute force attack. This has the drawback of having to be actually stored somewhere. If this code was ever lost, the wallet would be lost forever.&lt;br /&gt;
&lt;br /&gt;
==Types of deterministic wallet in use==&lt;br /&gt;
Each implementer of deterministic wallets should make sure that this article leads to a publicly available reference describing how to reconstitute the deterministic wallet from its seed.&lt;br /&gt;
&lt;br /&gt;
===Type 1 deterministic wallet===&lt;br /&gt;
A Type 1 deterministic wallet is created from a string.  Simply take SHA256(string + n), where n is an ASCII-coded number that starts from 1 and increments as additional keys are needed.  This simple type of wallet can be created by Casascius Bitcoin Address Utility.&lt;br /&gt;
&lt;br /&gt;
===Type 2 deterministic wallet===&lt;br /&gt;
Not sure on the details, but mention was made of a &amp;quot;type-2 deterministic wallet&amp;quot; in [[BIP 0032]] and credited to Gregory Maxwell, so this is a placeholder to describe that implementation. The relevant form topic is [https://bitcointalk.org/index.php?topic=19137.0 here].&lt;br /&gt;
&lt;br /&gt;
===BIP 0032 deterministic wallet===&lt;br /&gt;
Described in [[BIP 0032]] (currently a draft) and described as a &#039;&#039;hierarchical deterministic&#039;&#039; (HD) wallet, a BIP 0032 deterministic wallet allows sharing smaller deterministic wallets that are subportions of a larger one.&lt;br /&gt;
&lt;br /&gt;
===Electrum deterministic wallet===&lt;br /&gt;
[[Electrum]] implements a Type-2 deterministic wallet format based on a 128-bit seed.  It uses a word list and converts the seed to a series of words as an aid to help the user record the seed.&lt;br /&gt;
&lt;br /&gt;
===Armory deterministic wallet===&lt;br /&gt;
[[Armory]] has its own Type-2 deterministic wallet format based on a &amp;quot;root key&amp;quot; and a &amp;quot;chain code.&amp;quot;  The Armory client has a &amp;quot;Paper Backup&amp;quot; screen that allows the user to print these data or copy it down by hand.  Earlier versions of Armory required backing up both the &amp;quot;root key&amp;quot; and &amp;quot;chaincode,&amp;quot; while newer versions start deriving the chaincode from the private key in a non-reversible way.  These newer Armory wallets (0.89+) only require the single, 256-bit root key.&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=File:Bitcoin_OpCheckSig_InDetail.png&amp;diff=34966</id>
		<title>File:Bitcoin OpCheckSig InDetail.png</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=File:Bitcoin_OpCheckSig_InDetail.png&amp;diff=34966"/>
		<updated>2013-01-13T03:52:07Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: Etotheipi uploaded a new version of &amp;amp;quot;File:Bitcoin OpCheckSig InDetail.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
A full breakdown of the process to verify the Bitcoin ECDSA signature of a pair of transactions.&lt;br /&gt;
Sadly, there are &#039;&#039;&#039;2 decisive errors&#039;&#039;&#039; in the picture: In step 7: &amp;quot;empty string&amp;quot; is &amp;quot;byte 0&amp;quot; and in step 8: the Subscript copied into TxIn script must be lead-in by its length coded as a var-int.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{self|Cc-zero}}&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=File:Bitcoin_OpCheckSig_InDetail.png&amp;diff=34965</id>
		<title>File:Bitcoin OpCheckSig InDetail.png</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=File:Bitcoin_OpCheckSig_InDetail.png&amp;diff=34965"/>
		<updated>2013-01-13T03:44:27Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: Etotheipi uploaded a new version of &amp;amp;quot;File:Bitcoin OpCheckSig InDetail.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
A full breakdown of the process to verify the Bitcoin ECDSA signature of a pair of transactions.&lt;br /&gt;
Sadly, there are &#039;&#039;&#039;2 decisive errors&#039;&#039;&#039; in the picture: In step 7: &amp;quot;empty string&amp;quot; is &amp;quot;byte 0&amp;quot; and in step 8: the Subscript copied into TxIn script must be lead-in by its length coded as a var-int.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{self|Cc-zero}}&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Hardfork_Wishlist&amp;diff=33470</id>
		<title>Hardfork Wishlist</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Hardfork_Wishlist&amp;diff=33470"/>
		<updated>2012-12-09T16:39:14Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is to record changes to Bitcoin that might be desirable, but that will require a &amp;quot;hard&amp;quot; block-chain split (everybody must upgrade, old software will not accept blocks/transactions created with the new [[Protocol rules|rules]], considering them to be [[Invalid block|invalid blocks]]).&lt;br /&gt;
&lt;br /&gt;
This page is *not* for changes that can be accomplished in way that is compatible with old software (for example, by making transactions [[Nonstandard block|nonstandard]] or by [[Discouraged block|discouraging blocks]]).&lt;br /&gt;
&lt;br /&gt;
====Changes to hard-coded limits====&lt;br /&gt;
* Replace hard-coded maximum block size (1,000,000 bytes) and maximum number of signature operations per block (20,000) with ???.&lt;br /&gt;
&lt;br /&gt;
====Major structural changes====&lt;br /&gt;
* &amp;quot;Flip the chain&amp;quot;, instead of committing to new transactions, commit to the summaries of open transactions: [https://bitcointalk.org/index.php?topic=505.0] [https://bitcointalk.org/index.php?topic=21995.0] [https://en.bitcoin.it/wiki/User:DiThi/MTUT#PROPOSAL:_Merkle_tree_of_unspent_transactions_.28MTUT.29.2C_for_serverless_thin_clients_and_self-verifiable_prunned_blockchain.] [https://bitcointalk.org/index.php?topic=88208.0]&lt;br /&gt;
* Increased efficiency for merged mining: restructure the primary header to make the bitcoin specific data non-mandatory. (e.g. the block chain specific stuff would go into second header connected by a header tree), making the primary headers pure timestamps and nonces.&lt;br /&gt;
* Switch to block hashing algorithm secure against block withholding attacks.&lt;br /&gt;
&lt;br /&gt;
====Transaction behavior changes====&lt;br /&gt;
* Improved signature types to allow for partial malleability of outputs.  (e.g. make it easier to add a fee onto someone elses transaction, or to take fees from a transaction without outputs set aside for that putpose)&lt;br /&gt;
* Elimination of output scripts: all transactions pay-to-scripthash, probably with a single byte indicating the scripthash type.  Other than reducing effective output script secrecy (which is not possible without OP_EVAL anyways) this is believed to be costless, and the secrecy can be recovered with recursive OP_EVAL. The motivation here is that data in outputs is far more expensive than inputs because some outputs may be never prunable, and pay-to-scripthash minimizes output size without harming total size.&lt;br /&gt;
* Allow soft-spending of generation outputs without confirmations (outputs of these transactions might also appear as generation themselves)&lt;br /&gt;
* Allow additional inputs to generation transactions&lt;br /&gt;
* Add new signature hashtype to include value of TxOut being spent, in the hash to be signed.  Doing this would remove the requirement that offline signing devices be sent all supporting transactions with the transaction-to-be-signed, just to confirm the transaction fee.&lt;br /&gt;
&lt;br /&gt;
====Cryptographic changes====&lt;br /&gt;
* Pervasive ECC public key-recovery to reduce transaction sizes (can be done partially without breaking compatibility completely)&lt;br /&gt;
* [http://ed25519.cr.yp.to/ Ed25519] (variant*) for much faster validation operations. (variant because the normal way Ed25519 is specified is not key recovery compatible)&lt;br /&gt;
* Support for a post-quantum signature scheme. [http://en.wikipedia.org/wiki/Lamport_signature Lamport signatures] have nice intuitive security properties, but it and all other similar schemes have extreme space requirements that would require structural changes to the blockchain to accommodate, (e.g. flip-chain+paytoscripthash+extensive pruning). Additional signature types could be kludged into the existing system with script extensions but would be better supported natively.&lt;br /&gt;
&lt;br /&gt;
====Currency changes====&lt;br /&gt;
&#039;&#039;Please don&#039;t list anything here which would significantly change the committed overall economics of the system, it&#039;s safe to assume anything with significant economic impact will _never_ be changed in Bitcoin&amp;lt;ref&amp;gt;[http://bitcointalk.org/index.php?topic=45468.msg542375#msg542375 Suggested MAJOR change to Bitcoin]&amp;lt;/ref&amp;gt;, because such changes would undermine the trust people have in the system, though they may form the basis of an interesting [[alternative chain]].&lt;br /&gt;
* Increase currency divisibility.&lt;br /&gt;
&lt;br /&gt;
====Navel gazing / Protocol housekeeping====&lt;br /&gt;
* Byte order consistency (big endian)&lt;br /&gt;
* Eliminate redundancies in the variable length integer encodings, possibly switch to a standard.&lt;br /&gt;
* Avoiding hashes covering malleable fields&lt;br /&gt;
&lt;br /&gt;
====Bug fixes====&lt;br /&gt;
* CHECKMULTISIG popping one-too-many items off the stack&lt;br /&gt;
* Difficulty adjustment periods should overlap (prevent potential &#039;timejacking&#039;)&lt;br /&gt;
* Difficulty adjustment should adapt to sudden hashrate loss. Note: all altchains which have attempted this have created significant security vulnerabilities in the process. Also interested parties could encourage mining by including high fee transactions in every block so avoiding need for this change.&lt;br /&gt;
* Scripts should be fully enabled after a careful audit.&lt;br /&gt;
* Miners/relays should not be able to inject extra arbitrary data into transactions?&lt;br /&gt;
* Use the previous block hash as an explicit or implicit prev_in in coinbases when hashing them to make it ~impossible to get a duplicate coinbase, thus removing the need for a pruning node to remember coinbase hashes to prevent duplicates consistently with the rest of the network&lt;br /&gt;
* coinbases must be parseable.&lt;br /&gt;
This changes would involve converting old blocks:&lt;br /&gt;
* uint64_t for timestamp field in blocks.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical]]&lt;br /&gt;
[[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=23101</id>
		<title>BIP 0010</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=23101"/>
		<updated>2012-01-31T01:25:58Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  BIP: 10&lt;br /&gt;
  Title: Multi-Sig Transaction Distribution&lt;br /&gt;
  Author: Alan Reiner  &lt;br /&gt;
  Status: Draft &lt;br /&gt;
  Type: Informational&lt;br /&gt;
  Created: 28-10-2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A multi-signature transaction is one where a certain number of Bitcoins are &amp;quot;encumbered&amp;quot; with more than one recipient address.  The subsequent transaction that spends these coins will require each party involved (or some subset, depending on the script), to see the proposed transaction and sign it with their private key.  This necessarily requires collaboration between all parties -- to propose a distribution of encumbered funds, collect signatures from all necessary participants, and then broadcast the completed transaction.&lt;br /&gt;
&lt;br /&gt;
This BIP describes a way standardize the encoding of proposal transactions, to assist with signature collection and broadcast (which includes regular, 1-of-1 transactions requiring signatures from an offline computer).  The goal is to encourage a standard that guarantees interoperability of all programs that implement it.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Motivation==&lt;br /&gt;
&lt;br /&gt;
The enabling of multi-signature transactions in Bitcoin will introduce a great deal of extra functionality to the users of the network, but also a great deal of extra complexity.  Executing a multi-signature tx will be a multi-step process, and will potentially get worse with multiple clients, each implementing this process differently.  By providing an efficient, standardized technique, we can improve the chance that developers will adopt compatible protocols and not bifurcate the user-base based on client selection.&lt;br /&gt;
&lt;br /&gt;
In addition to providing a general encoding scheme for transaction signing/collection, it does not require the signing device to hold any blockchain information (all information needed for verification and signing is part of the encoding).  This enables the existence of very lightweight devices that can be used for signing since they do not need the blockchain -- only a minimal set of Bitcoin tools and an ECDSA module.  Therefore, BIP 0010 has benefit beyond just multi-signature transactions.&lt;br /&gt;
&lt;br /&gt;
==Specification==&lt;br /&gt;
&lt;br /&gt;
This BIP proposes the following process, with terms in quotes referring to recommended terminology that should be encouraged across all implementations.  &lt;br /&gt;
&lt;br /&gt;
#  One party will initiate this process by creating a &amp;quot;Distribution Proposal&amp;quot;, which could be abbreviated DP, or TxDP&lt;br /&gt;
#  The user creating the TxDP (the preparer) will create the transaction as they would like to see it spent, but with blank TxIn scripts (where the signatures scripts will eventually go).&lt;br /&gt;
#  The proposed transaction will be spending a set of unspent TxOuts available in the blockchain.  The full transactions containing these TxOuts will be serialized and included, as well.  This so that the values of the TxIns can be verified before signing (the prev-tx-hash is part of the data being signed, but the value is not).  By including the full tx, the signing party can verify that the tx matches the OutPoint hash, and then verify input values, all without any access to the blockchain.&lt;br /&gt;
#  The TxDP will have an &amp;quot;DP ID&amp;quot; or &amp;quot;Unsigned ID&amp;quot; which is the hash of the proposed transaction with blanked scripts, in Base58.  This is a specific naming convention to make sure it is not confused with the actual the transaction ID that it will have after it is broadcast (the transaction ID cannot be determined until after all signatures are collected).  The final Tx ID can be referred to as its &amp;quot;Broadcast ID&amp;quot;, in order to distinguish it from the pre-signed ID. &lt;br /&gt;
#  The TxDP will have an potentially-unordered list of sig-pubkey pairs which represent collected signatures.  If you receive a TxDP missing only your signature, you can broadcast it as soon as you sign it.&lt;br /&gt;
#  Identical TxDP objects with different signatures can be easily combined.  This allows one party to send out all the requests for signatures at once, and combine them all when they are received (instead of having to &amp;quot;pass it around&amp;quot;.&lt;br /&gt;
#  For cases where the TxDP might be put into a file or sent via email, it should use .txdp or .btcdp suffix&lt;br /&gt;
&lt;br /&gt;
Anyone adopting BIP 0010 for multi-sig transactions will use the following format (without indentation):&lt;br /&gt;
&lt;br /&gt;
 &#039;-----BEGIN-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
 (&amp;quot;_TXDIST_&amp;quot;) (magicBytes) (base58Txid) (varIntTxSize)&lt;br /&gt;
    (serializedTxListInHex_Line1)&lt;br /&gt;
    (serializedTxListInHex_Line2)&lt;br /&gt;
    (serializedTxListInHex_Line3) &lt;br /&gt;
    ...&lt;br /&gt;
 (&amp;quot;_TXINPUT_&amp;quot;) (00) (InputValue)&lt;br /&gt;
    (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
    (SigHexRemainingLines)&lt;br /&gt;
    (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
    (SigHexRemainingLines)&lt;br /&gt;
 (&amp;quot;_TXINPUT_&amp;quot;) (01) (InputValue)&lt;br /&gt;
    (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
    (SigHexRemainingLines)&lt;br /&gt;
 (&amp;quot;_TXINPUT_&amp;quot;) (02) (InputValue)&lt;br /&gt;
 &#039;-------END-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is an example TxDP from Armory, produced while running on the test network.  Its DPID is 3fX59xPj:&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN-TRANSACTION-3fX59xPj-------------------------------------------------&lt;br /&gt;
 _TXDIST_fabfb5da_3fX59xPj_00a0&lt;br /&gt;
 010000000292807c8e70a28c687daea2998d6273d074e56fa8a55a0b10556974cf2b526e61000000&lt;br /&gt;
 0000ffffffffe3c1ee0711611b01af3dee55b1484f0d6b65d17dce4eff0e6e06242e6cf457e10000&lt;br /&gt;
 000000ffffffff02b0feea0b000000001976a91457996661391fa4e95bed27d7e8fe47f47cb8e428&lt;br /&gt;
 88ac00a0acb9030000001976a914dc504e07b1107110f601fb679dd3f56cee9ff71e88ac00000000&lt;br /&gt;
 0100000001eb626e4f73d88f415a8e8cb32b8d73eed47aa1039d0ed2f013abdc741ce6828c010000&lt;br /&gt;
 008c493046022100b0da540e4924518f8989a9da798ca2d9e761b69a173b8cc41a3e3e3c6d77cd50&lt;br /&gt;
 022100ecfa61730e58005338420516744ef680428dcfc05022dec70a851365c8575b190141042dc5&lt;br /&gt;
 be3afa5887aee4a377032ed014361b0b9b61eb3ea6b8a8821bfe13ee4b65cd25d9630e4f227a53e8&lt;br /&gt;
 bf637f85452c9981bcbd64ef77e22ce97b0f547c783effffffff0200d6117e030000001976a914cf&lt;br /&gt;
 f580fd243f64f0ad7bf69faf41c0bf42d86d8988ac00205fa0120000001976a9148d573ef6984fd9&lt;br /&gt;
 f8847d420001f7ac49b222a24988ac000000000100000001f2782db40ae147398a31cff9c7cc3423&lt;br /&gt;
 014a073a92e463741244330cc304168f000000008c493046022100c9311b9eef0cc69219cb96838f&lt;br /&gt;
 dd621530a80c46269a00dccc66498bc03ccf7a0221003742ee652a0a76fd28ad81aa73bb7f7a0a6a&lt;br /&gt;
 81850af58f62d9a184d10e5eec30014104f815e8ef4cad584e04974889d7636e8933803d2e72991d&lt;br /&gt;
 b5288c9e953c2465533905f98b7b688898c7c1f0708f2e49f0dd0abc06859ffed5144e8a1018a4e8&lt;br /&gt;
 63ffffffff02008c8647000000001976a914d4e211215967f8e3744693bf85f47eb4ee9567fc88ac&lt;br /&gt;
 603d4e95010000001976a914e9a6b50901c1969d2b0fd43a3ccfa3fef3291efe88ac00000000&lt;br /&gt;
 _TXINPUT_00_150.00000000&lt;br /&gt;
 _SIG_mzUYGfqGpyXmppYpmWJ31Y4zTxR4ZCod22_00_008c&lt;br /&gt;
 4930460221007699967c3ec09d072599558d2e7082fae0820206b63aa66afea124634ed11a080221&lt;br /&gt;
 0003346f7e963e645ecae2855026dc7332eb7237012539b34cd441c3cef97fbd4d01410497d5e1a0&lt;br /&gt;
 0e1db90e893d1f2e547e2ee83b5d6bf4ddaa3d514e6dc2d94b6bcb5a72be1fcec766b8c382502caa&lt;br /&gt;
 9ec09fe478bad07d3f38ff47b2eb42e681c384cc&lt;br /&gt;
 _TXINPUT_01_12.00000000&lt;br /&gt;
 _SIG_mzvaN8JUhHLz3Gdec1zBRxs5rNaYLQnbD1_01_008c&lt;br /&gt;
 49304602210081554f8b08a1ad8caa69e34f4794d54952dac7c5efcf2afe080985d6bd5b00770221&lt;br /&gt;
 00dea20ca3dbae1d15ec61bec57b4b8062e7d7c47614aba032c5a32f651f471cfd014104c30936d2&lt;br /&gt;
 456298a566aa76fefeab8a7cb7a91e8a936a11757c911b4c669f0434d12ab0936fc13986b156156f&lt;br /&gt;
 9b389ed244bbb580112be07dbe23949a4764dffb&lt;br /&gt;
 -------END-TRANSACTION-3fX59xPj-------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this transaction, there are two inputs, one of 150 BTC and the other of 12 BTC.  This transaction combines 162 BTC to create two outputs, one of 160 BTC, one 1.9995 BTC, and a tx fee of 0.0005.  In this TxDP, both inputs have been signed, and thus could broadcast immediately.&lt;br /&gt;
&lt;br /&gt;
The style of communication is taken directly from PGP/GPG, which uses blocks of ASCII like this to communicate encrypted messages and signatures.  This serialization is compact, and will be interpretted the same in all character encodings.  It can be copied inline into an email, or saved in a text file.  The advantage over the analogous PGP encoding is that there are some human readable elements to it, for users that wish to examine the TxDP packet manually, instead of requiring a program to parse the core elements of the TxDP.&lt;br /&gt;
&lt;br /&gt;
A party receiving this TxDP can simply add their signature to the appropriate _TXINPUT_ line.  If that is the last signature required, they can broadcast it themselves.  Any software that implements this standard should be able to combine multiple TxDPs into a single TxDP.  However, even without the programmatic support, a user could manually combine them by copying the appropriate _TXSIGS_ lines between serializations, though it is not the recommended method for combining TxDPs.&lt;br /&gt;
&lt;br /&gt;
== Reference Implementation ==&lt;br /&gt;
&lt;br /&gt;
This proposal has been implemented and tested in the &#039;&#039;Armory&#039;&#039; Bitcoin software for use in offline-wallet transaction signing (as a 1-of-1 transaction), and will eventually use it for multi-signature transcations.  The source code for this implementation be found in the [https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py Armory Github project].  Specifically, the [https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4704 PyTxDistProposal class] implements all features of BIP 0010.  It contains reference code for both &lt;br /&gt;
[https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L5095 serializing a TxDP] and [https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L5143 unserializing a TxDP].&lt;br /&gt;
&lt;br /&gt;
[[Category:BIP|D]]&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=23100</id>
		<title>BIP 0010</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=23100"/>
		<updated>2012-01-31T01:23:25Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  BIP: 10&lt;br /&gt;
  Title: Multi-Sig Transaction Distribution&lt;br /&gt;
  Author: Alan Reiner  &lt;br /&gt;
  Status: Draft &lt;br /&gt;
  Type: Informational&lt;br /&gt;
  Created: 28-10-2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A multi-signature transaction is one where a certain number of Bitcoins are &amp;quot;encumbered&amp;quot; with more than one recipient address.  The subsequent transaction that spends these coins will require each party involved (or some subset, depending on the script), to see the proposed transaction and sign it with their private key.  This necessarily requires collaboration between all parties -- to propose a distribution of encumbered funds, collect signatures from all necessary participants, and then broadcast the completed transaction.&lt;br /&gt;
&lt;br /&gt;
This BIP describes a way standardize the encoding of proposal transactions, to assist with signature collection and broadcast (which includes regular, 1-of-1 transactions requiring signatures from an offline computer).  The goal is to encourage a standard that guarantees interoperability of all programs that implement it.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Motivation==&lt;br /&gt;
&lt;br /&gt;
The enabling of multi-signature transactions in Bitcoin will introduce a great deal of extra functionality to the users of the network, but also a great deal of extra complexity.  Executing a multi-signature tx will be a multi-step process, and will potentially get worse with multiple clients, each implementing this process differently.  By providing an efficient, standardized technique, we can improve the chance that developers will adopt compatible protocols and not bifurcate the user-base based on client selection.&lt;br /&gt;
&lt;br /&gt;
In addition to providing a general encoding scheme for transaction signing/collection, it does not require the signing device to hold any blockchain information (all information needed for verification and signing is part of the encoding).  This enables the existence of very lightweight devices that can be used for signing since they do not need the blockchain -- only a minimal set of Bitcoin tools and an ECDSA module.  Therefore, BIP 0010 has benefit beyond just multi-signature transactions.&lt;br /&gt;
&lt;br /&gt;
==Specification==&lt;br /&gt;
&lt;br /&gt;
This BIP proposes the following process, with terms in quotes referring to recommended terminology that should be encouraged across all implementations.  &lt;br /&gt;
&lt;br /&gt;
#  One party will initiate this process by creating a &amp;quot;Distribution Proposal&amp;quot;, which could be abbreviated DP, or TxDP&lt;br /&gt;
#  The user creating the TxDP (the preparer) will create the transaction as they would like to see it spent, but with blank TxIn scripts (where the signatures scripts will eventually go).&lt;br /&gt;
#  The proposed transaction will be spending a set of unspent TxOuts available in the blockchain.  The full transactions containing these TxOuts will be serialized and included, as well.  This so that the values of the TxIns can be verified before signing (the prev-tx-hash is part of the data being signed, but the value is not).  By including the full tx, the signing party can verify that the tx matches the OutPoint hash, and then verify input values, all without any access to the blockchain.&lt;br /&gt;
#  The TxDP will have an &amp;quot;DP ID&amp;quot; or &amp;quot;Unsigned ID&amp;quot; which is the hash of the proposed transaction with blanked scripts, in Base58.  This is a specific naming convention to make sure it is not confused with the actual the transaction ID that it will have after it is broadcast (the transaction ID cannot be determined until after all signatures are collected).  The final Tx ID can be referred to as its &amp;quot;Broadcast ID&amp;quot;, in order to distinguish it from the pre-signed ID. &lt;br /&gt;
#  The TxDP will have an potentially-unordered list of sig-pubkey pairs which represent collected signatures.  If you receive a TxDP missing only your signature, you can broadcast it as soon as you sign it.&lt;br /&gt;
#  Identical TxDP objects with different signatures can be easily combined.  This allows one party to send out all the requests for signatures at once, and combine them all when they are received (instead of having to &amp;quot;pass it around&amp;quot;.&lt;br /&gt;
#  For cases where the TxDP might be put into a file or sent via email, it should use .txdp or .btcdp suffix&lt;br /&gt;
&lt;br /&gt;
Anyone adopting BIP 0010 for multi-sig transactions will use the following format (without indentation):&lt;br /&gt;
&lt;br /&gt;
     &#039;-----BEGIN-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
     (&amp;quot;_TXDIST_&amp;quot;) (magicBytes) (base58Txid) (varIntTxSize)&lt;br /&gt;
     (serializedTxListInHex_Line1)&lt;br /&gt;
     (serializedTxListInHex_Line2)&lt;br /&gt;
     (serializedTxListInHex_Line3) &lt;br /&gt;
        ...&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (00) (InputValue)&lt;br /&gt;
     (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
     (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
     (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (01) (InputValue)&lt;br /&gt;
     (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
     (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (02) (InputValue)&lt;br /&gt;
     &#039;-------END-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
&lt;br /&gt;
The following is an example TxDP from Armory, produced while running on the test network.  Its DPID is 3fX59xPj:&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN-TRANSACTION-3fX59xPj-------------------------------------------------&lt;br /&gt;
 _TXDIST_fabfb5da_3fX59xPj_00a0&lt;br /&gt;
 010000000292807c8e70a28c687daea2998d6273d074e56fa8a55a0b10556974cf2b526e61000000&lt;br /&gt;
 0000ffffffffe3c1ee0711611b01af3dee55b1484f0d6b65d17dce4eff0e6e06242e6cf457e10000&lt;br /&gt;
 000000ffffffff02b0feea0b000000001976a91457996661391fa4e95bed27d7e8fe47f47cb8e428&lt;br /&gt;
 88ac00a0acb9030000001976a914dc504e07b1107110f601fb679dd3f56cee9ff71e88ac00000000&lt;br /&gt;
 0100000001eb626e4f73d88f415a8e8cb32b8d73eed47aa1039d0ed2f013abdc741ce6828c010000&lt;br /&gt;
 008c493046022100b0da540e4924518f8989a9da798ca2d9e761b69a173b8cc41a3e3e3c6d77cd50&lt;br /&gt;
 022100ecfa61730e58005338420516744ef680428dcfc05022dec70a851365c8575b190141042dc5&lt;br /&gt;
 be3afa5887aee4a377032ed014361b0b9b61eb3ea6b8a8821bfe13ee4b65cd25d9630e4f227a53e8&lt;br /&gt;
 bf637f85452c9981bcbd64ef77e22ce97b0f547c783effffffff0200d6117e030000001976a914cf&lt;br /&gt;
 f580fd243f64f0ad7bf69faf41c0bf42d86d8988ac00205fa0120000001976a9148d573ef6984fd9&lt;br /&gt;
 f8847d420001f7ac49b222a24988ac000000000100000001f2782db40ae147398a31cff9c7cc3423&lt;br /&gt;
 014a073a92e463741244330cc304168f000000008c493046022100c9311b9eef0cc69219cb96838f&lt;br /&gt;
 dd621530a80c46269a00dccc66498bc03ccf7a0221003742ee652a0a76fd28ad81aa73bb7f7a0a6a&lt;br /&gt;
 81850af58f62d9a184d10e5eec30014104f815e8ef4cad584e04974889d7636e8933803d2e72991d&lt;br /&gt;
 b5288c9e953c2465533905f98b7b688898c7c1f0708f2e49f0dd0abc06859ffed5144e8a1018a4e8&lt;br /&gt;
 63ffffffff02008c8647000000001976a914d4e211215967f8e3744693bf85f47eb4ee9567fc88ac&lt;br /&gt;
 603d4e95010000001976a914e9a6b50901c1969d2b0fd43a3ccfa3fef3291efe88ac00000000&lt;br /&gt;
 _TXINPUT_00_150.00000000&lt;br /&gt;
 _SIG_mzUYGfqGpyXmppYpmWJ31Y4zTxR4ZCod22_00_008c&lt;br /&gt;
 4930460221007699967c3ec09d072599558d2e7082fae0820206b63aa66afea124634ed11a080221&lt;br /&gt;
 0003346f7e963e645ecae2855026dc7332eb7237012539b34cd441c3cef97fbd4d01410497d5e1a0&lt;br /&gt;
 0e1db90e893d1f2e547e2ee83b5d6bf4ddaa3d514e6dc2d94b6bcb5a72be1fcec766b8c382502caa&lt;br /&gt;
 9ec09fe478bad07d3f38ff47b2eb42e681c384cc&lt;br /&gt;
 _TXINPUT_01_12.00000000&lt;br /&gt;
 _SIG_mzvaN8JUhHLz3Gdec1zBRxs5rNaYLQnbD1_01_008c&lt;br /&gt;
 49304602210081554f8b08a1ad8caa69e34f4794d54952dac7c5efcf2afe080985d6bd5b00770221&lt;br /&gt;
 00dea20ca3dbae1d15ec61bec57b4b8062e7d7c47614aba032c5a32f651f471cfd014104c30936d2&lt;br /&gt;
 456298a566aa76fefeab8a7cb7a91e8a936a11757c911b4c669f0434d12ab0936fc13986b156156f&lt;br /&gt;
 9b389ed244bbb580112be07dbe23949a4764dffb&lt;br /&gt;
 -------END-TRANSACTION-3fX59xPj-------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this transaction, there are two inputs, one of 150 BTC and the other of 12 BTC.  This transaction combines 162 BTC to create two outputs, one of 160 BTC, one 1.9995 BTC, and a tx fee of 0.0005.  In this TxDP, both inputs have been signed, and thus could broadcast immediately.&lt;br /&gt;
&lt;br /&gt;
The style of communication is taken directly from PGP/GPG, which uses blocks of ASCII like this to communicate encrypted messages and signatures.  This serialization is compact, and will be interpretted the same in all character encodings.  It can be copied inline into an email, or saved in a text file.  The advantage over the analogous PGP encoding is that there are some human readable elements to it, for users that wish to examine the TxDP packet manually, instead of requiring a program to parse the core elements of the TxDP.&lt;br /&gt;
&lt;br /&gt;
A party receiving this TxDP can simply add their signature to the appropriate _TXINPUT_ line.  If that is the last signature required, they can broadcast it themselves.  Any software that implements this standard should be able to combine multiple TxDPs into a single TxDP.  However, even without the programmatic support, a user could manually combine them by copying the appropriate _TXSIGS_ lines between serializations, though it is not the recommended method for combining TxDPs.&lt;br /&gt;
&lt;br /&gt;
== Reference Implementation ==&lt;br /&gt;
&lt;br /&gt;
This proposal has been implemented and tested in the &#039;&#039;Armory&#039;&#039; Bitcoin software for use in offline-wallet transaction signing (as a 1-of-1 transaction), and will eventually use it for multi-signature transcations.  The source code for this implementation be found in the [https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py Armory Github project].  Specifically, the [https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4704 PyTxDistProposal class] implements all features of BIP 0010.  It contains reference code for both &lt;br /&gt;
[https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L5095 serializing a TxDP] and [https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L5143 unserializing a TxDP].&lt;br /&gt;
&lt;br /&gt;
[[Category:BIP|D]]&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=21516</id>
		<title>BIP 0010</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=21516"/>
		<updated>2011-12-31T21:40:31Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  BIP: 10&lt;br /&gt;
  Title: Multi-Sig Transaction Distribution&lt;br /&gt;
  Author: Alan Reiner  &lt;br /&gt;
  Status: Draft &lt;br /&gt;
  Type: Informational&lt;br /&gt;
  Created: 28-10-2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A multi-signature transaction is one where a certain number of Bitcoins are &amp;quot;encumbered&amp;quot; with more than one recipient address.  The subsequent transaction that spends these coins will require each party involved (or some subset, depending on the script), to see the final, proposed transaction, and sign it with their private key.  This necessarily requires collaboration between all parties -- to propose a distribution of encumbered funds, collect signatures from all necessary participants, and then broadcast the completed transaction.&lt;br /&gt;
&lt;br /&gt;
This BIP describes a protocol to standardize the representation of proposal transactions and the subsequent collection of signatures to execute multi-signature transactions.  The goal is to encourage a standard that guarantees interoperability of all programs that implement it.  &lt;br /&gt;
&lt;br /&gt;
==Motivation==&lt;br /&gt;
&lt;br /&gt;
The enabling of multi-signature transactions in Bitcoin will introduce a great deal of extra functionality to the users of the network, but also a great deal of extra complexity.  Executing a multi-signature tx will be a multi-step process, and will potentially get worse with multiple clients, each implementing this process differently.  By providing an efficient, standardized technique, we can improve the chance that developers will adopt compatible protocols and not bifurcate the user-base based on client selection.&lt;br /&gt;
&lt;br /&gt;
==Specification==&lt;br /&gt;
&lt;br /&gt;
This BIP proposes the following process, with terms in quotes referring to recommended terminology that should be encouraged across all implementations.  &lt;br /&gt;
&lt;br /&gt;
#  One party will initiate this process by creating a &amp;quot;Distribution Proposal&amp;quot;, which could be abbreviated DP, or TxDP&lt;br /&gt;
#  Transaction preparation -- the user creating the TxDP will create the transaction as they would like to see it spent (obviously without the signatures).  Then they will go through each input and replace its script with the script of the txout that the input is spending.  The reason for is so that &#039;&#039;receiving parties can sign with their private key without needing access to the blockchain.&#039;&#039; &lt;br /&gt;
#  This TxDP will be serialized (see below), which will include a tag identifying the TxDP in the serialization, as well as in the filename, if it is saved to file.&lt;br /&gt;
#  The TxDP will have an &amp;quot;DP ID&amp;quot; which is the hash of the TxDP in Base58 -- the reason for the specific naming convention is to make sure it is not confused with the actual the transaction ID that it will have after it is broadcast (the transaction ID cannot be determined until after all signatures are collected).  The final Tx ID can be referred to as its &amp;quot;Broadcast ID&amp;quot;, in order to distinguish it from the pre-signed ID. &lt;br /&gt;
#  The TxDP will have an unordered list of sig-pubkey pairs which represent collected signatures.  If you receive a TxDP missing only your signature, you can broadcast it as soon as you sign it.&lt;br /&gt;
#  Identical TxDP objects with different signatures can be easily combined&lt;br /&gt;
#  For cases where the TxDP might be put into a file to be sent via email, it should use .txdp or .btcdp suffix&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anyone adopting BIP 0010 for multi-sig transactions will use the following format (without indentation):&lt;br /&gt;
&lt;br /&gt;
     &#039;-----BEGIN-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
     (&amp;quot;_TXDIST_&amp;quot;) (magicBytes) (base58Txid) (varIntTxSize)&lt;br /&gt;
        (preparedTxSerializedHexLine0)&lt;br /&gt;
        (preparedTxSerializedHexLine1)&lt;br /&gt;
        (preparedTxSerializedHexLine2) &lt;br /&gt;
        ...&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (00) (InputValue)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (01) (InputValue)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (02) (InputValue)&lt;br /&gt;
     &#039;-------END-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
&lt;br /&gt;
A multi-signature proposal that has 3 signatures on it could be stored in a file &amp;quot;Tx_QrtZ3K42n.txdp&amp;quot; and it would look something like:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;-----BEGIN-TXDP-----&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;_TXDIST_f9beb4d9_QrtZ3K42n_fda5&#039;&#039;&#039;&lt;br /&gt;
 204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e642062 &lt;br /&gt;
 61696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104 &lt;br /&gt;
 678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6 &lt;br /&gt;
 49f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f &lt;br /&gt;
 ac00000000f9beb4d9d7000000010000006fe28c0ab6f1b372c1a6a246ae63f7 &lt;br /&gt;
 4f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14 &lt;br /&gt;
 677ba1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e36299010100 &lt;br /&gt;
 fe328f9a3920119cbd3f1311f830039832abb3baf284625151f328f9a3920&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_00_23.13000000&#039;&#039;&#039;&lt;br /&gt;
 _SIG_1Gffm3Kj3_02_7e_fa8d9127149200f568383a089c68d61900000000009&lt;br /&gt;
 8205bbbe680e1fee1467744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e85&lt;br /&gt;
 7233e0e61bc6649&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_01_4.00000000&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_02_10.00000000&#039;&#039;&#039;&lt;br /&gt;
 _SIG_1QRTt83p8_007f ffff00db606e857233e0e61bc6649ffff00db60831f9&lt;br /&gt;
 6efa8d9127149200f568383a089c68d619000000000098205bbbe680e1fee1&lt;br /&gt;
 46770e1fee14677ba1a3c35&lt;br /&gt;
 _SIG_1m3Rk38fd_007f&lt;br /&gt;
 ffff00db606e857233e0e61bc6649ffff00db606efa8d9127149200f568383a0&lt;br /&gt;
 89c68d619000000000098205bbbe680e1fee146770e1fee14677ba1a3c35&lt;br /&gt;
 &#039;&#039;&#039;------END-TXDP------&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In this transaction, there are 3 inputs, providing 23.13, 4.0 and 10.0 BTC, respectively.  Input 0 has one signature, input 1 has zero signatures, and input 2 has two signatures.&lt;br /&gt;
&lt;br /&gt;
The style of communication is taken directly from PGP/GPG, which uses blocks of ASCII like this to communicate encrypted messages and signatures.  This serialization is compact, and will be interpretted the same in all character encodings.  It can be copied inline into an email, or saved in a text file.  The advantage over the analogous PGP encoding is that there are some human readable elements to it, for users that wish to examine the TxDP packet manually, instead of requiring a program/parser to simply determine the core elements of the TxDP.&lt;br /&gt;
&lt;br /&gt;
A party receiving this TxDP can simply add their signature to the appropriate _TXINPUT_ line.  If that is the last signature required, they can broadcast it themselves.  Any software that implements this standard should be able to combine multiple TxDPs into a single TxDP.  However, even without the programmatic support, a user could manually combine them by copying the appropriate _TXSIGS_ lines between serializations, though it should not be the recommended method for combining TxDPs.&lt;br /&gt;
&lt;br /&gt;
== Reference Implementation ==&lt;br /&gt;
&lt;br /&gt;
This proposal has been implemented and tested in the &#039;&#039;Armory&#039;&#039; Bitcoin software for use in offline-wallet transaction signing (as a 1-of-1 transaction).  Armory does not have Multi-signature transaction support yet, but all the code is implemented, just untested.  The source code for this implementation be found in the [https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py Armory Github project].  The PyTxDistProposal class implements all features of BIP 0010:&lt;br /&gt;
  &lt;br /&gt;
[https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4616 Create TxDP from list of unspent TxOuts]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4840 Serialization of TxDP]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4879 Unserialize a TxDP]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4795 Convert Completed TxDP to Broadcast-Tx]&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
&lt;br /&gt;
One of the reasons TxDPs are versatile, is the ability for a device to &amp;quot;understand&amp;quot; and sign a transaction &#039;&#039;&#039;without&#039;&#039;&#039; access to the blockchain.  However, this means that any information included in the TxDP that is not part of the final broadcast transaction (such as input values), cannot be verified by the device.  i.e. Someone could create a TxDP and lie about the values of each input, knowing that the signing device will not be able to verify those values.  Since the final, serialized transaction does not include input values, the subsequent signature will be valid no matter what inputs values were provided.&lt;br /&gt;
&lt;br /&gt;
This is only a minor issue, since developers who are concerned about such &amp;quot;attacks&amp;quot; can choose to ignore non-signed fields in the TxDP.  Or, they can guarantee that all TxDPs will pass through a trusted system that &#039;&#039;does&#039;&#039; have access to the blockchain and can verify such information.&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=21476</id>
		<title>BIP 0010</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=21476"/>
		<updated>2011-12-30T23:21:29Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===BIP 0010 - Proposal for Standardized, Multi-Signature Transaction Execution===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   BIP: 10&lt;br /&gt;
   Title:       Distribution Proposals for Multi-Sig Transactions&lt;br /&gt;
   Author:      Alan Reiner  &lt;br /&gt;
   Status:      Draft &lt;br /&gt;
   Type:        Standards Track&lt;br /&gt;
   Created:     2011-10-28&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abstract===&lt;br /&gt;
&lt;br /&gt;
A multi-signature transaction is one where a certain number of Bitcoins are &amp;quot;encumbered&amp;quot; with more than one recipient address.  The subsequent transaction that spends these coins will require each party involved (or some subset, depending on the script), to see the final, proposed transaction, and sign it with their private key.  This necessarily requires collaboration between all parties -- to propose a distribution of encumbered funds, collect signatures from all necessary participants, and then broadcast the completed transaction.&lt;br /&gt;
&lt;br /&gt;
This BIP describes a protocol to standardize the representation of proposal transactions and the subsequent collection of signatures to execute multi-signature transactions.  The goal is to encourage a standard that guarantees interoperability of all programs that implement it.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Motivation===&lt;br /&gt;
&lt;br /&gt;
The enabling of multi-signature transactions in Bitcoin will introduce a great deal of extra functionality to the users of the network, but also a great deal of extra complexity.  Executing a multi-signature tx will be a multi-step process, and will potentially get worse with multiple clients, each implementing this process differently.  By providing an efficient, standardized technique, we can improve the chance that developers will adopt compatible protocols and not bifurcate the user-base based on client selection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Specification===&lt;br /&gt;
&lt;br /&gt;
This BIP proposes the following process, with terms in quotes referring to recommended terminology that should be encouraged across all implementations.  &lt;br /&gt;
&lt;br /&gt;
#  One party will initiate this process by creating a &amp;quot;Distribution Proposal&amp;quot;, which could be abbreviated DP, or TxDP&lt;br /&gt;
#  Transaction preparation -- the user creating the TxDP will create the transaction as they would like to see it spent (obviously without the signatures).  Then they will go through each input and replace its script with the script of the txout that the input is spending.  The reason for is so that &#039;&#039;&#039;receiving parties can sign with their private key without needing access to the blockchain.&#039;&#039;&#039; &lt;br /&gt;
#  This TxDP will be serialized (see below), which will include a tag identifying the TxDP in the serialization, as well as in the filename, if it is saved to file.&lt;br /&gt;
#  The TxDP will have an &amp;quot;DP ID&amp;quot; which is the hash of the TxDP in Base58 -- the reason for the specific naming convention is to make sure it is not confused with the actual the transaction ID that it will have after it is broadcast (the transaction ID cannot be determined until after all signatures are collected).  The final Tx ID can be referred to as its &amp;quot;Broadcast ID&amp;quot;, in order to distinguish it from the pre-signed ID. &lt;br /&gt;
#  The TxDP will have an unordered list of sig-pubkey pairs which represent collected signatures.  If you receive a TxDP missing only your signature, you can broadcast it as soon as you sign it.&lt;br /&gt;
#  Identical TxDP objects with different signatures can be easily combined&lt;br /&gt;
#  For cases where the TxDP might be put into a file to be sent via email, it should use .txdp or .btcdp suffix&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anyone adopting BIP 0010 for multi-sig transactions will use the following format (without indentation):&lt;br /&gt;
&lt;br /&gt;
     &#039;-----BEGIN-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
     (&amp;quot;_TXDIST_&amp;quot;) (magicBytes) (base58Txid) (varIntTxSize)&lt;br /&gt;
        (preparedTxSerializedHexLine0)&lt;br /&gt;
        (preparedTxSerializedHexLine1)&lt;br /&gt;
        (preparedTxSerializedHexLine2) &lt;br /&gt;
        ...&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (00) (InputValue)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (01) (InputValue)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (02) (InputValue)&lt;br /&gt;
     &#039;-------END-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
A multi-signature proposal that has 3 signatures on it could be stored in a file &amp;quot;Tx_QrtZ3K42n.txdp&amp;quot; and it would look something like:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;-----BEGIN-TXDP-----&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;_TXDIST_f9beb4d9_QrtZ3K42n_fda5&#039;&#039;&#039;&lt;br /&gt;
 204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e642062 &lt;br /&gt;
 61696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104 &lt;br /&gt;
 678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6 &lt;br /&gt;
 49f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f &lt;br /&gt;
 ac00000000f9beb4d9d7000000010000006fe28c0ab6f1b372c1a6a246ae63f7 &lt;br /&gt;
 4f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14 &lt;br /&gt;
 677ba1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e36299010100 &lt;br /&gt;
 fe328f9a3920119cbd3f1311f830039832abb3baf284625151f328f9a3920&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_00_23.13000000&#039;&#039;&#039;&lt;br /&gt;
 _SIG_1Gffm3Kj3_02_7e_fa8d9127149200f568383a089c68d61900000000009&lt;br /&gt;
 8205bbbe680e1fee1467744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e85&lt;br /&gt;
 7233e0e61bc6649&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_01_4.00000000&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_02_10.00000000&#039;&#039;&#039;&lt;br /&gt;
 _SIG_1QRTt83p8_007f ffff00db606e857233e0e61bc6649ffff00db60831f9&lt;br /&gt;
 6efa8d9127149200f568383a089c68d619000000000098205bbbe680e1fee1&lt;br /&gt;
 46770e1fee14677ba1a3c35&lt;br /&gt;
 _SIG_1m3Rk38fd_007f&lt;br /&gt;
 ffff00db606e857233e0e61bc6649ffff00db606efa8d9127149200f568383a0&lt;br /&gt;
 89c68d619000000000098205bbbe680e1fee146770e1fee14677ba1a3c35&lt;br /&gt;
 &#039;&#039;&#039;------END-TXDP------&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In this transaction, there are 3 inputs, providing 23.13, 4.0 and 10.0 BTC, respectively.  Input 0 has one signature, input 1 has zero signatures, and input 2 has two signatures.&lt;br /&gt;
&lt;br /&gt;
The style of communication is taken directly from PGP/GPG, which uses blocks of ASCII like this to communicate encrypted messages and signatures.  This serialization is compact, and will be interpretted the same in all character encodings.  It can be copied inline into an email, or saved in a text file.  The advantage over the analogous PGP encoding is that there are some human readable elements to it, for users that wish to examine the TxDP packet manually, instead of requiring a program/parser to simply determine the core elements of the TxDP.&lt;br /&gt;
&lt;br /&gt;
A party receiving this TxDP can simply add their signature to the appropriate _TXINPUT_ line.  If that is the last signature required, they can broadcast it themselves.  Any software that implements this standard should be able to combine multiple TxDPs into a single TxDP.  However, even without the programmatic support, a user could manually combine them by copying the appropriate _TXSIGS_ lines between serializations, though it should not be the recommended method for combining TxDPs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reference Implementation ===&lt;br /&gt;
&lt;br /&gt;
This proposal has been implemented and tested in the &#039;&#039;Armory&#039;&#039; Bitcoin software for use in offline-wallet transaction signing, and is prepared to be used for supporting multi-signature transactions in a future release.  As such, the &#039;&#039;Armory&#039;&#039; source code contains a working implementation of BIP 0010 for single-party transactions (as a 1-of-1 transaction), and the logic is implemented (but untested) for multi-signature transactions.&lt;br /&gt;
&lt;br /&gt;
The source code can be found at:  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py with the PyTxDistProposal class starting at line 4520.  A few direct links:&lt;br /&gt;
  &lt;br /&gt;
&#039;&#039;&#039;TxDP from list of unspent TxOuts:&#039;&#039;&#039;  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4616&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serialization of TxDP:&#039;&#039;&#039;  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4840&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unserialize a TxDP:&#039;&#039;&#039;  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4879&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Finished TxDP to broadcast-Tx:&#039;&#039;&#039;  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4795&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Known Issues===&lt;br /&gt;
&lt;br /&gt;
One of the reasons TxDPs are versatile, is the ability for a device to &amp;quot;understand&amp;quot; and sign a transaction &#039;&#039;&#039;without&#039;&#039;&#039; access to the blockchain.  However, this means that any information included in the TxDP that is not part of the final broadcast transaction (such as input values), cannot be verified by the device.  i.e. I can create a TxDP and lie about the values of each input, to mislead the dumb client into thinking that less money is coming from its own funds than actually are (unless the client has the blockchain and/or has been tracking each transaction).  This works, because the input values are not included in the final transaction, only the output values are actually signed by the device.  This is not a show-stopper issue for BIP 0010, as developers who are concerned about such &amp;quot;attacks&amp;quot; can choose to ignore such fields, or always receive TxDPs through a computer that does have access to the blockchain and can verify the non-signature-related information in it.&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=21475</id>
		<title>BIP 0010</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=21475"/>
		<updated>2011-12-30T23:16:28Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===BIP 0010 - Proposal for Standardized, Multi-Signature Transaction Execution===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   BIP: 10&lt;br /&gt;
   Author:      Alan Reiner  &lt;br /&gt;
   Status:      Draft Proposal&lt;br /&gt;
   Orig Date:   28 Oct, 2011  &lt;br /&gt;
   Contact:     etotheipi@gmail.com  &lt;br /&gt;
   Updated:     20 Dec, 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abstract===&lt;br /&gt;
&lt;br /&gt;
A multi-signature transaction is one where a certain number of Bitcoins are &amp;quot;encumbered&amp;quot; with more than one recipient address.  The subsequent transaction that spends these coins will require each party involved (or some subset, depending on the script), to see the final, proposed transaction, and sign it with their private key.  This necessarily requires collaboration between all parties -- to propose a distribution of encumbered funds, collect signatures from all necessary participants, and then broadcast the completed transaction.&lt;br /&gt;
&lt;br /&gt;
This BIP describes a protocol to standardize the representation of proposal transactions and the subsequent collection of signatures to execute multi-signature transactions.  The goal is to encourage a standard that guarantees interoperability of all programs that implement it.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Motivation===&lt;br /&gt;
&lt;br /&gt;
The enabling of multi-signature transactions in Bitcoin will introduce a great deal of extra functionality to the users of the network, but also a great deal of extra complexity.  Executing a multi-signature tx will be a multi-step process, and will potentially get worse with multiple clients, each implementing this process differently.  By providing an efficient, standardized technique, we can improve the chance that developers will adopt compatible protocols and not bifurcate the user-base based on client selection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Specification===&lt;br /&gt;
&lt;br /&gt;
This BIP proposes the following process, with terms in quotes referring to recommended terminology that should be encouraged across all implementations.  &lt;br /&gt;
&lt;br /&gt;
#  One party will initiate this process by creating a &amp;quot;Distribution Proposal&amp;quot;, which could be abbreviated DP, or TxDP&lt;br /&gt;
#  Transaction preparation -- the user creating the TxDP will create the transaction as they would like to see it spent (obviously without the signatures).  Then they will go through each input and replace its script with the script of the txout that the input is spending.  The reason for is so that &#039;&#039;&#039;receiving parties can sign with their private key without needing access to the blockchain.&#039;&#039;&#039; &lt;br /&gt;
#  This TxDP will be serialized (see below), which will include a tag identifying the TxDP in the serialization, as well as in the filename, if it is saved to file.&lt;br /&gt;
#  The TxDP will have an &amp;quot;DP ID&amp;quot; which is the hash of the TxDP in Base58 -- the reason for the specific naming convention is to make sure it is not confused with the actual the transaction ID that it will have after it is broadcast (the transaction ID cannot be determined until after all signatures are collected).  The final Tx ID can be referred to as its &amp;quot;Broadcast ID&amp;quot;, in order to distinguish it from the pre-signed ID. &lt;br /&gt;
#  The TxDP will have an unordered list of sig-pubkey pairs which represent collected signatures.  If you receive a TxDP missing only your signature, you can broadcast it as soon as you sign it.&lt;br /&gt;
#  Identical TxDP objects with different signatures can be easily combined&lt;br /&gt;
#  For cases where the TxDP might be put into a file to be sent via email, it should use .txdp or .btcdp suffix&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anyone adopting BIP 0010 for multi-sig transactions will use the following format (without indentation):&lt;br /&gt;
&lt;br /&gt;
     &#039;-----BEGIN-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
     (&amp;quot;_TXDIST_&amp;quot;) (magicBytes) (base58Txid) (varIntTxSize)&lt;br /&gt;
        (preparedTxSerializedHexLine0)&lt;br /&gt;
        (preparedTxSerializedHexLine1)&lt;br /&gt;
        (preparedTxSerializedHexLine2) &lt;br /&gt;
        ...&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (00) (InputValue)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (01) (InputValue)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (02) (InputValue)&lt;br /&gt;
     &#039;-------END-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
&lt;br /&gt;
A multi-signature proposal that has 3 signatures on it could be stored in a file &amp;quot;Tx_QrtZ3K42n.txdp&amp;quot; and it would look something like:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;-----BEGIN-TXDP-----&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;_TXDIST_f9beb4d9_QrtZ3K42n_fda5&#039;&#039;&#039;&lt;br /&gt;
 204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e642062 &lt;br /&gt;
 61696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104 &lt;br /&gt;
 678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6 &lt;br /&gt;
 49f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f &lt;br /&gt;
 ac00000000f9beb4d9d7000000010000006fe28c0ab6f1b372c1a6a246ae63f7 &lt;br /&gt;
 4f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14 &lt;br /&gt;
 677ba1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e36299010100 &lt;br /&gt;
 fe328f9a3920119cbd3f1311f830039832abb3baf284625151f328f9a3920&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_00_23.13000000&#039;&#039;&#039;&lt;br /&gt;
 _SIG_1Gffm3Kj3_02_7e_fa8d9127149200f568383a089c68d61900000000009&lt;br /&gt;
 8205bbbe680e1fee1467744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e85&lt;br /&gt;
 7233e0e61bc6649&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_01_4.00000000&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_02_10.00000000&#039;&#039;&#039;&lt;br /&gt;
 _SIG_1QRTt83p8_007f ffff00db606e857233e0e61bc6649ffff00db60831f9&lt;br /&gt;
 6efa8d9127149200f568383a089c68d619000000000098205bbbe680e1fee1&lt;br /&gt;
 46770e1fee14677ba1a3c35&lt;br /&gt;
 _SIG_1m3Rk38fd_007f&lt;br /&gt;
 ffff00db606e857233e0e61bc6649ffff00db606efa8d9127149200f568383a0&lt;br /&gt;
 89c68d619000000000098205bbbe680e1fee146770e1fee14677ba1a3c35&lt;br /&gt;
 &#039;&#039;&#039;------END-TXDP------&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In this transaction, there are 3 inputs, providing 23.13, 4.0 and 10.0 BTC, respectively.  Input 0 has one signature, input 1 has zero signatures, and input 2 has two signatures.&lt;br /&gt;
&lt;br /&gt;
The style of communication is taken directly from PGP/GPG, which typically uses blocks of ASCII like this to communicate encrypted messages and signatures.  This serialization is compact, and will be interpretted the same in all character encodings.  It can be copied inline into an email, or saved in a text file.  The advantage over the analogous PGP encoding is that there are some human readable elements to it, for users that wish to examine the TxDP packet manually, instead of requiring a program/parser to simply determine the core elements of the TxDP.&lt;br /&gt;
&lt;br /&gt;
A party receiving this TxDP can simply add their signature to the appropriate _TXINPUT_ line.  If that is the last signature required, they can broadcast it themselves.  Any software that implements this standard should be able to combine multiple TxDPs into a single TxDP.  However, even without the programmatic support, a user could manually combine them by copying the appropriate _TXSIGS_ lines between serializations, though it should not be the recommended method for combining TxDPs.&lt;br /&gt;
&lt;br /&gt;
=== Reference Implementation ===&lt;br /&gt;
&lt;br /&gt;
This proposal has been implemented and tested in the &#039;&#039;Armory&#039;&#039; Bitcoin software for use in offline-wallet transaction signing, and is prepared to be used for supporting multi-signature transactions in a future release.  As such, the &#039;&#039;Armory&#039;&#039; source code contains a working implementation of BIP 0010 for single-party transactions (for offline wallets), and the logic is implemented (but untested) for multi-signature transactions.&lt;br /&gt;
&lt;br /&gt;
The source code can be found at:  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py with the PyTxDistProposal class starting at line 4520.  A few direct links:&lt;br /&gt;
  &lt;br /&gt;
&#039;&#039;&#039;TxDP from list of unspent TxOuts:&#039;&#039;&#039;  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4616&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serialization of TxDP:&#039;&#039;&#039;  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4840&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unserialize a TxDP:&#039;&#039;&#039;  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4879&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Finished TxDP to broadcast-Tx:&#039;&#039;&#039;  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4795&lt;br /&gt;
&lt;br /&gt;
===Known Issues===&lt;br /&gt;
&lt;br /&gt;
One of the reasons TxDPs are versatile, is the ability for a device to &amp;quot;understand&amp;quot; and sign a transaction &#039;&#039;&#039;without&#039;&#039;&#039; access to the blockchain.  However, this means that any information included in the TxDP that is not part of the final broadcast transaction (such as input values), cannot be verified by the device.  i.e. I can create a TxDP and lie about the values of each input, to mislead the dumb client into thinking that less money is coming from its own funds than actually are (unless the client has the blockchain and/or has been tracking each transaction).  This works, because the input values are not included in the final transaction, only the output values are actually signed by the device.  This is not a show-stopper issue for BIP 0010, as developers who are concerned about such &amp;quot;attacks&amp;quot; can choose to ignore such fields, or always receive TxDPs through a computer that does have access to the blockchain and can verify the non-signature-related information in it.&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=21151</id>
		<title>BIP 0010</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=21151"/>
		<updated>2011-12-22T13:50:04Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===BIP 0010 - Proposal for Standardized, Multi-Signature Transaction Execution===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   BIP: 10&lt;br /&gt;
   Author:      Alan Reiner  &lt;br /&gt;
   Status:      Draft Proposal&lt;br /&gt;
   Orig Date:   28 Oct, 2011  &lt;br /&gt;
   Contact:     etotheipi@gmail.com  &lt;br /&gt;
   Updated:     20 Dec, 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abstract===&lt;br /&gt;
&lt;br /&gt;
A multi-signature transaction is one where a certain number of Bitcoins are &amp;quot;encumbered&amp;quot; with more than one recipient address.  The subsequent transaction that spends these coins will require each party involved (or some subset, depending on the script), to see the final, proposed transaction, and sign it with their private key.  This necessarily requires collaboration between all parties -- to propose a distribution of encumbered funds, collect signatures from all necessary participants, and then broadcast the completed transaction.&lt;br /&gt;
&lt;br /&gt;
This BIP describes a protocol to standardize the representation of proposal transactions and the subsequent collection of signatures to execute multi-signature transactions.  The goal is to encourage a standard that guarantees interoperability of all programs that implement it.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Motivation===&lt;br /&gt;
&lt;br /&gt;
The enabling of multi-signature transactions in Bitcoin will introduce a great deal of extra functionality to the users of the network, but also a great deal of extra complexity.  Executing a multi-signature tx will be a multi-step process, and will potentially get worse with multiple clients, each implementing this process differently.  By providing an efficient, standardized technique, we can improve the chance that developers will adopt compatible protocols and not bifurcate the user-base based on client selection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Specification===&lt;br /&gt;
&lt;br /&gt;
This BIP proposes the following process, with terms in quotes referring to recommended terminology that should be encouraged across all implementations.  &lt;br /&gt;
&lt;br /&gt;
#  One party will initiate this process by creating a &amp;quot;Distribution Proposal&amp;quot;, which could be abbreviated DP, or TxDP&lt;br /&gt;
#  Transaction preparation -- the user creating the TxDP will create the transaction as they would like to see it spent (obviously without the signatures).  Then they will go through each input and replace its script with the script of the txout that the input is spending.  The reason for is so that &#039;&#039;&#039;receiving parties can sign with their private key without needing access to the blockchain.&#039;&#039;&#039; &lt;br /&gt;
#  This TxDP will be serialized (see below), which will include a tag identifying the TxDP in the serialization, as well as in the filename, if it is saved to file.&lt;br /&gt;
#  The TxDP will have an &amp;quot;DP ID&amp;quot; which is the hash of the TxDP in Base58 -- the reason for the specific naming convention is to make sure it is not confused with the actual the transaction ID that it will have after it is broadcast (the transaction ID cannot be determined until after all signatures are collected).  The final Tx ID can be referred to as its &amp;quot;Broadcast ID&amp;quot;, in order to distinguish it from the pre-signed ID. &lt;br /&gt;
#  The TxDP will have an unordered list of sig-pubkey pairs which represent collected signatures.  If you receive a TxDP missing only your signature, you can broadcast it as soon as you sign it.&lt;br /&gt;
#  Identical TxDP objects with different signatures can be easily combined&lt;br /&gt;
#  For cases where the TxDP might be put into a file to be sent via email, it should use .txdp or .btcdp suffix&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anyone adopting BIP 0010 for multi-sig transactions will use the following format (without indentation):&lt;br /&gt;
&lt;br /&gt;
     &#039;-----BEGIN-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
     (&amp;quot;_TXDIST_&amp;quot;) (magicBytes) (base58Txid) (varIntTxSize)&lt;br /&gt;
        (preparedTxSerializedHexLine0)&lt;br /&gt;
        (preparedTxSerializedHexLine1)&lt;br /&gt;
        (preparedTxSerializedHexLine2) &lt;br /&gt;
        ...&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (00) (InputValue)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (01) (InputValue)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (02) (InputValue)&lt;br /&gt;
     &#039;-------END-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
&lt;br /&gt;
A multi-signature proposal that has 3 signatures on it could be stored in a file &amp;quot;Tx_QrtZ3K42n.txdp&amp;quot; and it would look something like:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;-----BEGIN-TXDP-----&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;_TXDIST_f9beb4d9_QrtZ3K42n_fda5&#039;&#039;&#039;&lt;br /&gt;
 204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e642062 &lt;br /&gt;
 61696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104 &lt;br /&gt;
 678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6 &lt;br /&gt;
 49f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f &lt;br /&gt;
 ac00000000f9beb4d9d7000000010000006fe28c0ab6f1b372c1a6a246ae63f7 &lt;br /&gt;
 4f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14 &lt;br /&gt;
 677ba1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e36299010100 &lt;br /&gt;
 fe328f9a3920119cbd3f1311f830039832abb3baf284625151f328f9a3920&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_00_23.13000000&#039;&#039;&#039;&lt;br /&gt;
 _SIG_1Gffm3Kj3_02_7e_fa8d9127149200f568383a089c68d61900000000009&lt;br /&gt;
 8205bbbe680e1fee1467744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e85&lt;br /&gt;
 7233e0e61bc6649&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_01_4.00000000&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_02_10.00000000&#039;&#039;&#039;&lt;br /&gt;
 _SIG_1QRTt83p8_007f ffff00db606e857233e0e61bc6649ffff00db60831f9&lt;br /&gt;
 6efa8d9127149200f568383a089c68d619000000000098205bbbe680e1fee1&lt;br /&gt;
 46770e1fee14677ba1a3c35&lt;br /&gt;
 _SIG_1m3Rk38fd_007f&lt;br /&gt;
 ffff00db606e857233e0e61bc6649ffff00db606efa8d9127149200f568383a0&lt;br /&gt;
 89c68d619000000000098205bbbe680e1fee146770e1fee14677ba1a3c35&lt;br /&gt;
 &#039;&#039;&#039;------END-TXDP------&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In this transaction, there are 3 inputs, providing 23.13, 4.0 and 10.0 BTC, respectively.  Input 0 has one signature, input 1 has zero signatures, and input 2 has two signatures.&lt;br /&gt;
&lt;br /&gt;
The style of communication is taken directly from PGP/GPG, which typically uses blocks of ASCII like this to communicate encrypted messages and signatures.  This serialization is compact, and will be interpretted the same in all character encodings.  It can be copied inline into an email, or saved in a text file.  The advantage over the analogous PGP encoding is that there are some human readable elements to it, for users that wish to examine the TxDP packet manually, instead of requiring a program/parser to simply determine the core elements of the TxDP.&lt;br /&gt;
&lt;br /&gt;
A party receiving this TxDP can simply add their signature to the appropriate _TXINPUT_ line.  If that is the last signature required, they can broadcast it themselves.  Any software that implements this standard should be able to combine multiple TxDPs into a single TxDP.  However, even without the programmatic support, a user could manually combine them by copying the appropriate _TXSIGS_ lines between serializations, though it should not be the recommended method for combining TxDPs.&lt;br /&gt;
&lt;br /&gt;
=== Reference Implementation ===&lt;br /&gt;
&lt;br /&gt;
This proposal has been implemented and tested in the &#039;&#039;Armory&#039;&#039; Bitcoin software for use in offline-wallet transaction signing, and is prepared to be used for supporting multi-signature transactions in a future release.  As such, the &#039;&#039;Armory&#039;&#039; source code contains a working implementation of BIP 0010 for single-party transactions (for offline wallets), and the logic is implemented (but untested) for multi-signature transactions.&lt;br /&gt;
&lt;br /&gt;
The source code can be found at:  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py with the PyTxDistProposal class starting at line 4520.  A few direct links:&lt;br /&gt;
  &lt;br /&gt;
&#039;&#039;&#039;TxDP from list of unspent TxOuts:&#039;&#039;&#039;  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4616&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serialization of TxDP:&#039;&#039;&#039;  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4840&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unserialize a TxDP:&#039;&#039;&#039;  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4879&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Finished TxDP to broadcast-Tx:&#039;&#039;&#039;  https://github.com/etotheipi/BitcoinArmory/blob/qtdev/armoryengine.py#L4795&lt;br /&gt;
&lt;br /&gt;
===Known Issues===&lt;br /&gt;
&lt;br /&gt;
One of the reasons TxDPs are versatile, is the ability for a device to &amp;quot;understand&amp;quot; and sign a transaction &#039;&#039;&#039;without&#039;&#039;&#039; access to the blockchain.  However, this means that any information included in the TxDP that is not part of the final broadcast transaction (such as input values), cannot be verified by the device.  i.e. I can create a TxDP and lie about the values of each input, to mislead the dumb client into thinking that less money is coming from its own funds than actually are (unless the client has the blockchain and/or has been tracking each transaction).  This works, because the input values are not included in the final transaction, only the output values are actually signed by the device.  This is not a show-stopper issue for BIP 0010, as developers who are concerned about such &amp;quot;attacks&amp;quot; can choose to ignore such fields, or always receive TxDPs through a computer that does have access to the blockchain and can verify the non-signature-related information in it. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reference implementation===&lt;br /&gt;
&lt;br /&gt;
The following python pseudo-code provides an example of how this serialization can be performed, and how to sign it&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # Requires the multi-sig tx to be spent, and a list of recipients and values&lt;br /&gt;
    def createTxDistProposal(multiSigTxOut, RecipientList, ValueList):&lt;br /&gt;
&lt;br /&gt;
        # Do some sanity checks on the input data&lt;br /&gt;
        assert(len(RecipientList) === len(ValueList))&lt;br /&gt;
     &lt;br /&gt;
        totalDist = sum(valueList)&lt;br /&gt;
        txFee     = multiSigTxOut.value - totalDist&lt;br /&gt;
        assert(txFee &amp;lt; 0)&lt;br /&gt;
        if(txFee &amp;lt; minRecFee)&lt;br /&gt;
           warn(&#039;Tx fee (%f) is lower than recommended (%f)&#039; % (txFee,minRecFee))&lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
        # Create empty tx&lt;br /&gt;
        txdp = PyTx()&lt;br /&gt;
        txdp.version  = 1&lt;br /&gt;
        txdp.lockTime = 0&lt;br /&gt;
     &lt;br /&gt;
        # Create empty tx, create only one input&lt;br /&gt;
        txdp = PyTx()&lt;br /&gt;
        txdp.inputs  = [ PyTxOut() ]&lt;br /&gt;
        txdp.inputs[0].prevTxOutHash  = multiSigTxOut.parentHash&lt;br /&gt;
        txdp.inputs[0].prevTxOutIndex = multiSigTxOut.parentIndex&lt;br /&gt;
        txdp.inputs[0].binaryScript   = multiSigTxOut.script&lt;br /&gt;
        txdp.inputs[0].sequence       = 0xffffffff&lt;br /&gt;
           &lt;br /&gt;
        # Create standard outputs &lt;br /&gt;
        txdp.outputs = []&lt;br /&gt;
        for addr,val in zip(RecipientList, ValueList):&lt;br /&gt;
           newTxOut = createStdTxOut(addr, val)&lt;br /&gt;
           txdp.outputs.append(newTxOut)&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        # Serialize the transaction and create a DPID&lt;br /&gt;
        txdpBinary = txdp.serialize()&lt;br /&gt;
        txdpSize   = len(txdpBinary)&lt;br /&gt;
        dpidHash   = sha256(sha256(txdpBinary)) &lt;br /&gt;
        dpidID     = binary_to_base58(dpidHash)[:8]&lt;br /&gt;
     &lt;br /&gt;
        # Start creating the ASCII message&lt;br /&gt;
        txdpStr  = &#039;-----BEGIN-TXDP-----&#039;&lt;br /&gt;
        txdpStr += &#039;_TXDIST_%s_%s_%s&#039; % (magicBytes, dpidID, txdpSize) + &#039;\n&#039;&lt;br /&gt;
        txdpHex  = binary_to_hex(txdpBinary)&lt;br /&gt;
        for byte in range(0,txdpSize,80):&lt;br /&gt;
           txdpStr += txdpHex[byte:byte+80] + &#039;\n&#039;&lt;br /&gt;
        txdpStr  = &#039;_TXSIGS_00&#039; + &#039;\n&#039;&lt;br /&gt;
        txdpStr  = &#039;-----END-TXDP-----&#039;&lt;br /&gt;
        &lt;br /&gt;
        return txdpStr&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
Then a TxDP can be signed by &lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
    # To sign a txDP, we zero out all the inputs that aren&#039;t ours, add hashcode, then sign&lt;br /&gt;
    def signTxDistProposal(txdpStr, inputToSign, myAddr):&lt;br /&gt;
     &lt;br /&gt;
        txdpLines = txdpStr.split(&#039;\n&#039;)&lt;br /&gt;
        readDp = False&lt;br /&gt;
        txHex  = &#039;&#039;&lt;br /&gt;
        output = &#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
        # We copy the TxDP exactly as we read it, except for the TXSIGS line that&lt;br /&gt;
        # will require incremeting.  We stop just before the END-TXDP line so we&lt;br /&gt;
        # can append our signature to the end of the TXSIGS list&lt;br /&gt;
        for line in txdpLines:&lt;br /&gt;
           if &#039;END-TXDP&#039; in line:&lt;br /&gt;
              break&lt;br /&gt;
     &lt;br /&gt;
           if readDp:&lt;br /&gt;
              txHex += line.strip()&lt;br /&gt;
      &lt;br /&gt;
           # Read TXDP, starting next line&lt;br /&gt;
           if line.startswith(&#039;_TXDIST_&#039;):&lt;br /&gt;
              readDp = True&lt;br /&gt;
     &lt;br /&gt;
           # Copy the line exactly as it&#039;s read, unless it&#039;s TXSIGS line&lt;br /&gt;
           if line.startswith(&#039;_TXSIGS_&#039;):&lt;br /&gt;
              readDp = False&lt;br /&gt;
              nSigs = readVarInt(line.split(&#039;_&#039;)[-1].strip())&lt;br /&gt;
              output += &#039;_TXSIGS_&#039; + writeVarIntHex(nSigs+1) + &#039;\n&#039;&lt;br /&gt;
           else:&lt;br /&gt;
              output += line&lt;br /&gt;
           &lt;br /&gt;
              &lt;br /&gt;
        # All inputs have the appropriate TxOut script already included&lt;br /&gt;
        # For signing (SIGHASH_ALL) we need to blank out the ones not being signed&lt;br /&gt;
        txToSign = PyTx().unserialize(hex_to_binary(txHex))&lt;br /&gt;
        for i in range(len(txToSign.inputs)):&lt;br /&gt;
           if not i===inputToSign:&lt;br /&gt;
              txToSign[i] = &#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
        SIGHASH_ALL = 1&lt;br /&gt;
        hashcode = int_to_binary(SIGHASH_ALL, widthBytes=4, endOut=LITTLEENDIAN)&lt;br /&gt;
        binaryToSign = sha256(sha256(txToSign.serialize() + hashcode))&lt;br /&gt;
        binaryToSign = switchEndian(binaryToSign)  # hash needs to be BigEndian&lt;br /&gt;
        sig = myAddr.privKey.generateDERSignature(binaryToSign)&lt;br /&gt;
     &lt;br /&gt;
        txinScript = createStdTxInScript(sig, myAddr.pubKey)&lt;br /&gt;
        txinScriptHex = binary_to_hex(txinScript)&lt;br /&gt;
        inputNum = binary_to_hex(writeVarInt(inputToSign))&lt;br /&gt;
        scriptSz = binary_to_hex(writeVarInt(len(txinScript))&lt;br /&gt;
        output += &#039;_SIG_%s_%s_%s\n&#039; % (myAddr.base58str()[:8], inputNum, scriptSz)&lt;br /&gt;
        for byte in range(0,len(txinScriptHex), 80):&lt;br /&gt;
           output += txinScriptHex[byte:byte+80] + &#039;\n&#039;&lt;br /&gt;
        output += &#039;-----END-TXDP-----&#039;&lt;br /&gt;
        return output&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=21150</id>
		<title>BIP 0010</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=21150"/>
		<updated>2011-12-22T13:31:52Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===BIP 0010 - Proposal for Standardized, Multi-Signature Transaction Execution===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   BIP: 10&lt;br /&gt;
   Author:      Alan Reiner  &lt;br /&gt;
   Status:      Draft Proposal&lt;br /&gt;
   Orig Date:   28 Oct, 2011  &lt;br /&gt;
   Contact:     etotheipi@gmail.com  &lt;br /&gt;
   Updated:     20 Dec, 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abstract===&lt;br /&gt;
&lt;br /&gt;
A multi-signature transaction is one where a certain number of Bitcoins are &amp;quot;encumbered&amp;quot; with more than one recipient address.  The subsequent transaction that spends these coins will require each party involved (or some subset, depending on the script), to see the final, proposed transaction, and sign it with their private key.  This necessarily requires collaboration between all parties -- to propose a distribution of encumbered funds, collect signatures from all necessary participants, and then broadcast the completed transaction.&lt;br /&gt;
&lt;br /&gt;
This BIP describes a protocol to standardize the representation of proposal transactions and the subsequent collection of signatures to execute multi-signature transactions.  The goal is to encourage a standard that guarantees interoperability of all programs that implement it.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Motivation===&lt;br /&gt;
&lt;br /&gt;
The enabling of multi-signature transactions in Bitcoin will introduce a great deal of extra functionality to the users of the network, but also a great deal of extra complexity.  Executing a multi-signature tx will be a multi-step process, and will potentially get worse with multiple clients, each implementing this process differently.  By providing an efficient, standardized technique, we can improve the chance that developers will adopt compatible protocols and not bifurcate the user-base based on client selection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Specification===&lt;br /&gt;
&lt;br /&gt;
This BIP proposes the following process, with terms in quotes referring to recommended terminology that should be encouraged across all implementations.  &lt;br /&gt;
&lt;br /&gt;
#  One party will initiate this process by creating a &amp;quot;Distribution Proposal&amp;quot;, which could be abbreviated DP, or TxDP&lt;br /&gt;
#  Transaction preparation -- the user creating the TxDP will create the transaction as they would like to see it spent (obviously without the signatures).  Then they will go through each input and replace its script with the script of the txout that the input is spending.  The reason for is so that receiving parties can sign with their private key *without* needing access to the blockchain. &lt;br /&gt;
#  This TxDP will be serialized (see below), which will include a tag identifying the TxDP in the serialization, as well as in the filename, if it is saved to file.&lt;br /&gt;
#  The TxDP will have an &amp;quot;DP ID&amp;quot; which is the hash of the TxDP in Base58 -- the reason for this is to make sure it is not confused with the actual the transaction ID that it will have after it is broadcast (the transaction ID cannot be determined until after all signatures are collected).  The final Tx ID can be referred to as its &amp;quot;Broadcast ID&amp;quot;, in order to distinguish it from the pre-signed ID. &lt;br /&gt;
#  The TxDP will have an unordered list of sig-pubkey pairs which represent collected signatures.  If you receive a TxDP missing only your signature, you can broadcast it as soon as you sign it.&lt;br /&gt;
#  Identical TxDP objects with different signatures can be easily combined&lt;br /&gt;
#  For cases where the TxDP might be put into a file to be sent via email, it should use .txdp or .btcdp suffix&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anyone adopting BIP 0010 for multi-sig transactions will use the following format (without indentation):&lt;br /&gt;
&lt;br /&gt;
     &#039;-----BEGIN-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
     (&amp;quot;_TXDIST_&amp;quot;) (magicBytes) (base58Txid) (varIntTxSize)&lt;br /&gt;
        (preparedTxSerializedHexLine0)&lt;br /&gt;
        (preparedTxSerializedHexLine1)&lt;br /&gt;
        (preparedTxSerializedHexLine2) &lt;br /&gt;
        ...&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (00) (InputValue)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (01) (InputValue)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (02) (InputValue)&lt;br /&gt;
     &#039;-------END-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
&lt;br /&gt;
A multi-signature proposal that has 3 signatures on it could be stored in a file &amp;quot;Tx_QrtZ3K42n.txdp&amp;quot; and it would look something like:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;-----BEGIN-TXDP-----&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;_TXDIST_f9beb4d9_QrtZ3K42n_fda5&#039;&#039;&#039;&lt;br /&gt;
 204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e642062 &lt;br /&gt;
 61696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104 &lt;br /&gt;
 678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6 &lt;br /&gt;
 49f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f &lt;br /&gt;
 ac00000000f9beb4d9d7000000010000006fe28c0ab6f1b372c1a6a246ae63f7 &lt;br /&gt;
 4f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14 &lt;br /&gt;
 677ba1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e36299010100 &lt;br /&gt;
 fe328f9a3920119cbd3f1311f830039832abb3baf284625151f328f9a3920&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_00_23.13000000&#039;&#039;&#039;&lt;br /&gt;
 _SIG_1Gffm3Kj3_02_7e_fa8d9127149200f568383a089c68d61900000000009&lt;br /&gt;
 8205bbbe680e1fee1467744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e85&lt;br /&gt;
 7233e0e61bc6649&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_01_4.00000000&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_02_10.00000000&#039;&#039;&#039;&lt;br /&gt;
 _SIG_1QRTt83p8_007f ffff00db606e857233e0e61bc6649ffff00db60831f9&lt;br /&gt;
 6efa8d9127149200f568383a089c68d619000000000098205bbbe680e1fee1&lt;br /&gt;
 46770e1fee14677ba1a3c35&lt;br /&gt;
 _SIG_1m3Rk38fd_007f&lt;br /&gt;
 ffff00db606e857233e0e61bc6649ffff00db606efa8d9127149200f568383a0&lt;br /&gt;
 89c68d619000000000098205bbbe680e1fee146770e1fee14677ba1a3c35&lt;br /&gt;
 &#039;&#039;&#039;------END-TXDP------&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In this transaction, there are 3 inputs, providing 23.13, 4.0 and 10.0 BTC, respectively.  Input 0 has one signature, input 1 has zero signatures, and input 2 has two signatures.&lt;br /&gt;
In this transaction, there are 3 signatures already included, two for input 0, and one for input 2 (implying that that input 0 requires at least two signatures, and input 2 requires at least 1.  Bear in mind, most multi-signature TxDPs will only have a single input requiring multiple signatures.  But there is no reason for this specification to be restricted to that case.&lt;br /&gt;
&lt;br /&gt;
The style of communication is taken directly from PGP/GPG, which typically uses blocks of ASCII like this to communicate encrypted messages and signatures.  This serialization is compact, and will be interpretted the same in all character encodings.  It can be copied inline into an email, or saved in a text file.  The advantage over the analogous PGP encoding is that there are some human readable elements to it, for users that wish to examine the TxDP packet more closely.&lt;br /&gt;
&lt;br /&gt;
A party receiving this TxDP can simply add their signature to the end of the list, and incremenet the 0003 to 0004 on the _TXSIGS_ line.  If that is the last signature required, they can broadcast it themselves.  Any software that implements this standard should be able to combine multiple TxDPs into a single TxDP.  However, even without the programmatic support, a user could manually combine them by copying the appropriate _TXSIGS_ lines between serializations, though it should not be the recommended method for combining TxDPs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Known Issues===&lt;br /&gt;
&lt;br /&gt;
One of the reasons TxDPs are versatile, is the ability for a device to &amp;quot;understand&amp;quot; and sign a transaction &#039;&#039;&#039;without&#039;&#039;&#039; access to the blockchain.  However, this means that any information included in the TxDP that is not part of the final broadcast transaction (such as input values), cannot be verified by the device.  i.e. I can create a TxDP and lie about the values of each input, to mislead the dumb client into thinking that less money is coming from its own funds than actually are (unless the client has the blockchain and/or has been tracking each transaction).  This works, because the input values are not included in the final transaction, only the output values are actually signed by the device.  This is not a show-stopper issue for BIP 0010, as developers who are concerned about such &amp;quot;attacks&amp;quot; can choose to ignore such fields, or always receive TxDPs through a computer that does have access to the blockchain and can verify the non-signature-related information in it. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reference implementation===&lt;br /&gt;
&lt;br /&gt;
The following python pseudo-code provides an example of how this serialization can be performed, and how to sign it&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # Requires the multi-sig tx to be spent, and a list of recipients and values&lt;br /&gt;
    def createTxDistProposal(multiSigTxOut, RecipientList, ValueList):&lt;br /&gt;
&lt;br /&gt;
        # Do some sanity checks on the input data&lt;br /&gt;
        assert(len(RecipientList) === len(ValueList))&lt;br /&gt;
     &lt;br /&gt;
        totalDist = sum(valueList)&lt;br /&gt;
        txFee     = multiSigTxOut.value - totalDist&lt;br /&gt;
        assert(txFee &amp;lt; 0)&lt;br /&gt;
        if(txFee &amp;lt; minRecFee)&lt;br /&gt;
           warn(&#039;Tx fee (%f) is lower than recommended (%f)&#039; % (txFee,minRecFee))&lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
        # Create empty tx&lt;br /&gt;
        txdp = PyTx()&lt;br /&gt;
        txdp.version  = 1&lt;br /&gt;
        txdp.lockTime = 0&lt;br /&gt;
     &lt;br /&gt;
        # Create empty tx, create only one input&lt;br /&gt;
        txdp = PyTx()&lt;br /&gt;
        txdp.inputs  = [ PyTxOut() ]&lt;br /&gt;
        txdp.inputs[0].prevTxOutHash  = multiSigTxOut.parentHash&lt;br /&gt;
        txdp.inputs[0].prevTxOutIndex = multiSigTxOut.parentIndex&lt;br /&gt;
        txdp.inputs[0].binaryScript   = multiSigTxOut.script&lt;br /&gt;
        txdp.inputs[0].sequence       = 0xffffffff&lt;br /&gt;
           &lt;br /&gt;
        # Create standard outputs &lt;br /&gt;
        txdp.outputs = []&lt;br /&gt;
        for addr,val in zip(RecipientList, ValueList):&lt;br /&gt;
           newTxOut = createStdTxOut(addr, val)&lt;br /&gt;
           txdp.outputs.append(newTxOut)&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        # Serialize the transaction and create a DPID&lt;br /&gt;
        txdpBinary = txdp.serialize()&lt;br /&gt;
        txdpSize   = len(txdpBinary)&lt;br /&gt;
        dpidHash   = sha256(sha256(txdpBinary)) &lt;br /&gt;
        dpidID     = binary_to_base58(dpidHash)[:8]&lt;br /&gt;
     &lt;br /&gt;
        # Start creating the ASCII message&lt;br /&gt;
        txdpStr  = &#039;-----BEGIN-TXDP-----&#039;&lt;br /&gt;
        txdpStr += &#039;_TXDIST_%s_%s_%s&#039; % (magicBytes, dpidID, txdpSize) + &#039;\n&#039;&lt;br /&gt;
        txdpHex  = binary_to_hex(txdpBinary)&lt;br /&gt;
        for byte in range(0,txdpSize,80):&lt;br /&gt;
           txdpStr += txdpHex[byte:byte+80] + &#039;\n&#039;&lt;br /&gt;
        txdpStr  = &#039;_TXSIGS_00&#039; + &#039;\n&#039;&lt;br /&gt;
        txdpStr  = &#039;-----END-TXDP-----&#039;&lt;br /&gt;
        &lt;br /&gt;
        return txdpStr&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
Then a TxDP can be signed by &lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
    # To sign a txDP, we zero out all the inputs that aren&#039;t ours, add hashcode, then sign&lt;br /&gt;
    def signTxDistProposal(txdpStr, inputToSign, myAddr):&lt;br /&gt;
     &lt;br /&gt;
        txdpLines = txdpStr.split(&#039;\n&#039;)&lt;br /&gt;
        readDp = False&lt;br /&gt;
        txHex  = &#039;&#039;&lt;br /&gt;
        output = &#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
        # We copy the TxDP exactly as we read it, except for the TXSIGS line that&lt;br /&gt;
        # will require incremeting.  We stop just before the END-TXDP line so we&lt;br /&gt;
        # can append our signature to the end of the TXSIGS list&lt;br /&gt;
        for line in txdpLines:&lt;br /&gt;
           if &#039;END-TXDP&#039; in line:&lt;br /&gt;
              break&lt;br /&gt;
     &lt;br /&gt;
           if readDp:&lt;br /&gt;
              txHex += line.strip()&lt;br /&gt;
      &lt;br /&gt;
           # Read TXDP, starting next line&lt;br /&gt;
           if line.startswith(&#039;_TXDIST_&#039;):&lt;br /&gt;
              readDp = True&lt;br /&gt;
     &lt;br /&gt;
           # Copy the line exactly as it&#039;s read, unless it&#039;s TXSIGS line&lt;br /&gt;
           if line.startswith(&#039;_TXSIGS_&#039;):&lt;br /&gt;
              readDp = False&lt;br /&gt;
              nSigs = readVarInt(line.split(&#039;_&#039;)[-1].strip())&lt;br /&gt;
              output += &#039;_TXSIGS_&#039; + writeVarIntHex(nSigs+1) + &#039;\n&#039;&lt;br /&gt;
           else:&lt;br /&gt;
              output += line&lt;br /&gt;
           &lt;br /&gt;
              &lt;br /&gt;
        # All inputs have the appropriate TxOut script already included&lt;br /&gt;
        # For signing (SIGHASH_ALL) we need to blank out the ones not being signed&lt;br /&gt;
        txToSign = PyTx().unserialize(hex_to_binary(txHex))&lt;br /&gt;
        for i in range(len(txToSign.inputs)):&lt;br /&gt;
           if not i===inputToSign:&lt;br /&gt;
              txToSign[i] = &#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
        SIGHASH_ALL = 1&lt;br /&gt;
        hashcode = int_to_binary(SIGHASH_ALL, widthBytes=4, endOut=LITTLEENDIAN)&lt;br /&gt;
        binaryToSign = sha256(sha256(txToSign.serialize() + hashcode))&lt;br /&gt;
        binaryToSign = switchEndian(binaryToSign)  # hash needs to be BigEndian&lt;br /&gt;
        sig = myAddr.privKey.generateDERSignature(binaryToSign)&lt;br /&gt;
     &lt;br /&gt;
        txinScript = createStdTxInScript(sig, myAddr.pubKey)&lt;br /&gt;
        txinScriptHex = binary_to_hex(txinScript)&lt;br /&gt;
        inputNum = binary_to_hex(writeVarInt(inputToSign))&lt;br /&gt;
        scriptSz = binary_to_hex(writeVarInt(len(txinScript))&lt;br /&gt;
        output += &#039;_SIG_%s_%s_%s\n&#039; % (myAddr.base58str()[:8], inputNum, scriptSz)&lt;br /&gt;
        for byte in range(0,len(txinScriptHex), 80):&lt;br /&gt;
           output += txinScriptHex[byte:byte+80] + &#039;\n&#039;&lt;br /&gt;
        output += &#039;-----END-TXDP-----&#039;&lt;br /&gt;
        return output&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=21099</id>
		<title>BIP 0010</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0010&amp;diff=21099"/>
		<updated>2011-12-21T02:39:15Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: Created page with &amp;quot;===BIP 0010 - Proposal for Standardized, Multi-Signature Transaction Execution===  &amp;lt;pre&amp;gt;    BIP: 10    Author:      Alan Reiner      Status:      Draft Proposal    Orig Date: ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===BIP 0010 - Proposal for Standardized, Multi-Signature Transaction Execution===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   BIP: 10&lt;br /&gt;
   Author:      Alan Reiner  &lt;br /&gt;
   Status:      Draft Proposal&lt;br /&gt;
   Orig Date:   28 Oct, 2011  &lt;br /&gt;
   Contact:     etotheipi@gmail.com  &lt;br /&gt;
   Updated:     20 Dec, 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abstract===&lt;br /&gt;
&lt;br /&gt;
A multi-signature transaction is one where a certain number of Bitcoins are &amp;quot;encumbered&amp;quot; with more than one recipient address.  The subsequent transaction that spends these coins will require each party involved (or some subset, depending on the script), to see the final, proposed transaction, and sign it with their private key.  This necessarily requires collaboration between all parties -- to propose a distribution of encumbered funds, collect signatures from all necessary participants, and then broadcast the completed transaction.&lt;br /&gt;
&lt;br /&gt;
This BIP describes a protocol to standardize the representation of proposal transactions and the subsequent collection of signatures to execute multi-signature transactions.  The goal is to encourage a standard that guarantees interoperability of all programs that implement it.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Motivation===&lt;br /&gt;
&lt;br /&gt;
The enabling of multi-signature transactions in Bitcoin will introduce a great deal of extra functionality to the users of the network, but also a great deal of extra complexity.  Executing a multi-signature tx will be a multi-step process, and will potentially get worse with multiple clients, each implementing this process differently.  By providing an efficient, standardized technique, we can improve the chance that developers will adopt compatible protocols and not bifurcate the user-base based on client selection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Specification===&lt;br /&gt;
&lt;br /&gt;
This BIP proposes the following process, with terms in quotes referring to recommended terminology that should be encouraged across all implementations.  &lt;br /&gt;
&lt;br /&gt;
# 1. One party will initiate this process by creating a &amp;quot;Distribution Proposal&amp;quot;, which could be abbreviated DP, or TxDP&lt;br /&gt;
# 2. Transaction preparation -- the user creating the TxDP will create the transaction as they would like to see it spent (obviously without the signatures).  Then they will go through each input and replace its script with the script of the txout that the input is spending.  The reason for is so that receiving parties can sign with their private key *without* needing access to the blockchain. &lt;br /&gt;
# 3. This TxDP will be serialized (see below), which will include a tag identifying the TxDP in the serialization, as well as in the filename, if it is saved to file.&lt;br /&gt;
# 4. The TxDP will have an &amp;quot;DP ID&amp;quot; which is the hash of the TxDP in Base58 -- the reason for this is to make sure it is not confused with the actual the transaction ID that it will have after it is broadcast (the transaction ID cannot be determined until after all signatures are collected).  The final Tx ID can be referred to as its &amp;quot;Broadcast ID&amp;quot;, in order to distinguish it from the pre-signed ID. &lt;br /&gt;
# 5. The TxDP will have an unordered list of sig-pubkey pairs which represent collected signatures.  If you receive a TxDP missing only your signature, you can broadcast it as soon as you sign it.&lt;br /&gt;
# 6. Identical TxDP objects with different signatures can be easily combined&lt;br /&gt;
# 7. For cases where the TxDP might be put into a file to be sent via email, it should use .txdp or .btcdp suffix&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anyone adopting BIP 0010 for multi-sig transactions will use the following format (without indentation):&lt;br /&gt;
&lt;br /&gt;
     &#039;-----BEGIN-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
     (&amp;quot;_TXDIST_&amp;quot;) (magicBytes) (base58Txid) (varIntTxSize)&lt;br /&gt;
        (preparedTxSerializedHexLine0)&lt;br /&gt;
        (preparedTxSerializedHexLine1)&lt;br /&gt;
        (preparedTxSerializedHexLine2) &lt;br /&gt;
        ...&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (00) (InputValue)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (01) (InputValue)&lt;br /&gt;
        (&amp;quot;_SIG_&amp;quot;) (AddrBase58) (SigBytes) (SigHexPart0)&lt;br /&gt;
        (SigHexRemainingLines)&lt;br /&gt;
     (&amp;quot;_TXINPUT_&amp;quot;) (02) (InputValue)&lt;br /&gt;
     &#039;-------END-TRANSACTION-TXDPID-------&#039;&lt;br /&gt;
&lt;br /&gt;
A multi-signature proposal that has 3 signatures on it could be stored in a file &amp;quot;Tx_QrtZ3K42n.txdp&amp;quot; and it would look something like:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;-----BEGIN-TXDP-----&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;_TXDIST_f9beb4d9_QrtZ3K42n_fda5&#039;&#039;&#039;&lt;br /&gt;
 204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e642062 &lt;br /&gt;
 61696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104 &lt;br /&gt;
 678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6 &lt;br /&gt;
 49f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f &lt;br /&gt;
 ac00000000f9beb4d9d7000000010000006fe28c0ab6f1b372c1a6a246ae63f7 &lt;br /&gt;
 4f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14 &lt;br /&gt;
 677ba1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e36299010100 &lt;br /&gt;
 fe328f9a3920119cbd3f1311f830039832abb3baf284625151f328f9a3920&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_00_23.13000000&#039;&#039;&#039;&lt;br /&gt;
 _SIG_1Gffm3Kj3_02_7e_fa8d9127149200f568383a089c68d61900000000009&lt;br /&gt;
 8205bbbe680e1fee1467744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e85&lt;br /&gt;
 7233e0e61bc6649&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_01_4.00000000&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;_TXINPUT_02_10.00000000&#039;&#039;&#039;&lt;br /&gt;
 _SIG_1QRTt83p8_007f ffff00db606e857233e0e61bc6649ffff00db60831f9&lt;br /&gt;
 6efa8d9127149200f568383a089c68d619000000000098205bbbe680e1fee1&lt;br /&gt;
 46770e1fee14677ba1a3c35&lt;br /&gt;
 _SIG_1m3Rk38fd_007f&lt;br /&gt;
 ffff00db606e857233e0e61bc6649ffff00db606efa8d9127149200f568383a0&lt;br /&gt;
 89c68d619000000000098205bbbe680e1fee146770e1fee14677ba1a3c35&lt;br /&gt;
 &#039;&#039;&#039;------END-TXDP------&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In this transaction, there are 3 inputs, providing 23.13, 4.0 and 10.0 BTC, respectively.  Input 0 has one signature, input 1 has zero signatures, and input 2 has two signatures.&lt;br /&gt;
In this transaction, there are 3 signatures already included, two for input 0, and one for input 2 (implying that that input 0 requires at least two signatures, and input 2 requires at least 1.  Bear in mind, most multi-signature TxDPs will only have a single input requiring multiple signatures.  But there is no reason for this specification to be restricted to that case.&lt;br /&gt;
&lt;br /&gt;
The style of communication is taken directly from PGP/GPG, which typically uses blocks of ASCII like this to communicate encrypted messages and signatures.  This serialization is compact, and will be interpretted the same in all character encodings.  It can be copied inline into an email, or saved in a text file.  The advantage over the analogous PGP encoding is that there are some human readable elements to it, for users that wish to examine the TxDP packet more closely.&lt;br /&gt;
&lt;br /&gt;
A party receiving this TxDP can simply add their signature to the end of the list, and incremenet the 0003 to 0004 on the _TXSIGS_ line.  If that is the last signature required, they can broadcast it themselves.  Any software that implements this standard should be able to combine multiple TxDPs into a single TxDP.  However, even without the programmatic support, a user could manually combine them by copying the appropriate _TXSIGS_ lines between serializations, though it should not be the recommended method for combining TxDPs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Known Issues===&lt;br /&gt;
&lt;br /&gt;
One of the reasons TxDPs are versatile, is the ability for a device to &amp;quot;understand&amp;quot; and sign a transaction &#039;&#039;&#039;without&#039;&#039;&#039; access to the blockchain.  However, this means that any information included in the TxDP that is not part of the final broadcast transaction (such as input values), cannot be verified by the device.  i.e. I can create a TxDP and lie about the values of each input, to mislead the dumb client into thinking that less money is coming from its own funds than actually are (unless the client has the blockchain and/or has been tracking each transaction).  This works, because the input values are not included in the final transaction, only the output values are actually signed by the device.  This is not a show-stopper issue for BIP 0010, as developers who are concerned about such &amp;quot;attacks&amp;quot; can choose to ignore such fields, or always receive TxDPs through a computer that does have access to the blockchain and can verify the non-signature-related information in it. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reference implementation===&lt;br /&gt;
&lt;br /&gt;
The following python pseudo-code provides an example of how this serialization can be performed, and how to sign it&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # Requires the multi-sig tx to be spent, and a list of recipients and values&lt;br /&gt;
    def createTxDistProposal(multiSigTxOut, RecipientList, ValueList):&lt;br /&gt;
&lt;br /&gt;
        # Do some sanity checks on the input data&lt;br /&gt;
        assert(len(RecipientList) === len(ValueList))&lt;br /&gt;
     &lt;br /&gt;
        totalDist = sum(valueList)&lt;br /&gt;
        txFee     = multiSigTxOut.value - totalDist&lt;br /&gt;
        assert(txFee &amp;lt; 0)&lt;br /&gt;
        if(txFee &amp;lt; minRecFee)&lt;br /&gt;
           warn(&#039;Tx fee (%f) is lower than recommended (%f)&#039; % (txFee,minRecFee))&lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
        # Create empty tx&lt;br /&gt;
        txdp = PyTx()&lt;br /&gt;
        txdp.version  = 1&lt;br /&gt;
        txdp.lockTime = 0&lt;br /&gt;
     &lt;br /&gt;
        # Create empty tx, create only one input&lt;br /&gt;
        txdp = PyTx()&lt;br /&gt;
        txdp.inputs  = [ PyTxOut() ]&lt;br /&gt;
        txdp.inputs[0].prevTxOutHash  = multiSigTxOut.parentHash&lt;br /&gt;
        txdp.inputs[0].prevTxOutIndex = multiSigTxOut.parentIndex&lt;br /&gt;
        txdp.inputs[0].binaryScript   = multiSigTxOut.script&lt;br /&gt;
        txdp.inputs[0].sequence       = 0xffffffff&lt;br /&gt;
           &lt;br /&gt;
        # Create standard outputs &lt;br /&gt;
        txdp.outputs = []&lt;br /&gt;
        for addr,val in zip(RecipientList, ValueList):&lt;br /&gt;
           newTxOut = createStdTxOut(addr, val)&lt;br /&gt;
           txdp.outputs.append(newTxOut)&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        # Serialize the transaction and create a DPID&lt;br /&gt;
        txdpBinary = txdp.serialize()&lt;br /&gt;
        txdpSize   = len(txdpBinary)&lt;br /&gt;
        dpidHash   = sha256(sha256(txdpBinary)) &lt;br /&gt;
        dpidID     = binary_to_base58(dpidHash)[:8]&lt;br /&gt;
     &lt;br /&gt;
        # Start creating the ASCII message&lt;br /&gt;
        txdpStr  = &#039;-----BEGIN-TXDP-----&#039;&lt;br /&gt;
        txdpStr += &#039;_TXDIST_%s_%s_%s&#039; % (magicBytes, dpidID, txdpSize) + &#039;\n&#039;&lt;br /&gt;
        txdpHex  = binary_to_hex(txdpBinary)&lt;br /&gt;
        for byte in range(0,txdpSize,80):&lt;br /&gt;
           txdpStr += txdpHex[byte:byte+80] + &#039;\n&#039;&lt;br /&gt;
        txdpStr  = &#039;_TXSIGS_00&#039; + &#039;\n&#039;&lt;br /&gt;
        txdpStr  = &#039;-----END-TXDP-----&#039;&lt;br /&gt;
        &lt;br /&gt;
        return txdpStr&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
Then a TxDP can be signed by &lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
    # To sign a txDP, we zero out all the inputs that aren&#039;t ours, add hashcode, then sign&lt;br /&gt;
    def signTxDistProposal(txdpStr, inputToSign, myAddr):&lt;br /&gt;
     &lt;br /&gt;
        txdpLines = txdpStr.split(&#039;\n&#039;)&lt;br /&gt;
        readDp = False&lt;br /&gt;
        txHex  = &#039;&#039;&lt;br /&gt;
        output = &#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
        # We copy the TxDP exactly as we read it, except for the TXSIGS line that&lt;br /&gt;
        # will require incremeting.  We stop just before the END-TXDP line so we&lt;br /&gt;
        # can append our signature to the end of the TXSIGS list&lt;br /&gt;
        for line in txdpLines:&lt;br /&gt;
           if &#039;END-TXDP&#039; in line:&lt;br /&gt;
              break&lt;br /&gt;
     &lt;br /&gt;
           if readDp:&lt;br /&gt;
              txHex += line.strip()&lt;br /&gt;
      &lt;br /&gt;
           # Read TXDP, starting next line&lt;br /&gt;
           if line.startswith(&#039;_TXDIST_&#039;):&lt;br /&gt;
              readDp = True&lt;br /&gt;
     &lt;br /&gt;
           # Copy the line exactly as it&#039;s read, unless it&#039;s TXSIGS line&lt;br /&gt;
           if line.startswith(&#039;_TXSIGS_&#039;):&lt;br /&gt;
              readDp = False&lt;br /&gt;
              nSigs = readVarInt(line.split(&#039;_&#039;)[-1].strip())&lt;br /&gt;
              output += &#039;_TXSIGS_&#039; + writeVarIntHex(nSigs+1) + &#039;\n&#039;&lt;br /&gt;
           else:&lt;br /&gt;
              output += line&lt;br /&gt;
           &lt;br /&gt;
              &lt;br /&gt;
        # All inputs have the appropriate TxOut script already included&lt;br /&gt;
        # For signing (SIGHASH_ALL) we need to blank out the ones not being signed&lt;br /&gt;
        txToSign = PyTx().unserialize(hex_to_binary(txHex))&lt;br /&gt;
        for i in range(len(txToSign.inputs)):&lt;br /&gt;
           if not i===inputToSign:&lt;br /&gt;
              txToSign[i] = &#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
        SIGHASH_ALL = 1&lt;br /&gt;
        hashcode = int_to_binary(SIGHASH_ALL, widthBytes=4, endOut=LITTLEENDIAN)&lt;br /&gt;
        binaryToSign = sha256(sha256(txToSign.serialize() + hashcode))&lt;br /&gt;
        binaryToSign = switchEndian(binaryToSign)  # hash needs to be BigEndian&lt;br /&gt;
        sig = myAddr.privKey.generateDERSignature(binaryToSign)&lt;br /&gt;
     &lt;br /&gt;
        txinScript = createStdTxInScript(sig, myAddr.pubKey)&lt;br /&gt;
        txinScriptHex = binary_to_hex(txinScript)&lt;br /&gt;
        inputNum = binary_to_hex(writeVarInt(inputToSign))&lt;br /&gt;
        scriptSz = binary_to_hex(writeVarInt(len(txinScript))&lt;br /&gt;
        output += &#039;_SIG_%s_%s_%s\n&#039; % (myAddr.base58str()[:8], inputNum, scriptSz)&lt;br /&gt;
        for byte in range(0,len(txinScriptHex), 80):&lt;br /&gt;
           output += txinScriptHex[byte:byte+80] + &#039;\n&#039;&lt;br /&gt;
        output += &#039;-----END-TXDP-----&#039;&lt;br /&gt;
        return output&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=File:TxBinaryMap.png&amp;diff=15437</id>
		<title>File:TxBinaryMap.png</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=File:TxBinaryMap.png&amp;diff=15437"/>
		<updated>2011-08-23T02:52:17Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: uploaded a new version of &amp;amp;quot;File:TxBinaryMap.png&amp;amp;quot;: Byte-map of a transaction with one of each type of TxIn and TxOut&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Byte-map of a transaction with each type of TxIn and TxOut serialization.&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{self|Cc-zero}}&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=File:TxBinaryMap.png&amp;diff=15436</id>
		<title>File:TxBinaryMap.png</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=File:TxBinaryMap.png&amp;diff=15436"/>
		<updated>2011-08-23T02:50:46Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: uploaded a new version of &amp;amp;quot;File:TxBinaryMap.png&amp;amp;quot;: Byte-map of Transaction with each type of TxIn and TxOut&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Byte-map of a transaction with each type of TxIn and TxOut serialization.&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{self|Cc-zero}}&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=File:TxBinaryMap.png&amp;diff=15435</id>
		<title>File:TxBinaryMap.png</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=File:TxBinaryMap.png&amp;diff=15435"/>
		<updated>2011-08-23T02:37:46Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: uploaded a new version of &amp;amp;quot;File:TxBinaryMap.png&amp;amp;quot;: Byte-map of a transaction with one of each type of TxIn and TxOut&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Byte-map of a transaction with each type of TxIn and TxOut serialization.&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{self|Cc-zero}}&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=File:TxBinaryMap.png&amp;diff=15434</id>
		<title>File:TxBinaryMap.png</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=File:TxBinaryMap.png&amp;diff=15434"/>
		<updated>2011-08-23T02:35:29Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: uploaded a new version of &amp;amp;quot;File:TxBinaryMap.png&amp;amp;quot;: Byte-map of a transaction with one of each type of TxIn and TxOut&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Byte-map of a transaction with each type of TxIn and TxOut serialization.&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{self|Cc-zero}}&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=File:TxBinaryMap.png&amp;diff=15432</id>
		<title>File:TxBinaryMap.png</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=File:TxBinaryMap.png&amp;diff=15432"/>
		<updated>2011-08-23T01:45:01Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: uploaded a new version of &amp;amp;quot;File:TxBinaryMap.png&amp;amp;quot;: Byte-map of a transaction with one of each type of TxIn and TxOut&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Byte-map of a transaction with each type of TxIn and TxOut serialization.&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{self|Cc-zero}}&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Transaction&amp;diff=15429</id>
		<title>Transaction</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Transaction&amp;diff=15429"/>
		<updated>2011-08-23T01:28:52Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:TxBinaryMap.png|thumb|right|Byte-map of Transaction with each type of TxIn and TxOut]]&lt;br /&gt;
A transaction is a signed section of data that is broadcast to the [[network]] and collected into [[block|blocks]]. They reference a previous transaction and dedicate a certain number of bitcoins from it to a new public key (Bitcoin address). They are not encrypted (nothing in Bitcoin is encrypted).&lt;br /&gt;
&lt;br /&gt;
A [[block chain browser]] is a site where every transaction included within the block chain can be viewed.  This is useful for seeing the technical details of transaction in action, and for payment verification purposes.&lt;br /&gt;
&lt;br /&gt;
=== Example Bitcoin Transaction ===&lt;br /&gt;
&lt;br /&gt;
==== Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Input:&lt;br /&gt;
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6&lt;br /&gt;
Index: 0&lt;br /&gt;
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d10&lt;br /&gt;
90db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
Value: 5000000000&lt;br /&gt;
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d&lt;br /&gt;
OP_EQUALVERIFY OP_CHECKSIG&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Explanation ====&lt;br /&gt;
&lt;br /&gt;
The input in this transaction imports 50 BTC from output #0 in transaction f5d8... Then the output sends 50 BTC to a Bitcoin address (expressed here in hexadecimal 4043... instead of the normal base58). When the recipient wants to spend this money, he will reference output #0 of this transaction in an input of his own transaction.&lt;br /&gt;
&lt;br /&gt;
===== Input =====&lt;br /&gt;
&lt;br /&gt;
An &#039;&#039;&#039;input&#039;&#039;&#039; is a reference to an output in a different transaction. Multiple inputs are often listed in a transaction. The values of the referenced outputs are added up, and the total is usable in the outputs of this transaction. &#039;&#039;&#039;Previous tx&#039;&#039;&#039; is a [[hash]] of a previous transaction. &#039;&#039;&#039;Index&#039;&#039;&#039; is the specific output in the referenced transaction. &#039;&#039;&#039;ScriptSig&#039;&#039;&#039; is the first half of a [[script]] (discussed in more detail later).&lt;br /&gt;
&lt;br /&gt;
The script contains two components, a signature and a public key. The public key belongs to the redeemer of the output transaction and proves the creator is allowed to redeem the outputs value. The other component is an ECDSA signature over a hash of a simplified version of the transaction. It, combined with the public key, proves the transaction was created by the real owner of the address in question. Various flags define how the transaction is simplified and can be used to create different types of payment.&lt;br /&gt;
&lt;br /&gt;
===== Output =====&lt;br /&gt;
&lt;br /&gt;
An &#039;&#039;&#039;output&#039;&#039;&#039; contains instructions for sending bitcoins. &#039;&#039;&#039;Value&#039;&#039;&#039; is the number of Satoshi (1 BTC = 100,000,000 Satoshi) that this output will be worth when claimed. &#039;&#039;&#039;ScriptPubKey&#039;&#039;&#039; is the second half of a script (discussed later). There can be more than one output, and they share the combined value of the inputs. Because an output can only ever be referenced by a single input, the entire combined input value needs to be sent in an output if you don&#039;t want to lose it. If the input is worth 50 BTC but you only want to send 25 BTC, Bitcoin will create two outputs worth 25 BTC: one to the destination, and one back to you (known as &amp;quot;change&amp;quot;, though you send it to yourself). Any input bitcoins not redeemed in an output is considered a [[transaction fee]]; whoever generates the block will get it.&lt;br /&gt;
[[File:transaction.png|thumb|A sends 100 BTC to C and C generates 50 BTC. C sends 101 BTC to D, and he needs to send himself some change. D sends the 101 BTC to someone else, but they haven&#039;t redeemed it yet. Only D&#039;s output and C&#039;s change are capable of being spent in the current state.]]&lt;br /&gt;
&lt;br /&gt;
===== Verification =====&lt;br /&gt;
&lt;br /&gt;
To verify that inputs are authorized to collect the values of referenced outputs, Bitcoin uses a custom Forth-like [[script|scripting]] system. The input&#039;s scriptSig and the &#039;&#039;referenced&#039;&#039; output&#039;s scriptPubKey are evaluated (in that order), with scriptPubKey using the values left on the stack by scriptSig. The input is authorized if scriptPubKey returns true. Through the scripting system, the sender can create very complex conditions that people have to meet in order to claim the output&#039;s value. For example, it&#039;s possible to create an output that can be claimed by anyone without any authorization. It&#039;s also possible to require that an input be signed by ten different keys, or be redeemable with a password instead of a key.&lt;br /&gt;
&lt;br /&gt;
=== Types of Transaction ===&lt;br /&gt;
Bitcoin currently only creates three different scriptSig/scriptPubKey pairs. These are described below.&lt;br /&gt;
&lt;br /&gt;
It is possible to design more complex types of transactions, and link them together into cryptographically enforced agreements. These are known as [[Contracts]].&lt;br /&gt;
&lt;br /&gt;
==== Transfer to IP address ====&lt;br /&gt;
&lt;br /&gt;
 scriptPubKey: &amp;lt;pubKey&amp;gt; OP_CHECKSIG&lt;br /&gt;
 scriptSig: &amp;lt;sig&amp;gt;&lt;br /&gt;
The sender gets the public key when talking to the recipient over IP. When redeeming coins that have been sent to an IP address, the recipient provides only a signature. The signature is checked against the public key in scriptPubKey.&lt;br /&gt;
&lt;br /&gt;
Checking process:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Stack &lt;br /&gt;
! Script &lt;br /&gt;
! Description &lt;br /&gt;
|-&lt;br /&gt;
|Empty.&lt;br /&gt;
|&amp;lt;sig&amp;gt; &amp;lt;pubKey&amp;gt; OP_CHECKSIG&lt;br /&gt;
|scriptSig and scriptPubKey are combined.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;sig&amp;gt; &amp;lt;pubKey&amp;gt;&lt;br /&gt;
| OP_CHECKSIG&lt;br /&gt;
|Constants are added to the stack.&lt;br /&gt;
|-&lt;br /&gt;
|true&lt;br /&gt;
|Empty.&lt;br /&gt;
|Signature is checked for top two stack items.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Transfer to Bitcoin address ====&lt;br /&gt;
&lt;br /&gt;
 scriptPubKey: OP_DUP OP_HASH160 &amp;lt;pubKeyHash&amp;gt; OP_EQUALVERIFY OP_CHECKSIG&lt;br /&gt;
 scriptSig: &amp;lt;sig&amp;gt; &amp;lt;pubKey&amp;gt;&lt;br /&gt;
A Bitcoin [[address]] is only a hash, so the sender can&#039;t provide a full public key in scriptPubKey. When redeeming coins that have been sent to a Bitcoin address, the recipient provides both the signature and the public key. The script verifies that the provided public key does hash to the hash in scriptPubKey, and then it also checks the signature against the public key.&lt;br /&gt;
&lt;br /&gt;
Checking process:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Stack &lt;br /&gt;
! Script &lt;br /&gt;
! Description &lt;br /&gt;
|-&lt;br /&gt;
|Empty.&lt;br /&gt;
| &amp;lt;sig&amp;gt; &amp;lt;pubKey&amp;gt; OP_DUP OP_HASH160 &amp;lt;pubKeyHash&amp;gt; OP_EQUALVERIFY OP_CHECKSIG &lt;br /&gt;
| scriptSig and scriptPubKey are combined.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;sig&amp;gt; &amp;lt;pubKey&amp;gt;&lt;br /&gt;
| OP_DUP OP_HASH160 &amp;lt;pubKeyHash&amp;gt; OP_EQUALVERIFY OP_CHECKSIG &lt;br /&gt;
| Constants are added to the stack.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;sig&amp;gt; &amp;lt;pubKey&amp;gt; &amp;lt;pubKey&amp;gt;&lt;br /&gt;
| OP_HASH160 &amp;lt;pubKeyHash&amp;gt; OP_EQUALVERIFY OP_CHECKSIG &lt;br /&gt;
| Top stack item is duplicated.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;sig&amp;gt; &amp;lt;pubKey&amp;gt; &amp;lt;pubHashA&amp;gt;&lt;br /&gt;
|&amp;lt;pubKeyHash&amp;gt; OP_EQUALVERIFY OP_CHECKSIG&lt;br /&gt;
| Top stack item is hashed.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;sig&amp;gt; &amp;lt;pubKey&amp;gt; &amp;lt;pubHashA&amp;gt; &amp;lt;pubKeyHash&amp;gt;&lt;br /&gt;
|OP_EQUALVERIFY OP_CHECKSIG&lt;br /&gt;
| Constant added.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;sig&amp;gt; &amp;lt;pubKey&amp;gt;&lt;br /&gt;
|OP_CHECKSIG&lt;br /&gt;
| Equality is checked between the top two stack items.&lt;br /&gt;
|-&lt;br /&gt;
|true&lt;br /&gt;
|Empty.&lt;br /&gt;
|Signature is checked for top two stack items.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Generation ====&lt;br /&gt;
&lt;br /&gt;
Generations have a single input, and this input has a &amp;quot;coinbase&amp;quot; parameter instead of a scriptSig. The data in &amp;quot;coinbase&amp;quot; can be anything; it isn&#039;t used. Bitcoin puts the current compact-format [[target]] and the arbitrary-precision &amp;quot;extraNonce&amp;quot; number there, which increments every time the Nonce field in the [[block_hashing_algorithm|block header]] overflows. Outputs can be anything, but Bitcoin creates one exactly like an IP address transaction.&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical]]&lt;br /&gt;
[[Category:Vocabulary]]&lt;br /&gt;
[[de:Transaktion]]&lt;br /&gt;
[[pl:Transakcje]]&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=File:TxBinaryMap.png&amp;diff=15428</id>
		<title>File:TxBinaryMap.png</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=File:TxBinaryMap.png&amp;diff=15428"/>
		<updated>2011-08-23T01:26:43Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: Byte-map of a transaction with each type of TxIn and TxOut serialization.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Byte-map of a transaction with each type of TxIn and TxOut serialization.&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{self|Cc-zero}}&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=File:PubKeyToAddr.png&amp;diff=15342</id>
		<title>File:PubKeyToAddr.png</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=File:PubKeyToAddr.png&amp;diff=15342"/>
		<updated>2011-08-21T02:02:06Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: uploaded a new version of &amp;amp;quot;File:PubKeyToAddr.png&amp;amp;quot;: Conversion from ECDSA public key to Bitcoin address&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Conversion from ECDSA public key to Bitcoin address.&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{self|Cc-zero}}&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=File:PubKeyToAddr.png&amp;diff=15341</id>
		<title>File:PubKeyToAddr.png</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=File:PubKeyToAddr.png&amp;diff=15341"/>
		<updated>2011-08-21T02:00:51Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: uploaded a new version of &amp;amp;quot;File:PubKeyToAddr.png&amp;amp;quot;: Constructing a Bitcoin address from an ECDSA public key&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Conversion from ECDSA public key to Bitcoin address.&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{self|Cc-zero}}&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Invoice_address&amp;diff=15339</id>
		<title>Invoice address</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Invoice_address&amp;diff=15339"/>
		<updated>2011-08-21T01:56:24Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: Added illustration of how the BTC address is created from a public key&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:PubKeyToAddr.png|thumb|right|Conversion from ECDSA public key to Bitcoin Address]]&lt;br /&gt;
A &#039;&#039;&#039;Bitcoin Address&#039;&#039;&#039; is a 160-bit hash of the public portion of a public/private [[Wikipedia:Elliptic_Curve_DSA|ECDSA]] keypair. Using some mathemagic, you can &amp;quot;sign&amp;quot; data with your private key and anyone who knows your public key can verify that the signature is valid. See the [[Wikipedia:Public-key_cryptography|Wikipedia article]] for more information about how this works. See [[Protocol_specification#Addresses|protocol specification]] for details on how a bitcoin address is formed.&lt;br /&gt;
&lt;br /&gt;
A new keypair is generated for each receiving address. Bitcoin addresses (the public keys) and their associated private keys are stored in the [[wallet]] data file. This is the only file you need to [[backup|back up]]. A &amp;quot;send&amp;quot; transaction to a specific Bitcoin address requires that the corresponding private key exist in the recipient&#039;s wallet. This has the implication that if you create a receiving address and receive coins to that address, then restore the wallet from an earlier backup, before the address was generated, then the coins associated with that address are lost.  Addresses are added to an address [[key pool]] prior to being used for receiving coins. If you lose your wallet entirely, all of your coins are lost and can never be recovered.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Generate&amp;quot; transactions happen in the same way as a send transaction: each batch of 50 generated coins is &amp;quot;sent&amp;quot; to a unique address that you generate just for that purpose. These addresses are also stored in your wallet, but they are not shown in the &amp;quot;your receiving addresses&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
Bitcoin allows you to create as many addresses as you want, and each one is completely separate. There is no &amp;quot;master address&amp;quot;: the &amp;quot;Your Bitcoin address&amp;quot; area in the Bitcoin UI has no special importance. It&#039;s only there for your convenience, and it will change automatically from time to time to enhance your anonymity. All of your other addresses will continue to work forever. They&#039;re listed in the &amp;quot;your receiving addresses&amp;quot; section. Each address takes up only about 500 bytes, so having a large number of addresses in your wallet is generally not a problem.&lt;br /&gt;
&lt;br /&gt;
Bitcoin addresses contain a built-in check code, so it&#039;s generally not possible to send Bitcoins to a mistyped address. However, if the address is well-formed but no one owns it (or the owner lost their wallet.dat), any coins sent to that address will be lost forever.&lt;br /&gt;
&lt;br /&gt;
Addresses can contain all alphanumeric characters except 0, O, I, and l. Normal addresses currently always start with 1, though this might change in a future version. Testnet addresses usually start with &#039;&#039;m&#039;&#039; or &#039;&#039;n&#039;&#039;. Mainline addresses can be 25-34 characters in length, and testnet addresses can be 26-34 characters in length. Most addresses are 33 or 34 characters long, though.&lt;br /&gt;
&lt;br /&gt;
It is also possible to send Bitcoins directly to an [[IP address]].&lt;br /&gt;
&lt;br /&gt;
Since Bitcoin addresses are basically random numbers, it is possible, although extremely unlikely, for two people to independently generate the same address. This is called a [[Wikipedia:Collision_(computer_science)|collision]]. If this happens, then  both the original owner of the address and the colliding owner could spend money sent to that address. It would not be possible for the colliding person to spend the original owner&#039;s entire wallet (or vice versa). If you were to intentionally try to make a collision, it would currently take 2^126 times longer to generate a colliding Bitcoin address than to generate a block. As long as the signing and hashing algorithms remain cryptographically strong, it will likely always be more profitable to collect generations and [[transaction fee|transaction fees]] than to try to create collisions.&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical]]&lt;br /&gt;
[[Category:Vocabulary]]&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=OP_CHECKSIG&amp;diff=15338</id>
		<title>OP CHECKSIG</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=OP_CHECKSIG&amp;diff=15338"/>
		<updated>2011-08-21T01:54:33Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OP_CHECKSIG is [[Script|script]] opcode used to verify that the signature for a tx input is valid. OP_CHECKSIG expects two values to be on the stack, these are, in order of stack depth, the public key and the signature of the script. These two values are normally obtained by running the scriptSig script of the transaction input we are attempting to validate. After the scriptSig script is run the script is deleted but the stack is left as is, and then then scriptPubKey script from the previous transaction output that is now being spent is run, generally concluding in an OP_CHECKSIG. &lt;br /&gt;
&lt;br /&gt;
The standard scriptPubKey checks that the public key (actually a hash of) is a particular value, and that OP_CHECKSIG passes.&lt;br /&gt;
&lt;br /&gt;
For normal transaction inputs if the creator of the current transaction can successfully create a ScriptSig signature that uses the right public key for the ScriptPubKey of the transaction output they are attempting to spend, that transaction input is considered valid. &lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
&lt;br /&gt;
In addition to the script code itself and the stack parameters, to operate OP_CHECKSIG needs to know the current transaction, the current transaction input, and the current hashtype (discussed later)&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
[[File:Bitcoin_OpCheckSig_InDetail.png|thumb|right|Signature verification process using SIGHASH_ALL]]&lt;br /&gt;
# the public key and the signature are popped from the stack, in that order.&lt;br /&gt;
# A new subscript is created from the instruction from the most recently parsed OP_CODESEPARATOR (last one in script) to the end of the script. If there is no OP_CODESEPARATOR the entire script becomes the subscript (hereby referred to as subScript)&lt;br /&gt;
# The sig is deleted from subScript (it&#039;s not standard to have signature in the subScript).&lt;br /&gt;
# All OP_CODESEPARATORS are removed from subScript&lt;br /&gt;
# The hashtype is removed from the last byte of the sig and stored&lt;br /&gt;
# A deep copy is made of the current transaction (hereby referred to txCopy)&lt;br /&gt;
# The scripts for all transaction inputs in txCopy are set to empty scripts&lt;br /&gt;
# The script for the current transaction input in txCopy is set to subScript&lt;br /&gt;
&lt;br /&gt;
Now depending on the hashtype various things can happen to txCopy, these will be discussed individually&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashtype Values (from script.h):&#039;&#039;&#039;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Value&lt;br /&gt;
|-&lt;br /&gt;
| SIGHASH_ALL || 0x00000001&lt;br /&gt;
|-&lt;br /&gt;
| SIGHASH_NONE || 0x00000002&lt;br /&gt;
|-&lt;br /&gt;
| SIGHASH_SINGLE || 0x00000003&lt;br /&gt;
|-&lt;br /&gt;
| SIGHASH_ANYONECANPAY || 0x00000080&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Hashtype SIGHASH_ALL (default) ===&lt;br /&gt;
&lt;br /&gt;
No special handling occurs in the default case&lt;br /&gt;
&lt;br /&gt;
=== Hashtype SIGHASH_NONE ===&lt;br /&gt;
&lt;br /&gt;
# The output of txCopy is set to a vector of zero size.&lt;br /&gt;
# All other inputs aside from the current input in txCopy have their nSequence index set to zero&lt;br /&gt;
&lt;br /&gt;
=== Hashtype SIGHASH_SINGLE ===&lt;br /&gt;
&lt;br /&gt;
# The output of txCopy is resized to the size of the current input index+1&lt;br /&gt;
# All other txCopy outputs aside from the output that is the same as the current input index are set to a blank script and a value of (long) -1;&lt;br /&gt;
# All other txCopy inputs aside from the current input are set to have an nSequence index of zero&lt;br /&gt;
&lt;br /&gt;
=== Hashtype SIGHASH_ANYONECANPAY ===&lt;br /&gt;
&lt;br /&gt;
# The txCopy input vector is resized to a length of one&lt;br /&gt;
# The current input is set as the first and only member of this vector&lt;br /&gt;
&lt;br /&gt;
== Final signature ==&lt;br /&gt;
&lt;br /&gt;
An array of bytes is constructed from the serialized txCopy + four bytes for the hash type. This array is sha256 hashed twice, then the public key is used to to check the supplied signature against the hash. &lt;br /&gt;
&lt;br /&gt;
== Return values ==&lt;br /&gt;
&lt;br /&gt;
OP_CHECKSIG will push true to the stack if the check passed, false otherwise.&lt;br /&gt;
OP_CHECKSIG_VERIFY leaves nothing on the stack but will cause the script eval to fail immediately if the check does not pass.&lt;br /&gt;
&lt;br /&gt;
== Code samples and raw dumps ==&lt;br /&gt;
&lt;br /&gt;
Taking the first transaction in Bitcoin which is in block number 170, we would get after serialising the transaction but before we hash+sign (or verify) it:&lt;br /&gt;
&lt;br /&gt;
* http://blockexplorer.com/block/00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee&lt;br /&gt;
* http://blockexplorer.com/tx/f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16&lt;br /&gt;
&lt;br /&gt;
See also [https://gitorious.org/libbitcoin/libbitcoin libbitcoin] for code samples.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
01 00 00 00              version&lt;br /&gt;
01                       number of inputs (var_uint)&lt;br /&gt;
&lt;br /&gt;
input 0:&lt;br /&gt;
c9 97 a5 e5 6e 10 41 02  input address hash&lt;br /&gt;
fa 20 9c 6a 85 2d d9 06 &lt;br /&gt;
60 a2 0b 2d 9c 35 24 23 &lt;br /&gt;
ed ce 25 85 7f cd 37 04&lt;br /&gt;
00 00 00 00              input index&lt;br /&gt;
&lt;br /&gt;
43                       size of script (var_uint)&lt;br /&gt;
41                       push 65 bytes to stack&lt;br /&gt;
04 11 db 93 e1 dc db 8a &lt;br /&gt;
01 6b 49 84 0f 8c 53 bc &lt;br /&gt;
1e b6 8a 38 2e 97 b1 48 &lt;br /&gt;
2e ca d7 b1 48 a6 90 9a &lt;br /&gt;
5c b2 e0 ea dd fb 84 cc &lt;br /&gt;
f9 74 44 64 f8 2e 16 0b &lt;br /&gt;
fa 9b 8b 64 f9 d4 c0 3f &lt;br /&gt;
99 9b 86 43 f6 56 b4 12 &lt;br /&gt;
a3&lt;br /&gt;
ac                       OP_CHECKSIG&lt;br /&gt;
ff ff ff ff              sequence&lt;br /&gt;
&lt;br /&gt;
02                       number of outputs (var_uint)&lt;br /&gt;
&lt;br /&gt;
output 0:&lt;br /&gt;
00 ca 9a 3b 00 00 00 00  amount = 10.00000000&lt;br /&gt;
43                       size of script (var_uint)&lt;br /&gt;
script for output 0:&lt;br /&gt;
41                       push 65 bytes to stack&lt;br /&gt;
04 ae 1a 62 fe 09 c5 f5 &lt;br /&gt;
1b 13 90 5f 07 f0 6b 99 &lt;br /&gt;
a2 f7 15 9b 22 25 f3 74 &lt;br /&gt;
cd 37 8d 71 30 2f a2 84 &lt;br /&gt;
14 e7 aa b3 73 97 f5 54 &lt;br /&gt;
a7 df 5f 14 2c 21 c1 b7 &lt;br /&gt;
30 3b 8a 06 26 f1 ba de &lt;br /&gt;
d5 c7 2a 70 4f 7e 6c d8 &lt;br /&gt;
4c &lt;br /&gt;
ac                       OP_CHECKSIG&lt;br /&gt;
&lt;br /&gt;
output 1:&lt;br /&gt;
00 28 6b ee 00 00 00 00  amount = 40.00000000&lt;br /&gt;
43                       size of script (var_uint)&lt;br /&gt;
script for output 1:&lt;br /&gt;
41                       push 65 bytes to stack&lt;br /&gt;
04 11 db 93 e1 dc db 8a  &lt;br /&gt;
01 6b 49 84 0f 8c 53 bc &lt;br /&gt;
1e b6 8a 38 2e 97 b1 48 &lt;br /&gt;
2e ca d7 b1 48 a6 90 9a&lt;br /&gt;
5c b2 e0 ea dd fb 84 cc &lt;br /&gt;
f9 74 44 64 f8 2e 16 0b &lt;br /&gt;
fa 9b 8b 64 f9 d4 c0 3f &lt;br /&gt;
99 9b 86 43 f6 56 b4 12 &lt;br /&gt;
a3                       &lt;br /&gt;
ac                       OP_CHECKSIG&lt;br /&gt;
&lt;br /&gt;
00 00 00 00              locktime&lt;br /&gt;
01 00 00 00              hash_code_type (added on)&lt;br /&gt;
&lt;br /&gt;
result =&lt;br /&gt;
01 00 00 00 01 c9 97 a5 e5 6e 10 41 02 fa 20 9c 6a 85 2d d9 06 60 a2 0b 2d 9c 35 &lt;br /&gt;
24 23 ed ce 25 85 7f cd 37 04 00 00 00 00 43 41 04 11 db 93 e1 dc db 8a 01 6b 49 &lt;br /&gt;
84 0f 8c 53 bc 1e b6 8a 38 2e 97 b1 48 2e ca d7 b1 48 a6 90 9a 5c b2 e0 ea dd fb &lt;br /&gt;
84 cc f9 74 44 64 f8 2e 16 0b fa 9b 8b 64 f9 d4 c0 3f 99 9b 86 43 f6 56 b4 12 a3 &lt;br /&gt;
ac ff ff ff ff 02 00 ca 9a 3b 00 00 00 00 43 41 04 ae 1a 62 fe 09 c5 f5 1b 13 90 &lt;br /&gt;
5f 07 f0 6b 99 a2 f7 15 9b 22 25 f3 74 cd 37 8d 71 30 2f a2 84 14 e7 aa b3 73 97 &lt;br /&gt;
f5 54 a7 df 5f 14 2c 21 c1 b7 30 3b 8a 06 26 f1 ba de d5 c7 2a 70 4f 7e 6c d8 4c &lt;br /&gt;
ac 00 28 6b ee 00 00 00 00 43 41 04 11 db 93 e1 dc db 8a 01 6b 49 84 0f 8c 53 bc &lt;br /&gt;
1e b6 8a 38 2e 97 b1 48 2e ca d7 b1 48 a6 90 9a 5c b2 e0 ea dd fb 84 cc f9 74 44 &lt;br /&gt;
64 f8 2e 16 0b fa 9b 8b 64 f9 d4 c0 3f 99 9b 86 43 f6 56 b4 12 a3 ac 00 00 00 00 &lt;br /&gt;
01 00 00 00 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To understand where that raw dump has come from, it may be useful to examine tests/ec-key.cpp in [https://gitorious.org/libbitcoin/libbitcoin libbitcoin],&lt;br /&gt;
&lt;br /&gt;
[https://gitorious.org/libbitcoin/libbitcoin libbitcoin] has a unit test under tests/ec-key.cpp (make ec-key &amp;amp;&amp;amp; ./bin/tests/ec-key). There is also a working OP_CHECKSIG implementation in src/script.cpp under script::op_checksig(). See also the unit test: tests/script-test.cpp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;iomanip&amp;gt;&lt;br /&gt;
#include &amp;lt;bitcoin/util/serializer.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;bitcoin/util/elliptic_curve_key.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;bitcoin/util/sha256.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;bitcoin/util/assert.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;bitcoin/util/logger.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;bitcoin/types.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;openssl/ecdsa.h&amp;gt;&lt;br /&gt;
#include &amp;lt;openssl/obj_mac.h&amp;gt;&lt;br /&gt;
using libbitcoin::elliptic_curve_key;&lt;br /&gt;
using libbitcoin::serializer;&lt;br /&gt;
using libbitcoin::hash_digest;&lt;br /&gt;
using libbitcoin::data_chunk;&lt;br /&gt;
using libbitcoin::log_info;&lt;br /&gt;
using libbitcoin::log_fatal;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    serializer ss;&lt;br /&gt;
    // blk number 170, tx 1, input 0&lt;br /&gt;
    // version = 1&lt;br /&gt;
    ss.write_4_bytes(1);&lt;br /&gt;
    // 1 inputs&lt;br /&gt;
    ss.write_var_uint(1);&lt;br /&gt;
&lt;br /&gt;
    // input 0&lt;br /&gt;
    // prevout hash&lt;br /&gt;
    ss.write_hash(hash_digest{0x04, 0x37, 0xcd, 0x7f, 0x85, 0x25, 0xce, 0xed, 0x23, 0x24, 0x35, 0x9c, 0x2d, 0x0b, 0xa2, 0x60, 0x06, 0xd9, 0x2d, 0x85, 0x6a, 0x9c, 0x20, 0xfa, 0x02, 0x41, 0x10, 0x6e, 0xe5, 0xa5, 0x97, 0xc9});&lt;br /&gt;
    // prevout index &lt;br /&gt;
    ss.write_4_bytes(0);&lt;br /&gt;
&lt;br /&gt;
    // input script after running OP_CHECKSIG for this tx is a single&lt;br /&gt;
    // OP_CHECKSIG opcode&lt;br /&gt;
    data_chunk raw_data;&lt;br /&gt;
    raw_data = {0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3};&lt;br /&gt;
    data_chunk raw_script;&lt;br /&gt;
    raw_script = data_chunk();&lt;br /&gt;
    raw_script.push_back(raw_data.size());&lt;br /&gt;
    libbitcoin::extend_data(raw_script, raw_data);&lt;br /&gt;
    raw_script.push_back(172);&lt;br /&gt;
    ss.write_var_uint(raw_script.size());&lt;br /&gt;
    ss.write_data(raw_script);&lt;br /&gt;
    // sequence&lt;br /&gt;
    ss.write_4_bytes(0xffffffff);&lt;br /&gt;
&lt;br /&gt;
    // 2 outputs for this tx&lt;br /&gt;
    ss.write_var_uint(2);&lt;br /&gt;
&lt;br /&gt;
    // output 0&lt;br /&gt;
    ss.write_8_bytes(1000000000);&lt;br /&gt;
    // script for output 0&lt;br /&gt;
    raw_data = {0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xdf, 0x5f, 0x14, 0x2c, 0x21, 0xc1, 0xb7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xf1, 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, 0x4f, 0x7e, 0x6c, 0xd8, 0x4c};&lt;br /&gt;
    // when data &amp;lt; 75, we can just write it&#039;s length as a single byte (&#039;special&#039;&lt;br /&gt;
    // opcodes)&lt;br /&gt;
    raw_script = data_chunk();&lt;br /&gt;
    raw_script.push_back(raw_data.size());&lt;br /&gt;
    libbitcoin::extend_data(raw_script, raw_data);&lt;br /&gt;
    // OP_CHECKSIG&lt;br /&gt;
    raw_script.push_back(172);&lt;br /&gt;
    // now actually write the script&lt;br /&gt;
    ss.write_var_uint(raw_script.size());&lt;br /&gt;
    ss.write_data(raw_script);&lt;br /&gt;
&lt;br /&gt;
    // output 0&lt;br /&gt;
    ss.write_8_bytes(4000000000);&lt;br /&gt;
    // script for output 0&lt;br /&gt;
    raw_data = {0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3};&lt;br /&gt;
    // when data &amp;lt; 75, we can just write it&#039;s length as a single byte (&#039;special&#039;&lt;br /&gt;
    raw_script.push_back(raw_data.size());&lt;br /&gt;
    libbitcoin::extend_data(raw_script, raw_data);&lt;br /&gt;
    // OP_CHECKSIG&lt;br /&gt;
    raw_script.push_back(172);&lt;br /&gt;
    // now actually write the script&lt;br /&gt;
    ss.write_var_uint(raw_script.size());&lt;br /&gt;
    ss.write_data(raw_script);&lt;br /&gt;
&lt;br /&gt;
    // End of 2 outputs&lt;br /&gt;
&lt;br /&gt;
    // locktime&lt;br /&gt;
    ss.write_4_bytes(0);&lt;br /&gt;
&lt;br /&gt;
    // write hash_type_code&lt;br /&gt;
    ss.write_4_bytes(1);&lt;br /&gt;
&lt;br /&gt;
    // Dump hex to screen&lt;br /&gt;
    log_info() &amp;lt;&amp;lt; &amp;quot;hashing:&amp;quot;;&lt;br /&gt;
    {&lt;br /&gt;
        auto log_obj = log_info();&lt;br /&gt;
        log_obj &amp;lt;&amp;lt; std::hex;&lt;br /&gt;
        for (int val: ss.get_data())&lt;br /&gt;
            log_obj &amp;lt;&amp;lt; std::setfill(&#039;0&#039;) &amp;lt;&amp;lt; std::setw(2) &amp;lt;&amp;lt; val &amp;lt;&amp;lt; &#039; &#039;;&lt;br /&gt;
    }&lt;br /&gt;
    log_info();&lt;br /&gt;
&lt;br /&gt;
    data_chunk raw_tx = {0x01, 0x00, 0x00, 0x00, 0x01, 0xc9, 0x97, 0xa5, 0xe5, 0x6e, 0x10, 0x41, 0x02, 0xfa, 0x20, 0x9c, 0x6a, 0x85, 0x2d, 0xd9, 0x06, 0x60, 0xa2, 0x0b, 0x2d, 0x9c, 0x35, 0x24, 0x23, 0xed, 0xce, 0x25, 0x85, 0x7f, 0xcd, 0x37, 0x04, 0x00, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3, 0xac, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0xca, 0x9a, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xdf, 0x5f, 0x14, 0x2c, 0x21, 0xc1, 0xb7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xf1, 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, 0x4f, 0x7e, 0x6c, 0xd8, 0x4c, 0xac, 0x00, 0x28, 0x6b, 0xee, 0x00, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};&lt;br /&gt;
    BITCOIN_ASSERT(raw_tx == ss.get_data());&lt;br /&gt;
&lt;br /&gt;
    hash_digest tx_hash = libbitcoin::generate_sha256_hash(ss.get_data());&lt;br /&gt;
&lt;br /&gt;
    data_chunk pubkey{0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3};&lt;br /&gt;
    // Leave out last byte since that&#039;s the hash_type_code (SIGHASH_ALL in this&lt;br /&gt;
    // case)&lt;br /&gt;
    data_chunk signature{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69, 0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1, 0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6, 0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd, 0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca, 0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90, 0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22, 0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09};&lt;br /&gt;
    BITCOIN_ASSERT(signature.size() == 70);&lt;br /&gt;
&lt;br /&gt;
    elliptic_curve_key key;&lt;br /&gt;
    if (!key.set_public_key(pubkey))&lt;br /&gt;
    {&lt;br /&gt;
        log_fatal() &amp;lt;&amp;lt; &amp;quot;unable to set EC public key&amp;quot;;&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    log_info() &amp;lt;&amp;lt; &amp;quot;checksig returns: &amp;quot; &amp;lt;&amp;lt; (key.verify(tx_hash, signature) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical]]&lt;br /&gt;
[[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=File:PubKeyToAddr.png&amp;diff=15337</id>
		<title>File:PubKeyToAddr.png</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=File:PubKeyToAddr.png&amp;diff=15337"/>
		<updated>2011-08-21T01:52:48Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: Conversion from ECDSA public key to Bitcoin address.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Conversion from ECDSA public key to Bitcoin address.&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{self|Cc-zero}}&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=OP_CHECKSIG&amp;diff=14954</id>
		<title>OP CHECKSIG</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=OP_CHECKSIG&amp;diff=14954"/>
		<updated>2011-08-14T13:22:22Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: Adding my OP_CHECKSIG diagram to the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OP_CHECKSIG is [[Script|script]] opcode used to verify that the signature for a tx input is valid. OP_CHECKSIG expects two values to be on the stack, these are, in order of stack depth, the public key and the signature of the script. These two values are normally obtained by running the scriptSig script of the transaction input we are attempting to validate. After the scriptSig script is run the script is deleted but the stack is left as is, and then then scriptPubKey script from the previous transaction output that is now being spent is run, generally concluding in an OP_CHECKSIG. &lt;br /&gt;
&lt;br /&gt;
The standard scriptPubKey checks that the public key (actually a hash of) is a particular value, and that OP_CHECKSIG passes.&lt;br /&gt;
&lt;br /&gt;
For normal transaction inputs if the creator of the current transaction can successfully create a ScriptSig signature that uses the right public key for the ScriptPubKey of the transaction output they are attempting to spend, that transaction input is considered valid. &lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
&lt;br /&gt;
In addition to the script code itself and the stack parameters, to operate OP_CHECKSIG needs to know the current transaction, the current transaction input, and the current hashtype (discussed later)&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
[[File:Bitcoin_OpCheckSig_InDetail.png|thumb|right|Illustration of the signature verification process using SIGHASH_ALL]]&lt;br /&gt;
# the public key and the signature are popped from the stack, in that order.&lt;br /&gt;
# A new subscript is created from the instruction from the most recently parsed OP_CODESEPARATOR (last one in script) to the end of the script. If there is no OP_CODESEPARATOR the entire script becomes the subscript (hereby referred to as subScript)&lt;br /&gt;
# The sig is deleted from subScript (it&#039;s not standard to have signature in the subScript).&lt;br /&gt;
# All OP_CODESEPARATORS are removed from subScript&lt;br /&gt;
# The hashtype is removed from the last byte of the sig and stored&lt;br /&gt;
# A deep copy is made of the current transaction (hereby referred to txCopy)&lt;br /&gt;
# The scripts for all transaction inputs in txCopy are set to empty scripts&lt;br /&gt;
# The script for the current transaction input in txCopy is set to subScript&lt;br /&gt;
&lt;br /&gt;
Now depending on the hashtype various things can happen to txCopy, these will be discussed individually&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashtype Values (from script.h):&#039;&#039;&#039;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Value&lt;br /&gt;
|-&lt;br /&gt;
| SIGHASH_ALL || 0x00000001&lt;br /&gt;
|-&lt;br /&gt;
| SIGHASH_NONE || 0x00000002&lt;br /&gt;
|-&lt;br /&gt;
| SIGHASH_SINGLE || 0x00000003&lt;br /&gt;
|-&lt;br /&gt;
| SIGHASH_ANYONECANPAY || 0x00000080&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Hashtype SIGHASH_ALL (default) ===&lt;br /&gt;
&lt;br /&gt;
No special handling occurs in the default case&lt;br /&gt;
&lt;br /&gt;
=== Hashtype SIGHASH_NONE ===&lt;br /&gt;
&lt;br /&gt;
# The output of txCopy is set to a vector of zero size.&lt;br /&gt;
# All other inputs aside from the current input in txCopy have their nSequence index set to zero&lt;br /&gt;
&lt;br /&gt;
=== Hashtype SIGHASH_SINGLE ===&lt;br /&gt;
&lt;br /&gt;
# The output of txCopy is resized to the size of the current input index+1&lt;br /&gt;
# All other txCopy outputs aside from the output that is the same as the current input index are set to a blank script and a value of (long) -1;&lt;br /&gt;
# All other txCopy inputs aside from the current input are set to have an nSequence index of zero&lt;br /&gt;
&lt;br /&gt;
=== Hashtype SIGHASH_ANYONECANPAY ===&lt;br /&gt;
&lt;br /&gt;
# The txCopy input vector is resized to a length of one&lt;br /&gt;
# The current input is set as the first and only member of this vector&lt;br /&gt;
&lt;br /&gt;
== Final signature ==&lt;br /&gt;
&lt;br /&gt;
An array of bytes is constructed from the serialized txCopy + four bytes for the hash type. This array is sha256 hashed twice, then the public key is used to to check the supplied signature against the hash. &lt;br /&gt;
&lt;br /&gt;
== Return values ==&lt;br /&gt;
&lt;br /&gt;
OP_CHECKSIG will push true to the stack if the check passed, false otherwise.&lt;br /&gt;
OP_CHECKSIG_VERIFY leaves nothing on the stack but will cause the script eval to fail immediately if the check does not pass.&lt;br /&gt;
&lt;br /&gt;
== Code samples and raw dumps ==&lt;br /&gt;
&lt;br /&gt;
Taking the first transaction in Bitcoin which is in block number 170, we would get after serialising the transaction but before we hash+sign (or verify) it:&lt;br /&gt;
&lt;br /&gt;
* http://blockexplorer.com/block/00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee&lt;br /&gt;
* http://blockexplorer.com/tx/f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16&lt;br /&gt;
&lt;br /&gt;
See also [https://gitorious.org/libbitcoin/libbitcoin libbitcoin] for code samples.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
01 00 00 00              version&lt;br /&gt;
01                       number of inputs (var_uint)&lt;br /&gt;
&lt;br /&gt;
input 0:&lt;br /&gt;
c9 97 a5 e5 6e 10 41 02  input address hash&lt;br /&gt;
fa 20 9c 6a 85 2d d9 06 &lt;br /&gt;
60 a2 0b 2d 9c 35 24 23 &lt;br /&gt;
ed ce 25 85 7f cd 37 04&lt;br /&gt;
00 00 00 00              input index&lt;br /&gt;
&lt;br /&gt;
43                       size of script (var_uint)&lt;br /&gt;
41                       push 65 bytes to stack&lt;br /&gt;
04 11 db 93 e1 dc db 8a &lt;br /&gt;
01 6b 49 84 0f 8c 53 bc &lt;br /&gt;
1e b6 8a 38 2e 97 b1 48 &lt;br /&gt;
2e ca d7 b1 48 a6 90 9a &lt;br /&gt;
5c b2 e0 ea dd fb 84 cc &lt;br /&gt;
f9 74 44 64 f8 2e 16 0b &lt;br /&gt;
fa 9b 8b 64 f9 d4 c0 3f &lt;br /&gt;
99 9b 86 43 f6 56 b4 12 &lt;br /&gt;
a3&lt;br /&gt;
ac                       OP_CHECKSIG&lt;br /&gt;
ff ff ff ff              sequence&lt;br /&gt;
&lt;br /&gt;
02                       number of outputs (var_uint)&lt;br /&gt;
&lt;br /&gt;
output 0:&lt;br /&gt;
00 ca 9a 3b 00 00 00 00  amount = 10.00000000&lt;br /&gt;
43                       size of script (var_uint)&lt;br /&gt;
script for output 0:&lt;br /&gt;
41                       push 65 bytes to stack&lt;br /&gt;
04 ae 1a 62 fe 09 c5 f5 &lt;br /&gt;
1b 13 90 5f 07 f0 6b 99 &lt;br /&gt;
a2 f7 15 9b 22 25 f3 74 &lt;br /&gt;
cd 37 8d 71 30 2f a2 84 &lt;br /&gt;
14 e7 aa b3 73 97 f5 54 &lt;br /&gt;
a7 df 5f 14 2c 21 c1 b7 &lt;br /&gt;
30 3b 8a 06 26 f1 ba de &lt;br /&gt;
d5 c7 2a 70 4f 7e 6c d8 &lt;br /&gt;
4c &lt;br /&gt;
ac                       OP_CHECKSIG&lt;br /&gt;
&lt;br /&gt;
output 1:&lt;br /&gt;
00 28 6b ee 00 00 00 00  amount = 40.00000000&lt;br /&gt;
43                       size of script (var_uint)&lt;br /&gt;
script for output 1:&lt;br /&gt;
41                       push 65 bytes to stack&lt;br /&gt;
04 11 db 93 e1 dc db 8a  &lt;br /&gt;
01 6b 49 84 0f 8c 53 bc &lt;br /&gt;
1e b6 8a 38 2e 97 b1 48 &lt;br /&gt;
2e ca d7 b1 48 a6 90 9a&lt;br /&gt;
5c b2 e0 ea dd fb 84 cc &lt;br /&gt;
f9 74 44 64 f8 2e 16 0b &lt;br /&gt;
fa 9b 8b 64 f9 d4 c0 3f &lt;br /&gt;
99 9b 86 43 f6 56 b4 12 &lt;br /&gt;
a3                       &lt;br /&gt;
ac                       OP_CHECKSIG&lt;br /&gt;
&lt;br /&gt;
00 00 00 00              locktime&lt;br /&gt;
01 00 00 00              hash_code_type (added on)&lt;br /&gt;
&lt;br /&gt;
result =&lt;br /&gt;
01 00 00 00 01 c9 97 a5 e5 6e 10 41 02 fa 20 9c 6a 85 2d d9 06 60 a2 0b 2d 9c 35 &lt;br /&gt;
24 23 ed ce 25 85 7f cd 37 04 00 00 00 00 43 41 04 11 db 93 e1 dc db 8a 01 6b 49 &lt;br /&gt;
84 0f 8c 53 bc 1e b6 8a 38 2e 97 b1 48 2e ca d7 b1 48 a6 90 9a 5c b2 e0 ea dd fb &lt;br /&gt;
84 cc f9 74 44 64 f8 2e 16 0b fa 9b 8b 64 f9 d4 c0 3f 99 9b 86 43 f6 56 b4 12 a3 &lt;br /&gt;
ac ff ff ff ff 02 00 ca 9a 3b 00 00 00 00 43 41 04 ae 1a 62 fe 09 c5 f5 1b 13 90 &lt;br /&gt;
5f 07 f0 6b 99 a2 f7 15 9b 22 25 f3 74 cd 37 8d 71 30 2f a2 84 14 e7 aa b3 73 97 &lt;br /&gt;
f5 54 a7 df 5f 14 2c 21 c1 b7 30 3b 8a 06 26 f1 ba de d5 c7 2a 70 4f 7e 6c d8 4c &lt;br /&gt;
ac 00 28 6b ee 00 00 00 00 43 41 04 11 db 93 e1 dc db 8a 01 6b 49 84 0f 8c 53 bc &lt;br /&gt;
1e b6 8a 38 2e 97 b1 48 2e ca d7 b1 48 a6 90 9a 5c b2 e0 ea dd fb 84 cc f9 74 44 &lt;br /&gt;
64 f8 2e 16 0b fa 9b 8b 64 f9 d4 c0 3f 99 9b 86 43 f6 56 b4 12 a3 ac 00 00 00 00 &lt;br /&gt;
01 00 00 00 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To understand where that raw dump has come from, it may be useful to examine tests/ec-key.cpp in [https://gitorious.org/libbitcoin/libbitcoin libbitcoin],&lt;br /&gt;
&lt;br /&gt;
[https://gitorious.org/libbitcoin/libbitcoin libbitcoin] has a unit test under tests/ec-key.cpp (make ec-key &amp;amp;&amp;amp; ./bin/tests/ec-key). There is also a working OP_CHECKSIG implementation in src/script.cpp under script::op_checksig(). See also the unit test: tests/script-test.cpp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;iomanip&amp;gt;&lt;br /&gt;
#include &amp;lt;bitcoin/util/serializer.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;bitcoin/util/elliptic_curve_key.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;bitcoin/util/sha256.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;bitcoin/util/assert.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;bitcoin/util/logger.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;bitcoin/types.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;openssl/ecdsa.h&amp;gt;&lt;br /&gt;
#include &amp;lt;openssl/obj_mac.h&amp;gt;&lt;br /&gt;
using libbitcoin::elliptic_curve_key;&lt;br /&gt;
using libbitcoin::serializer;&lt;br /&gt;
using libbitcoin::hash_digest;&lt;br /&gt;
using libbitcoin::data_chunk;&lt;br /&gt;
using libbitcoin::log_info;&lt;br /&gt;
using libbitcoin::log_fatal;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    serializer ss;&lt;br /&gt;
    // blk number 170, tx 1, input 0&lt;br /&gt;
    // version = 1&lt;br /&gt;
    ss.write_4_bytes(1);&lt;br /&gt;
    // 1 inputs&lt;br /&gt;
    ss.write_var_uint(1);&lt;br /&gt;
&lt;br /&gt;
    // input 0&lt;br /&gt;
    // prevout hash&lt;br /&gt;
    ss.write_hash(hash_digest{0x04, 0x37, 0xcd, 0x7f, 0x85, 0x25, 0xce, 0xed, 0x23, 0x24, 0x35, 0x9c, 0x2d, 0x0b, 0xa2, 0x60, 0x06, 0xd9, 0x2d, 0x85, 0x6a, 0x9c, 0x20, 0xfa, 0x02, 0x41, 0x10, 0x6e, 0xe5, 0xa5, 0x97, 0xc9});&lt;br /&gt;
    // prevout index &lt;br /&gt;
    ss.write_4_bytes(0);&lt;br /&gt;
&lt;br /&gt;
    // input script after running OP_CHECKSIG for this tx is a single&lt;br /&gt;
    // OP_CHECKSIG opcode&lt;br /&gt;
    data_chunk raw_data;&lt;br /&gt;
    raw_data = {0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3};&lt;br /&gt;
    data_chunk raw_script;&lt;br /&gt;
    raw_script = data_chunk();&lt;br /&gt;
    raw_script.push_back(raw_data.size());&lt;br /&gt;
    libbitcoin::extend_data(raw_script, raw_data);&lt;br /&gt;
    raw_script.push_back(172);&lt;br /&gt;
    ss.write_var_uint(raw_script.size());&lt;br /&gt;
    ss.write_data(raw_script);&lt;br /&gt;
    // sequence&lt;br /&gt;
    ss.write_4_bytes(0xffffffff);&lt;br /&gt;
&lt;br /&gt;
    // 2 outputs for this tx&lt;br /&gt;
    ss.write_var_uint(2);&lt;br /&gt;
&lt;br /&gt;
    // output 0&lt;br /&gt;
    ss.write_8_bytes(1000000000);&lt;br /&gt;
    // script for output 0&lt;br /&gt;
    raw_data = {0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xdf, 0x5f, 0x14, 0x2c, 0x21, 0xc1, 0xb7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xf1, 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, 0x4f, 0x7e, 0x6c, 0xd8, 0x4c};&lt;br /&gt;
    // when data &amp;lt; 75, we can just write it&#039;s length as a single byte (&#039;special&#039;&lt;br /&gt;
    // opcodes)&lt;br /&gt;
    raw_script = data_chunk();&lt;br /&gt;
    raw_script.push_back(raw_data.size());&lt;br /&gt;
    libbitcoin::extend_data(raw_script, raw_data);&lt;br /&gt;
    // OP_CHECKSIG&lt;br /&gt;
    raw_script.push_back(172);&lt;br /&gt;
    // now actually write the script&lt;br /&gt;
    ss.write_var_uint(raw_script.size());&lt;br /&gt;
    ss.write_data(raw_script);&lt;br /&gt;
&lt;br /&gt;
    // output 0&lt;br /&gt;
    ss.write_8_bytes(4000000000);&lt;br /&gt;
    // script for output 0&lt;br /&gt;
    raw_data = {0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3};&lt;br /&gt;
    // when data &amp;lt; 75, we can just write it&#039;s length as a single byte (&#039;special&#039;&lt;br /&gt;
    raw_script.push_back(raw_data.size());&lt;br /&gt;
    libbitcoin::extend_data(raw_script, raw_data);&lt;br /&gt;
    // OP_CHECKSIG&lt;br /&gt;
    raw_script.push_back(172);&lt;br /&gt;
    // now actually write the script&lt;br /&gt;
    ss.write_var_uint(raw_script.size());&lt;br /&gt;
    ss.write_data(raw_script);&lt;br /&gt;
&lt;br /&gt;
    // End of 2 outputs&lt;br /&gt;
&lt;br /&gt;
    // locktime&lt;br /&gt;
    ss.write_4_bytes(0);&lt;br /&gt;
&lt;br /&gt;
    // write hash_type_code&lt;br /&gt;
    ss.write_4_bytes(1);&lt;br /&gt;
&lt;br /&gt;
    // Dump hex to screen&lt;br /&gt;
    log_info() &amp;lt;&amp;lt; &amp;quot;hashing:&amp;quot;;&lt;br /&gt;
    {&lt;br /&gt;
        auto log_obj = log_info();&lt;br /&gt;
        log_obj &amp;lt;&amp;lt; std::hex;&lt;br /&gt;
        for (int val: ss.get_data())&lt;br /&gt;
            log_obj &amp;lt;&amp;lt; std::setfill(&#039;0&#039;) &amp;lt;&amp;lt; std::setw(2) &amp;lt;&amp;lt; val &amp;lt;&amp;lt; &#039; &#039;;&lt;br /&gt;
    }&lt;br /&gt;
    log_info();&lt;br /&gt;
&lt;br /&gt;
    data_chunk raw_tx = {0x01, 0x00, 0x00, 0x00, 0x01, 0xc9, 0x97, 0xa5, 0xe5, 0x6e, 0x10, 0x41, 0x02, 0xfa, 0x20, 0x9c, 0x6a, 0x85, 0x2d, 0xd9, 0x06, 0x60, 0xa2, 0x0b, 0x2d, 0x9c, 0x35, 0x24, 0x23, 0xed, 0xce, 0x25, 0x85, 0x7f, 0xcd, 0x37, 0x04, 0x00, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3, 0xac, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0xca, 0x9a, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xdf, 0x5f, 0x14, 0x2c, 0x21, 0xc1, 0xb7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xf1, 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, 0x4f, 0x7e, 0x6c, 0xd8, 0x4c, 0xac, 0x00, 0x28, 0x6b, 0xee, 0x00, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};&lt;br /&gt;
    BITCOIN_ASSERT(raw_tx == ss.get_data());&lt;br /&gt;
&lt;br /&gt;
    hash_digest tx_hash = libbitcoin::generate_sha256_hash(ss.get_data());&lt;br /&gt;
&lt;br /&gt;
    data_chunk pubkey{0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3};&lt;br /&gt;
    // Leave out last byte since that&#039;s the hash_type_code (SIGHASH_ALL in this&lt;br /&gt;
    // case)&lt;br /&gt;
    data_chunk signature{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69, 0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1, 0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6, 0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd, 0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca, 0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90, 0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22, 0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09};&lt;br /&gt;
    BITCOIN_ASSERT(signature.size() == 70);&lt;br /&gt;
&lt;br /&gt;
    elliptic_curve_key key;&lt;br /&gt;
    if (!key.set_public_key(pubkey))&lt;br /&gt;
    {&lt;br /&gt;
        log_fatal() &amp;lt;&amp;lt; &amp;quot;unable to set EC public key&amp;quot;;&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    log_info() &amp;lt;&amp;lt; &amp;quot;checksig returns: &amp;quot; &amp;lt;&amp;lt; (key.verify(tx_hash, signature) ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical]]&lt;br /&gt;
[[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=File:Bitcoin_OpCheckSig_InDetail.png&amp;diff=14953</id>
		<title>File:Bitcoin OpCheckSig InDetail.png</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=File:Bitcoin_OpCheckSig_InDetail.png&amp;diff=14953"/>
		<updated>2011-08-14T13:13:35Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: A full breakdown of the process to verify the Bitcoin ECDSA signature of a pair of transactions.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
A full breakdown of the process to verify the Bitcoin ECDSA signature of a pair of transactions.&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{self|Cc-zero}}&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Mining_hardware_comparison&amp;diff=6810</id>
		<title>Mining hardware comparison</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Mining_hardware_comparison&amp;diff=6810"/>
		<updated>2011-04-06T05:00:00Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: /* AMD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Below are some statistics about the mining performance of various hardware used in a [[mining rig]].&lt;br /&gt;
&lt;br /&gt;
The table shows stock clock numbers. 10-20% performance improvement can be achieved via overclocking.&lt;br /&gt;
&lt;br /&gt;
==Graphics cards==&lt;br /&gt;
&lt;br /&gt;
===AMD===&lt;br /&gt;
To get the maximum performance use the 2.1 or 2.2 release of the ATI Stream SDK. 2.3 performance drops by 5-10%.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Model !! Mhash/s !! Mhash/W !! W !! Clock !! SP !! SDK  !! Slot !! Miner !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 3XXX || || || || || || || || OpenCL Not Supported&lt;br /&gt;
|-&lt;br /&gt;
| 42XX || || || || || || || PCI-E 2.0 x16 || || OpenCL Not Supported (intergrated/mobile GPU)&lt;br /&gt;
|-&lt;br /&gt;
| 4350 || 6.93 || 0.346 || 20 || 575 || 80 || || PCI-E 2.0 x16 || poclbm || -w 32, don&#039;t use vectors &lt;br /&gt;
|-&lt;br /&gt;
| 4550 || 7.23 || 0.289 || 25 || 600 || 80 || || PCI-E 2.0 x16 || poclbm || -w 32, don&#039;t use vectors &lt;br /&gt;
|- &lt;br /&gt;
| 4650 || 31.33 || 0.653 || 48 || 650 || 320 || || PCI-E 2.0 x16 || poclbm || -w 32, don&#039;t use vectors &lt;br /&gt;
|- &lt;br /&gt;
| 4670 || 36.14 || 0.613 || 59 || 750 || 320 || || PCI-E 2.0 x16 || poclbm || -w 32, don&#039;t use vectors &lt;br /&gt;
|- &lt;br /&gt;
| 4730 || 72.29 || 0.657 || 110 || 750 || 640 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 4770 || 72.29 || 0.904 || 80 || 750 || 640 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 4830 || 55.42 || 0.583 || 95 || 575 || 640 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 4850 || 75.30 || 0.685 || 110 || 625 || 800 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 4860 || 67.47 || 0.519 || 130 || 700 || 640 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 4870 || 90.36 || 0.602 || 150 || 750 || 800 || 2.1 || PCI-E 2.0 x16 || clmine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4870 || 78    ||       ||     ||     ||     || || PCI-E 2.0 x16 || m0mchil&#039;s OpenCL/Vista 64bit || [http://www.bitcoin.org/smf/index.php?topic=1628.msg25069#msg25069 source]&lt;br /&gt;
|- &lt;br /&gt;
| 4890 || 102.41 || 0.539 || 190 || 850 || 800 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 4850X2 || 150.60 || 0.602 || 250 || 625 || 1600 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 4870X2 || 180.72 || 0.632 || 286 || 750 || 1600 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 5450 || 11.99 || 0.631 || 19 || 650 || 80 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 5550 || 40.59 || 1.041 || 39 || 550 || 320 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#FFFFEF;&amp;quot;| 5570 || 59.96 || 1.538 || 39 || 650 || 400 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#FFFFEF;&amp;quot;| 5570 || 64 || 1.641 || 39 || 650 || || || PCI-E 2.1 x16 || m0mchil&#039;s OpenCL/WinXP || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source]&lt;br /&gt;
|- &lt;br /&gt;
| 5650 || 48    || 2.5-3.2 ? || 15-19 ? ||  ||  ||  || PCI-E 2.1 x16 || m0mchil&#039;s OpenCL/Win7-64 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg26292#msg26292 source] [http://www.notebookcheck.net/ATI-Mobility-Radeon-HD-5650.23697.0.html source]&lt;br /&gt;
|- &lt;br /&gt;
| 5670 || 71.49 || 1.117 || 64 || 775 || 400 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#EEFFEE;&amp;quot;| 5670 || 72 || 1.64 || 44 || 850 || || || PCI-E 2.0 x16 || poclbm-mod (Win7-64) || Sapphire 100287VGAL card is low power&lt;br /&gt;
|- &lt;br /&gt;
| 5670 || 85 || || || 900 || 400 || || PCI-E 2.1 x16 || poclbm || -v -f 0 -w 128&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| 5750 || 116.24 || 1.352 || 86 || 700 || 720 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 5770 || 156.83 || 1.452 || 108 || 850 || 800 || 2.1 || PCI-E 2.1 x16 || clmine ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#FFFFFF;&amp;quot;| 5830 || 206.64 || 1.181 || 175 || 800 || 1120 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#FFFFFF;&amp;quot;| 5830 || 241    || 1.377 || 175 || 1006 || || 2.3 || PCI-E 2.1 x16 || poclbm 2011-03-11 / Win7 64 ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFEFFF;&amp;quot;| 5850 || 240.77 || 1.595 || 151 || 725 || 1440 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#EFEFFF;&amp;quot;| 5850 || 252    || 1.669 || 151 || 765 || || 2.3 || PCI-E 2.1 x16 || poclbm 2011-01-25 ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFEFFF;&amp;quot;| 5850 || 255.3  || 1.690 || 151 || 765 || || 2.2 || PCI-E 2.1 x16 || poclbm 2011-01-25 ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFEFFF;&amp;quot;| 5850 || 300    || 1.987 || 151 || 925 (OC) ||      || || PCI-E 2.1 x16 || m0mchil&#039;s OpenCL || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source]&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFEFFF;&amp;quot;| 5850 || 250.26 || 1.657 || 151 ||     ||      ||  || PCI-E 2.1 x16 || opencl client || [http://www.bitcoin.org/smf/index.php?topic=1628.msg29471#msg29471 source]&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFFFEF;&amp;quot;| 5870 || 313.65 || 1.668 || 188 || 850 || 1600 || 2.1 || PCI-E 2.1 x16 || clmine ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFFFEF;&amp;quot;| 5870 || 313    || 1.665 || 188 || 900? || 1600 || 2.3 || PCI-E 2.1 x16 || Diablo/Linux ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#EFFFEF;&amp;quot;| 5870 || 343    || 1.824 || 188 || 900? || 1600 || 2.1 || PCI-E 2.1 x16 || Diablo/Linux ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#EFFFEF;&amp;quot;| 5870 || 355    || 1.888 || 188 || 900? || 1600 || 2.1 || PCI-E 2.1 x16 || poclbm/Linux ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFFFEF;&amp;quot;| 5870 || 340    || 1.809 || 188 || 850 || 1600 ||  || PCI-E 2.1 x16 || m0mchil&#039;s OpenCL || [http://www.bitcoin.org/smf/index.php?topic=1628.msg26363#msg26363 source]&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#FFEFEF;&amp;quot;| 5970 || 535.06 || 1.820 || 294 || 725 || 3200 || 2.1 || PCI-E 2.1 x16 || clmine ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#FFEFEF;&amp;quot;| 5970 || 560    || 1.905 || 294 || 725 || || || PCI-E 2.1 x16 || Diablo ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#FFEFEF;&amp;quot;| 5970 || 565    || 1.922 || 294 || || || 2.1 || PCI-E 2.1 x16 || clmine2 ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#FFEFEF;&amp;quot;| 5970 || 604    || 2.054 || 294 || || || 2.1 || PCI-E 2.1 x16 || clmine ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#FFEFEF;&amp;quot;| 5970 || 645    ||       ||     || 850 || 3200 || 2.1 || PCI-E 2.1 x16 || m0mchil/poclbm 03-07-11 || -f1, Debian 6, fglrx-driver 10.9.3&lt;br /&gt;
|- &lt;br /&gt;
| 6850 || 171.59 || 1.351 || 127 || 775 || 960 || 2.1 || PCI-E 2.1 x16 || clmine ||&lt;br /&gt;
|- &lt;br /&gt;
| 6850 || 196 || || || 850 || 960 || || PCI-E 2.1 x16 || poclbm || -v -w 128 -f 0&lt;br /&gt;
|- &lt;br /&gt;
| 6870 || 232.47 || 1.540 || 151 || 900 || 1120 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 6870 || 260.1 || 1.611 || 175 || 1001 || 1150 || 2.2 || PCI-E 2.1 x16 || poclbm-gui windows7x86 cat 11.3 || -v -w 128 -f 1 &lt;br /&gt;
|-&lt;br /&gt;
| 6870 || 282.23 || 1.611 || 175 || 1047 || 1120 || 2.2 || PCI-E 2.1 x16 || poclbm windows cat 11.2 || -v -w 128 -f 0 mem clock 300&lt;br /&gt;
|- &lt;br /&gt;
| 6950 || 295 ||  || 160 (?) || 810 || 1536 || 2.4.595.0 || PCI-E 2.1 x16 || m0mchil/poclbm 03-07-11 || unlocked shaders, default mem 1250&lt;br /&gt;
|-&lt;br /&gt;
| 6950 || 325 ||  || 200 (?) || 885 || 1536 || 2.4.595.0 || PCI-E 2.1 x16 || m0mchil/poclbm 03-07-11 || unlocked shaders, default mem 1250&lt;br /&gt;
|-&lt;br /&gt;
| 6950 || 360 ||  || 200 (?) || 970 || 1536 || 2.4.595.0 || PCI-E 2.1 x16 || m0mchil/poclbm 03-07-11 || unlocked shaders, default mem 1250&lt;br /&gt;
|-&lt;br /&gt;
| 6970 || 323 || 1.468 || 220 || 880 || 1536 || 2.3 || PCI-E 2.1 x16 || poclbm || -w 64, SDK 2.1 not supported on 69xx.&lt;br /&gt;
|- &lt;br /&gt;
| 6990 ||  ||  ||  ||  ||  || 2.3 ||  PCI-E 2.1 x16 || || SDK 2.1 not supported on 69xx.&lt;br /&gt;
|- &lt;br /&gt;
|FirePro V8700 || 84.8 ||  ||  || 750 || 800 ||  || || poclbm-mod.03.24.2011 || &lt;br /&gt;
|- &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Nvidia===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Model !! Mhash/s !! Mhash/W !! W !! Clock !! SP !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| 8200 mGPU || 1.2 || || || 1200 || 16 || 128 MB shared memory, &amp;quot;poclbm -w 128 -f 0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 8600M GT || 4.93 ||  ||  ||  || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 8600GT || 5.66 ||  ||  || 1188 ||  32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 8600GT OC || 7.3 ||  ||  || 1602 || 32 || [http://www.bitcoin.org/smf/index.php?topic=1334.0 poclbm] -w 128 [http://www.bitcoin.org/smf/index.php?topic=4967.msg72833#msg72833 source]&lt;br /&gt;
|-&lt;br /&gt;
| 8800GT || 25   || 0.24 || 105 || 1300 ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| 8800GT || 24.5 || 0.23 || 105 || 1300 ||  || [http://www.bitcoin.org/smf/index.php?topic=1628.msg37592#msg37592 source]&lt;br /&gt;
|-&lt;br /&gt;
| 8800GTS || 16.8 || 0.109 || 154 ||  ||  || [http://www.bitcoin.org/smf/index.php?topic=1628.msg25069#msg25069 source] [http://www.techspot.com/review/79-geforce-8800-gts-512/page11.html source]&lt;br /&gt;
|-&lt;br /&gt;
| 8800 GTS || 18.7 || 0.124 || 150 || 1200 ||  || poclbm -w 64 no vectors&lt;br /&gt;
|-&lt;br /&gt;
| 9300GE || 1.57 ||  ||  || 1300 ||  8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9300GS || 1.69 ||  ||  || 1400 ||  8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9400GT || 3.37 || 0.067 || 50 || 1400 || 16 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9500GT || 6.75 || 0.135 || 50 || 1400 || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9600GSO || 19.88 || 0.237 || 84 || 1375 || 96 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9600GSO512 || 11.75 || 0.131 || 90 || 1625 || 48 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9600GT || 15.66 || 0.165 || 95 || 1625 || 64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9600GT OC || 18.8 || &amp;lt;0.198 || &amp;gt;95 || 1981 || 64 || [http://www.bitcoin.org/smf/index.php?topic=1334.0 poclbm] -w 128 -f 10 [http://www.bitcoin.org/smf/index.php?topic=4967.msg74610#msg74610 source] [http://www.bitcoin.org/smf/index.php?topic=4967.msg73353#msg73353 source]&lt;br /&gt;
|-&lt;br /&gt;
| 9800GT || 30.36 || 0.289 || 105 || 1800 || 112 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9800GTX || 32.54 || 0.232 || 140 || 1688 || 128 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9800GTX+ || 35.39 || 0.251 || 141 || 1836 || 128 ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFEFEF&amp;quot;| 9800GX2 || 57.83 || 0.294 || 197 ||  || 2x128 ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFEFEF&amp;quot;| 9800GX2 || 28 || 0.142 || 197 ||  || 2x128 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg37620#msg37620 source]&lt;br /&gt;
|-&lt;br /&gt;
| G210 || 3.38 || 0.111 || 30.5 || 1402 || 16 ||&lt;br /&gt;
|-&lt;br /&gt;
| GT220 || 9.83 || 0.170 || 58 || 1360 || 48 ||&lt;br /&gt;
|-&lt;br /&gt;
| GT240 || 19.37 || 0.281 || 69 || 1340 || 96 ||&lt;br /&gt;
|-&lt;br /&gt;
| GT240 || 21.24 ||  ||  ||  || 96 || [http://www.bitcoin.org/smf/index.php?topic=4291.0 poclbm-mod] -f 0 -v [http://www.bitcoin.org/smf/index.php?topic=4967.msg73383#msg73383 source]&lt;br /&gt;
|-&lt;br /&gt;
| GTS250 || 35.39 || 0.244 || 145 || 1836 || 128 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX260 || 35.91 || 0.178 || 202 || 1242 || 192 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX260 || 44 || 0.242 || 182 || 1242 || 216 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source]&lt;br /&gt;
|-&lt;br /&gt;
| GTX260c216 || 40.40 || 0.236 || 171 || 1242 || 216 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX260c216 OC || 52.0 || || || 1461 || 216 || &amp;quot;poclbm -w 256 -f 1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| GTX275 || 50.75 || 0.232 || 219 || 1404 || 240 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX275 || 58 || || || 729/1458 || 240 || poclbm -f 0 -w 256&lt;br /&gt;
|-&lt;br /&gt;
| GTX280 || 46.84 || 0.198 || 236 || 1296 || 240 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX285 || 53.35 || 0.262 || 204 || 1476 || 240 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX295 || 89.78 || 0.311 || 289 || 1242 || 480 ||&lt;br /&gt;
|-&lt;br /&gt;
| GT 320M (MacBook Air) || 6.12 ||  ||  || 1212 || 48 ||&lt;br /&gt;
|-&lt;br /&gt;
| GT 330M (Sony Vaio Z) || 7.8 || 0.71 ( 0.3 total) || 11 (26w total) || 1045 || 48 ||&lt;br /&gt;
|-&lt;br /&gt;
| GT430 || 20.24 || 0.413 || 49 || 1400 || 96 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTS450 || 45.28 || 0.427 || 106 || 1566 || 192 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX460SE || 56.39 || 0.376 || 150 || 1300 || 288 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX460 || 68.31 || 0.427 || 160 || 1350 || 336 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX460 (2 cards) || 102 || 0.319? || 320? || 1350 ||  || [http://www.bitcoin.org/smf/index.php?topic=1628.msg26363#msg26363 source]&lt;br /&gt;
|-&lt;br /&gt;
| GTX460 (2 cards) OC || 127 || 0.374 || 340 || 1620 || 2x 336 || [http://www.bitcoin.org/smf/index.php?topic=2444.0 rpcminer-cuda] -gpugrid=128 -gputhreads=128 ver.20110227&lt;br /&gt;
|-&lt;br /&gt;
| GTX465 || 64.41 || 0.322 || 200 || 1215 || 352 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX470 || 81.98 || 0.381 || 215 || 1215 || 448 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX470 || 94.7 || || || 1414 || ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX480 || 101.28 || 0.405 || 250 || 1401 || 480 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX560 Ti || 67.7 || 0.39  || 170 || 1700 || 384 || standard EVGA 560, no overclock&lt;br /&gt;
|-&lt;br /&gt;
| GTX560 OC || 86.7 || &amp;lt;0.51 || &amp;gt;170 || 1800 || 384 || [http://www.bitcoin.org/smf/index.php?topic=2444.0 rpcminer-cuda] [http://www.bitcoin.org/smf/index.php?topic=4967.msg72816#msg72816 source]&lt;br /&gt;
|-&lt;br /&gt;
| GTX570 || 105.83 || 0.483 || 219 || 1464 || 480 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX580 || 119.06 || 0.488 || 244 || 1544 || 512 ||&lt;br /&gt;
|-&lt;br /&gt;
| Quadro FX 580 || 5.7 || 0.14 || 40 || 1125 || 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| Quadro FX 1600M || 6 || 0.12 || 50 || 625 || 32 ||rpcminer-cuda, Win&lt;br /&gt;
|-&lt;br /&gt;
| Quadro NVS 135M || 1.05 || 0.1 || 10 || 800 || 1 || &lt;br /&gt;
|-&lt;br /&gt;
| Quadro NVS 3100M || 3.6 || 0.257 || 14 || 600 || 16 || rpcminer-cuda, Win, CUDA 3.1.1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==CPUs==&lt;br /&gt;
&lt;br /&gt;
A lot of nice data can be pulled from [http://www.bitcoin.org/smf/index.php?topic=1628.0 this thread] to seed this section. Also from [https://www.bitcoin.org/wiki/doku.php?id=bitcoin_miners this page on the old wiki].&lt;br /&gt;
&lt;br /&gt;
===AMD===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Model !! nprocs !! Mhash/s !! Mhash/W !! ACP [W] !! Clock !! Version !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| 2x Opteron 6128 || 16 || 32.4 || 0.203 || 160W || 2 GHz || 0.3.19 || -4way&lt;br /&gt;
|-&lt;br /&gt;
| Athlon X2 3800+ || 2 || 1.73 || 0.03 || 65 W || 2.00 GHz || cpuminer (v0.8.1-1-g69529c3) || -algo=4way&lt;br /&gt;
|-&lt;br /&gt;
| Athlon X2 4000+ || 2 || 1.9 || 0.02 || 65W || 2.1 GHz || rpc-miner || &lt;br /&gt;
|-&lt;br /&gt;
| Athlon X2 4400+ ||   || 2.09 || 0.32 || 65W || 2.3GHz || 0.3.19/Win x64 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg37592#msg37592 source]&lt;br /&gt;
|-&lt;br /&gt;
| Athlon X2 6000+ || 2 || 2.81 || 0.02 || 125W || 3 GHz || || [http://www.bitcoin.org/smf/index.php?topic=1628.msg22881#msg22881 source]&lt;br /&gt;
|-&lt;br /&gt;
| Athlon X2 6400+ Black Edition || 2 || 2.9 || 0.023 || 125W || 3.2 GHz || 0.3.20.2 BETA/Win 7 x64 || -4way&lt;br /&gt;
|-&lt;br /&gt;
| Athlon XP 2000+ || 2 || 0.62 || 0.009 || 70W || 1.67 GHz || 0.3.18/Ubuntu || [http://www.bitcoin.org/smf/index.php?topic=1628.msg37592#msg37592 source] [http://www.pcstats.com/articleview.cfm?articleid=914&amp;amp;page=4 source]&lt;br /&gt;
|-&lt;br /&gt;
| Athlon II X2 240e || 2 || 2.71 || 0.06 || 45W || 2.81 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|-&lt;br /&gt;
| Athlon II X4 630 || 4 || 10.7 || 0.11 || 95W || 2.8 GHz || bitcoin-miner 0.4 || &lt;br /&gt;
|-&lt;br /&gt;
| Phenom II X6 1055T || 6 || 15.84 || 0.13 || 125W || 2.82 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|-&lt;br /&gt;
| Phenom II X6 1100T || 6 || 22 || 0.176 || 125W || 3.82 GHz || bitcoin-miner || Aciid#bitcoin-dev&lt;br /&gt;
|-&lt;br /&gt;
| Phenom II X3 720 || 3 || 3.8 || 0.04 || 95W || 2.8 GHz || 0.3.1x/WinXP || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source]&lt;br /&gt;
|-&lt;br /&gt;
| Phenom II X3 720 || 3 || 7.2 || 0.08 || 95W || 2.8 GHz || cpu-miner 0.2.1/WinXP || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source]&lt;br /&gt;
|-&lt;br /&gt;
| Phenom II x4 955 || 4 || 11 || 0.09 || 125W || 3.2 GHz || rpcminer-4way ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===ARM===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Model !! p/t !! Mhash/s !! Mhash/W !! ACP [W] !! Clock !! Version !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| Cortex A8 || 1 || 0.125 || || || 0.6 GHz || cpuminer git (2011-03-26) || Nokia N900: &#039;cryptopp&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cortex A8 || 1 || 0.2 || || || 0.6 GHz || cpuminer git (2011-03-26) || Nokia N900: &#039;c&#039; algo&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Intel===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Model !! p/t !! Mhash/s !! Mhash/W !! ACP [W] !! Clock !! Version !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| Pentium III mobile ? || 1 || 0.3 || 0.014 || 21W || 1.07 GHz || 0.3.1x/Win2K || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source] [http://ark.intel.com/Product.aspx?id=27380 source]&lt;br /&gt;
|-&lt;br /&gt;
| Old Xeon 512k (Dual) || 2x1/2 || 2.0 || ? || ? || 3.06GHz || cpuminer (v0.8.1-1-g69529c3) || HT disabled, algo=4way (twice as fast as the 2nd best algo)&lt;br /&gt;
|-&lt;br /&gt;
| Pentium 4 2.0A || 1 || 0.85 || || || 2.0 GHz || [http://www.bitcoin.org/smf/index.php?topic=3486.0 ufasoft-0.4]/WinXP || -g no -t 2&lt;br /&gt;
|-&lt;br /&gt;
| Pentium Dual-Core E5400 || 2/2 || 2.27 || 0.03 || 65W || 2.7 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|-&lt;br /&gt;
| Celeron E330 || 2/2 || 2.2  || 0.03 || 65W || 2.5 GHz || 0.3.19/Ubuntu10.04 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg37620#msg37620 source]&lt;br /&gt;
|-&lt;br /&gt;
| Core i3 M350 || 2/4 || 1.48 || 0.04 || 35W || 2.27 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|- &lt;br /&gt;
| Core i5 M450 || 2/4 || 1.8  || 0.05 || 35W || 1.2 GHz || 0.3.17/Win7-54 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg26292#msg26292 source]&lt;br /&gt;
|- &lt;br /&gt;
| Core i5-650  || 2/4 || 5.1 || 0.04 ? ||  || 3.2 GHz || cpuminer-0.7 || -4way&lt;br /&gt;
|-&lt;br /&gt;
| Core i5 ?  || 4/? || 6.5 ||  ||  ||  || client from svn || [http://www.bitcoin.org/smf/index.php?topic=1628.msg37621#msg37621 source]&lt;br /&gt;
|-&lt;br /&gt;
| Core i5-2400 || 4/4 || 4.5 || 0.05 || 95W || 3.1 GHz || cpuminer git (2011-01-22) || cryptopp_asm32&lt;br /&gt;
|-&lt;br /&gt;
| Core i5-2400 || 4/4 || 14 || 0.15 || 95W || 3.1 GHz || cpuminer git (2011-03-26) || sse2_64&lt;br /&gt;
|-&lt;br /&gt;
| Core i7 920   || 4/8 || 19.2 || 0.10 || 195 || 4.0 GHz (x21) || [http://www.bitcoin.org/smf/index.php?topic=3486.0 ufasoft] || -a 5&lt;br /&gt;
|-&lt;br /&gt;
| Core i7 950   || 4/8 || 5.88 || 0.039 || 150W || 3.83 GHz (x23) || bitcoin-0.3.20.2 Win7-64 ||&lt;br /&gt;
|-&lt;br /&gt;
| Core i7 950   || 4/8 || 18.9 || 0.126 || 150W || 3.83 GHz (x23) || [http://www.bitcoin.org/smf/index.php?topic=3486.0 ufasoft] v0.4 ||&lt;br /&gt;
|-&lt;br /&gt;
| Core i7 980x   || 6/12 || 19.2 || 0.15 || 130 || 4.4 GHz (x33) || cpuminer/Win7-64 || &lt;br /&gt;
|- &lt;br /&gt;
| Core i7 980x   || 6/12 || 8.7 ||  ||  || 3.9 GHz (x27) || 0.3.17/Win7-64 || &lt;br /&gt;
|- &lt;br /&gt;
| Core i7 620M   || 2/4 || 6.3 || 0.18 || 35 || 2.66 GHz || [http://www.bitcoin.org/smf/index.php?topic=3486.0 ufasoft] v0.4 || &lt;br /&gt;
|-&lt;br /&gt;
| Core 2 Duo E6550 || 1/2 || 2.45 || ? || ? || 2.33 GHz || cpuminer 0.7.1 (Linux) || --algo=sse2_64&lt;br /&gt;
|-&lt;br /&gt;
| Core 2 Duo E6850 || 2/2 || 6.75 || 0.10 || 65W || 3.0 Ghz || ufasoft-0.3 ||&lt;br /&gt;
|- &lt;br /&gt;
| Core 2 Duo E7300 || 2/2 || 7.76 || 0.11 || 70W || 3.33 GHz (o/c?) || ufasoft-0.3 || miner optimized for Intel Core&lt;br /&gt;
|-&lt;br /&gt;
| Core 2 Duo E7300 || 2/2 || 2.52 || 0.04 || 65W || 2.66 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|-&lt;br /&gt;
| Xeon X5355 (dual) || 2x4/4 || 10.13 || 0.16 || 120W || 2.66GHz || bitcoind || Roughly the same speed as the &amp;quot;c&amp;quot; algo in cpuminer&lt;br /&gt;
|-&lt;br /&gt;
| Xeon X5355 (dual) || 2x4/4 || 22.76 || 0.09 || 120W || 2.66GHz || cpuminer (v0.8.1-1-g69529c3) || -O2 -march=core2, algo=sse2_64&lt;br /&gt;
|-&lt;br /&gt;
| Xeon E5440 || 4/8 || 7.3 || ? || 80W || 2.66 GHz|| Kiv&#039;s poclbm-gui || FIXME: Either wrong model # or wrong threads/speed info&lt;br /&gt;
|-&lt;br /&gt;
| Xeon E5520 || 4/8 || 6.5 || 0.08 || 80W || 2.27 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|-&lt;br /&gt;
| Xeon E5530 || 4/8 || 7.14 || 0.09 || 80W || 2.4 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|-&lt;br /&gt;
| Xeon E5630 (dual) || 2x4/8 || 8 || 0.1 || 80W || 2.53 GHz || 0.3.17/Win7-64 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg29471#msg29471 source]&lt;br /&gt;
|-&lt;br /&gt;
| Atom N270 || 1 || 0.42 || &#039;&#039;&#039;0.17&#039;&#039;&#039; || 2.5W || 1.6 GHz || 0.3.1x/WinXP || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
* [[Mining rig]]&lt;br /&gt;
* [[OpenCL miner]]&lt;br /&gt;
* [http://www.pcper.com/article.php?aid=745 ATI Stream vs. NVIDIA CUDA - GPGPU computing battle royale]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mining]]&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Mining_hardware_comparison&amp;diff=6809</id>
		<title>Mining hardware comparison</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Mining_hardware_comparison&amp;diff=6809"/>
		<updated>2011-04-06T04:58:00Z</updated>

		<summary type="html">&lt;p&gt;Etotheipi: /* AMD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Below are some statistics about the mining performance of various hardware used in a [[mining rig]].&lt;br /&gt;
&lt;br /&gt;
The table shows stock clock numbers. 10-20% performance improvement can be achieved via overclocking.&lt;br /&gt;
&lt;br /&gt;
==Graphics cards==&lt;br /&gt;
&lt;br /&gt;
===AMD===&lt;br /&gt;
To get the maximum performance use the 2.1 or 2.2 release of the ATI Stream SDK. 2.3 performance drops by 5-10%.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Model !! Mhash/s !! Mhash/W !! W !! Clock !! SP !! SDK  !! Slot !! Miner !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 3XXX || || || || || || || || OpenCL Not Supported&lt;br /&gt;
|-&lt;br /&gt;
| 42XX || || || || || || || PCI-E 2.0 x16 || || OpenCL Not Supported (intergrated/mobile GPU)&lt;br /&gt;
|-&lt;br /&gt;
| 4350 || 6.93 || 0.346 || 20 || 575 || 80 || || PCI-E 2.0 x16 || poclbm || -w 32, don&#039;t use vectors &lt;br /&gt;
|-&lt;br /&gt;
| 4550 || 7.23 || 0.289 || 25 || 600 || 80 || || PCI-E 2.0 x16 || poclbm || -w 32, don&#039;t use vectors &lt;br /&gt;
|- &lt;br /&gt;
| 4650 || 31.33 || 0.653 || 48 || 650 || 320 || || PCI-E 2.0 x16 || poclbm || -w 32, don&#039;t use vectors &lt;br /&gt;
|- &lt;br /&gt;
| 4670 || 36.14 || 0.613 || 59 || 750 || 320 || || PCI-E 2.0 x16 || poclbm || -w 32, don&#039;t use vectors &lt;br /&gt;
|- &lt;br /&gt;
| 4730 || 72.29 || 0.657 || 110 || 750 || 640 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 4770 || 72.29 || 0.904 || 80 || 750 || 640 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 4830 || 55.42 || 0.583 || 95 || 575 || 640 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 4850 || 75.30 || 0.685 || 110 || 625 || 800 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 4860 || 67.47 || 0.519 || 130 || 700 || 640 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 4870 || 90.36 || 0.602 || 150 || 750 || 800 || 2.1 || PCI-E 2.0 x16 || clmine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4870 || 78    ||       ||     ||     ||     || || PCI-E 2.0 x16 || m0mchil&#039;s OpenCL/Vista 64bit || [http://www.bitcoin.org/smf/index.php?topic=1628.msg25069#msg25069 source]&lt;br /&gt;
|- &lt;br /&gt;
| 4890 || 102.41 || 0.539 || 190 || 850 || 800 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 4850X2 || 150.60 || 0.602 || 250 || 625 || 1600 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 4870X2 || 180.72 || 0.632 || 286 || 750 || 1600 || || PCI-E 2.0 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 5450 || 11.99 || 0.631 || 19 || 650 || 80 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 5550 || 40.59 || 1.041 || 39 || 550 || 320 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#FFFFEF;&amp;quot;| 5570 || 59.96 || 1.538 || 39 || 650 || 400 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#FFFFEF;&amp;quot;| 5570 || 64 || 1.641 || 39 || 650 || || || PCI-E 2.1 x16 || m0mchil&#039;s OpenCL/WinXP || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source]&lt;br /&gt;
|- &lt;br /&gt;
| 5650 || 48    || 2.5-3.2 ? || 15-19 ? ||  ||  ||  || PCI-E 2.1 x16 || m0mchil&#039;s OpenCL/Win7-64 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg26292#msg26292 source] [http://www.notebookcheck.net/ATI-Mobility-Radeon-HD-5650.23697.0.html source]&lt;br /&gt;
|- &lt;br /&gt;
| 5670 || 71.49 || 1.117 || 64 || 775 || 400 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 5670 || 72 || 1.64 || 44 || 850 || || || PCI-E 2.0 x16 || poclbm-mod (Win7-64) || Sapphire 100287VGAL card is low power&lt;br /&gt;
|- &lt;br /&gt;
| 5670 || 85 || || || 900 || 400 || || PCI-E 2.1 x16 || poclbm || -v -f 0 -w 128&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| 5750 || 116.24 || 1.352 || 86 || 700 || 720 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 5770 || 156.83 || 1.452 || 108 || 850 || 800 || 2.1 || PCI-E 2.1 x16 || clmine ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#FFFFFF;&amp;quot;| 5830 || 206.64 || 1.181 || 175 || 800 || 1120 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#FFFFFF;&amp;quot;| 5830 || 241    || 1.377 || 175 || 1006 || || 2.3 || PCI-E 2.1 x16 || poclbm 2011-03-11 / Win7 64 ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFEFFF;&amp;quot;| 5850 || 240.77 || 1.595 || 151 || 725 || 1440 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#EFEFFF;&amp;quot;| 5850 || 252    || 1.669 || 151 || 765 || || 2.3 || PCI-E 2.1 x16 || poclbm 2011-01-25 ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFEFFF;&amp;quot;| 5850 || 255.3  || 1.690 || 151 || 765 || || 2.2 || PCI-E 2.1 x16 || poclbm 2011-01-25 ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFEFFF;&amp;quot;| 5850 || 300    || 1.987 || 151 || 925 (OC) ||      || || PCI-E 2.1 x16 || m0mchil&#039;s OpenCL || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source]&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFEFFF;&amp;quot;| 5850 || 250.26 || 1.657 || 151 ||     ||      ||  || PCI-E 2.1 x16 || opencl client || [http://www.bitcoin.org/smf/index.php?topic=1628.msg29471#msg29471 source]&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFFFEF;&amp;quot;| 5870 || 313.65 || 1.668 || 188 || 850 || 1600 || 2.1 || PCI-E 2.1 x16 || clmine ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFFFEF;&amp;quot;| 5870 || 313    || 1.665 || 188 || 900? || 1600 || 2.3 || PCI-E 2.1 x16 || Diablo/Linux ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#EFFFEF;&amp;quot;| 5870 || 343    || 1.824 || 188 || 900? || 1600 || 2.1 || PCI-E 2.1 x16 || Diablo/Linux ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#EFFFEF;&amp;quot;| 5870 || 355    || 1.888 || 188 || 900? || 1600 || 2.1 || PCI-E 2.1 x16 || poclbm/Linux ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#EFFFEF;&amp;quot;| 5870 || 340    || 1.809 || 188 || 850 || 1600 ||  || PCI-E 2.1 x16 || m0mchil&#039;s OpenCL || [http://www.bitcoin.org/smf/index.php?topic=1628.msg26363#msg26363 source]&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#FFEFEF;&amp;quot;| 5970 || 535.06 || 1.820 || 294 || 725 || 3200 || 2.1 || PCI-E 2.1 x16 || clmine ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#FFEFEF;&amp;quot;| 5970 || 560    || 1.905 || 294 || 725 || || || PCI-E 2.1 x16 || Diablo ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#FFEFEF;&amp;quot;| 5970 || 565    || 1.922 || 294 || || || 2.1 || PCI-E 2.1 x16 || clmine2 ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#FFEFEF;&amp;quot;| 5970 || 604    || 2.054 || 294 || || || 2.1 || PCI-E 2.1 x16 || clmine ||&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#FFEFEF;&amp;quot;| 5970 || 645    ||       ||     || 850 || 3200 || 2.1 || PCI-E 2.1 x16 || m0mchil/poclbm 03-07-11 || -f1, Debian 6, fglrx-driver 10.9.3&lt;br /&gt;
|- &lt;br /&gt;
| 6850 || 171.59 || 1.351 || 127 || 775 || 960 || 2.1 || PCI-E 2.1 x16 || clmine ||&lt;br /&gt;
|- &lt;br /&gt;
| 6850 || 196 || || || 850 || 960 || || PCI-E 2.1 x16 || poclbm || -v -w 128 -f 0&lt;br /&gt;
|- &lt;br /&gt;
| 6870 || 232.47 || 1.540 || 151 || 900 || 1120 || || PCI-E 2.1 x16 || ||&lt;br /&gt;
|- &lt;br /&gt;
| 6870 || 260.1 || 1.611 || 175 || 1001 || 1150 || 2.2 || PCI-E 2.1 x16 || poclbm-gui windows7x86 cat 11.3 || -v -w 128 -f 1 &lt;br /&gt;
|-&lt;br /&gt;
| 6870 || 282.23 || 1.611 || 175 || 1047 || 1120 || 2.2 || PCI-E 2.1 x16 || poclbm windows cat 11.2 || -v -w 128 -f 0 mem clock 300&lt;br /&gt;
|- &lt;br /&gt;
| 6950 || 295 ||  || 160 (?) || 810 || 1536 || 2.4.595.0 || PCI-E 2.1 x16 || m0mchil/poclbm 03-07-11 || unlocked shaders, default mem 1250&lt;br /&gt;
|-&lt;br /&gt;
| 6950 || 325 ||  || 200 (?) || 885 || 1536 || 2.4.595.0 || PCI-E 2.1 x16 || m0mchil/poclbm 03-07-11 || unlocked shaders, default mem 1250&lt;br /&gt;
|-&lt;br /&gt;
| 6950 || 360 ||  || 200 (?) || 970 || 1536 || 2.4.595.0 || PCI-E 2.1 x16 || m0mchil/poclbm 03-07-11 || unlocked shaders, default mem 1250&lt;br /&gt;
|-&lt;br /&gt;
| 6970 || 323 || 1.468 || 220 || 880 || 1536 || 2.3 || PCI-E 2.1 x16 || poclbm || -w 64, SDK 2.1 not supported on 69xx.&lt;br /&gt;
|- &lt;br /&gt;
| 6990 ||  ||  ||  ||  ||  || 2.3 ||  PCI-E 2.1 x16 || || SDK 2.1 not supported on 69xx.&lt;br /&gt;
|- &lt;br /&gt;
|FirePro V8700 || 84.8 ||  ||  || 750 || 800 ||  || || poclbm-mod.03.24.2011 || &lt;br /&gt;
|- &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Nvidia===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Model !! Mhash/s !! Mhash/W !! W !! Clock !! SP !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| 8200 mGPU || 1.2 || || || 1200 || 16 || 128 MB shared memory, &amp;quot;poclbm -w 128 -f 0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 8600M GT || 4.93 ||  ||  ||  || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 8600GT || 5.66 ||  ||  || 1188 ||  32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 8600GT OC || 7.3 ||  ||  || 1602 || 32 || [http://www.bitcoin.org/smf/index.php?topic=1334.0 poclbm] -w 128 [http://www.bitcoin.org/smf/index.php?topic=4967.msg72833#msg72833 source]&lt;br /&gt;
|-&lt;br /&gt;
| 8800GT || 25   || 0.24 || 105 || 1300 ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| 8800GT || 24.5 || 0.23 || 105 || 1300 ||  || [http://www.bitcoin.org/smf/index.php?topic=1628.msg37592#msg37592 source]&lt;br /&gt;
|-&lt;br /&gt;
| 8800GTS || 16.8 || 0.109 || 154 ||  ||  || [http://www.bitcoin.org/smf/index.php?topic=1628.msg25069#msg25069 source] [http://www.techspot.com/review/79-geforce-8800-gts-512/page11.html source]&lt;br /&gt;
|-&lt;br /&gt;
| 8800 GTS || 18.7 || 0.124 || 150 || 1200 ||  || poclbm -w 64 no vectors&lt;br /&gt;
|-&lt;br /&gt;
| 9300GE || 1.57 ||  ||  || 1300 ||  8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9300GS || 1.69 ||  ||  || 1400 ||  8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9400GT || 3.37 || 0.067 || 50 || 1400 || 16 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9500GT || 6.75 || 0.135 || 50 || 1400 || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9600GSO || 19.88 || 0.237 || 84 || 1375 || 96 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9600GSO512 || 11.75 || 0.131 || 90 || 1625 || 48 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9600GT || 15.66 || 0.165 || 95 || 1625 || 64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9600GT OC || 18.8 || &amp;lt;0.198 || &amp;gt;95 || 1981 || 64 || [http://www.bitcoin.org/smf/index.php?topic=1334.0 poclbm] -w 128 -f 10 [http://www.bitcoin.org/smf/index.php?topic=4967.msg74610#msg74610 source] [http://www.bitcoin.org/smf/index.php?topic=4967.msg73353#msg73353 source]&lt;br /&gt;
|-&lt;br /&gt;
| 9800GT || 30.36 || 0.289 || 105 || 1800 || 112 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9800GTX || 32.54 || 0.232 || 140 || 1688 || 128 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9800GTX+ || 35.39 || 0.251 || 141 || 1836 || 128 ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFEFEF&amp;quot;| 9800GX2 || 57.83 || 0.294 || 197 ||  || 2x128 ||&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFEFEF&amp;quot;| 9800GX2 || 28 || 0.142 || 197 ||  || 2x128 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg37620#msg37620 source]&lt;br /&gt;
|-&lt;br /&gt;
| G210 || 3.38 || 0.111 || 30.5 || 1402 || 16 ||&lt;br /&gt;
|-&lt;br /&gt;
| GT220 || 9.83 || 0.170 || 58 || 1360 || 48 ||&lt;br /&gt;
|-&lt;br /&gt;
| GT240 || 19.37 || 0.281 || 69 || 1340 || 96 ||&lt;br /&gt;
|-&lt;br /&gt;
| GT240 || 21.24 ||  ||  ||  || 96 || [http://www.bitcoin.org/smf/index.php?topic=4291.0 poclbm-mod] -f 0 -v [http://www.bitcoin.org/smf/index.php?topic=4967.msg73383#msg73383 source]&lt;br /&gt;
|-&lt;br /&gt;
| GTS250 || 35.39 || 0.244 || 145 || 1836 || 128 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX260 || 35.91 || 0.178 || 202 || 1242 || 192 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX260 || 44 || 0.242 || 182 || 1242 || 216 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source]&lt;br /&gt;
|-&lt;br /&gt;
| GTX260c216 || 40.40 || 0.236 || 171 || 1242 || 216 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX260c216 OC || 52.0 || || || 1461 || 216 || &amp;quot;poclbm -w 256 -f 1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| GTX275 || 50.75 || 0.232 || 219 || 1404 || 240 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX275 || 58 || || || 729/1458 || 240 || poclbm -f 0 -w 256&lt;br /&gt;
|-&lt;br /&gt;
| GTX280 || 46.84 || 0.198 || 236 || 1296 || 240 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX285 || 53.35 || 0.262 || 204 || 1476 || 240 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX295 || 89.78 || 0.311 || 289 || 1242 || 480 ||&lt;br /&gt;
|-&lt;br /&gt;
| GT 320M (MacBook Air) || 6.12 ||  ||  || 1212 || 48 ||&lt;br /&gt;
|-&lt;br /&gt;
| GT 330M (Sony Vaio Z) || 7.8 || 0.71 ( 0.3 total) || 11 (26w total) || 1045 || 48 ||&lt;br /&gt;
|-&lt;br /&gt;
| GT430 || 20.24 || 0.413 || 49 || 1400 || 96 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTS450 || 45.28 || 0.427 || 106 || 1566 || 192 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX460SE || 56.39 || 0.376 || 150 || 1300 || 288 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX460 || 68.31 || 0.427 || 160 || 1350 || 336 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX460 (2 cards) || 102 || 0.319? || 320? || 1350 ||  || [http://www.bitcoin.org/smf/index.php?topic=1628.msg26363#msg26363 source]&lt;br /&gt;
|-&lt;br /&gt;
| GTX460 (2 cards) OC || 127 || 0.374 || 340 || 1620 || 2x 336 || [http://www.bitcoin.org/smf/index.php?topic=2444.0 rpcminer-cuda] -gpugrid=128 -gputhreads=128 ver.20110227&lt;br /&gt;
|-&lt;br /&gt;
| GTX465 || 64.41 || 0.322 || 200 || 1215 || 352 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX470 || 81.98 || 0.381 || 215 || 1215 || 448 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX470 || 94.7 || || || 1414 || ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX480 || 101.28 || 0.405 || 250 || 1401 || 480 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX560 Ti || 67.7 || 0.39  || 170 || 1700 || 384 || standard EVGA 560, no overclock&lt;br /&gt;
|-&lt;br /&gt;
| GTX560 OC || 86.7 || &amp;lt;0.51 || &amp;gt;170 || 1800 || 384 || [http://www.bitcoin.org/smf/index.php?topic=2444.0 rpcminer-cuda] [http://www.bitcoin.org/smf/index.php?topic=4967.msg72816#msg72816 source]&lt;br /&gt;
|-&lt;br /&gt;
| GTX570 || 105.83 || 0.483 || 219 || 1464 || 480 ||&lt;br /&gt;
|-&lt;br /&gt;
| GTX580 || 119.06 || 0.488 || 244 || 1544 || 512 ||&lt;br /&gt;
|-&lt;br /&gt;
| Quadro FX 580 || 5.7 || 0.14 || 40 || 1125 || 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| Quadro FX 1600M || 6 || 0.12 || 50 || 625 || 32 ||rpcminer-cuda, Win&lt;br /&gt;
|-&lt;br /&gt;
| Quadro NVS 135M || 1.05 || 0.1 || 10 || 800 || 1 || &lt;br /&gt;
|-&lt;br /&gt;
| Quadro NVS 3100M || 3.6 || 0.257 || 14 || 600 || 16 || rpcminer-cuda, Win, CUDA 3.1.1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==CPUs==&lt;br /&gt;
&lt;br /&gt;
A lot of nice data can be pulled from [http://www.bitcoin.org/smf/index.php?topic=1628.0 this thread] to seed this section. Also from [https://www.bitcoin.org/wiki/doku.php?id=bitcoin_miners this page on the old wiki].&lt;br /&gt;
&lt;br /&gt;
===AMD===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Model !! nprocs !! Mhash/s !! Mhash/W !! ACP [W] !! Clock !! Version !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| 2x Opteron 6128 || 16 || 32.4 || 0.203 || 160W || 2 GHz || 0.3.19 || -4way&lt;br /&gt;
|-&lt;br /&gt;
| Athlon X2 3800+ || 2 || 1.73 || 0.03 || 65 W || 2.00 GHz || cpuminer (v0.8.1-1-g69529c3) || -algo=4way&lt;br /&gt;
|-&lt;br /&gt;
| Athlon X2 4000+ || 2 || 1.9 || 0.02 || 65W || 2.1 GHz || rpc-miner || &lt;br /&gt;
|-&lt;br /&gt;
| Athlon X2 4400+ ||   || 2.09 || 0.32 || 65W || 2.3GHz || 0.3.19/Win x64 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg37592#msg37592 source]&lt;br /&gt;
|-&lt;br /&gt;
| Athlon X2 6000+ || 2 || 2.81 || 0.02 || 125W || 3 GHz || || [http://www.bitcoin.org/smf/index.php?topic=1628.msg22881#msg22881 source]&lt;br /&gt;
|-&lt;br /&gt;
| Athlon X2 6400+ Black Edition || 2 || 2.9 || 0.023 || 125W || 3.2 GHz || 0.3.20.2 BETA/Win 7 x64 || -4way&lt;br /&gt;
|-&lt;br /&gt;
| Athlon XP 2000+ || 2 || 0.62 || 0.009 || 70W || 1.67 GHz || 0.3.18/Ubuntu || [http://www.bitcoin.org/smf/index.php?topic=1628.msg37592#msg37592 source] [http://www.pcstats.com/articleview.cfm?articleid=914&amp;amp;page=4 source]&lt;br /&gt;
|-&lt;br /&gt;
| Athlon II X2 240e || 2 || 2.71 || 0.06 || 45W || 2.81 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|-&lt;br /&gt;
| Athlon II X4 630 || 4 || 10.7 || 0.11 || 95W || 2.8 GHz || bitcoin-miner 0.4 || &lt;br /&gt;
|-&lt;br /&gt;
| Phenom II X6 1055T || 6 || 15.84 || 0.13 || 125W || 2.82 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|-&lt;br /&gt;
| Phenom II X6 1100T || 6 || 22 || 0.176 || 125W || 3.82 GHz || bitcoin-miner || Aciid#bitcoin-dev&lt;br /&gt;
|-&lt;br /&gt;
| Phenom II X3 720 || 3 || 3.8 || 0.04 || 95W || 2.8 GHz || 0.3.1x/WinXP || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source]&lt;br /&gt;
|-&lt;br /&gt;
| Phenom II X3 720 || 3 || 7.2 || 0.08 || 95W || 2.8 GHz || cpu-miner 0.2.1/WinXP || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source]&lt;br /&gt;
|-&lt;br /&gt;
| Phenom II x4 955 || 4 || 11 || 0.09 || 125W || 3.2 GHz || rpcminer-4way ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===ARM===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Model !! p/t !! Mhash/s !! Mhash/W !! ACP [W] !! Clock !! Version !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| Cortex A8 || 1 || 0.125 || || || 0.6 GHz || cpuminer git (2011-03-26) || Nokia N900: &#039;cryptopp&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cortex A8 || 1 || 0.2 || || || 0.6 GHz || cpuminer git (2011-03-26) || Nokia N900: &#039;c&#039; algo&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Intel===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Model !! p/t !! Mhash/s !! Mhash/W !! ACP [W] !! Clock !! Version !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| Pentium III mobile ? || 1 || 0.3 || 0.014 || 21W || 1.07 GHz || 0.3.1x/Win2K || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source] [http://ark.intel.com/Product.aspx?id=27380 source]&lt;br /&gt;
|-&lt;br /&gt;
| Old Xeon 512k (Dual) || 2x1/2 || 2.0 || ? || ? || 3.06GHz || cpuminer (v0.8.1-1-g69529c3) || HT disabled, algo=4way (twice as fast as the 2nd best algo)&lt;br /&gt;
|-&lt;br /&gt;
| Pentium 4 2.0A || 1 || 0.85 || || || 2.0 GHz || [http://www.bitcoin.org/smf/index.php?topic=3486.0 ufasoft-0.4]/WinXP || -g no -t 2&lt;br /&gt;
|-&lt;br /&gt;
| Pentium Dual-Core E5400 || 2/2 || 2.27 || 0.03 || 65W || 2.7 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|-&lt;br /&gt;
| Celeron E330 || 2/2 || 2.2  || 0.03 || 65W || 2.5 GHz || 0.3.19/Ubuntu10.04 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg37620#msg37620 source]&lt;br /&gt;
|-&lt;br /&gt;
| Core i3 M350 || 2/4 || 1.48 || 0.04 || 35W || 2.27 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|- &lt;br /&gt;
| Core i5 M450 || 2/4 || 1.8  || 0.05 || 35W || 1.2 GHz || 0.3.17/Win7-54 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg26292#msg26292 source]&lt;br /&gt;
|- &lt;br /&gt;
| Core i5-650  || 2/4 || 5.1 || 0.04 ? ||  || 3.2 GHz || cpuminer-0.7 || -4way&lt;br /&gt;
|-&lt;br /&gt;
| Core i5 ?  || 4/? || 6.5 ||  ||  ||  || client from svn || [http://www.bitcoin.org/smf/index.php?topic=1628.msg37621#msg37621 source]&lt;br /&gt;
|-&lt;br /&gt;
| Core i5-2400 || 4/4 || 4.5 || 0.05 || 95W || 3.1 GHz || cpuminer git (2011-01-22) || cryptopp_asm32&lt;br /&gt;
|-&lt;br /&gt;
| Core i5-2400 || 4/4 || 14 || 0.15 || 95W || 3.1 GHz || cpuminer git (2011-03-26) || sse2_64&lt;br /&gt;
|-&lt;br /&gt;
| Core i7 920   || 4/8 || 19.2 || 0.10 || 195 || 4.0 GHz (x21) || [http://www.bitcoin.org/smf/index.php?topic=3486.0 ufasoft] || -a 5&lt;br /&gt;
|-&lt;br /&gt;
| Core i7 950   || 4/8 || 5.88 || 0.039 || 150W || 3.83 GHz (x23) || bitcoin-0.3.20.2 Win7-64 ||&lt;br /&gt;
|-&lt;br /&gt;
| Core i7 950   || 4/8 || 18.9 || 0.126 || 150W || 3.83 GHz (x23) || [http://www.bitcoin.org/smf/index.php?topic=3486.0 ufasoft] v0.4 ||&lt;br /&gt;
|-&lt;br /&gt;
| Core i7 980x   || 6/12 || 19.2 || 0.15 || 130 || 4.4 GHz (x33) || cpuminer/Win7-64 || &lt;br /&gt;
|- &lt;br /&gt;
| Core i7 980x   || 6/12 || 8.7 ||  ||  || 3.9 GHz (x27) || 0.3.17/Win7-64 || &lt;br /&gt;
|- &lt;br /&gt;
| Core i7 620M   || 2/4 || 6.3 || 0.18 || 35 || 2.66 GHz || [http://www.bitcoin.org/smf/index.php?topic=3486.0 ufasoft] v0.4 || &lt;br /&gt;
|-&lt;br /&gt;
| Core 2 Duo E6550 || 1/2 || 2.45 || ? || ? || 2.33 GHz || cpuminer 0.7.1 (Linux) || --algo=sse2_64&lt;br /&gt;
|-&lt;br /&gt;
| Core 2 Duo E6850 || 2/2 || 6.75 || 0.10 || 65W || 3.0 Ghz || ufasoft-0.3 ||&lt;br /&gt;
|- &lt;br /&gt;
| Core 2 Duo E7300 || 2/2 || 7.76 || 0.11 || 70W || 3.33 GHz (o/c?) || ufasoft-0.3 || miner optimized for Intel Core&lt;br /&gt;
|-&lt;br /&gt;
| Core 2 Duo E7300 || 2/2 || 2.52 || 0.04 || 65W || 2.66 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|-&lt;br /&gt;
| Xeon X5355 (dual) || 2x4/4 || 10.13 || 0.16 || 120W || 2.66GHz || bitcoind || Roughly the same speed as the &amp;quot;c&amp;quot; algo in cpuminer&lt;br /&gt;
|-&lt;br /&gt;
| Xeon X5355 (dual) || 2x4/4 || 22.76 || 0.09 || 120W || 2.66GHz || cpuminer (v0.8.1-1-g69529c3) || -O2 -march=core2, algo=sse2_64&lt;br /&gt;
|-&lt;br /&gt;
| Xeon E5440 || 4/8 || 7.3 || ? || 80W || 2.66 GHz|| Kiv&#039;s poclbm-gui || FIXME: Either wrong model # or wrong threads/speed info&lt;br /&gt;
|-&lt;br /&gt;
| Xeon E5520 || 4/8 || 6.5 || 0.08 || 80W || 2.27 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|-&lt;br /&gt;
| Xeon E5530 || 4/8 || 7.14 || 0.09 || 80W || 2.4 GHz || bitcoind || [http://www.bitcoin.org/smf/index.php?topic=1628.msg19426#msg19426 source]&lt;br /&gt;
|-&lt;br /&gt;
| Xeon E5630 (dual) || 2x4/8 || 8 || 0.1 || 80W || 2.53 GHz || 0.3.17/Win7-64 || [http://www.bitcoin.org/smf/index.php?topic=1628.msg29471#msg29471 source]&lt;br /&gt;
|-&lt;br /&gt;
| Atom N270 || 1 || 0.42 || &#039;&#039;&#039;0.17&#039;&#039;&#039; || 2.5W || 1.6 GHz || 0.3.1x/WinXP || [http://www.bitcoin.org/smf/index.php?topic=1628.msg24699#msg24699 source]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
* [[Mining rig]]&lt;br /&gt;
* [[OpenCL miner]]&lt;br /&gt;
* [http://www.pcper.com/article.php?aid=745 ATI Stream vs. NVIDIA CUDA - GPGPU computing battle royale]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mining]]&lt;/div&gt;</summary>
		<author><name>Etotheipi</name></author>
	</entry>
</feed>