Pos Mining

Discussion in 'Русский (Russian)' started by sergey zasorin, Feb 11, 2016.

  1. 2017/12/15 - Decred v1.1.2 released! → Release Notes  → Downloads
  1. negeroy

    negeroy Jr. Member
    Designer

    Jan 11, 2016
    63
    35
    Male
    Запущен официально первый decred PoS пул: https://stakepool.decred.org/
    https://forum.decred.org/threads/mainnet-stake-pool-is-live.1256/#post-13660

    Если Вы не хотите, постоянно держать бумажник разблокированым
    У вас нет надежного и быстрого подключения к Интернету
    У вас нет доступа к оборудованию, которое он-лайн 24/7 в течение нескольких месяцев

    это для вас ;)
     
  2. Beoga

    Beoga New Member

    Mar 2, 2016
    30
    0
    возможно сумма лежит частями на разных адресах. Я так понимаю, что при покупке билета вся необходимая сумма должна быть на одном адресе.
     
  3. negeroy

    negeroy Jr. Member
    Designer

    Jan 11, 2016
    63
    35
    Male
    какая версия валета, такая беда была в первых версиях, в 0.0.5 вроде бы пофиксили этот баг
     
  4. Beoga

    Beoga New Member

    Mar 2, 2016
    30
    0
    Есть ли команда для просмотра всех адресов кошелька с их балансом?
     
  5. Artem

    Artem New Member

    Jan 1, 2016
    23
    1
    Male
    Russia
    Список всех команд:
    ./dcrctl..... --wallet -l

    Кто знает причину увеличения стоимости билетов? Кому-то из разработчиков всёравно по какой цене закупаться? не сведётся это к сосредоточению POS майнинга в одних руках?
     
  6. Dyrk

    Dyrk Sr. Member
    Developer

    Jan 7, 2016
    518
    376
    Male
    Wonderland
    #46 Dyrk, Mar 8, 2016
    Last edited: Mar 8, 2016
    Вчера запустили первый PoS-пул. В котором на текущий момент 600 билетов. Вот кто-то закупил эти билеты, плюс разработчики, плюс обычные соло-голосующие. Учитывая что в википедии в примере стоит ticketmaxprice=20, не удивлюсь если многие люди прямо так ее и копипастят. Поэтому возможно даже где-то на уровне 20 DCR / билет цена и стабилизируются в итоге на N месяцев. В прочем дня через 2-3 увидим.

    Update: основываясь на текущем размере мемпула и купленных билетах за этот раунд, следующая цена билета вырастет и будет примерно 22.20 DCR
     
  7. Courier

    Courier New Member

    Feb 19, 2016
    43
    1
    Male
    Блин... Да чтоб он провалился, этот пул! Цена билета сразу улетела в небеса! :(

    На каком именно? При ручной покупке адрес ведь нигде не указывается, да и при автоматической тоже. То есть, по идее, могут быть использованы все средства на кошельке.

    0.0.6 beta отсюда: https://github.com/decred/decred-release/releases/tag/v0.0.6

    Список всех адресов кошелька:
    Code:
    ./dcrctl --wallet getaddressesbyaccount default
    Для баланса тоже наверное что-то есть, поищи:
    Code:
    ./dcrctl --wallet -l
     
  8. Grumlin

    Grumlin New Member

    Feb 25, 2016
    43
    1
    Male
    а вы как разработчик не хотите своим коллегам подсказать исправить в вики и на пуле хотябы на 10....

    А что косаемо пула, на английском я ужасно общаюсь, поэтому могли бы Вы объяснить, что там за скрипт в пуле? где увидеть его код?
     
  9. negeroy

    negeroy Jr. Member
    Designer

    Jan 11, 2016
    63
    35
    Male
    я не разработчик, а код можно посмотреть на гитхабе, 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
    }
    
     
  10. Grumlin

    Grumlin New Member

    Feb 25, 2016
    43
    1
    Male
    я не про скрипт вычисления сложности, а про сткрипт который нужно экспортировать кошелек, чтобы майнить пос через пул, только там набор цифр откомпиленный, а я хочу код увидеть


    и ещё вопрос, какой процент берет пул?
     
  11. negeroy

    negeroy Jr. Member
    Designer

    Jan 11, 2016
    63
    35
    Male
    если скрипт который нужно экспортировать кошелек, чтобы майнить пос через пул то обещали выложить позже на гитхабе через неделю
     
  12. Beoga

    Beoga New Member

    Mar 2, 2016
    30
    0
    Не совсем понял, если билет Revoked то возвращается только цена билета, или какая-то награда все же добавляется?
     
  13. Dyrk

    Dyrk Sr. Member
    Developer

    Jan 7, 2016
    518
    376
    Male
    Wonderland
    Никакая награда не добавляется, возвращается цена билета за вычетом комиссии на транзакцию (то есть ты еще и теряешь на этом копейку)
    Вот смотри пример Revoked транзакции: https://mainnet.decred.org/tx/57d2087992532bbb49abb54d0e86d4942f6486021676491aa976222b4e81b414

    Как видишь там возвращают 2 DCR за билет, но на кошелек приходит 1.925 DCR, тк почему-то разрабы поставили высокую комиссию в 0.075 на эти транзакции.
     
  14. Courier

    Courier New Member

    Feb 19, 2016
    43
    1
    Male
    В результате активного PoS-майнинга число адресов моего кошелька увеличилось до ~1000 (по крайней мере такая цифра проскакивает при запуске dcrwallet). Об этом стоит беспокоиться? Это нормально, или можно/нужно объединить каким-то образом все средства на одном адресе?
     
  15. Beoga

    Beoga New Member

    Mar 2, 2016
    30
    0
    также интересно, что будет, если кошелек восстановить из первоначального seed - будут ли там новые адреса фигурировать? Или надо сохранять wallet.db?
     
  16. Courier

    Courier New Member

    Feb 19, 2016
    43
    1
    Male
    Тоже интересно. Как раз только что создал пост в соседней ветке (здесь вроде оффтоп).
     
  17. Artem

    Artem New Member

    Jan 1, 2016
    23
    1
    Male
    Russia
    Такой вопрос, комиссия за покупку билета после голосования возвращается на баланс или нет?
     
  18. negeroy

    negeroy Jr. Member
    Designer

    Jan 11, 2016
    63
    35
    Male
    нет, не возвращается
     
  19. Beoga

    Beoga New Member

    Mar 2, 2016
    30
    0
    Есть ли ограничение на максимальное количество билетов в пуле?
    Долго время их количество не превышало 43 тысяч, сейчас стало уже больше.
     
  20. Courier

    Courier New Member

    Feb 19, 2016
    43
    1
    Male
    Жестких ограничений нет. Есть "мягкий" предел в 42 тысячи (или около того, не помню точно), после которого быстро начинает расти цена билета. А дальше саморегуляция: больше билетов в пуле -> выше цена -> меньше покупателей -> меньше билетов в пуле.
     

Share This Page