January 23, 2015 : Bump version by Ben Vulpes
With the “rev_bump” patch, the software version advertised to other nodes on the network was changed from 0.5.3 to 0.5.3.1 so as to more readily distinguish and more clearly identify TRB nodes from less thoughtfully maintained version. Though 0.5.3.1 was not to be the final word on version strings, it was under this banner that TRB would publish its first formal release on March 19, 2015.
January 28, 2015 : Portatronic build by Stanislav Datskovskiy
With the “porta-tronic” patch, support was established for cross-compiling TRB on ARM CPUs, namely those found in the Pogoplug 4s acquired by several TMSR~ citizens with the aim of broader TRB node deployment.
Also included in this update was a build script that specified the OpenSSL, DBD, and Boost versions for the first time. While this script was initially designed for the Pogos with the idea that these nodes would be set-up once and “poured into cement,” it would go on to form the basis of Stator and Rotor for desktop (and possibly laptop) users, both of which were key developments in the establishment of a deterministic bitcoind, but these will be covered in more detail in part iii.
January 30, 2015 : Orphan block limiting by Stanislav Datskovskiy
With the “orphanage-burner” patch, recurrent memory exhaustion crashes during initial sync were first addressed. The root of the issue was the “mapOrphanBlocks” data structure. In essence, during initial sync, transaction blocks would be accumulated from other hosts out of order, and such “orphan blocks,” with no where to call home, would simply accumulate in memory before ultimately exhausting it, thereby triggering the kernel to issue SIGKILL to TRB.i This patch also sneakily updated the version from 0.5.3.1 to 0.5.3.2, despite much belabouring of the cardinal “one change per patch” rule.ii This patch did much to address the memory footprint concerns during initial sync, but more would ultimately still be needed. More on which in a minute.
With the “dnsseed_snipsnip” patch, the first of four patches aimed squarely at the Domain Name System (DNS) application layer,iii four of the “trusted” nodesiv from which an initial sync might be conducted were removed, reducing potential attack vectors from UnSavoury Garnishes and leaving the TRB operator free to point their machine in the seeding direction of their preference. Also affected by this patch were, as Ben Vulpes points out, i) the removal of the “-nodnsseed” flag and the corresponding “SoftSetArg” call from init.cpp, ii) removal of ThreadDNSAddressSeed and ThreadDNSAddressSeed2 declaration and implementation, and iii) removal of ThreadDNSAddressSeed from StartNode.
The purpose of removing DNS references from TRB at the time was that, if DNS were activated, glibcv would invoke libnss.vi The biggest problem with libnss was that it couldn’t be statically linked because it’s configured for each machine individually, and without a static build, TRB couldn’t realise its goal of releasing a deterministic bitcoind for any reasonable Unix on any reasonable machine.
While removing DNS seeding was only the start of the complete DNS excision, glibc would ultimately be replaced by muslvii in the July 27th publication of Rotor, which will be covered in part iii.
March 6, 2015 : Static makefile by Shane Kinney
With the “static-makefile” patch, the versions of OpenSSL, BDB and Boost were fixed at v1.0.1g, 4.8.30, and 1.52.0, respectively. The idea here being to give all TRB implementations a fixed starting pointviii from which to build as well as the specific tools known to work (and sufficiently trusted to do so). This patch therefore laid important groundwork for the cementing of Bitcoin on a Linux OS with either a x86_64 or x86_32 CPU architecture.ix Then,x as now,xi you don’t build your house on sand. Capiche ?
The March 12th “v0.0.2” update to this patch, also by Mr. Kinney, added a static libgcc, a library that the GNU Compiler Collection (GCC) uses during code generation. “More static is more better” isn’t a bad heuristic here.
March 19, 2015 : 0.5.3.1-RELEASE published by Shane Kinney
The summation of all improvements to the reference client to date, The Real Bitcoin Foundation published its first formal release. A major milestone !
April 2, 2015 : Integer ironing out by Stanislav Datskovskiy
With the “kills-integer-retardation” patch, the unsigned integer (uint)xii width in the macrosxiii arguments were set precisely. This had the ultimate effect of creating defined uints more than once, but this was at least better than uints being undefined in several places simultaneously, as was the case prior to this patch. This was necessary, if not entirely satisfactory progress (at least according to Stan).
May 4, 2015 : Orphan block excision by Stanislav Datskovskiy
In the “orphanage_thermonuke” patch, the large memory footprint was attacked from the angle of “orphan” or “bastard” block storage in memory during the initial sync process. In essence, rather than storing randomly received blocks from the randomly connected nodes (a process that was limited in the “orphanage_burner” patch), this patch forced TRB nodes to discard any block received whose direct antecedent was not part of the longest chain and ask the inputting node for all the blocks between the bastard and the at-the-time best-known height.
May 28, 2015 : Orphan transaction excision by Stanislav Datskovskiy
With the “tx-orphanage_amputation” patch, as a follow-up to the previous patch and as a further measure towards reducing TRB’s memory footprint, orphan transactions that have not yet been incorporated into blocks are also discarded. This greatly sped up the sync process as the TRB node would thereafter focus its resources exclusively on processing blocks useful for establishing the correct longest chain, after which it could begin its function as a relay node if its owner so decided.
June 17, 2015 : DNS hard-coded seeds excised by Stanislav Datskovskiy
With the “zap_hardcoded_seeds” patch, as Ben Vulpes points out, the pnSeeds array and fAddSeed were removed, preventing the hard-coded DNS seeds from being added to the mapAddresses data structure used to track trusted nodes. This was step two of four in completely eliminating DNS invocation in TRB.
June 17 2015 : “showmyip.com” mechanism excised by Stanislav Datskovskiy
With the “zap_showmyip_crud” patch, as Ben Vulpes points out again, we saw the removal of GetMyExternalIP, GetMyExternalIP2 and GetMyExternalIP from ThreadGetMyExternalIP, all of which were dependent on a single centralised service (showmyip.com) for their operation and in turn the secure and effective operation of the entire network. If a bad actor were to gain access to that service, a service that is quite fittingly no longer in operation, they could manipulate IP addresses and spoof good nodes into thinking that they were connecting to trusted nodes when in fact they were connecting to an alt-chain being broadcast by malicious nodes. This was clearly a weak link in the node identity chain and was therefore step three of four in completely eliminating DNS invocation in TRB.
[To be continued]
___ ___ ___
- SIGKILL is a command issued by the Unix-based operating system to immediately cease operation of an application with no opportunity for user intervention. It’s highly, highly annoying when you’re trying to, y’know, actually run software because it forms the backbone of essential economic infrastructure.↩
- Alas, this little tweak was not the end of the world.↩
- DNS ~= USG.↩
- Namely, bitseed.xf2.org, dnsseed.bluematt.me, dnsseed.bitcoin.dashjr.org, and seed.bitcoin.sipa.be – the latter two of which will be readily recognisable to the alert reader as belonging to Luke “BFL is legit u guise” Jr. and Pieter “Dead Man Walking” Wuille, respectively.↩
Any Unix-like operating system needs a C library: the library which defines the “system calls” and other basic facilities such as open, malloc, printf, exit… The GNU C Library is used as the C library in the GNU system and in GNU/Linux systems, as well as many other systems that use Linux as the kernel.
- Network Security Services (NSS) is “a set of libraries designed to support cross-platform development of security-enabled client and server applications.”↩
- You’re invited to compare musl with glibc, dietlibc, and Uclibc for yourself.↩
- Software updates in general, especially those necessitating hardware upgrades – as seen in the mainstream implementation of planned obsolescence in consumer electronics and “apps,” which at this point even includes, sadly, cars - are diseases that have no place in something as economically fundamental and politically important as Bitcoin, at least not any more than, say, the jeweler’s gold weighing scale or the dollar bills in your pocket. While it’s indeed the case that cash bills do receive the occasional facelift, this is typically on timescales in the order of decades, not
monthly weeklydaily as in “tech.” You wouldn’t plague your case with new “features,” “performance updates,” and “bug fixes,” would you ? Oh you would ? ↩
- As Stan points out in the comments below, ARM CPU architecture could also be added to this list, even if this avenue of the project is not in active deployment at the moment.↩
Matthew (7 : 26) : And the rain fell, and the floods came, and the winds blew and slammed against that house; and yet it did not fall, for it had been founded on the rock. Everyone who hears these words of Mine and does not act on them, will be like a foolish man who built his house on the sand.
mircea_popescu: This is really the revolution Bitcoin brought about. People think it’s a major breakthrough in money, but that’s doubtful. It is however a string of major breakthroughs in systems theory.
- Unsigned integers differ from signed integers in that the latter include a sign bit that allows for the expression of both positive and negative integers whereas the former lack such specification.↩
- A macro is a single instruction that expands automatically into a set of instructions to perform a particular task.↩