chainpro
Version:
85 lines (72 loc) • 2.07 kB
JavaScript
import { calcHash, isNewBlockValid } from './block';
const Chain = (function () { // eslint-disable-line func-names
let instance;
const origin = {
index: 0,
timestamp: 0,
data: 'Hello Blockchain!',
prevHash: 0,
hash: calcHash({
index: 0,
prevHash: 0,
timestamp: 0,
data: 'Hello Blockchain!'
})
};
const chain = [origin];
function isChainValid(newChain) {
let isValid = true;
if (JSON.stringify(newChain[0]) !== JSON.stringify(origin)) {
console.log('Received chain is invalid. Origin block does not coincide');
isValid = false;
return isValid;
}
const tempChain = [newChain[0]];
for (let i = 1; i < newChain.length; i += 1) {
if (isNewBlockValid(newChain[i], tempChain[i - 1])) {
tempChain.push(newChain[i]);
} else {
isValid = false;
return isValid;
}
}
return isValid;
}
function get() {
return chain;
}
function update(block) {
if (isNewBlockValid(block)) {
chain.push(block);
}
}
function last() {
return chain.slice().pop();
}
function replace(newChain) {
if (isChainValid(newChain) && newChain.length > chain.length) {
console.log('Received chain is valid. Replacing current chain with received chain');
chain.length = 0; // clear current chain
chain.push(...newChain); // fill current already empty chain with the new one if valid
} else {
console.log('Received chain is invalid');
}
}
function create() {
return {
get,
update,
last,
replace
};
}
return {
init() {
if (!instance) {
instance = create();
}
return instance;
}
};
}());
export default Chain.init();