Waves developers Ru
На вашем месте, я бы больше не делал утверждений, пока ваши данные не сойдутся с ожиданием. Так как с большой вероятностью, именно у вас будет ошибка.
Читать полностью…первый if включает 37? (не знаю что значит +result в js)
Читать полностью…Быстрый анализ показывает, что у вас не учитывается зеро (37)
Читать полностью…@alexeykiselev У меня нет опыта в таких вопросах, буду рад, если вы сможете доказать обратное.
Читать полностью…Я говорил не о нерандомности VRF, а о том, что часть диапазона выпадает чаще, чем другая.
У меня нет стартовых рандомных чисел. Есть текущий блок и следующий в котором в котором нужно получить рандомное число. Вот чистая функция для этого теста:
@Callable(i)если мы начнем перебор от 2618144 (с -1 на каждой итерации), то получим данные:
func testRandomNumber(h: Int) = {
let randomHash = sha256(blockInfoByHeight(h).value().vrf.value() + (h - 1).toBytes())
let hashInt = toInt(randomHash, 24)
let res = hashInt % 37
throw(res.toString())
}
В любом случае спасибо, я попрошу потестировать игру знакомых, надаюсь, они не найдут этот баг. В варианте с hash им потребовалось 70 игр, чтобы понять, что одна часть диапазона выпадает чаще и обыграть )
Читать полностью…Если подставлять любою задачу под результат - тогда все варианты рабочие ) Если пролистать этот чат, то речь раз 5 была про рандом от vrf при commit reveal, этот вариант не дает рандомного числа на большой выборке(легко предсказать если не число, то диапазоны где оно будет), далее был вариант с hash и теперь + n.toBytes. В этом варианте самый лучший показатель рандома, но если вы тестировали по диапазона который показал выше, наверное, тоже заметили, что числа все равно сползают. В текущем варианте на +-300 из 10 000, в варианте с hash (с 2я числами) было +-400. Темн не менее задача была и остаются на уровне стандартной для любого языка. В последнем варианте далеко не рандом, но выглядит почти нормально. Так что тут дело не в не-райдовском коде, я тестирую изолированную функцию ride изолированной функцией js вызывая через @waves/waves-transactions.
Читать полностью…И в этом случае распределение равномерное
[254, 285, 264, 292, 268, 247, 259, 266, 293, 243, 270, 262, 298, 272, 286, 256, 272, 261, 279, 260, 279, 273, 281, 306, 253, 276, 248, 258, 262, 271, 257, 252, 284, 290, 289, 277, 257]
могу еще раз запустить, 10000 раз, минут через 10 доложу
Читать полностью…при toBigInt числа не только положительные:
30|-11|3|21|-34|25|-16|22|-35|-13|-6|-3|12|12|9|-31|-27|19|35|-1|34|-13|-17|-20|26|25|-15|-9|31|-34|-28|-12...
from1to18: 313,
from18t36: 687,
from1to12: 687,
from13to24: 158,
from25to36: 155,
line1: 153,
line2: 154,
line3: 693,
red: 241,
black: 759,
even: 503,
odd: 497
также если брать 3и высоты, то тоже не рандомно
let revealBlock = blockInfoByHeight( commitHeight ).valueOrErrorMessage( "unexcpected error" )
let vrf = revealBlock.vrf.valueOrErrorMessage( "unexcpected error" )
let randomHash = sha256(vrf.value())
let revealBlock2 = blockInfoByHeight( commitHeight - 10 ).valueOrErrorMessage( "unexcpected error" )
let vrf2 = revealBlock.vrf.valueOrErrorMessage( "unexcpected error" )
let randomHash2 = sha256(vrf.value())
let revealBlock3 = blockInfoByHeight( commitHeight - 20 ).valueOrErrorMessage( "unexcpected error" )
let vrf3 = revealBlock.vrf.valueOrErrorMessage( "unexcpected error" )
let randomHash3 = sha256(vrf.value())
let n1 = toInt(randomHash, 16)
let n2 = toInt(randomHash2, 16)
let n3 = toInt(randomHash3, 16)
if n1 > 0 then {
let randomNumber = n1 % 37
throw(randomNumber.toString())
} else if (n2 > 0) then {
let randomNumber = n2 % 37
throw(randomNumber.toString())
} else {
let randomNumber = n3 % 37
throw(randomNumber.toString())
}
Возможно, проблема в том, что toInt(randomHash, 16) в половине случаев дает отрицательное число, надо проверять более детально, как в этом случае распределяются остатки
Читать полностью…https://docs.waves.tech/en/ride/data-types/list#list-as-function-argument
Читать полностью…"call":{"args":
[
{
"type": "list",
"value": [
{
"type": "integer",
"value": 1000000000
},
{
"type": "integer",
"value": 0
}
]
}
],
"function":
Поэтому все данные неверны на 1/37 как минимум
Читать полностью…В реальном мире, я не про тестирование через перебор, а накладывая эти данные на игру с выплатами, пользователь очень быстро начинает понимать куда ставить. Из-за этого я и говорил, что предсказать число затруднительно, но очень вероятно предсказать в каком диапазоне оно будет.
Читать полностью…Графики в студию. Утверждение о нерандомности VRF очень сильное. Я в свое время в этом тоже сомневался, построил график распределения и там сразу стало видно, что оно абсолютно равномерное. Просто прямоугольник какой-то.
Читать полностью…Я взял ваши данные из txt файла. Они абсолютно рандомные, это вы накосячили при подсчете интервалов
Читать полностью…Вы не варианты пробуйте (они все рабочие), а в своем не-райдовском коде баг ищите
Читать полностью…И с вашими данными распределение равномерное.
[279, 246, 253, 274, 274, 275, 246, 288, 292, 271, 262, 284, 283, 253, 282, 305, 282, 250, 253, 255, 253, 283, 255, 275, 272, 267, 264, 257, 295, 252, 290, 282, 260, 289, 257, 270, 272]
Да, меня тогда взволновал вопрос, интересно
Читать полностью…Я проверил 100000 раз на такой функции
func pseudo(n: Int) = {
let randomHash = sha256(blockInfoByHeight(height).value().vrf.value() + n.toBytes())
let hashInt = toInt(randomHash, 24)
hashInt % 37
}
Инкрементил n, чтоб не ждать каждый раз минуту. Результаты вполне ровные:
[2687, 2710, 2732, 2710, 2643, 2589, 2792, 2721, 2663, 2732, 2777, 2737, 2750, 2707, 2604, 2685, 2689, 2646, 2766, 2620, 2701, 2604, 2647, 2705, 2687, 2755, 2713, 2767, 2716, 2745, 2731, 2732, 2713, 2689, 2788, 2646, 2701]
По идее, если брать BigInt даже от всех 32 байт, то он всегда будет положительным. Попробуйте toInt(toBigInt(randomHash) % toBigInt(37))
Читать полностью…Здравствуйте!
Я на финальной стадии тестирования игры, детально проверил этот вариант при генерировании 10 000 рандомных числе, он оказался не совсем совсем рандомным.
Делал шаг -1 от 2615375 и вызывал такой метод:
@Callable(i)
func testRandomNumber(commitHeight: Int) = {
let revealBlock = blockInfoByHeight( commitHeight ).valueOrErrorMessage( "unexcpected error" )
let vrf = revealBlock.vrf.valueOrErrorMessage( "unexcpected error" )
let randomHash = sha256(vrf.value())
let randomNumber = toInt(randomHash, 16) % 37
throw(randomNumber.toString())
}
Подскажите, как используя Signer invoke передать List в args?
Читать полностью…