-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBlockchain.js
More file actions
83 lines (70 loc) · 1.89 KB
/
Blockchain.js
File metadata and controls
83 lines (70 loc) · 1.89 KB
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
import sha256 from './sha256.js';
class Block {
constructor(blockNumber, nonce, prevHash, transaction){
this.blockNumber = blockNumber;
this.timeStamp = Date.now();
this.transaction = transaction;
this.prevHash = prevHash;
this.nonce = nonce;
this.blockHash = '';
this.calculateHash();
}
calculateHash() {
this.blockHash = sha256(JSON.stringify(this));
return this;
}
}
class Blockchain {
constructor(){
this.chain = [];
this.data = [];
this.constructGenesis();
}
constructGenesis() {
this.chain.push(this.createBlock(0, 0));
return this;
}
createBlock(proofNo, prevHash) {
const newBlock = new Block(this.chain.length, proofNo, prevHash, this.data);
this.data = [];
return newBlock;
}
proofOfWork(lastProof){
let proofNo = 0;
while(Blockchain.verifyingProof(lastProof, proofNo)) proofNo += 1;
return proofNo;
}
newTransaction(sender, recipient, amount){
const st = {
sender,
recipient,
amount
};
this.data.push(st);
return this;
}
latestBlock() {
return this.chain[this.chain.length - 1];
}
checkValidity(block, prevBlock){
console.log(block);
console.log(prevBlock);
if(prevBlock.blockNumber + 1 != block.blockNumber) return false;
else if (prevBlock.blockHash != block.prevHash) return false;
else if (Blockchain.verifyingProof(prevBlock.nonce, block.nonce)) return false;
return true;
}
mining(){
let lastBlock = this.latestBlock();
let proofNo = this.proofOfWork(lastBlock.nonce);
let lastHash = lastBlock.blockHash;
let newBlock = this.createBlock(proofNo, lastHash);
if(this.checkValidity(newBlock, lastBlock)) this.chain.push(newBlock);
return this;
}
static verifyingProof(lastProof, proof){
const st = sha256(`${lastProof}${proof}`);
return st.slice(st.length-4, st.length) != '0000';
}
}
export default Blockchain;