Versio 2.0 on Python-paketin ensimmäinen vakaa julkaisu. 2.0-siirtymäopas käsittelee allekirjoitusmuodot, jotka paketti jakaa Rustin ja TypeScriptin kanssa.
Asennus
Asenna peruspaketti sekä yksi lisäosa jokaista sellaista taustajärjestelmää kohden, joka tarvitsee palveluntarjoajan riippuvuuden:
pip install solana-keychain # memory, vault and parapip install 'solana-keychain[aws-kms]' # AWS KMS (boto3)pip install 'solana-keychain[gcp-kms]' # GCP KMS (google-cloud-kms)pip install 'solana-keychain[privy]' # Privypip install 'solana-keychain[turnkey]' # Turnkeypip install 'solana-keychain[fireblocks]' # Fireblockspip install 'solana-keychain[cdp]' # Coinbase Developer Platformpip install 'solana-keychain[crossmint]' # Crossmintpip install 'solana-keychain[dfns]' # Dfnspip install 'solana-keychain[openfort]' # Openfortpip install 'solana-keychain[utila]' # Utilapip install 'solana-keychain[fordefi]' # Fordefi# Several at oncepip install 'solana-keychain[aws-kms,privy]'
Vaatii Python 3.10:n tai uudemman. Transaktiot ovat
solders-kirjaston VersionedTransaction-olioita;
legacy-, v0- ja v1-viestit hyväksytään kaikki, paitsi Fireblocksissa
arvolla use_program_call=True, jolloin hyväksytään vain legacy ja v0.
Memory, Vault ja Para ovat tuotavissa paketin juuresta. Jokainen muu taustajärjestelmä
tuodaan omasta alimoduulistaan (esimerkiksi solana_keychain.aws_kms), ja
ilman lisäosaa tuominen aiheuttaa ImportError-virheen, joka kertoo asennettavan
lisäosan nimen. Ledger on vain Rustille.
Peruskäyttö
Jokaisella taustajärjestelmällä on konfiguraation dataclass ja asynkroninen create_<backend>_signer-
tehdasfunktio, joka palauttaa käyttövalmiin allekirjoittajan. Kaikki allekirjoitusmetodit ovat korutiineja:
import asynciofrom solana_keychain import MemorySignerfrom solders.transaction import VersionedTransactionasync def sign(transaction: VersionedTransaction) -> str:signer = MemorySigner.from_private_key_file("/path/to/id.json")print("Signing with:", signer.pubkey)# Check availability (useful for remote signers)if not await signer.is_available():raise RuntimeError("Signer offline")result = await signer.sign_transaction(transaction)print("Signature:", result.signature)print("Fully signed:", result.is_complete)return result.encoded_transaction # base64 wire transaction
sign_transaction palauttaa SignedTransaction-olion, jonka kentät ovat encoded_transaction,
signature, is_complete ja transaction. transaction on ratkaiseva
allekirjoitettu transaktio: jatka siitä, varsinkin muokkaavan allekirjoittajan kanssa, jonka
tulos on eri olio kuin se, jonka välitit sisään.
Yhtenäinen tehdasfunktio
create_keychain_signer ottaa vastaan taustajärjestelmän nimen ja kyseisen taustajärjestelmän konfiguraation
dataclassin, ja tuo taustajärjestelmän laiskasti, joten vain käyttämäsi lisäosat on
asennettava:
from solana_keychain import create_keychain_signerfrom solana_keychain.privy import PrivySignerConfigsigner = await create_keychain_signer("privy",PrivySignerConfig(app_id="your-app-id",app_secret="your-app-secret",wallet_id="your-wallet-id",),)
Nimet on lueteltu SUPPORTED_BACKENDS-muuttujassa: aws-kms, cdp, crossmint,
dfns, fireblocks, fordefi, gcp-kms, memory, openfort, para,
privy, turnkey, utila ja vault. Tuntematon nimi tai väärän luokan
konfiguraatio aiheuttaa SignerError-virheen koodilla SignerErrorCode.CONFIG_ERROR. Tehdasfunktion
palautustyypiksi on määritetty kantaluokka SolanaSigner, joten rajaa tyyppiä
isinstance-tarkistuksella ennen allekirjoitusta (katso Allekirjoittajan ominaisuudet).
Etä-HTTP-asiakkaat
Etä-HTTP-taustajärjestelmät hyväksyvät valinnaisen http_client-parametrin (httpx.AsyncClient)
mukautettua TLS:ää tai välityspalvelimia varten. Jos sitä ei ole asetettu, jokainen pyyntö käyttää kertakäyttöistä asiakasta,
jonka aikakatkaisu on 60 sekuntia, perus-URL:ssä pakotetaan HTTPS ja uudelleenohjaukset
hylätään.
Allekirjoittajan ominaisuudet
Jokainen taustajärjestelmä periytyy SolanaSigner-ABC:stä (pubkey, sign_message,
is_available) ja lisäksi täsmälleen yhdestä ominaisuusluokasta:
TransactionSigner:sign_transaction(tx)allekirjoittaa transaktiosi paikallaan ja palauttaaSignedTransaction-olion. Lähetät sen itse verkkoon.ModifyingSigner:modify_and_sign_transaction(tx)antaa palveluntarjoajan kirjoittaa transaktion uudelleen ja allekirjoittaa sen lähettämättä sitä verkkoon. Oliosi jää koskemattomaksi; jatka palautetustaSignedTransaction.transaction-oliosta.SendingSigner:sign_and_send_transaction(tx)allekirjoittaa ja lähettää verkkoon palveluntarjoajan kautta ja palauttaa perille päätyneen transaktionSignature-olion. Transaktiotasi ei koskaan muokata.
| Taustajärjestelmä | Ominaisuusluokka | sign_message |
|---|---|---|
| memory, vault, privy, turnkey, aws-kms, fireblocks, gcp-kms, dfns, para, openfort | TransactionSigner | Kyllä |
| cdp | TransactionSigner | Vain UTF-8-sisältö, muuten SERIALIZATION_ERROR |
| utila | TransactionSigner | Aiheuttaa SIGNING_FAILED-virheen |
fordefi black box (FordefiBlackBoxSigner) | TransactionSigner | Kyllä |
fordefi native manual (FordefiNativeManualSigner) | ModifyingSigner | Kyllä |
fordefi native auto (FordefiNativeAutoSigner) | SendingSigner | Kyllä |
| crossmint | SendingSigner | Aiheuttaa SIGNING_FAILED-virheen |
Rajaa tyyppiä isinstance-tarkistuksella. Kaikki ominaisuusluokat exportataan paketin
juuresta:
from solana_keychain import ModifyingSigner, SendingSigner, TransactionSignerif isinstance(signer, SendingSigner):signature = await signer.sign_and_send_transaction(transaction)elif isinstance(signer, ModifyingSigner):result = await signer.modify_and_sign_transaction(transaction)elif isinstance(signer, TransactionSigner):result = await signer.sign_transaction(transaction)
Alustus
create_*-tehdasfunktiot ja create_keychain_signer hoitavat tarvittavan alustuksen
puolestasi. Jos luot Privy-, Fireblocks-, Dfns-, Crossmint-, Para-, Openfort- tai
Utila-allekirjoittajaluokan suoraan, suorita await signer.init() ennen käyttöä. Siihen asti
pubkey ja jokainen allekirjoituskutsu aiheuttavat SignerErrorCode.NOT_INITIALIZED-virheen.
Taustajärjestelmän konfigurointi
Memory
Luo Solana CLI:n keypair-tiedostosta, base58- tai "[1,2,...]"-merkkijonosta, raakatavuista
tai solders-kirjaston Keypair-oliosta:
from solana_keychain import MemorySigner, MemorySignerConfig, create_memory_signerfrom solders.keypair import Keypairsigner = MemorySigner.from_private_key_file("/path/to/id.json")signer = MemorySigner.from_private_key_string("base58_private_key")signer = MemorySigner.from_bytes(secret_key_bytes) # 64 or 32 bytessigner = await create_memory_signer(MemorySignerConfig(keypair=Keypair()))
Avain sijaitsee prosessin muistissa, eikä Python pysty nollaamaan sitä. Käytä tätä taustajärjestelmää kehitykseen ja testaukseen.
HashiCorp Vault
Avaimen on oltava ed25519-avain transit-moottorissa. Pelkkä HTTP hyväksytään
vain loopback-osoitteelle, komentoa vault server -dev varten:
from solana_keychain import VaultSignerConfig, create_vault_signersigner = await create_vault_signer(VaultSignerConfig(api_base_url="https://vault.example.com:8200",token="hvs.xxxxx",key_name="my-solana-key",public_key="base58_public_key",))
AWS KMS
key_id on ECC_NIST_EDWARDS25519-avaimen avaintunnus, ARN tai alias. Välitä
valmiiksi luotu boto3 KMS -client mukautettuja tunnistetietoja tai päätepisteitä varten; region jätetään
silloin huomiotta:
from solana_keychain.aws_kms import AwsKmsSignerConfig, create_aws_kms_signersigner = await create_aws_kms_signer(AwsKmsSignerConfig(key_id="alias/my-solana-key",public_key="base58_public_key",region="us-east-1", # optional, defaults to the AWS config chain))
GCP KMS
Avainversion on oltava EC_SIGN_ED25519-avain. client voi valinnaisesti ottaa vastaan
valmiiksi luodun KeyManagementServiceAsyncClient-olion:
from solana_keychain.gcp_kms import GcpKmsSignerConfig, create_gcp_kms_signersigner = await create_gcp_kms_signer(GcpKmsSignerConfig(key_name="projects/my-project/locations/us-east1/keyRings/my-ring/cryptoKeys/my-key/cryptoKeyVersions/1",public_key="base58_public_key",))
Privy
from solana_keychain.privy import PrivySignerConfig, create_privy_signersigner = await create_privy_signer(PrivySignerConfig(app_id="app_id",app_secret="app_secret",wallet_id="wallet_id",))
Valtuutusavaimella suojatut lompakot saavat PrivyAuthorizationConfig-olion
authorization_context-parametrina.
Turnkey
from solana_keychain.turnkey import TurnkeySignerConfig, create_turnkey_signersigner = await create_turnkey_signer(TurnkeySignerConfig(api_public_key="api_public_key", # hex P-256api_private_key="api_private_key", # hex P-256organization_id="org_id",private_key_id="private_key_id",public_key="base58_public_key",))
Fireblocks
from solana_keychain.fireblocks import FireblocksSignerConfig, create_fireblocks_signersigner = await create_fireblocks_signer(FireblocksSignerConfig(api_key="api_key",private_key_pem="-----BEGIN RSA PRIVATE KEY-----\n...",vault_account_id="0",asset_id="SOL", # or "SOL_TEST" for devnet))
use_program_call=True allekirjoittaa PROGRAM_CALL-operaatiolla RAW:n sijaan. Se
lähetetään vain allekirjoitettavaksi, joten Fireblocks ei muokkaa eikä lähetä
transaktiota verkkoon, vaan lähetät sen tavalliseen tapaan. Se vaatii hot wallet -lompakon ja Fireblocksin on
otettava se käyttöön työtilassasi.
CDP (Coinbase Developer Platform)
from solana_keychain.cdp import CdpSignerConfig, create_cdp_signersigner = await create_cdp_signer(CdpSignerConfig(api_key_id="api_key_id",api_key_secret="api_key_secret",wallet_secret="wallet_secret",address="base58_address",network="solana", # or "solana-devnet"; required for address lookup tables))
Crossmint
from solana_keychain.crossmint import CrossmintSignerConfig, create_crossmint_signersigner = await create_crossmint_signer(CrossmintSignerConfig(api_key="api_key",wallet_locator="wallet_locator",))signature = await signer.sign_and_send_transaction(transaction)
Crossmint on vain lähettävä. Sen API suorittaa hyväksytyn transaktion aina
palvelinpuolella ja sponsoroi gasin, joten CrossmintSigner on SendingSigner ja
sign_message aiheuttaa SIGNING_FAILED-virheen. Palautettu allekirjoitus tunnistaa
Crossmintin perille saaman transaktion, joka voi poiketa omastasi. Asetus
signer_secret (xmsk1_...-muotoinen delegoidun allekirjoittajan salaisuus) hyväksyy transaktiot
automaattisesti, mikä delegoi hyväksyttävien asioiden valinnan Crossmintille.
Dfns
from solana_keychain.dfns import DfnsSignerConfig, create_dfns_signersigner = await create_dfns_signer(DfnsSignerConfig(auth_token="auth_token",cred_id="cred_id",private_key_pem="-----BEGIN EC PRIVATE KEY-----\n...",wallet_id="wallet_id",))
Openfort
from solana_keychain.openfort import OpenfortSignerConfig, create_openfort_signersigner = await create_openfort_signer(OpenfortSignerConfig(secret_key="sk_...",account_id="acc_...",wallet_secret="wallet_secret",))
Para
from solana_keychain import ParaSignerConfig, create_para_signersigner = await create_para_signer(ParaSignerConfig(api_key="sk_...",wallet_id="wallet_uuid",))
Utila
Utila allekirjoittaa vain transaktioita; sign_message aiheuttaa SIGNING_FAILED-virheen.
from solana_keychain.utila import UtilaSignerConfig, create_utila_signersigner = await create_utila_signer(UtilaSignerConfig(service_account_email="sa@example.com",service_account_private_key_pem="-----BEGIN PRIVATE KEY-----\n...",vault_id="vault_id",wallet_id="wallet_id",network="networks/solana-devnet",))
Fordefi
Fordefillä on kolme allekirjoitustilaa, jotka määräytyvät luontihetkellä chain- ja
push_mode-arvoilla. create_fordefi_signer valitsee luokan, jokainen luokka hylkkää
toiselle tarkoitetun konfiguraation, ja kaikki kolme allekirjoittavat viestejä:
| Tila | Konfiguraatio | Luokka | Metodi |
|---|---|---|---|
| Black box | chain asettamatta | FordefiBlackBoxSigner | sign_transaction |
| Native auto | chain asetettu, push_mode asettamatta tai "auto" | FordefiNativeAutoSigner | sign_and_send_transaction |
| Native manual | chain asetettu, push_mode="manual" | FordefiNativeManualSigner | modify_and_sign_transaction |
API-pyynnöt todennetaan ECDSA P-256 -pyyntöallekirjoituksella: anna
avain private_key_pem-parametrina tai pidä se KMS/HSM-järjestelmässä välittämällä
FordefiRequestSigner-aliluokka request_signer-parametrina.
Native auto -tila: aseta chain ("solana_devnet" tai "solana_mainnet"), jolloin
Fordefi voi korvata blockhashin ja maksut ja sen jälkeen allekirjoittaa ja lähettää
transaktion itse. Se hyväksyy vain allekirjoittamattoman transaktion, jonka ainoa vaadittu
allekirjoittaja on vault. fee välitetään Fordefille sellaisenaan:
import osfrom solana_keychain.fordefi import FordefiSignerConfig, create_fordefi_signersigner = await create_fordefi_signer(FordefiSignerConfig(access_token=os.environ["FORDEFI_ACCESS_TOKEN"],vault_id=os.environ["FORDEFI_VAULT_ID"],public_key=os.environ["FORDEFI_PUBLIC_KEY"], # vault address (base58)private_key_pem=open("./secret/private.pem").read(),chain="solana_devnet",fee={"type": "custom", "priority_fee": "1000"}, # optional))signature = await signer.sign_and_send_transaction(transaction)
Native manual -tila: aseta chain ja push_mode="manual". Fordefi kirjoittaa
viestin uudelleen (tuore blockhash, Compute Budget -maksuohjeet) ja allekirjoittaa sen,
mutta ei lähetä sitä verkkoon. Palautettu transaktio korvaa lähettämäsi,
joten jatka aina kohdasta result.transaction. Fordefin on oltava maksun maksaja ja
sen on allekirjoitettava ennen muita vaadittuja allekirjoittajia: transaktio, jolla on jo
allekirjoituksia, hyväksytään, mutta uudelleenkirjoitus mitätöi ne. Uudelleenkirjoituksesta ei tehdä diffiä,
joten tarkista tulos ennen lähetystä ja lähetä viipymättä, koska Fordefi
ei palauta uuden blockhashin vanhenemiskorkeutta.
signer = await create_fordefi_signer(FordefiSignerConfig(access_token=os.environ["FORDEFI_ACCESS_TOKEN"],vault_id=os.environ["FORDEFI_VAULT_ID"],public_key=os.environ["FORDEFI_PUBLIC_KEY"],private_key_pem=open("./secret/private.pem").read(),chain="solana_devnet",push_mode="manual",))result = await signer.modify_and_sign_transaction(transaction)... # inspect result.transaction, then add any remaining signatures
Lähetä tarkistettu transaktio kuten kohdassa Allekirjoita ja lähetä, ja sovita tilanne ennen uudelleenyritystä, jos lähetys epäonnistuu.
Black box -tila: jätä chain pois. Fordefi allekirjoittaa tarkalleen antamasi viestitavut ja
ei lähetä niitä verkkoon. Käytä tätä Fordefi black box -vaultin kanssa.
signer = await create_fordefi_signer(FordefiSignerConfig(access_token=os.environ["FORDEFI_ACCESS_TOKEN"],vault_id=os.environ["FORDEFI_BB_VAULT_ID"],public_key=os.environ["FORDEFI_BB_PUBLIC_KEY"],private_key_pem=open("./secret/private.pem").read(),))
Allekirjoita ja lähetä
sign_and_send_transaction vie transaktion ketjuun allekirjoittajan muodosta riippumatta.
SendingSigner lähettää palveluntarjoajansa kautta, eikä lähetysfunktiotasi
kutsuta koskaan. TransactionSigner tai ModifyingSigner allekirjoittaa, ja lähetysfunktiosi
lähettää base64-koodatun tuloksen (paketissa ei ole RPC-asiakasta):
import httpxfrom solana_keychain import sign_and_send_transactionfrom solders.signature import Signatureasync def send(encoded: str) -> Signature:async with httpx.AsyncClient() as client:response = await client.post("https://api.devnet.solana.com",json={"jsonrpc": "2.0","id": 1,"method": "sendTransaction","params": [encoded, {"encoding": "base64"}],},)return Signature.from_string(response.json()["result"])signature = await sign_and_send_transaction(signer, transaction, send)
Pelkästään allekirjoittava allekirjoittaja ilman lähetysfunktiota aiheuttaa CONFIG_ERROR-virheen, ja
transaktio, josta puuttuu allekirjoituksia vielä allekirjoituksen jälkeen, aiheuttaa SIGNING_FAILED-virheen.
Virheenkäsittely
Jokainen virhe on SignerError, jolla on vakaa code arvoista SignerErrorCode:
BROADCAST_UNCONFIRMED, CONFIG_ERROR, EXPECTED_SOLANA_SIGNER, HTTP_ERROR,
INVALID_PRIVATE_KEY, INVALID_PUBLIC_KEY, IO_ERROR, NOT_AVAILABLE,
NOT_INITIALIZED, OTHER, PARSING_ERROR, REMOTE_API_ERROR,
SERIALIZATION_ERROR ja SIGNING_FAILED. Vertaa code-arvoon, älä viestiin:
str() ja repr() sisältävät vain kiinteän yleisen viestin, eivät koskaan avainmateriaalia tai
palveluntarjoajan raakavastauksia. status_code ja provider_error_code asetetaan, kun
virhe tuli palveluntarjoajan vastauksesta.
SignerErrorCode.BROADCAST_UNCONFIRMED ("SIGNER_BROADCAST_UNCONFIRMED") tarkoittaa,
että transaktio on saattanut mennä perille:
- Crossmintissa ja Fordefi native autossa
provider_transaction_idasetetaan, kun luonti on hyväksytty, jaidempotency_keysisältää viestistä johdetun avaimen, jolla luonti lähetettiin. Täsmälleen samanlaisen transaktion uudelleenlähetys on turvallista; uudelleen rakennettu (esimerkiksi uudella blockhashilla) on uusi siirto. sign_and_send_transaction-metodista epäonnistuva lähetysfunktio aiheuttaa sen siten, ettätransaction_signatureon asetettu valmistuneen transaktion allekirjoitukseksi.- Fireblocks aiheuttaa sen vain, jos kysely osoittaa Fireblocksin lähettäneen
use_program_call-transaktion verkkoon, vaikka se lähetettiin vain allekirjoitettavaksi.
from solana_keychain import SignerError, SignerErrorCodetry:signature = await sign_and_send_transaction(signer, transaction, send)except SignerError as error:if error.code is SignerErrorCode.BROADCAST_UNCONFIRMED:reconcile(error.provider_transaction_id,error.idempotency_key,error.transaction_signature,)raise
Peruutettu kutsu nostaa uudelleen asyncio.CancelledError-poikkeuksen, jolla ei ole kenttiä. Jos haluat
palauttaa tunnisteen, jonka palveluntarjoaja ehti hyväksyä ennen peruutusta, välitä
PendingTransactionId() (paketista solana_keychain.core) Crossmintin tai
Fordefi native auton konfiguraation pending_transaction_id-kenttään ja lue .get() peruutuksen
jälkeen. Sovita tilanne palveluntarjoajan kanssa ennen uudelleenyritystä.
Keychain validoi allekirjoitusvaiheen, ei sitä, mitä transaktio tekee: palveluntarjoajan palauttama allekirjoitus ed25519-varmennetaan paikallisesti laskettua viestiä vasten ennen liittämistä. Python ei pysty nollaamaan avainpuskureita, joten paikallisia avaimia käyttävien taustajärjestelmien (Memory sekä etätaustajärjestelmien konfiguraatioissa olevat API-avaimet ja PEM-tiedostot) kanssa koko prosessin muisti on syytä katsoa arkaluonteiseksi. Katso tietoturvamalli siitä, mitä kukin allekirjoitusmuoto takaa.
Mukautettujen allekirjoittajien lisääminen
Periytä luokka TransactionSigner, ModifyingSigner tai SendingSigner (se, joka vastaa taustajärjestelmääsi) moduulista solana_keychain.core. Katso lisäksi Allekirjoittajien lisäämisen opas, jos haluat integroida
muita avainten hallintapalveluita.
Resurssit
Is this page helpful?