All the current implementations of blockchains are tightly coupled with the larger context and problems they (e.g. Bitcoin or Ethereum) are trying to solve. This makes understanding blockchains a necessarily harder task, than it must be. Especially source-code-wisely. This project is an attempt to provide as concise and simple implementation of a blockchain as possible.
From Wikipedia : Blockchain is a distributed database that maintains a continuously-growing list of records called blocks secured from tampering and revision.
Check also this blog post for a more detailed overview of the key concepts
- HTTP interface to control the node
- Use Websockets to communicate with other nodes (P2P)
- Super simple "protocols" in P2P communication
- Data is not persisted in nodes
- No proof-of-work or proof-of-stake: a block can be added to the blockchain without competition
For a more extensive tutorial about blockchains, you can check the project Naivecoin. It is based on Naivechain and implements for instance Proof-of-work, transactions and wallets.
(set up two connected nodes and mine 1 block)
npm install
HTTP_PORT=3001 P2P_PORT=6001 npm start
HTTP_PORT=3002 P2P_PORT=6002 PEERS=ws://localhost:6001 npm start
curl -H "Content-type:application/json" --data '{"data" : "Some data to the first block"}' http://localhost:3001/mineBlock
(set up three connected nodes and mine a block)
docker-compose up
curl -H "Content-type:application/json" --data '{"data" : "Some data to the first block"}' http://localhost:3001/mineBlock
curl http://localhost:3001/blocks
curl -H "Content-type:application/json" --data '{"data" : "Some data to the first block"}' http://localhost:3001/mineBlock
curl -H "Content-type:application/json" --data '{"peer" : "ws://localhost:6001"}' http://localhost:3001/addPeer
curl http://localhost:3001/peers
Parameter :
{
"peer" : "ws://localhost:6002"
}
Parameter :
{
"sender" : "0",
"receiver" : "1",
"value" : "1",
"in_counter" : "0",
"out_counter" : "0",
"transactionHash" : "0",
"inputs" : "0",
"outputs" : "0"
}
Parameter :
{
"data": "localhost:3001"
}
(임의로 설정했음)