-
Notifications
You must be signed in to change notification settings - Fork 0
/
Block.js
40 lines (37 loc) · 862 Bytes
/
Block.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
const Block = (exports.Block = class Block {
constructor(opts = {}) {
Object.assign(
this,
{
parentHash: null,
stateHash: null,
miner: null,
nonce: 0,
transactions: [],
},
opts
);
}
hash() {
const head = JSON.stringify(this, [
"parentHash",
"stateHash",
"miner",
"nonce",
]);
const tail = JSON.stringify(this.transactions.map((tx) => tx.hash()));
return createHash("SHA256")
.update(head + tail)
.digest("hex");
}
mine(min = 0, max = Number.MAX_SAFE_INTEGER) {
for (let nonce = min; nonce <= max; nonce++) {
const block = new Block({ ...this, nonce });
if (block.test()) return block;
}
}
test() {
const mask = "0".repeat(CONFIG.BLOCK_DIFFICULTY);
return this.hash().startsWith(mask);
}
});