Author

Topic: NovaCoin (scrypt PoW + PoS hybrid) [self-mod] - page 194. (Read 744451 times)

legendary
Activity: 976
Merit: 1003
если удастся вспомнить что я там в своё время "наколдовал" в кудрявом запросе, то выполним API-функцию getbalance с ключом /full с развёрнутым списком непотраченных транзакций, потому как в свёрном виде виде отображать баланс, включая неподтверждённые транзы, я не вижу смысла...
Очень бы хотелось, чтобы отображалось кол-во транзакций по типам: входящие, исходящие, майнинг(можно отдельно pow\pos).

там будут только непораченные выходы... без учёта их зрелости...

а если хочется полный расклад по адресу, как на странице, то это будет отдельный метод, но много позже...

можно пробовать: https://novaco.in/api/getbalance/<адрес>/full ...
как и обещал пока только непотраченные транзы, но все, без учёта зрелости...
добавлены 2 столбца: количество подтверждений (естественно не больше 520, т.к. точное количество подтверждений значения большого не имеет, думаю) и тип транзакции PoW/PoS (имеется в виду генерация) или пустое значение, т.е. обычная транзакция перевода...
вместо количества подтверждений, теоретически, можно указывать высоту блока, куда попала транза, а максимальную высоту можно взять из другого метода...
sr. member
Activity: 266
Merit: 250
Большой проблемы в этом никакой нет, за исключением хардфорка. Достаточно просто дробить не на 100, а на 1000 отрезков... Ценой большего количества итераций будет находить более точное решение.
7 итераций против 10 в худшем случае? не существенно)

Вот только где гарантия, что такого же вопроса не возникнет в будущем, с предложением увеличить количество итераций ещё и ещё в десять раз? Имхо, это от лукавого... Roll Eyes
Вот потому я и предложил второй вариант, решающий это кардинально) если попадаем на первые 10 отрезков из 100 вызываем себя рекурсивно, дробя эти первые 10 отрезков на 100 и т.д., в результате всегда имеем два значащих числа при расчёте награды за PoS-блок, а так-как PoS-сложность ещё не опускала награду ниже 10% даже форка не нужно
legendary
Activity: 3108
Merit: 1359
Большой проблемы в этом никакой нет, за исключением хардфорка. Достаточно просто брать не 100, а 1000 точек... Ценой большего количества итераций будет находить более точное решение.

Вот только где гарантия, что такого же вопроса не возникнет в будущем, с предложением увеличить количество итераций ещё и ещё в десять раз? Имхо, это от лукавого... Roll Eyes

sr. member
Activity: 266
Merit: 250
да чёрт его знает как оно работает если честно
Аналгем за 1-й курс, метод половинного деления aka бисекция Smiley

Составляем уравнение:

Code:
(nRewardCoinYearLimit / nRewardCoinYear) ^ 3 = bnProofOfStakeLimit / bnTarget

где неизвестным является nRewardCoinYear. Затем пытаемся решить его слегка модифицированным методом бисекции. Модифицированным, потому что находит только корни на отрезке [CENT, COIN]. Если же корень за пределами отрезка, то в качестве решения просто берется крайняя точка с соответствующей стороны отрезка.

грубо говоря разбиваешь большой отрезок на сто маленьких и находишь тот, которому принадлежит решение



...знаешь, мне всё-равно не нравится такой подход, ведь как я уже писал выше:
я бы сдвинул это округление на один знак вправо, до промилле. Ибо в будущем разница между, к примеру 3% и 4% может заставить в цикле после каждого нового блока включать/выключать майнинг, пытаясь подловить момент более удобный для чеканки блока с финансовой точки зрения.

Или, как вариант, оставить только два значащих знака, а-ля: 99%-10%, 9,9%-1,0%, 0,99%-0,10%..

P.S. От нечего делать подшаманил с графиком на табличке из моей подписи, имхо стало поинформативнее..
legendary
Activity: 3108
Merit: 1359
да чёрт его знает как оно работает если честно
Аналгем за 1-й курс, метод половинного деления aka бисекция Smiley

Составляем уравнение:

Code:
(nRewardCoinYearLimit / nRewardCoinYear) ^ 3 = bnProofOfStakeLimit / bnTarget

где неизвестным является nRewardCoinYear. Затем пытаемся решить его слегка модифицированным методом бисекции. Модифицированным, потому что находит только корни на отрезке [CENT, COIN]. Если же корень за пределами отрезка, то в качестве решения просто берется крайняя точка с соответствующей стороны отрезка.

Code:
nProofReward = min(10, CoinAge / 3650 * (difficulty / 0.03125) ^ (1/3))
Ах вот о какой формуле речь.

Исправлено:

https://github.com/novacoin-project/novacoin/wiki/Proof-of-stake

3) Считаем nProofReward:
Code:
8343.240769 * 0.30 * 33 / (365 * 33 + 8) = 6.852906

А в блоке видим
Code:
Reward	6.852708

Формулы годятся для оценок, но не дадут значений, совпадающих с результатами метода бисекции. Более того, на разных платформах они могут давать разные результаты... Простой пример в питоне, те же числа:
Code:
8343.240769 * ((0.03125 / 1.16394928) ** (1.0 / 3)) * 33 / (365 * 33 + 8)

И совсем другой результат: 6.840043785996486

Для полной идентичности следует использовать метод половинного деления. Тогда всегда будет выдавать совпадающие значения, где бы ни исполнялось и на чем бы ни было написано. Если же целью не является разработка альтернативного клиента или сборщика блоков, то формулы вполне применимы для оценок, о чем и сказал сегодня Пеньку.

Проблема основная в том, что для нормальной переносимости на разные платформы при вычислении награды нежелательно пользоваться чем-то помимо целочисленной арифметики. Поэтому и приходится иногда прибегать к более громоздким, но универсальным решениям.

P.S. На самом деле, если говорить совсем уж строго, то это бисекция является приближением. Но в нашем случае это не имеет значения, поскольку формулы не универсальны.
legendary
Activity: 1200
Merit: 1021
пообщался с "создателем"... он рекомендовал не мудрствовать и использовать ту самую формулу, которая указана в вики... а всё что в итоге получается -- это частные моменты применения данной формулы...
То есть
Code:
nProofReward = min(10, CoinAge / 3650 * (difficulty / 0.03125) ^ (1/3))
Huh Huh Huh

Так основная проблема этой формулы - награда РАСТЁТ с ростом сложности Grin Неужели никто этого не видитHuh
И почему делится на 3650???
legendary
Activity: 976
Merit: 1003
там всё просто... там целочисленные вычисления...

пообщался с "создателем"... он рекомендовал не мудрствовать и использовать ту самую формулу, которая указана в вики... а всё что в итоге получается -- это частные моменты применения данной формулы...
sr. member
Activity: 266
Merit: 250
Скорее всего, дело в способе вычисления кубического корня (т.е. степени 1/3). Насколько я понимаю, он вычисляется в этом цикле, и в результате получается число >0.3
да чёрт его знает как оно работает если честно, какой-то метод последовательного уполовинивания (завёрнутый в цикл) вместо математики, напоминает приближённое вычисление площади криволинейной трапеции методом численного интегрирования

хз почему это не было оформлено в аналитической форме
legendary
Activity: 1200
Merit: 1021
Когда кошелек разблокирован для майнинга, пункт меню "Разблокировать бумажник" становится неактивным. По-моему, раньше было не так, бумажник можно было разблокировать после разблокировки для майнинга.
В каких версиях так было? Не припоминаю подобного поведения.
Прошу прощения, напутал, показалось Embarrassed
legendary
Activity: 1200
Merit: 1021
2) Считаем nRewardCoinYear:
Code:
(0.03125 / 1.16394928) ^ (1 / 3) = 0.2994369
Принимаем равным 0.30

Извини, но так делать нельзя. То что дальше сотой отбрасывается, а не округляется:
Code:
nRewardCoinYear = min((nRewardCoinYear / CENT) * CENT, MAX_MINT_PROOF_OF_STAKE);
Но тогда вообще не получается:
Code:
8343.240769 * 0.29 * 33 / (365 * 33 + 8) = 6.622998

Скорее всего, дело в способе вычисления кубического корня (т.е. степени 1/3). Насколько я понимаю, он вычисляется в этом цикле, и в результате получается число >0.3

Также я понял, где оно ещё округляет до целого Cheesy
Quote
1) Считаем nCoinAge:
Code:
185.140354 * 30 + 2789.030149 = 8343.240769
Результат надо принять равным 8343, и тогда
Code:
8343 * 0.30 * 33 / (365 * 33 + 8) = 6.852708
что и требовалось доказать Smiley
legendary
Activity: 1442
Merit: 1016
2) Считаем nRewardCoinYear:
Code:
(0.03125 / 1.16394928) ^ (1 / 3) = 0.2994369
Принимаем равным 0.30

Извини, но так делать нельзя. То что дальше сотой отбрасывается, а не округляется:
Code:
nRewardCoinYear = min((nRewardCoinYear / CENT) * CENT, MAX_MINT_PROOF_OF_STAKE);

https://github.com/novacoin-project/novacoin/blob/b032c4a33e27deebe9210347048998ecc4624ee4/src/main.cpp#L1122

Мысли вслух: а вообще я бы сдвинул это округление на один знак вправо, до промилле. Ибо в будущем разница между, к примеру 3% и 4% может заставить в цикле после каждого нового блока включать/выключать майнинг, пытаясь подловить момент более удобный для чеканки блока с финансовой точки зрения.

Или, как вариант, оставить только два значащих знака, а-ля: 99%-10%, 9,9%-1,0%, 0,99%-0,10%..

К моменту когда будет 3-4%% монеты должны больше использоваться для переводов, потому что процент уже не интересный.
Нужно развивать использование монет.
legendary
Activity: 976
Merit: 1003
если удастся вспомнить что я там в своё время "наколдовал" в кудрявом запросе, то выполним API-функцию getbalance с ключом /full с развёрнутым списком непотраченных транзакций, потому как в свёрном виде виде отображать баланс, включая неподтверждённые транзы, я не вижу смысла...
Очень бы хотелось, чтобы отображалось кол-во транзакций по типам: входящие, исходящие, майнинг(можно отдельно pow\pos).

там будут только непораченные выходы... без учёта их зрелости...

а если хочется полный расклад по адресу, как на странице, то это будет отдельный метод, но много позже...


какая прелесть Cheesy где-то с округлением начудил значит в своё время, буду искать Grin

правлено: уже нашёл Cheesy оказывается округление получается при возврате вычисляемых значений мускулем Grin
буду проверять весь код на такие вычисления позже...
sr. member
Activity: 266
Merit: 250
2) Считаем nRewardCoinYear:
Code:
(0.03125 / 1.16394928) ^ (1 / 3) = 0.2994369
Принимаем равным 0.30

Извини, но так делать нельзя. То что дальше сотой отбрасывается, а не округляется:
Code:
nRewardCoinYear = min((nRewardCoinYear / CENT) * CENT, MAX_MINT_PROOF_OF_STAKE);

https://github.com/novacoin-project/novacoin/blob/b032c4a33e27deebe9210347048998ecc4624ee4/src/main.cpp#L1122

Мысли вслух: а вообще я бы сдвинул это округление на один знак вправо, до промилле. Ибо в будущем разница между, к примеру 3% и 4% может заставить в цикле после каждого нового блока включать/выключать майнинг, пытаясь подловить момент более удобный для чеканки блока с финансовой точки зрения.

Или, как вариант, оставить только два значащих знака, а-ля: 99%-10%, 9,9%-1,0%, 0,99%-0,10%..
donator
Activity: 968
Merit: 1002
если удастся вспомнить что я там в своё время "наколдовал" в кудрявом запросе, то выполним API-функцию getbalance с ключом /full с развёрнутым списком непотраченных транзакций, потому как в свёрном виде виде отображать баланс, включая неподтверждённые транзы, я не вижу смысла...
Очень бы хотелось, чтобы отображалось кол-во транзакций по типам: входящие, исходящие, майнинг(можно отдельно pow\pos).
sr. member
Activity: 266
Merit: 250
поправлено...
надеюсь нигде не забыл...
legendary
Activity: 1442
Merit: 1016
Спасибо, вижу
только сверху сложно описано всё
legendary
Activity: 1400
Merit: 1000

Наиболее правильное написание же такое:
Code:
nProofReward = min(10, nCoinAge  * nRewardCoinYear [b]* 33 / (365 * 33 + 8)[/b])

где nRewardCoinYear = (0.03125 / difficulty) ^ (1/3)


Первый раз такую формулу вижу, ты ее сам придумал?
" * 33 / (365 * 33 + Cool"
Это где такое в исходниках?

in100 прав
В исходниках:
https://github.com/novacoin-project/novacoin/blob/b032c4a33e27deebe9210347048998ecc4624ee4/src/main.cpp#L1143
https://github.com/novacoin-project/novacoin/blob/b032c4a33e27deebe9210347048998ecc4624ee4/src/main.cpp#L1133
legendary
Activity: 1064
Merit: 1023
habr
Quote
Описание эмиссии NVC - это и есть исходник, который мы совместно писали Smiley Там ещё много чего надо править, sleekka собирался доделать, но пока что-то застопорилось...

Вспомнилось:

legendary
Activity: 1442
Merit: 1016

Наиболее правильное написание же такое:
Code:
nProofReward = min(10, nCoinAge  * nRewardCoinYear [b]* 33 / (365 * 33 + 8)[/b])

где nRewardCoinYear = (0.03125 / difficulty) ^ (1/3)


Первый раз такую формулу вижу, ты ее сам придумал?
" * 33 / (365 * 33 + Cool"
Это где такое в исходниках?
Наиболее правильное это то что в исходниках, потому что других вариантов правильного быть не может.

Может тут?
https://github.com/novacoin-project/novacoin/blob/b032c4a33e27deebe9210347048998ecc4624ee4/src/main.cpp#L1062
legendary
Activity: 1200
Merit: 1021
ПыСы я тут вижу, что появились дополнительные описания новы, например, эмиссия... можно впилить в wiki, это недолго, в принципе, только надо точно знать откуда взять исходники...
Описание эмиссии NVC - это и есть исходник, который мы совместно писали Smiley Там ещё много чего надо править, sleekka собирался доделать, но пока что-то застопорилось...

По поводу wiki, писал уже пару раз, напишу снова.
Надо поправить формулу расчета PoS-награды, которая сейчас выглядит так:
Code:
nProofReward = min(10, CoinAge / 3650 * (difficulty / 0.03125) ^ (1/3))

Наиболее правильное написание же такое:
Code:
nProofReward = min(10, nCoinAge  * nRewardCoinYear * 33 / (365 * 33 + 8))

где nRewardCoinYear = (0.03125 / difficulty) ^ (1/3)

Причем на калькуляторе получить результат, идентичный рассчитанному кошельком, не получится.
Возьмём в качестве примера мой блок и транзакцию.
1) Считаем nCoinAge:
Code:
185.140354 * 30 + 2789.030149 = 8343.240769
2) Считаем nRewardCoinYear:
Code:
(0.03125 / 1.16394928) ^ (1 / 3) = 0.2994369
Принимаем равным 0.30

3) Считаем nProofReward:
Code:
8343.240769 * 0.30 * 33 / (365 * 33 + 8) = 6.852906

А в блоке видим
Code:
Reward 6.852708


Jump to: