Image from Shutterstock
The history of Bitcoin is a fascinating one. People enthralled by Satoshi Nakamoto’s creation will pay attention to the smallest details, uncovering insights into his mysterious persona. However, as with most things historic, authentic sources become scarce and information distorts as time passes.
Luckily for us, authentic early Bitcoin source code releases are still available. While doing research into Satoshi Nakamoto, we came by something interesting – the versioning scheme he used before the SourceForge repository was established in August, 2009.
To come to the conclusion we are going the present herein, we analysed the following:
This post will not focus on Satoshi’s identity. We will merely study the metadata in the early Bitcoin source code archives and present our findings. As a result, further research of Bitcoin’s history or the identity of its author may be facilitated.
We know from an email from 8 January, 2009, that Satoshi uploaded an archive of the Bitcoin source code (v0.1 as he named it) to SourceForge. Unfortunately, the link has been broken since 2011, but we managed to find copies of the archive in a post on Bitcointalk. The files were provided by Hal Finney himself, which adds to their credibility. Version 0.1.3 we found here. However, there are versions that we could not find, namely 0.1.2 and 0.1.5.
In addition to versions 0.1.0 to 0.1.5, there is a preliminary version that was sent to Hal Finney and a few other people in the cryptography mailing list. This happened in November 2008. There are a few different copies of that source code that can be found around the Internet. One that looks original is available here.
Having acquired four different authentic Bitcoin source code archives, we went to work analysing their metadata.
RAR archive ./bitcoin_src1.rar Pathname/Comment Size Packed Ratio Date Time Attr CRC Meth Ver main.cpp 66174 14794 22% 15-11-08 00:00 …..A FDA98018 m3? 2.9 main.h 29219 6842 23% 15-11-08 00:00 …..A 67A56E38 m3? 2.9 node.cpp. 28112 6685 24% 15-11-08 00:00 …..A D2FCC4D0 m3? 2.9 node.h. 18491 4797 26% 15-11-08 00:00 …..A E699C7D7 m3? 2.9 readme.txt. 451 304 67% 15-11-08 00:00 …..A 0FC730BA m3? 2.9
At first glance, we notice the date 15 November, 2008 on all files in the archive. The 00:00 time suggests that it was set manually by Satoshi. It would seem that he wanted to conceal original modification time of the files, however, it turns out that’s not why he did it. Further investigation into the archive gives us exact date and time of 15 November, 2008 at 00:00:01.
There are two archives available for the 0.1.0 version – a RAR and a TGZ. As we already mentioned, both were provided by Hal Finney in a Bitcointalk post.
MD5: 91e2dfa2af043eabbb38964cbf368500 bitcoin-0.1.0.rar dca1095f053a0c2dc90b19c92bd1ec00 bitcoin-0.1.0.tgz
Let’s start with the original Bitcoin source code archive released to the public on 8 January, 2009 – the RAR.
RAR archive ./bitcoin-0.1.0.rar Pathname/Comment Size Packed Ratio Date Time Attr CRC Meth Ver src/makefile 2693 967 36% 07-01-09 01:00 .....A C3C06DAC m5? 2.9 src/obj 0 0 0% 07-01-09 15:36 .D.... 00000000 m0? 2.0 src/rc/addressbook16.bmp 1334 796 60% 07-01-09 01:00 .....A 7D00BCF5 m5? 2.9 src/rc/addressbook16mask.bmp 126 40 32% 07-01-09 01:00 .....A 6428BA44 m5? 2.9 src/rc/addressbook20.bmp 1478 545 37% 07-01-09 01:00 .....A 747AADED m5? 2.9 src/rc/addressbook20mask.bmp 142 49 35% 07-01-09 01:00 .....A 49D20842 m5? 2.9 src/rc/send16.bmp 1334 385 29% 07-01-09 01:00 .....A 9D892475 m5? 2.9 src/rc/send16mask.bmp 126 45 36% 07-01-09 01:00 .....A 51360655 m5? 2.9 src/rc/send16masknoshadow.bmp 126 24 19% 07-01-09 01:00 .....A F6876188 m5? 2.9 src/rc/send20.bmp 1478 495 33% 07-01-09 01:00 .....A 39F9B908 m5? 2.9 src/rc/send20mask.bmp 142 39 27% 07-01-09 01:00 .....A FA78BFA8 m5? 2.9 src/rc 0 0 0% 07-01-09 15:37 .D.... 00000000 m0? 2.0 src/db.cpp 16382 3413 21% 07-01-09 01:00 .....A 8C8159E8 m5? 2.9 src/irc.cpp 6568 1348 21% 10-01-09 01:01 .....A 0F73F00C m5? 2.9 src/main.cpp 82983 12833 15% 07-01-09 01:00 .....A F9387E1B m5? 2.9 src/market.cpp 6938 1275 18% 07-01-09 01:00 .....A D087E0DE m5? 2.9 src/net.cpp 31293 4466 14% 07-01-09 01:00 .....A E22F1E37 m5? 2.9 src/script.cpp 35279 4084 12% 07-01-09 01:00 .....A 70DE7357 m5? 2.9 src/sha.cpp 19000 4823 25% 07-01-09 01:00 .....A 7B45200F m5? 2.9 src/ui.cpp 97185 13159 14% 07-01-09 01:00 .....A 0F952088 m5? 2.9 src/uibase.cpp 108295 6915 6% 07-01-09 01:00 .....A 26639AFE m5? 2.9 src/util.cpp 9386 1989 21% 07-01-09 01:00 .....A 5766966A m5? 2.9 src 0 0 0% 10-01-09 23:15 .D.... 00000000 m0? 2.0 libeay32.dll 1306630 427596 33% 07-01-09 01:00 .....A A1896702 m5? 2.9 mingwm10.dll 11673 2611 22% 07-01-09 01:00 .....A 555A37B7 m5? 2.9 bitcoin.exe 6440960 1597337 25% 10-01-09 01:01 .....A 9C811519 m5? 2.9 src/uiproject.fbp 841798 11074 1% 07-01-09 01:00 .....A C4A39D79 m5? 2.9 src/base58.h 5639 1380 24% 07-01-09 01:00 .....A DD2EC569 m5? 2.9 src/bignum.h 14096 1919 14% 07-01-09 01:00 .....A A9A6A507 m5? 2.9 src/db.h 10979 1582 14% 07-01-09 01:00 .....A F6BAF4B2 m5? 2.9 src/headers.h 1639 385 23% 07-01-09 01:00 .....A 5C745AA1 m5? 2.9 src/irc.h 317 84 26% 07-01-09 01:00 .....A 00C6F007 m5? 2.9 src/key.h 4639 630 14% 07-01-09 01:00 .....A 0C5ABC88 m5? 2.9 src/main.h 33212 5080 15% 07-01-09 01:00 .....A 5369988D m5? 2.9 src/market.h 3745 429 11% 07-01-09 01:00 .....A 27420D6A m5? 2.9 src/net.h 21344 3495 16% 07-01-09 01:00 .....A 377199D8 m5? 2.9 src/script.h 17707 2335 13% 07-01-09 01:00 .....A FF1DE242 m5? 2.9 src/serialize.h 39878 4881 12% 10-01-09 01:01 .....A 2C064D8D m5? 2.9 src/sha.h 5023 1079 21% 07-01-09 01:00 .....A 9CF10FA3 m5? 2.9 src/ui.h 11887 1448 12% 07-01-09 01:00 .....A 4614B77B m5? 2.9 src/uibase.h 27772 2083 8% 07-01-09 01:00 .....A 9D64FB45 m5? 2.9 src/uint256.h 25269 2148 9% 07-01-09 01:00 .....A 524954B7 m5? 2.9 src/util.h 11482 2035 18% 07-01-09 01:00 .....A D10D475F m5? 2.9 src/rc/bitcoin.ico 22486 110 0% 07-01-09 01:00 .....A EE40473A m5? 2.9 src/rc/check.ico 766 17 2% 07-01-09 01:00 .....A F4E0FC06 m5? 2.9 src/ui.rc 602 131 22% 07-01-09 01:00 .....A 4303CA25 m5? 2.9 license.txt 1079 502 47% 07-01-09 01:00 .....A 1EF87B23 m5? 2.9 src/license.txt 1079 20 2% 07-01-09 01:00 .....A 1EF87B23 m5? 2.9 readme.txt 1856 588 32% 07-01-09 01:00 .....A FB70D7AF m5? 2.9 src/readme.txt 2663 850 32% 07-01-09 01:00 .....A 2AE1E59F m5? 2.9 src/makefile.vc 2647 804 30% 07-01-09 01:00 .....A 35548F9A m5? 2.9
Obviously, there a few things that are off in those timestamps. Every file, with the exception of the directories, has a timestamp of either 7 January, 2009 at 01:00:00 or 10 January, 2009 at 01:01:00. The second timestamp is suspicious since it is after the release date of this version. As for the time, there’s a reason it is either 01:00:00 or 01:01:00.
Now let’s take a look at the tarball (bitcoin-0.1.0.tgz).
$ TZ=US/Pacific tar tzvf bitcoin-0.1.0.tgz drwxrwxr-x hal/hal 0 2009-01-10 18:34 bitcoin/ drwxrwxr-x hal/hal 0 2009-01-10 18:34 bitcoin/src/ -rw-rw-r-- hal/hal 2693 2009-01-07 01:00 bitcoin/src/makefile drwxrwxr-x hal/hal 0 2009-01-07 15:36 bitcoin/src/obj/ drwxrwxr-x hal/hal 0 2009-01-10 18:34 bitcoin/src/rc/ -rw-rw-r-- hal/hal 1334 2009-01-07 01:00 bitcoin/src/rc/addressbook16.bmp -rw-rw-r-- hal/hal 126 2009-01-07 01:00 bitcoin/src/rc/addressbook16mask.bmp -rw-rw-r-- hal/hal 1478 2009-01-07 01:00 bitcoin/src/rc/addressbook20.bmp -rw-rw-r-- hal/hal 142 2009-01-07 01:00 bitcoin/src/rc/addressbook20mask.bmp -rw-rw-r-- hal/hal 1334 2009-01-07 01:00 bitcoin/src/rc/send16.bmp -rw-rw-r-- hal/hal 126 2009-01-07 01:00 bitcoin/src/rc/send16mask.bmp -rw-rw-r-- hal/hal 126 2009-01-07 01:00 bitcoin/src/rc/send16masknoshadow.bmp -rw-rw-r-- hal/hal 1478 2009-01-07 01:00 bitcoin/src/rc/send20.bmp -rw-rw-r-- hal/hal 142 2009-01-07 01:00 bitcoin/src/rc/send20mask.bmp -rw-rw-r-- hal/hal 22486 2009-01-07 01:00 bitcoin/src/rc/bitcoin.ico -rw-rw-r-- hal/hal 766 2009-01-07 01:00 bitcoin/src/rc/check.ico -rw-rw-r-- hal/hal 16382 2009-01-07 01:00 bitcoin/src/db.cpp -rw-rw-r-- hal/hal 6568 2009-01-10 01:01 bitcoin/src/irc.cpp -rw-rw-r-- hal/hal 82983 2009-01-07 01:00 bitcoin/src/main.cpp -rw-rw-r-- hal/hal 6938 2009-01-07 01:00 bitcoin/src/market.cpp -rw-rw-r-- hal/hal 31293 2009-01-07 01:00 bitcoin/src/net.cpp -rw-rw-r-- hal/hal 35279 2009-01-07 01:00 bitcoin/src/script.cpp -rw-rw-r-- hal/hal 19000 2009-01-07 01:00 bitcoin/src/sha.cpp -rw-rw-r-- hal/hal 97185 2009-01-07 01:00 bitcoin/src/ui.cpp -rw-rw-r-- hal/hal 108295 2009-01-07 01:00 bitcoin/src/uibase.cpp -rw-rw-r-- hal/hal 9386 2009-01-07 01:00 bitcoin/src/util.cpp -rw-rw-r-- hal/hal 841798 2009-01-07 01:00 bitcoin/src/uiproject.fbp -rw-rw-r-- hal/hal 5639 2009-01-07 01:00 bitcoin/src/base58.h -rw-rw-r-- hal/hal 14096 2009-01-07 01:00 bitcoin/src/bignum.h -rw-rw-r-- hal/hal 10979 2009-01-07 01:00 bitcoin/src/db.h -rw-rw-r-- hal/hal 1639 2009-01-07 01:00 bitcoin/src/headers.h -rw-rw-r-- hal/hal 317 2009-01-07 01:00 bitcoin/src/irc.h -rw-rw-r-- hal/hal 4639 2009-01-07 01:00 bitcoin/src/key.h -rw-rw-r-- hal/hal 33212 2009-01-07 01:00 bitcoin/src/main.h -rw-rw-r-- hal/hal 3745 2009-01-07 01:00 bitcoin/src/market.h -rw-rw-r-- hal/hal 21344 2009-01-07 01:00 bitcoin/src/net.h -rw-rw-r-- hal/hal 17707 2009-01-07 01:00 bitcoin/src/script.h -rw-rw-r-- hal/hal 39878 2009-01-10 01:01 bitcoin/src/serialize.h -rw-rw-r-- hal/hal 5023 2009-01-07 01:00 bitcoin/src/sha.h -rw-rw-r-- hal/hal 11887 2009-01-07 01:00 bitcoin/src/ui.h -rw-rw-r-- hal/hal 27772 2009-01-07 01:00 bitcoin/src/uibase.h -rw-rw-r-- hal/hal 25269 2009-01-07 01:00 bitcoin/src/uint256.h -rw-rw-r-- hal/hal 11482 2009-01-07 01:00 bitcoin/src/util.h -rw-rw-r-- hal/hal 602 2009-01-07 01:00 bitcoin/src/ui.rc -rw-rw-r-- hal/hal 1079 2009-01-07 01:00 bitcoin/src/license.txt -rw-rw-r-- hal/hal 2663 2009-01-07 01:00 bitcoin/src/readme.txt -rw-rw-r-- hal/hal 2647 2009-01-07 01:00 bitcoin/src/makefile.vc -rw-rw-r-- hal/hal 1306630 2009-01-07 01:00 bitcoin/libeay32.dll -rw-rw-r-- hal/hal 11673 2009-01-07 01:00 bitcoin/mingwm10.dll -rw-rw-r-- hal/hal 6440960 2009-01-10 01:01 bitcoin/bitcoin.exe -rw-rw-r-- hal/hal 1079 2009-01-07 01:00 bitcoin/license.txt -rw-rw-r-- hal/hal 1856 2009-01-07 01:00 bitcoin/readme.txt
We can immediately spot the Unix user and group hal/hal. Obviously, that archive was created by Hal Finney and the timestamps are pretty much the same as with the RAR. Finney extracted the files on 10 January at 18:34 local time (see first entry), assuming that his local time zone was US/Pacific (UTC-8 at the time).
For this part of the analysis, we will also denote the lines that differ between this version and version 0.1.0 by adding a + (for 0.1.3) or a – (for 0.1.0) at the beginning of the line.
-RAR archive ./bitcoin-0.1.0.rar +RAR archive ./bitcoin-0.1.3.rar Pathname/Comment Size Packed Ratio Date Time Attr CRC Meth Ver @@ -32,82 +32,82 @@ src/db.cpp - 16382 3413 21% 07-01-09 01:00 .....A 8C8159E8 m5? 2.9 + 16616 3486 21% 11-01-09 01:02 .....A 9309EFB7 m5? 2.9 src/irc.cpp - 6568 1348 21% 10-01-09 01:01 .....A 0F73F00C m5? 2.9 + 7173 1483 21% 11-01-09 01:02 .....A 806DD781 m5? 2.9 src/main.cpp - 82983 12833 15% 07-01-09 01:00 .....A F9387E1B m5? 2.9 + 83058 12791 15% 07-01-09 01:00 .....A E51CE2B1 m5? 2.9 src/net.cpp - 31293 4466 14% 07-01-09 01:00 .....A E22F1E37 m5? 2.9 + 32774 4639 14% 12-01-09 01:03 .....A B5CED220 m5? 2.9 src/util.cpp - 9386 1989 21% 07-01-09 01:00 .....A 5766966A m5? 2.9 + 9610 2045 21% 11-01-09 01:02 .....A 5CE3CB17 m5? 2.9 bitcoin.exe - 6440960 1597337 25% 10-01-09 01:01 .....A 9C811519 m5? 2.9 + 6438912 1591536 25% 12-01-09 01:03 .....A 292232FB m5? 2.9 src/net.h - 21344 3495 16% 07-01-09 01:00 .....A 377199D8 m5? 2.9 + 21397 3519 16% 11-01-09 01:02 .....A FAC43B12 m5? 2.9 src/serialize.h - 39878 4881 12% 10-01-09 01:01 .....A 2C064D8D m5? 2.9 + 39878 4889 12% 07-01-09 01:00 .....A 71E29667 m5? 2.9 readme.txt - 1856 588 32% 07-01-09 01:00 .....A FB70D7AF m5? 2.9 + 1857 587 32% 12-01-09 01:03 .....A 628FFF0C m5? 2.9 src/readme.txt - 2663 850 32% 07-01-09 01:00 .....A 2AE1E59F m5? 2.9 + 2664 851 32% 12-01-09 01:03 .....A 20E4D16A m5? 2.9
We spot that there are four unique timestamps: 07-01-09 01:00
, 10-01-09 01:01,
11-01-09 01:02
, 12-01-09 01:03
. A clear pattern emerges.
The time follows the version number. That means that the time 01:00 signifies that the file hasn’t changed since version 0.1.0, and 01:01 points to version 0.1.1, and so on. We can verify that claim by checking the release dates of early Bitcoin client versions. The source we can check is the bitcoin-list mailing list, where the version dates and release dates for 0.1.2 and 0.1.3 are exactly the same. The Internet Archive is one of the sources that has an early record of Bitcoin SourceForge files. Another source is the email conversations between Hal Finney and Satoshi Nakamoto. They put the date of the version releases between 0.1.1 and 0.1.3 within a day from the file timestamp, which might as well be a time zone difference.
There are a few exceptions though, the first one is that there is no public release of version 0.1.1, but we will explain that in the next chapter. Another issue is that src/serialize.h had its timestamp reset back to version 0.1.0, but the code contains static const int VERSION = 103;
. We argue that this was simply a mistake.
An interesting take on this file versioning scheme is to consider it as a primitive version control system (VCS) that Nakamoto could have used on his own. Decentralised VCSs like Git were not popular at the time when Bitcoin source code was published. In fact, it wasn’t until mid-2009 when the SourceForge repository for Bitcoin was set up by a member of the community (sirius-m).
On a side note, if we apply that file versioning scheme to the preview release from November 2008, which had files with time set to 00:00:01, the resulting version would be 0.0.0.1.
There are more than a few clues, which show that the original Bitcoin 0.1.0 version was replaced with a newer version. From an early record of SourceForge files we can see that bitcoin-0.1.0.rar has a release date of 12 January, 2009, instead of the expected 8 January, 2009, when the first announcement email was sent.
We know from emails that Hal Finney had tested version 0.1.0 and identified a major issue that made the client crash. Nakamoto managed to find the culprit in irc.cpp (mapAddresses.count() method call) and removed it. The current v0.1.0 doesn’t have that code and issue. Moreover, according to the emails the bitcoin-0.1.1.rar archive that Hal Finney received had exactly the same size of 2,132,686 bytes.
If we open the /src/serialize.h header file in bitcoin-0.1.0.rar archive, we find the following definition: static const int VERSION = 101;
Finally, the latest file timestamp in bitcoin-0.1.0.rar is 2009-01-10 01:01
. Using the file versioning scheme we established earlier, and knowing that there is a gap between 0.1.0 and 0.1.2, we can conclude that the first public release we can get on the Internet at the moment is actually a Bitcoin client version 0.1.1, incorrectly passed around as 0.1.0.
What are the differences between those two versions? Looking at the timestamps, we can infer that only two source files were changed – irc.cpp and serialize.h. That is, the bug fix and changing static const int VERSION = 100;
to static const int VERSION = 101;
.
We have purposefully skipped a few metadata timestamps and facts that are insignificant. After investigating the timestamps of the files and the timestamps of the directories, we concluded that the RAR archives were created on a Windows machine. This is shown by the host flag for the file entries and the microsecond precision directory timestamps. Another interesting piece of information is the directory timestamps themselves, which look untouched.
FILE: hdrlen=44 datlen=0 is=-D- flags=0x90f0:SOLID,EXTTIME,LONG,DIR os=2:WIN ver=20 mode=DIRECTORY,ARCHIVE,COMPRESSED meth=0 cmp=0 dec=0 vol=0 crc=0x00000000 (0) date_time=2009-01-07 15:36:27 name=src/obj/ mtime=2009-01-07T15:36:27.468750 FILE: hdrlen=43 datlen=0 is=-D- flags=0x90f0:SOLID,EXTTIME,LONG,DIR os=2:WIN ver=20 mode=DIRECTORY,ARCHIVE,COMPRESSED meth=0 cmp=0 dec=0 vol=0 crc=0x00000000 (0) date_time=2009-01-07 15:37:33 name=src/rc/ mtime=2009-01-07T15:37:33.671875 FILE: hdrlen=40 datlen=0 is=-D- flags=0x90f0:SOLID,EXTTIME,LONG,DIR os=2:WIN ver=20 mode=DIRECTORY,ARCHIVE,COMPRESSED meth=0 cmp=0 dec=0 vol=0 crc=0x00000000 (0) date_time=2009-01-10 23:15:06 name=src/ mtime=2009-01-10T23:15:06.703125
The article dives into the metadata of some of the early releases of the Bitcoin client. As a result, we have unravelled a file versioning scheme used by Satoshi, which utilises file modification time to show the version of the file. Thus, we can say with certainty that the currently available bitcoin-0.1.0.rar actually contains version 0.1.1.
Further investigation into the metadata of following releases would be an interesting continuation of this research. However, more than 11 years after the public release of Bitcoin, it is hard to come by original archives of early versions, namely 0.1.2 and 0.1.5. If you happen to have any of those, please send them to us. We’d love to further this research with more data.