Практикум — шаг 2: криптография
Блокчейн фиксирует что произошло; криптография доказывает кто это инициировал. Добавляем подписи переводов и шифрование секрета в покое.
Библиотека: cryptography (обёртка над OpenSSL).
Пара ключей Ed25519
Для учебного проекта выбран Ed25519 (короткие ключи, быстрые подписи). В Bitcoin — ECDSA/secp256k1; идея та же: приватный ключ подписывает, публичный проверяет.
@dataclass(frozen=True)
class KeyPair:
private_key: Ed25519PrivateKey
public_key: Ed25519PublicKey
@classmethod
def generate(cls) -> KeyPair:
private_key = Ed25519PrivateKey.generate()
return cls(private_key=private_key, public_key=private_key.public_key())
def public_hex(self) -> str:
raw = self.public_key.public_bytes(
encoding=serialization.Encoding.Raw,
format=serialization.PublicFormat.Raw,
)
return raw.hex()
Адрес кошелька в практикуме — hex публичного ключа (в mainnet адреса строятся иначе, через хеши и префиксы сети).
Подпись перевода
Транзакция — структура с полями sender, recipient, asset, amount, nonce. Подписываем канонический JSON без поля signature:
def payload_dict(self) -> dict[str, Any]:
return {
"type": "transfer",
"sender": self.sender,
"recipient": self.recipient,
"asset": self.asset,
"amount": self.amount,
"nonce": self.nonce,
}
def sign(self, keys: KeyPair) -> None:
message = canonical_json(self.payload_dict()).encode("utf-8")
sig = keys.sign(message)
self.signature_b64 = base64.b64encode(sig).decode("ascii")
Зачем nonce: защита от повторного воспроизведения (replay). Каждый успешный перевод увеличивает счётчик отправителя — как sequence в Ethereum.
Проверка на узле:
def verify_signature(self) -> bool:
public_key = public_key_from_hex(self.sender)
message = canonical_json(self.payload_dict()).encode("utf-8")
signature = base64.b64decode(self.signature_b64.encode("ascii"))
return verify_ed25519(public_key, message, signature)
Глубже про PKI, TLS и хранение секретов — информационная безопасность.
Симметричное шифрование ключа (vault)
Приватный ключ нельзя хранить в открытом виде на диске. Учебный vault:
- PBKDF2-HMAC-SHA256 (200 000 итераций) из пароля пользователя.
- AES-GCM для шифрования PEM приватного ключа.
- В blob сохраняются
salt,nonce,ciphertext.
def encrypt_private_key_pem(private_key: Ed25519PrivateKey, password: str) -> str:
salt = os.urandom(16)
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32, salt=salt, iterations=200_000)
key = kdf.derive(password.encode("utf-8"))
aesgcm = AESGCM(key)
nonce = os.urandom(12)
pem = private_key.private_bytes(...)
ciphertext = aesgcm.encrypt(nonce, pem, None)
return base64.urlsafe_b64encode(salt + nonce + ciphertext).decode("ascii")
| Практика | В продакшене |
|---|---|
| Пароль в CLI | HSM, KMS (AWS CloudHSM, Vault) |
| Файл blob на диске | Аппаратный токен, MPC-кошельки |
| Один алгоритм | Ротация ключей, политики доступа |
Практическое задание
- Сгенерируйте
KeyPair, подпишите строкуb"test", измените один байт сообщения — убедитесь, чтоverifyвозвращаетFalse. - Зашифруйте PEM с паролем
demo, расшифруйте, сравните публичные ключи. - Добавьте в
tests/test_ledger.pyтест на подпись и расшифровку vault (пример — в шаге 4).
Что дальше
Шаг 3 — ledger, балансы и mempool: как подписанные переводы попадают в блок.
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Блокчейн как распределённый реестр, криптовалюты, транзакции, токены, смарт-контракты и NFT — вводная глава для новичков с примерами кода и интерактивом. Пошаговый практикум: учебное приложение Crypto Ledger Lab — блокчейн, подписи, переводы активов и compliance на Python. Ledger Lab, шаг 1: структура блока, SHA-256, связь previous_hash и учебный proof-of-work. Ledger Lab, шаг 3: балансы активов, mempool, применение переводов и симуляция spot-операции. Ledger Lab, шаг 4: KYC-уровни, лимиты, sanctions, журнал аудита, pytest и идеи развития проекта. Цифровые и криптовалюты, история до Bitcoin, волатильность и практика — продолжение вводной главы о блокчейне. Краткие итоги раздела "Блокчейн, криптовалюты и NFT" и практикума Ledger Lab. Чек-лист раздела Блокчейн, криптовалюты и NFT — вопросы для самопроверки в энциклопедии Вселенная IT.Блокчейн, крипта и NFT
Практикум Ledger Lab
Практикум 1 — блокчейн
Практикум 3 — ledger
Практикум 4 — compliance
Криптовалюты
Итоги
Чек-лист самопроверки