Я пытаюсь реализовать простую криптовалюту, похожую на биткойн, просто чтобы понять ее на уровне кода.
Я понимаю, что биткойн-блок содержит хэш предыдущего блока, множество транзакций и транзакцию вознаграждения для решателя.
майнер в основном запускает SHA256 на этом блоке-кандидате в сочетании со случайным числом. Пока первые определенные цифры хэш-результата равны нулю, мы говорим, что этот блок решен, и мы транслируем результат по всей сети, чтобы получить вознаграждение.
но я никогда не видел, чтобы кто-нибудь доказывал, что блок вообще разрешим. Я думаю, это гарантируется SHA256? поскольку размер решения фиксирован, после достаточного количества входных данных вы гарантированно попадете в каждый результат хеширования? но как вы можете доказать, что распределение решений в блоке является четным (равномерным), чтобы вы действительно могли охватить все результаты хеширования?
теперь предположим, что блок действительно всегда разрешим, могу ли я предположить, что для его решения достаточно использования 64-битного случайного целого числа? как насчет 32бит? или я должен использовать бесконечное целое число?
например, в проекте 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
этот код рандомизирует число между [0, 1000000000000000000000000000000000000000000] в качестве начальной точки, а затем просто увеличивает значение одно за другим:
block[u'nonce'] += 1
Я не программист на Python, я не знаю, как Python обрабатывает тип целого числа. нет обработки целочисленного переполнения.
Я пытаюсь реализовать аналогичную вещь с С++, я не знаю, какое целое число может гарантировать решение.