如何在工作量证明系统中限制循环次数并限制时间,同时防止篡改?

时间:2018-11-18 07:20:36

标签: javascript blockchain

我正在使用一个简单的工作量证明系统,我面临一个问题,即如何限制假设完成工作所需的时间或循环次数。

示例:难度为3,但我不希望该人花费1个小时来计算哈希。

  • 即使前两位数字不匹配“ 0”,也可以确保该人执行X轮吗? (此人找到了良好的哈希值或最多200个回合)

诀窍是服务器或第三方如何确认该人确实完成了所定义的最大回合次数

我可能要问的第二个问题是,例如,如何确保工作在同一小时内完成,而不是前一周和今天的最后几个哈希值。如果将日期附加到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')

0 个答案:

没有答案