我正在使用一个简单的工作量证明系统,我面临一个问题,即如何限制假设完成工作所需的时间或循环次数。
示例:难度为3,但我不希望该人花费1个小时来计算哈希。
诀窍是服务器或第三方如何确认该人确实完成了所定义的最大回合次数
我可能要问的第二个问题是,例如,如何确保工作在同一小时内完成,而不是前一周和今天的最后几个哈希值。如果将日期附加到calculateHash()
函数中,我将无法知道该值。有人说challenge + (TheDateIwant) + nonce
很容易。由于这不是区块链,因此我不想在挑战中包含先前的结果。
function pow() {}
pow.prototype.maxRounds = 200
pow.prototype.nonce = 0
pow.prototype.challenge = null
pow.prototype.verifyHash = function(hash) {
console.log('verify', hash)
if (hash.match(/^000/)) { // Difficulty = 000
console.log('Solved... ' + hash)
return true
}
}
pow.prototype.calculateHash = function() {
// TODO: Optimize??
self.nonce++
var x = new jsSHA('SHA3-256', 'TEXT')
x.update(this.challenge + this.nonce + '')
return x.getHash('HEX')
}
pow.prototype.start = function(challenge) {
this.nonce = 0
this.challenge = challenge
console.log('Challenge', challenge, this.nonce, this.maxRounds)
while (this.nonce < this.maxRounds) {
this.nonce += 1
work = this.calculateHash()
if (this.verifyHash(work)) {
console.log('YAY')
}
}
}
var POW = new pow()
var x = POW.start('Hello there :P')