Запущен официально первый decred PoS пул: https://stakepool.decred.org/ https://forum.decred.org/threads/mainnet-stake-pool-is-live.1256/#post-13660 Если Вы не хотите, постоянно держать бумажник разблокированым У вас нет надежного и быстрого подключения к Интернету У вас нет доступа к оборудованию, которое он-лайн 24/7 в течение нескольких месяцев это для вас
возможно сумма лежит частями на разных адресах. Я так понимаю, что при покупке билета вся необходимая сумма должна быть на одном адресе.
Список всех команд: ./dcrctl..... --wallet -l Кто знает причину увеличения стоимости билетов? Кому-то из разработчиков всёравно по какой цене закупаться? не сведётся это к сосредоточению POS майнинга в одних руках?
Вчера запустили первый PoS-пул. В котором на текущий момент 600 билетов. Вот кто-то закупил эти билеты, плюс разработчики, плюс обычные соло-голосующие. Учитывая что в википедии в примере стоит ticketmaxprice=20, не удивлюсь если многие люди прямо так ее и копипастят. Поэтому возможно даже где-то на уровне 20 DCR / билет цена и стабилизируются в итоге на N месяцев. В прочем дня через 2-3 увидим. Update: основываясь на текущем размере мемпула и купленных билетах за этот раунд, следующая цена билета вырастет и будет примерно 22.20 DCR
Блин... Да чтоб он провалился, этот пул! Цена билета сразу улетела в небеса! На каком именно? При ручной покупке адрес ведь нигде не указывается, да и при автоматической тоже. То есть, по идее, могут быть использованы все средства на кошельке. 0.0.6 beta отсюда: https://github.com/decred/decred-release/releases/tag/v0.0.6 Список всех адресов кошелька: Code: ./dcrctl --wallet getaddressesbyaccount default Для баланса тоже наверное что-то есть, поищи: Code: ./dcrctl --wallet -l
а вы как разработчик не хотите своим коллегам подсказать исправить в вики и на пуле хотябы на 10.... А что косаемо пула, на английском я ужасно общаюсь, поэтому могли бы Вы объяснить, что там за скрипт в пуле? где увидеть его код?
я не разработчик, а код можно посмотреть на гитхабе, https://github.com/decred/dcrd/blob/master/blockchain/difficulty.go либо проконсультироваться у товарища @Dyrk Code: // calcNextRequiredStakeDifficulty calculates the exponentially weighted average // and then uses it to determine the next stake difficulty. // TODO: You can combine the first and second for loops below for a speed up // if you'd like, I'm not sure how much it matters. func (b *BlockChain) calcNextRequiredStakeDifficulty(curNode *blockNode) (int64, error) { alpha := b.chainParams.StakeDiffAlpha stakeDiffStartHeight := int32(b.chainParams.CoinbaseMaturity) + 1 maxRetarget := int64(b.chainParams.RetargetAdjustmentFactor) TicketPoolWeight := int64(b.chainParams.TicketPoolSizeWeight) // Number of nodes to traverse while calculating difficulty. nodesToTraverse := b.chainParams.StakeDiffWindowSize * int32(b.chainParams.StakeDiffWindows) // Genesis block. Block at height 1 has these parameters. // Additionally, if we're before the time when people generally begin // purchasing tickets, just use the MinimumStakeDiff. // This is sort of sloppy and coded with the hopes that generally by // stakeDiffStartHeight people will be submitting lots of SStx over the // past nodesToTraverse many nodes. It should be okay with the default // Decred parameters, but might do weird things if you use custom // parameters. if curNode == nil || curNode.height < stakeDiffStartHeight { return b.chainParams.MinimumStakeDiff, nil } // Get the old difficulty; if we aren't at a block height where it changes, // just return this. oldDiff := curNode.header.SBits if (curNode.height+1)%b.chainParams.StakeDiffWindowSize != 0 { return oldDiff, nil } // The target size of the ticketPool in live tickets. Recast these as int64 // to avoid possible overflows for large sizes of either variable in // params. targetForTicketPool := int64(b.chainParams.TicketsPerBlock) * int64(b.chainParams.TicketPoolSize) // Initialize bigInt slice for the percentage changes for each window period // above or below the target. windowChanges := make([]*big.Int, b.chainParams.StakeDiffWindows) // Regress through all of the previous blocks and store the percent changes // per window period; use bigInts to emulate 64.32 bit fixed point. oldNode := curNode windowPeriod := int64(0) weights := uint64(0) for i := int32(0); ; i++ { // Store and reset after reaching the end of every window period. if (i+1)%b.chainParams.StakeDiffWindowSize == 0 { // First adjust based on ticketPoolSize. Skew the difference // in ticketPoolSize by max adjustment factor to help // weight ticket pool size versus tickets per block. poolSizeSkew := (int64(oldNode.header.PoolSize)- targetForTicketPool)*TicketPoolWeight + targetForTicketPool // Don't let this be negative or zero. if poolSizeSkew <= 0 { poolSizeSkew = 1 } curPoolSizeTemp := big.NewInt(poolSizeSkew) curPoolSizeTemp.Lsh(curPoolSizeTemp, 32) // Add padding targetTemp := big.NewInt(targetForTicketPool) windowAdjusted := curPoolSizeTemp.Div(curPoolSizeTemp, targetTemp) // Weight it exponentially. Be aware that this could at some point // overflow if alpha or the number of blocks used is really large. windowAdjusted = windowAdjusted.Lsh(windowAdjusted, uint((b.chainParams.StakeDiffWindows-windowPeriod)*alpha)) // Sum up all the different weights incrementally. weights += 1 << uint64((b.chainParams.StakeDiffWindows-windowPeriod)* alpha) // Store it in the slice. windowChanges[windowPeriod] = windowAdjusted // windowFreshStake = 0 windowPeriod++ } if (i + 1) == nodesToTraverse { break // Exit for loop when we hit the end. } // Get the previous block node. var err error tempNode := oldNode oldNode, err = b.getPrevNodeFromNode(oldNode) if err != nil { return 0, err } // If we're at the genesis block, reset the oldNode // so that it stays at the genesis block. if oldNode == nil { oldNode = tempNode } } // Sum up the weighted window periods. weightedSum := big.NewInt(0) for i := int64(0); i < b.chainParams.StakeDiffWindows; i++ { weightedSum.Add(weightedSum, windowChanges[i]) } // Divide by the sum of all weights. weightsBig := big.NewInt(int64(weights)) weightedSumDiv := weightedSum.Div(weightedSum, weightsBig) // Multiply by the old stake diff. oldDiffBig := big.NewInt(oldDiff) nextDiffBig := weightedSumDiv.Mul(weightedSumDiv, oldDiffBig) // Right shift to restore the original padding (restore non-fixed point). nextDiffBig = nextDiffBig.Rsh(nextDiffBig, 32) nextDiffTicketPool := nextDiffBig.Int64() // Check to see if we're over the limits for the maximum allowable retarget; // if we are, return the maximum or minimum except in the case that oldDiff // is zero. if oldDiff == 0 { // This should never really happen, but in case it does... return nextDiffTicketPool, nil } else if nextDiffTicketPool == 0 { nextDiffTicketPool = oldDiff / maxRetarget } else if (nextDiffTicketPool / oldDiff) > (maxRetarget - 1) { nextDiffTicketPool = oldDiff * maxRetarget } else if (oldDiff / nextDiffTicketPool) > (maxRetarget - 1) { nextDiffTicketPool = oldDiff / maxRetarget } // The target number of new SStx per block for any given window period. targetForWindow := b.chainParams.StakeDiffWindowSize * int32(b.chainParams.TicketsPerBlock) // Regress through all of the previous blocks and store the percent changes // per window period; use bigInts to emulate 64.32 bit fixed point. oldNode = curNode windowFreshStake := int64(0) windowPeriod = int64(0) weights = uint64(0) for i := int32(0); ; i++ { // Add the fresh stake into the store for this window period. windowFreshStake += int64(oldNode.header.FreshStake) // Store and reset after reaching the end of every window period. if (i+1)%b.chainParams.StakeDiffWindowSize == 0 { // Don't let fresh stake be zero. if windowFreshStake <= 0 { windowFreshStake = 1 } freshTemp := big.NewInt(windowFreshStake) freshTemp.Lsh(freshTemp, 32) // Add padding targetTemp := big.NewInt(int64(targetForWindow)) // Get the percentage change. windowAdjusted := freshTemp.Div(freshTemp, targetTemp) // Weight it exponentially. Be aware that this could at some point // overflow if alpha or the number of blocks used is really large. windowAdjusted = windowAdjusted.Lsh(windowAdjusted, uint((b.chainParams.StakeDiffWindows-windowPeriod)*alpha)) // Sum up all the different weights incrementally. weights += 1 << uint64((b.chainParams.StakeDiffWindows-windowPeriod)*alpha) // Store it in the slice. windowChanges[windowPeriod] = windowAdjusted windowFreshStake = 0 windowPeriod++ } if (i + 1) == nodesToTraverse { break // Exit for loop when we hit the end. } // Get the previous block node. var err error tempNode := oldNode oldNode, err = b.getPrevNodeFromNode(oldNode) if err != nil { return 0, err } // If we're at the genesis block, reset the oldNode // so that it stays at the genesis block. if oldNode == nil { oldNode = tempNode } } // Sum up the weighted window periods. weightedSum = big.NewInt(0) for i := int64(0); i < b.chainParams.StakeDiffWindows; i++ { weightedSum.Add(weightedSum, windowChanges[i]) } // Divide by the sum of all weights. weightsBig = big.NewInt(int64(weights)) weightedSumDiv = weightedSum.Div(weightedSum, weightsBig) // Multiply by the old stake diff. oldDiffBig = big.NewInt(oldDiff) nextDiffBig = weightedSumDiv.Mul(weightedSumDiv, oldDiffBig) // Right shift to restore the original padding (restore non-fixed point). nextDiffBig = nextDiffBig.Rsh(nextDiffBig, 32) nextDiffFreshStake := nextDiffBig.Int64() // Check to see if we're over the limits for the maximum allowable retarget; // if we are, return the maximum or minimum except in the case that oldDiff // is zero. if oldDiff == 0 { // This should never really happen, but in case it does... return nextDiffFreshStake, nil } else if nextDiffFreshStake == 0 { nextDiffFreshStake = oldDiff / maxRetarget } else if (nextDiffFreshStake / oldDiff) > (maxRetarget - 1) { nextDiffFreshStake = oldDiff * maxRetarget } else if (oldDiff / nextDiffFreshStake) > (maxRetarget - 1) { nextDiffFreshStake = oldDiff / maxRetarget } // Average the two differences using scaled multiplication. nextDiff := mergeDifficulty(oldDiff, nextDiffTicketPool, nextDiffFreshStake) // Check to see if we're over the limits for the maximum allowable retarget; // if we are, return the maximum or minimum except in the case that oldDiff // is zero. if oldDiff == 0 { // This should never really happen, but in case it does... return oldDiff, nil } else if nextDiff == 0 { nextDiff = oldDiff / maxRetarget } else if (nextDiff / oldDiff) > (maxRetarget - 1) { nextDiff = oldDiff * maxRetarget } else if (oldDiff / nextDiff) > (maxRetarget - 1) { nextDiff = oldDiff / maxRetarget } // If the next diff is below the network minimum, set the required stake // difficulty to the minimum. if nextDiff < b.chainParams.MinimumStakeDiff { return b.chainParams.MinimumStakeDiff, nil } return nextDiff, nil }
я не про скрипт вычисления сложности, а про сткрипт который нужно экспортировать кошелек, чтобы майнить пос через пул, только там набор цифр откомпиленный, а я хочу код увидеть и ещё вопрос, какой процент берет пул?
если скрипт который нужно экспортировать кошелек, чтобы майнить пос через пул то обещали выложить позже на гитхабе через неделю
Не совсем понял, если билет Revoked то возвращается только цена билета, или какая-то награда все же добавляется?
Никакая награда не добавляется, возвращается цена билета за вычетом комиссии на транзакцию (то есть ты еще и теряешь на этом копейку) Вот смотри пример Revoked транзакции: https://mainnet.decred.org/tx/57d2087992532bbb49abb54d0e86d4942f6486021676491aa976222b4e81b414 Как видишь там возвращают 2 DCR за билет, но на кошелек приходит 1.925 DCR, тк почему-то разрабы поставили высокую комиссию в 0.075 на эти транзакции.
В результате активного PoS-майнинга число адресов моего кошелька увеличилось до ~1000 (по крайней мере такая цифра проскакивает при запуске dcrwallet). Об этом стоит беспокоиться? Это нормально, или можно/нужно объединить каким-то образом все средства на одном адресе?
также интересно, что будет, если кошелек восстановить из первоначального seed - будут ли там новые адреса фигурировать? Или надо сохранять wallet.db?
Есть ли ограничение на максимальное количество билетов в пуле? Долго время их количество не превышало 43 тысяч, сейчас стало уже больше.
Жестких ограничений нет. Есть "мягкий" предел в 42 тысячи (или около того, не помню точно), после которого быстро начинает расти цена билета. А дальше саморегуляция: больше билетов в пуле -> выше цена -> меньше покупателей -> меньше билетов в пуле.