
Building a tiny blockchain - nitramm
https://medium.com/crypto-currently/lets-build-the-tiniest-blockchain-e70965a248b
======
wildbunny
This worries me. Bitcoin solved the double spend problem by using the LCR with
PoW. That is the novel aspect which allowed cryptocurrencies to come into
existence.

If you remove the LCR and PoW, all you are left with is a toy example which
cannot work in practice.

What is needed is education about censensus design and bitcoin's
implementation of the solution, rather than a 'how to guide' for building a
basic linked list under the guise of 'blockchain'.

Cheers, Paul.

~~~
jbb67
As for proof of work, am I right in assuming it works like this :-

Add a field to store a random number. Keep generating values for this field
until the hash of the structure has 'n' leading zeros.

Is that more or less correct?

~~~
DSMan195276
Yes, that's more or less it.

It's worth adding to that description that the hash must be secure in that it
does not allow determining what random number to use to get a particular
output (I'm sure you already recognized this detail - it just guarantees you
have to keep trying actually random numbers to find a result).

Also worth adding is that the 'n' (Basically the difficulty) is generally
going to need some way of scaling based on how quickly correct hashes were
found in the past. This is important to prevent problems that would happen
with people being able to generate correct results too quickly (Or even just
significantly faster then previously).

In particular, Bitcoin's difficulty factor scales such that a new block is
found aprox. every 10 minutes, so 'n' is adjusted every so many blocks
depending on how fast the hashes were found. Because in the case of Bitcoin, a
found block means more coins in the market, it is important that when more
hashing power is added, it doesn't result in blocks now being found 1 minute
apart. If that were to happen, then you'd have 10 times the number of coins
entering the market.

~~~
e12e
And this scaling of the work factor - is that tied to timestamps in the
previous blocks? (Ie - the work factor is something like
max(average(time_blockN - time_blockN+1)?

[ed: from other comments, I gather that "passage of time" means "added blocks
(hashes)" \- but I'm still not clear on where the agreement on what
constitutes "in 10 minutes on average" comes from - if A sees an addition to
the blockchain of N blocks with X proof-of-work, lets call it N * X from B,
and sees M blocks with Y proof-of-work from C -- it should be easy to figure
out which is bigger of N * X and M * Y (here we don't really assume
multiplication, but some way to figure out maximum proof-of-work).

But how does A know how long either took? Is the time local, so that A looks
at the head of the B and C chains, and considers when A saw this head, and
figure the elapsed time based on that?]

~~~
DSMan195276
Yes, but it is not adjusted per-block, but every 2016 blocks (Which is 2 weeks
time if each block takes 10 minutes to find).

It's also worth keeping in mind the problem that timestamps are technically
forge-able by the miner. Bitcoin doesn't really solve this problem, but it
does place requirements that the timestamp of a block be larger then the
average of the past 11 (With various constraints). Thus if you presumably have
mining distributed enough, then one giving you as invalid of a time as would
still be accepted wouldn't end-up affecting things long-term since they can't
generate blocks fast enough to heavily affect the average. Still technically
an attack vector though.

------
cableshaft
Regardless of the semantic discussion on what exactly a 'blockchain' is and
whether or not this qualifies, I found the article interesting by taking a
tiny piece of the whole monster and demystifying it a bit.

I don't see this any differently than a tutorial that makes a static image
move around the screen with key presses. Is it a full game? Not at all. But
can it teach you how to build a tiny piece of it, and you can look at other
tutorials to figure out how to build other tiny pieces of it, and eventually
synthesize that knowledge and make a full game? Yes.

~~~
todd_wanna_code
Hey you got some link for other tutorials to go from here?

~~~
simias
The clever part about bitcoin is reusing existing technologies in a novel way.

It uses:

\- Hashcash-style proof of work:
[http://www.hashcash.org/](http://www.hashcash.org/) (originally designed to
make spamming harder, although I don't think it ever really became widely
adopted).

\- Merkle trees to reference transactions in the blocks (same technology used
for bittorent chunks):
[https://en.wikipedia.org/wiki/Merkle_tree](https://en.wikipedia.org/wiki/Merkle_tree)

\- Elliptic curve cryptography for signing transactions:
[https://en.wikipedia.org/wiki/Elliptic_curve_cryptography](https://en.wikipedia.org/wiki/Elliptic_curve_cryptography)
(asymmetric cryptography, used in TLS, SSH etc...)

\- When a new "node" connects to the network it uses hardcoded addresses and
DNS seeds to find other nodes to connect to:
[https://bitcoin.org/en/glossary/dns-
seed](https://bitcoin.org/en/glossary/dns-seed) (before that it used IRC)

And there are probably a few other things but basically if you know how to
work with those technologies then you have all the tools you need to implement
a bitcoin clone. It's nothing groundbreaking, it's "just" a clever novel use
of existing technology.

All the actual "rules" of the network (the block reward etc...) are simply
validated in the nodes, they'll reject any block that's not properly crafted
(i.e. bad reward, invalid proof of work etc...). Therefore the node consensus
dictates what bitcoin _is_. If you implement a non-compatible change in the
client and you don't convince all the other users to switch you create a fork
since you won't have the same definition of what constitutes a valid block.

------
Uptrenda
So ah... where's the part where you implement a working blockchain, again?
There's no proof-of-work, consensus logic, currency logic, accounting logic,
peer-to-peer networking code, etc.

Instead this is just a list of hashed-linked documents... Not that much
different from a Git repo or a basic file system with integrity checks.
Hashing != blockchains.

~~~
KenanSulayman
What? A blockchain isn’t a distributed ledger. A blockchain IS a chain of
linked documents - whereas these documents are usually hash trees including
the “transactions” per block. They ensure integrity by hashing the previous
blocks. The proof of work is just a way to ensure a self regulating growth of
virtual currencies and to prevent double spending.

~~~
jasode
_> A blockchain isn’t a distributed ledger. A blockchain IS a chain of linked
documents_

You are interpreting "blockchain" to be constrained to a "chain of hashes".
That is a valid interpretation.

The parent (Uptrenda) is interpreting "blockchain" as a umbrella label for
"distributed ledger". This wider definition is also a valid interpretation and
this language phenomenon is called "synecdoche"[1].

To point back to the actual article, the author (Gerald Nash) is using
"blockchain" in both meanings. On the one hand, he talks about the wider scope
of distributed currency... but on the other hand, his Python example is
constrained to a "chain of hashes". Since Mr Nash is mentioning the Satoshi
bitcoin whitepaper when talking about "blockchain" (the wider meaning),
Uptrenda's criticism is reasonable because the most interesting part of
distributed-blockchain is the invention of _incentives_ (mining rewards) and
_social agreement_ on acceptable hashes (e.g. how many 0000s are counted,
which chain is chosen, etc).

As other distributed projects such as IPFS/Diaspora/Sandstorm/etc show,
finding the right combination of incentives to create social buy-in and
sustainability is the hard part. The hashes is the easy part.

[https://en.wikipedia.org/wiki/Synecdoche](https://en.wikipedia.org/wiki/Synecdoche)

~~~
KenanSulayman
That argument is not exactly valid, because the concept of a block chain has
been described a long time before it was used in "virtual currencies." [1]

"Block chains" in modern times are very helpful in handling transactions in
databases by replacing things like CAS-Numbers [2] with hashes. The hash of
the previous block effectively becomes the CAS-Number, with the feature of
staying persistent and verifiable.

CAS example: IF X_version IS 200 SET X=2

BC example: IF hash(X) IS 200 ADD document Y WITH Y_parent = hash(X)

That is, while the article does in fact also mentions Bitcoin, I don't see a
point in discrediting the article, the code or the author in any way.
Personally, I find it far more valuable for engineers to understand the
underlying, fundamental concepts of things before going all-in. Sure, he could
have discussed all these things, but for people who are new to the topic, that
would not have been very helpful in understanding the concept of a block
chain.

[1]
[https://link.springer.com/article/10.1007/BF00196791](https://link.springer.com/article/10.1007/BF00196791)

[2] [https://en.wikipedia.org/wiki/Compare-and-
swap](https://en.wikipedia.org/wiki/Compare-and-swap)

~~~
jasode
_> , because the concept of a block chain has been described a long time
before_

Citing historical usage and original meanings is not relevant as to why people
use synecdoche.

The point is that in _today 's discourse_, the term "blockchain" has already
_expanded beyond_ the original literal technically constrained meaning of
"chain of hashes". Even if _you_ want to keep the original meaning of
"blockchain", you still have to recognize when _others_ are using synecdoche.

Examples in media:

\+
[https://www.google.com/search?q=bloomberg+blockchain](https://www.google.com/search?q=bloomberg+blockchain)

\+
[https://www.google.com/search?q=wsj+blockchain](https://www.google.com/search?q=wsj+blockchain)

\+ [https://www.igvita.com/2014/05/05/minimum-viable-block-
chain...](https://www.igvita.com/2014/05/05/minimum-viable-block-chain/)

To interpret those articles correctly, you have to mentally substitute
"blockchain" with "distributed ledger". If you substitute with "chain of
hashes", the articles make no sense.

Synecdoche throws original historical usage out the window.

 _> , but for people who are new to the topic, that would not have been very
helpful in understanding the concept of a block chain._

There are many web articles that create a "toy" blockchain by showing
_hashes_. The problem is that the abundance of such articles actually hides
the real ingenuity of the Satoshi/bitcoin.

Again, the hard part is combining multiple technologies in clever ways that
can _synchronize the psychology of anonymous people_ \-- aka "decentralized
trust". The hashing is the least interesting component of all that. However,
since the "hashes" are the most "accessible" part of it (especially to
programmers), that's what everybody ends up writing about! This has the
unintended side effect if hiding the more groundbreaking ideas (the
psychology) of distributed ledgers.

~~~
Uptrenda
The psychology aspect is a part that's the most impressive. You have
incentives -- everybody likes money -- and proof-of-work -- consensus that
solves the byzantine generals problem. But if you combine them all to produce
a new trustless kind of money then this innovation itself serves like a
socially scaleless memetic payload.

It's like what Nick Szabo talks about in his social scalability article. That
the design of Bitcoin offers high social scalability, allowing anyone to
participate in the system across cultures, languages, customs, and laws. It
kind of ties everything together under a single model.

I also agree with you about the "Synecdoche" thing, too. It seems like we're
arguing about the same thing. As you say, you can interpret "blockchain" as
the chain of blocks that is outputted from the consensus system or as the
whole system itself. But I guess in the context of this article it was
confusing whether this poster was having a genuine misunderstanding or was
just talking about a part of the system.

------
kbody
Clearly there's an association to Bitcoin and there are certain expectations
by people when mentioning blockchain.

It's justified since blockchain on its own is a relatively simple data
structure which on itself is not that significant. It's the composition of all
the elements that have given the value and recognition to this technology.

~~~
joepie91_
Same answer here: the term "blockchain" didn't _exist_ before Bitcoin. It has
a very specific meaning involving a particular kind of distributed ledger.

------
chrisallick
I wanted to try re-writing in Ruby to warm up today. Can someone confirm this
is correct?
[https://gist.github.com/chrisallick/cb196b13555c86f9193f3ec4...](https://gist.github.com/chrisallick/cb196b13555c86f9193f3ec4f7f15ecc)

~~~
KenanSulayman
Looks good to me.

You might want to keep track of the blocks as you create them, or you will
find it hard to verify the integrity of a block.

(Do I know the hash of the previous block? Do I know about the next block, if
it is not the last block?)

~~~
chrisallick
yeah im not sure how deep i want to go. i already have a side self-education
project but i keep getting sucked into blockchain stuff and find myself
reading white papers. i don't know... seems like it could become an obsession.

the thing i really want to try making is take a sinatra/redis/crud app and
rebuild the database as a distributed database on a blockchain. or at least i
think thats what i want to do.

------
e12e
Regardless of the quality of the article, it's refreshing to see so many good
questions and concise answers in this thread (mostly about blockchains-as-
distributed-ledgers). It's been a while since I saw such nice, civil and
interesting technical discussion on hn.

------
jchrisa
I've got a JS block-tree here. The root block is hashed from user content.
[https://github.com/jchris/document-coin](https://github.com/jchris/document-
coin)

------
wildbunny
When you're talking about people's money, just following tutorials and piecing
something together does not cut it.

~~~
dang
We detached this subthread from
[https://news.ycombinator.com/item?id=14796915](https://news.ycombinator.com/item?id=14796915)
and marked it off-topic.

