JavaScript区块链挖矿模拟与性能分析
var difficulty = 5; // 定义挖矿难度:哈希值开头所需'0'的个数
var maximumNonce = 50000000; // 设置最大nonce值,避免过长的挖矿时间
// 生成1到1000的输入数据
var inputs = [];
for (var i = 1; i <= 1000; i++) {
inputs.push(i);
}
// 根据难度生成目标哈希模式
var pattern = '';
for (var x = 0; x < difficulty; x++) {
pattern += '0';
}
// SHA256哈希函数
function sha256(block, chain) {
return CryptoJS.SHA256(getText(block, chain));
}
// 更新区块状态
function updateState(block, chain) {
if ($('#block' + block + 'chain' + chain + 'hash').val().substr(0, difficulty) === pattern) {
$('#block' + block + 'chain' + chain + 'well').removeClass('well-error').addClass('well-success');
} else {
$('#block' + block + 'chain' + chain + 'well').removeClass('well-success').addClass('well-error');
}
}
// 更新哈希值
function updateHash(block, chain) {
$('#block' + block + 'chain' + chain + 'hash').val(sha256(block, chain));
updateState(block, chain);
}
// 更新区块链
function updateChain(block, chain) {
for (var x = block; x <= 5; x++) {
if (x > 1) {
$('#block' + x + 'chain' + chain + 'previous').val($('#block' + (x - 1).toString() + 'chain' + chain + 'hash').val());
}
updateHash(x, chain);
}
}
// 挖矿函数
function mine(block, chain, isChain) {
console.log('开始挖矿!');
var t0 = performance.now();
for (var x = 0; x <= maximumNonce; x++) {
$('#block' + block + 'chain' + chain + 'nonce').val(x);
$('#block' + block + 'chain' + chain + 'hash').val(sha256(block, chain));
if ($('#block' + block + 'chain' + chain + 'hash').val().substr(0, difficulty) === pattern) {
if (isChain) {
updateChain(block, chain);
} else {
updateState(block, chain);
}
break;
}
}
var t1 = performance.now();
console.log('挖矿耗时:' + Math.floor(t1 - t0) + ' 毫秒');
return Math.floor(t1 - t0);
}
// 执行300次挖矿,并统计平均时间
var totalTime = 0;
for (var i = 0; i < 300; i++) {
for (var j = 0; j < 1000; j++) {
$('#block1chain1data').val(inputs[j]);
totalTime += mine(1, 1, false);
}
}
var averageTime = totalTime / 300;
console.log('平均挖矿时间:' + averageTime + ' 毫秒');
原文地址: https://www.cveoy.top/t/topic/f26I 著作权归作者所有。请勿转载和采集!