Вернуться   Биткоин Форум > Разработка и Техническое Обсуждение
23 августа 2011, 11:28:32 PM   # 1
 
 
Сообщений: 35
Цитировать по имени
цитировать ответ
по умолчанию Re: Простой способ определить длину цепи блока

Взлом Биткоин адресов.
500 Биткоинов взломаны в "мозговом кошельке" с паролем "bitcoin is awesome"
Адрес кошелька: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
Приватный ключ: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e
подробнее...


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru
Мое понимание процедуры для определения официального блока цепи выглядит следующим образом:

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

Моя проблема возникает из расчета сложности. Сложность является текущим выбранным разделить на константу.

Не было бы проще и одинаково эффективны только сосчитать ведущие нули блока хэш и использовать его в качестве меры сложности?
Remmy сейчас офлайн Пожаловаться на Remmy   Ответить с цитированием Мультицитирование сообщения от Remmy Быстрый ответ на сообщение Remmy


Как заработать Биткоины?
Без вложений. Не майнинг.


23 августа 2011, 11:48:33 PM   # 2
 
 
Сообщения: 416
Цитировать по имени
цитировать ответ
по умолчанию Re: Простой способ определить длину цепи блока

Получил 1806 Биткоинов
Реальная история.





Не было бы проще и одинаково эффективны только сосчитать ведущие нули блока хэш и использовать его в качестве меры сложности?
Я полагаю, вы имеете в виду подсчета ведущих нулей в двоичном представлении.

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

Я считаю, что это цель, которая используется для определения цепи трудности, а не фактическое хэш, чтобы препятствовать некоторым весьма непрактичным атаки эксплуатируют особенно "везучий" блоки. Я считаю, что theymos рассматривал вопрос, если вы заботитесь искать через его история(!).

От main.h
Код:
    CBigNum GetBlockWork () Const
    {
        CBigNum bnTarget;
        bnTarget.SetCompact (Nbits);
        если (bnTarget <= 0)
            возвращать 0;
        Возвращение (CBigNum (1)<<256) / (bnTarget + 1);
    }

ByteCoin
ByteCoin сейчас офлайн Пожаловаться на ByteCoin   Ответить с цитированием Мультицитирование сообщения от ByteCoin Быстрый ответ на сообщение ByteCoin

24 августа 2011, 10:32:37 PM   # 3
 
 
Сообщений: 35
Цитировать по имени
цитировать ответ
по умолчанию Re: Простой способ определить длину цепи блока

Теперь я понимаю, что трудность обратно пропорциональна текущей цели. То, что я хотел бы знать, если существует метод расчета трудности без использования точки математики с плавающей, и то, что этот метод.
Remmy сейчас офлайн Пожаловаться на Remmy   Ответить с цитированием Мультицитирование сообщения от Remmy Быстрый ответ на сообщение Remmy

24 августа 2011, 11:07:11 PM   # 4
 
 
Сообщения: 1428
Цитировать по имени
цитировать ответ
по умолчанию Re: Простой способ определить длину цепи блока

котировка
То, что я хотел бы знать, если существует метод расчета трудности без использования точки математики с плавающей, и то, что этот метод.

Но трудность представляет собой число с плавающей точкой, так что я не знаю, как вы можете получить там, не делая математику с плавающей точкой. Самый простой способ я знаю, это просто то, что в исходном коде клиента: 

Код:
Защиту difficultyBits_to_float (б):
   я = binary_to_int (б)
   nShift = (я >> 24) & 0xff
   dDiff = поплавок (0x0000ffff) / поплавок (я & 0x00FFFFFF)
   в то время как nShift < 29:
      dDiff * = 256,0
      nShift + 1 =
   в то время как nShift > 29:
      dDiff / = 256,0
      nShift - = 1
   вернуться dDiff

Даже я не совсем понимаю, расчета, но я думаю, что это так же просто, как он получает, используя некоторую битовую математику (перешвартовки, бит и). Имейте в виду, что сложность обычно представляет собой 32-разрядное число, которое выглядит как 1DAABBCC. Первые 8 бит (1D) являются "nShift" выше, и последние 24 битов (AABBCC) способствуют числа dDiff. Похоже мне, что "nShift" является сырым количество нулевых байтов, необходимых на передней хэша (кратные восьми 0-бит), а остальные 24 бита дают вам поправочный коэффициент. Что-то вроде того...

Образом рассчитать самую длинную цепочку, чтобы начать с пулом неорганизованных блоков, доступом к хэшу. Я иду через все блоки один за одним, и следовать за ними вниз к блоку генеза (или первому блоку, который я уже вычисленным), следуя "предыдущая-хэш" поле, накапливая все трудности значения, как я иду. Когда я к "конец", Я иду обратно вверх по цепочке в том же порядке, и аккумулировать сложности-суммы назначая их к каждому блоку, как я иду. После этого, я просто найти блок с наивысшей суммой.   

Причина, почему я не могу просто начать в блоке генеза и подойдите, что "следующего хэш" первоначально не определен. А если блок цепь разветвляется в любом месте, вы на самом деле есть два "следующего хэш" значения, и вы не будете знать, какая ветвь следовать, не зная, самую длинную цепочку ... но это то, что мы пытаемся найти!

Но, конечно, вы будете нуждаться, что расчет сложности выше, чтобы заставить его работать.
etotheipi сейчас офлайн Пожаловаться на etotheipi   Ответить с цитированием Мультицитирование сообщения от etotheipi Быстрый ответ на сообщение etotheipi

25 августа 2011, 12:45:46 AM   # 5
 
 
Сообщений: 35
Цитировать по имени
цитировать ответ
по умолчанию Re: Простой способ определить длину цепи блока

32-битное число вы звоните сложность (1DAABBCC) на самом деле является сжатым представлением текущей цели, которая обратно пропорциональна сложности.

Расчет трудности не должно быть загадочными. Все, что вы делаете, чтобы получить это разделить константу (большое целое число) в зависимости от текущей цели (еще одно большое целое число). Константа:

0x00000000FFFF0000000000000000000000000000000000000000000000000000 = 0x1d00ffff в битах записи

Предположим, что текущая цель:

0x00000000000404CB000000000000000000000000000000000000000000000000 = 0x1b0404cb в битах записи

Результирующая трудность заключается в:

+16307,420938523983

Если вы выстраиваться число и падение нулей в общем, этот пример сводится к:

0xFFFF0000 / 0x000404CB или 4294901760/263371, которые вы можете ударить в калькуляторе, чтобы подтвердить.

Я немного обеспокоен тем, что в течение долгого времени, накопленная трудности будут заслонять нынешние трудности на несколько порядков.

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

Я интересно, если это вызовет проблемы, если мы застряли в целое подразделение по расчету сложности, и таким образом мы могли бы избежать проблем опрятно (с использованием bignums).
Remmy сейчас офлайн Пожаловаться на Remmy   Ответить с цитированием Мультицитирование сообщения от Remmy Быстрый ответ на сообщение Remmy

25 августа 2011, 1:04:46 AM   # 6
 
 
Сообщения: 416
Цитировать по имени
цитировать ответ
по умолчанию Re: Простой способ определить длину цепи блока

Я интересно, если это вызовет проблемы, если мы застряли в целое подразделение по расчету сложности, и таким образом мы могли бы избежать проблем опрятно (с использованием bignums).

В коде я цитировал в моем первом посте показывает, клиент использует фиксированную запятую bignum арифметик сравнить цепи уже.

ByteCoin
ByteCoin сейчас офлайн Пожаловаться на ByteCoin   Ответить с цитированием Мультицитирование сообщения от ByteCoin Быстрый ответ на сообщение ByteCoin

25 августа 2011, 1:25:49 AM   # 7
 
 
Сообщений: 35
Цитировать по имени
цитировать ответ
по умолчанию Re: Простой способ определить длину цепи блока

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

https://en.bitcoin.it/wiki/Difficulty


Код:
0x00000000FFFF0000000000000000000000000000000000000000000000000000 /
0x00000000000404CB000000000000000000000000000000000000000000000000
= +16307,420938523983
Remmy сейчас офлайн Пожаловаться на Remmy   Ответить с цитированием Мультицитирование сообщения от Remmy Быстрый ответ на сообщение Remmy

25 августа 2011, 2:24:17 AM   # 8
 
 
Сообщения: 416
Цитировать по имени
цитировать ответ
по умолчанию Re: Простой способ определить длину цепи блока

ByteCoin, извините за не замечая того, что в вашей цитате. Означает ли это, что расчет сложности показано в спецификации протокола в вики расходится от метода, используемого в клиенте?
В оригинальном посте, вы спрашиваете о расчете, который определяет действительный блок цепь.
Я считаю, что этот расчет приводит к значению называется bnChainWork вычисляется следующим образом в main.cpp
Код:
bnChainWork = (pindexNew->pprev? pindexNew->pprev->bnChainWork: 0) + pindexNew->GetBlockWork ();

Это, вероятно, стоит рассмотреть и нашли время, чтобы понять исходный код, я указал вам. Вы можете сказать нам себя, правильно ли вики и сообщить нам о взаимосвязи между трудностями и chainwork.

Это не для меня очевидно, что путь Satoshi о вычислении chainwork нельзя манипулировать, чтобы произвести некоторое нежелательное поведение.
Это было бы интересной областью для некоторых исследований.

Кроме того, это кажется немного расточительно сделать повторный bignum "обоюдный" расчет, когда аргумент изменяет только каждую пару тысяч блоков.

ByteCoin
ByteCoin сейчас офлайн Пожаловаться на ByteCoin   Ответить с цитированием Мультицитирование сообщения от ByteCoin Быстрый ответ на сообщение ByteCoin

25 августа 2011, 9:38:14 PM   # 9
 
 
Сообщений: 35
Цитировать по имени
цитировать ответ
по умолчанию Re: Простой способ определить длину цепи блока

Вот мой анализ GetBlockWork:

Текущий Codebase:
Код:
CBigNum GetBlockWork () Const
    {
        CBigNum bnTarget;

        // расширить значение битов для текущей цели
        bnTarget.SetCompact (Nbits);

        // если цель имеет отрицательное значение, возвращает неопределенное значение сложности (0)
        если (bnTarget <= 0)
            возвращать 0;

        // возврат (2 ^ 256) / (текущая цель + 1)
        Возвращение (CBigNum (1)<<256) / (bnTarget + 1);
    }

Оригинал Commit:
Код:
CBigNum GetBlockWork () Const
    {
        Возвращение (CBigNum (1)<<256) / (CBigNum () SetCompact (Nbits) +1).
    }

Документально максимум целевой вики 0xffff * 2 ^ 208, поэтому числитель должен быть CBigNum (0xFFFF) << 208; но это не должно вызывать никаких проблем, поскольку номер, используемый больше, чем документированная цель.

Программа возвращает 0, когда цель 0, вызываемая функция должна проверить возвращаемое значение и остановить Bitcoin сделок (система больше не может определить, кто контролирует 51% ресурсов сети, если цель 0).

Это делает добавление 1 к цели ненужной.

OpenSSL утверждает, что их bignums (из которой получены Bitcoin bignums) являются целыми числами только, так что дробный компонент отображается на вики игнорируется в клиенте.
Remmy сейчас офлайн Пожаловаться на Remmy   Ответить с цитированием Мультицитирование сообщения от Remmy Быстрый ответ на сообщение Remmy



Как заработать Биткоины?

Bitcoin Wallet * Portefeuille Bitcoin * Monedero Bitcoin * Carteira Bitcoin * Portafoglio Bitcoin * Bitcoin Cüzdan * 比特币钱包

bitcoin-zarabotat.ru
Почта для связи: bitcoin-zarabotat.ru@yandex.ru

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW