Python TypeError: Unicode-объекты должны быть закодированы перед хэшированием - PullRequest
0 голосов
/ 10 ноября 2018

Я посмотрел остальные 4 вопроса здесь, но все еще не могу понять, где поставить .encode() или .encode('utf-8'). Я прокомментировал это, чтобы показать различные места, которые я пробовал.

import hashlib as hasher

    class Block:
        def __init__(self, index, timestamp, data, previous_hash):
            self.index = index
            self.timestamp = timestamp
            self.data = data 
            self.previous_hash = previous_hash #these four items used to calculate crypHash of each block
            self.hash = self.hash_block() #helps ensure integrity throughout blockchain

        def hash_block(self):
            sha = hasher.sha256() #.encode('utf-8')
            sha.update(str(self.index)+
                str(self.timestamp)+
                str(self.data)+
                str(self.previous_hash)) #.encode() inside brackets
            return sha.hexdigest()

Вот трассировка (чтение снизу вверх):

Traceback (most recent call last):
  File "blockchain.py", line 7, in <module>
    blockchain = [create_genesis_block()]
  File "/media/nobu/win10Files/Blockchain/SnakeCoin/genesis.py", line 8, in create_genesis_block
    return Block(0, date.datetime.now(), "Genesis Block", "0")
  File "/media/nobu/win10Files/Blockchain/SnakeCoin/block.py", line 9, in __init__
    self.hash = self.hash_block() #helps ensure integrity throughout blockchain
  File "/media/nobu/win10Files/Blockchain/SnakeCoin/block.py", line 16, in hash_block
    str(self.previous_hash))
TypeError: Unicode-objects must be encoded before hashing

, который, кажется, указывает на то, что строка str(self.previous_hash)) #.encode() inside brackets должна быть str(self.previous_hash).encode()), но это дает мне еще одну ошибку:

Traceback (most recent call last):
  File "blockchain.py", line 7, in <module>
    blockchain = [create_genesis_block()]
  File "/media/nobu/win10Files/Blockchain/SnakeCoin/genesis.py", line 8, in create_genesis_block
    return Block(0, date.datetime.now(), "Genesis Block", "0")
  File "/media/nobu/win10Files/Blockchain/SnakeCoin/block.py", line 9, in __init__
    self.hash = self.hash_block() #helps ensure integrity throughout blockchain
  File "/media/nobu/win10Files/Blockchain/SnakeCoin/block.py", line 16, in hash_block
    str(self.previous_hash).encode())
TypeError: must be str, not bytes

Итак, я попробовал encode() и decode() в различных комбинациях с помощью скобок, но это только заставляет меня чередовать ошибки.
Таким образом, я довольно потерян и был бы признателен за некоторые указания. Кстати, этот код взят из статьи Medium здесь: Medium Snake Coin

1 Ответ

0 голосов
/ 10 ноября 2018

Только bytes строки могут быть хэшированы. str является строкой Unicode. Кодировать в байты, декодировать в Unicode.

В вашем .update() все четыре предмета конвертируются в str. Так что, как только вы объедините их вместе, .encode() все это к bytes:

import hashlib as hasher

class Block:
    def __init__(self, index, timestamp, data, previous_hash):
        self.index = index
        self.timestamp = timestamp
        self.data = data 
        self.previous_hash = previous_hash #these four items used to calculate crypHash of each block
        self.hash = self.hash_block() #helps ensure integrity throughout blockchain

    def hash_block(self):
        sha = hasher.sha256()
        to_hash = str(self.index) + str(self.timestamp) + str(self.data) + str(self.previous_hash)
        sha.update(to_hash.encode())
        return sha.hexdigest()
...