区块链挖矿性能测试:两种代码实现的比较

本文将对比两种实现区块链挖矿的代码,分别进行300次挖矿,统计了每种代码的平均时间消耗,并给出了完整的代码和详细的注释。

代码实现

第一套代码

extends layout

block content
  .container-fluid
    h1 #{__('Blockchain')}
    .row.row-horizon
      - var blocks = []
      - blocks.push({block: 1, chain: 1, nonce: 11316, previous: '0000000000000000000000000000000000000000000000000000000000000000'})
      - blocks.push({block: 2, chain: 1, nonce: 35230, previous: '000015783b764259d382017d91a36d206d0600e2cbb3567748f46a33fe9297cf'})
      - blocks.push({block: 3, chain: 1, nonce: 12937, previous: '000012fa9b916eb9078f8d98a7864e697ae83ed54f5146bd84452cdafd043c19'})
      - blocks.push({block: 4, chain: 1, nonce: 35990, previous: '0000b9015ce2a08b61216ba5a0778545bf4ddd7ceb7bbd85dd8062b29a9140bf'})
      - blocks.push({block: 5, chain: 1, nonce: 56265, previous: '0000ae8bbc96cf89c68be6e10a865cc47c6c48a9ebec3c6cad729646cefaef83'})
      each block in blocks
        .col-xs-7
          include includes/block

  script.
    $(function() {
      setup(1, 1);
      setup(2, 1);
      setup(3, 1);
      setup(4, 1);
      setup(5, 1);
    });

    function getText(block, chain) {
      return $('#block'+block+'chain'+chain+'number').val() +
             $('#block'+block+'chain'+chain+'nonce').val() +
             $('#block'+block+'chain'+chain+'data').val() +
             $('#block'+block+'chain'+chain+'previous').val();
    }

    function setup(block, chain) {
      updateHash(block, chain);
      $('#block'+block+'chain'+chain+'mineButton').click(function(e) {
          e.preventDefault();
          var l = Ladda.create(this);
          l.start();
          setTimeout(function() {
              mine(block, chain, true);
              l.stop();
            }, 250); // give UI time to update
        });
    }

    function mine(block, chain, isChain) {
      var t0 = performance.now();
      for (var x = 1; x <= 1000; x++) {
        $('#block' + block + 'chain' + chain + 'number').val(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('Block ' + block + ' Chain ' + chain + ': ' + (t1 - t0) + ' milliseconds');
    }

第二套代码

var difficulty = 5;        // number of zeros required at front of hash
var maximumNonce = 50000000; // limit the nonce to this so we don't mine too long

// NOTE: Because there are 16 possible characters in a hex value, each time you increment
// the difficulty by one you make the puzzle 16 times harder. In my testing, a difficulty
// of 6 requires a maximumNonce well over 500,000,000.

/////////////////////////
// global variable setup
/////////////////////////
var pattern = '';
for (var x = 0; x < difficulty; x++) {
  pattern += '0';
}

/////////////////////////
// functions
/////////////////////////

function sha256(block, chain) {
  // calculate a SHA256 hash of the contents of the block
  return CryptoJS.SHA256(getText(block, chain));
}

function updateState(block, chain) {
  // set the well background red or green for this block
  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) {
  // update the SHA256 hash value for this block
  $('#block' + block + 'chain' + chain + 'hash').val(sha256(block, chain));
  updateState(block, chain);
}

function updateChain(block, chain) {
  // update all blocks walking the chain from this block to the end
  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('Here I start!');
  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('Block ' + block + ' Chain ' + chain + ': ' + (t1 - t0) + ' milliseconds');
}

测试结果

经过300次挖矿测试,第一套代码的平均时间消耗为**[平均时间消耗]毫秒,第二套代码的平均时间消耗为[平均时间消耗]**毫秒。

结论

从测试结果可以看出,[代码1/代码2]的性能表现更优。这可能是因为[原因1]。

注意事项

本文的测试结果仅供参考,实际挖矿性能会受到多种因素的影响,例如硬件配置、网络环境等。

未来展望

未来我们将继续探索更高效的挖矿算法,进一步提升挖矿性能。

区块链挖矿性能测试:两种代码实现的比较

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

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