LINUX.ORG.RU

Proof_of_Work блокчейн

 


0

1

Как в питоне реализовать самый простой алгоритм Proof_of_Work?

def get_hash(filename):
    # Указываем имя файла для чтения, с указанием папки
    file = open(blockchain_dir + filename, 'rb').read()
    return hashlib.sha256(file).hexdigest()

Прошу дополнить эту функцию, чтобы она выполняла поставленную задачу

Тебе нужно два репетитора:

  • по блокчейну
  • по питону

Всё что тебе советуют дельного, пролетает насквозь не задерживаясь. А теперь ты ещё и по-мудацки вести себя начал. Нехорошо.

vvn_black ★★★★★ ()
Ответ на: комментарий от lil_rainnn

Потому что они долго упорно и нудно учились. И готовы помогать тем, кто готов также учиться.

У тебя же спросили, что ты под Proof_of_Work подразумеваешь, а ты в ответ «Я просто прошу помочь написать код. Не надо мне говорить, что я должен понять!».

Как тебе помочь, если непонятно что ты пытаешься сделать.

vvn_black ★★★★★ ()
Ответ на: комментарий от lil_rainnn

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

А неужели непонятно, что я под тим подразумеваю?

Совершенно непонятно. Proof_of_Work - это принцип, а не алгоритм.

vvn_black ★★★★★ ()
Ответ на: комментарий от lil_rainnn

Вот ты говоришь

POW

и считаешь это каким-то «блоком» который просто нужно добавить. Но это не просто блок, а как минимум два блока (для расчета nonce и проверки) и несколько проводов исходящих из них. Эти провода должны пристыковаться к проводам исходящим из той балалайки, которую ты пишешь. Потому тебе и задают вопросы.

Вот что такое PoW (тот который в биткоине, я не знаю какой из них самый простой): майнер взял транзакции о которых он знает, добавил туда хеш предыдущего блока, временную метку и еще один битовый массив (или число), так называемый nonce, nonce можно выбирать произвольно. Считает от этого всего хеш, интерпретирует его как число (256 битное) и сравнивает с целевым значением. Если получилось меньше, то он красавчик, может публиковать блок. Если получилось больше, то нужно выбрать другой nonce. Процедура продолжается пока не получится меньше. То есть там у тебя должен быть цикл поиска nonce. Вот это вот и есть PoW. Целевое значение задает сложность, если оно имеет вид 0xfff…fff то это легче всего, почти любое число будет меньше его, и nonce подбирается за один раз. Если же целевое значение имеет вид 0x000…0001, то это сложнее всего, потому что единственное меньшее, это 0, а чтобы получить такой хеш нужно очень долго подбирать nonce. Если же целевое значение 0x7ff..fff, то примерно половина чисел меньше его и nonce подберется и вероятностью 50% с первого раза.

vlad9486 ()
Последнее исправление: vlad9486 (всего исправлений: 2)
Ответ на: комментарий от lil_rainnn

Вот ты объясни, почему программисты такие зазнавшиеся люди?

А неужели непонятно, что я под тим подразумеваю?

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

slovazap ★★★★★ ()
Ответ на: комментарий от vvn_black

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

anonymous ()

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

Тут можно посоветовать только засесть за книжки. Или нанять кого-то, если совсем дедлайн и жёстко спросят

anonymous ()

Прошу дополнить эту функцию, чтобы она выполняла поставленную задачу

нифига себе, в приличном обществе даже пмы в джире ставят задачи не с таким напором.

inb4 «в приличном обществе», «пм», «джира» - взаимоисключающие параграфы, да, да

cdshines ★★★★ ()

Лопушок, PoW подразумевает поиск загадки по нонсенсу (отгадке) на требуемую сложность (длину битов), поэтому уже вызов функции нужно менять:

def get_puzzle(filename, aim, res_mask=0b111111111):
  res = None
  file = open(blockchain_dir + filename, 'rb').read()
  for i in range(1000000000000000):
    noncence = str(i) 
    aim_pretender = hashlib.sha256(file+noncence).hexdigest()
    if (aim_pretender & res_mask)=(aim & res_mask):
      res = noncence
      break
  return res

Как-то так, но перебор конечно должен быть сложнее.

Novator ★★★★ ()