I ran forensic code stylometry on Adam Back’s hashcash vs Bitcoin v0.1.0. The result: 20/100 similarity. Here’s why the code says he isn’t Satoshi.
I built a tool that extracts 32 stylometric features from C/C codebases and compares them using AI analysis agents.
Think of it like handwriting analysis, but for code. Every programmer develops unconscious habits – how they name variables, format braces, handle errors. Over 19,000 lines of code, they’re almost impossible to disguise.
I compared hashcash against Bitcoin v0.1.0 across six categories: naming conventions, formatting, error handling, language features, architecture, and platform signals.
The results weren’t close. 2 matches. 10 partial. 18 mismatches.
– THE NAMING PROBLEM –
Satoshi was obsessive about Hungarian notation. Every variable in Bitcoin v0.1.0 is type-prefixed: nValue for integers, fBlock for booleans, pindexBest for pointers, mapTransactions for maps. This isn’t occasional – it’s every single variable, without exception.
Hashcash? Zero Hungarian notation. Not one instance. Variables are descriptive snake_case: validity_period, db_filename, line_max. Where Satoshi writes fSuccess, Back writes check_flag. The _flag suffix is literally the mirror-image of Satoshi’s f prefix.
Every function in Bitcoin is PascalCase: GetHash(), ConnectInputs(), AcceptTransaction(). Every function in hashcash is snake_case: hashcash_mint(), hashcash_check(), sdb_open(). You don’t accidentally switch between them on a side project.
– THE ERROR HANDLING FINGERPRINT –
Satoshi had a deeply distinctive error pattern:
return error(“ConnectInputs() : %s prev tx not found”, hash.ToString().substr(0,6).c_str());
That format – error(“FunctionName() : description”) – appears throughout Bitcoin. The function name embedded in every error message. The hash truncated with .substr(0,6). This is a genuine fingerprint.
Hashcash uses generic “error: description” messages with no function name embedding. No hash truncation. Completely different error philosophy.
– THE PLATFORM DIVIDE –
Satoshi was a Windows developer. Bitcoin v0.1.0 was built Windows-first: MSVC compiler, WSAStartup for networking, CRITICAL_SECTION for threading, %I64d format specifiers (an MSVC-specific quirk), Allman brace style, 4-space indentation.
Hashcash is Unix-native. POSIX APIs, /dev/urandom for randomness, Stroustrup brace style, mixed tabs, standard %ld format specifiers. Different operating system cultures entirely.
– THE ARCHITECTURE GAP –
Satoshi used extensive global state – dozens of global maps and pointers. He named thread functions with a “2” suffix (ThreadSocketHandler2). He built custom macro-based serialization.
Hashcash uses file-scoped statics, no threading, and standard I/O serialization. None of Satoshi’s architectural fingerprints appear.
– CONTEXT –
I ran the same analysis against four other candidates:
Hal Finney (RPOW): 41/100 – highest match, genuine partial overlaps on Hungarian notation and formatting
Wei Dai (Crypto ): 22/100
Len Sassaman (Mixmaster): 20/100
Paul Le Roux (TrueCrypt/E4M): 16/100
The two things hashcash matched on? ALL_CAPS constants and no unit tests. Both universal in late-90s/2000s C code. They tell you nothing.
– THE CAVEAT –
Could someone deliberately change their style for a pseudonymous project? In theory. In practice, maintaining a different style across 19,000 lines – prefixing every variable with a system you’ve never used, reformatting every brace, restructuring every error message – would require superhuman discipline. And you’d expect occasional slips. There are zero slips toward hashcash conventions in Bitcoin’s source.
Code doesn’t lie. The person who wrote hashcash and the person who wrote Bitcoin v0.1.0 had different tools, different platforms, different naming instincts, different error handling philosophies, and different architectural reflexes.
The stylometric evidence argues decisively against common authorship.