<?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=Grau</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=Grau"/>
	<link rel="alternate" type="text/html" href="https://en.bitcoin.it/wiki/Special:Contributions/Grau"/>
	<updated>2026-04-22T00:42:07Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0032&amp;diff=39104</id>
		<title>BIP 0032</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0032&amp;diff=39104"/>
		<updated>2013-07-05T17:26:34Z</updated>

		<summary type="html">&lt;p&gt;Grau: /* Implementations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{bip}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RECENT CHANGES:&lt;br /&gt;
* [16 Apr 2013] Added private derivation for i &amp;gt;= 0x80000000 (less risk of parent private key leakage)&lt;br /&gt;
* [30 Apr 2013] Switched from multiplication by I_L to addition of I_L (faster, easier implementation)&lt;br /&gt;
* [25 May 2013] Added test vectors&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  BIP: 32&lt;br /&gt;
  Title: Hierarchical Deterministic Wallets&lt;br /&gt;
  Author: Pieter Wuille&lt;br /&gt;
  Status: Accepted&lt;br /&gt;
  Type: Informational&lt;br /&gt;
  Created: 11-02-2012&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
This document describes [[Deterministic Wallet|hierarchical determinstic wallets]] (or &amp;quot;HD Wallets&amp;quot;): wallets which can be shared partially or entirely with different systems, each with or without the ability to spend coins.&lt;br /&gt;
&lt;br /&gt;
The specification is intended to set a standard for deterministic wallets that can be interchanged between different clients. Although the wallets described here have many features, not all are required by supporting clients.&lt;br /&gt;
&lt;br /&gt;
The specification consists of two parts. In a first part, a system for deriving a tree of keypairs from a single seed is presented. The second part demonstrates how to build a wallet structure on top of such a tree.&lt;br /&gt;
&lt;br /&gt;
==Motivation==&lt;br /&gt;
&lt;br /&gt;
The Bitcoin reference client uses randomly generated keys. In order to avoid the necessity for a backup after every transaction, (by default) 100 keys are cached in a pool of reserve keys. Still, these wallets are not intended to be shared and used on several systems simultaneously. They support hiding their private keys by using the wallet encrypt feature and not sharing the password, but such &amp;quot;neutered&amp;quot; wallets lose the power to generate public keys as well. &lt;br /&gt;
&lt;br /&gt;
Deterministic wallets do not require such frequent backups, and elliptic curve mathematics permit schemes where one can calculate the public keys without revealing the private keys. This permits for example a webshop business to let its webserver generate fresh addresses (public key hashes) for each order or for each customer, without giving the webserver access to the corresponding private keys (which are required for spending the received funds).&lt;br /&gt;
&lt;br /&gt;
However, deterministic wallets typically consist of a single &amp;quot;chain&amp;quot; of keypairs. The fact that there is only one chain means that sharing a wallet happens on an all-or-nothing basis. However, in some cases one only wants some (public) keys to be shared and recoverable. In the example of a webshop, the webserver does not need access to all public keys of the merchant&#039;s wallet; only to those addresses which are used to receive customer&#039;s payments, and not for example the change addresses that are generated when the merchant spends money. Hierarchical deterministic wallets allow such selective sharing by supporting multiple keypair chains, derived from a single root.&lt;br /&gt;
&lt;br /&gt;
==Specification: Key derivation==&lt;br /&gt;
&lt;br /&gt;
===Conventions===&lt;br /&gt;
&lt;br /&gt;
In the rest of this text we will assume the public key cryptography used in Bitcoin, namely elliptic curve cryptography using the field and curve parameters defined by secp256k1 (http://www.secg.org/index.php?action=secg,docs_secg). Variables below are either:&lt;br /&gt;
* integers modulo the order of the curve (referred to as n), serialized as 32 bytes, most significant byte first.&lt;br /&gt;
* coordinates of points on the curve, serialized as specified in SEC1 in compressed form: [0x02 or 0x03] + 32 byte x coordinate), where the header byte depends on the parity of the omitted y coordinate.&lt;br /&gt;
* byte sequences&lt;br /&gt;
&lt;br /&gt;
We shall denote the compressed form of point P by &amp;amp;chi;(P), which for secp256k1 will always be 33 bytes long.&lt;br /&gt;
&lt;br /&gt;
Addition (+) of two coordinates is defined as application of the EC group operation. Multiplication (*) of an integer and a coordinate is defined as repeated application of the EC group operation. The generator element of the curve is called G. The public key K corresponding to the private key k is calculated as k*G. We do not distinguish between numbers or coordinates and their serialization as byte sequences.&lt;br /&gt;
&lt;br /&gt;
===Extended keys===&lt;br /&gt;
&lt;br /&gt;
In what follows, we will define a function that derives a number of child keys from a parent key. In order to prevent these from depending solely on the key itself, we extend both private and public keys first with an extra 256 bits of entropy. This extension, called the chain code, is identical for corresponding private and public keys, and consists of 32 bytes.&lt;br /&gt;
&lt;br /&gt;
We represent an extended private key as (k, c), with k the normal private key, and c the chain code. An extended public key is represented as (K, c), with K = k*G and c the chain code.&lt;br /&gt;
&lt;br /&gt;
===Child key derivation functions===&lt;br /&gt;
&lt;br /&gt;
We allow for two different types of derivation: private and public.&lt;br /&gt;
* Private derivation: knowledge of the private key k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; and c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; is required to compute both k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; and K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* Public derivation: knowledge of the public key K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; and c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; suffices to compute K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; (but not k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
We define the private and public child key derivation functions:&lt;br /&gt;
* CKD((k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;), i) &amp;amp;rarr;  (k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), defined for both private and public derivation.&lt;br /&gt;
* CKD&#039;((K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;), i) &amp;amp;rarr; (K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), defined only for public derivation.&lt;br /&gt;
&lt;br /&gt;
We use the most significant bit of i to specify which type of derivation to use. i is encoded as a 32 bit unsigned integer, most significant byte first; &#039;||&#039; represents concatenation.&lt;br /&gt;
&lt;br /&gt;
====Private child key derivation====&lt;br /&gt;
&lt;br /&gt;
To define CKD((k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;), i) &amp;amp;rarr; (k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;):&lt;br /&gt;
* Check whether the highest bit (0x80000000) of i is set:&lt;br /&gt;
** If 1, private derivation is used: let I = HMAC-SHA512(Key = c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, Data = 0x00 || k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; || i) [Note: The 0x00 pads the private key to make it 33 bytes long.]&lt;br /&gt;
** If 0, public derivation is used: let I = HMAC-SHA512(Key = c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, Data = &amp;amp;chi;(k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;*G) || i)&lt;br /&gt;
* Split I = I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; || I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; into two 32-byte sequences, I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; and I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; + k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; (mod n).&lt;br /&gt;
* c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
In case I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; ≥ n or k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 0, the resulting key is invalid, and one should proceed with the next value for i.&lt;br /&gt;
[Note: this has probability lower than 1 in 2&amp;lt;sup&amp;gt;127&amp;lt;/sup&amp;gt;.]&lt;br /&gt;
&lt;br /&gt;
====Public child key derivation====&lt;br /&gt;
&lt;br /&gt;
To define CKD&#039;((K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;), i) &amp;amp;rarr; (K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;):&lt;br /&gt;
* Check whether the highest bit (0x80000000) of i is set:&lt;br /&gt;
** If 1, return error&lt;br /&gt;
** If 0, let I = HMAC-SHA512(Key = c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, Data = &amp;amp;chi;(K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;) || i)&lt;br /&gt;
* Split I = I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; || I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; into two 32-byte sequences, I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; and I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = (I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; + k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;)*G = I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;*G + K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;&lt;br /&gt;
* c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
In case I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; ≥ n or K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; is the point at infinity, the resulting key is invalid, and one should proceed with the next value for i.&lt;br /&gt;
&lt;br /&gt;
Note that the extended public key corresponding to the evaluation of CKD(k&amp;lt;sub&amp;gt;ext&amp;lt;/sub&amp;gt;, i) with public derivation (so with i &amp;lt; 0x80000000) is identical to the evaluation of CKD&#039;(K&amp;lt;sub&amp;gt;ext&amp;lt;/sub&amp;gt;, i), with K&amp;lt;sub&amp;gt;ext&amp;lt;/sub&amp;gt; the extended public key corresponding to k&amp;lt;sub&amp;gt;ext&amp;lt;/sub&amp;gt;. Symbolically, CKD((k, c), i)*G = CKD&#039;((k*G, c), i). This implies that CKD&#039; can be used to derive all public keys corresponding to the private keys that CKD would find. It cannot be used to retrieve the private keys, however.&lt;br /&gt;
&lt;br /&gt;
The HMAC-SHA512 function is specified in [http://tools.ietf.org/html/rfc4231 RFC 4231].&lt;br /&gt;
&lt;br /&gt;
===The key tree===&lt;br /&gt;
&lt;br /&gt;
The next step is cascading several CKD constructions to build a tree. We start with one root, the master extended key m. By evaluating CKD(m,i) for several values of i, we get a number of first-degree derivative nodes. As each of these is again an extended key, CKD can be applied to those as well. To shorten notation, we will write CKD(CKD(CKD(m,0x8000003),0x2),0x5) as m/3&#039;/2/5 now.&lt;br /&gt;
&lt;br /&gt;
Each leaf node in the tree corresponds to an actual keypair, while the internal nodes correspond to the collection of keypairs that descends from them. The chain codes of the leaf nodes are ignored, and only their embedded private or public key is used. Because of this construction, knowing an extended private key allows reconstruction of all descendant private keys and public keys, and knowing an extended public keys allows reconstruction of all descendant public keys derived using public derivation.&lt;br /&gt;
&lt;br /&gt;
===Key identifiers===&lt;br /&gt;
&lt;br /&gt;
Extended keys can be identified by the Hash160 (RIPEMD160 after SHA256) of the serialized public key, ignoring the chain code. This corresponds exactly to the data used in traditional Bitcoin addresses. It is not advised to represent this data in base58 format though, as it may be interpreted as an address that way (and wallet software is not required to accept payment to the chain key itself).&lt;br /&gt;
&lt;br /&gt;
The first 32 bits of the identifier are called the fingerprint.&lt;br /&gt;
&lt;br /&gt;
===Serialization format===&lt;br /&gt;
&lt;br /&gt;
Extended public and private keys are serialized as follows:&lt;br /&gt;
* 4 byte: version bytes (mainnet: 0x0488B21E public, 0x0488ADE4 private; testnet: 0x043587CF public, 0x04358394 private)&lt;br /&gt;
* 1 byte: depth: 0x00 for master nodes, 0x01 for level-1 descendants, .... &lt;br /&gt;
* 4 bytes: the fingerprint of the parent&#039;s key (0x00000000 if master key)&lt;br /&gt;
* 4 bytes: child number. This is the number i in x&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;/i, with x&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; the key being serialized. This is encoded in MSB order. (0x00000000 if master key)&lt;br /&gt;
* 32 bytes: the chain code&lt;br /&gt;
* 33 bytes: the public key or private key data (0x02 + X or 0x03 + X for public keys, 0x00 + k for private keys)&lt;br /&gt;
&lt;br /&gt;
This 78 byte structure can be encoded like other Bitcoin data in Base58, by first adding 32 checksum bits (derived from the double SHA-256 checksum), and then converting to the Base58 representation. This results in a Base58-encoded string of up to 112 characters. Because of the choice of the version bytes, the Base58 representation will start with &amp;quot;xprv&amp;quot; or &amp;quot;xpub&amp;quot; on mainnet, &amp;quot;tprv&amp;quot; or &amp;quot;tpub&amp;quot; on testnet.&lt;br /&gt;
&lt;br /&gt;
Note that the fingerprint of the parent only serves as a fast way to detect parent and child nodes in software, and software must be willing to deal with collisions. Internally, the full 160-bit identifier could be used.&lt;br /&gt;
&lt;br /&gt;
When importing a serialized extended public key, implementations must verify whether the X coordinate in the public key data corresponds to a point on the curve. If not, the extended public key is invalid.&lt;br /&gt;
&lt;br /&gt;
===Master key generation===&lt;br /&gt;
&lt;br /&gt;
The total number of possible extended keypairs is almost 2^512, but the produced keys are only 256 bits long, and offer about half of that in terms of security. Therefore, master keys are not generated directly, but instead from a potentially short seed value.&lt;br /&gt;
&lt;br /&gt;
* Generate a seed S of a chosen length (at least 128 bits, but 256 is advised) from a (P)RNG.&lt;br /&gt;
* Calculate I = HMAC-SHA512(key=&amp;quot;Bitcoin seed&amp;quot;, msg=S)&lt;br /&gt;
* Split I into two 32-byte sequences, I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; and I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* Use I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; as master secret key, and I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; as master chain code.&lt;br /&gt;
In case I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; is 0 or &amp;gt;=n, the master key is invalid.&lt;br /&gt;
&lt;br /&gt;
[[File:BIP32-derivation.png]]&lt;br /&gt;
&lt;br /&gt;
==Specification: Wallet structure==&lt;br /&gt;
&lt;br /&gt;
The previous sections specified key trees and their nodes. The next step is imposing a wallet structure on this tree. The layout defined in this section is a default only, though clients are encouraged to mimick it for compatibility, even if not all features are supported.&lt;br /&gt;
&lt;br /&gt;
An HDW is organized as several &#039;accounts&#039;. Accounts are numbered, the default account (&amp;quot;&amp;quot;) being number 0. Clients are not required to support more than one account - if not, they only use the default account.&lt;br /&gt;
&lt;br /&gt;
Each account is composed of two keypair chains: an internal and an external one. The external keychain is used to generate new public addresses, while the internal keychain is used for all other operations (change addresses, generation addresses, ..., anything that doesn&#039;t need to be communicated). Clients that do not support separate keychains for these should use the external one for everything.&lt;br /&gt;
&lt;br /&gt;
 * m/i&#039;/0/k corresponds to the k&#039;th keypair of the external chain of account number i of the HDW derived from master m.&lt;br /&gt;
 * m/i&#039;/1/k corresponds to the k&#039;th keypair of the internal chain of account number i of the HDW derived from master m.&lt;br /&gt;
&lt;br /&gt;
===Use cases===&lt;br /&gt;
&lt;br /&gt;
====Full wallet sharing: m====&lt;br /&gt;
&lt;br /&gt;
In cases where two systems need to access a single shared wallet, and both need to be able to perform spendings, one needs to share the master private extended key. Nodes can keep a pool of N look-ahead keys cached for external chains, to watch for incoming payments. The look-ahead for internal chains can be very small, as no gaps are to be expected here. An extra look-ahead could be active for the first unused account&#039;s chains - triggering the creation of a new account when used. Note that the name of the account will still need to be entered manually and cannot be synchronized via the block chain.&lt;br /&gt;
&lt;br /&gt;
====Audits: M====&lt;br /&gt;
&lt;br /&gt;
In case an auditor needs full access to the list of incoming and outgoing payments, one can share the master public extended key. This will allow the auditor to see all transactions from and to the wallet, in all accounts, but not a single secret key.&lt;br /&gt;
&lt;br /&gt;
====Per-office balances: m/i&#039;====&lt;br /&gt;
&lt;br /&gt;
When a business has several independent offices, they can all use wallets derived from a single master. This will allow the headquarters to maintain a super-wallet that sees all incoming and outgoing transactions of all offices, and even permit moving money between the offices.&lt;br /&gt;
&lt;br /&gt;
====Recurrent business-to-business transactions: M/i&#039;/0====&lt;br /&gt;
&lt;br /&gt;
In case two business partners often transfer money, one can use the extended public key for the external chain of a specific account (M/i&#039;/0) as a sort of &amp;quot;super address&amp;quot;, allowing frequent transactions that cannot (easily) be associated, but without needing to request a new address for each payment.&lt;br /&gt;
Such a mechanism could also be used by mining pool operators as variable payout address.&lt;br /&gt;
&lt;br /&gt;
====Unsecure money receiver: M/i&#039;/0====&lt;br /&gt;
&lt;br /&gt;
When an unsecure webserver is used to run an e-commerce site, it needs to know public addresses that be used to receive payments. The webserver only needs to know the public extended key of the external chain of a single account. This means someone illegally obtaining access to the webserver can at most see all incoming payments, but will not (trivially) be able to distinguish outgoing transactions, nor see payments received by other webservers if there are several ones.&lt;br /&gt;
&lt;br /&gt;
==Compatibility==&lt;br /&gt;
&lt;br /&gt;
To comply with this standard, a client must at least be able to import an extended public or private key, to give access to its direct descendants as wallet keys. The wallet structure (master/account/chain/subchain) presented in the second part of the specification is advisory only, but is suggested as a minimal structure for easy compatibility - even when no separate accounts or distinction between internal and external chains is made. However, implementations may deviate from it for specific needs; more complex applications may call for a more complex tree structure.&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
In addition to the expectations from the EC public-key cryptography itself:&lt;br /&gt;
* Given a public key K, an attacker cannot find the corresponding private key more efficiently than by solving the EC discrete logarithm problem (assumed to require 2&amp;lt;sup&amp;gt;128&amp;lt;/sup&amp;gt; group operations).&lt;br /&gt;
the intended security properties of this standard are:&lt;br /&gt;
* Given a child extended private key (k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) and the integer i, an attacker cannot find the parent private key k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; more efficiently than a 2&amp;lt;sup&amp;gt;256&amp;lt;/sup&amp;gt; brute force of HMAC-SHA512.&lt;br /&gt;
* Given any number (2 &amp;lt;= N &amp;lt;= 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt;-1) of (index, extended private key) tuples (i&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,(p&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;)), with distinct i&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;&#039;s, determining whether they are derived from a common parent extended private key (i.e., whether there exists a (p&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;) such that for each j in [0..N-1] CKD((p&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;),i&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;)=(p&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;)), cannot be done more efficiently than a 2&amp;lt;sup&amp;gt;256&amp;lt;/sup&amp;gt; brute force of HMAC-SHA512.&lt;br /&gt;
Note however that the following properties does not exist:&lt;br /&gt;
* Given a parent extended public key (K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;) and a child public key (K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), it is hard to find i.&lt;br /&gt;
* Given a parent extended public key (K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;) and a child private key (k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) using public derivation, it is hard to find k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Private and public keys must be kept safe as usual. Leaking a private key means access to coins - leaking a public key can mean loss of privacy.&lt;br /&gt;
&lt;br /&gt;
Somewhat more care must be taken regarding extended keys, as these correspond to an entire (sub)tree of keys. One weakness that may not be immediately obvious, is that knowledge of the extended public key + a private key descending from it is equivalent to knowing the extended private key (i.e., every private and public key) in case public derivation is used. This means that extended public keys must be treated more carefully than regular public keys. This is the reason why accounts at the first level of the default wallet layout use private derivation, so a leak of account-specific (or below) private key never risks compromising the master.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Test Vectors==&lt;br /&gt;
&lt;br /&gt;
For more detailed information about these (such as intermediate values and other representations), see [[BIP_0032_TestVectors]]&lt;br /&gt;
&lt;br /&gt;
Test vector 1&lt;br /&gt;
&lt;br /&gt;
  Master (hex): 000102030405060708090a0b0c0d0e0f&lt;br /&gt;
  * [Chain m]&lt;br /&gt;
    * ext pub: xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8&lt;br /&gt;
    * ext prv: xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi&lt;br /&gt;
  * [Chain m/0&#039;]&lt;br /&gt;
    * ext pub: xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw&lt;br /&gt;
    * ext prv: xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7&lt;br /&gt;
  * [Chain m/0&#039;/1]&lt;br /&gt;
    * ext pub: xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ&lt;br /&gt;
    * ext prv: xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs&lt;br /&gt;
  * [Chain m/0&#039;/1/2&#039;]&lt;br /&gt;
    * ext pub: xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5&lt;br /&gt;
    * ext prv: xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM&lt;br /&gt;
  * [Chain m/0&#039;/1/2&#039;/2]&lt;br /&gt;
    * ext pub: xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV&lt;br /&gt;
    * ext prv: xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334&lt;br /&gt;
  * [Chain m/0&#039;/1/2&#039;/2/1000000000]&lt;br /&gt;
    * ext pub: xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy&lt;br /&gt;
    * ext prv: xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76&lt;br /&gt;
&lt;br /&gt;
Test vector 2&lt;br /&gt;
&lt;br /&gt;
  Master (hex): fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542&lt;br /&gt;
  * [Chain m]&lt;br /&gt;
    * ext pub: xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB&lt;br /&gt;
    * ext prv: xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U&lt;br /&gt;
  * [Chain m/0]&lt;br /&gt;
    * ext pub: xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH&lt;br /&gt;
    * ext prv: xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt&lt;br /&gt;
  * [Chain m/0/2147483647&#039;]&lt;br /&gt;
    * ext pub: xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a&lt;br /&gt;
    * ext prv: xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9&lt;br /&gt;
  * [Chain m/0/2147483647&#039;/1]&lt;br /&gt;
    * ext pub: xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon&lt;br /&gt;
    * ext prv: xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef&lt;br /&gt;
  * [Chain m/0/2147483647&#039;/1/2147483646&#039;]&lt;br /&gt;
    * ext pub: xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL&lt;br /&gt;
    * ext prv: xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc&lt;br /&gt;
  * [Chain m/0/2147483647&#039;/1/2147483646&#039;/2]&lt;br /&gt;
    * ext pub: xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt&lt;br /&gt;
    * ext prv: xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j&lt;br /&gt;
&lt;br /&gt;
==Implementations==&lt;br /&gt;
&lt;br /&gt;
A Python implementation is available at https://github.com/richardkiss/pycoin&lt;br /&gt;
&lt;br /&gt;
A Java implementation is available at https://github.com/bitsofproof/supernode/blob/1.1/api/src/main/java/com/bitsofproof/supernode/api/ExtendedKey.java&lt;br /&gt;
&lt;br /&gt;
==Acknowledgements==&lt;br /&gt;
&lt;br /&gt;
* Gregory Maxwell for the original idea of type-2 deterministic wallets, and many discussions about it.&lt;br /&gt;
* Alan Reiner for the implementation of this scheme in Armory, and the suggestions that followed from that.&lt;br /&gt;
* Mike Caldwell for the version bytes to obtain human-recognizable Base58 strings.&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0032&amp;diff=39103</id>
		<title>BIP 0032</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0032&amp;diff=39103"/>
		<updated>2013-07-05T17:26:10Z</updated>

		<summary type="html">&lt;p&gt;Grau: /* Implementations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{bip}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RECENT CHANGES:&lt;br /&gt;
* [16 Apr 2013] Added private derivation for i &amp;gt;= 0x80000000 (less risk of parent private key leakage)&lt;br /&gt;
* [30 Apr 2013] Switched from multiplication by I_L to addition of I_L (faster, easier implementation)&lt;br /&gt;
* [25 May 2013] Added test vectors&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  BIP: 32&lt;br /&gt;
  Title: Hierarchical Deterministic Wallets&lt;br /&gt;
  Author: Pieter Wuille&lt;br /&gt;
  Status: Accepted&lt;br /&gt;
  Type: Informational&lt;br /&gt;
  Created: 11-02-2012&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
This document describes [[Deterministic Wallet|hierarchical determinstic wallets]] (or &amp;quot;HD Wallets&amp;quot;): wallets which can be shared partially or entirely with different systems, each with or without the ability to spend coins.&lt;br /&gt;
&lt;br /&gt;
The specification is intended to set a standard for deterministic wallets that can be interchanged between different clients. Although the wallets described here have many features, not all are required by supporting clients.&lt;br /&gt;
&lt;br /&gt;
The specification consists of two parts. In a first part, a system for deriving a tree of keypairs from a single seed is presented. The second part demonstrates how to build a wallet structure on top of such a tree.&lt;br /&gt;
&lt;br /&gt;
==Motivation==&lt;br /&gt;
&lt;br /&gt;
The Bitcoin reference client uses randomly generated keys. In order to avoid the necessity for a backup after every transaction, (by default) 100 keys are cached in a pool of reserve keys. Still, these wallets are not intended to be shared and used on several systems simultaneously. They support hiding their private keys by using the wallet encrypt feature and not sharing the password, but such &amp;quot;neutered&amp;quot; wallets lose the power to generate public keys as well. &lt;br /&gt;
&lt;br /&gt;
Deterministic wallets do not require such frequent backups, and elliptic curve mathematics permit schemes where one can calculate the public keys without revealing the private keys. This permits for example a webshop business to let its webserver generate fresh addresses (public key hashes) for each order or for each customer, without giving the webserver access to the corresponding private keys (which are required for spending the received funds).&lt;br /&gt;
&lt;br /&gt;
However, deterministic wallets typically consist of a single &amp;quot;chain&amp;quot; of keypairs. The fact that there is only one chain means that sharing a wallet happens on an all-or-nothing basis. However, in some cases one only wants some (public) keys to be shared and recoverable. In the example of a webshop, the webserver does not need access to all public keys of the merchant&#039;s wallet; only to those addresses which are used to receive customer&#039;s payments, and not for example the change addresses that are generated when the merchant spends money. Hierarchical deterministic wallets allow such selective sharing by supporting multiple keypair chains, derived from a single root.&lt;br /&gt;
&lt;br /&gt;
==Specification: Key derivation==&lt;br /&gt;
&lt;br /&gt;
===Conventions===&lt;br /&gt;
&lt;br /&gt;
In the rest of this text we will assume the public key cryptography used in Bitcoin, namely elliptic curve cryptography using the field and curve parameters defined by secp256k1 (http://www.secg.org/index.php?action=secg,docs_secg). Variables below are either:&lt;br /&gt;
* integers modulo the order of the curve (referred to as n), serialized as 32 bytes, most significant byte first.&lt;br /&gt;
* coordinates of points on the curve, serialized as specified in SEC1 in compressed form: [0x02 or 0x03] + 32 byte x coordinate), where the header byte depends on the parity of the omitted y coordinate.&lt;br /&gt;
* byte sequences&lt;br /&gt;
&lt;br /&gt;
We shall denote the compressed form of point P by &amp;amp;chi;(P), which for secp256k1 will always be 33 bytes long.&lt;br /&gt;
&lt;br /&gt;
Addition (+) of two coordinates is defined as application of the EC group operation. Multiplication (*) of an integer and a coordinate is defined as repeated application of the EC group operation. The generator element of the curve is called G. The public key K corresponding to the private key k is calculated as k*G. We do not distinguish between numbers or coordinates and their serialization as byte sequences.&lt;br /&gt;
&lt;br /&gt;
===Extended keys===&lt;br /&gt;
&lt;br /&gt;
In what follows, we will define a function that derives a number of child keys from a parent key. In order to prevent these from depending solely on the key itself, we extend both private and public keys first with an extra 256 bits of entropy. This extension, called the chain code, is identical for corresponding private and public keys, and consists of 32 bytes.&lt;br /&gt;
&lt;br /&gt;
We represent an extended private key as (k, c), with k the normal private key, and c the chain code. An extended public key is represented as (K, c), with K = k*G and c the chain code.&lt;br /&gt;
&lt;br /&gt;
===Child key derivation functions===&lt;br /&gt;
&lt;br /&gt;
We allow for two different types of derivation: private and public.&lt;br /&gt;
* Private derivation: knowledge of the private key k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; and c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; is required to compute both k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; and K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* Public derivation: knowledge of the public key K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; and c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; suffices to compute K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; (but not k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
We define the private and public child key derivation functions:&lt;br /&gt;
* CKD((k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;), i) &amp;amp;rarr;  (k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), defined for both private and public derivation.&lt;br /&gt;
* CKD&#039;((K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;), i) &amp;amp;rarr; (K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), defined only for public derivation.&lt;br /&gt;
&lt;br /&gt;
We use the most significant bit of i to specify which type of derivation to use. i is encoded as a 32 bit unsigned integer, most significant byte first; &#039;||&#039; represents concatenation.&lt;br /&gt;
&lt;br /&gt;
====Private child key derivation====&lt;br /&gt;
&lt;br /&gt;
To define CKD((k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;), i) &amp;amp;rarr; (k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;):&lt;br /&gt;
* Check whether the highest bit (0x80000000) of i is set:&lt;br /&gt;
** If 1, private derivation is used: let I = HMAC-SHA512(Key = c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, Data = 0x00 || k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; || i) [Note: The 0x00 pads the private key to make it 33 bytes long.]&lt;br /&gt;
** If 0, public derivation is used: let I = HMAC-SHA512(Key = c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, Data = &amp;amp;chi;(k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;*G) || i)&lt;br /&gt;
* Split I = I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; || I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; into two 32-byte sequences, I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; and I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; + k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; (mod n).&lt;br /&gt;
* c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
In case I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; ≥ n or k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 0, the resulting key is invalid, and one should proceed with the next value for i.&lt;br /&gt;
[Note: this has probability lower than 1 in 2&amp;lt;sup&amp;gt;127&amp;lt;/sup&amp;gt;.]&lt;br /&gt;
&lt;br /&gt;
====Public child key derivation====&lt;br /&gt;
&lt;br /&gt;
To define CKD&#039;((K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;), i) &amp;amp;rarr; (K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;):&lt;br /&gt;
* Check whether the highest bit (0x80000000) of i is set:&lt;br /&gt;
** If 1, return error&lt;br /&gt;
** If 0, let I = HMAC-SHA512(Key = c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, Data = &amp;amp;chi;(K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;) || i)&lt;br /&gt;
* Split I = I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; || I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; into two 32-byte sequences, I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; and I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = (I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; + k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;)*G = I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;*G + K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;&lt;br /&gt;
* c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
In case I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; ≥ n or K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; is the point at infinity, the resulting key is invalid, and one should proceed with the next value for i.&lt;br /&gt;
&lt;br /&gt;
Note that the extended public key corresponding to the evaluation of CKD(k&amp;lt;sub&amp;gt;ext&amp;lt;/sub&amp;gt;, i) with public derivation (so with i &amp;lt; 0x80000000) is identical to the evaluation of CKD&#039;(K&amp;lt;sub&amp;gt;ext&amp;lt;/sub&amp;gt;, i), with K&amp;lt;sub&amp;gt;ext&amp;lt;/sub&amp;gt; the extended public key corresponding to k&amp;lt;sub&amp;gt;ext&amp;lt;/sub&amp;gt;. Symbolically, CKD((k, c), i)*G = CKD&#039;((k*G, c), i). This implies that CKD&#039; can be used to derive all public keys corresponding to the private keys that CKD would find. It cannot be used to retrieve the private keys, however.&lt;br /&gt;
&lt;br /&gt;
The HMAC-SHA512 function is specified in [http://tools.ietf.org/html/rfc4231 RFC 4231].&lt;br /&gt;
&lt;br /&gt;
===The key tree===&lt;br /&gt;
&lt;br /&gt;
The next step is cascading several CKD constructions to build a tree. We start with one root, the master extended key m. By evaluating CKD(m,i) for several values of i, we get a number of first-degree derivative nodes. As each of these is again an extended key, CKD can be applied to those as well. To shorten notation, we will write CKD(CKD(CKD(m,0x8000003),0x2),0x5) as m/3&#039;/2/5 now.&lt;br /&gt;
&lt;br /&gt;
Each leaf node in the tree corresponds to an actual keypair, while the internal nodes correspond to the collection of keypairs that descends from them. The chain codes of the leaf nodes are ignored, and only their embedded private or public key is used. Because of this construction, knowing an extended private key allows reconstruction of all descendant private keys and public keys, and knowing an extended public keys allows reconstruction of all descendant public keys derived using public derivation.&lt;br /&gt;
&lt;br /&gt;
===Key identifiers===&lt;br /&gt;
&lt;br /&gt;
Extended keys can be identified by the Hash160 (RIPEMD160 after SHA256) of the serialized public key, ignoring the chain code. This corresponds exactly to the data used in traditional Bitcoin addresses. It is not advised to represent this data in base58 format though, as it may be interpreted as an address that way (and wallet software is not required to accept payment to the chain key itself).&lt;br /&gt;
&lt;br /&gt;
The first 32 bits of the identifier are called the fingerprint.&lt;br /&gt;
&lt;br /&gt;
===Serialization format===&lt;br /&gt;
&lt;br /&gt;
Extended public and private keys are serialized as follows:&lt;br /&gt;
* 4 byte: version bytes (mainnet: 0x0488B21E public, 0x0488ADE4 private; testnet: 0x043587CF public, 0x04358394 private)&lt;br /&gt;
* 1 byte: depth: 0x00 for master nodes, 0x01 for level-1 descendants, .... &lt;br /&gt;
* 4 bytes: the fingerprint of the parent&#039;s key (0x00000000 if master key)&lt;br /&gt;
* 4 bytes: child number. This is the number i in x&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;/i, with x&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; the key being serialized. This is encoded in MSB order. (0x00000000 if master key)&lt;br /&gt;
* 32 bytes: the chain code&lt;br /&gt;
* 33 bytes: the public key or private key data (0x02 + X or 0x03 + X for public keys, 0x00 + k for private keys)&lt;br /&gt;
&lt;br /&gt;
This 78 byte structure can be encoded like other Bitcoin data in Base58, by first adding 32 checksum bits (derived from the double SHA-256 checksum), and then converting to the Base58 representation. This results in a Base58-encoded string of up to 112 characters. Because of the choice of the version bytes, the Base58 representation will start with &amp;quot;xprv&amp;quot; or &amp;quot;xpub&amp;quot; on mainnet, &amp;quot;tprv&amp;quot; or &amp;quot;tpub&amp;quot; on testnet.&lt;br /&gt;
&lt;br /&gt;
Note that the fingerprint of the parent only serves as a fast way to detect parent and child nodes in software, and software must be willing to deal with collisions. Internally, the full 160-bit identifier could be used.&lt;br /&gt;
&lt;br /&gt;
When importing a serialized extended public key, implementations must verify whether the X coordinate in the public key data corresponds to a point on the curve. If not, the extended public key is invalid.&lt;br /&gt;
&lt;br /&gt;
===Master key generation===&lt;br /&gt;
&lt;br /&gt;
The total number of possible extended keypairs is almost 2^512, but the produced keys are only 256 bits long, and offer about half of that in terms of security. Therefore, master keys are not generated directly, but instead from a potentially short seed value.&lt;br /&gt;
&lt;br /&gt;
* Generate a seed S of a chosen length (at least 128 bits, but 256 is advised) from a (P)RNG.&lt;br /&gt;
* Calculate I = HMAC-SHA512(key=&amp;quot;Bitcoin seed&amp;quot;, msg=S)&lt;br /&gt;
* Split I into two 32-byte sequences, I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; and I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* Use I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; as master secret key, and I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; as master chain code.&lt;br /&gt;
In case I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; is 0 or &amp;gt;=n, the master key is invalid.&lt;br /&gt;
&lt;br /&gt;
[[File:BIP32-derivation.png]]&lt;br /&gt;
&lt;br /&gt;
==Specification: Wallet structure==&lt;br /&gt;
&lt;br /&gt;
The previous sections specified key trees and their nodes. The next step is imposing a wallet structure on this tree. The layout defined in this section is a default only, though clients are encouraged to mimick it for compatibility, even if not all features are supported.&lt;br /&gt;
&lt;br /&gt;
An HDW is organized as several &#039;accounts&#039;. Accounts are numbered, the default account (&amp;quot;&amp;quot;) being number 0. Clients are not required to support more than one account - if not, they only use the default account.&lt;br /&gt;
&lt;br /&gt;
Each account is composed of two keypair chains: an internal and an external one. The external keychain is used to generate new public addresses, while the internal keychain is used for all other operations (change addresses, generation addresses, ..., anything that doesn&#039;t need to be communicated). Clients that do not support separate keychains for these should use the external one for everything.&lt;br /&gt;
&lt;br /&gt;
 * m/i&#039;/0/k corresponds to the k&#039;th keypair of the external chain of account number i of the HDW derived from master m.&lt;br /&gt;
 * m/i&#039;/1/k corresponds to the k&#039;th keypair of the internal chain of account number i of the HDW derived from master m.&lt;br /&gt;
&lt;br /&gt;
===Use cases===&lt;br /&gt;
&lt;br /&gt;
====Full wallet sharing: m====&lt;br /&gt;
&lt;br /&gt;
In cases where two systems need to access a single shared wallet, and both need to be able to perform spendings, one needs to share the master private extended key. Nodes can keep a pool of N look-ahead keys cached for external chains, to watch for incoming payments. The look-ahead for internal chains can be very small, as no gaps are to be expected here. An extra look-ahead could be active for the first unused account&#039;s chains - triggering the creation of a new account when used. Note that the name of the account will still need to be entered manually and cannot be synchronized via the block chain.&lt;br /&gt;
&lt;br /&gt;
====Audits: M====&lt;br /&gt;
&lt;br /&gt;
In case an auditor needs full access to the list of incoming and outgoing payments, one can share the master public extended key. This will allow the auditor to see all transactions from and to the wallet, in all accounts, but not a single secret key.&lt;br /&gt;
&lt;br /&gt;
====Per-office balances: m/i&#039;====&lt;br /&gt;
&lt;br /&gt;
When a business has several independent offices, they can all use wallets derived from a single master. This will allow the headquarters to maintain a super-wallet that sees all incoming and outgoing transactions of all offices, and even permit moving money between the offices.&lt;br /&gt;
&lt;br /&gt;
====Recurrent business-to-business transactions: M/i&#039;/0====&lt;br /&gt;
&lt;br /&gt;
In case two business partners often transfer money, one can use the extended public key for the external chain of a specific account (M/i&#039;/0) as a sort of &amp;quot;super address&amp;quot;, allowing frequent transactions that cannot (easily) be associated, but without needing to request a new address for each payment.&lt;br /&gt;
Such a mechanism could also be used by mining pool operators as variable payout address.&lt;br /&gt;
&lt;br /&gt;
====Unsecure money receiver: M/i&#039;/0====&lt;br /&gt;
&lt;br /&gt;
When an unsecure webserver is used to run an e-commerce site, it needs to know public addresses that be used to receive payments. The webserver only needs to know the public extended key of the external chain of a single account. This means someone illegally obtaining access to the webserver can at most see all incoming payments, but will not (trivially) be able to distinguish outgoing transactions, nor see payments received by other webservers if there are several ones.&lt;br /&gt;
&lt;br /&gt;
==Compatibility==&lt;br /&gt;
&lt;br /&gt;
To comply with this standard, a client must at least be able to import an extended public or private key, to give access to its direct descendants as wallet keys. The wallet structure (master/account/chain/subchain) presented in the second part of the specification is advisory only, but is suggested as a minimal structure for easy compatibility - even when no separate accounts or distinction between internal and external chains is made. However, implementations may deviate from it for specific needs; more complex applications may call for a more complex tree structure.&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
In addition to the expectations from the EC public-key cryptography itself:&lt;br /&gt;
* Given a public key K, an attacker cannot find the corresponding private key more efficiently than by solving the EC discrete logarithm problem (assumed to require 2&amp;lt;sup&amp;gt;128&amp;lt;/sup&amp;gt; group operations).&lt;br /&gt;
the intended security properties of this standard are:&lt;br /&gt;
* Given a child extended private key (k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) and the integer i, an attacker cannot find the parent private key k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; more efficiently than a 2&amp;lt;sup&amp;gt;256&amp;lt;/sup&amp;gt; brute force of HMAC-SHA512.&lt;br /&gt;
* Given any number (2 &amp;lt;= N &amp;lt;= 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt;-1) of (index, extended private key) tuples (i&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,(p&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;)), with distinct i&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;&#039;s, determining whether they are derived from a common parent extended private key (i.e., whether there exists a (p&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;) such that for each j in [0..N-1] CKD((p&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;),i&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;)=(p&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;)), cannot be done more efficiently than a 2&amp;lt;sup&amp;gt;256&amp;lt;/sup&amp;gt; brute force of HMAC-SHA512.&lt;br /&gt;
Note however that the following properties does not exist:&lt;br /&gt;
* Given a parent extended public key (K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;) and a child public key (K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), it is hard to find i.&lt;br /&gt;
* Given a parent extended public key (K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;) and a child private key (k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) using public derivation, it is hard to find k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Private and public keys must be kept safe as usual. Leaking a private key means access to coins - leaking a public key can mean loss of privacy.&lt;br /&gt;
&lt;br /&gt;
Somewhat more care must be taken regarding extended keys, as these correspond to an entire (sub)tree of keys. One weakness that may not be immediately obvious, is that knowledge of the extended public key + a private key descending from it is equivalent to knowing the extended private key (i.e., every private and public key) in case public derivation is used. This means that extended public keys must be treated more carefully than regular public keys. This is the reason why accounts at the first level of the default wallet layout use private derivation, so a leak of account-specific (or below) private key never risks compromising the master.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Test Vectors==&lt;br /&gt;
&lt;br /&gt;
For more detailed information about these (such as intermediate values and other representations), see [[BIP_0032_TestVectors]]&lt;br /&gt;
&lt;br /&gt;
Test vector 1&lt;br /&gt;
&lt;br /&gt;
  Master (hex): 000102030405060708090a0b0c0d0e0f&lt;br /&gt;
  * [Chain m]&lt;br /&gt;
    * ext pub: xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8&lt;br /&gt;
    * ext prv: xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi&lt;br /&gt;
  * [Chain m/0&#039;]&lt;br /&gt;
    * ext pub: xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw&lt;br /&gt;
    * ext prv: xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7&lt;br /&gt;
  * [Chain m/0&#039;/1]&lt;br /&gt;
    * ext pub: xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ&lt;br /&gt;
    * ext prv: xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs&lt;br /&gt;
  * [Chain m/0&#039;/1/2&#039;]&lt;br /&gt;
    * ext pub: xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5&lt;br /&gt;
    * ext prv: xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM&lt;br /&gt;
  * [Chain m/0&#039;/1/2&#039;/2]&lt;br /&gt;
    * ext pub: xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV&lt;br /&gt;
    * ext prv: xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334&lt;br /&gt;
  * [Chain m/0&#039;/1/2&#039;/2/1000000000]&lt;br /&gt;
    * ext pub: xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy&lt;br /&gt;
    * ext prv: xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76&lt;br /&gt;
&lt;br /&gt;
Test vector 2&lt;br /&gt;
&lt;br /&gt;
  Master (hex): fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542&lt;br /&gt;
  * [Chain m]&lt;br /&gt;
    * ext pub: xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB&lt;br /&gt;
    * ext prv: xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U&lt;br /&gt;
  * [Chain m/0]&lt;br /&gt;
    * ext pub: xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH&lt;br /&gt;
    * ext prv: xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt&lt;br /&gt;
  * [Chain m/0/2147483647&#039;]&lt;br /&gt;
    * ext pub: xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a&lt;br /&gt;
    * ext prv: xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9&lt;br /&gt;
  * [Chain m/0/2147483647&#039;/1]&lt;br /&gt;
    * ext pub: xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon&lt;br /&gt;
    * ext prv: xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef&lt;br /&gt;
  * [Chain m/0/2147483647&#039;/1/2147483646&#039;]&lt;br /&gt;
    * ext pub: xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL&lt;br /&gt;
    * ext prv: xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc&lt;br /&gt;
  * [Chain m/0/2147483647&#039;/1/2147483646&#039;/2]&lt;br /&gt;
    * ext pub: xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt&lt;br /&gt;
    * ext prv: xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j&lt;br /&gt;
&lt;br /&gt;
==Implementations==&lt;br /&gt;
&lt;br /&gt;
A Python implementation is available at https://github.com/richardkiss/pycoin&lt;br /&gt;
&lt;br /&gt;
A Java implementation is available at http https://github.com/bitsofproof/supernode/blob/1.1/api/src/main/java/com/bitsofproof/supernode/api/ExtendedKey.java&lt;br /&gt;
&lt;br /&gt;
==Acknowledgements==&lt;br /&gt;
&lt;br /&gt;
* Gregory Maxwell for the original idea of type-2 deterministic wallets, and many discussions about it.&lt;br /&gt;
* Alan Reiner for the implementation of this scheme in Armory, and the suggestions that followed from that.&lt;br /&gt;
* Mike Caldwell for the version bytes to obtain human-recognizable Base58 strings.&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0032&amp;diff=39102</id>
		<title>BIP 0032</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0032&amp;diff=39102"/>
		<updated>2013-07-05T17:25:54Z</updated>

		<summary type="html">&lt;p&gt;Grau: /* Implementations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{bip}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RECENT CHANGES:&lt;br /&gt;
* [16 Apr 2013] Added private derivation for i &amp;gt;= 0x80000000 (less risk of parent private key leakage)&lt;br /&gt;
* [30 Apr 2013] Switched from multiplication by I_L to addition of I_L (faster, easier implementation)&lt;br /&gt;
* [25 May 2013] Added test vectors&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  BIP: 32&lt;br /&gt;
  Title: Hierarchical Deterministic Wallets&lt;br /&gt;
  Author: Pieter Wuille&lt;br /&gt;
  Status: Accepted&lt;br /&gt;
  Type: Informational&lt;br /&gt;
  Created: 11-02-2012&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
This document describes [[Deterministic Wallet|hierarchical determinstic wallets]] (or &amp;quot;HD Wallets&amp;quot;): wallets which can be shared partially or entirely with different systems, each with or without the ability to spend coins.&lt;br /&gt;
&lt;br /&gt;
The specification is intended to set a standard for deterministic wallets that can be interchanged between different clients. Although the wallets described here have many features, not all are required by supporting clients.&lt;br /&gt;
&lt;br /&gt;
The specification consists of two parts. In a first part, a system for deriving a tree of keypairs from a single seed is presented. The second part demonstrates how to build a wallet structure on top of such a tree.&lt;br /&gt;
&lt;br /&gt;
==Motivation==&lt;br /&gt;
&lt;br /&gt;
The Bitcoin reference client uses randomly generated keys. In order to avoid the necessity for a backup after every transaction, (by default) 100 keys are cached in a pool of reserve keys. Still, these wallets are not intended to be shared and used on several systems simultaneously. They support hiding their private keys by using the wallet encrypt feature and not sharing the password, but such &amp;quot;neutered&amp;quot; wallets lose the power to generate public keys as well. &lt;br /&gt;
&lt;br /&gt;
Deterministic wallets do not require such frequent backups, and elliptic curve mathematics permit schemes where one can calculate the public keys without revealing the private keys. This permits for example a webshop business to let its webserver generate fresh addresses (public key hashes) for each order or for each customer, without giving the webserver access to the corresponding private keys (which are required for spending the received funds).&lt;br /&gt;
&lt;br /&gt;
However, deterministic wallets typically consist of a single &amp;quot;chain&amp;quot; of keypairs. The fact that there is only one chain means that sharing a wallet happens on an all-or-nothing basis. However, in some cases one only wants some (public) keys to be shared and recoverable. In the example of a webshop, the webserver does not need access to all public keys of the merchant&#039;s wallet; only to those addresses which are used to receive customer&#039;s payments, and not for example the change addresses that are generated when the merchant spends money. Hierarchical deterministic wallets allow such selective sharing by supporting multiple keypair chains, derived from a single root.&lt;br /&gt;
&lt;br /&gt;
==Specification: Key derivation==&lt;br /&gt;
&lt;br /&gt;
===Conventions===&lt;br /&gt;
&lt;br /&gt;
In the rest of this text we will assume the public key cryptography used in Bitcoin, namely elliptic curve cryptography using the field and curve parameters defined by secp256k1 (http://www.secg.org/index.php?action=secg,docs_secg). Variables below are either:&lt;br /&gt;
* integers modulo the order of the curve (referred to as n), serialized as 32 bytes, most significant byte first.&lt;br /&gt;
* coordinates of points on the curve, serialized as specified in SEC1 in compressed form: [0x02 or 0x03] + 32 byte x coordinate), where the header byte depends on the parity of the omitted y coordinate.&lt;br /&gt;
* byte sequences&lt;br /&gt;
&lt;br /&gt;
We shall denote the compressed form of point P by &amp;amp;chi;(P), which for secp256k1 will always be 33 bytes long.&lt;br /&gt;
&lt;br /&gt;
Addition (+) of two coordinates is defined as application of the EC group operation. Multiplication (*) of an integer and a coordinate is defined as repeated application of the EC group operation. The generator element of the curve is called G. The public key K corresponding to the private key k is calculated as k*G. We do not distinguish between numbers or coordinates and their serialization as byte sequences.&lt;br /&gt;
&lt;br /&gt;
===Extended keys===&lt;br /&gt;
&lt;br /&gt;
In what follows, we will define a function that derives a number of child keys from a parent key. In order to prevent these from depending solely on the key itself, we extend both private and public keys first with an extra 256 bits of entropy. This extension, called the chain code, is identical for corresponding private and public keys, and consists of 32 bytes.&lt;br /&gt;
&lt;br /&gt;
We represent an extended private key as (k, c), with k the normal private key, and c the chain code. An extended public key is represented as (K, c), with K = k*G and c the chain code.&lt;br /&gt;
&lt;br /&gt;
===Child key derivation functions===&lt;br /&gt;
&lt;br /&gt;
We allow for two different types of derivation: private and public.&lt;br /&gt;
* Private derivation: knowledge of the private key k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; and c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; is required to compute both k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; and K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* Public derivation: knowledge of the public key K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; and c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; suffices to compute K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; (but not k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
We define the private and public child key derivation functions:&lt;br /&gt;
* CKD((k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;), i) &amp;amp;rarr;  (k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), defined for both private and public derivation.&lt;br /&gt;
* CKD&#039;((K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;), i) &amp;amp;rarr; (K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), defined only for public derivation.&lt;br /&gt;
&lt;br /&gt;
We use the most significant bit of i to specify which type of derivation to use. i is encoded as a 32 bit unsigned integer, most significant byte first; &#039;||&#039; represents concatenation.&lt;br /&gt;
&lt;br /&gt;
====Private child key derivation====&lt;br /&gt;
&lt;br /&gt;
To define CKD((k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;), i) &amp;amp;rarr; (k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;):&lt;br /&gt;
* Check whether the highest bit (0x80000000) of i is set:&lt;br /&gt;
** If 1, private derivation is used: let I = HMAC-SHA512(Key = c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, Data = 0x00 || k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; || i) [Note: The 0x00 pads the private key to make it 33 bytes long.]&lt;br /&gt;
** If 0, public derivation is used: let I = HMAC-SHA512(Key = c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, Data = &amp;amp;chi;(k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;*G) || i)&lt;br /&gt;
* Split I = I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; || I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; into two 32-byte sequences, I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; and I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; + k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; (mod n).&lt;br /&gt;
* c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
In case I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; ≥ n or k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = 0, the resulting key is invalid, and one should proceed with the next value for i.&lt;br /&gt;
[Note: this has probability lower than 1 in 2&amp;lt;sup&amp;gt;127&amp;lt;/sup&amp;gt;.]&lt;br /&gt;
&lt;br /&gt;
====Public child key derivation====&lt;br /&gt;
&lt;br /&gt;
To define CKD&#039;((K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;), i) &amp;amp;rarr; (K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;):&lt;br /&gt;
* Check whether the highest bit (0x80000000) of i is set:&lt;br /&gt;
** If 1, return error&lt;br /&gt;
** If 0, let I = HMAC-SHA512(Key = c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;, Data = &amp;amp;chi;(K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;) || i)&lt;br /&gt;
* Split I = I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; || I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; into two 32-byte sequences, I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; and I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = (I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; + k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;)*G = I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt;*G + K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;&lt;br /&gt;
* c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
In case I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; ≥ n or K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; is the point at infinity, the resulting key is invalid, and one should proceed with the next value for i.&lt;br /&gt;
&lt;br /&gt;
Note that the extended public key corresponding to the evaluation of CKD(k&amp;lt;sub&amp;gt;ext&amp;lt;/sub&amp;gt;, i) with public derivation (so with i &amp;lt; 0x80000000) is identical to the evaluation of CKD&#039;(K&amp;lt;sub&amp;gt;ext&amp;lt;/sub&amp;gt;, i), with K&amp;lt;sub&amp;gt;ext&amp;lt;/sub&amp;gt; the extended public key corresponding to k&amp;lt;sub&amp;gt;ext&amp;lt;/sub&amp;gt;. Symbolically, CKD((k, c), i)*G = CKD&#039;((k*G, c), i). This implies that CKD&#039; can be used to derive all public keys corresponding to the private keys that CKD would find. It cannot be used to retrieve the private keys, however.&lt;br /&gt;
&lt;br /&gt;
The HMAC-SHA512 function is specified in [http://tools.ietf.org/html/rfc4231 RFC 4231].&lt;br /&gt;
&lt;br /&gt;
===The key tree===&lt;br /&gt;
&lt;br /&gt;
The next step is cascading several CKD constructions to build a tree. We start with one root, the master extended key m. By evaluating CKD(m,i) for several values of i, we get a number of first-degree derivative nodes. As each of these is again an extended key, CKD can be applied to those as well. To shorten notation, we will write CKD(CKD(CKD(m,0x8000003),0x2),0x5) as m/3&#039;/2/5 now.&lt;br /&gt;
&lt;br /&gt;
Each leaf node in the tree corresponds to an actual keypair, while the internal nodes correspond to the collection of keypairs that descends from them. The chain codes of the leaf nodes are ignored, and only their embedded private or public key is used. Because of this construction, knowing an extended private key allows reconstruction of all descendant private keys and public keys, and knowing an extended public keys allows reconstruction of all descendant public keys derived using public derivation.&lt;br /&gt;
&lt;br /&gt;
===Key identifiers===&lt;br /&gt;
&lt;br /&gt;
Extended keys can be identified by the Hash160 (RIPEMD160 after SHA256) of the serialized public key, ignoring the chain code. This corresponds exactly to the data used in traditional Bitcoin addresses. It is not advised to represent this data in base58 format though, as it may be interpreted as an address that way (and wallet software is not required to accept payment to the chain key itself).&lt;br /&gt;
&lt;br /&gt;
The first 32 bits of the identifier are called the fingerprint.&lt;br /&gt;
&lt;br /&gt;
===Serialization format===&lt;br /&gt;
&lt;br /&gt;
Extended public and private keys are serialized as follows:&lt;br /&gt;
* 4 byte: version bytes (mainnet: 0x0488B21E public, 0x0488ADE4 private; testnet: 0x043587CF public, 0x04358394 private)&lt;br /&gt;
* 1 byte: depth: 0x00 for master nodes, 0x01 for level-1 descendants, .... &lt;br /&gt;
* 4 bytes: the fingerprint of the parent&#039;s key (0x00000000 if master key)&lt;br /&gt;
* 4 bytes: child number. This is the number i in x&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;/i, with x&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; the key being serialized. This is encoded in MSB order. (0x00000000 if master key)&lt;br /&gt;
* 32 bytes: the chain code&lt;br /&gt;
* 33 bytes: the public key or private key data (0x02 + X or 0x03 + X for public keys, 0x00 + k for private keys)&lt;br /&gt;
&lt;br /&gt;
This 78 byte structure can be encoded like other Bitcoin data in Base58, by first adding 32 checksum bits (derived from the double SHA-256 checksum), and then converting to the Base58 representation. This results in a Base58-encoded string of up to 112 characters. Because of the choice of the version bytes, the Base58 representation will start with &amp;quot;xprv&amp;quot; or &amp;quot;xpub&amp;quot; on mainnet, &amp;quot;tprv&amp;quot; or &amp;quot;tpub&amp;quot; on testnet.&lt;br /&gt;
&lt;br /&gt;
Note that the fingerprint of the parent only serves as a fast way to detect parent and child nodes in software, and software must be willing to deal with collisions. Internally, the full 160-bit identifier could be used.&lt;br /&gt;
&lt;br /&gt;
When importing a serialized extended public key, implementations must verify whether the X coordinate in the public key data corresponds to a point on the curve. If not, the extended public key is invalid.&lt;br /&gt;
&lt;br /&gt;
===Master key generation===&lt;br /&gt;
&lt;br /&gt;
The total number of possible extended keypairs is almost 2^512, but the produced keys are only 256 bits long, and offer about half of that in terms of security. Therefore, master keys are not generated directly, but instead from a potentially short seed value.&lt;br /&gt;
&lt;br /&gt;
* Generate a seed S of a chosen length (at least 128 bits, but 256 is advised) from a (P)RNG.&lt;br /&gt;
* Calculate I = HMAC-SHA512(key=&amp;quot;Bitcoin seed&amp;quot;, msg=S)&lt;br /&gt;
* Split I into two 32-byte sequences, I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; and I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* Use I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; as master secret key, and I&amp;lt;sub&amp;gt;R&amp;lt;/sub&amp;gt; as master chain code.&lt;br /&gt;
In case I&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; is 0 or &amp;gt;=n, the master key is invalid.&lt;br /&gt;
&lt;br /&gt;
[[File:BIP32-derivation.png]]&lt;br /&gt;
&lt;br /&gt;
==Specification: Wallet structure==&lt;br /&gt;
&lt;br /&gt;
The previous sections specified key trees and their nodes. The next step is imposing a wallet structure on this tree. The layout defined in this section is a default only, though clients are encouraged to mimick it for compatibility, even if not all features are supported.&lt;br /&gt;
&lt;br /&gt;
An HDW is organized as several &#039;accounts&#039;. Accounts are numbered, the default account (&amp;quot;&amp;quot;) being number 0. Clients are not required to support more than one account - if not, they only use the default account.&lt;br /&gt;
&lt;br /&gt;
Each account is composed of two keypair chains: an internal and an external one. The external keychain is used to generate new public addresses, while the internal keychain is used for all other operations (change addresses, generation addresses, ..., anything that doesn&#039;t need to be communicated). Clients that do not support separate keychains for these should use the external one for everything.&lt;br /&gt;
&lt;br /&gt;
 * m/i&#039;/0/k corresponds to the k&#039;th keypair of the external chain of account number i of the HDW derived from master m.&lt;br /&gt;
 * m/i&#039;/1/k corresponds to the k&#039;th keypair of the internal chain of account number i of the HDW derived from master m.&lt;br /&gt;
&lt;br /&gt;
===Use cases===&lt;br /&gt;
&lt;br /&gt;
====Full wallet sharing: m====&lt;br /&gt;
&lt;br /&gt;
In cases where two systems need to access a single shared wallet, and both need to be able to perform spendings, one needs to share the master private extended key. Nodes can keep a pool of N look-ahead keys cached for external chains, to watch for incoming payments. The look-ahead for internal chains can be very small, as no gaps are to be expected here. An extra look-ahead could be active for the first unused account&#039;s chains - triggering the creation of a new account when used. Note that the name of the account will still need to be entered manually and cannot be synchronized via the block chain.&lt;br /&gt;
&lt;br /&gt;
====Audits: M====&lt;br /&gt;
&lt;br /&gt;
In case an auditor needs full access to the list of incoming and outgoing payments, one can share the master public extended key. This will allow the auditor to see all transactions from and to the wallet, in all accounts, but not a single secret key.&lt;br /&gt;
&lt;br /&gt;
====Per-office balances: m/i&#039;====&lt;br /&gt;
&lt;br /&gt;
When a business has several independent offices, they can all use wallets derived from a single master. This will allow the headquarters to maintain a super-wallet that sees all incoming and outgoing transactions of all offices, and even permit moving money between the offices.&lt;br /&gt;
&lt;br /&gt;
====Recurrent business-to-business transactions: M/i&#039;/0====&lt;br /&gt;
&lt;br /&gt;
In case two business partners often transfer money, one can use the extended public key for the external chain of a specific account (M/i&#039;/0) as a sort of &amp;quot;super address&amp;quot;, allowing frequent transactions that cannot (easily) be associated, but without needing to request a new address for each payment.&lt;br /&gt;
Such a mechanism could also be used by mining pool operators as variable payout address.&lt;br /&gt;
&lt;br /&gt;
====Unsecure money receiver: M/i&#039;/0====&lt;br /&gt;
&lt;br /&gt;
When an unsecure webserver is used to run an e-commerce site, it needs to know public addresses that be used to receive payments. The webserver only needs to know the public extended key of the external chain of a single account. This means someone illegally obtaining access to the webserver can at most see all incoming payments, but will not (trivially) be able to distinguish outgoing transactions, nor see payments received by other webservers if there are several ones.&lt;br /&gt;
&lt;br /&gt;
==Compatibility==&lt;br /&gt;
&lt;br /&gt;
To comply with this standard, a client must at least be able to import an extended public or private key, to give access to its direct descendants as wallet keys. The wallet structure (master/account/chain/subchain) presented in the second part of the specification is advisory only, but is suggested as a minimal structure for easy compatibility - even when no separate accounts or distinction between internal and external chains is made. However, implementations may deviate from it for specific needs; more complex applications may call for a more complex tree structure.&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
In addition to the expectations from the EC public-key cryptography itself:&lt;br /&gt;
* Given a public key K, an attacker cannot find the corresponding private key more efficiently than by solving the EC discrete logarithm problem (assumed to require 2&amp;lt;sup&amp;gt;128&amp;lt;/sup&amp;gt; group operations).&lt;br /&gt;
the intended security properties of this standard are:&lt;br /&gt;
* Given a child extended private key (k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) and the integer i, an attacker cannot find the parent private key k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt; more efficiently than a 2&amp;lt;sup&amp;gt;256&amp;lt;/sup&amp;gt; brute force of HMAC-SHA512.&lt;br /&gt;
* Given any number (2 &amp;lt;= N &amp;lt;= 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt;-1) of (index, extended private key) tuples (i&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,(p&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;)), with distinct i&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;&#039;s, determining whether they are derived from a common parent extended private key (i.e., whether there exists a (p&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;) such that for each j in [0..N-1] CKD((p&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;),i&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;)=(p&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;)), cannot be done more efficiently than a 2&amp;lt;sup&amp;gt;256&amp;lt;/sup&amp;gt; brute force of HMAC-SHA512.&lt;br /&gt;
Note however that the following properties does not exist:&lt;br /&gt;
* Given a parent extended public key (K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;) and a child public key (K&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;), it is hard to find i.&lt;br /&gt;
* Given a parent extended public key (K&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;,c&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;) and a child private key (k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) using public derivation, it is hard to find k&amp;lt;sub&amp;gt;par&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Private and public keys must be kept safe as usual. Leaking a private key means access to coins - leaking a public key can mean loss of privacy.&lt;br /&gt;
&lt;br /&gt;
Somewhat more care must be taken regarding extended keys, as these correspond to an entire (sub)tree of keys. One weakness that may not be immediately obvious, is that knowledge of the extended public key + a private key descending from it is equivalent to knowing the extended private key (i.e., every private and public key) in case public derivation is used. This means that extended public keys must be treated more carefully than regular public keys. This is the reason why accounts at the first level of the default wallet layout use private derivation, so a leak of account-specific (or below) private key never risks compromising the master.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Test Vectors==&lt;br /&gt;
&lt;br /&gt;
For more detailed information about these (such as intermediate values and other representations), see [[BIP_0032_TestVectors]]&lt;br /&gt;
&lt;br /&gt;
Test vector 1&lt;br /&gt;
&lt;br /&gt;
  Master (hex): 000102030405060708090a0b0c0d0e0f&lt;br /&gt;
  * [Chain m]&lt;br /&gt;
    * ext pub: xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8&lt;br /&gt;
    * ext prv: xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi&lt;br /&gt;
  * [Chain m/0&#039;]&lt;br /&gt;
    * ext pub: xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw&lt;br /&gt;
    * ext prv: xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7&lt;br /&gt;
  * [Chain m/0&#039;/1]&lt;br /&gt;
    * ext pub: xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ&lt;br /&gt;
    * ext prv: xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs&lt;br /&gt;
  * [Chain m/0&#039;/1/2&#039;]&lt;br /&gt;
    * ext pub: xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5&lt;br /&gt;
    * ext prv: xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM&lt;br /&gt;
  * [Chain m/0&#039;/1/2&#039;/2]&lt;br /&gt;
    * ext pub: xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV&lt;br /&gt;
    * ext prv: xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334&lt;br /&gt;
  * [Chain m/0&#039;/1/2&#039;/2/1000000000]&lt;br /&gt;
    * ext pub: xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy&lt;br /&gt;
    * ext prv: xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76&lt;br /&gt;
&lt;br /&gt;
Test vector 2&lt;br /&gt;
&lt;br /&gt;
  Master (hex): fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542&lt;br /&gt;
  * [Chain m]&lt;br /&gt;
    * ext pub: xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB&lt;br /&gt;
    * ext prv: xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U&lt;br /&gt;
  * [Chain m/0]&lt;br /&gt;
    * ext pub: xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH&lt;br /&gt;
    * ext prv: xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt&lt;br /&gt;
  * [Chain m/0/2147483647&#039;]&lt;br /&gt;
    * ext pub: xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a&lt;br /&gt;
    * ext prv: xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9&lt;br /&gt;
  * [Chain m/0/2147483647&#039;/1]&lt;br /&gt;
    * ext pub: xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon&lt;br /&gt;
    * ext prv: xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef&lt;br /&gt;
  * [Chain m/0/2147483647&#039;/1/2147483646&#039;]&lt;br /&gt;
    * ext pub: xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL&lt;br /&gt;
    * ext prv: xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc&lt;br /&gt;
  * [Chain m/0/2147483647&#039;/1/2147483646&#039;/2]&lt;br /&gt;
    * ext pub: xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt&lt;br /&gt;
    * ext prv: xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j&lt;br /&gt;
&lt;br /&gt;
==Implementations==&lt;br /&gt;
&lt;br /&gt;
A Python implementation is available at https://github.com/richardkiss/pycoin&lt;br /&gt;
A Java implementation is available at http https://github.com/bitsofproof/supernode/blob/1.1/api/src/main/java/com/bitsofproof/supernode/api/ExtendedKey.java&lt;br /&gt;
&lt;br /&gt;
==Acknowledgements==&lt;br /&gt;
&lt;br /&gt;
* Gregory Maxwell for the original idea of type-2 deterministic wallets, and many discussions about it.&lt;br /&gt;
* Alan Reiner for the implementation of this scheme in Armory, and the suggestions that followed from that.&lt;br /&gt;
* Mike Caldwell for the version bytes to obtain human-recognizable Base58 strings.&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Software_versions&amp;diff=38105</id>
		<title>Software versions</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Software_versions&amp;diff=38105"/>
		<updated>2013-05-28T06:27:07Z</updated>

		<summary type="html">&lt;p&gt;Grau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Software !! Vulnerable !! Old !! Current&lt;br /&gt;
|-&lt;br /&gt;
| Bitcoin-Qt&amp;lt;br&amp;gt;bitcoind || * - 0.4.9rc1&amp;lt;br&amp;gt;0.5.0rc1 - 0.5.8rc1&amp;lt;br&amp;gt;0.6.0rc1 - 0.6.5rc1&amp;lt;br&amp;gt;0.7.0rc1 - 0.7.3rc1&amp;lt;br&amp;gt;0.8.0rc1 - 0.8.0 || 0.4.9rc2&amp;lt;br&amp;gt;0.5.8rc2&amp;lt;br&amp;gt;0.6.5rc2&amp;lt;br&amp;gt;0.7.3rc2&amp;lt;br&amp;gt;&amp;amp;nbsp; || 0.4.9rc2&amp;lt;br&amp;gt;0.5.8rc3&amp;lt;br&amp;gt;0.6.5rc3&amp;lt;br&amp;gt;0.7.3rc3&amp;lt;br&amp;gt;0.8.1&lt;br /&gt;
|-&lt;br /&gt;
| Bits of Proof ||  || 0.9|| 1.0&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Software&amp;diff=38104</id>
		<title>Software</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Software&amp;diff=38104"/>
		<updated>2013-05-28T06:22:53Z</updated>

		<summary type="html">&lt;p&gt;Grau: /* Enterprise server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;List of Bitcoin-related software. See also [[:Category:Software|Category:Software]].&lt;br /&gt;
&lt;br /&gt;
Be sure to keep on top of the latest [[CVEs|security vulnerabilities]]!&lt;br /&gt;
&lt;br /&gt;
==Bitcoin clients==&lt;br /&gt;
===Bitcoin clients===&lt;br /&gt;
::&#039;&#039;Main article and feature comparison: [[Clients]]&#039;&#039;&lt;br /&gt;
*[[Bitcoin-Qt]] - C++/Qt based tabbed UI. Linux/MacOSX/Windows. Full-featured [[Thin Client Security|thick client]] that downloads the entire [[block chain]], using code from the original Bitcoin client.&lt;br /&gt;
*[[bitcoind]] - GUI-less version of the original Bitcoin client, providing a [[API reference (JSON-RPC)|JSON-RPC]] interface&lt;br /&gt;
*[[MultiBit]] - lightweight [[Thin Client Security|thin client]] for Windows, MacOS and Linux with support for opening multiple wallets simultaneously&lt;br /&gt;
*[[Electrum]] - a &amp;quot;blazing fast, open-source, multi-OS Bitcoin client/wallet with a very active community&amp;quot; - also a [[Thin Client Security|thin client]].&lt;br /&gt;
*[[Bitcoin-js-remote]] - JavaScript RPC client, support for QR codes&lt;br /&gt;
*[https://github.com/TheSeven/Bitcoin-WebUI Bitcoin WebUI] - JavaScript RPC client&lt;br /&gt;
*[https://github.com/zamgo/bitcoin-webskin Bitcoin Webskin] - PHP web interface to bitcoind and namecoind&lt;br /&gt;
*[https://bitcointalk.org/index.php?topic=50721.0 subvertx] - command line bitcoin tools&lt;br /&gt;
*[[Bitcoiner]] - Java RPC client (Android)&lt;br /&gt;
*[[Armory]] - Python-based client currently an alpha-level release, the beta version is being crowdfunded&lt;br /&gt;
*[[Spesmilo]] - Python/PySide RPC client (abandoned)&lt;br /&gt;
*[[Gocoin]] - GUI-less client node written in Go language, with a separate cold deterministic wallet app.&lt;br /&gt;
&lt;br /&gt;
====Frontends to eWallet====&lt;br /&gt;
*[[BitPay]] - Android application&lt;br /&gt;
*[https://blockchain.info/wallet Blockchain] - Javascript bitcoin client with client side encryption.&lt;br /&gt;
&lt;br /&gt;
====Experimental====&lt;br /&gt;
*[[Freecoin]] - C++ client, supports alternative currencies like [[Beertoken]]&lt;br /&gt;
*[[BitDroid]] - Java client&lt;br /&gt;
*[[Bitdollar]] - C++/Qt client, unstable beta version&lt;br /&gt;
&lt;br /&gt;
===Libraries===&lt;br /&gt;
*[https://bitcointalk.org/index.php?topic=30646.0 libbitcoin]&lt;br /&gt;
*[[BitCoinJ]] - Java client library, early development stage but used in live projects already&lt;br /&gt;
*[[BCCAPI]] (Bitcoin Client API) - a java library designed for making secure light-weight bitcoin clients.&lt;br /&gt;
&lt;br /&gt;
==Bitcoin Trade Data==&lt;br /&gt;
*[[Bitcoin Charts]] – Prices, volume, and extensive charting on virtually all Bitcoin markets.&lt;br /&gt;
*[[MtGox Live]] - An innovative chart showing a live feed of [[MtGox]] trades and market depth.  (Must Use Chrome)&lt;br /&gt;
*[http://btccharts.com BTCCharts] - An innovative chart showing a live feed of multiple markets, currencies and timeframes.&lt;br /&gt;
*[http://BitcoinExchangeRate.org BitcoinExchangeRate.org] - Bitcoin and USD converter with convenient URL scheme and Auto-updating Portfolio Spreadsheet.&lt;br /&gt;
*[[Bitcoin Sentiment Index]] - A financial index that collects and disseminates sentiment data about bitcoin.&lt;br /&gt;
*[[Preev]] - Bitcoin converter with live exchange rates.&lt;br /&gt;
*[[Skami]] - Bitcoin Market Exchange comparison charts.&lt;br /&gt;
*[[BitcoinSentiment]] - Crowdvoting site offering means of voting and viewing voters sentiment towards bitcoin.&lt;br /&gt;
&lt;br /&gt;
==Bitcoin software==&lt;br /&gt;
&lt;br /&gt;
===Web interfaces for merchants===&lt;br /&gt;
*[[Bitcoin Evolution]] - Non wallet-based Buy Now button to insert into websites (handles sales tracking; client must be used for actual transaction)&lt;br /&gt;
*[[BitPay]] - Buy Now buttons, Checkout posts/callbacks, Mobile Checkout, JSON API&lt;br /&gt;
*[[Btceconomy]] - a JavaScript widget listing items for sale&lt;br /&gt;
*[[Javascript Bitcoin Converter]] - currency conversion&lt;br /&gt;
*[[WalletBit]] - Easy JavaScript Buy Now buttons, Instant Payment Notification, Application Programming Interface (JSON API), Mobile Checkout, QR-Code&lt;br /&gt;
*[[BitUtils Merchant]] - Customizable Buy Now buttons with hosted checkout interface. No programming skills required to set up.&lt;br /&gt;
&lt;br /&gt;
===Shopping Cart Integration in eCommerce-Systems===&lt;br /&gt;
*[[Zen Cart Bitcoin Payment Module]] - a payment module that interacts with bitcoind for the Zen Cart eCommerce shopping chart.&lt;br /&gt;
*[[Karsha Shopping Cart Interface]] -  is a mobile payment-interface which enables its users to accept payments.&lt;br /&gt;
*[[Bitcoin-Cash]] - an easy to use payment module for xt:Commerce&lt;br /&gt;
*[[BitPay]] - bitcoin plugins for Magento, Opencart, Zencart, PHP, JSON API&lt;br /&gt;
*[[WalletBit]] - Plugins for PrestaShop, OpenCart, PHP, JSON API&lt;br /&gt;
*[[OpenCart Bitcoin]] - An OpenCart payment module that communicates with a bitcoin client using JSON RPC.&lt;br /&gt;
*[[OsCommerce_Bitcoin_Payment_Module|OsCommerce Bitcoin Payment Module]] - a payment module that uses a python monitoring script to interact with bitcoind for OsCommerce&lt;br /&gt;
* [http://drupal.org/project/uc_bitcoin Drupal Ubercart Bitcoin payment method] enables you to accept Bitcoin as payment for your Drupal/Ubercart enabled website product/services.&lt;br /&gt;
&lt;br /&gt;
=== Enterprise server ===&lt;br /&gt;
*[http://bitsofproof.com Bits of Proof] - a modular enterprise-ready implementation of the Bitcoin protocol.&lt;br /&gt;
&lt;br /&gt;
===Web apps (opensource)===&lt;br /&gt;
*[[Bitcoin Central]] - currency exchange&lt;br /&gt;
*[[Bitcoin Poker Room]] - poker site&lt;br /&gt;
*[[Abe]] - block chain viewer&lt;br /&gt;
*[[Simplecoin]] - PHP web frontend for a pool&lt;br /&gt;
*[[bitcoin_simple_php_tools]] simple php tools for webmasters&lt;br /&gt;
&lt;br /&gt;
===Browser extensions===&lt;br /&gt;
*[[Bitcoin Extension]] - check balance and send bitcoins (Chrome)&lt;br /&gt;
*[[Bitcoin Prices (extension)]] - monitoring price (Firefox)&lt;br /&gt;
*[[Bitcoin Ticker]] - monitoring price (Chrome)&lt;br /&gt;
*[[Biticker]] - Bitcoin ticker, currency converter and history price graph (Chrome)&lt;br /&gt;
*[https://chrome.google.com/webstore/detail/bitcoin-microformats/bkanicejfbhlidgjkpenmddnacjengld?hl=en Bitcoin Microformats] Show bitcoin address metadata embedded in a page (Chrome)&lt;br /&gt;
*[https://chrome.google.com/webstore/detail/bitcoin-address-lookup/pmlblkdmadbidammhjiponepngbfcpge?hl=en Bitcoin Address Lookup] Right click an address to view its value. (Chrome)&lt;br /&gt;
&lt;br /&gt;
===PC apps===&lt;br /&gt;
*[[http://www.mybtc-trader.com MyBTC-Trader.com]] - a MtGox Bitcoin trading client for windows with GUI&lt;br /&gt;
*[[Mining Explorer]] - monitoring tool for bitcoin mining&lt;br /&gt;
*[[Bitcoin SMS Alert]] - sends SMS text alerts to a user&#039;s phone based on BTC price / percent thresholds.&lt;br /&gt;
*[[BTConvert]] - currency conversion&lt;br /&gt;
*[[Sierra Chart MtGox Bridge]] - real-time charting&lt;br /&gt;
*[[BitTicker]] - monitoring price (Mac OS X)&lt;br /&gt;
*[[ToyTrader]] - a command line trading tool for [[MtGox]]&lt;br /&gt;
*[[goxsh]] - a command-line frontend to the [[MtGox|Mt. Gox Bitcoin Exchange]] (Python)&lt;br /&gt;
*[[MyBitcoins gadget]] - monitoring pool earnings / price (Windows gadget)&lt;br /&gt;
*[[Bitcoin QR Popup]] - streamlined interface to bitcoin for POS systems (Windows)&lt;br /&gt;
*[http://gnome-help.org/content/show.php/Bitcoin+Rate?content=138572 Bitcoin Rate] - Desktop widget with BTC exchange rate (KDE)&lt;br /&gt;
*[http://kde-apps.org/content/show.php?content=142344 Bitcoin Monitor] - Desktop widget to monitor status of your Bitcoin miners on mining pools (KDE)&lt;br /&gt;
&lt;br /&gt;
===Mobile apps===&lt;br /&gt;
==== iPhone / iPad ====&lt;br /&gt;
*[https://blockchain.info/wallet/iphone-app Blockchain] - Fully featured iphone bitcoin app.&lt;br /&gt;
*[[Bitcoin Ticker (iPhone)]] - monitoring price w/push notifications&lt;br /&gt;
*[[BitCoins Mobile]] - First iPad native app! Live market data, news feeds, mining pool statistics, full screen exchange price charts, bitcoin network statistical charts. (iPad only, iPhone/iPod Touch coming soon!)&lt;br /&gt;
*[https://github.com/teeman/BitcoinTrader BitcoinTrader] - Spend/receive BTC via QR codes, trade, deposit/withdraw, etc. Supports Mt. Gox, TradeHill, ExchB, CampBX, and InstaWallet.&lt;br /&gt;
*[[Bit-pay]] - Mobile Checkout, set prices in any currency and receive mobile-to-mobile payment&lt;br /&gt;
*[[Easywallet.org]] - Web based wallet, works with QR Code scanner on iPhone/iPad/iPod touch&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
* Direct link to Android Market bitcoin apps. https://play.google.com/store/search?q=bitcoin&lt;br /&gt;
*[[BitCare]] - Track bitcoin wallet balance, trade on Mt.Gox, monitor mining pool hashrate, balance, worker status. &lt;br /&gt;
*[[BtcMobile]] - monitoring price and mining pool statistics (iPhone/iPad, Android)&lt;br /&gt;
*[[Bitcoin Alert]] - monitoring price (Android)&lt;br /&gt;
*[[Bitcoin-android]] - Does not appear to be being maitained anymore. https://market.android.com/details?id=com.bitcoinandroid&lt;br /&gt;
*[[Bitcoin Wallet Balance]] - view your balance in real time on your android phone&lt;br /&gt;
*[[Bitcoin Wallet]] - This is the most functional Android bitcoin wallet application. https://market.android.com/details?id=de.schildbach.wallet&lt;br /&gt;
*[[BitcoinSpinner]] - Single address, easy to use, lightweight and open source client. Keys stored on device.&lt;br /&gt;
*[[BitcoinX]] - monitoring price (Android)&lt;br /&gt;
*[[BitPay]] - https://market.android.com/details?id=com.bitcoin.bitpay (Is not related to the bit-pay.com online payment processor.)&lt;br /&gt;
*[https://blockchain.info/wallet/android-app Blockchain] - Lightweight Android Bitcoin Client - Also works with blockchain.info web interface and iphone app.&lt;br /&gt;
*[[BtcMobile]] - monitoring price and mining pool statistics (iPhone/iPad, Android)&lt;br /&gt;
*[[http://coincliff.com CoinCliff]] - Monitors price and fires alarms to wake you up, or notifications, as in text messages (Android)&lt;br /&gt;
*[[Easywallet.org]] - Web based wallet, works with QR Code scanner on Android devices&lt;br /&gt;
*[[Miner Status]] - monitoring miner status (Android)&lt;br /&gt;
*[[SMS Bitcoins]] - transactions by SMS&lt;br /&gt;
&lt;br /&gt;
==== Windows Phone 7 ====&lt;br /&gt;
*Direct link to Windows Phone Marketplace Bitcoin apps: [http://www.windowsphone.com/en-us/store/search?q=bitcoin]&lt;br /&gt;
&lt;br /&gt;
see also [[Bitcoin Payment Apps]]&lt;br /&gt;
&lt;br /&gt;
===Operating systems===&lt;br /&gt;
*[[MinePeon]] - Bitcoin mining on the Raspberry PI&lt;br /&gt;
*[[BAMT]] (not maintained)&lt;br /&gt;
*[[LinuxCoin]] - a lightweight Debian-based OS, with the Bitcoin client and GPU mining software (not maintained)&lt;br /&gt;
&lt;br /&gt;
===Mining apps===&lt;br /&gt;
Main page: [[Mining software]]&lt;br /&gt;
*[[50Miner]] - A GUI frontend for Windows(Poclbm, Phoenix, DiabloMiner, cgminer)&lt;br /&gt;
*[[BFGMiner]] - Modular ASIC/FPGA/GPU miner in C&lt;br /&gt;
*[[BTCMiner]] - Bitcoin Miner for ZTEX FPGA Boards&lt;br /&gt;
*[[Bit Moose]] - Run Miners as a Windows Service.&lt;br /&gt;
*[[Poclbm]] - Python/OpenCL GPU miner ([[Poclbm-gui|GUI(Windows &amp;amp; MacOS X)]])&lt;br /&gt;
*[[Poclbm-mod]] - more efficient version of [[Poclbm]] ([[Poclbm-mod-gui|GUI]])&lt;br /&gt;
*[[DiabloMiner]] - Java/OpenCL GPU miner ([[DiabloMiner.app|MAC OS X GUI]])&lt;br /&gt;
*[[RPC Miner]] - remote RPC miner ([[RPCminer.app|MAC OS X GUI]])&lt;br /&gt;
*[[Phoenix miner]] - miner&lt;br /&gt;
*[[Cpu Miner]] - miner&lt;br /&gt;
*[[Ufasoft miner]] - miner&lt;br /&gt;
*[[Pyminer]] - Python miner, reference implementation&lt;br /&gt;
*[[Remote miner]] - mining pool software&lt;br /&gt;
*[[Open Source FGPA Bitcoin Miner]] - a miner that makes use of an FPGA Board&lt;br /&gt;
*[https://github.com/mkburza/Flash-Player-Bitcoin-Miner Flash Player Bitcoin Miner] - A proof of concept Adobe Flash Player miner&lt;br /&gt;
&lt;br /&gt;
===Mining Pool Servers (backend)===&lt;br /&gt;
Main page: [[Poolservers]]&lt;br /&gt;
&lt;br /&gt;
*[[ecoinpool]] - Erlang poolserver (not maintained)&lt;br /&gt;
*[[Eloipool]] - Fast Python3 poolserver&lt;br /&gt;
*[[Pushpoold]] - Old mining poolserver in C (not maintained)&lt;br /&gt;
*[[Poold]] - Old Python mining poolserver (not maintained)&lt;br /&gt;
*[[PoolServerJ]] - Java mining poolserver (not maintained)&lt;br /&gt;
&lt;br /&gt;
===Utilities, libraries, and interfaces:===&lt;br /&gt;
*[[BitcoinCrypto]] - a lightweight Bitcoin crypto library for Java/Android&lt;br /&gt;
*[[Bitcoin Dissector]] - a wireshark dissector for the bitcoin protocol&lt;br /&gt;
*[[Bitcointools]] - a set of Python tools accessing the transaction database and the wallet&lt;br /&gt;
*[[Finance::MtGox]] - a Perl module which interfaces with the Mt. Gox API&lt;br /&gt;
*[[libblkmaker]] - C library implementation of [[getblocktemplate]] decentralized mining protocol&lt;br /&gt;
*[[python-blkmaker]] - Python module implementation of [[getblocktemplate]] decentralized mining protocol&lt;br /&gt;
&lt;br /&gt;
===Lists of software===&lt;br /&gt;
*[[BitGit]] - list of Bitcoin-related opensource projects hosted at Git&lt;br /&gt;
&lt;br /&gt;
===Developer resources===&lt;br /&gt;
*[[:Category:Developer|Category:Developer]]&lt;br /&gt;
*[[:Category:Technical|Category:Technical]]&lt;br /&gt;
*[[Original Bitcoin client/API calls list]]&lt;br /&gt;
*[[API reference (JSON-RPC)]]&lt;br /&gt;
*[[PHP_developer_intro|PHP Developer Introduction]]&lt;br /&gt;
&lt;br /&gt;
===Other===&lt;br /&gt;
*[[Namecoin]] - a distributed naming system based on Bitcoin technology&lt;br /&gt;
*[[Bitcoin Consultancy]] - an organization providing open source software and Bitcoin-related consulting&lt;br /&gt;
*[[Open Transactions]] - a financial crypto and digital cash software library, complementary to Bitcoin&lt;br /&gt;
*[[Moneychanger]] - Java-based GUI for [[Open Transactions]]&lt;br /&gt;
*[http://btcnames.org/ BTCnames] - a webbased aliasing service which allows to handle unlimited names for your BTC deposit hashes&lt;br /&gt;
*[[Devcoin]] - the open source developer coin&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=People&amp;diff=38103</id>
		<title>People</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=People&amp;diff=38103"/>
		<updated>2013-05-28T06:18:49Z</updated>

		<summary type="html">&lt;p&gt;Grau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A list of active contributors to Bitcoin, ordered by first name.&lt;br /&gt;
&lt;br /&gt;
[[Andreas Schildbach]] ([https://profiles.google.com/andreas.schildbach Profile]) - original developer of [https://market.android.com/details?id=de.schildbach.wallet Bitcoin Wallet for Android] ([http://code.google.com/p/bitcoin-wallet/ Google Code Project]).&lt;br /&gt;
&lt;br /&gt;
[[Amir Taaki]] aka genjix- creator of the [[Britcoin]] and [[Intersango]] exchanges, [[libbitcoin]] library for Bitcoin, [[Spesmilo]], [[Bitcoin Consultancy]], [[Vibanko]], [[GLBSE]] client, Bitcoin poker client, [https://gitorious.org/freecoin/freecoin Python bindings] for Bitcoin, [[Pastecoin]] and others.&lt;br /&gt;
&lt;br /&gt;
[[ArtForz|Art Forz]]- developed the first GUI miner and at one time his GPU mining farm (the ArtFarm) was mining over a third of all blocks.&lt;br /&gt;
&lt;br /&gt;
[[Gary Rowe]] [https://plus.google.com/u/0/115295932487523951663/about (Profile)] - Contributor to the [[MultiBit]] (http://multibit.org) and [[BitCoinJ]] (http://code.google.com/p/bitcoinj/) projects. Working on various Bitcoin based businesses.&lt;br /&gt;
&lt;br /&gt;
[[Gavin Andresen]]- [https://profiles.google.com/u/0/gavinandresen/about (Profile)]  [[Satoshi client]] maintainer. He previously worked at Silicon Graphics and now runs his own company.&lt;br /&gt;
&lt;br /&gt;
[[Hal Finney]]- one of the creators of [http://en.wikipedia.org/wiki/Pretty_Good_Privacy PGP] and one of the earliest contributors to the Bitcoin project.  First to identify a type of double-spending attack that now bears his name -- the [[Double-spending#Finney_attack|Finney attack]].&lt;br /&gt;
&lt;br /&gt;
James McCarthy aka Nefario- creator of the first bitcoin stock exchange [[GLBSE]]&lt;br /&gt;
&lt;br /&gt;
[[Jed McCaleb]], original developer of MtGox. Previously created eDonkey2000.&lt;br /&gt;
&lt;br /&gt;
[[Jeff Garzik]]- [http://en.wikipedia.org/wiki/Jeff_Garzik (Wikipedia Entry)] [[Satoshi client]] core developer, GPU poold software and the founder of [[Bitcoin Watch]]. Works as a Linux kernel developer at Red Hat,&lt;br /&gt;
&lt;br /&gt;
[[Luke Dashjr]] aka Luke-Jr- [[Eligius]] owner/admin, maintains [[BFGMiner]] and maintainer of [[bitcoind]]/[[Bitcoin-Qt]] stable branches.&lt;br /&gt;
&lt;br /&gt;
[[Mark Karpeles]] aka MagicalTux- Owner of the largest Bitcoin exchange, [[MtGox]], this Bitcoin Wiki, and [https://www.kalyhost.com/ Kalyhost]&lt;br /&gt;
&lt;br /&gt;
[[Sirius|Martti Malmi]] aka Sirius- Operates the host for bitcoin.org and is an administrator of the [[Bitcoin Forum]].&lt;br /&gt;
&lt;br /&gt;
[[Matt Corallo]] aka BlueMatt- [[Satoshi client]] developer.&lt;br /&gt;
&lt;br /&gt;
[[Michael Hendrix]] aka mndrix- creator of the now defunct CoinPal and CoinCard services&lt;br /&gt;
&lt;br /&gt;
[[Michael Marquardt]] aka theymos- creator of the widely used blockexplorer.com site, and BitcoinTalk Forum&lt;br /&gt;
&lt;br /&gt;
[[Mike Hearn]] [https://profiles.google.com/mh.in.england/about (Profile)]- Google engineer who works on Gmail and developed [[BitCoinJ]] (http://code.google.com/p/bitcoinj/)&lt;br /&gt;
&lt;br /&gt;
[[User:Tcatm|Nils Schneider]] aka tcatm - Bitcoin developer, owner of BitcoinWatch, creator and owner of BitcoinCharts, GPU mining software and JS web interface.&lt;br /&gt;
&lt;br /&gt;
[[Patrick McFarland]] aka Diablo-D3 - DiabloMiner author, and BitcoinTalk forum moderator.&lt;br /&gt;
&lt;br /&gt;
[[Patrick Strateman]] aka phantomcircuit - Bitcoin developer, creator of [[Intersango]], member of [[Bitcoin Consultancy]] and creator of Python Bitcoin implementation.&lt;br /&gt;
&lt;br /&gt;
[[Pieter Wuille]] aka sipa- [[Satoshi client]] developer and maintainer of the network graphs http://bitcoin.sipa.be&lt;br /&gt;
&lt;br /&gt;
[[Stefan Thomas]] aka justmoon- creator of the WeUseCoins.com site/video and WebCoin.&lt;br /&gt;
&lt;br /&gt;
[[Tamas Blummer]] aka grau - author of Bits of Proof, the enterprise-ready implementation of the Bitcoin protocol. http://bitsofproof.com&lt;br /&gt;
&lt;br /&gt;
[[Vladimir Marchenko]]- [https://profiles.google.com/u/0/vmartchenko/about?hl=en Profile], runs [[Marchenko Ltd]] which sells mining contracts, previously developed the figator.org search engine.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Original client developers]]&lt;br /&gt;
* [[Developers]]&lt;br /&gt;
* Wiki list of [[:Special:ListUsers|users]]&lt;br /&gt;
* [[Bitcoin:Community_portal|Community portal]]&lt;br /&gt;
* [[:Category:People]]&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BCCAPI&amp;diff=37620</id>
		<title>BCCAPI</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BCCAPI&amp;diff=37620"/>
		<updated>2013-05-07T15:46:13Z</updated>

		<summary type="html">&lt;p&gt;Grau: /* See Also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The BCCAPI (Bitcoin Client API) is a java library designed for making secure light-weight bitcoin clients. The BCCAPI connects to a server that holds the block chain, and which tracks the client’s wallet balance. The server only has knowledge of the clients public keys, and is in no position to spend funds owned by the client’s wallet.&lt;br /&gt;
&lt;br /&gt;
Features include:&lt;br /&gt;
* Deterministic private keys, based on seed file.&lt;br /&gt;
* Only the seed file needs to get backed up, or generated from a passphrase.&lt;br /&gt;
* Send/receive Bitcoins&lt;br /&gt;
* Low bandwidth&lt;br /&gt;
* Low CPU usage&lt;br /&gt;
* Server does not have your private keys and is in no position to spend your coins&lt;br /&gt;
* Allows spending of unconfirmed-change-sent-back-to-self like the Satoshi Client&lt;br /&gt;
* Open source&lt;br /&gt;
* Free service, running on donations&lt;br /&gt;
&lt;br /&gt;
Simply put the API is designed for making it easy to create light-weight secure Bitcoin wallets for handheld devices.&lt;br /&gt;
[https://market.android.com/details?id=com.miracleas.bitcoin_spinner BitcoinSpinner] is an Android app implemented on top of the BCCAPI and available on the Android Market.&lt;br /&gt;
&lt;br /&gt;
The sources include a very simple console based client, that shows how to use it. &lt;br /&gt;
&lt;br /&gt;
The donation address for BCCAPI is 143SikKpjzwhBy5Z7Qg5knu5nKXWExSqQi&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
See [[Thin Client Security]]&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
The first Android wallet based on the BCCAPI: [[BitcoinSpinner]]&lt;br /&gt;
&lt;br /&gt;
More information and the source code: http://code.google.com/p/bccapi/wiki/WhatIsTheBCCAPI&lt;br /&gt;
&lt;br /&gt;
Forum thread about BCCAPI: https://bitcointalk.org/index.php?topic=36892.0&lt;br /&gt;
&lt;br /&gt;
BCCAPI Adapter for bits of proof Enterprise Bitcoin Server  https://github.com/bitsofproof/bop-bccapi&lt;br /&gt;
&lt;br /&gt;
[[Category:Clients]]&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Protocol_documentation&amp;diff=37077</id>
		<title>Protocol documentation</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Protocol_documentation&amp;diff=37077"/>
		<updated>2013-04-16T09:16:19Z</updated>

		<summary type="html">&lt;p&gt;Grau: /* version */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sources:&lt;br /&gt;
* [[Original Bitcoin client]] source&lt;br /&gt;
&lt;br /&gt;
Type names used in this documentation are from the C99 standard.&lt;br /&gt;
&lt;br /&gt;
For protocol used in mining, see [[Getwork]].&lt;br /&gt;
&lt;br /&gt;
==Common standards==&lt;br /&gt;
&lt;br /&gt;
=== Hashes ===&lt;br /&gt;
&lt;br /&gt;
Usually, when a hash is computed within bitcoin, it is computed twice. Most of the time [http://en.wikipedia.org/wiki/SHA-2 SHA-256] hashes are used, however [http://en.wikipedia.org/wiki/RIPEMD RIPEMD-160] is also used when a shorter hash is desirable (for example when creating a bitcoin address).&lt;br /&gt;
&lt;br /&gt;
Example of double-SHA-256 encoding of string &amp;quot;hello&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 hello&lt;br /&gt;
 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 (first round of sha-256)&lt;br /&gt;
 9595c9df90075148eb06860365df33584b75bff782a510c6cd4883a419833d50 (second round of sha-256)&lt;br /&gt;
&lt;br /&gt;
For bitcoin addresses (RIPEMD-160) this would give:&lt;br /&gt;
&lt;br /&gt;
 hello&lt;br /&gt;
 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 (first round is sha-256)&lt;br /&gt;
 b6a9c8c230722b7c748331a8b450f05566dc7d0f (with ripemd-160)&lt;br /&gt;
&lt;br /&gt;
=== Merkle Trees ===&lt;br /&gt;
&lt;br /&gt;
Merkle trees are binary trees of hashes. Merkle trees in bitcoin use a &#039;&#039;&#039;double&#039;&#039;&#039; SHA-256, the SHA-256 hash of the SHA-256 hash of something.&lt;br /&gt;
&lt;br /&gt;
If, when forming a row in the tree (other than the root of the tree), it would have an odd number of elements, the final double-hash is duplicated to ensure that the row has an even number of hashes.&lt;br /&gt;
&lt;br /&gt;
First form the bottom row of the tree with the ordered double-SHA-256 hashes of the byte streams of the transactions in the block.&lt;br /&gt;
&lt;br /&gt;
Then the row above it consists of half that number of hashes.  Each entry is the double-SHA-256 of the 64-byte concatenation of the corresponding two hashes below it in the tree.&lt;br /&gt;
&lt;br /&gt;
This procedure repeats recursively until we reach a row consisting of just a single double-hash.  This is the &#039;&#039;&#039;merkle root&#039;&#039;&#039; of the tree.&lt;br /&gt;
&lt;br /&gt;
For example, imagine a block with three transactions &#039;&#039;a&#039;&#039;, &#039;&#039;b&#039;&#039; and &#039;&#039;c&#039;&#039;.   The merkle tree is: &lt;br /&gt;
&lt;br /&gt;
 d6=dhash(d4 concat d5)&lt;br /&gt;
 d4=dhash(d1 concat d2) d5=dhash(d3 concat d3)&lt;br /&gt;
 d1=dhash(a) d2=dhash(b) d3=dhash(c) d3=dhash(c)&lt;br /&gt;
&lt;br /&gt;
where&lt;br /&gt;
 &lt;br /&gt;
 dhash(a) = sha256(sha256(a))&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;d6&#039;&#039; is the merkle root of the 3 transactions in this block.&lt;br /&gt;
&lt;br /&gt;
Note: Hashes in Merkle Tree displayed in the [[Block Explorer]] are of little-endian notation. For some implementations and [http://www.fileformat.info/tool/hash.htm calculations], the bits need to be reversed before they are hashed, and again after the hashing operation.&lt;br /&gt;
&lt;br /&gt;
=== Signatures ===&lt;br /&gt;
&lt;br /&gt;
Bitcoin uses [http://en.wikipedia.org/wiki/Elliptic_curve_cryptography Elliptic Curve] [http://en.wikipedia.org/wiki/Digital_Signature_Algorithm Digital Signature Algorithm] ([http://en.wikipedia.org/wiki/Elliptic_Curve_DSA ECDSA]) to sign transactions. &lt;br /&gt;
&lt;br /&gt;
For ECDSA the secp256k1 curve from http://www.secg.org/collateral/sec2_final.pdf is used.&lt;br /&gt;
&lt;br /&gt;
Public keys (in scripts) are given as 04 &amp;lt;x&amp;gt; &amp;lt;y&amp;gt; where &#039;&#039;x&#039;&#039; and &#039;&#039;y&#039;&#039; are 32 byte big-endian integers representing the coordinates of a point on the curve or in compressed form given as &amp;lt;sign&amp;gt; &amp;lt;x&amp;gt; where &amp;lt;sign&amp;gt; is 0x02 if &#039;&#039;y&#039;&#039; is even and 0x03 if &#039;&#039;y&#039;&#039; is odd.&lt;br /&gt;
&lt;br /&gt;
Signatures use [http://en.wikipedia.org/wiki/Distinguished_Encoding_Rules DER encoding] to pack the &#039;&#039;r&#039;&#039; and &#039;&#039;s&#039;&#039; components into a single byte stream (this is also what OpenSSL produces by default).&lt;br /&gt;
&lt;br /&gt;
=== Transaction Verification ===&lt;br /&gt;
Transactions are cryptographically signed records that reassign ownership of Bitcoins to new addresses.  Transactions have &#039;&#039;inputs&#039;&#039; - records which reference the funds from other previous transactions - and &#039;&#039;outputs&#039;&#039; - records which determine the new owner of the transferred Bitcoins, and which will be referenced as inputs in future transactions as those funds are respent.&lt;br /&gt;
&lt;br /&gt;
Each &#039;&#039;input&#039;&#039; must have a cryptographic digital signature that unlocks the funds from the prior transaction.  Only the person possessing the appropriate [[private key]] is able to create a satisfactory signature; this in effect ensures that funds can only be spent by their owners.&lt;br /&gt;
&lt;br /&gt;
Each &#039;&#039;output&#039;&#039; determines which Bitcoin address (or other criteria, see [[Scripting]]) is the recipient of the funds.&lt;br /&gt;
&lt;br /&gt;
In a transaction, the sum of all inputs must be equal to or greater than the sum of all outputs.  If the inputs exceed the outputs, the difference is considered a [[transaction fee]], and is redeemable by whoever first includes the transaction into the block chain.&lt;br /&gt;
&lt;br /&gt;
A special kind of transaction, called a [[coinbase transaction]], has no inputs.  It is created by [[miners]], and there is one coinbase transaction per block.  Because each block comes with a reward of newly created Bitcoins (e.g. 50 BTC for the first 210,000 blocks), the first transaction of a block is, with few exceptions, the transaction that grants those coins to their recipient (the miner).  In addition to the newly created Bitcoins, the coinbase transaction is also used for assigning the recipient of any transaction fees that were paid within the other transactions being included in the same block.  The coinbase transaction can assign the entire reward to a single Bitcoin address, or split it in portions among multiple addresses, just like any other transaction.  Coinbase transactions always contain outputs totaling the sum of the block reward plus all transaction fees collected from the other transactions in the same block.&lt;br /&gt;
&lt;br /&gt;
The [[coinbase transaction]] in block zero cannot be spent. This is due to a quirk of the reference client implementation that would open the potential for a block chain fork if some nodes accepted the spend and others did not&amp;lt;ref&amp;gt;[http://bitcointalk.org/index.php?topic=119645.msg1288552#msg1288552 Block 0 Network Fork]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Most Bitcoin outputs encumber the newly transferred coins with a single ECDSA private key.  The actual record saved with inputs and outputs isn&#039;t necessarily a key, but a &#039;&#039;script&#039;&#039;.  Bitcoin uses an interpreted scripting system to determine whether an output&#039;s criteria have been satisfied, with which more complex operations are possible, such as outputs that require two ECDSA signatures, or two-of-three-signature schemes.  An output that references a single Bitcoin address is a &#039;&#039;typical&#039;&#039; output; an output actually contains this information in the form of a script that requires a single ECDSA signature (see [[OP_CHECKSIG]]).  The output script specifies what must be provided to unlock the funds later, and when the time comes in the future to spend the transaction in another input, that input must provide all of the thing(s) that satisfy the requirements defined by the original output script.&lt;br /&gt;
&lt;br /&gt;
=== Addresses ===&lt;br /&gt;
&lt;br /&gt;
A bitcoin address is in fact the hash of a ECDSA public key, computed this way:&lt;br /&gt;
&lt;br /&gt;
 Version = 1 byte of 0 (zero); on the test network, this is 1 byte of 111&lt;br /&gt;
 Key hash = Version concatenated with RIPEMD-160(SHA-256(public key))&lt;br /&gt;
 Checksum = 1st 4 bytes of SHA-256(SHA-256(Key hash))&lt;br /&gt;
 Bitcoin Address = Base58Encode(Key hash concatenated with Checksum)&lt;br /&gt;
&lt;br /&gt;
The Base58 encoding used is home made, and has some differences. Especially, leading zeroes are kept as single zeroes when conversion happens.&lt;br /&gt;
&lt;br /&gt;
== Common structures ==&lt;br /&gt;
&lt;br /&gt;
Almost all integers are encoded in little endian. Only IP or port number are encoded big endian.&lt;br /&gt;
&lt;br /&gt;
=== Message structure ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 4 || magic || uint32_t || Magic value indicating message origin network, and used to seek to next message when stream state is unknown&lt;br /&gt;
|-&lt;br /&gt;
| 12 || command || char[12] || ASCII string identifying the packet content, NULL padded (non-NULL padding results in packet rejected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || length || uint32_t || Length of payload in number of bytes&lt;br /&gt;
|-&lt;br /&gt;
| 4 || checksum || uint32_t || First 4 bytes of sha256(sha256(payload))&lt;br /&gt;
|-&lt;br /&gt;
| ? || payload || uchar[] || The actual data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Known magic values:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Network !! Magic value !! Sent over wire as&lt;br /&gt;
|-&lt;br /&gt;
| main || 0xD9B4BEF9 || F9 BE B4 D9&lt;br /&gt;
|-&lt;br /&gt;
| testnet || 0xDAB5BFFA || FA BF B5 DA&lt;br /&gt;
|-&lt;br /&gt;
| testnet3 || 0x0709110B || 0B 11 09 07&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variable length integer ===&lt;br /&gt;
&lt;br /&gt;
Integer can be encoded depending on the represented value to save space.&lt;br /&gt;
Variable length integers always precede an array/vector of a type of data that may vary in length.&lt;br /&gt;
Longer numbers are encoded in little endian.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Storage length !! Format&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt; 0xfd || 1 || uint8_t&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;= 0xffff || 3 || 0xfd followed by the length as uint16_t&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;= 0xffffffff || 5 || 0xfe followed by the length as uint32_t&lt;br /&gt;
|-&lt;br /&gt;
| - || 9 || 0xff followed by the length as uint64_t&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Footnote - if you&#039;re reading the Satoshi client code it refers to this as a &amp;quot;CompactSize&amp;quot; - VarInt&#039;s are something entirely different to the Satoshi code.&lt;br /&gt;
&lt;br /&gt;
=== Variable length string ===&lt;br /&gt;
&lt;br /&gt;
Variable length string can be stored using a variable length integer followed by the string itself.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| ? || length || [[Protocol_specification#Variable_length_integer|var_int]] || Length of the string&lt;br /&gt;
|-&lt;br /&gt;
| ? || string || char[] || The string itself (can be empty)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Network address ===&lt;br /&gt;
&lt;br /&gt;
When a network address is needed somewhere, this structure is used.  This protocol and structure supports IPv6, &#039;&#039;&#039;but note that the original client currently only supports IPv4 networking&#039;&#039;&#039;. Network addresses are not prefixed with a timestamp in the version message.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 4 || time || uint32 || the Time (version &amp;gt;= 31402)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || services || uint64_t || same service(s) listed in [[#version|version]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || IPv6/4 || char[16] || IPv6 address. Network byte order. The original client only supports IPv4 and only reads the last 4 bytes to get the IPv4 address. However, the IPv4 address is written into the message as a 16 byte [http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses IPv4-mapped IPv6 address]&lt;br /&gt;
(12 bytes &#039;&#039;00 00 00 00  00 00 00 00  00 00 FF FF&#039;&#039;, followed by the 4 bytes of the IPv4 address).&lt;br /&gt;
|-&lt;br /&gt;
| 2 || port || uint16_t || port number, network byte order&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Hexdump example of Network address structure&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0000   01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................&lt;br /&gt;
0010   00 00 FF FF 0A 00 00 01  20 8D                    ........ .&lt;br /&gt;
&lt;br /&gt;
Network address:&lt;br /&gt;
 01 00 00 00 00 00 00 00                         - 1 (NODE_NETWORK: see services listed under version command)&lt;br /&gt;
 00 00 00 00 00 00 00 00 00 00 FF FF 0A 00 00 01 - IPv6: ::ffff:10.0.0.1 or IPv4: 10.0.0.1&lt;br /&gt;
 20 8D                                           - Port 8333&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inventory Vectors ===&lt;br /&gt;
&lt;br /&gt;
Inventory vectors are used for notifying other nodes about objects they have or data which is being requested.&lt;br /&gt;
&lt;br /&gt;
Inventory vectors consist of the following data format:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 4 || type || uint32_t || Identifies the object type linked to this inventory&lt;br /&gt;
|-&lt;br /&gt;
| 32 || hash || char[32] || Hash of the object&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The object type is currently defined as one of the following possibilities:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ERROR || Any data of with this number may be ignored&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MSG_TX || Hash is related to a transaction&lt;br /&gt;
|-&lt;br /&gt;
| 2 || MSG_BLOCK || Hash is related to a data block&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Other Data Type values are considered reserved for future implementations.&lt;br /&gt;
&lt;br /&gt;
=== Block Headers ===&lt;br /&gt;
&lt;br /&gt;
Block headers are sent in a headers packet in response to a getheaders message.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 4 || version || uint32_t || Block version information, based upon the software version creating this block&lt;br /&gt;
|-&lt;br /&gt;
| 32 || prev_block || char[32] || The hash value of the previous block this particular block references&lt;br /&gt;
|-&lt;br /&gt;
| 32 || merkle_root || char[32] || The reference to a Merkle tree collection which is a hash of all transactions related to this block&lt;br /&gt;
|-&lt;br /&gt;
| 4 || timestamp || uint32_t || A timestamp recording when this block was created (Limited to 2106!)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || bits || uint32_t || The calculated difficulty target being used for this block&lt;br /&gt;
|-&lt;br /&gt;
| 4 || nonce || uint32_t || The nonce used to generate this block… to allow variations of the header and compute different hashes&lt;br /&gt;
|-&lt;br /&gt;
| 1 || txn_count || uint8_t || Number of transaction entries, this value is always 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Message types ==&lt;br /&gt;
&lt;br /&gt;
=== version ===&lt;br /&gt;
&lt;br /&gt;
When a node creates an outgoing connection, it will immediately [[Version Handshake|advertise]] its version. The remote node will respond with its version. No futher communication is possible until both peers have exchanged their version.&lt;br /&gt;
&lt;br /&gt;
Payload:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 4 || version || int32_t || Identifies protocol version being used by the node&lt;br /&gt;
|-&lt;br /&gt;
| 8 || services || uint64_t || bitfield of features to be enabled for this connection&lt;br /&gt;
|-&lt;br /&gt;
| 8 || timestamp || int64_t || standard UNIX timestamp in seconds&lt;br /&gt;
|-&lt;br /&gt;
| 26 || addr_recv || net_addr || The network address of the node receiving this message&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| version &amp;gt;= 106&lt;br /&gt;
|-&lt;br /&gt;
| 26 || addr_from || net_addr || The network address of the node emitting this message&lt;br /&gt;
|-&lt;br /&gt;
| 8 || nonce || uint64_t || Node random nonce, randomly generated every time a version packet is sent. This nonce is used to detect connections to self.&lt;br /&gt;
|-&lt;br /&gt;
| ? || user_agent || [[#Variable length string|var_str]] || [[BIP_0014|User Agent]] (0x00 if string is 0 bytes long)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || start_height || int32_t || The last block received by the emitting node&lt;br /&gt;
|-&lt;br /&gt;
| 1 || relay || bool || Whether the remote peer should announce relayed transactions or not, see [[BIP 0037]], since version &amp;gt;= 70001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;verack&amp;quot; packet shall be sent if the version packet was accepted.&lt;br /&gt;
&lt;br /&gt;
The following services are currently assigned:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 1 || NODE_NETWORK || This node can be asked for full blocks instead of just headers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Hexdump example of version message (OBSOLETE EXAMPLE. This example lacks a checksum and user-agent):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0000   F9 BE B4 D9 76 65 72 73  69 6F 6E 00 00 00 00 00   ....version.....&lt;br /&gt;
0010   55 00 00 00 9C 7C 00 00  01 00 00 00 00 00 00 00   U....|..........&lt;br /&gt;
0020   E6 15 10 4D 00 00 00 00  01 00 00 00 00 00 00 00   ...M............&lt;br /&gt;
0030   00 00 00 00 00 00 00 00  00 00 FF FF 0A 00 00 01   ................&lt;br /&gt;
0040   20 8D 01 00 00 00 00 00  00 00 00 00 00 00 00 00   ................&lt;br /&gt;
0050   00 00 00 00 FF FF 0A 00  00 02 20 8D DD 9D 20 2C   .......... ... ,&lt;br /&gt;
0060   3A B4 57 13 00 55 81 01  00                        :.W..U...&lt;br /&gt;
&lt;br /&gt;
Message header:&lt;br /&gt;
 F9 BE B4 D9                                                                   - Main network magic bytes&lt;br /&gt;
 76 65 72 73 69 6F 6E 00 00 00 00 00                                           - &amp;quot;version&amp;quot; command&lt;br /&gt;
 55 00 00 00                                                                   - Payload is 85 bytes long&lt;br /&gt;
                                                                               - No checksum in version message until 20 February 2012. See https://bitcointalk.org/index.php?topic=55852.0&lt;br /&gt;
Version message:&lt;br /&gt;
 9C 7C 00 00                                                                   - 31900 (version 0.3.19)&lt;br /&gt;
 01 00 00 00 00 00 00 00                                                       - 1 (NODE_NETWORK services)&lt;br /&gt;
 E6 15 10 4D 00 00 00 00                                                       - Mon Dec 20 21:50:14 EST 2010&lt;br /&gt;
 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF 0A 00 00 01 20 8D - Recipient address info - see Network Address&lt;br /&gt;
 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF 0A 00 00 02 20 8D - Sender address info - see Network Address&lt;br /&gt;
 DD 9D 20 2C 3A B4 57 13                                                       - Node random unique ID&lt;br /&gt;
 00                                                                            - &amp;quot;&amp;quot; sub-version string (string is 0 bytes long)&lt;br /&gt;
 55 81 01 00                                                                   - Last block sending node has is block #98645&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And here&#039;s a modern (60002) protocol version client advertising itself to a local peer...&lt;br /&gt;
&lt;br /&gt;
Newer protocol includes the checksum now, this is from a mainline (satoshi) client during &lt;br /&gt;
an outgoing connection to another local client, notice that it does not fill out the &lt;br /&gt;
address information at all when the source or destination is &amp;quot;unroutable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
0000   f9 be b4 d9 76 65 72 73 69 6f 6e 00 00 00 00 00  ....version.....&lt;br /&gt;
0010   64 00 00 00 35 8d 49 32 62 ea 00 00 01 00 00 00  d...5.I2b.......&lt;br /&gt;
0020   00 00 00 00 11 b2 d0 50 00 00 00 00 01 00 00 00  .......P........&lt;br /&gt;
0030   00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff  ................&lt;br /&gt;
0040   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................&lt;br /&gt;
0050   00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 00  ................&lt;br /&gt;
0060   3b 2e b3 5d 8c e6 17 65 0f 2f 53 61 74 6f 73 68  ;..]...e./Satosh&lt;br /&gt;
0070   69 3a 30 2e 37 2e 32 2f c0 3e 03 00              i:0.7.2/.&amp;gt;..&lt;br /&gt;
&lt;br /&gt;
Message Header:&lt;br /&gt;
 F9 BE B4 D9                                                                   - Main network magic bytes&lt;br /&gt;
 76 65 72 73 69 6F 6E 00 00 00 00 00                                           - &amp;quot;version&amp;quot; command&lt;br /&gt;
 64 00 00 00                                                                   - Payload is 100 bytes long&lt;br /&gt;
 35 8D 49 32                                                                   - payload checksum&lt;br /&gt;
&lt;br /&gt;
Version message:&lt;br /&gt;
 62 EA 00 00                                                                   - 60002 (protocol version 60002)&lt;br /&gt;
 01 00 00 00 00 00 00 00                                                       - 1 (NODE_NETWORK services)&lt;br /&gt;
 11 B2 D0 50 00 00 00 00                                                       - Tue Dec 18 10:12:33 PST 2012&lt;br /&gt;
 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF 00 00 00 00 00 00 - Recipient address info - see Network Address&lt;br /&gt;
 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF 00 00 00 00 00 00 - Sender address info - see Network Address&lt;br /&gt;
 3B 2E B3 5D 8C E6 17 65                                                       - Node ID&lt;br /&gt;
 0F 2F 53 61 74 6F 73 68 69 3A 30 2E 37 2E 32 2F                               - &amp;quot;/Satoshi:0.7.2/&amp;quot; sub-version string (string is 15 bytes long)&lt;br /&gt;
 C0 3E 03 00                                                                   - Last block sending node has is block #212672&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== verack ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;verack&#039;&#039; message is sent in reply to &#039;&#039;version&#039;&#039;.  This message consists of only a [[#Message structure|message header]] with the command string &amp;quot;verack&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Hexdump of the verack message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0000   F9 BE B4 D9 76 65 72 61  63 6B 00 00 00 00 00 00   ....verack......&lt;br /&gt;
0010   00 00 00 00 5D F6 E0 E2                            ........&lt;br /&gt;
&lt;br /&gt;
Message header:&lt;br /&gt;
 F9 BE B4 D9                          - Main network magic bytes&lt;br /&gt;
 76 65 72 61  63 6B 00 00 00 00 00 00 - &amp;quot;verack&amp;quot; command&lt;br /&gt;
 00 00 00 00                          - Payload is 0 bytes long&lt;br /&gt;
 5D F6 E0 E2                          - Checksum&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== addr ===&lt;br /&gt;
&lt;br /&gt;
Provide information on known nodes of the network. Non-advertised nodes should be forgotten after typically 3 hours&lt;br /&gt;
&lt;br /&gt;
Payload:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 1+ || count || [[Protocol_specification#Variable_length_integer|var_int]] || Number of address entries (max: 1000)&lt;br /&gt;
|-&lt;br /&gt;
| 30x? || addr_list || (uint32_t + net_addr)[] || Address of other nodes on the network. version &amp;lt; 209 will only read the first one. The uint32_t is a timestamp (see note below).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: Starting version 31402, addresses are prefixed with a timestamp. If no timestamp is present, the addresses should not be relayed to other peers, unless it is indeed confirmed they are up.&lt;br /&gt;
&lt;br /&gt;
Hexdump example of &#039;&#039;addr&#039;&#039; message:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0000   F9 BE B4 D9 61 64 64 72  00 00 00 00 00 00 00 00   ....addr........&lt;br /&gt;
0010   1F 00 00 00 ED 52 39 9B  01 E2 15 10 4D 01 00 00   .....R9.....M...&lt;br /&gt;
0020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 FF   ................&lt;br /&gt;
0030   FF 0A 00 00 01 20 8D                               ..... .&lt;br /&gt;
&lt;br /&gt;
Message Header:&lt;br /&gt;
 F9 BE B4 D9                                     - Main network magic bytes&lt;br /&gt;
 61 64 64 72  00 00 00 00 00 00 00 00            - &amp;quot;addr&amp;quot;&lt;br /&gt;
 1F 00 00 00                                     - payload is 31 bytes long&lt;br /&gt;
 ED 52 39 9B                                     - checksum of payload&lt;br /&gt;
&lt;br /&gt;
Payload:&lt;br /&gt;
 01                                              - 1 address in this message&lt;br /&gt;
&lt;br /&gt;
Address:&lt;br /&gt;
 E2 15 10 4D                                     - Mon Dec 20 21:50:10 EST 2010 (only when version is &amp;gt;= 31402)&lt;br /&gt;
 01 00 00 00 00 00 00 00                         - 1 (NODE_NETWORK service - see version message)&lt;br /&gt;
 00 00 00 00 00 00 00 00 00 00 FF FF 0A 00 00 01 - IPv4: 10.0.0.1, IPv6: ::ffff:10.0.0.1 (IPv4-mapped IPv6 address)&lt;br /&gt;
 20 8D                                           - port 8333&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== inv ===&lt;br /&gt;
&lt;br /&gt;
Allows a node to advertise its knowledge of one or more objects. It can be received unsolicited, or in reply to &#039;&#039;getblocks&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Payload (maximum payload length: 1.8 Megabytes or 50000 entries):&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| ? || count || [[Protocol_specification#Variable_length_integer|var_int]] || Number of inventory entries&lt;br /&gt;
|-&lt;br /&gt;
| 36x? || inventory || [[Protocol specification#Inventory Vectors|inv_vect]][] || Inventory vectors&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== getdata ===&lt;br /&gt;
&lt;br /&gt;
getdata is used in response to inv, to retrieve the content of a specific object, and is usually sent after receiving an &#039;&#039;inv&#039;&#039; packet, after filtering known elements. It can be used to retrieve transactions, but only if they are in the memory pool or relay set - arbitrary access to transactions in the chain is not allowed to avoid having clients start to depend on nodes having full transaction indexes (which modern nodes do not).&lt;br /&gt;
&lt;br /&gt;
Payload (maximum payload length: 1.8 Megabytes or 50000 entries):&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| ? || count || [[Protocol_specification#Variable_length_integer|var_int]] || Number of inventory entries&lt;br /&gt;
|-&lt;br /&gt;
| 36x? || inventory || [[Protocol specification#Inventory Vectors|inv_vect]][] || Inventory vectors&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== notfound ===&lt;br /&gt;
&lt;br /&gt;
notfound is a response to a getdata, sent if any requested data items could not be relayed, for example, because the requested transaction was not in the memory pool or relay set.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| ? || count || [[Protocol_specification#Variable_length_integer|var_int]] || Number of inventory entries&lt;br /&gt;
|-&lt;br /&gt;
| 36x? || inventory || [[Protocol specification#Inventory Vectors|inv_vect]][] || Inventory vectors&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== getblocks ===&lt;br /&gt;
&lt;br /&gt;
Return an &#039;&#039;inv&#039;&#039; packet containing the list of blocks starting right after the last known hash in the block locator object, up to hash_stop or 500 blocks, whichever comes first. To receive the next blocks hashes, one needs to issue getblocks again with a new block locator object. Keep in mind that some clients (specifically the Satoshi client) will gladly provide blocks which are invalid if the block locator object contains a hash on the invalid branch.&lt;br /&gt;
&lt;br /&gt;
Payload:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 4 || version || uint32_t || the protocol version&lt;br /&gt;
|-&lt;br /&gt;
| 1+ || hash count || [[Protocol_specification#Variable_length_integer|var_int]] || number of block locator hash entries&lt;br /&gt;
|-&lt;br /&gt;
| 32+ || block locator hashes || char[32] || block locator object; newest back to genesis block (dense to start, but then sparse)&lt;br /&gt;
|-&lt;br /&gt;
| 32 || hash_stop || char[32] || hash of the last desired block; set to zero to get as many blocks as possible (500)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
To create the block locator hashes, keep pushing hashes until you go back to the genesis block. After pushing 10 hashes back, the step backwards doubles every loop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// From libbitcoin which is under AGPL&lt;br /&gt;
std::vector&amp;lt;size_t&amp;gt; block_locator_indices(int top_depth)&lt;br /&gt;
{&lt;br /&gt;
    // Start at max_depth&lt;br /&gt;
    std::vector&amp;lt;size_t&amp;gt; indices;&lt;br /&gt;
    // Push last 10 indices first&lt;br /&gt;
    size_t step = 1, start = 0;&lt;br /&gt;
    for (int i = top_depth; i &amp;gt; 0; i -= step, ++start)&lt;br /&gt;
    {&lt;br /&gt;
        if (start &amp;gt;= 10)&lt;br /&gt;
            step *= 2;&lt;br /&gt;
        indices.push_back(i);&lt;br /&gt;
    }&lt;br /&gt;
    indices.push_back(0);&lt;br /&gt;
    return indices;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that it is allowed to send in fewer known hashes down to a minimum of just one hash. However, the purpose of the block locator object is to detect a wrong branch in the caller&#039;s main chain. If the peer detects that you are off the main chain, it will send in block hashes which are earlier than your last known block. So if you just send in your last known hash and it is off the main chain, the peer starts over at block #1.&lt;br /&gt;
&lt;br /&gt;
=== getheaders ===&lt;br /&gt;
&lt;br /&gt;
Return a &#039;&#039;headers&#039;&#039; packet containing the headers of blocks starting right after the last known hash in the block locator object, up to hash_stop or 2000 blocks, whichever comes first. To receive the next block headers, one needs to issue getheaders again with a new block locator object. The &#039;&#039;getheaders&#039;&#039; command is used by thin clients to quickly download the blockchain where the contents of the transactions would be irrelevant (because they are not ours). Keep in mind that some clients (specifically the Satoshi client) will gladly provide headers of blocks which are invalid if the block locator object contains a hash on the invalid branch.&lt;br /&gt;
&lt;br /&gt;
Payload:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 4 || version || uint32_t || the protocol version&lt;br /&gt;
|-&lt;br /&gt;
| 1+ || hash count || [[Protocol_specification#Variable_length_integer|var_int]] || number of block locator hash entries&lt;br /&gt;
|-&lt;br /&gt;
| 32+ || block locator hashes || char[32] || block locator object; newest back to genesis block (dense to start, but then sparse)&lt;br /&gt;
|-&lt;br /&gt;
| 32 || hash_stop || char[32] || hash of the last desired block header; set to zero to get as many blocks as possible (2000)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the block locator object in this packet, the same rules apply as for the [[Protocol_specification#getblocks|getblocks]] packet.&lt;br /&gt;
&lt;br /&gt;
=== tx ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;tx&#039;&#039; describes a bitcoin transaction, in reply to &#039;&#039;getdata&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 4 || version || uint32_t || Transaction data format version&lt;br /&gt;
|-&lt;br /&gt;
| 1+ || tx_in count || [[Protocol_specification#Variable_length_integer|var_int]] || Number of Transaction inputs&lt;br /&gt;
|-&lt;br /&gt;
| 41+ || tx_in || tx_in[] || A list of 1 or more transaction inputs or sources for coins&lt;br /&gt;
|-&lt;br /&gt;
| 1+ || tx_out count || [[Protocol_specification#Variable_length_integer|var_int]] || Number of Transaction outputs&lt;br /&gt;
|-&lt;br /&gt;
| 8+ || tx_out || tx_out[] || A list of 1 or more transaction outputs or destinations for coins&lt;br /&gt;
|-&lt;br /&gt;
| 4 || lock_time || uint32_t || The block number or timestamp at which this transaction is locked:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Always locked&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt; 500000000  || Block number at which this transaction is locked&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;= 500000000 || UNIX timestamp at which this transaction is locked&lt;br /&gt;
|}&lt;br /&gt;
If all TxIn inputs have final (0xffffffff) sequence numbers then lock_time is irrelevant. Otherwise, the transaction may not be added to a block until after lock_time.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TxIn consists of the following fields:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 36 || previous_output || outpoint || The previous output transaction reference, as an OutPoint structure&lt;br /&gt;
|-&lt;br /&gt;
| 1+ || script length || [[Protocol_specification#Variable_length_integer|var_int]] || The length of the signature script&lt;br /&gt;
|-&lt;br /&gt;
| ? || signature script || uchar[] || Computational Script for confirming transaction authorization&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [http://bitcoin.stackexchange.com/q/2025/323 sequence] || uint32_t || Transaction version as defined by the sender. Intended for &amp;quot;replacement&amp;quot; of transactions when information is updated before inclusion into a block.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The OutPoint structure consists of the following fields:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 32 || hash || char[32] || The hash of the referenced transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || index || uint32_t || The index of the specific output in the transaction. The first output is 0, etc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Script structure consists of a series of pieces of information and operations related to the value of the transaction.&lt;br /&gt;
&lt;br /&gt;
(Structure to be expanded in the future… see script.h and script.cpp and [[Script]] for more information)&lt;br /&gt;
&lt;br /&gt;
The TxOut structure consists of the following fields:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 8 || value || int64_t || Transaction Value&lt;br /&gt;
|-&lt;br /&gt;
| 1+ || pk_script length || [[Protocol_specification#Variable_length_integer|var_int]] || Length of the pk_script&lt;br /&gt;
|-&lt;br /&gt;
| ? || pk_script || uchar[] || Usually contains the public key as a Bitcoin script setting up conditions to claim this output.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example &#039;&#039;tx&#039;&#039; message:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
000000	F9 BE B4 D9 74 78 00 00  00 00 00 00 00 00 00 00   ....tx..........&lt;br /&gt;
000010	02 01 00 00 E2 93 CD BE  01 00 00 00 01 6D BD DB   .............m..&lt;br /&gt;
000020	08 5B 1D 8A F7 51 84 F0  BC 01 FA D5 8D 12 66 E9   .[...Q........f.&lt;br /&gt;
000030	B6 3B 50 88 19 90 E4 B4  0D 6A EE 36 29 00 00 00   .;P......j.6)...&lt;br /&gt;
000040	00 8B 48 30 45 02 21 00  F3 58 1E 19 72 AE 8A C7   ..H0E.!..X..r...&lt;br /&gt;
000050	C7 36 7A 7A 25 3B C1 13  52 23 AD B9 A4 68 BB 3A   .6zz%;..R#...h.:&lt;br /&gt;
000060	59 23 3F 45 BC 57 83 80  02 20 59 AF 01 CA 17 D0   Y#?E.W... Y.....&lt;br /&gt;
000070	0E 41 83 7A 1D 58 E9 7A  A3 1B AE 58 4E DE C2 8D   .A.z.X.z...XN...&lt;br /&gt;
000080	35 BD 96 92 36 90 91 3B  AE 9A 01 41 04 9C 02 BF   5...6..;...A....&lt;br /&gt;
000090	C9 7E F2 36 CE 6D 8F E5  D9 40 13 C7 21 E9 15 98   .~.6.m...@..!...&lt;br /&gt;
0000A0	2A CD 2B 12 B6 5D 9B 7D  59 E2 0A 84 20 05 F8 FC   *.+..].}Y... ...&lt;br /&gt;
0000B0	4E 02 53 2E 87 3D 37 B9  6F 09 D6 D4 51 1A DA 8F   N.S..=7.o...Q...&lt;br /&gt;
0000C0	14 04 2F 46 61 4A 4C 70  C0 F1 4B EF F5 FF FF FF   ../FaJLp..K.....&lt;br /&gt;
0000D0	FF 02 40 4B 4C 00 00 00  00 00 19 76 A9 14 1A A0   ..@KL......v....&lt;br /&gt;
0000E0	CD 1C BE A6 E7 45 8A 7A  BA D5 12 A9 D9 EA 1A FB   .....E.z........&lt;br /&gt;
0000F0	22 5E 88 AC 80 FA E9 C7  00 00 00 00 19 76 A9 14   &amp;quot;^...........v..&lt;br /&gt;
000100	0E AB 5B EA 43 6A 04 84  CF AB 12 48 5E FD A0 B7   ..[.Cj.....H^...&lt;br /&gt;
000110	8B 4E CC 52 88 AC 00 00  00 00                     .N.R......&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Message header:&lt;br /&gt;
 F9 BE B4 D9                                       - main network magic bytes&lt;br /&gt;
 74 78 00 00 00 00 00 00 00 00 00 00               - &amp;quot;tx&amp;quot; command&lt;br /&gt;
 02 01 00 00                                       - payload is 258 bytes long&lt;br /&gt;
 E2 93 CD BE                                       - checksum of payload&lt;br /&gt;
&lt;br /&gt;
Transaction:&lt;br /&gt;
 01 00 00 00                                       - version&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
 01                                                - number of transaction inputs&lt;br /&gt;
&lt;br /&gt;
Input 1:&lt;br /&gt;
 6D BD DB 08 5B 1D 8A F7  51 84 F0 BC 01 FA D5 8D  - previous output (outpoint)&lt;br /&gt;
 12 66 E9 B6 3B 50 88 19  90 E4 B4 0D 6A EE 36 29&lt;br /&gt;
 00 00 00 00&lt;br /&gt;
&lt;br /&gt;
 8B                                                - script is 139 bytes long&lt;br /&gt;
&lt;br /&gt;
 48 30 45 02 21 00 F3 58  1E 19 72 AE 8A C7 C7 36  - signature script (scriptSig)&lt;br /&gt;
 7A 7A 25 3B C1 13 52 23  AD B9 A4 68 BB 3A 59 23&lt;br /&gt;
 3F 45 BC 57 83 80 02 20  59 AF 01 CA 17 D0 0E 41&lt;br /&gt;
 83 7A 1D 58 E9 7A A3 1B  AE 58 4E DE C2 8D 35 BD&lt;br /&gt;
 96 92 36 90 91 3B AE 9A  01 41 04 9C 02 BF C9 7E&lt;br /&gt;
 F2 36 CE 6D 8F E5 D9 40  13 C7 21 E9 15 98 2A CD&lt;br /&gt;
 2B 12 B6 5D 9B 7D 59 E2  0A 84 20 05 F8 FC 4E 02&lt;br /&gt;
 53 2E 87 3D 37 B9 6F 09  D6 D4 51 1A DA 8F 14 04&lt;br /&gt;
 2F 46 61 4A 4C 70 C0 F1  4B EF F5&lt;br /&gt;
&lt;br /&gt;
 FF FF FF FF                                       - sequence&lt;br /&gt;
&lt;br /&gt;
Outputs:&lt;br /&gt;
 02                                                - 2 Output Transactions&lt;br /&gt;
&lt;br /&gt;
Output 1:&lt;br /&gt;
 40 4B 4C 00 00 00 00 00                           - 0.05 BTC (5000000)&lt;br /&gt;
 19                                                - pk_script is 25 bytes long&lt;br /&gt;
&lt;br /&gt;
 76 A9 14 1A A0 CD 1C BE  A6 E7 45 8A 7A BA D5 12  - pk_script&lt;br /&gt;
 A9 D9 EA 1A FB 22 5E 88  AC&lt;br /&gt;
&lt;br /&gt;
Output 2:&lt;br /&gt;
 80 FA E9 C7 00 00 00 00                           - 33.54 BTC (3354000000)&lt;br /&gt;
 19                                                - pk_script is 25 bytes long&lt;br /&gt;
&lt;br /&gt;
 76 A9 14 0E AB 5B EA 43  6A 04 84 CF AB 12 48 5E  - pk_script&lt;br /&gt;
 FD A0 B7 8B 4E CC 52 88  AC&lt;br /&gt;
&lt;br /&gt;
Locktime:&lt;br /&gt;
 00 00 00 00                                       - lock time&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== block ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;block&#039;&#039;&#039; message is sent in response to a getdata message which requests transaction information from a block hash.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 4 || version || uint32_t || Block version information, based upon the software version creating this block&lt;br /&gt;
|-&lt;br /&gt;
| 32 || prev_block || char[32] || The hash value of the previous block this particular block references&lt;br /&gt;
|-&lt;br /&gt;
| 32 || merkle_root || char[32] || The reference to a Merkle tree collection which is a hash of all transactions related to this block&lt;br /&gt;
|-&lt;br /&gt;
| 4 || timestamp || uint32_t || A unix timestamp recording when this block was created (Currently limited to dates before the year 2106!)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || bits || uint32_t || The calculated [[Difficulty|difficulty target]] being used for this block&lt;br /&gt;
|-&lt;br /&gt;
| 4 || nonce || uint32_t || The nonce used to generate this block… to allow variations of the header and compute different hashes&lt;br /&gt;
|-&lt;br /&gt;
| ? || txn_count || [[Protocol_specification#Variable_length_integer|var_int]] || Number of transaction entries&lt;br /&gt;
|-&lt;br /&gt;
| ? || txns || tx[] || Block transactions, in format of &amp;quot;tx&amp;quot; command&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The SHA256 hash that identifies each block (and which must have a run of 0 bits) is calculated from the first 6 fields of this structure (version, prev_block, merkle_root, timestamp, bits, nonce, and standard SHA256 padding, making two 64-byte chunks in all) and &#039;&#039;not&#039;&#039; from the complete block. To calculate the hash, only two chunks need to be processed by the SHA256 algorithm. Since the &#039;&#039;nonce&#039;&#039; field is in the second chunk, the first chunk stays constant during mining and therefore only the second chunk needs to be processed. However, a Bitcoin hash is the hash of the hash, so two SHA256 rounds are needed for each mining iteration.&lt;br /&gt;
See [[Block hashing algorithm]] for details and an example.&lt;br /&gt;
&lt;br /&gt;
=== headers ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;headers&#039;&#039; packet returns block headers in response to a &#039;&#039;getheaders&#039;&#039; packet. &lt;br /&gt;
&lt;br /&gt;
Payload:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| ? || count || [[Protocol_specification#Variable_length_integer|var_int]] || Number of block headers&lt;br /&gt;
|-&lt;br /&gt;
| 81x? || headers || [[Protocol_specification#Block_Headers|block_header]][] || [[Protocol_specification#Block_Headers|Block headers]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that the block headers in this packet include a transaction count (a var_int, so there can be more than 81 bytes per header) as opposed to the block headers which are sent to miners.&lt;br /&gt;
&lt;br /&gt;
=== getaddr ===&lt;br /&gt;
&lt;br /&gt;
The getaddr message sends a request to a node asking for information about known active peers to help with identifying potential nodes in the network. The response to receiving this message is to transmit an addr message with one or more peers from a database of known active peers. The typical presumption is that a node is likely to be active if it has been sending a message within the last three hours.&lt;br /&gt;
&lt;br /&gt;
No additional data is transmitted with this message.&lt;br /&gt;
&lt;br /&gt;
=== checkorder ===&lt;br /&gt;
&lt;br /&gt;
This message is used for [[IP Transactions]], to ask the peer if it accepts such transactions and allow it to look at the content of the order.&lt;br /&gt;
&lt;br /&gt;
It contains a CWalletTx object&lt;br /&gt;
&lt;br /&gt;
Payload:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| Fields from CMerkleTx&lt;br /&gt;
|-&lt;br /&gt;
| ? || hashBlock&lt;br /&gt;
|-&lt;br /&gt;
| ? || vMerkleBranch&lt;br /&gt;
|-&lt;br /&gt;
| ? || nIndex&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| Fields from CWalletTx&lt;br /&gt;
|-&lt;br /&gt;
| ? || vtxPrev&lt;br /&gt;
|-&lt;br /&gt;
| ? || mapValue&lt;br /&gt;
|-&lt;br /&gt;
| ? || vOrderForm&lt;br /&gt;
|-&lt;br /&gt;
| ? || fTimeReceivedIsTxTime&lt;br /&gt;
|-&lt;br /&gt;
| ? || nTimeReceived&lt;br /&gt;
|-&lt;br /&gt;
| ? || fFromMe&lt;br /&gt;
|-&lt;br /&gt;
| ? || fSpent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== submitorder ===&lt;br /&gt;
&lt;br /&gt;
Confirms an order has been submitted. &lt;br /&gt;
&lt;br /&gt;
Payload:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 32 || hash || char[32] || Hash of the transaction&lt;br /&gt;
|-&lt;br /&gt;
| ? || wallet_entry || CWalletTx || Same payload as checkorder&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== reply ===&lt;br /&gt;
&lt;br /&gt;
Generic reply for [[IP Transactions]]&lt;br /&gt;
&lt;br /&gt;
Payload:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 4 || reply || uint32_t || reply code&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Possible values:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || SUCCESS || The IP Transaction can proceed (&#039;&#039;checkorder&#039;&#039;), or has been accepted (&#039;&#039;submitorder&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || WALLET_ERROR || AcceptWalletTransaction() failed&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DENIED || IP Transactions are not accepted by this node&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ping ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;ping&#039;&#039; message is sent primarily to confirm that the TCP/IP connection is still valid. An error in transmission is presumed to be a closed connection and the address is removed as a current peer. In modern protocol versions, a &#039;&#039;pong&#039;&#039; response is generated using a nonce included in the ping.&lt;br /&gt;
&lt;br /&gt;
=== filterload, filteradd, filterclear, merkleblock ===&lt;br /&gt;
&lt;br /&gt;
These messages are related to Bloom filtering of connections and are defined in [[BIP 0037]].&lt;br /&gt;
&lt;br /&gt;
=== alert ===&lt;br /&gt;
&lt;br /&gt;
An &#039;&#039;&#039;alert&#039;&#039;&#039; is sent between nodes to send a general notification message throughout the network. If the alert can be confirmed with the signature as having come from the the core development group of the Bitcoin software, the message is suggested to be displayed for end-users. Attempts to perform transactions, particularly automated transactions through the client, are suggested to be halted. The text in the Message string should be relayed to log files and any user interfaces.&lt;br /&gt;
&lt;br /&gt;
Alert format:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| ? || payload || var_str || Serialized alert payload&lt;br /&gt;
|-&lt;br /&gt;
| ? || signature || var_str || An ECDSA signature of the message&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The developers of Satoshi&#039;s client use this public key for signing alerts:&lt;br /&gt;
 04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284&lt;br /&gt;
 (hash) 1AGRxqDa5WjUKBwHB9XYEjmkv1ucoUUy1s&lt;br /&gt;
&lt;br /&gt;
The payload is serialized into a var_str to ensure that versions using incompatible alert formats can still relay alerts among one another. The current alert payload format is:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field Size !! Description !! Data type !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Version || int32_t || Alert format version&lt;br /&gt;
|-&lt;br /&gt;
| 8 || RelayUntil || int64_t || The timestamp beyond which nodes should stop relaying this alert&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Expiration || int64_t || The timestamp beyond which this alert is no longer in effect and should be ignored&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ID || int32_t || A unique ID number for this alert&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Cancel || int32_t || All alerts with an ID number less than or equal to this number should be canceled: deleted and not accepted in the future&lt;br /&gt;
|-&lt;br /&gt;
| ? || setCancel || set&amp;lt;int&amp;gt; || All alert IDs contained in this set should be canceled as above&lt;br /&gt;
|-&lt;br /&gt;
| 4 || MinVer || int32_t || This alert only applies to versions greater than or equal to this version. Other versions should still relay it.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || MaxVer || int32_t || This alert only applies to versions less than or equal to this version. Other versions should still relay it.&lt;br /&gt;
|-&lt;br /&gt;
| ? || setSubVer || set&amp;lt;string&amp;gt; || If this set contains any elements, then only nodes that have their subVer contained in this set are affected by the alert. Other versions should still relay it.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Priority || int32_t || Relative priority compared to other alerts&lt;br /&gt;
|-&lt;br /&gt;
| ? || Comment || string || A comment on the alert that is not displayed&lt;br /&gt;
|-&lt;br /&gt;
| ? || StatusBar || string || The alert message that is displayed to the user&lt;br /&gt;
|-&lt;br /&gt;
| ? || Reserved || string || Reserved&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Sample alert (no message header):&lt;br /&gt;
 73010000003766404f00000000b305434f00000000f2030000f1030000001027000048ee0000&lt;br /&gt;
 0064000000004653656520626974636f696e2e6f72672f666562323020696620796f75206861&lt;br /&gt;
 76652074726f75626c6520636f6e6e656374696e672061667465722032302046656272756172&lt;br /&gt;
 79004730450221008389df45f0703f39ec8c1cc42c13810ffcae14995bb648340219e353b63b&lt;br /&gt;
 53eb022009ec65e1c1aaeec1fd334c6b684bde2b3f573060d5b70c3a46723326e4e8a4f1&lt;br /&gt;
 &lt;br /&gt;
 Version: 1&lt;br /&gt;
 RelayUntil: 1329620535&lt;br /&gt;
 Expiration: 1329792435&lt;br /&gt;
 ID: 1010&lt;br /&gt;
 Cancel: 1009&lt;br /&gt;
 setCancel: &amp;lt;empty&amp;gt;&lt;br /&gt;
 MinVer: 10000&lt;br /&gt;
 MaxVer: 61000&lt;br /&gt;
 setSubVer: &amp;lt;empty&amp;gt;&lt;br /&gt;
 Priority: 100&lt;br /&gt;
 Comment: &amp;lt;empty&amp;gt;&lt;br /&gt;
 StatusBar: &amp;quot;See bitcoin.org/feb20 if you have trouble connecting after 20 February&amp;quot;&lt;br /&gt;
 Reserved: &amp;lt;empty&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scripting ==&lt;br /&gt;
&lt;br /&gt;
See [[script]].&lt;br /&gt;
&lt;br /&gt;
== Wireshark dissector ==&lt;br /&gt;
A dissector for wireshark is being developed at https://github.com/blueCommand/bitcoin-dissector&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
* [[Network]]&lt;br /&gt;
* [[Protocol rules]]&lt;br /&gt;
* [[Hardfork Wishlist]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[zh-cn:协议说明]]&lt;br /&gt;
[[Category:Technical]]&lt;br /&gt;
[[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Software_versions&amp;diff=36954</id>
		<title>Software versions</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Software_versions&amp;diff=36954"/>
		<updated>2013-04-13T20:13:56Z</updated>

		<summary type="html">&lt;p&gt;Grau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Software !! Vulnerable !! Old !! Current&lt;br /&gt;
|-&lt;br /&gt;
| Bitcoin-Qt&amp;lt;br&amp;gt;bitcoind || * - 0.4.9rc1&amp;lt;br&amp;gt;0.5.0rc1 - 0.5.8rc1&amp;lt;br&amp;gt;0.6.0rc1 - 0.6.5rc1&amp;lt;br&amp;gt;0.7.0rc1 - 0.7.3rc1&amp;lt;br&amp;gt;0.8.0rc1 - 0.8.0 || || 0.4.9rc2&amp;lt;br&amp;gt;0.5.8rc2&amp;lt;br&amp;gt;0.6.5rc2&amp;lt;br&amp;gt;0.7.3rc2&amp;lt;br&amp;gt;0.8.1&lt;br /&gt;
|-&lt;br /&gt;
| bits of proof ||  || 0.8|| 0.9&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Clients&amp;diff=36733</id>
		<title>Clients</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Clients&amp;diff=36733"/>
		<updated>2013-04-06T21:28:31Z</updated>

		<summary type="html">&lt;p&gt;Grau: /* For developers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&lt;br /&gt;
This table compares the features of the different clients. All of the listed clients are open-source.&lt;br /&gt;
&lt;br /&gt;
===Feature key===&lt;br /&gt;
&lt;br /&gt;
; Wallet Security : How well the client protects your [[private key]]s from people with access to the machine the wallet is stored on. The private keys can be encrypted, for example. The private keys can also be either stored on your device or on a remote server.&lt;br /&gt;
; Network Security : Clients which more fully implement the Bitcoin network protocol are safer -- they can&#039;t be as easily tricked by powerful attackers. A client which &#039;&#039;fully&#039;&#039; implements the protocol will always use the correct [[block chain]] and will never allow [[double-spending|double-spends]] or invalid transactions to exist in the block chain under any circumstances. Clients which only &#039;&#039;partially&#039;&#039; implement the protocol typically trust that 50% or more of the network&#039;s mining power is honest. Some clients trust one or more &#039;&#039;remote servers&#039;&#039; to protect them from double-spends and other network attacks.&lt;br /&gt;
; Setup Time : Some clients require that you download and verify a large amount of data before you can send or receive BTC.&lt;br /&gt;
; Maturity : When the project was started.&lt;br /&gt;
&lt;br /&gt;
===Table===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- please keep this alphabetic --&amp;gt;&lt;br /&gt;
{| class=&#039;wikitable&#039; style=&#039;text-align: center&#039;&lt;br /&gt;
! Client !! Get Started !! Audience !! Wallet Security !! Network Security !! Backups !! Setup Time !! Disk Space !! Maturity !! Multi-user !! Available for&lt;br /&gt;
|-&lt;br /&gt;
! Armory&lt;br /&gt;
|| [http://bitcoinarmory.com/index.php/get-armory Download] || Power users || {{CLGood|Encrypted, on-device}} || Addon || {{CLBest|One-time}} || Varies || {{CLBad|6+ GB}} || Jul 2011 || {{CLBest|Multi-wallet}} || {{CLLinux}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! Bitcoin Wallet&lt;br /&gt;
|| [https://play.google.com/store/apps/details?id=de.schildbach.wallet Google Play] [https://appworld.blackberry.com/webstore/content/23952882/ BlackBerry World] || {{CLBest|Everyone}} || {{CLGood|Isolated, on-device}} || Partial || Manual || 1 hour || 30 MB || {{CLGood|Mar 2011}} || on JB tablets || {{CLAndroid}} [[file:ico-blackberry.png]]&lt;br /&gt;
|-&lt;br /&gt;
! {{CLGood|Bitcoin-Qt}}&lt;br /&gt;
|| [http://sourceforge.net/projects/bitcoin/files/Bitcoin/ Download] || {{CLGood|End-users}} || {{CLGood|Encrypted, on-device}} || {{CLBest|Full}} || Manual || {{CLBad|Hours}} || {{CLBad|6+ GB}} || {{CLGood|May 2011}} || No || {{CLLinux}}{{CLMac}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! bitcoind&lt;br /&gt;
|| [http://sourceforge.net/projects/bitcoin/files/Bitcoin/ Download] || Programmers || {{CLGood|Encrypted, on-device}} || {{CLBest|Full}} || Manual || {{CLBad|Hours}} || {{CLBad|6+ GB}} || {{CLBest|Aug 2009}} || {{CLGood|Virtual accounts}} || {{CLLinux}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! Electrum&lt;br /&gt;
|| [http://ecdsa.org/electrum/ Download] || Power users || {{CLGood|Encrypted, on-device}} || Minimal || {{CLBest|Memorized}} || {{CLGood|Minutes}} || {{CLGood|5 MB}} || Nov 2011 || No || {{CLLinux}}{{CLMac}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! MultiBit&lt;br /&gt;
|| [http://multibit.org/releases.html Download] || {{CLGood|End-users}} || {{CLBad|None, on-device}} || Partial || {{CLBad|No}} || {{CLBest|Seconds}} || 50 MB || Jul 2011 || {{CLBest|Multi-wallet}} || {{CLLinux}}{{CLMac}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! My Wallet&lt;br /&gt;
|| [https://blockchain.info/wallet/new Web-based] || {{CLBest|Everyone}} || Encrypted, on a server || {{CLBad|Remote}} || {{CLGood|Automatic}} || {{CLGood|Minutes}} || {{CLBest|None}} || Dec 2011 || {{CLBest|Yes}} || {{CLAndroid}}{{CLiOS}}{{CLLinux}}{{CLMac}}{{CLWin}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- For Wallet Security: CLBest is reserved for multisig-based --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==For developers==&lt;br /&gt;
&lt;br /&gt;
This table shows additional information about various Bitcoin clients that may be relevant to developers.&lt;br /&gt;
&lt;br /&gt;
{| class=&#039;wikitable&#039; style=&#039;text-align: center&#039;&lt;br /&gt;
! Client !! Website !! Source Code !! License !! Discussion !! Architecture&lt;br /&gt;
|-&lt;br /&gt;
! Armory&lt;br /&gt;
|| [http://bitcoinarmory.com/ Link] ||[https://github.com/etotheipi/BitcoinArmory/ Github] || AGPLv3 || [https://bitcointalk.org/index.php?board=97.0 Bitcointalk] || Integrated&lt;br /&gt;
|-&lt;br /&gt;
! Bitcoin Wallet&lt;br /&gt;
|| [https://code.google.com/p/bitcoin-wallet/ Link] || [https://code.google.com/p/bitcoin-wallet/source/checkout Google Code] [https://github.com/schildbach/bitcoin-wallet Github] || GPLv3 || [https://bitcointalk.org/index.php?board=100.0 Bitcointalk] / [https://groups.google.com/forum/?fromgroups#!forum/bitcoinj Google Groups] || [[Thin Client Security#Simplified Payment Verification (SPV)|SPV]]&lt;br /&gt;
|-&lt;br /&gt;
! Bitcoin-Qt / bitcoind&lt;br /&gt;
|| [http://bitcoin.org/ Link] || [https://github.com/bitcoin/bitcoin Github] || MIT || [https://lists.sourceforge.net/lists/listinfo/bitcoin-development Sourceforge] || Integrated&lt;br /&gt;
|-&lt;br /&gt;
! Electrum&lt;br /&gt;
|| [http://ecdsa.org/electrum/ Link] || [https://gitorious.org/electrum Gitorious] || GPLv3 || [https://lists.sourceforge.net/lists/listinfo/electrum-discuss Sourceforge] || [[Thin Client Security#Server-Trusting Clients|Server-Client]]&lt;br /&gt;
|-&lt;br /&gt;
! MultiBit&lt;br /&gt;
|| [http://multibit.org/ Link] || [https://github.com/jim618/multibit Github] || MIT || [https://groups.google.com/forum/?fromgroups#!forum/bitcoin-multibit Google Groups] || [[Thin Client Security#Simplified Payment Verification (SPV)|SPV]]&lt;br /&gt;
|-&lt;br /&gt;
! My Wallet&lt;br /&gt;
|| [https://blockchain.info/wallet/ Link] || [https://github.com/blockchain/My-Wallet/ Github] || BSD* || None || [[Thin Client Security#Server-Trusting Clients|Server-Client]]&lt;br /&gt;
|-&lt;br /&gt;
! bits of proof&lt;br /&gt;
|| [http://bitsofproof.com Link] || [https://github.com/bitsofproof/supernode Github] || Apache 2.0 || [https://bitcointalk.org/index.php?topic=122013.0 Bitcointalk] || [[Thin Client Security#Server-Trusting Clients|Server-Client]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Software#Bitcoin_clients|List of clients]]&lt;br /&gt;
* [[Bitcoin Ladder]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Clients&amp;diff=36732</id>
		<title>Clients</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Clients&amp;diff=36732"/>
		<updated>2013-04-06T21:27:40Z</updated>

		<summary type="html">&lt;p&gt;Grau: /* For developers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&lt;br /&gt;
This table compares the features of the different clients. All of the listed clients are open-source.&lt;br /&gt;
&lt;br /&gt;
===Feature key===&lt;br /&gt;
&lt;br /&gt;
; Wallet Security : How well the client protects your [[private key]]s from people with access to the machine the wallet is stored on. The private keys can be encrypted, for example. The private keys can also be either stored on your device or on a remote server.&lt;br /&gt;
; Network Security : Clients which more fully implement the Bitcoin network protocol are safer -- they can&#039;t be as easily tricked by powerful attackers. A client which &#039;&#039;fully&#039;&#039; implements the protocol will always use the correct [[block chain]] and will never allow [[double-spending|double-spends]] or invalid transactions to exist in the block chain under any circumstances. Clients which only &#039;&#039;partially&#039;&#039; implement the protocol typically trust that 50% or more of the network&#039;s mining power is honest. Some clients trust one or more &#039;&#039;remote servers&#039;&#039; to protect them from double-spends and other network attacks.&lt;br /&gt;
; Setup Time : Some clients require that you download and verify a large amount of data before you can send or receive BTC.&lt;br /&gt;
; Maturity : When the project was started.&lt;br /&gt;
&lt;br /&gt;
===Table===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- please keep this alphabetic --&amp;gt;&lt;br /&gt;
{| class=&#039;wikitable&#039; style=&#039;text-align: center&#039;&lt;br /&gt;
! Client !! Get Started !! Audience !! Wallet Security !! Network Security !! Backups !! Setup Time !! Disk Space !! Maturity !! Multi-user !! Available for&lt;br /&gt;
|-&lt;br /&gt;
! Armory&lt;br /&gt;
|| [http://bitcoinarmory.com/index.php/get-armory Download] || Power users || {{CLGood|Encrypted, on-device}} || Addon || {{CLBest|One-time}} || Varies || {{CLBad|6+ GB}} || Jul 2011 || {{CLBest|Multi-wallet}} || {{CLLinux}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! Bitcoin Wallet&lt;br /&gt;
|| [https://play.google.com/store/apps/details?id=de.schildbach.wallet Google Play] [https://appworld.blackberry.com/webstore/content/23952882/ BlackBerry World] || {{CLBest|Everyone}} || {{CLGood|Isolated, on-device}} || Partial || Manual || 1 hour || 30 MB || {{CLGood|Mar 2011}} || on JB tablets || {{CLAndroid}} [[file:ico-blackberry.png]]&lt;br /&gt;
|-&lt;br /&gt;
! {{CLGood|Bitcoin-Qt}}&lt;br /&gt;
|| [http://sourceforge.net/projects/bitcoin/files/Bitcoin/ Download] || {{CLGood|End-users}} || {{CLGood|Encrypted, on-device}} || {{CLBest|Full}} || Manual || {{CLBad|Hours}} || {{CLBad|6+ GB}} || {{CLGood|May 2011}} || No || {{CLLinux}}{{CLMac}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! bitcoind&lt;br /&gt;
|| [http://sourceforge.net/projects/bitcoin/files/Bitcoin/ Download] || Programmers || {{CLGood|Encrypted, on-device}} || {{CLBest|Full}} || Manual || {{CLBad|Hours}} || {{CLBad|6+ GB}} || {{CLBest|Aug 2009}} || {{CLGood|Virtual accounts}} || {{CLLinux}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! Electrum&lt;br /&gt;
|| [http://ecdsa.org/electrum/ Download] || Power users || {{CLGood|Encrypted, on-device}} || Minimal || {{CLBest|Memorized}} || {{CLGood|Minutes}} || {{CLGood|5 MB}} || Nov 2011 || No || {{CLLinux}}{{CLMac}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! MultiBit&lt;br /&gt;
|| [http://multibit.org/releases.html Download] || {{CLGood|End-users}} || {{CLBad|None, on-device}} || Partial || {{CLBad|No}} || {{CLBest|Seconds}} || 50 MB || Jul 2011 || {{CLBest|Multi-wallet}} || {{CLLinux}}{{CLMac}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! My Wallet&lt;br /&gt;
|| [https://blockchain.info/wallet/new Web-based] || {{CLBest|Everyone}} || Encrypted, on a server || {{CLBad|Remote}} || {{CLGood|Automatic}} || {{CLGood|Minutes}} || {{CLBest|None}} || Dec 2011 || {{CLBest|Yes}} || {{CLAndroid}}{{CLiOS}}{{CLLinux}}{{CLMac}}{{CLWin}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- For Wallet Security: CLBest is reserved for multisig-based --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==For developers==&lt;br /&gt;
&lt;br /&gt;
This table shows additional information about various Bitcoin clients that may be relevant to developers.&lt;br /&gt;
&lt;br /&gt;
{| class=&#039;wikitable&#039; style=&#039;text-align: center&#039;&lt;br /&gt;
! Client !! Website !! Source Code !! License !! Discussion !! Architecture&lt;br /&gt;
|-&lt;br /&gt;
! Armory&lt;br /&gt;
|| [http://bitcoinarmory.com/ Link] ||[https://github.com/etotheipi/BitcoinArmory/ Github] || AGPLv3 || [https://bitcointalk.org/index.php?board=97.0 Bitcointalk] || Integrated&lt;br /&gt;
|-&lt;br /&gt;
! Bitcoin Wallet&lt;br /&gt;
|| [https://code.google.com/p/bitcoin-wallet/ Link] || [https://code.google.com/p/bitcoin-wallet/source/checkout Google Code] [https://github.com/schildbach/bitcoin-wallet Github] || GPLv3 || [https://bitcointalk.org/index.php?board=100.0 Bitcointalk] / [https://groups.google.com/forum/?fromgroups#!forum/bitcoinj Google Groups] || [[Thin Client Security#Simplified Payment Verification (SPV)|SPV]]&lt;br /&gt;
|-&lt;br /&gt;
! Bitcoin-Qt / bitcoind&lt;br /&gt;
|| [http://bitcoin.org/ Link] || [https://github.com/bitcoin/bitcoin Github] || MIT || [https://lists.sourceforge.net/lists/listinfo/bitcoin-development Sourceforge] || Integrated&lt;br /&gt;
|-&lt;br /&gt;
! Electrum&lt;br /&gt;
|| [http://ecdsa.org/electrum/ Link] || [https://gitorious.org/electrum Gitorious] || GPLv3 || [https://lists.sourceforge.net/lists/listinfo/electrum-discuss Sourceforge] || [[Thin Client Security#Server-Trusting Clients|Server-Client]]&lt;br /&gt;
|-&lt;br /&gt;
! MultiBit&lt;br /&gt;
|| [http://multibit.org/ Link] || [https://github.com/jim618/multibit Github] || MIT || [https://groups.google.com/forum/?fromgroups#!forum/bitcoin-multibit Google Groups] || [[Thin Client Security#Simplified Payment Verification (SPV)|SPV]]&lt;br /&gt;
|-&lt;br /&gt;
! My Wallet&lt;br /&gt;
|| [https://blockchain.info/wallet/ Link] || [https://github.com/blockchain/My-Wallet/ Github] || BSD* || None || [[Thin Client Security#Server-Trusting Clients|Server-Client]]&lt;br /&gt;
|-&lt;br /&gt;
! bits of proof&lt;br /&gt;
|| [https://bitsofproof.com Link] || [https://github.com/bitsofproof/supernode Github] || Apache 2.0 || [https://bitcointalk.org/index.php?topic=122013.0 Bitcointalk] || [[Thin Client Security#Server-Trusting Clients|Server-Client]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Software#Bitcoin_clients|List of clients]]&lt;br /&gt;
* [[Bitcoin Ladder]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Software&amp;diff=36731</id>
		<title>Software</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Software&amp;diff=36731"/>
		<updated>2013-04-06T21:22:51Z</updated>

		<summary type="html">&lt;p&gt;Grau: /* Bitcoin software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;List of Bitcoin-related software. See also [[:Category:Software|Category:Software]].&lt;br /&gt;
&lt;br /&gt;
Be sure to keep on top of the latest [[CVEs|security vulnerabilities]]!&lt;br /&gt;
&lt;br /&gt;
==Bitcoin clients==&lt;br /&gt;
===Bitcoin clients===&lt;br /&gt;
::&#039;&#039;Main article and feature comparison: [[Clients]]&#039;&#039;&lt;br /&gt;
*[[Bitcoin-Qt]] - C++/Qt based tabbed UI. Linux/MacOSX/Windows. Full-featured [[Thin Client Security|thick client]] that downloads the entire [[block chain]], using code from the original Bitcoin client.&lt;br /&gt;
*[[bitcoind]] - GUI-less version of the original Bitcoin client, providing a [[API reference (JSON-RPC)|JSON-RPC]] interface&lt;br /&gt;
*[[MultiBit]] - lightweight [[Thin Client Security|thin client]] for Windows, MacOS and Linux with support for opening multiple wallets simultaneously&lt;br /&gt;
*[[Electrum]] - a &amp;quot;blazing fast, open-source, multi-OS Bitcoin client/wallet with a very active community&amp;quot;&lt;br /&gt;
*[[Bitcoin-js-remote]] - JavaScript RPC client, support for QR codes&lt;br /&gt;
*[https://github.com/TheSeven/Bitcoin-WebUI Bitcoin WebUI] - JavaScript RPC client&lt;br /&gt;
*[https://github.com/zamgo/bitcoin-webskin Bitcoin Webskin] - PHP web interface to bitcoind and namecoind&lt;br /&gt;
*[https://bitcointalk.org/index.php?topic=50721.0 subvertx] - command line bitcoin tools&lt;br /&gt;
*[[Bitcoiner]] - Java RPC client (Android)&lt;br /&gt;
*[[Armory]] - Python-based client currently an alpha-level release, the beta version is being crowdfunded&lt;br /&gt;
*[[Spesmilo]] - Python/PySide RPC client (abandoned)&lt;br /&gt;
&lt;br /&gt;
====Frontends to eWallet====&lt;br /&gt;
*[[BitPay]] - Android application&lt;br /&gt;
*[https://blockchain.info/wallet Blockchain] - Javascript bitcoin client with client side encryption.&lt;br /&gt;
&lt;br /&gt;
====Experimental====&lt;br /&gt;
*[[Freecoin]] - C++ client, supports alternative currencies like [[Beertoken]]&lt;br /&gt;
*[[BitDroid]] - Java client&lt;br /&gt;
*[[Bitdollar]] - C++/Qt client, unstable beta version&lt;br /&gt;
&lt;br /&gt;
===Libraries===&lt;br /&gt;
*[https://bitcointalk.org/index.php?topic=30646.0 libbitcoin]&lt;br /&gt;
*[[BitCoinJ]] - Java client library, early development stage but used in live projects already&lt;br /&gt;
*[[BCCAPI]] (Bitcoin Client API) - a java library designed for making secure light-weight bitcoin clients.&lt;br /&gt;
&lt;br /&gt;
==Bitcoin Trade Data==&lt;br /&gt;
*[[Bitcoin Charts]] – Prices, volume, and extensive charting on virtually all Bitcoin markets.&lt;br /&gt;
*[[MtGox Live]] - An innovative chart showing a live feed of [[MtGox]] trades and market depth.  (Must Use Chrome)&lt;br /&gt;
*[http://btccharts.com BTCCharts] - An innovative chart showing a live feed of multiple markets, currencies and timeframes.&lt;br /&gt;
*[http://BitcoinExchangeRate.org BitcoinExchangeRate.org] - Bitcoin and USD converter with convenient URL scheme and Auto-updating Portfolio Spreadsheet.&lt;br /&gt;
*[[Bitcoin Sentiment Index]] - A financial index that collects and disseminates sentiment data about bitcoin.&lt;br /&gt;
*[[Preev]] - Bitcoin converter with live exchange rates.&lt;br /&gt;
*[[Skami]] - Bitcoin Market Exchange comparison charts.&lt;br /&gt;
*[[BitcoinSentiment]] - Crowdvoting site offering means of voting and viewing voters sentiment towards bitcoin.&lt;br /&gt;
&lt;br /&gt;
==Bitcoin software==&lt;br /&gt;
&lt;br /&gt;
===Web interfaces for merchants===&lt;br /&gt;
*[[Bitcoin Evolution]] - Non wallet-based Buy Now button to insert into websites (handles sales tracking; client must be used for actual transaction)&lt;br /&gt;
*[[BitPay]] - Buy Now buttons, Checkout posts/callbacks, Mobile Checkout, JSON API&lt;br /&gt;
*[[Btceconomy]] - a JavaScript widget listing items for sale&lt;br /&gt;
*[[Javascript Bitcoin Converter]] - currency conversion&lt;br /&gt;
*[[WalletBit]] - Easy JavaScript Buy Now buttons, Instant Payment Notification, Application Programming Interface (JSON API), Mobile Checkout, QR-Code&lt;br /&gt;
*[[BitUtils Merchant]] - Customizable Buy Now buttons with hosted checkout interface. No programming skills required to set up.&lt;br /&gt;
&lt;br /&gt;
===Shopping Cart Integration in eCommerce-Systems===&lt;br /&gt;
*[[Zen Cart Bitcoin Payment Module]] - a payment module that interacts with bitcoind for the Zen Cart eCommerce shopping chart.&lt;br /&gt;
*[[Karsha Shopping Cart Interface]] -  is a mobile payment-interface which enables its users to accept payments.&lt;br /&gt;
*[[Bitcoin-Cash]] - an easy to use payment module for xt:Commerce&lt;br /&gt;
*[[BitPay]] - bitcoin plugins for Magento, Opencart, Zencart, PHP, JSON API&lt;br /&gt;
*[[WalletBit]] - Plugins for PrestaShop, OpenCart, PHP, JSON API&lt;br /&gt;
*[[OpenCart Bitcoin]] - An OpenCart payment module that communicates with a bitcoin client using JSON RPC.&lt;br /&gt;
*[[OsCommerce_Bitcoin_Payment_Module|OsCommerce Bitcoin Payment Module]] - a payment module that uses a python monitoring script to interact with bitcoind for OsCommerce&lt;br /&gt;
* [http://drupal.org/project/uc_bitcoin Drupal Ubercart Bitcoin payment method] enables you to accept Bitcoin as payment for your Drupal/Ubercart enabled website product/services.&lt;br /&gt;
&lt;br /&gt;
=== Enterprise server ===&lt;br /&gt;
*[http://bitsofproof.com bits of proof] - a modular Java implementation of the Bitcoin protocol server with a message bus and API for custom extensions.&lt;br /&gt;
&lt;br /&gt;
===Web apps (opensource)===&lt;br /&gt;
*[[Bitcoin Central]] - currency exchange&lt;br /&gt;
*[[Bitcoin Poker Room]] - poker site&lt;br /&gt;
*[[Abe]] - block chain viewer&lt;br /&gt;
*[[Simplecoin]] - PHP web frontend for a pool&lt;br /&gt;
*[[bitcoin_simple_php_tools]] simple php tools for webmasters&lt;br /&gt;
&lt;br /&gt;
===Browser extensions===&lt;br /&gt;
*[[Bitcoin Extension]] - check balance and send bitcoins (Chrome)&lt;br /&gt;
*[[Bitcoin Prices (extension)]] - monitoring price (Firefox)&lt;br /&gt;
*[[Bitcoin Ticker]] - monitoring price (Chrome)&lt;br /&gt;
*[[Biticker]] - Bitcoin ticker, currency converter and history price graph (Chrome)&lt;br /&gt;
*[https://chrome.google.com/webstore/detail/bitcoin-microformats/bkanicejfbhlidgjkpenmddnacjengld?hl=en Bitcoin Microformats] Show bitcoin address metadata embedded in a page (Chrome)&lt;br /&gt;
*[https://chrome.google.com/webstore/detail/bitcoin-address-lookup/pmlblkdmadbidammhjiponepngbfcpge?hl=en Bitcoin Address Lookup] Right click an address to view its value. (Chrome)&lt;br /&gt;
&lt;br /&gt;
===PC apps===&lt;br /&gt;
*[[http://www.mybtc-trader.com MyBTC-Trader.com]] - a MtGox Bitcoin trading client for windows with GUI&lt;br /&gt;
*[[Mining Explorer]] - monitoring tool for bitcoin mining&lt;br /&gt;
*[[Bitcoin SMS Alert]] - sends SMS text alerts to a user&#039;s phone based on BTC price / percent thresholds.&lt;br /&gt;
*[[BTConvert]] - currency conversion&lt;br /&gt;
*[[Sierra Chart MtGox Bridge]] - real-time charting&lt;br /&gt;
*[[BitTicker]] - monitoring price (Mac OS X)&lt;br /&gt;
*[[ToyTrader]] - a command line trading tool for [[MtGox]]&lt;br /&gt;
*[[goxsh]] - a command-line frontend to the [[MtGox|Mt. Gox Bitcoin Exchange]] (Python)&lt;br /&gt;
*[[MyBitcoins gadget]] - monitoring pool earnings / price (Windows gadget)&lt;br /&gt;
*[[Bitcoin QR Popup]] - streamlined interface to bitcoin for POS systems (Windows)&lt;br /&gt;
*[http://gnome-help.org/content/show.php/Bitcoin+Rate?content=138572 Bitcoin Rate] - Desktop widget with BTC exchange rate (KDE)&lt;br /&gt;
*[http://kde-apps.org/content/show.php?content=142344 Bitcoin Monitor] - Desktop widget to monitor status of your Bitcoin miners on mining pools (KDE)&lt;br /&gt;
&lt;br /&gt;
===Mobile apps===&lt;br /&gt;
==== iPhone / iPad ====&lt;br /&gt;
*[https://blockchain.info/wallet/iphone-app Blockchain] - Fully featured iphone bitcoin app.&lt;br /&gt;
*[[Bitcoin Ticker (iPhone)]] - monitoring price w/push notifications&lt;br /&gt;
*[[BitCoins Mobile]] - First iPad native app! Live market data, news feeds, mining pool statistics, full screen exchange price charts, bitcoin network statistical charts. (iPad only, iPhone/iPod Touch coming soon!)&lt;br /&gt;
*[https://github.com/teeman/BitcoinTrader BitcoinTrader] - Spend/receive BTC via QR codes, trade, deposit/withdraw, etc. Supports Mt. Gox, TradeHill, ExchB, CampBX, and InstaWallet.&lt;br /&gt;
*[[Bit-pay]] - Mobile Checkout, set prices in any currency and receive mobile-to-mobile payment&lt;br /&gt;
*[[Easywallet.org]] - Web based wallet, works with QR Code scanner on iPhone/iPad/iPod touch&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
* Direct link to Android Market bitcoin apps. https://play.google.com/store/search?q=bitcoin&lt;br /&gt;
*[[BitCare]] - Track bitcoin wallet balance, trade on Mt.Gox, monitor mining pool hashrate, balance, worker status. &lt;br /&gt;
*[[BtcMobile]] - monitoring price and mining pool statistics (iPhone/iPad, Android)&lt;br /&gt;
*[[Bitcoin Alert]] - monitoring price (Android)&lt;br /&gt;
*[[Bitcoin-android]] - Does not appear to be being maitained anymore. https://market.android.com/details?id=com.bitcoinandroid&lt;br /&gt;
*[[Bitcoin Wallet Balance]] - view your balance in real time on your android phone&lt;br /&gt;
*[[Bitcoin Wallet]] - This is the most functional Android bitcoin wallet application. https://market.android.com/details?id=de.schildbach.wallet&lt;br /&gt;
*[[BitcoinSpinner]] - Single address, easy to use, lightweight and open source client. Keys stored on device.&lt;br /&gt;
*[[BitcoinX]] - monitoring price (Android)&lt;br /&gt;
*[[BitPay]] - https://market.android.com/details?id=com.bitcoin.bitpay (Is not related to the bit-pay.com online payment processor.)&lt;br /&gt;
*[https://blockchain.info/wallet/android-app Blockchain] - Lightweight Android Bitcoin Client - Also works with blockchain.info web interface and iphone app.&lt;br /&gt;
*[[BtcMobile]] - monitoring price and mining pool statistics (iPhone/iPad, Android)&lt;br /&gt;
*[[Easywallet.org]] - Web based wallet, works with QR Code scanner on Android devices&lt;br /&gt;
*[[Miner Status]] - monitoring miner status (Android)&lt;br /&gt;
*[[SMS Bitcoins]] - transactions by SMS&lt;br /&gt;
&lt;br /&gt;
==== Windows Phone 7 ====&lt;br /&gt;
*Direct link to Windows Phone Marketplace Bitcoin apps: [http://www.windowsphone.com/en-us/store/search?q=bitcoin]&lt;br /&gt;
&lt;br /&gt;
see also [[Bitcoin Payment Apps]]&lt;br /&gt;
&lt;br /&gt;
===Operating systems===&lt;br /&gt;
*[[BAMT]]&lt;br /&gt;
*[[LinuxCoin]] - a lightweight Debian-based OS, with the Bitcoin client and GPU mining software&lt;br /&gt;
&lt;br /&gt;
===Mining apps===&lt;br /&gt;
Main page: [[Mining software]]&lt;br /&gt;
*[[50Miner]] - A GUI frontend for Windows(Poclbm, Phoenix, DiabloMiner, cgminer)&lt;br /&gt;
*[[BFGMiner]] - Modular FPGA/GPU miner in C&lt;br /&gt;
*[[BTCMiner]] - Bitcoin Miner for ZTEX FPGA Boards&lt;br /&gt;
*[[Bit Moose]] - Run Miners as a Windows Service.&lt;br /&gt;
*[[Poclbm]] - Python/OpenCL GPU miner ([[Poclbm-gui|GUI(Windows &amp;amp; MacOS X)]])&lt;br /&gt;
*[[Poclbm-mod]] - more efficient version of [[Poclbm]] ([[Poclbm-mod-gui|GUI]])&lt;br /&gt;
*[[DiabloMiner]] - Java/OpenCL GPU miner ([[DiabloMiner.app|MAC OS X GUI]])&lt;br /&gt;
*[[RPC Miner]] - remote RPC miner ([[RPCminer.app|MAC OS X GUI]])&lt;br /&gt;
*[[Phoenix miner]] - miner&lt;br /&gt;
*[[Cpu Miner]] - miner&lt;br /&gt;
*[[Ufasoft miner]] - miner&lt;br /&gt;
*[[Pyminer]] - Python miner, reference implementation&lt;br /&gt;
*[[Remote miner]] - mining pool software&lt;br /&gt;
*[[Open Source FGPA Bitcoin Miner]] - a miner that makes use of an FPGA Board&lt;br /&gt;
*[https://github.com/mkburza/Flash-Player-Bitcoin-Miner Flash Player Bitcoin Miner] - A proof of concept Adobe Flash Player miner&lt;br /&gt;
&lt;br /&gt;
===Mining Pool Servers (backend)===&lt;br /&gt;
Main page: [[Poolservers]]&lt;br /&gt;
&lt;br /&gt;
*[[ecoinpool]] - Erlang poolserver&lt;br /&gt;
*[[Eloipool]] - Fast Python3 poolserver&lt;br /&gt;
*[[Pushpoold]] - Old mining poolserver in C (not maintained)&lt;br /&gt;
*[[Poold]] - Old Python mining poolserver (not maintained)&lt;br /&gt;
*[[PoolServerJ]] - Java mining poolserver (not maintained)&lt;br /&gt;
&lt;br /&gt;
===Utilities, libraries, and interfaces:===&lt;br /&gt;
*[[BitcoinCrypto]] - a lightweight Bitcoin crypto library for Java/Android&lt;br /&gt;
*[[Bitcoin Dissector]] - a wireshark dissector for the bitcoin protocol&lt;br /&gt;
*[[Bitcointools]] - a set of Python tools accessing the transaction database and the wallet&lt;br /&gt;
*[[Finance::MtGox]] - a Perl module which interfaces with the Mt. Gox API&lt;br /&gt;
*[[libblkmaker]] - C library implementation of [[getblocktemplate]] decentralized mining protocol&lt;br /&gt;
*[[python-blkmaker]] - Python module implementation of [[getblocktemplate]] decentralized mining protocol&lt;br /&gt;
&lt;br /&gt;
===Lists of software===&lt;br /&gt;
*[[BitGit]] - list of Bitcoin-related opensource projects hosted at Git&lt;br /&gt;
&lt;br /&gt;
===Developer resources===&lt;br /&gt;
*[[:Category:Developer|Category:Developer]]&lt;br /&gt;
*[[:Category:Technical|Category:Technical]]&lt;br /&gt;
*[[Original Bitcoin client/API calls list]]&lt;br /&gt;
*[[API reference (JSON-RPC)]]&lt;br /&gt;
*[[PHP_developer_intro|PHP Developer Introduction]]&lt;br /&gt;
&lt;br /&gt;
===Other===&lt;br /&gt;
*[[Namecoin]] - a distributed naming system based on Bitcoin technology&lt;br /&gt;
*[[Bitcoin Consultancy]] - an organization providing open source software and Bitcoin-related consulting&lt;br /&gt;
*[[Open Transactions]] - a financial crypto and digital cash software library, complementary to Bitcoin&lt;br /&gt;
*[[Moneychanger]] - Java-based GUI for [[Open Transactions]]&lt;br /&gt;
*[http://btcnames.org/ BTCnames] - a webbased aliasing service which allows to handle unlimited names for your BTC deposit hashes&lt;br /&gt;
*[[Devcoin]] - the open source developer coin&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Clients&amp;diff=36730</id>
		<title>Clients</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Clients&amp;diff=36730"/>
		<updated>2013-04-06T21:11:59Z</updated>

		<summary type="html">&lt;p&gt;Grau: /* For developers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&lt;br /&gt;
This table compares the features of the different clients. All of the listed clients are open-source.&lt;br /&gt;
&lt;br /&gt;
===Feature key===&lt;br /&gt;
&lt;br /&gt;
; Wallet Security : How well the client protects your [[private key]]s from people with access to the machine the wallet is stored on. The private keys can be encrypted, for example. The private keys can also be either stored on your device or on a remote server.&lt;br /&gt;
; Network Security : Clients which more fully implement the Bitcoin network protocol are safer -- they can&#039;t be as easily tricked by powerful attackers. A client which &#039;&#039;fully&#039;&#039; implements the protocol will always use the correct [[block chain]] and will never allow [[double-spending|double-spends]] or invalid transactions to exist in the block chain under any circumstances. Clients which only &#039;&#039;partially&#039;&#039; implement the protocol typically trust that 50% or more of the network&#039;s mining power is honest. Some clients trust one or more &#039;&#039;remote servers&#039;&#039; to protect them from double-spends and other network attacks.&lt;br /&gt;
; Setup Time : Some clients require that you download and verify a large amount of data before you can send or receive BTC.&lt;br /&gt;
; Maturity : When the project was started.&lt;br /&gt;
&lt;br /&gt;
===Table===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- please keep this alphabetic --&amp;gt;&lt;br /&gt;
{| class=&#039;wikitable&#039; style=&#039;text-align: center&#039;&lt;br /&gt;
! Client !! Get Started !! Audience !! Wallet Security !! Network Security !! Backups !! Setup Time !! Disk Space !! Maturity !! Multi-user !! Available for&lt;br /&gt;
|-&lt;br /&gt;
! Armory&lt;br /&gt;
|| [http://bitcoinarmory.com/index.php/get-armory Download] || Power users || {{CLGood|Encrypted, on-device}} || Addon || {{CLBest|One-time}} || Varies || {{CLBad|6+ GB}} || Jul 2011 || {{CLBest|Multi-wallet}} || {{CLLinux}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! Bitcoin Wallet&lt;br /&gt;
|| [https://play.google.com/store/apps/details?id=de.schildbach.wallet Google Play] [https://appworld.blackberry.com/webstore/content/23952882/ BlackBerry World] || {{CLBest|Everyone}} || {{CLGood|Isolated, on-device}} || Partial || Manual || 1 hour || 30 MB || {{CLGood|Mar 2011}} || on JB tablets || {{CLAndroid}} [[file:ico-blackberry.png]]&lt;br /&gt;
|-&lt;br /&gt;
! {{CLGood|Bitcoin-Qt}}&lt;br /&gt;
|| [http://sourceforge.net/projects/bitcoin/files/Bitcoin/ Download] || {{CLGood|End-users}} || {{CLGood|Encrypted, on-device}} || {{CLBest|Full}} || Manual || {{CLBad|Hours}} || {{CLBad|6+ GB}} || {{CLGood|May 2011}} || No || {{CLLinux}}{{CLMac}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! bitcoind&lt;br /&gt;
|| [http://sourceforge.net/projects/bitcoin/files/Bitcoin/ Download] || Programmers || {{CLGood|Encrypted, on-device}} || {{CLBest|Full}} || Manual || {{CLBad|Hours}} || {{CLBad|6+ GB}} || {{CLBest|Aug 2009}} || {{CLGood|Virtual accounts}} || {{CLLinux}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! Electrum&lt;br /&gt;
|| [http://ecdsa.org/electrum/ Download] || Power users || {{CLGood|Encrypted, on-device}} || Minimal || {{CLBest|Memorized}} || {{CLGood|Minutes}} || {{CLGood|5 MB}} || Nov 2011 || No || {{CLLinux}}{{CLMac}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! MultiBit&lt;br /&gt;
|| [http://multibit.org/releases.html Download] || {{CLGood|End-users}} || {{CLBad|None, on-device}} || Partial || {{CLBad|No}} || {{CLBest|Seconds}} || 50 MB || Jul 2011 || {{CLBest|Multi-wallet}} || {{CLLinux}}{{CLMac}}{{CLWin}}&lt;br /&gt;
|-&lt;br /&gt;
! My Wallet&lt;br /&gt;
|| [https://blockchain.info/wallet/new Web-based] || {{CLBest|Everyone}} || Encrypted, on a server || {{CLBad|Remote}} || {{CLGood|Automatic}} || {{CLGood|Minutes}} || {{CLBest|None}} || Dec 2011 || {{CLBest|Yes}} || {{CLAndroid}}{{CLiOS}}{{CLLinux}}{{CLMac}}{{CLWin}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- For Wallet Security: CLBest is reserved for multisig-based --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==For developers==&lt;br /&gt;
&lt;br /&gt;
This table shows additional information about various Bitcoin clients that may be relevant to developers.&lt;br /&gt;
&lt;br /&gt;
{| class=&#039;wikitable&#039; style=&#039;text-align: center&#039;&lt;br /&gt;
! Client !! Website !! Source Code !! License !! Discussion !! Architecture&lt;br /&gt;
|-&lt;br /&gt;
! Armory&lt;br /&gt;
|| [http://bitcoinarmory.com/ Link] ||[https://github.com/etotheipi/BitcoinArmory/ Github] || AGPLv3 || [https://bitcointalk.org/index.php?board=97.0 Bitcointalk] || Integrated&lt;br /&gt;
|-&lt;br /&gt;
! Bitcoin Wallet&lt;br /&gt;
|| [https://code.google.com/p/bitcoin-wallet/ Link] || [https://code.google.com/p/bitcoin-wallet/source/checkout Google Code] [https://github.com/schildbach/bitcoin-wallet Github] || GPLv3 || [https://bitcointalk.org/index.php?board=100.0 Bitcointalk] / [https://groups.google.com/forum/?fromgroups#!forum/bitcoinj Google Groups] || [[Thin Client Security#Simplified Payment Verification (SPV)|SPV]]&lt;br /&gt;
|-&lt;br /&gt;
! Bitcoin-Qt / bitcoind&lt;br /&gt;
|| [http://bitcoin.org/ Link] || [https://github.com/bitcoin/bitcoin Github] || MIT || [https://lists.sourceforge.net/lists/listinfo/bitcoin-development Sourceforge] || Integrated&lt;br /&gt;
|-&lt;br /&gt;
! Electrum&lt;br /&gt;
|| [http://ecdsa.org/electrum/ Link] || [https://gitorious.org/electrum Gitorious] || GPLv3 || [https://lists.sourceforge.net/lists/listinfo/electrum-discuss Sourceforge] || [[Thin Client Security#Server-Trusting Clients|Server-Client]]&lt;br /&gt;
|-&lt;br /&gt;
! MultiBit&lt;br /&gt;
|| [http://multibit.org/ Link] || [https://github.com/jim618/multibit Github] || MIT || [https://groups.google.com/forum/?fromgroups#!forum/bitcoin-multibit Google Groups] || [[Thin Client Security#Simplified Payment Verification (SPV)|SPV]]&lt;br /&gt;
|-&lt;br /&gt;
! My Wallet&lt;br /&gt;
|| [https://blockchain.info/wallet/ Link] || [https://github.com/blockchain/My-Wallet/ Github] || BSD* || None || [[Thin Client Security#Server-Trusting Clients|Server-Client]]&lt;br /&gt;
|-&lt;br /&gt;
! bits of proof&lt;br /&gt;
|| [https://bitsofproof Link] || [https://github.com/bitsofproof/supernode Github] || Apache 2.0 || [https://bitcointalk.org/index.php?topic=122013.0 Bitcointalk] || [[Thin Client Security#Server-Trusting Clients|Server-Client]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Software#Bitcoin_clients|List of clients]]&lt;br /&gt;
* [[Bitcoin Ladder]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Protocol_rules&amp;diff=31936</id>
		<title>Protocol rules</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Protocol_rules&amp;diff=31936"/>
		<updated>2012-10-22T05:24:51Z</updated>

		<summary type="html">&lt;p&gt;Grau: /* Block creation fee */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Rules&#039;&#039;&#039; for [[:Category:Clients|clients]].&lt;br /&gt;
&lt;br /&gt;
The wiki substantially documents the [[Protocol_specification|Bitcoin protocol]], but equally important are the rules used by the client to process messages. It&#039;s crucial that clients follow certain rules in order to maintain consistency across the network, and to protect the Bitcoin security guarantees.&lt;br /&gt;
&lt;br /&gt;
Here, the focus is on handling tx and block messages, because that is the tricky logic. This will skip over the method of requesting and forwarding these messages for now, and describe what to do when they are received. Also, this will describe the minimal data structures in rather abstract terms, ignoring the client&#039;s various indexes, maps and hash tables used for efficiency. This will be a conceptual description. This is all based on a fairly literal reading of the source code.&lt;br /&gt;
&lt;br /&gt;
Mining (block generation) rules are not yet presented.&lt;br /&gt;
&lt;br /&gt;
== Data structures ==&lt;br /&gt;
&lt;br /&gt;
The main data structures are [[transactions]] and [[blocks]]. Blocks are composed of the &#039;&#039;block header&#039;&#039; followed by transactions in the block. Transactions are identified by their hash; blocks by the hash of their header. Blocks have prev pointers that link them into a graph.&lt;br /&gt;
&lt;br /&gt;
Conceptually, the client has the following data structures:&lt;br /&gt;
&lt;br /&gt;
=== Transactions ===&lt;br /&gt;
&lt;br /&gt;
There are two collections of transactions:&lt;br /&gt;
&lt;br /&gt;
;transaction pool&lt;br /&gt;
: an unordered collection of transactions that are not in blocks in the main chain, but for which we have input transactions&lt;br /&gt;
&lt;br /&gt;
;orphan transactions&lt;br /&gt;
: transactions that can&#039;t go into the pool due to one or more missing input transactions&lt;br /&gt;
&lt;br /&gt;
=== Blocks ===&lt;br /&gt;
&lt;br /&gt;
There are 3 categories of blocks:&lt;br /&gt;
&lt;br /&gt;
;blocks in the main branch&lt;br /&gt;
: the transactions in these blocks are considered at least tentatively confirmed&lt;br /&gt;
&lt;br /&gt;
;blocks on side branches off the main branch&lt;br /&gt;
: these blocks have at least tentatively lost the race to be in the main branch&lt;br /&gt;
&lt;br /&gt;
;orphan blocks&lt;br /&gt;
: these are blocks which don&#039;t link into the main branch, normally because of a missing predecessor or nth-level predecessor&lt;br /&gt;
&lt;br /&gt;
Blocks in the first two categories form a tree rooted at the [[genesis block]], linked by the prev pointer, which points toward the root. (It is a very linear tree with few and short branches off the main branch.) The main branch is defined as the branch with highest total difficulty, summing the difficulties for each block in the branch.&lt;br /&gt;
&lt;br /&gt;
See also [[Block Status]].&lt;br /&gt;
&lt;br /&gt;
== Difficulty change ==&lt;br /&gt;
&lt;br /&gt;
The difficulty changes every 2016 blocks.  This choice is designed to occur approximately every two weeks.&lt;br /&gt;
&lt;br /&gt;
: 2 weeks / 10 minutes = 14 * 24 * 60 / 10 = 2016&lt;br /&gt;
&lt;br /&gt;
Once 2016 blocks has been reached we loop back until we hit the 2016th block before the current one. We find the difference in time between the current block and that one. This difference (called the actual timespan) is limited in bounds between [2 weeks/4, 2 weeks*4].&lt;br /&gt;
&lt;br /&gt;
Then we get the last target for this old 2 week window and multiply it by the ratio of the actual timespan / the target timespan (2 weeks in secs).&lt;br /&gt;
&lt;br /&gt;
: new target = old target * time for 2016 blocks / 2 weeks.&lt;br /&gt;
&lt;br /&gt;
If the old set of blocks completed too fast then the target is lowered (difficulty goes up) ensuring it takes longer to solve these new blocks... and vice versa. This way the difficulty oscillates around the ideal of 2 weeks (and 10 mins per block).&lt;br /&gt;
&lt;br /&gt;
== Block creation fee  ==&lt;br /&gt;
&lt;br /&gt;
The block creation fee changes at every 210000 blocks. &lt;br /&gt;
The block creation fee is a function of block height on the chain (genesis=0), and is calculated using 64 bit integer operations &lt;br /&gt;
(in satoshis) as:&lt;br /&gt;
&lt;br /&gt;
(50 * 100000000) &amp;gt;&amp;gt; (height / 210000) &lt;br /&gt;
&lt;br /&gt;
The block creation fee started with 50 BTC, will fall to 25 BTC at block 210000, 12.5 BTC at block 420000, finally down to 0 satoshi with block 6930000. &lt;br /&gt;
The block creation fee of all coinbase transactions will sum up to  2099999997690000 satoshis, practically 21million BTC.&lt;br /&gt;
&lt;br /&gt;
== [[Protocol_specification#tx|&amp;quot;tx&amp;quot;]] messages ==&lt;br /&gt;
&lt;br /&gt;
These messages hold a single transaction.&lt;br /&gt;
&lt;br /&gt;
# Check syntactic correctness&lt;br /&gt;
# Make sure neither in or out lists are empty&lt;br /&gt;
# Size in bytes &amp;lt; MAX_BLOCK_SIZE&lt;br /&gt;
# Each output value, as well as the total, must be in legal money range&lt;br /&gt;
# Make sure none of the inputs have hash=0, n=-1 (&#039;&#039;coinbase&#039;&#039; transactions)&lt;br /&gt;
# Check that nLockTime &amp;lt;= INT_MAX&amp;lt;ref&amp;gt;nLockTime must not exceed 31 bits, as some clients will interpret it incorrectly&amp;lt;/ref&amp;gt;, size in bytes &amp;gt;= 100&amp;lt;ref&amp;gt;A valid transaction requires at least 100 bytes. If it&#039;s any less, the transaction is not valid&amp;lt;/ref&amp;gt;, and sig opcount &amp;lt;= 2&amp;lt;ref&amp;gt;The number of signature operands in the signature (no, that is not redundant) for standard transactions will never exceed two&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Reject &amp;quot;nonstandard&amp;quot; transactions: scriptSig doing anything other than pushing numbers on the stack, or scriptPubkey not matching the two usual forms&amp;lt;ref&amp;gt;Note that this is not a hard requirement on clients.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Reject if we already have matching tx in the pool, or in a block in the main branch&lt;br /&gt;
# Reject if any other tx in the pool uses the same transaction output as one used by this tx.&amp;lt;ref&amp;gt;Note that this is not a hard requirement on clients.  The network-enforced rule is that only &amp;lt;i&amp;gt;one&amp;lt;/i&amp;gt; transaction spending a particular output can be in the blockchain, thus preventing double-spending.  Technically miners can choose which one they want to put into the block they&#039;re working on as long as no other transaction has spent that output either previously in the blockchain, or in the same block.  The in-memory transaction pool can technically be managed in whatever way the miner is willing to implement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# For each input, look in the main branch and the transaction pool to find the referenced output transaction. If the output transaction is missing for any input, this will be an orphan transaction. Add to the orphan transactions, if a matching transaction is not in there already.&lt;br /&gt;
# For each input, if we are using the &#039;&#039;n&#039;&#039;th output of the earlier transaction, but it has fewer than n+1 outputs, reject this transaction&lt;br /&gt;
# For each input, if the referenced output transaction is coinbase (i.e. only 1 input, with hash=0, n=-1), it must have at least COINBASE_MATURITY (100) confirmations; else reject this transaction&lt;br /&gt;
# Verify crypto signatures for each input; reject if any are bad&lt;br /&gt;
# For each input, if the referenced output has already been spent by a transaction in the main branch, reject this transaction&amp;lt;ref&amp;gt;This is the protection against double-spending&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Using the referenced output transactions to get input values, check that each input value, as well as the sum, are in legal money range&lt;br /&gt;
# Reject if the sum of input values &amp;lt; sum of output values&lt;br /&gt;
# Reject if transaction fee (defined as sum of input values minus sum of output values) would be too low to get into an empty block&lt;br /&gt;
# Add to transaction pool&amp;lt;ref&amp;gt;Note that when the transaction is accepted into the memory pool, an additional check is made to ensure that the coinbase value does not exceed the transaction fees plus the expected BTC value (50BTC as of this writing).&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;quot;Add to wallet if mine&amp;quot;&lt;br /&gt;
# Relay transaction to peers&lt;br /&gt;
# For each orphan transaction that uses this one as one of its inputs, run all these steps (including this one) recursively on that orphan&lt;br /&gt;
&lt;br /&gt;
===Explanation of Some Rules===&lt;br /&gt;
Most rules are self-explanatory. This section explains why some of the less obvious rules are in place.&lt;br /&gt;
&lt;br /&gt;
== [[Protocol_specification#block|&amp;quot;block&amp;quot;]] messages ==&lt;br /&gt;
&lt;br /&gt;
These messages hold a single block.&lt;br /&gt;
&lt;br /&gt;
# Check syntactic correctness&lt;br /&gt;
# Reject if duplicate of block we have in any of the three categories&lt;br /&gt;
# Transaction list must be non-empty&lt;br /&gt;
# Block hash must satisfy claimed &#039;&#039;nBits&#039;&#039; proof of work&lt;br /&gt;
# Block timestamp must not be more than two hours in the future&lt;br /&gt;
# First transaction must be coinbase (i.e. only 1 input, with hash=0, n=-1), the rest must not be&lt;br /&gt;
# For each transaction, apply &amp;quot;tx&amp;quot; checks 2-4&lt;br /&gt;
# For the coinbase (first) transaction, scriptSig length must be 2-100&lt;br /&gt;
# Reject if sum of transaction sig opcounts &amp;gt; MAX_BLOCK_SIGOPS&lt;br /&gt;
# Verify Merkle hash&lt;br /&gt;
# Check if prev block (matching &#039;&#039;prev&#039;&#039; hash) is in main branch or side branches. If not, add this to orphan blocks, then query peer we got this from for 1st missing orphan block in &#039;&#039;prev&#039;&#039; chain; done with block&lt;br /&gt;
# Check that &#039;&#039;nBits&#039;&#039; value matches the difficulty rules&lt;br /&gt;
# Reject if timestamp is before the median time of the last 11 blocks&lt;br /&gt;
# For certain old blocks (i.e. on initial block download) check that hash matches known values&lt;br /&gt;
# Add block into the tree. There are three cases: 1. block further extends the main branch; 2. block extends a side branch but does not add enough difficulty to make it become the new main branch; 3. block extends a side branch and makes it the new main branch.&lt;br /&gt;
# For case 1, adding to main branch:&lt;br /&gt;
## For all but the coinbase transaction, apply the following:&lt;br /&gt;
### For each input, look in the main branch to find the referenced output transaction. Reject if the output transaction is missing for any input.&lt;br /&gt;
### For each input, if we are using the &#039;&#039;n&#039;&#039;th output of the earlier transaction, but it has fewer than n+1 outputs, reject.&lt;br /&gt;
### For each input, if the referenced output transaction is coinbase (i.e. only 1 input, with hash=0, n=-1), it must have at least COINBASE_MATURITY (100) confirmations; else reject.&lt;br /&gt;
### Verify crypto signatures for each input; reject if any are bad&lt;br /&gt;
### For each input, if the referenced output has already been spent by a transaction in the main branch, reject&lt;br /&gt;
### Using the referenced output transactions to get input values, check that each input value, as well as the sum, are in legal money range&lt;br /&gt;
### Reject if the sum of input values &amp;lt; sum of output values&lt;br /&gt;
## Reject if coinbase value &amp;gt; sum of block creation fee and transaction fees&lt;br /&gt;
## (If we have not rejected):&lt;br /&gt;
## For each transaction, &amp;quot;Add to wallet if mine&amp;quot;&lt;br /&gt;
## For each transaction in the block, delete any matching transaction from the transaction pool&lt;br /&gt;
## Relay block to our peers&lt;br /&gt;
## If we rejected, the block is not counted as part of the main branch&lt;br /&gt;
# For case 2, adding to a side branch, we don&#039;t do anything.&lt;br /&gt;
# For case 3, a side branch becoming the main branch:&lt;br /&gt;
## Find the &#039;&#039;fork&#039;&#039; block on the main branch which this side branch forks off of&lt;br /&gt;
## Redefine the main branch to only go up to this &#039;&#039;fork&#039;&#039; block&lt;br /&gt;
## For each block on the side branch, from the child of the &#039;&#039;fork&#039;&#039; block to the leaf, add to the main branch:&lt;br /&gt;
### Do &amp;quot;branch&amp;quot; checks 3-11&lt;br /&gt;
### For all but the coinbase transaction, apply the following:&lt;br /&gt;
#### For each input, look in the main branch to find the referenced output transaction. Reject if the output transaction is missing for any input.&lt;br /&gt;
#### For each input, if we are using the &#039;&#039;n&#039;&#039;th output of the earlier transaction, but it has fewer than n+1 outputs, reject.&lt;br /&gt;
#### For each input, if the referenced output transaction is coinbase (i.e. only 1 input, with hash=0, n=-1), it must have at least COINBASE_MATURITY (100) confirmations; else reject.&lt;br /&gt;
#### Verify crypto signatures for each input; reject if any are bad&lt;br /&gt;
#### For each input, if the referenced output has already been spent by a transaction in the main branch, reject&lt;br /&gt;
#### Using the referenced output transactions to get input values, check that each input value, as well as the sum, are in legal money range&lt;br /&gt;
#### Reject if the sum of input values &amp;lt; sum of output values&lt;br /&gt;
### Reject if coinbase value &amp;gt; sum of block creation fee and transaction fees&lt;br /&gt;
### (If we have not rejected):&lt;br /&gt;
### For each transaction, &amp;quot;Add to wallet if mine&amp;quot;&lt;br /&gt;
## If we reject at any point, leave the main branch as what it was originally, done with block&lt;br /&gt;
## For each block in the old main branch, from the leaf down to the child of the &#039;&#039;fork&#039;&#039; block:&lt;br /&gt;
### For each non-coinbase transaction in the block:&lt;br /&gt;
#### Apply &amp;quot;tx&amp;quot; checks 2-9, except in step 8, only look in the transaction pool for duplicates, not the main branch&lt;br /&gt;
#### Add to transaction pool if accepted, else go on to next transaction&lt;br /&gt;
## For each block in the new main branch, from the child of the &#039;&#039;fork&#039;&#039; node to the leaf:&lt;br /&gt;
### For each transaction in the block, delete any matching transaction from the transaction pool&lt;br /&gt;
## Relay block to our peers&lt;br /&gt;
# For each orphan block for which this block is its &#039;&#039;prev&#039;&#039;, run all these steps (including this one) recursively on that orphan&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Protocol specification]]&lt;br /&gt;
* [[Bitcoin Improvement Proposals]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical]][[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Protocol_rules&amp;diff=31924</id>
		<title>Protocol rules</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Protocol_rules&amp;diff=31924"/>
		<updated>2012-10-21T18:27:38Z</updated>

		<summary type="html">&lt;p&gt;Grau: Used the term block creation fee as in other rules. Reverted change to rule 6 of block.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Rules&#039;&#039;&#039; for [[:Category:Clients|clients]].&lt;br /&gt;
&lt;br /&gt;
The wiki substantially documents the [[Protocol_specification|Bitcoin protocol]], but equally important are the rules used by the client to process messages. It&#039;s crucial that clients follow certain rules in order to maintain consistency across the network, and to protect the Bitcoin security guarantees.&lt;br /&gt;
&lt;br /&gt;
Here, the focus is on handling tx and block messages, because that is the tricky logic. This will skip over the method of requesting and forwarding these messages for now, and describe what to do when they are received. Also, this will describe the minimal data structures in rather abstract terms, ignoring the client&#039;s various indexes, maps and hash tables used for efficiency. This will be a conceptual description. This is all based on a fairly literal reading of the source code.&lt;br /&gt;
&lt;br /&gt;
Mining (block generation) rules are not yet presented.&lt;br /&gt;
&lt;br /&gt;
== Data structures ==&lt;br /&gt;
&lt;br /&gt;
The main data structures are [[transactions]] and [[blocks]]. Blocks are composed of the &#039;&#039;block header&#039;&#039; followed by transactions in the block. Transactions are identified by their hash; blocks by the hash of their header. Blocks have prev pointers that link them into a graph.&lt;br /&gt;
&lt;br /&gt;
Conceptually, the client has the following data structures:&lt;br /&gt;
&lt;br /&gt;
=== Transactions ===&lt;br /&gt;
&lt;br /&gt;
There are two collections of transactions:&lt;br /&gt;
&lt;br /&gt;
;transaction pool&lt;br /&gt;
: an unordered collection of transactions that are not in blocks in the main chain, but for which we have input transactions&lt;br /&gt;
&lt;br /&gt;
;orphan transactions&lt;br /&gt;
: transactions that can&#039;t go into the pool due to one or more missing input transactions&lt;br /&gt;
&lt;br /&gt;
=== Blocks ===&lt;br /&gt;
&lt;br /&gt;
There are 3 categories of blocks:&lt;br /&gt;
&lt;br /&gt;
;blocks in the main branch&lt;br /&gt;
: the transactions in these blocks are considered at least tentatively confirmed&lt;br /&gt;
&lt;br /&gt;
;blocks on side branches off the main branch&lt;br /&gt;
: these blocks have at least tentatively lost the race to be in the main branch&lt;br /&gt;
&lt;br /&gt;
;orphan blocks&lt;br /&gt;
: these are blocks which don&#039;t link into the main branch, normally because of a missing predecessor or nth-level predecessor&lt;br /&gt;
&lt;br /&gt;
Blocks in the first two categories form a tree rooted at the [[genesis block]], linked by the prev pointer, which points toward the root. (It is a very linear tree with few and short branches off the main branch.) The main branch is defined as the branch with highest total difficulty, summing the difficulties for each block in the branch.&lt;br /&gt;
&lt;br /&gt;
See also [[Block Status]].&lt;br /&gt;
&lt;br /&gt;
== Difficulty change ==&lt;br /&gt;
&lt;br /&gt;
The difficulty changes every 2016 blocks.  This choice is designed to occur approximately every two weeks.&lt;br /&gt;
&lt;br /&gt;
: 2 weeks / 10 minutes = 14 * 24 * 60 / 10 = 2016&lt;br /&gt;
&lt;br /&gt;
Once 2016 blocks has been reached we loop back until we hit the 2016th block before the current one. We find the difference in time between the current block and that one. This difference (called the actual timespan) is limited in bounds between [2 weeks/4, 2 weeks*4].&lt;br /&gt;
&lt;br /&gt;
Then we get the last target for this old 2 week window and multiply it by the ratio of the actual timespan / the target timespan (2 weeks in secs).&lt;br /&gt;
&lt;br /&gt;
: new target = old target * time for 2016 blocks / 2 weeks.&lt;br /&gt;
&lt;br /&gt;
If the old set of blocks completed too fast then the target is lowered (difficulty goes up) ensuring it takes longer to solve these new blocks... and vice versa. This way the difficulty oscillates around the ideal of 2 weeks (and 10 mins per block).&lt;br /&gt;
&lt;br /&gt;
== Block creation fee  ==&lt;br /&gt;
&lt;br /&gt;
The block creation fee changes at every 210000 blocks. &lt;br /&gt;
The block creation fee is a function of block height on the chain (genesis=0), and is calculated using 64 bit integer operations &lt;br /&gt;
(in satoshis) as:&lt;br /&gt;
&lt;br /&gt;
(50 * 100000000) &amp;gt;&amp;gt; (height / 210000) &lt;br /&gt;
&lt;br /&gt;
The block creation fee started with 50 BTC, will fall to 25 BTC at block 210000, 12 BTC at block 420000, finally down to 0 satoshi with block 6930000. &lt;br /&gt;
The block creation fee of all coinbase transactions will sum up to  2099999997690000 satoshis, practically 21million BTC.&lt;br /&gt;
&lt;br /&gt;
== [[Protocol_specification#tx|&amp;quot;tx&amp;quot;]] messages ==&lt;br /&gt;
&lt;br /&gt;
These messages hold a single transaction.&lt;br /&gt;
&lt;br /&gt;
# Check syntactic correctness&lt;br /&gt;
# Make sure neither in or out lists are empty&lt;br /&gt;
# Size in bytes &amp;lt; MAX_BLOCK_SIZE&lt;br /&gt;
# Each output value, as well as the total, must be in legal money range&lt;br /&gt;
# Make sure none of the inputs have hash=0, n=-1 (&#039;&#039;coinbase&#039;&#039; transactions)&lt;br /&gt;
# Check that nLockTime &amp;lt;= INT_MAX&amp;lt;ref&amp;gt;nLockTime must not exceed 31 bits, as some clients will interpret it incorrectly&amp;lt;/ref&amp;gt;, size in bytes &amp;gt;= 100&amp;lt;ref&amp;gt;A valid transaction requires at least 100 bytes. If it&#039;s any less, the transaction is not valid&amp;lt;/ref&amp;gt;, and sig opcount &amp;lt;= 2&amp;lt;ref&amp;gt;The number of signature operands in the signature (no, that is not redundant) for standard transactions will never exceed two&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Reject &amp;quot;nonstandard&amp;quot; transactions: scriptSig doing anything other than pushing numbers on the stack, or scriptPubkey not matching the two usual forms&amp;lt;ref&amp;gt;Note that this is not a hard requirement on clients.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Reject if we already have matching tx in the pool, or in a block in the main branch&lt;br /&gt;
# Reject if any other tx in the pool uses the same transaction output as one used by this tx.&amp;lt;ref&amp;gt;Note that this is not a hard requirement on clients.  The network-enforced rule is that only &amp;lt;i&amp;gt;one&amp;lt;/i&amp;gt; transaction spending a particular output can be in the blockchain, thus preventing double-spending.  Technically miners can choose which one they want to put into the block they&#039;re working on as long as no other transaction has spent that output either previously in the blockchain, or in the same block.  The in-memory transaction pool can technically be managed in whatever way the miner is willing to implement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# For each input, look in the main branch and the transaction pool to find the referenced output transaction. If the output transaction is missing for any input, this will be an orphan transaction. Add to the orphan transactions, if a matching transaction is not in there already.&lt;br /&gt;
# For each input, if we are using the &#039;&#039;n&#039;&#039;th output of the earlier transaction, but it has fewer than n+1 outputs, reject this transaction&lt;br /&gt;
# For each input, if the referenced output transaction is coinbase (i.e. only 1 input, with hash=0, n=-1), it must have at least COINBASE_MATURITY (100) confirmations; else reject this transaction&lt;br /&gt;
# Verify crypto signatures for each input; reject if any are bad&lt;br /&gt;
# For each input, if the referenced output has already been spent by a transaction in the main branch, reject this transaction&amp;lt;ref&amp;gt;This is the protection against double-spending&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Using the referenced output transactions to get input values, check that each input value, as well as the sum, are in legal money range&lt;br /&gt;
# Reject if the sum of input values &amp;lt; sum of output values&lt;br /&gt;
# Reject if transaction fee (defined as sum of input values minus sum of output values) would be too low to get into an empty block&lt;br /&gt;
# Add to transaction pool&amp;lt;ref&amp;gt;Note that when the transaction is accepted into the memory pool, an additional check is made to ensure that the coinbase value does not exceed the transaction fees plus the expected BTC value (50BTC as of this writing).&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;quot;Add to wallet if mine&amp;quot;&lt;br /&gt;
# Relay transaction to peers&lt;br /&gt;
# For each orphan transaction that uses this one as one of its inputs, run all these steps (including this one) recursively on that orphan&lt;br /&gt;
&lt;br /&gt;
===Explanation of Some Rules===&lt;br /&gt;
Most rules are self-explanatory. This section explains why some of the less obvious rules are in place.&lt;br /&gt;
&lt;br /&gt;
== [[Protocol_specification#block|&amp;quot;block&amp;quot;]] messages ==&lt;br /&gt;
&lt;br /&gt;
These messages hold a single block.&lt;br /&gt;
&lt;br /&gt;
# Check syntactic correctness&lt;br /&gt;
# Reject if duplicate of block we have in any of the three categories&lt;br /&gt;
# Transaction list must be non-empty&lt;br /&gt;
# Block hash must satisfy claimed &#039;&#039;nBits&#039;&#039; proof of work&lt;br /&gt;
# Block timestamp must not be more than two hours in the future&lt;br /&gt;
# First transaction must be coinbase (i.e. only 1 input, with hash=0, n=-1), the rest must not be&lt;br /&gt;
# For each transaction, apply &amp;quot;tx&amp;quot; checks 2-4&lt;br /&gt;
# For the coinbase (first) transaction, scriptSig length must be 2-100&lt;br /&gt;
# Reject if sum of transaction sig opcounts &amp;gt; MAX_BLOCK_SIGOPS&lt;br /&gt;
# Verify Merkle hash&lt;br /&gt;
# Check if prev block (matching &#039;&#039;prev&#039;&#039; hash) is in main branch or side branches. If not, add this to orphan blocks, then query peer we got this from for 1st missing orphan block in &#039;&#039;prev&#039;&#039; chain; done with block&lt;br /&gt;
# Check that &#039;&#039;nBits&#039;&#039; value matches the difficulty rules&lt;br /&gt;
# Reject if timestamp is before the median time of the last 11 blocks&lt;br /&gt;
# For certain old blocks (i.e. on initial block download) check that hash matches known values&lt;br /&gt;
# Add block into the tree. There are three cases: 1. block further extends the main branch; 2. block extends a side branch but does not add enough difficulty to make it become the new main branch; 3. block extends a side branch and makes it the new main branch.&lt;br /&gt;
# For case 1, adding to main branch:&lt;br /&gt;
## For all but the coinbase transaction, apply the following:&lt;br /&gt;
### For each input, look in the main branch to find the referenced output transaction. Reject if the output transaction is missing for any input.&lt;br /&gt;
### For each input, if we are using the &#039;&#039;n&#039;&#039;th output of the earlier transaction, but it has fewer than n+1 outputs, reject.&lt;br /&gt;
### For each input, if the referenced output transaction is coinbase (i.e. only 1 input, with hash=0, n=-1), it must have at least COINBASE_MATURITY (100) confirmations; else reject.&lt;br /&gt;
### Verify crypto signatures for each input; reject if any are bad&lt;br /&gt;
### For each input, if the referenced output has already been spent by a transaction in the main branch, reject&lt;br /&gt;
### Using the referenced output transactions to get input values, check that each input value, as well as the sum, are in legal money range&lt;br /&gt;
### Reject if the sum of input values &amp;lt; sum of output values&lt;br /&gt;
## Reject if coinbase value &amp;gt; sum of block creation fee and transaction fees&lt;br /&gt;
## (If we have not rejected):&lt;br /&gt;
## For each transaction, &amp;quot;Add to wallet if mine&amp;quot;&lt;br /&gt;
## For each transaction in the block, delete any matching transaction from the transaction pool&lt;br /&gt;
## Relay block to our peers&lt;br /&gt;
## If we rejected, the block is not counted as part of the main branch&lt;br /&gt;
# For case 2, adding to a side branch, we don&#039;t do anything.&lt;br /&gt;
# For case 3, a side branch becoming the main branch:&lt;br /&gt;
## Find the &#039;&#039;fork&#039;&#039; block on the main branch which this side branch forks off of&lt;br /&gt;
## Redefine the main branch to only go up to this &#039;&#039;fork&#039;&#039; block&lt;br /&gt;
## For each block on the side branch, from the child of the &#039;&#039;fork&#039;&#039; block to the leaf, add to the main branch:&lt;br /&gt;
### Do &amp;quot;branch&amp;quot; checks 3-11&lt;br /&gt;
### For all but the coinbase transaction, apply the following:&lt;br /&gt;
#### For each input, look in the main branch to find the referenced output transaction. Reject if the output transaction is missing for any input.&lt;br /&gt;
#### For each input, if we are using the &#039;&#039;n&#039;&#039;th output of the earlier transaction, but it has fewer than n+1 outputs, reject.&lt;br /&gt;
#### For each input, if the referenced output transaction is coinbase (i.e. only 1 input, with hash=0, n=-1), it must have at least COINBASE_MATURITY (100) confirmations; else reject.&lt;br /&gt;
#### Verify crypto signatures for each input; reject if any are bad&lt;br /&gt;
#### For each input, if the referenced output has already been spent by a transaction in the main branch, reject&lt;br /&gt;
#### Using the referenced output transactions to get input values, check that each input value, as well as the sum, are in legal money range&lt;br /&gt;
#### Reject if the sum of input values &amp;lt; sum of output values&lt;br /&gt;
### Reject if coinbase value &amp;gt; sum of block creation fee and transaction fees&lt;br /&gt;
### (If we have not rejected):&lt;br /&gt;
### For each transaction, &amp;quot;Add to wallet if mine&amp;quot;&lt;br /&gt;
## If we reject at any point, leave the main branch as what it was originally, done with block&lt;br /&gt;
## For each block in the old main branch, from the leaf down to the child of the &#039;&#039;fork&#039;&#039; block:&lt;br /&gt;
### For each non-coinbase transaction in the block:&lt;br /&gt;
#### Apply &amp;quot;tx&amp;quot; checks 2-9, except in step 8, only look in the transaction pool for duplicates, not the main branch&lt;br /&gt;
#### Add to transaction pool if accepted, else go on to next transaction&lt;br /&gt;
## For each block in the new main branch, from the child of the &#039;&#039;fork&#039;&#039; node to the leaf:&lt;br /&gt;
### For each transaction in the block, delete any matching transaction from the transaction pool&lt;br /&gt;
## Relay block to our peers&lt;br /&gt;
# For each orphan block for which this block is its &#039;&#039;prev&#039;&#039;, run all these steps (including this one) recursively on that orphan&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Protocol specification]]&lt;br /&gt;
* [[Bitcoin Improvement Proposals]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical]][[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Protocol_rules&amp;diff=31923</id>
		<title>Protocol rules</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Protocol_rules&amp;diff=31923"/>
		<updated>2012-10-21T18:01:07Z</updated>

		<summary type="html">&lt;p&gt;Grau: Added coinbase value rule in a new section. Added coinbase output value check in block rule 6.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Rules&#039;&#039;&#039; for [[:Category:Clients|clients]].&lt;br /&gt;
&lt;br /&gt;
The wiki substantially documents the [[Protocol_specification|Bitcoin protocol]], but equally important are the rules used by the client to process messages. It&#039;s crucial that clients follow certain rules in order to maintain consistency across the network, and to protect the Bitcoin security guarantees.&lt;br /&gt;
&lt;br /&gt;
Here, the focus is on handling tx and block messages, because that is the tricky logic. This will skip over the method of requesting and forwarding these messages for now, and describe what to do when they are received. Also, this will describe the minimal data structures in rather abstract terms, ignoring the client&#039;s various indexes, maps and hash tables used for efficiency. This will be a conceptual description. This is all based on a fairly literal reading of the source code.&lt;br /&gt;
&lt;br /&gt;
Mining (block generation) rules are not yet presented.&lt;br /&gt;
&lt;br /&gt;
== Data structures ==&lt;br /&gt;
&lt;br /&gt;
The main data structures are [[transactions]] and [[blocks]]. Blocks are composed of the &#039;&#039;block header&#039;&#039; followed by transactions in the block. Transactions are identified by their hash; blocks by the hash of their header. Blocks have prev pointers that link them into a graph.&lt;br /&gt;
&lt;br /&gt;
Conceptually, the client has the following data structures:&lt;br /&gt;
&lt;br /&gt;
=== Transactions ===&lt;br /&gt;
&lt;br /&gt;
There are two collections of transactions:&lt;br /&gt;
&lt;br /&gt;
;transaction pool&lt;br /&gt;
: an unordered collection of transactions that are not in blocks in the main chain, but for which we have input transactions&lt;br /&gt;
&lt;br /&gt;
;orphan transactions&lt;br /&gt;
: transactions that can&#039;t go into the pool due to one or more missing input transactions&lt;br /&gt;
&lt;br /&gt;
=== Blocks ===&lt;br /&gt;
&lt;br /&gt;
There are 3 categories of blocks:&lt;br /&gt;
&lt;br /&gt;
;blocks in the main branch&lt;br /&gt;
: the transactions in these blocks are considered at least tentatively confirmed&lt;br /&gt;
&lt;br /&gt;
;blocks on side branches off the main branch&lt;br /&gt;
: these blocks have at least tentatively lost the race to be in the main branch&lt;br /&gt;
&lt;br /&gt;
;orphan blocks&lt;br /&gt;
: these are blocks which don&#039;t link into the main branch, normally because of a missing predecessor or nth-level predecessor&lt;br /&gt;
&lt;br /&gt;
Blocks in the first two categories form a tree rooted at the [[genesis block]], linked by the prev pointer, which points toward the root. (It is a very linear tree with few and short branches off the main branch.) The main branch is defined as the branch with highest total difficulty, summing the difficulties for each block in the branch.&lt;br /&gt;
&lt;br /&gt;
See also [[Block Status]].&lt;br /&gt;
&lt;br /&gt;
== Difficulty change ==&lt;br /&gt;
&lt;br /&gt;
The difficulty changes every 2016 blocks.  This choice is designed to occur approximately every two weeks.&lt;br /&gt;
&lt;br /&gt;
: 2 weeks / 10 minutes = 14 * 24 * 60 / 10 = 2016&lt;br /&gt;
&lt;br /&gt;
Once 2016 blocks has been reached we loop back until we hit the 2016th block before the current one. We find the difference in time between the current block and that one. This difference (called the actual timespan) is limited in bounds between [2 weeks/4, 2 weeks*4].&lt;br /&gt;
&lt;br /&gt;
Then we get the last target for this old 2 week window and multiply it by the ratio of the actual timespan / the target timespan (2 weeks in secs).&lt;br /&gt;
&lt;br /&gt;
: new target = old target * time for 2016 blocks / 2 weeks.&lt;br /&gt;
&lt;br /&gt;
If the old set of blocks completed too fast then the target is lowered (difficulty goes up) ensuring it takes longer to solve these new blocks... and vice versa. This way the difficulty oscillates around the ideal of 2 weeks (and 10 mins per block).&lt;br /&gt;
&lt;br /&gt;
== Coinbase value change ==&lt;br /&gt;
&lt;br /&gt;
The output value of the coinbase transaction of a block, changes at every 210000 blocks. &lt;br /&gt;
The output value is a function of block height on the chain (genesis=0), and is calculated using 64 bit integer operations &lt;br /&gt;
(in satoshis) as:&lt;br /&gt;
&lt;br /&gt;
(50 * 100000000) &amp;gt;&amp;gt; (height / 210000) &lt;br /&gt;
&lt;br /&gt;
The output value started with 50 BTC, will fall to 25 BTC at block 210000, 12 BTC at block 420000, finally down to 0 satoshi with block 6930000. &lt;br /&gt;
The output value of all coinbase transactions will sum up to  2099999997690000 satoshis, practically 21million BTC.&lt;br /&gt;
&lt;br /&gt;
== [[Protocol_specification#tx|&amp;quot;tx&amp;quot;]] messages ==&lt;br /&gt;
&lt;br /&gt;
These messages hold a single transaction.&lt;br /&gt;
&lt;br /&gt;
# Check syntactic correctness&lt;br /&gt;
# Make sure neither in or out lists are empty&lt;br /&gt;
# Size in bytes &amp;lt; MAX_BLOCK_SIZE&lt;br /&gt;
# Each output value, as well as the total, must be in legal money range&lt;br /&gt;
# Make sure none of the inputs have hash=0, n=-1 (&#039;&#039;coinbase&#039;&#039; transactions)&lt;br /&gt;
# Check that nLockTime &amp;lt;= INT_MAX&amp;lt;ref&amp;gt;nLockTime must not exceed 31 bits, as some clients will interpret it incorrectly&amp;lt;/ref&amp;gt;, size in bytes &amp;gt;= 100&amp;lt;ref&amp;gt;A valid transaction requires at least 100 bytes. If it&#039;s any less, the transaction is not valid&amp;lt;/ref&amp;gt;, and sig opcount &amp;lt;= 2&amp;lt;ref&amp;gt;The number of signature operands in the signature (no, that is not redundant) for standard transactions will never exceed two&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Reject &amp;quot;nonstandard&amp;quot; transactions: scriptSig doing anything other than pushing numbers on the stack, or scriptPubkey not matching the two usual forms&amp;lt;ref&amp;gt;Note that this is not a hard requirement on clients.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Reject if we already have matching tx in the pool, or in a block in the main branch&lt;br /&gt;
# Reject if any other tx in the pool uses the same transaction output as one used by this tx.&amp;lt;ref&amp;gt;Note that this is not a hard requirement on clients.  The network-enforced rule is that only &amp;lt;i&amp;gt;one&amp;lt;/i&amp;gt; transaction spending a particular output can be in the blockchain, thus preventing double-spending.  Technically miners can choose which one they want to put into the block they&#039;re working on as long as no other transaction has spent that output either previously in the blockchain, or in the same block.  The in-memory transaction pool can technically be managed in whatever way the miner is willing to implement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# For each input, look in the main branch and the transaction pool to find the referenced output transaction. If the output transaction is missing for any input, this will be an orphan transaction. Add to the orphan transactions, if a matching transaction is not in there already.&lt;br /&gt;
# For each input, if we are using the &#039;&#039;n&#039;&#039;th output of the earlier transaction, but it has fewer than n+1 outputs, reject this transaction&lt;br /&gt;
# For each input, if the referenced output transaction is coinbase (i.e. only 1 input, with hash=0, n=-1), it must have at least COINBASE_MATURITY (100) confirmations; else reject this transaction&lt;br /&gt;
# Verify crypto signatures for each input; reject if any are bad&lt;br /&gt;
# For each input, if the referenced output has already been spent by a transaction in the main branch, reject this transaction&amp;lt;ref&amp;gt;This is the protection against double-spending&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Using the referenced output transactions to get input values, check that each input value, as well as the sum, are in legal money range&lt;br /&gt;
# Reject if the sum of input values &amp;lt; sum of output values&lt;br /&gt;
# Reject if transaction fee (defined as sum of input values minus sum of output values) would be too low to get into an empty block&lt;br /&gt;
# Add to transaction pool&amp;lt;ref&amp;gt;Note that when the transaction is accepted into the memory pool, an additional check is made to ensure that the coinbase value does not exceed the transaction fees plus the expected BTC value (50BTC as of this writing).&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;quot;Add to wallet if mine&amp;quot;&lt;br /&gt;
# Relay transaction to peers&lt;br /&gt;
# For each orphan transaction that uses this one as one of its inputs, run all these steps (including this one) recursively on that orphan&lt;br /&gt;
&lt;br /&gt;
===Explanation of Some Rules===&lt;br /&gt;
Most rules are self-explanatory. This section explains why some of the less obvious rules are in place.&lt;br /&gt;
&lt;br /&gt;
== [[Protocol_specification#block|&amp;quot;block&amp;quot;]] messages ==&lt;br /&gt;
&lt;br /&gt;
These messages hold a single block.&lt;br /&gt;
&lt;br /&gt;
# Check syntactic correctness&lt;br /&gt;
# Reject if duplicate of block we have in any of the three categories&lt;br /&gt;
# Transaction list must be non-empty&lt;br /&gt;
# Block hash must satisfy claimed &#039;&#039;nBits&#039;&#039; proof of work&lt;br /&gt;
# Block timestamp must not be more than two hours in the future&lt;br /&gt;
# First transaction must be coinbase with the right output value for the height (i.e. only 1 input, with hash=0, n=-1), the rest must not be&lt;br /&gt;
# For each transaction, apply &amp;quot;tx&amp;quot; checks 2-4&lt;br /&gt;
# For the coinbase (first) transaction, scriptSig length must be 2-100&lt;br /&gt;
# Reject if sum of transaction sig opcounts &amp;gt; MAX_BLOCK_SIGOPS&lt;br /&gt;
# Verify Merkle hash&lt;br /&gt;
# Check if prev block (matching &#039;&#039;prev&#039;&#039; hash) is in main branch or side branches. If not, add this to orphan blocks, then query peer we got this from for 1st missing orphan block in &#039;&#039;prev&#039;&#039; chain; done with block&lt;br /&gt;
# Check that &#039;&#039;nBits&#039;&#039; value matches the difficulty rules&lt;br /&gt;
# Reject if timestamp is before the median time of the last 11 blocks&lt;br /&gt;
# For certain old blocks (i.e. on initial block download) check that hash matches known values&lt;br /&gt;
# Add block into the tree. There are three cases: 1. block further extends the main branch; 2. block extends a side branch but does not add enough difficulty to make it become the new main branch; 3. block extends a side branch and makes it the new main branch.&lt;br /&gt;
# For case 1, adding to main branch:&lt;br /&gt;
## For all but the coinbase transaction, apply the following:&lt;br /&gt;
### For each input, look in the main branch to find the referenced output transaction. Reject if the output transaction is missing for any input.&lt;br /&gt;
### For each input, if we are using the &#039;&#039;n&#039;&#039;th output of the earlier transaction, but it has fewer than n+1 outputs, reject.&lt;br /&gt;
### For each input, if the referenced output transaction is coinbase (i.e. only 1 input, with hash=0, n=-1), it must have at least COINBASE_MATURITY (100) confirmations; else reject.&lt;br /&gt;
### Verify crypto signatures for each input; reject if any are bad&lt;br /&gt;
### For each input, if the referenced output has already been spent by a transaction in the main branch, reject&lt;br /&gt;
### Using the referenced output transactions to get input values, check that each input value, as well as the sum, are in legal money range&lt;br /&gt;
### Reject if the sum of input values &amp;lt; sum of output values&lt;br /&gt;
## Reject if coinbase value &amp;gt; sum of block creation fee and transaction fees&lt;br /&gt;
## (If we have not rejected):&lt;br /&gt;
## For each transaction, &amp;quot;Add to wallet if mine&amp;quot;&lt;br /&gt;
## For each transaction in the block, delete any matching transaction from the transaction pool&lt;br /&gt;
## Relay block to our peers&lt;br /&gt;
## If we rejected, the block is not counted as part of the main branch&lt;br /&gt;
# For case 2, adding to a side branch, we don&#039;t do anything.&lt;br /&gt;
# For case 3, a side branch becoming the main branch:&lt;br /&gt;
## Find the &#039;&#039;fork&#039;&#039; block on the main branch which this side branch forks off of&lt;br /&gt;
## Redefine the main branch to only go up to this &#039;&#039;fork&#039;&#039; block&lt;br /&gt;
## For each block on the side branch, from the child of the &#039;&#039;fork&#039;&#039; block to the leaf, add to the main branch:&lt;br /&gt;
### Do &amp;quot;branch&amp;quot; checks 3-11&lt;br /&gt;
### For all but the coinbase transaction, apply the following:&lt;br /&gt;
#### For each input, look in the main branch to find the referenced output transaction. Reject if the output transaction is missing for any input.&lt;br /&gt;
#### For each input, if we are using the &#039;&#039;n&#039;&#039;th output of the earlier transaction, but it has fewer than n+1 outputs, reject.&lt;br /&gt;
#### For each input, if the referenced output transaction is coinbase (i.e. only 1 input, with hash=0, n=-1), it must have at least COINBASE_MATURITY (100) confirmations; else reject.&lt;br /&gt;
#### Verify crypto signatures for each input; reject if any are bad&lt;br /&gt;
#### For each input, if the referenced output has already been spent by a transaction in the main branch, reject&lt;br /&gt;
#### Using the referenced output transactions to get input values, check that each input value, as well as the sum, are in legal money range&lt;br /&gt;
#### Reject if the sum of input values &amp;lt; sum of output values&lt;br /&gt;
### Reject if coinbase value &amp;gt; sum of block creation fee and transaction fees&lt;br /&gt;
### (If we have not rejected):&lt;br /&gt;
### For each transaction, &amp;quot;Add to wallet if mine&amp;quot;&lt;br /&gt;
## If we reject at any point, leave the main branch as what it was originally, done with block&lt;br /&gt;
## For each block in the old main branch, from the leaf down to the child of the &#039;&#039;fork&#039;&#039; block:&lt;br /&gt;
### For each non-coinbase transaction in the block:&lt;br /&gt;
#### Apply &amp;quot;tx&amp;quot; checks 2-9, except in step 8, only look in the transaction pool for duplicates, not the main branch&lt;br /&gt;
#### Add to transaction pool if accepted, else go on to next transaction&lt;br /&gt;
## For each block in the new main branch, from the child of the &#039;&#039;fork&#039;&#039; node to the leaf:&lt;br /&gt;
### For each transaction in the block, delete any matching transaction from the transaction pool&lt;br /&gt;
## Relay block to our peers&lt;br /&gt;
# For each orphan block for which this block is its &#039;&#039;prev&#039;&#039;, run all these steps (including this one) recursively on that orphan&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Protocol specification]]&lt;br /&gt;
* [[Bitcoin Improvement Proposals]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical]][[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Grau</name></author>
	</entry>
</feed>