-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathmain.js
More file actions
130 lines (101 loc) · 3.52 KB
/
main.js
File metadata and controls
130 lines (101 loc) · 3.52 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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
const SHA2567 = require('crypto-js/sha256');
//transactions object
class Transaction{
constructor(fromAddress, toAddress, amount){
this.fromAddress = fromAddress;
this.toAddress = toAddress;
this.amount = amount;
}
}
//block object
class Block{
constructor(timestamp, transactions, previousHash = ''){
this.timestamp = timestamp;
this.transactions = transactions;
this.previousHash = previousHash;
this.hash = this.calculateHash();
this.nonce = 0; //use in mining so that the while loop does not goes in infinite loop
}
//calcuate the hash for block
calculateHash(){
return SHA2567(this.previousHash + this.timestamp + JSON.stringify(this.transactions) + this.nonce).toString();
}
//Blockchain mining
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);
}
}
//blockchain object
class Blockchain{
constructor(){
this.chain = [this.createGenesisBlock()];
this.difficulty = 2; //setting the mining difficulty level
this.pendingTransactions = [];
this.miningReward = 100;
}
//create first block
createGenesisBlock(){
return new Block( "01/01/2018", "Genesis Block", "0");
}
//Get latest block in block chain
getLatestBlock(){
return this.chain[this.chain.length - 1];
}
//mining block in block chain
minePendingTrancations(miningRewardAddress){
let block = new Block(Date.now(), this.pendingTransactions);
block.mineBlock(this.difficulty);
console.log('Block successfully mined!');
this.chain.push(block);
this.pendingTransactions = [
new Transaction(null, miningRewardAddress, this.miningReward)
];
}
//create Transaction
createTransaction(transaction){
this.pendingTransactions.push(transaction);
}
//Show Balance
getBalanceOfAddress(address){
let balance = 0;
for(const block of this.chain){
for(const trans of block.transactions){
if(trans.fromAddress === address){
balance -=trans.amount;
}
if(trans.toAddress === address){
balance +=trans.amount
}
}
}
return balance;
}
//validation of blocks in block 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;
}
}
//create rdCoin
let rdCoin = new Blockchain();
rdCoin.createTransaction(new Transaction('address1', 'address2', '100'));
rdCoin.createTransaction(new Transaction('address2', 'address1', '50'));
console.log('\n Starting the miner.......');
rdCoin.minePendingTrancations('xaviers-address');
console.log('\nBalance of xavier is ', rdCoin.getBalanceOfAddress('xaviers-address'));
console.log('\n Starting the miner again.......');
rdCoin.minePendingTrancations('xaviers-address');
console.log('\nBalance again of xavier is ', rdCoin.getBalanceOfAddress('xaviers-address'));