Я пытаюсь реализовать простую криптовалютность, похожую на биткойн, чтобы просто понять ее до уровня кода.Как мы можем доказать, что биткойн-блок всегда разрешима?
Я понимаю, что биткойн-блок содержит хэш предыдущего блока, много транзакций и транзакцию вознаграждения для решателя.
майнер в основном запускает 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++, я не знаю, какое целое может гарантировать решение.
Я не уверен, что я понимаю ваш вопрос, но смещение в выходе криптографических хэшей настолько невелико, что для практических целей оно незначительно. Таким образом, вы можете учесть, что существует 50% вероятность того, что любой бит криптографического хэша равен 0. Есть 25% вероятность, что первые 2 бита равны нулю, вероятность 12,5% первых 3 бита равна нулю и т. Д. «Блок» не Вещество: вероятности не меняются. Что касается использования 64-битного целого числа, я не вижу, как это можно было бы увидеть, если я не ошибаюсь, проблема биткойнов, поскольку я пишу это, уже требует больше, чем 64 первых бита, чтобы быть всеми нулями ... – TacticalCoder
Спасибо за ваш ответ , Что касается целого числа, я не спрашиваю о хэш-результате (да, он больше 64 бит).Я говорил о вводе хэш-функции (которая является блоком плюс случайное число). –
Это отличный вопрос. Насколько я понимаю, вы спрашиваете: «Можно ли доказать, что всегда есть nonce, что приведет к хешу ≤ сложности?» – Geremia