JavaScript区块链挖矿性能优化:自动生成区块数据并计算平均挖矿时间
JavaScript区块链挖矿性能优化:自动生成区块数据并计算平均时间
本文将修改两套JavaScript代码,实现以下目标:
- 自动生成区块数据: 无需手动输入,使用编程方式依次生成区块内的数据(1到1000)。2. 模拟挖矿并统计时间: 分别对每个区块进行300次挖矿,并统计每次挖矿消耗的时间,最终计算出平均挖矿时间。
第一套代码
**原始代码:**javascriptextends 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 + ' took ' + Math.floor(t1 - t0) + ' milliseconds.'); }
**修改后的代码:**javascriptextends layout
block content .container-fluid h1 #{__('Blockchain')} .row.row-horizon - var blocks = [] - for (var i = 1; i <= 1000; i++) { - blocks.push({block: i, chain: 1, nonce: 0, previous: '0000000000000000000000000000000000000000000000000000000000000000'}); - } each block in blocks .col-xs-7 include includes/block
script. $(function() { for (var i = 1; i <= 1000; i++) { setup(i, 1); } });
// ... 其他函数 ...
function mine(block, chain, isChain) { var totalTime = 0; for (var count = 0; count < 300; count++) { var t0 = performance.now(); // ... 挖矿逻辑 ... var t1 = performance.now(); totalTime += (t1 - t0); } var avgTime = totalTime / 300; console.log('Block ' + block + ', Chain ' + chain + ': Average mining time = ' + avgTime.toFixed(2) + ' ms'); }
修改说明:
- 自动生成区块数据: 使用
for循环生成1000个区块数据,并存储在blocks数组中。2. 循环挖矿并统计时间: 在mine函数中,使用for循环进行300次挖矿,并累加每次挖矿的时间。最后,计算平均挖矿时间并输出。
第二套代码
**原始代码:**javascriptvar difficulty = 5; // number of zeros required at front of hashvar 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) { 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 + ' took ' + Math.floor(t1 - t0) + ' milliseconds.');}
**修改后的代码:**javascript// ... (其他部分代码保持不变) ...
function mine(block, chain, isChain) { var totalTime = 0; for (var count = 0; count < 300; count++) { 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(); totalTime += (t1 - t0); } var avgTime = totalTime / 300; console.log('Block ' + block + ', Chain ' + chain + ': Average mining time = ' + avgTime.toFixed(2) + ' ms');}
修改说明:
- 与第一套代码类似,在
mine函数中添加循环和时间统计逻辑,实现300次挖矿和平均时间计算。
通过以上修改,两套代码都可以实现自动生成区块数据、模拟挖矿并统计平均时间的功能,帮助您更好地理解区块链挖矿过程和性能优化。
原文地址: https://www.cveoy.top/t/topic/f28c 著作权归作者所有。请勿转载和采集!