Я играю с простой системой проверки работоспособности и сталкиваюсь с проблемой, касающейся того, как я могу ограничить время или количество циклов, необходимых для предположения, что работа была выполнена.
Пример:Трудность равна 3, но я не хочу, чтобы человек потратил 1 час на вычисление хэша.
- Можно ли убедиться, что человек выполнил X раундов, даже если первые цифры не совпадают "0«?(Человек находит хороший хеш или максимум 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')