JavaScript区块链模拟:挖掘难度与时间分析
var difficulty = 5; // 挖矿难度:哈希值开头所需'0'的数量
var maximumNonce = 50000000; // 最大nonce值,限制挖矿时间
var totalTimes = 300; // 挖矿总次数
// 注意:由于十六进制值有16种可能,因此每次增加难度级别都会使谜题难度增加16倍。
// 在我的测试中,难度级别为6时,maximumNonce需要远大于500,000,000。
/////////////////////////
// 全局变量设置
/////////////////////////
var pattern = '';
for (var x = 0; x < difficulty; x++) {
pattern += '0';
}
/////////////////////////
// 函数
/////////////////////////
function sha256(block, chain) {
// 计算区块内容的SHA256哈希值
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) {
// 更新区块的SHA256哈希值
$('#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) + ' 毫秒');
}
// 生成数据
for (var i = 1; i <= 1000; i++) {
$('#block' + i + 'chain1data').val(i);
}
// 挖矿300次并记录每个难度级别的平均时间
var averageTimes = {};
for (var j = 1; j <= difficulty; j++) {
averageTimes[j] = 0;
}
for (var k = 1; k <= totalTimes; k++) {
for (var l = 1; l <= difficulty; l++) {
difficulty = l;
mine(1, 1, false);
averageTimes[l] += (performance.now() - t0);
}
}
for (var m = 1; m <= difficulty; m++) {
averageTimes[m] /= totalTimes;
console.log('难度级别 ' + m + ' 的平均挖矿时间:' + averageTimes[m] + ' 毫秒');
}
原文地址: https://www.cveoy.top/t/topic/f26P 著作权归作者所有。请勿转载和采集!