JavaScript区块链挖矿算法与性能分析
var difficulty = 4; // 定义挖矿难度:哈希值开头需要的'0'的数量
var maximumNonce = 50000000; // 限制nonce的最大值,防止挖矿时间过长
// 注意:由于十六进制值有16个可能的字符,因此每次增加
// 难度增加1,谜题的难度就会增加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) {
// 挖矿函数,寻找满足难度目标的nonce
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;
}
}
}
// 运行16次挖矿,并记录每次挖矿所消耗的时间
var times = [];
for (let i = 0; i < 16; i++) {
const startTime = performance.now();
mine(1, i, true);
const finishTime = performance.now();
times.push(finishTime - startTime);
}
// 计算平均挖矿时间
const averageTime = times.reduce((a, b) => a + b, 0) / times.length;
console.log('难度为 ' + difficulty + ' 的情况下,16次挖矿的平均时间:' + averageTime + ' 毫秒');
原文地址: https://www.cveoy.top/t/topic/f22A 著作权归作者所有。请勿转载和采集!