PoW実装
def proof_of_work(self, last_block): """ Simple Proof of Work Algorithm: - Find a number p' such that hash(pp') contains leading 4 zeroes - Where p is the previous proof, and p' is the new proof :param last_block: <dict> last Block :return: <int> """ last_proof = last_block['proof'] last_hash = self.hash(last_block) proof = 0 while self.valid_proof(last_proof, proof, last_hash) is False: proof += 1 return proof @staticmethod def valid_proof(last_proof, proof, last_hash): """ Validates the Proof :param last_proof: <int> Previous Proof :param proof: <int> Current Proof :param last_hash: <str> The hash of the Previous Block :return: <bool> True if correct, False if not. """ guess = f'{last_proof}{proof}{last_hash}'.encode() guess_hash = hashlib.sha256(guess).hexdigest() return guess_hash[:4] == "0000"sha-256はビットコインに採用されているハッシュ関数で、
可変長のデータを256bitのハッシュ値に変換ハッシュ値の先頭に続く0の数で、一定値(閾値)との大きさを比較します。
マイニングは約10分で完了するように難度が設定されています。
マイニングがおおよそ10分で完了するように先頭の0の数を調整する。
このマイニングの難度のことを、 difficultyと呼びます。
- nonce = 0 としてブロックを作成する。
- ブロックをJSON形式の文字列に変換する。
- sha-256関数を用いてハッシュ値を計算する。
- ハッシュ値がある一定値(閾値)より小さくなればそのnonceを採用する。
- ハッシュ値が一定値を上回った場合、nonceの値に1をプラスして、2.以降の手順を繰り返す。