The SHA3-256 algorithm will convert your data (text, images... ) in a hash. The beauty of this algorithm is that it's unpredictable and irreversible (you can't find the initial data only with the hash)
Let's take the following text example: 'Hello, World'
If you enter 'Hello, World' here , you'll get the following hash:
844af7bf6a5d414359dcd8845cb52d515397410e1668e00c8469ea8728c4ffe8
If you add a simple '.' in the end, you'll end up with a completly different hash :
3d3a78714924f9574b7dae02399feb0bf100c3893ed1f7a6934a687ff088f7d4
There is no predictible pattern behind SHA3-256, and it makes it nearly impossible to hack.
It's basically what a blockchain does; it hashes block data.
BUT to validate a block, you'll need to find the 'secret key.'
This secret-key is called a nonce; a nonce is a number that added to the block will make the hash start with the number of 0 sets in difficulty.
Let's take a simple example:
We have the following text in our block: 'Hello, World'
We set the difficulty to '000' - That means that we want the hash to start with '000.'
To validate the block, we need to found a nonce to the data that will make the hash starts with the set difficulty.
We start with nonce = 0
'Hello, World0'
44ede83c11bee0db1e9c53ae734c705771f56dff82413811c70e0f39862f3e7c
False - The hash don't start with '000'
'Hello, World1'
940fa6081f74fff0aab240034da8dc7569970a28ddfb63af61d62c746484a2b1
False - The hash don't start with '000'
'Hello, World2'
0b78c66e6596ce0ea1af4e3fab848663ef3b0c4b6bc771dd2338d89cacc1bc52
False - The hash don't start with '000'
'Hello, World3'
f2d8cec2539f4a237f5099c6a68209329873668b694634d780e289c994229389
False - The hash don't start with '000'
[...]
'Hello, World567'
000f96a254d94fb611f76bf639906b587c8818441e180d3dd1ea339a39171d2c
True - The hash start with '000'
The more 0 you add to the difficulty, the harder it will become to find the nonce.
And because we're devs, we'll create a little NodeJS project to 'mine' the block for us.
Let's code!
To code this miner, I'll assume that you already have NodeJS, Nodemon & Yarn installed on your machine.
To install NodeJS & NPM:
https://nodejs.org/en/
To install yarn with npm:
npm install -g yarn
To install Nodemon globally:
npm install -g nodemon
First, create a folder & the entry point of our app
mkdir Sha256-demo
cd Sha256-demo
touch index.js
yarn init
To make it easier for us, we need to install the sha3 module
yarn add sha3
We can now update our index.js
// We import the module in the project
const { SHA3 } = require("sha3");
// We create a new SHA3-256 instance
const hash = new SHA3(256);
//The initial text data
let words = "Hello, World";
//We set the difficulty
let difficulty = "000";
// nonce start at 0
let nonce = 0;
// The final hash will be updated in this var
let hex = "";
// Our switch
let check = true;
// We loop until we found the nonce
while (check) {
// We reset the hash on each loop
hash.reset();
// We add the sentence to hash
hash.update(words + nonce.toString());
// We digest the hash in hex
let digestHex = hash.digest("hex");
// We chack if the digest start with the difficulty
if (digestHex.startsWith(difficulty)) {
// if true, we store the hex
hex = digestHex;
// We turn of our switch to end the loop
check = false;
} else {
// if false, we increment the nonce and start again the process
nonce++;
}
}
console.log("Nonce: " + nonce);
// Nonce: 567
console.log("Hex: " + hex);
// Hex: 000f96a254d94fb611f76bf639906b587c8818441e180d3dd1ea339a39171d2c
// This means that the SHA3-256 of 'Hello, World' is 000f96a254d94fb611f76bf639906b587c8818441e180d3dd1ea339a39171d2c
To start the miner:
nodemon index.js
Latest comments (4)
This is exactly what have been looking for...
Thanks for this... If you have another tutorial to validate a nonce please I will be glad to check them...
I don't get it. Now we have the nonce, what can we do with it ? How / where can you "validate" our blockchain that starts with "000" ? Thanks
Hey Thomas,
Thanks for your feedback. This is just a simple introduction to understand the concept of the nonce, not a full step-by-step Blockchain tutorial ;)
I'll make other tutorials to validate and register a block in a blockchain ASAP.
Anyway, you can also check this repo I've made some months ago on Glitch: glitch.com/~oracle-blockchain
It's a fully working Blockchain made with Go & NodeJS.
[UPDATE] Here is the article to validate & add a block in the Blockchain! Enjoy
Hello Florian,
thank very much you for this very valauable tutorial.
Is it possible to write a similar program for SHA2(SHA256)
in order to found a nonce for SHA2(SHA256)?
In this tutorial is SHA3-256 used.
I have added sha2 module with yarn and tried to achive this but sha2
module doesn't support some methods e.g. like digest and update etc.
Best Regards
kalem