80 lines
2.9 KiB
Python
80 lines
2.9 KiB
Python
"""(Deprecated, use `solana.keypair` instead).
|
|
|
|
Account module to manage public-private key pair and signing messages.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from typing import List, Optional, Union
|
|
from warnings import warn
|
|
|
|
from based58 import b58encode
|
|
from nacl import public, signing # type: ignore
|
|
|
|
from solana.publickey import PublicKey
|
|
|
|
|
|
class Account:
|
|
"""(Deprecated) An account key pair (public and secret keys).
|
|
|
|
>>> # Import account from 64-byte keypair
|
|
>>> keypair = [
|
|
... 90, 249, 112, 214, 86, 235, 20, 215, 175, 33, 227, 50, 72, 214, 59, 49,
|
|
... 38, 161, 99, 83, 107, 188, 57, 48, 119, 189, 46, 148, 160, 214, 239, 148,
|
|
... 219, 250, 20, 106, 35, 41, 118, 107, 89, 96, 195, 15, 153, 248, 223, 6,
|
|
... 46, 71, 142, 92, 169, 240, 177, 106, 86, 194, 21, 62, 29, 222, 206, 82]
|
|
>>> account = Account(keypair[:32])
|
|
>>> account.public_key()
|
|
4HtxMbEK1QYzo9KjXEZoDeGrkhYkDtWdiQUARxz5VCoW
|
|
"""
|
|
|
|
def __init__(self, secret_key: Optional[Union[bytes, str, List[int], int]] = None):
|
|
"""Create a new Account object.
|
|
|
|
:pararm secret_key: Secret key for the account.
|
|
"""
|
|
warn("solana.account.Account is deprecated, please use solana.keypair.KeyPair", category=DeprecationWarning)
|
|
key: Optional[bytes] = None
|
|
if isinstance(secret_key, int):
|
|
key = bytes(PublicKey(secret_key))
|
|
if isinstance(secret_key, list):
|
|
key = bytes(secret_key)
|
|
elif isinstance(secret_key, str):
|
|
key = bytes(secret_key, encoding="utf-8")
|
|
elif isinstance(secret_key, bytes):
|
|
key = secret_key
|
|
|
|
self._secret = public.PrivateKey(key) if key else public.PrivateKey.generate()
|
|
|
|
def public_key(self) -> PublicKey:
|
|
"""The public key for this account."""
|
|
verify_key = signing.SigningKey(self.secret_key()).verify_key
|
|
return PublicKey(bytes(verify_key))
|
|
|
|
def secret_key(self) -> bytes:
|
|
"""The **Unencrypted** secret key for this account."""
|
|
return bytes(self._secret)
|
|
|
|
def keypair(self) -> bytes:
|
|
"""The 64 byte keypair for this account (base 58 encoded)."""
|
|
return b58encode(self.secret_key() + bytes(signing.SigningKey(self.secret_key()).verify_key))
|
|
|
|
def sign(self, msg: bytes) -> signing.SignedMessage:
|
|
"""Sign a message with this account.
|
|
|
|
Args:
|
|
|
|
msg: message to sign.
|
|
|
|
Returns:
|
|
A signed message object.
|
|
|
|
>>> secret_key = bytes([1] * 32)
|
|
>>> acc = Account(secret_key)
|
|
>>> msg = b"hello"
|
|
>>> signed_msg = acc.sign(msg)
|
|
>>> signed_msg.signature.hex()
|
|
'e1430c6ebd0d53573b5c803452174f8991ef5955e0906a09e8fdc7310459e9c82a402526748c3431fe7f0e5faafbf7e703234789734063ee42be17af16438d08'
|
|
>>> signed_msg.message.decode('utf-8')
|
|
'hello'
|
|
""" # pylint: disable=line-too-long
|
|
return signing.SigningKey(self.secret_key()).sign(msg)
|