区块链演示:修改blockchain-demo文件,生成1000个区块并统计挖矿时间
修改 blockchain-demo 文件,生成 1000 个区块并统计挖矿时间
本教程将指导您修改 blockchain-demo 文件中的 blockchain.pug 和 blockchain.js 文件,以编程方式生成包含 1 到 1000 数据的区块链。我们还将执行 300 次挖矿操作,并分析不同难度级别下的平均挖矿时间。
修改 blockchain.pug
将 blockchain.pug 文件中的代码替换为以下内容:
extends 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);
$('#block'+i+'chain1data').val(i);
}
// 统计挖矿时间
var totalTime = 0;
for (var j = 1; j <= 300; j++) {
var t0 = performance.now();
for (var k = 1; k <= 1000; k++) {
mine(k, 1, false);
}
totalTime += (performance.now() - t0);
}
var averageTime = totalTime / 300;
console.log('平均挖矿时间: ' + averageTime + ' 毫秒');
});
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
});
}
在这个修改后的代码中,我们使用循环生成了 1000 个区块,并将每个区块的数据设置为其区块号。
修改 blockchain.js
将 blockchain.js 文件中的代码替换为以下内容:
var difficulty = 5; // 难度值:哈希值开头所需'0'的数量
var maximumNonce = 50000000; // nonce 的最大值
var pattern = '';
for (var x = 0; x < difficulty; x++) {
pattern += '0';
}
function sha256(block, chain) {
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) {
$('#block' + block + 'chain' + chain + 'hash').val(sha256(block, chain));
updateState(block, chain);
}
function updateChain(block, chain) {
for (var x = block; x <= 1000; 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('开始挖矿 block ' + block);
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 + ' 耗时 ' + Math.floor(t1 - t0) + ' 毫秒');
}
在这个修改后的代码中:
- 我们将
updateChain函数修改为循环 1000 次,以更新所有 1000 个区块。 - 我们在
mine函数中添加了计时功能,以计算每个区块的挖矿时间,并在控制台中打印平均挖矿时间。
完成这些修改后,您就可以运行 blockchain-demo 应用程序,并查看包含 1000 个区块的区块链,并观察不同难度级别下的挖矿时间。
注意: 难度级别越高,挖矿时间越长。
希望这个教程对您有所帮助!
原文地址: https://www.cveoy.top/t/topic/f28H 著作权归作者所有。请勿转载和采集!