<?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=Devrandom</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=Devrandom"/>
	<link rel="alternate" type="text/html" href="https://en.bitcoin.it/wiki/Special:Contributions/Devrandom"/>
	<updated>2026-04-09T09:57:33Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Gitian_Project&amp;diff=64135</id>
		<title>Gitian Project</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Gitian_Project&amp;diff=64135"/>
		<updated>2017-10-29T03:37:42Z</updated>

		<summary type="html">&lt;p&gt;Devrandom: Created page with &amp;quot;The [https://gitian.org/ Gitian Project] is used to create deterministic builds of Bitcoin Core.  This allows identical binaries to be independently built and signed by multip...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [https://gitian.org/ Gitian Project] is used to create deterministic builds of Bitcoin Core.  This allows identical binaries to be independently built and signed by multiple developers, thereby eliminating the build process as a single point of security failure.&lt;/div&gt;</summary>
		<author><name>Devrandom</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Developers&amp;diff=64134</id>
		<title>Developers</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Developers&amp;diff=64134"/>
		<updated>2017-10-29T03:34:29Z</updated>

		<summary type="html">&lt;p&gt;Devrandom: devrandom / Gitian Project&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &#039;&#039;&#039;This list is not complete.&#039;&#039;&#039; Please make updates/corrections as needed.&lt;br /&gt;
* Attempt to sort by contribution&lt;br /&gt;
* Legend:&lt;br /&gt;
** &amp;quot;Author&amp;quot; = original author; &amp;quot;Lead&amp;quot; = current project lead&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;background:#90ff90&amp;quot; | active maintainer&lt;br /&gt;
| style=&amp;quot;background:#ffffaa&amp;quot; | has made contributions&lt;br /&gt;
| style=&amp;quot;background:#ff9090&amp;quot; | no involvement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Name !! Reference !! bitcoinj !! BFGMiner !! Tools !! Libbitcoin !! Gentoo !! Supybot !! Other&lt;br /&gt;
|-&lt;br /&gt;
| Satoshi Nakamoto&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|Author&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#90ff90&amp;quot;|Bitcoin original designer&lt;br /&gt;
|-&lt;br /&gt;
| Wladimir J. van der Laan&lt;br /&gt;
| {{Yes|Lead}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Pieter Wuille&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Gavinandresen|Gavin Andresen]]&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#90ff90&amp;quot;|Author&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Cory Fields&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Matt Corallo&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Jonas Schnelli&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Luke Dashjr&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#90ff90&amp;quot;|Lead&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
|style=&amp;quot;background:#90ff90&amp;quot;|URI, Wallet protocols, [[Eloipool]]&lt;br /&gt;
|-&lt;br /&gt;
| fanquake&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Jorge Timón&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Gregory Maxwell&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Peter Todd&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| cozz&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Patrick Strateman&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|Author&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Giel van Schijndel&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| rebroad&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| sirius-m&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|Retired&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| tcatm&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
|-&lt;br /&gt;
| Jeff Garzik&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|Author&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#90ff90&amp;quot;|[[pushpool]]&lt;br /&gt;
|-&lt;br /&gt;
| Diapolo&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Mike Hearn&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#90ff90&amp;quot;|Author&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Andreas Schildbach&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| devrandom&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#90ff90&amp;quot;|[[Gitian Project]]&lt;br /&gt;
|-&lt;br /&gt;
| Daniel Folkinshteyn&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
|-&lt;br /&gt;
| Amir Taaki&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#90ff90&amp;quot;|Author&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#90ff90&amp;quot;|[[Libbitcoin_Explorer|SX]], [[Libbitcoin_Server|Obelisk]]&lt;br /&gt;
|-&lt;br /&gt;
| Eric Voskuil&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#90ff90&amp;quot;|Lead&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#90ff90&amp;quot;|[[Libbitcoin_Explorer|BX]], [[Libbitcoin_Server|BS]]&lt;br /&gt;
|-&lt;br /&gt;
| Phillip Mienk&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| William Swanson&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Neill Miller&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Pablo Castellano&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Noel Maersk&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Kamil Domański&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| bobalot&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| drwasho&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| saracen&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Matt Giuca&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Con Kolivas&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Mizery De Aria&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#90ff90&amp;quot;|Author&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Laurent Bachelier&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Florian Schmaus&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| BioMike&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value Yes}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Chris Moore&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Marius Hanne&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| David FRANCOIS&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Nils Schneider&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Fabian H jr.&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| ovdeathiam&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Dev Random&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Michal Zima&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Venkatesh Srinivas&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Vegard Nossum&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| JoelKatz&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Joerie de Gram&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Johannes Henninger&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Jeroenz0r&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Han Lin Yap&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Abraham Jewowich&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Michael Bemmerl&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Eric Hosmer&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Dawid Spiechowicz&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Stéphane Gimenez&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Patrick Varilly&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Jay Weisskopf&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Dylan Noblesmith&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| James Burkle&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Jordan Lewis&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Dean Lee&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| xHire&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| HostFat&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Jakob Kramer&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| ariel&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| dabaopku&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Federico Faggiano&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| m0ray&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Danube&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Carlos Pizarro&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Blitzboom&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Daniel Holbert&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Jaromil&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Carlo Alberto Ferraris&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Forrest Voight&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Amir Yalon&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| John Maguire&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Ricardo M. Correia&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Dan Helfman&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| gjs278&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Dan Loewenherz&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Eric Swanson&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Santiago M. Mola&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Shane Wegner&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Sven Slootweg&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| ojab&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| sandos&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| Witchspace&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|-&lt;br /&gt;
| [[laszlo]]&lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot;|&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
| {{Table Value No}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
* [https://bitcoin.org/en/development List of developers on bitcoin.org]&lt;br /&gt;
* [[Original client developers]]&lt;br /&gt;
* [[People]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Devrandom</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Block_chain_download&amp;diff=27522</id>
		<title>Block chain download</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Block_chain_download&amp;diff=27522"/>
		<updated>2012-06-07T05:10:00Z</updated>

		<summary type="html">&lt;p&gt;Devrandom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bitcoin Chain Download ==&lt;br /&gt;
&lt;br /&gt;
See also [[Satoshi Client Block Exchange]] for an overview.&lt;br /&gt;
&lt;br /&gt;
=== Downloader Behavior ===&lt;br /&gt;
&lt;br /&gt;
* When receiving an inv&lt;br /&gt;
** For each block&lt;br /&gt;
*** If already have as orphan, send getblocks(locator(chainHead), orphanRoot(block))&lt;br /&gt;
*** If not already have&lt;br /&gt;
**** send getdata(block)&lt;br /&gt;
*** If already have and this is last block in message NOTE: this triggers specific behavior in peer getdata&lt;br /&gt;
**** send getdata(block)&lt;br /&gt;
&lt;br /&gt;
* When receiving a block&lt;br /&gt;
** If already have, ignore&lt;br /&gt;
** Else if have parent not in main chain&lt;br /&gt;
*** store as orphan&lt;br /&gt;
*** getblocks(locator(chainHead), orphanRoot(block))&lt;br /&gt;
** Else&lt;br /&gt;
*** Accept block&lt;br /&gt;
*** Accept orphan blocks that depend on this one&lt;br /&gt;
&lt;br /&gt;
* When starting download from a peer&lt;br /&gt;
** getblocks(locator(chainHead), 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Responder Behavior ===&lt;br /&gt;
&lt;br /&gt;
* When receiving getdata, for each requested block&lt;br /&gt;
** Send block&lt;br /&gt;
** If block == hashContinue(peer)&lt;br /&gt;
*** send inv(chainHead)&lt;br /&gt;
*** set hashContinue(peer)=0&lt;br /&gt;
&lt;br /&gt;
* When receiving getblocks(locator, hashStop)&lt;br /&gt;
** Iterate from locate(locator)-&amp;gt;next, going forward in chain&lt;br /&gt;
*** If reached hashStop or ran off end of chain, break&lt;br /&gt;
*** If reached limit of 500 or buffer limit&lt;br /&gt;
**** Set current hashContinue(peer) to current block hash&lt;br /&gt;
**** break&lt;br /&gt;
*** Send inv for block&lt;br /&gt;
&lt;br /&gt;
* When receiving getheaders(hashLocator, hashStop)&lt;br /&gt;
** If hashLocator = 0, return block(hashStop)&lt;br /&gt;
** Send up to 2000 block headers, iterating from block(hashLocator) to hashStop&lt;br /&gt;
&lt;br /&gt;
=== Locator ===&lt;br /&gt;
&lt;br /&gt;
Downloader: create locator(block)&lt;br /&gt;
* For 1..10&lt;br /&gt;
** block = block-&amp;gt;prev&lt;br /&gt;
** add block-&amp;gt;hash&lt;br /&gt;
* step = 1&lt;br /&gt;
* Do&lt;br /&gt;
** block = block-&amp;gt;prev &#039;step&#039; times&lt;br /&gt;
** add block-&amp;gt;hash&lt;br /&gt;
** step = step * 2&lt;br /&gt;
* add genesis-&amp;gt;hash&lt;br /&gt;
&lt;br /&gt;
Responder: locate(locator)&lt;br /&gt;
* Foreach hash in locator&lt;br /&gt;
** If hash exists in main chain, return block&lt;br /&gt;
* Otherwise return genesis block&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Observations:&lt;br /&gt;
&lt;br /&gt;
* the locator is dense near downloader chain head, and exponentially sparse as it goes towards the genesis&lt;br /&gt;
* downloading is accomplished in cooperation:&lt;br /&gt;
** downloader sends getblocks with locator based on downloader chain head&lt;br /&gt;
** responder sends invs for first 500 blocks going forward from latest common block (approximate, per locator)&lt;br /&gt;
** downloader sends getdata for blocks it does not have&lt;br /&gt;
** responder sends blocks and a gratuitious inv for reponder chain head&lt;br /&gt;
** downloader incorporates blocks into chain and now has a new chain head&lt;br /&gt;
** downloader sends another getblocks in response to the gratuitious inv with new locator based on new chain head&lt;br /&gt;
&lt;br /&gt;
Here are some cases. dChainHead is the downloader chain head, rChainHead is the responder chain head.&lt;br /&gt;
&lt;br /&gt;
=== Single Block Case ===&lt;br /&gt;
&lt;br /&gt;
* Responder sends an inv for a newly solved block&lt;br /&gt;
* Downloader sends getdata&lt;br /&gt;
* Responder sends block&lt;br /&gt;
&lt;br /&gt;
=== Small Catchup Case ===&lt;br /&gt;
&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), 0)&lt;br /&gt;
* Responder sends invs for blocks from dChainHead to rChainHead&lt;br /&gt;
* Downloader sends getdata for each inv&lt;br /&gt;
* Responder sends blocks for each getdata&lt;br /&gt;
&lt;br /&gt;
=== Large Catchup Case ===&lt;br /&gt;
&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), 0)&lt;br /&gt;
* Responder sends invs for blocks from dChainHead to dChainHead + 500&lt;br /&gt;
* (getdata / blocks sent by responder / blocks added to chain by downloader)&lt;br /&gt;
* The last getdata triggers an inv(rChainHead)&lt;br /&gt;
* Downloader sends getdata(rChainHead)&lt;br /&gt;
* Responder sends block&lt;br /&gt;
* Downloader puts block on orphan list&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), rChainHead)&lt;br /&gt;
* goto step 2&lt;br /&gt;
&lt;br /&gt;
=== Side Chain Case ===&lt;br /&gt;
&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), 0)&lt;br /&gt;
* Responder does not have dChainHead in best chain.  Responder iterates over locator until it finds a block in common for the two chains.&lt;br /&gt;
* Responder sends invs for blocks from commonBlock to rChainHead&lt;br /&gt;
* Downloader adds the blocks that it did not have and reorganizes&lt;br /&gt;
&lt;br /&gt;
For this to work, the invs must fit the network buffer.&lt;br /&gt;
&lt;br /&gt;
=== Large Side Chain Case ===&lt;br /&gt;
&lt;br /&gt;
More invs than fits the network buffer.&lt;br /&gt;
&lt;br /&gt;
If the side chain has blocks than fits in the network buffer this does not seem to work.  getblocks(locator(dChainHead), rChainHead) will not return enough blocks for the Downloader to switch chains.  If the Downloader does not switch chains, it will send the same getblocks message again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical]]&lt;br /&gt;
[[Category:Vocabulary]]&lt;/div&gt;</summary>
		<author><name>Devrandom</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Block_chain_download&amp;diff=27521</id>
		<title>Block chain download</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Block_chain_download&amp;diff=27521"/>
		<updated>2012-06-07T05:03:19Z</updated>

		<summary type="html">&lt;p&gt;Devrandom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bitcoin Chain Download ==&lt;br /&gt;
&lt;br /&gt;
See also [[Satoshi Client Block Exchange]] for an overview.&lt;br /&gt;
&lt;br /&gt;
=== Downloader Behavior ===&lt;br /&gt;
&lt;br /&gt;
* When receiving an inv&lt;br /&gt;
** For each block&lt;br /&gt;
*** If already have as orphan, send getblocks(locator(chainHead), orphanRoot(block))&lt;br /&gt;
*** If not already have&lt;br /&gt;
**** send getdata(block)&lt;br /&gt;
*** If already have and this is last block in message NOTE: this triggers specific behavior in peer getdata&lt;br /&gt;
**** send getdata(block)&lt;br /&gt;
&lt;br /&gt;
* When receiving a block&lt;br /&gt;
** If already have, ignore&lt;br /&gt;
** Else if have parent not in main chain&lt;br /&gt;
*** store as orphan&lt;br /&gt;
*** getblocks(locator(chainHead), orphanRoot(block))&lt;br /&gt;
** Else&lt;br /&gt;
*** Accept block&lt;br /&gt;
*** Accept orphan blocks that depend on this one&lt;br /&gt;
&lt;br /&gt;
* When starting download from a peer&lt;br /&gt;
** getblocks(locator(chainHead), 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Responder Behavior ===&lt;br /&gt;
&lt;br /&gt;
* When receiving getdata, for each requested block&lt;br /&gt;
** Send block&lt;br /&gt;
** If block == hashContinue(peer)&lt;br /&gt;
*** send inv(chainHead)&lt;br /&gt;
*** set hashContinue(peer)=0&lt;br /&gt;
&lt;br /&gt;
* When receiving getblocks(locator, hashStop)&lt;br /&gt;
** Iterate from locate(locator)-&amp;gt;next, going forward in chain&lt;br /&gt;
*** If reached hashStop or ran off end of chain, break&lt;br /&gt;
*** If reached limit of 500 or buffer limit&lt;br /&gt;
**** Set current hashContinue(peer) to current block hash&lt;br /&gt;
**** break&lt;br /&gt;
*** Send inv for block&lt;br /&gt;
&lt;br /&gt;
* When receiving getheaders(hashLocator, hashStop)&lt;br /&gt;
** If hashLocator = 0, return block(hashStop)&lt;br /&gt;
** Send up to 2000 block headers, iterating from block(hashLocator) to hashStop&lt;br /&gt;
&lt;br /&gt;
=== Locator ===&lt;br /&gt;
&lt;br /&gt;
Downloader: create locator(block)&lt;br /&gt;
* For 1..10&lt;br /&gt;
** block = block-&amp;gt;prev&lt;br /&gt;
** add block-&amp;gt;hash&lt;br /&gt;
* step = 1&lt;br /&gt;
* Do&lt;br /&gt;
** block = block-&amp;gt;prev &#039;step&#039; times&lt;br /&gt;
** add block-&amp;gt;hash&lt;br /&gt;
** step = step * 2&lt;br /&gt;
* add genesis-&amp;gt;hash&lt;br /&gt;
&lt;br /&gt;
Responder: locate(locator)&lt;br /&gt;
* Foreach hash in locator&lt;br /&gt;
** If hash exists in main chain, return block&lt;br /&gt;
* Otherwise return genesis block&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Observations:&lt;br /&gt;
&lt;br /&gt;
* the locator is dense near downloader chain head, and exponentially sparse as it goes towards the genesis&lt;br /&gt;
* downloading is accomplished in cooperation:&lt;br /&gt;
** downloader sends getblocks with locator based on downloader chain head&lt;br /&gt;
** responder sends invs for first 500 blocks going forward from latest common block (approximate, per locator)&lt;br /&gt;
** downloader sends getdata for blocks it does not have&lt;br /&gt;
** responder sends blocks and a gratuitious inv for reponder chain head&lt;br /&gt;
** downloader incorporates blocks into chain and now has a new chain head&lt;br /&gt;
** downloader sends another getblocks in response to the gratuitious inv with new locator based on new chain head&lt;br /&gt;
&lt;br /&gt;
Here are some cases. dChainHead is the downloader chain head, rChainHead is the responder chain head.&lt;br /&gt;
&lt;br /&gt;
=== Single Block Case ===&lt;br /&gt;
&lt;br /&gt;
* Responder sends an inv for a newly solved block&lt;br /&gt;
* Downloader sends getdata&lt;br /&gt;
* Responder sends block&lt;br /&gt;
&lt;br /&gt;
=== Small Catchup Case ===&lt;br /&gt;
&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), 0)&lt;br /&gt;
* Responder sends invs for blocks from dChainHead to rChainHead&lt;br /&gt;
* Downloader sends getdata for each inv&lt;br /&gt;
* Responder sends blocks for each getdata&lt;br /&gt;
&lt;br /&gt;
=== Large Catchup Case ===&lt;br /&gt;
&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), 0)&lt;br /&gt;
* Responder sends invs for blocks from dChainHead to dChainHead + 500&lt;br /&gt;
* (getdata / blocks sent by responder / blocks added to chain by downloader)&lt;br /&gt;
* The last getdata triggers an inv(rChainHead)&lt;br /&gt;
* Downloader sends getdata(rChainHead)&lt;br /&gt;
* Responder sends block&lt;br /&gt;
* Downloader puts block on orphan list&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), rChainHead)&lt;br /&gt;
* goto step 2&lt;br /&gt;
&lt;br /&gt;
=== Side Chain Case ===&lt;br /&gt;
&lt;br /&gt;
Less than 500 blocks.&lt;br /&gt;
&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), 0)&lt;br /&gt;
* Responder does not have dChainHead in best chain.  Responder iterates over locator until it finds a block in common for the two chains.&lt;br /&gt;
* Responder sends invs for blocks from commonBlock to commonBlock + 500&lt;br /&gt;
* Downloader adds the blocks that it did not have and reorganizes&lt;br /&gt;
&lt;br /&gt;
=== Large Side Chain Case ===&lt;br /&gt;
&lt;br /&gt;
More than 500 blocks.&lt;br /&gt;
&lt;br /&gt;
If the side chain has more than 500 blocks this does not seem to work.  getblocks(locator(dChainHead), rChainHead) will not return enough blocks for the Downloader to switch chains.  If the Downloader does not switch chains, it will send the same getblocks message again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical]]&lt;br /&gt;
[[Category:Vocabulary]]&lt;/div&gt;</summary>
		<author><name>Devrandom</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Block_chain_download&amp;diff=27520</id>
		<title>Block chain download</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Block_chain_download&amp;diff=27520"/>
		<updated>2012-06-07T04:59:50Z</updated>

		<summary type="html">&lt;p&gt;Devrandom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bitcoin Chain Download ==&lt;br /&gt;
&lt;br /&gt;
=== Downloader Behavior ===&lt;br /&gt;
&lt;br /&gt;
* When receiving an inv&lt;br /&gt;
** For each block&lt;br /&gt;
*** If already have as orphan, send getblocks(locator(chainHead), orphanRoot(block))&lt;br /&gt;
*** If not already have&lt;br /&gt;
**** send getdata(block)&lt;br /&gt;
*** If already have and this is last block in message NOTE: this triggers specific behavior in peer getdata&lt;br /&gt;
**** send getdata(block)&lt;br /&gt;
&lt;br /&gt;
* When receiving a block&lt;br /&gt;
** If already have, ignore&lt;br /&gt;
** Else if have parent not in main chain&lt;br /&gt;
*** store as orphan&lt;br /&gt;
*** getblocks(locator(chainHead), orphanRoot(block))&lt;br /&gt;
** Else&lt;br /&gt;
*** Accept block&lt;br /&gt;
*** Accept orphan blocks that depend on this one&lt;br /&gt;
&lt;br /&gt;
* When starting download from a peer&lt;br /&gt;
** getblocks(locator(chainHead), 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Responder Behavior ===&lt;br /&gt;
&lt;br /&gt;
* When receiving getdata, for each requested block&lt;br /&gt;
** Send block&lt;br /&gt;
** If block == hashContinue(peer)&lt;br /&gt;
*** send inv(chainHead)&lt;br /&gt;
*** set hashContinue(peer)=0&lt;br /&gt;
&lt;br /&gt;
* When receiving getblocks(locator, hashStop)&lt;br /&gt;
** Iterate from locate(locator)-&amp;gt;next, going forward in chain&lt;br /&gt;
*** If reached hashStop or ran off end of chain, break&lt;br /&gt;
*** If reached limit of 500 or buffer limit&lt;br /&gt;
**** Set current hashContinue(peer) to current block hash&lt;br /&gt;
**** break&lt;br /&gt;
*** Send inv for block&lt;br /&gt;
&lt;br /&gt;
* When receiving getheaders(hashLocator, hashStop)&lt;br /&gt;
** If hashLocator = 0, return block(hashStop)&lt;br /&gt;
** Send up to 2000 block headers, iterating from block(hashLocator) to hashStop&lt;br /&gt;
&lt;br /&gt;
=== Locator ===&lt;br /&gt;
&lt;br /&gt;
Downloader: create locator(block)&lt;br /&gt;
* For 1..10&lt;br /&gt;
** block = block-&amp;gt;prev&lt;br /&gt;
** add block-&amp;gt;hash&lt;br /&gt;
* step = 1&lt;br /&gt;
* Do&lt;br /&gt;
** block = block-&amp;gt;prev &#039;step&#039; times&lt;br /&gt;
** add block-&amp;gt;hash&lt;br /&gt;
** step = step * 2&lt;br /&gt;
* add genesis-&amp;gt;hash&lt;br /&gt;
&lt;br /&gt;
Responder: locate(locator)&lt;br /&gt;
* Foreach hash in locator&lt;br /&gt;
** If hash exists in main chain, return block&lt;br /&gt;
* Otherwise return genesis block&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Observations:&lt;br /&gt;
&lt;br /&gt;
* the locator is dense near downloader chain head, and exponentially sparse as it goes towards the genesis&lt;br /&gt;
* downloading is accomplished in cooperation:&lt;br /&gt;
** downloader sends getblocks with locator based on downloader chain head&lt;br /&gt;
** responder sends invs for first 500 blocks going forward from latest common block (approximate, per locator)&lt;br /&gt;
** downloader sends getdata for blocks it does not have&lt;br /&gt;
** responder sends blocks and a gratuitious inv for reponder chain head&lt;br /&gt;
** downloader incorporates blocks into chain and now has a new chain head&lt;br /&gt;
** downloader sends another getblocks in response to the gratuitious inv with new locator based on new chain head&lt;br /&gt;
&lt;br /&gt;
Here are some cases. dChainHead is the downloader chain head, rChainHead is the responder chain head.&lt;br /&gt;
&lt;br /&gt;
=== Single Block Case ===&lt;br /&gt;
&lt;br /&gt;
* Responder sends an inv for a newly solved block&lt;br /&gt;
* Downloader sends getdata&lt;br /&gt;
* Responder sends block&lt;br /&gt;
&lt;br /&gt;
=== Small Catchup Case ===&lt;br /&gt;
&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), 0)&lt;br /&gt;
* Responder sends invs for blocks from dChainHead to rChainHead&lt;br /&gt;
* Downloader sends getdata for each inv&lt;br /&gt;
* Responder sends blocks for each getdata&lt;br /&gt;
&lt;br /&gt;
=== Large Catchup Case ===&lt;br /&gt;
&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), 0)&lt;br /&gt;
* Responder sends invs for blocks from dChainHead to dChainHead + 500&lt;br /&gt;
* (getdata / blocks sent by responder / blocks added to chain by downloader)&lt;br /&gt;
* The last getdata triggers an inv(rChainHead)&lt;br /&gt;
* Downloader sends getdata(rChainHead)&lt;br /&gt;
* Responder sends block&lt;br /&gt;
* Downloader puts block on orphan list&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), rChainHead)&lt;br /&gt;
* goto step 2&lt;br /&gt;
&lt;br /&gt;
=== Side Chain Case ===&lt;br /&gt;
&lt;br /&gt;
Less than 500 blocks.&lt;br /&gt;
&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), 0)&lt;br /&gt;
* Responder does not have dChainHead in best chain.  Responder iterates over locator until it finds a block in common for the two chains.&lt;br /&gt;
* Responder sends invs for blocks from commonBlock to commonBlock + 500&lt;br /&gt;
* Downloader adds the blocks that it did not have and reorganizes&lt;br /&gt;
&lt;br /&gt;
=== Large Side Chain Case ===&lt;br /&gt;
&lt;br /&gt;
More than 500 blocks.&lt;br /&gt;
&lt;br /&gt;
If the side chain has more than 500 blocks this does not seem to work.  getblocks(locator(dChainHead), rChainHead) will not return enough blocks for the Downloader to switch chains.  If the Downloader does not switch chains, it will send the same getblocks message again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical]]&lt;br /&gt;
[[Category:Vocabulary]]&lt;/div&gt;</summary>
		<author><name>Devrandom</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Block_chain_download&amp;diff=27519</id>
		<title>Block chain download</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Block_chain_download&amp;diff=27519"/>
		<updated>2012-06-07T04:58:35Z</updated>

		<summary type="html">&lt;p&gt;Devrandom: Created page with &amp;quot;== Bitcoin Chain Download ==  === Downloader Behavior ===  * When receiving an inv ** For each block *** If already have as orphan, send getblocks(locator(chainHead), orphanRo...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bitcoin Chain Download ==&lt;br /&gt;
&lt;br /&gt;
=== Downloader Behavior ===&lt;br /&gt;
&lt;br /&gt;
* When receiving an inv&lt;br /&gt;
** For each block&lt;br /&gt;
*** If already have as orphan, send getblocks(locator(chainHead), orphanRoot(block))&lt;br /&gt;
*** If not already have&lt;br /&gt;
**** send getdata(block)&lt;br /&gt;
*** If already have and this is last block in message NOTE: this triggers specific behavior in peer getdata&lt;br /&gt;
**** send getdata(block)&lt;br /&gt;
&lt;br /&gt;
* When receiving a block&lt;br /&gt;
** If already have, ignore&lt;br /&gt;
** Else if have parent not in main chain&lt;br /&gt;
*** store as orphan&lt;br /&gt;
*** getblocks(locator(chainHead), orphanRoot(block))&lt;br /&gt;
** Else&lt;br /&gt;
*** Accept block&lt;br /&gt;
*** Accept orphan blocks that depend on this one&lt;br /&gt;
&lt;br /&gt;
* When starting download from a peer&lt;br /&gt;
** getblocks(locator(chainHead), 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Responder Behavior ===&lt;br /&gt;
&lt;br /&gt;
* When receiving getdata, for each requested block&lt;br /&gt;
** Send block&lt;br /&gt;
** If block == hashContinue(peer)&lt;br /&gt;
*** send inv(chainHead)&lt;br /&gt;
*** set hashContinue(peer)=0&lt;br /&gt;
&lt;br /&gt;
* When receiving getblocks(locator, hashStop)&lt;br /&gt;
** Iterate from locate(locator)-&amp;gt;next, going forward in chain&lt;br /&gt;
*** If reached hashStop or ran off end of chain, break&lt;br /&gt;
*** If reached limit of 500 or buffer limit&lt;br /&gt;
**** Set current hashContinue(peer) to current block hash&lt;br /&gt;
**** break&lt;br /&gt;
*** Send inv for block&lt;br /&gt;
&lt;br /&gt;
* When receiving getheaders(hashLocator, hashStop)&lt;br /&gt;
** If hashLocator = 0, return block(hashStop)&lt;br /&gt;
** Send up to 2000 block headers, iterating from block(hashLocator) to hashStop&lt;br /&gt;
&lt;br /&gt;
=== Locator ===&lt;br /&gt;
&lt;br /&gt;
Downloader: create locator(block)&lt;br /&gt;
* For 1..10&lt;br /&gt;
** block = block-&amp;gt;prev&lt;br /&gt;
** add block-&amp;gt;hash&lt;br /&gt;
* step = 1&lt;br /&gt;
* Do&lt;br /&gt;
** block = block-&amp;gt;prev &#039;step&#039; times&lt;br /&gt;
** add block-&amp;gt;hash&lt;br /&gt;
** step = step * 2&lt;br /&gt;
* add genesis-&amp;gt;hash&lt;br /&gt;
&lt;br /&gt;
Responder: locate(locator)&lt;br /&gt;
* Foreach hash in locator&lt;br /&gt;
** If hash exists in main chain, return block&lt;br /&gt;
* Otherwise return genesis block&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Observations:&lt;br /&gt;
&lt;br /&gt;
* the locator is dense near downloader chain head, and exponentially sparse as it goes towards the genesis&lt;br /&gt;
* downloading is accomplished in cooperation:&lt;br /&gt;
** downloader sends getblocks with locator based on downloader chain head&lt;br /&gt;
** responder sends invs for first 500 blocks going forward from latest common block (approximate, per locator)&lt;br /&gt;
** downloader sends getdata for blocks it does not have&lt;br /&gt;
** responder sends blocks and a gratuitious inv for reponder chain head&lt;br /&gt;
** downloader incorporates blocks into chain and now has a new chain head&lt;br /&gt;
** downloader sends another getblocks in response to the gratuitious inv with new locator based on new chain head&lt;br /&gt;
&lt;br /&gt;
Here are some cases. dChainHead is the downloader chain head, rChainHead is the responder chain head.&lt;br /&gt;
&lt;br /&gt;
=== Single Block Case ===&lt;br /&gt;
&lt;br /&gt;
* Responder sends an inv for a newly solved block&lt;br /&gt;
* Downloader sends getdata&lt;br /&gt;
* Responder sends block&lt;br /&gt;
&lt;br /&gt;
=== Small Catchup Case ===&lt;br /&gt;
&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), 0)&lt;br /&gt;
* Responder sends invs for blocks from dChainHead to rChainHead&lt;br /&gt;
* Downloader sends getdata for each inv&lt;br /&gt;
* Responder sends blocks for each getdata&lt;br /&gt;
&lt;br /&gt;
=== Large Catchup Case ===&lt;br /&gt;
&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), 0)&lt;br /&gt;
* Responder sends invs for blocks from dChainHead to dChainHead + 500&lt;br /&gt;
* (getdata / blocks sent by responder / blocks added to chain by downloader)&lt;br /&gt;
* The last getdata triggers an inv(rChainHead)&lt;br /&gt;
* Downloader sends getdata(rChainHead)&lt;br /&gt;
* Responder sends block&lt;br /&gt;
* Downloader puts block on orphan list&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), rChainHead)&lt;br /&gt;
* goto step 2&lt;br /&gt;
&lt;br /&gt;
=== Side Chain Case ===&lt;br /&gt;
&lt;br /&gt;
Less than 500 blocks.&lt;br /&gt;
&lt;br /&gt;
* Downloader sends getblocks(locator(dChainHead), 0)&lt;br /&gt;
* Responder does not have dChainHead in best chain.  Responder iterates over locator until it finds a block in common for the two chains.&lt;br /&gt;
* Responder sends invs for blocks from commonBlock to commonBlock + 500&lt;br /&gt;
* Downloader adds the blocks that it did not have and reorganizes&lt;br /&gt;
&lt;br /&gt;
=== Large Side Chain Case ===&lt;br /&gt;
&lt;br /&gt;
More than 500 blocks.&lt;br /&gt;
&lt;br /&gt;
If the side chain has more than 500 blocks this does not seem to work.  getblocks(locator(dChainHead), rChainHead) will not return enough blocks for the Downloader to switch chains.  If the Downloader does not switch chains, it will send the same getblocks message again.&lt;/div&gt;</summary>
		<author><name>Devrandom</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=Block_chain&amp;diff=27518</id>
		<title>Block chain</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=Block_chain&amp;diff=27518"/>
		<updated>2012-06-07T04:44:49Z</updated>

		<summary type="html">&lt;p&gt;Devrandom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:blockchain.png|thumb|Blocks in the main chain (black) are the longest series of blocks that go from the genesis block (green) to the current block. Orphan blocks (purple) are blocks that are not in the longest chain.]]&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;block chain&#039;&#039;&#039; is a transaction database shared by all [[Node|nodes]] participating in a [[crypto-currency]] such as Bitcoin.  A full copy of a currency&#039;s block chain contains every [[transaction]] ever executed in the currency.  With this information, one can find out how much value belonged to each [[address]] at any point in history.&lt;br /&gt;
&lt;br /&gt;
Every [[block]] contains a [[hash]] of the previous block. This has the effect of creating a chain of blocks from the [[genesis block]] to the current block. Each block is guaranteed to come after the previous block chronologically because the previous block&#039;s hash would otherwise not be known. Each block is also computationally impractical to modify once it has been in the chain for a while because every block after it would also have to be regenerated. These properties are what make double-spending of bitcoins very difficult. The block chain is the main innovation of Bitcoin.&lt;br /&gt;
&lt;br /&gt;
Honest generators only build onto a block (by referencing it in blocks they create) if it is the latest block in the longest valid chain. &amp;quot;Length&amp;quot; is calculated as total combined difficulty of that chain, not number of blocks, though this distinction is only important in the context of a few potential attacks. A chain is valid if all of the blocks and transactions within it are valid, and only if it starts with the genesis block.&lt;br /&gt;
&lt;br /&gt;
For any block on the chain, there is only one path to the genesis block. Coming from the genesis block, however, there can be forks. One-block forks are created from time to time when two blocks are created just a few seconds apart. When that happens, generating nodes build onto whichever one of the blocks they received first. Whichever block ends up being included in the next block becomes part of the main chain because that chain is longer. More serious forks have occurred after fixing bugs that required backward-incompatible changes.&lt;br /&gt;
&lt;br /&gt;
Blocks in shorter chains (or invalid chains) are called &amp;quot;orphan blocks&amp;quot;, and while they are stored, they are not used for anything. When a block becomes an orphan block, all of its valid transactions are re-added to the pool of queued transactions and will be included in another block. The 50 BTC reward for the orphan block will be lost, which is why a network-enforced 100-block maturation time for generations exists.&lt;br /&gt;
&lt;br /&gt;
Because a block can only reference one previous block, it is impossible for two forked chains to merge.&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to use the block chain algorithm for non-financial purposes: see [[Alternative chain]].&lt;br /&gt;
&lt;br /&gt;
The block chain is broadcasted to all nodes on the networking using a flood protocol: see [[Block chain download]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical]]&lt;br /&gt;
[[Category:Vocabulary]]&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
* [[BlockChain.info]] - Utility site and [[EWallet]] provider of similar name&lt;/div&gt;</summary>
		<author><name>Devrandom</name></author>
	</entry>
</feed>