-
Notifications
You must be signed in to change notification settings - Fork 0
/
chonechain.js
90 lines (79 loc) · 2.47 KB
/
chonechain.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// comments hkhgkhj
// owner...ert
const SHA256 = require("crypto-js/sha256");
class Block {
constructor(index, timestamp, data, previousHash = '') {
this.index = index;
this.previousHash = previousHash;
this.timestamp = timestamp;
this.data = data;
this.hash = this.calculateHash();
this.nonce = 0;
}
calculateHash() {
return SHA256(this.index +
this.previousHash +
this.timestamp +
JSON.stringify(this.data) +
this.nonce
).toString();
}
mineBlock(difficulty) {
while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")) {
this.nonce++;
this.hash = this.calculateHash();
}
console.log("BLOCK MINED: " + this.hash);
console.log("NONCE: " + this.nonce)
}
}
class Blockchain{
constructor() {
this.chain = [this.createGenesisBlock()];
this.difficulty = 4;
}
createGenesisBlock() {
return new Block(0, Date.now(), "Genesis block by Chone himself!!!", "0");
}
addBlock(newBlock) {
newBlock.previousHash = this.getLatestBlock().hash;
newBlock.mineBlock(this.difficulty);
this.chain.push(newBlock);
}
getLatestBlock() {
return this.chain[this.chain.length - 1];
}
listblockchain() {
return this.chain;
}
isChainValid() {
for (let i = 1; i < this.chain.length; i++){
const currentBlock = this.chain[i];
const previousBlock = this.chain[i - 1];
if (currentBlock.hash !== currentBlock.calculateHash()) {
return false;
}
if (currentBlock.previousHash !== previousBlock.hash) {
return false;
}
}
return true;
}
isValidBlockStructure(block) {
return typeof block.index === 'number'
&& typeof block.hash === 'string'
&& typeof block.previousHash === 'string'
&& typeof block.timestamp === 'number'
&& typeof block.data === 'string';
}
}
//############################################################################
//## execute code - This is for testing only.
//############################################################################
let cchain = new Blockchain();
for (let i = 1; i <= 5; i++) {
cchain.addBlock(new Block(i, Date.now(), { sender: 'cp', receiver: 'jp', amount: 1.5 }));
}
var output = cchain.listblockchain();
console.log(output);
console.log('Blockchain valid: ' + cchain.isChainValid());