教材
www.udemy.com
Blockの構成要素
- previous hash
- transactions
- nonce
- timestamp
Proof of Work
- previous hash+transactions+nonceでhashを求め、mining difficultyと一致するnonceを求める。
- nonceは0...nでインクリメントしていく
- mining difficultyはおおよそ10分で計算完了程度に調整される
Mining
- 自アドレスへのmining award分のtransactionを含めたProof of Workを行い、新規Blockの作成を試みる。
Private keyとPublic key
- ECDSA(curve=NIST256p)を使用して作成(bitcoin)
Blockchain addressの作成
- Creating a public key with ECDSA
- SHA-256 for the public key
- Ripemd160 for the SHA-256
- Add network byte
- Double SHA-256
- Get checksum
- Concatenate public key and checksum
- Encoding the key with Base58
Transactionの署名
- transaction
- sender private key
を使用してsignatureを作成
sha256 = hashlib.sha256()
sha256.update(str(transaction).encode('utf-8'))
message = sha256.digest()
private_key = SigningKey.from_string(bytes().fromhex(self.sender_private_key), curve=NIST256p)
private_key_sign = private_key.sign(message)
signature = private_key_sign.hex()
Transactionの認証
- transaction
- sender public key
- signature
を使用してtransactionを認証
sha256 = hashlib.sha256()
sha256.update(str(transaction).encode('utf-8'))
message = sha256.digest()
signature_bytes = bytes().fromhex(signature)
verifying_key = VerifyingKey.from_string(bytes().fromhex(sender_public_key), curve=NIST256p)
verified_key = verifying_key.verify(signature_bytes, message)