var difficulty = 5;        // 定义挖矿难度:哈希值前导零的数量
var maximumNonce = 50000000; // 设置最大随机数,避免无限循环
var totalMiningTime = 0;    // 用于存储总挖矿时间

// 注意:由于十六进制值有16种可能,因此每次增加
// 难度都会使谜题难度增加16倍。在我的测试中,难度
// 为6时,最大随机数需要远大于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();
  totalMiningTime += t1 - t0;
  console.log('挖矿耗时:' + Math.floor(t1 - t0) + ' 毫秒');
}

// 生成1到1000的区块数据
for (var i = 1; i <= 1000; i++) {
  $('#block' + i + 'chain1data').val(i);
}

// 执行300次挖矿
for (var j = 1; j <= 300; j++) {
  for (var k = 1; k <= 1000; k++) {
    mine(k, 1, true);
  }
}

// 计算平均挖矿时间
var averageMiningTime = totalMiningTime / (300 * 1000);
console.log('平均挖矿时间:' + averageMiningTime + ' 毫秒');
JavaScript区块链模拟:实现挖矿与性能分析

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

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