Creating an identity
As we have covered digital signatures and the public-private key in the previous chapter, we are already aware of the properties and security of digital signatures. To recap, they provide a way for a node that possesses the private key to sign a message to prove their identity. This can then be verified by anyone who has access to the distributed public key.
An identity is created by generating a public-private key pair. This is similar to creating an account in the blockchain network. The following code shows how a public-private key pair is generated by the ecdsa Python package using an elliptic curve:
import binascii from ecdsa import SigningKey, VerifyingKey, SECP256k1, keys class Wallet: def __init__(self): self.private_key = None self.public_key = None def generate_key_pair(self): sk = SigningKey.generate(curve=SECP256k1) self.private_key = binascii.b2a_hex(sk.to_string()).decode() self.public_key =
binascii.b2a_hex(sk.get_verifying_key().to_string()).decode()
The key pair is generated using a special elliptic curve, secp256k1, which is also used in Bitcoin's digital signature generation. The following lines of code will create a public-private key pair:
account = Wallet() account.generate_key_pair() print("Generated public key: %s" % account.public_key)
print("Generated private key: %s" % account.private_key)
A 64-character (256-bit) private key and a 128-character public key are generated in hexadecimal format as follows:
Generated public key:
b7f5edffe6d3532ed743e07c4de5551c2d7476a4053221999ce40edec2607bb4ef
7ecb9fc6ecf735fd3802fada56c42e18474f8bad269a965f95863f9fc38158 Generated private key:
6eb9035be1dabd01fadcb6a9f92946decc868046184c7810a43806eb6cc46237
The private key is always kept secret, and the public key is used to generate the public address of the user and is then embedded in the transaction.