2014-10-21 1 views
2

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

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

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

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

Теперь, предположим, что блок действительно всегда разрешимый, могу ли я предположить, что для 64-разрядного случайного целого достаточно решить его? как насчет 32bit? или мне нужно использовать бесконечное целое число бит?

, например, в проекте basiccoin:

код для доказательства работы состоит в следующем:

def POW(block, hashes): 
    halfHash = tools.det_hash(block) 
    block[u'nonce'] = random.randint(0, 10000000000000000000000000000000000000000) 
    count = 0 
    while tools.det_hash({u'nonce': block['nonce'], 
          u'halfHash': halfHash}) > block['target']: 
     count += 1 
     block[u'nonce'] += 1 
     if count > hashes: 
      return {'error': False} 
     if restart_signal.is_set(): 
      restart_signal.clear() 
      return {'solution_found': True} 
     ''' for testing sudden loss in hashpower from miners. 
     if block[u'length']>150: 
     else: time.sleep(0.01) 
     ''' 
    return block 

этот код Randoms число в диапазоне от [0, 10000000000000000000000000000000000000000] в качестве начальной точки, и то он просто увеличивает значение один за другим:

block[u'nonce'] += 1 

Я не питон программист, я не знаю, как питон обрабатывает тип целого числа. нет обработки переполнения целых чисел.

Я пытаюсь реализовать подобную вещь с помощью C++, я не знаю, какое целое может гарантировать решение.

+1

Я не уверен, что я понимаю ваш вопрос, но смещение в выходе криптографических хэшей настолько невелико, что для практических целей оно незначительно. Таким образом, вы можете учесть, что существует 50% вероятность того, что любой бит криптографического хэша равен 0. Есть 25% вероятность, что первые 2 бита равны нулю, вероятность 12,5% первых 3 бита равна нулю и т. Д. «Блок» не Вещество: вероятности не меняются. Что касается использования 64-битного целого числа, я не вижу, как это можно было бы увидеть, если я не ошибаюсь, проблема биткойнов, поскольку я пишу это, уже требует больше, чем 64 первых бита, чтобы быть всеми нулями ... – TacticalCoder

+0

Спасибо за ваш ответ , Что касается целого числа, я не спрашиваю о хэш-результате (да, он больше 64 бит).Я говорил о вводе хэш-функции (которая является блоком плюс случайное число). –

+0

Это отличный вопрос. Насколько я понимаю, вы спрашиваете: «Можно ли доказать, что всегда есть nonce, что приведет к хешу ≤ сложности?» – Geremia

ответ

0

, но как вы можете доказать, что распределение решений блока равномерное (равномерное), чтобы вы действительно могли покрыть все результаты хэша?

SHA256 является детерминированным, поэтому, если вы перефразируете txns, он всегда будет обеспечивать 256 хэш. Клиентские узлы сохраняют все txn и хеши в дереве merkle для сетевых клиентов для распространения и проверки самой длинной возможной цепочки блоков.

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