var difficulty = 4;        // 设定哈希值尾部所需零的个数
var maximumNonce = 500000; // 限制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(-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) {
  // 挖矿函数
  for (var x = 0; x <= maximumNonce; x++) {
    // 遍历nonce
    $('#block' + block + 'chain' + chain + 'nonce').val(x);
    // 计算哈希值
    $('#block' + block + 'chain' + chain + 'hash').val(sha256(block, chain));
    
    // 检查哈希值是否符合要求
    if ($('#block' + block + 'chain' + chain + 'hash').val().substr(-difficulty) === pattern) {
      if (isChain) {
        // 更新链
        updateChain(block, chain);
      }
      else {
        // 更新状态
        updateState(block, chain);
      }
      break;
    }
  }
}
区块链挖矿算法:调整难度实现尾部零计数

原文地址: https://www.cveoy.top/t/topic/f22H 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录