Go

2.0.0 on Go-moduulien ensimmäinen vakaa julkaisu, joten migroitavaa ei ole. 2.0-migraatio-opas käsittelee samaa ominaisuuksien jakoa Rustille ja TypeScriptille.

Asennus

Jokainen taustajärjestelmä on oma Go-moduulinsa, joten koontiversiosi ja moduulikaaviosi sisältävät vain ne taustajärjestelmät, jotka tuot:

go get github.com/solana-foundation/solana-keychain/go/core/v2 # Interfaces, errors, helpers
go get github.com/solana-foundation/solana-keychain/go/signers/memory/v2 # Local keypair signer
go get github.com/solana-foundation/solana-keychain/go/signers/vault/v2 # HashiCorp Vault
go get github.com/solana-foundation/solana-keychain/go/signers/awskms/v2 # AWS KMS
go get github.com/solana-foundation/solana-keychain/go/signers/gcpkms/v2 # GCP KMS
go get github.com/solana-foundation/solana-keychain/go/signers/privy/v2 # Privy
go get github.com/solana-foundation/solana-keychain/go/signers/turnkey/v2 # Turnkey
go get github.com/solana-foundation/solana-keychain/go/signers/fireblocks/v2 # Fireblocks
go get github.com/solana-foundation/solana-keychain/go/signers/cdp/v2 # Coinbase Developer Platform
go get github.com/solana-foundation/solana-keychain/go/signers/crossmint/v2 # Crossmint
go get github.com/solana-foundation/solana-keychain/go/signers/dfns/v2 # Dfns
go get github.com/solana-foundation/solana-keychain/go/signers/openfort/v2 # Openfort
go get github.com/solana-foundation/solana-keychain/go/signers/para/v2 # Para
go get github.com/solana-foundation/solana-keychain/go/signers/utila/v2 # Utila
go get github.com/solana-foundation/solana-keychain/go/signers/fordefi/v2 # Fordefi

Moduulit tagataan muodossa go/<module>/v2.0.0 (esimerkiksi go/signers/memory/v2.0.0). Jokainen moduuli vaatii Go 1.25.0:n, paitsi gcpkms, joka vaatii Go 1.25.8:n google.golang.org/api-kirjaston asettaman alarajan vuoksi. Ledger on vain Rustille eikä sillä ole Go-moduulia.

solana-go v2 ja v1-transaktiot

Moduulit perustuvat kirjastoon github.com/solana-foundation/solana-go/v2 v2.0.0 ja ottavat vastaan sen *solana.Transaction-tyypin. Legacy-, v0- ja v1-transaktiot (solana.MessageVersionV1) ovat tuettuja, paitsi Fireblocksissa asetuksella UseProgramCall: true, joka hyväksyy vain legacy- ja v0-transaktiot.

Peruskäyttö

Jokainen allekirjoittaja toteuttaa perustason core.SolanaSigner-rajapinnan (Pubkey, SignMessage, IsAvailable). Metodit ottavat parametrina context.Context-arvon ja ovat estäviä (blocking). Lisäksi jokainen taustajärjestelmä toteuttaa täsmälleen yhden ominaisuusrajapinnan:

  • core.TransactionSigner: SignTransaction allekirjoittaa transaktiosi sellaisenaan.
  • core.ModifyingSigner: ModifyAndSignTransaction antaa palveluntarjoajan kirjoittaa transaktion uudelleen ja allekirjoittaa sen sitten.
  • core.SendingSigner: SignAndSendTransaction antaa palveluntarjoajan allekirjoittaa ja lähettää sen verkkoon.

Jokainen taustajärjestelmäpaketti tarjoaa Config-structin ja New-konstruktorin:

import (
"context"
"fmt"
"github.com/solana-foundation/solana-go/v2"
"github.com/solana-foundation/solana-keychain/go/core/v2"
"github.com/solana-foundation/solana-keychain/go/signers/memory/v2"
)
func signWithKeychain(ctx context.Context, tx *solana.Transaction) error {
signer, err := memory.New(memory.Config{PrivateKeyPath: "/path/to/id.json"})
if err != nil {
return err
}
if !signer.IsAvailable(ctx) {
return core.NewSignerError(core.CodeNotAvailable, "signer offline")
}
result, err := signer.SignTransaction(ctx, tx)
if err != nil {
return err
}
fmt.Println("signature:", result.Signature)
fmt.Println("complete:", result.IsComplete())
// result.EncodedTransaction is the base64 wire transaction
return nil
}

SignTransaction ja ModifyAndSignTransaction palauttavat core.SignedTransaction-arvon (EncodedTransaction, Signature, Completeness). Etä-HTTP-taustajärjestelmät hyväksyvät valinnaisen HTTPClient- ja HTTPClientConfig-asetuksen (aikakatkaisut). Oletusasiakas pakottaa HTTPS:n käytön; oman asiakkaan antaminen ohittaa sen, ja vastaat itse sen tietoturvatasosta.

Allekirjoittajan ominaisuudet

Taustajärjestelmällä, joka ei voi allekirjoittaa transaktiota, ei ole lainkaan SignTransaction-metodia, joten ominaisuus on konkreettisille tyypeille käännösaikainen tosiasia ja core.SolanaSigner-tyypille tyyppivahvistus (type assertion):

TaustajärjestelmäOminaisuusSignMessage
memory, vault, privy, turnkey, awskms, gcpkms, fireblocks, dfns, para, openfortTransactionSignerKyllä
cdpTransactionSignerVain UTF-8-sisältö
utilaTransactionSignerEpäonnistuu virheeseen CodeSigningFailed
fordefi black box (fordefi.BlackBoxSigner)TransactionSignerKyllä
fordefi native manual (fordefi.NativeManualSigner)ModifyingSignerKyllä
fordefi native auto (fordefi.NativeAutoSigner)SendingSignerKyllä
crossmintSendingSignerEpäonnistuu virheeseen CodeSigningFailed
switch s := signer.(type) {
case core.SendingSigner:
sig, err := s.SignAndSendTransaction(ctx, tx)
case core.ModifyingSigner:
signed, err := s.ModifyAndSignTransaction(ctx, tx)
case core.TransactionSigner:
signed, err := s.SignTransaction(ctx, tx)
}

Alustus

Erillistä Init-vaihetta ei ole. Privy, Fireblocks, Dfns, Crossmint, Para, Openfort ja Utila selvittävät lompakkoosoitteen New-kutsun sisällä, minkä vuoksi niiden konstruktorit ottavat parametrina context.Context-arvon. Luo allekirjoittajat aina New-kutsulla: nolla-arvoinen Crossmint-, Para- tai Utila-allekirjoittaja epäonnistuu virheeseen CodeNotInitialized sen sijaan, että allekirjoittaisi nolla-osoitteelle.

Allekirjoita ja lähetä millä tahansa allekirjoittajalla

core.SignAndSendTransaction vie transaktion ketjuun allekirjoittajan muodosta riippumatta. SendingSigner lähettää verkkoon palveluntarjoajansa kautta ja ohittaa lähetysfunktion; jokainen muu muoto allekirjoittaa, ja funktiosi lähettää base64-muotoisen tuloksen, joka ModifyingSigner-tyypillä on palveluntarjoajan uudelleenkirjoittama transaktio. Core-kirjastolla ei ole RPC-riippuvuutta:

import "github.com/solana-foundation/solana-go/v2/rpc"
client := rpc.New("https://api.devnet.solana.com")
sig, err := core.SignAndSendTransaction(ctx, signer, tx,
func(ctx context.Context, encoded string) (solana.Signature, error) {
return client.SendEncodedTransaction(ctx, encoded)
})

Eräallekirjoitus

Eräallekirjoitus tarjotaan vapaina apufunktioina, jotka toimivat rinnakkain ja joissa on valinnainen pyyntökohtainen porrastus nopeusrajoitetuille rajapinnoille:

sigs, err := core.SignMessages(ctx, signer, [][]byte{msg1, msg2}, core.BatchOptions{
MaxConcurrency: 4, // 0 = unbounded
RequestDelay: 50 * time.Millisecond,
})
signed, err := core.SignTransactions(ctx, signer, txs, core.BatchOptions{})

core.SignTransactions ottaa parametrina core.TransactionSigner-arvon, joten lähetyksen hallinnoivia allekirjoittajia (Crossmint, Fordefi native auto) ja Fordefi native manualia ei voi käsitellä erässä sen kautta; kutsu niitä yksi transaktio kerrallaan. Allekirjoittaja, jonka kutsut synnyttävät palveluntarjoajan puolella työtä (Fireblocks asetuksella UseProgramCall), ilmoittaa tämän core.BatchServerSideEffects-rajapinnan kautta, ja erä suoritetaan silloin järjestyksessä.

Taustajärjestelmän määritys

Memory

Anna täsmälleen yksi seuraavista: PrivateKey (raakatavut), PrivateKeyString (base58 tai [1,2,...]-tavutaulukko) tai PrivateKeyPath (Solana CLI:n keypair-tiedosto):

import "github.com/solana-foundation/solana-keychain/go/signers/memory/v2"
signer, err := memory.New(memory.Config{
PrivateKeyPath: "/path/to/id.json",
})

Go ei tarjoa luotettavaa tapaa nollata muistia: roskienkerääjä voi kopioida ja pitää avaintavut hallussaan kunnes keräys tapahtuu (memory-keypairit sekä avaimet, jotka Crossmint ja Openfort johtavat paikallisesti). Käsittele koko prosessin muistia arkaluonteisena, kun käytät paikallisia avaimia käyttäviä taustajärjestelmiä.

HashiCorp Vault

import "github.com/solana-foundation/solana-keychain/go/signers/vault/v2"
signer, err := vault.New(vault.Config{
VaultAddr: "https://vault.example.com:8200",
Token: "hvs.xxxxx",
KeyName: "my-solana-key",
Pubkey: "base58_public_key",
})

AWS KMS

import "github.com/solana-foundation/solana-keychain/go/signers/awskms/v2"
signer, err := awskms.New(ctx, awskms.Config{
KeyID: "alias/my-solana-key",
PublicKey: "base58_public_key",
Region: "us-east-1", // optional
})

GCP KMS

import "github.com/solana-foundation/solana-keychain/go/signers/gcpkms/v2"
signer, err := gcpkms.New(ctx, gcpkms.Config{
KeyName: "projects/my-project/locations/us-east1/keyRings/my-ring/cryptoKeys/my-key/cryptoKeyVersions/1",
PublicKey: "base58_public_key",
})
if err != nil {
return err
}
defer signer.Close()

Privy

import "github.com/solana-foundation/solana-keychain/go/signers/privy/v2"
signer, err := privy.New(ctx, privy.Config{
AppID: "app_id",
AppSecret: "app_secret",
WalletID: "wallet_id",
})

Turnkey

import "github.com/solana-foundation/solana-keychain/go/signers/turnkey/v2"
signer, err := turnkey.New(turnkey.Config{
APIPublicKey: "api_public_key",
APIPrivateKey: "api_private_key",
OrganizationID: "org_id",
PrivateKeyID: "private_key_id",
PublicKey: "base58_public_key",
})

Fireblocks

import "github.com/solana-foundation/solana-keychain/go/signers/fireblocks/v2"
signer, err := fireblocks.New(ctx, fireblocks.Config{
APIKey: "api_key",
PrivateKeyPEM: "-----BEGIN RSA PRIVATE KEY-----\n...",
VaultAccountID: "0",
AssetID: "SOL", // or "SOL_TEST" for devnet
UseProgramCall: false, // true signs via sign-only PROGRAM_CALL (legacy/v0, hot wallet)
})

CDP (Coinbase Developer Platform)

import "github.com/solana-foundation/solana-keychain/go/signers/cdp/v2"
signer, err := cdp.New(cdp.Config{
APIKeyID: "api_key_id",
APIKeySecret: "api_key_secret", // base64 Ed25519
WalletSecret: "wallet_secret", // base64 PKCS#8 DER
Address: "base58_address",
Network: cdp.NetworkMainnet, // or cdp.NetworkDevnet; required for address lookup tables
})

CDP:n SignMessage hyväksyy vain UTF-8-sisältöä.

Crossmint

Crossmint on vain lähettävä: sen rajapinta suorittaa jokaisen hyväksytyn transaktion palvelinpuolella, joten *crossmint.Signer-tyypillä on SignAndSendTransaction mutta ei SignTransaction-metodia. Transaktiotasi ei koskaan muokata; palautettu allekirjoitus tunnistaa transaktion, jonka Crossmint sai ketjuun, ja se voi poiketa omastasi, jos Crossmint sponsoroi gas-maksut.

import "github.com/solana-foundation/solana-keychain/go/signers/crossmint/v2"
signer, err := crossmint.New(ctx, crossmint.Config{
APIKey: "api_key",
WalletLocator: "wallet_locator",
SignerSecret: "", // optional xmsk1_ secret: auto-approves what Crossmint presents
})
sig, err := signer.SignAndSendTransaction(ctx, tx)

Dfns

import "github.com/solana-foundation/solana-keychain/go/signers/dfns/v2"
signer, err := dfns.New(ctx, dfns.Config{
AuthToken: "auth_token",
CredID: "cred_id",
PrivateKeyPEM: "-----BEGIN EC PRIVATE KEY-----\n...",
WalletID: "wallet_id",
})

Openfort

import "github.com/solana-foundation/solana-keychain/go/signers/openfort/v2"
signer, err := openfort.New(ctx, openfort.Config{
SecretKey: "sk_live_...",
AccountID: "acc_...",
WalletSecret: "wallet_secret", // base64 PKCS#8 DER or PEM
})

Para

import "github.com/solana-foundation/solana-keychain/go/signers/para/v2"
signer, err := para.New(ctx, para.Config{
APIKey: "sk_...",
WalletID: "wallet_id",
})

Utila

Utila vain allekirjoittaa transaktioita; SignMessage epäonnistuu, ja lähetät allekirjoitetun transaktion itse verkkoon.

import "github.com/solana-foundation/solana-keychain/go/signers/utila/v2"
signer, err := utila.New(ctx, utila.Config{
ServiceAccountEmail: "sa@example.com",
ServiceAccountPrivateKeyPEM: "-----BEGIN PRIVATE KEY-----\n...",
VaultID: "vault_id",
WalletID: "wallet_id",
Network: "networks/solana-devnet",
})

Fordefi

Fordefi tulee kolmena allekirjoittajatyyppinä, jotka määräytyvät luontihetkellä arvoilla Config.Chain ja Config.PushMode. Kaikki kolme allekirjoittavat viestejä:

ConfigTyyppiSisääntulopiste
Chain asettamatta*fordefi.BlackBoxSignerSignTransaction
Chain asetettu, PushMode asettamatta tai PushModeAuto*fordefi.NativeAutoSignerSignAndSendTransaction
Chain asetettu, PushMode: PushModeManual*fordefi.NativeManualSignerModifyAndSignTransaction

fordefi.New valitsee tyypin asetusten perusteella ja palauttaa core.SolanaSigner-arvon; fordefi.NewBlackBox, fordefi.NewNativeAuto ja fordefi.NewNativeManual palauttavat konkreettisen tyypin ja hylkäävät muiden tilojen asetukset. API-pyynnöt todennetaan ECDSA P-256 -pyyntöallekirjoituksella: anna täsmälleen yksi seuraavista: PrivateKeyPEM tai RequestSigner, jolla avain pysyy KMS:ssä/HSM:ssä.

Native auto -tila: Fordefi voi vaihtaa blockhashin ja maksut, minkä jälkeen se allekirjoittaa ja lähettää transaktion verkkoon. Se hyväksyy vain allekirjoittamattoman transaktion, jonka ainoa vaadittu allekirjoittaja on vault.

import "github.com/solana-foundation/solana-keychain/go/signers/fordefi/v2"
signer, err := fordefi.NewNativeAuto(ctx, fordefi.Config{
AccessToken: os.Getenv("FORDEFI_ACCESS_TOKEN"),
VaultID: os.Getenv("FORDEFI_VAULT_ID"),
PublicKey: os.Getenv("FORDEFI_PUBLIC_KEY"), // Solana vault address (base58)
PrivateKeyPEM: string(pemBytes),
Chain: fordefi.ChainSolanaDevnet, // or fordefi.ChainSolanaMainnet
Fee: &fordefi.Fee{
Type: fordefi.FeeTypePriority,
PriorityLevel: fordefi.PriorityMedium,
},
})
sig, err := signer.SignAndSendTransaction(ctx, tx)

Native manual -tila: aseta PushMode: fordefi.PushModeManual. Fordefi kirjoittaa viestin uudelleen (tuore blockhash, Compute Budget -maksuohjeet) ja allekirjoittaa sen lähettämättä sitä verkkoon. ModifyAndSignTransaction korvaa tx-arvon Fordefin allekirjoittamalla transaktiolla: jatka aina siitä. Fordefin on oltava maksun maksaja (fee payer) ja sen on allekirjoitettava ennen muita vaadittuja allekirjoittajia, koska uudelleenkirjoitus mitätöi olemassa olevat allekirjoitukset. Uudelleenkirjoituksesta ei muodosteta diffiä, joten tarkista tulos ennen lähettämistä verkkoon.

signer, err := fordefi.NewNativeManual(ctx, fordefi.Config{
AccessToken: os.Getenv("FORDEFI_ACCESS_TOKEN"),
VaultID: os.Getenv("FORDEFI_VAULT_ID"),
PublicKey: os.Getenv("FORDEFI_PUBLIC_KEY"),
PrivateKeyPEM: string(pemBytes),
Chain: fordefi.ChainSolanaDevnet,
PushMode: fordefi.PushModeManual,
})
signed, err := signer.ModifyAndSignTransaction(ctx, tx)

Black box -tila: jätä Chain asettamatta. Fordefi allekirjoittaa täsmälleen antamasi viestitavut eikä lähetä niitä verkkoon. Käytä tätä Fordefi black box -vaultin kanssa.

signer, err := fordefi.NewBlackBox(ctx, fordefi.Config{
AccessToken: os.Getenv("FORDEFI_ACCESS_TOKEN"),
VaultID: os.Getenv("FORDEFI_BB_VAULT_ID"),
PublicKey: os.Getenv("FORDEFI_BB_PUBLIC_KEY"),
PrivateKeyPEM: string(pemBytes),
})

Miksi kattopakettia ei ole

Rustissa on Signer-enum ja TypeScriptissä createKeychainSigner; Gossa ei makuteta kumpaakaan tarkoituksella. Go ei poista kuollutta koodia ajonaikaisen haarautumisen (dispatch switch) yli, joten kattopaketti pakottaisi jokaisen taustajärjestelmän toimittajan SDK:n (AWS, GCP ja muut) jokaisen käyttäjän koontiversioon. Tarvitsemasi taustajärjestelmäpaketin tuonti on valitsin. Jos haluat valita taustajärjestelmän ajonaikaisesti, kirjoita switch omaan koodiisi vain tukemiesi taustajärjestelmien osalta ja säilytä tulos core.SolanaSigner-arvona.

Virheenkäsittely

Jokainen virhe on *core.SignerError, jolla on vakaa Code (CodeConfigError, CodeHTTPError, CodeRemoteAPIError, CodeSigningFailed, CodeNotInitialized, CodeBroadcastUnconfirmed ja muita). Error() palauttaa vain kiinteän viestin koodia kohden, ei koskaan avainmateriaalia tai palveluntarjoajan raakavastauksia. Täsmäytä käyttämällä errors.As, errors.Is(err, &core.SignerError{Code: ...}) tai core.CodeOf(err).

Crossmintin ja Fordefi native auto -tilan kohdalla virhe ei tarkoita, ettei mikään olisi mennyt perille. Kun palveluntarjoaja on voinut hyväksyä transaktion, koodi on core.CodeBroadcastUnconfirmed ("SIGNER_BROADCAST_UNCONFIRMED"). ProviderTxID asetetaan, kun luonti on hyväksytty, ja IdempotencyKey sisältää viestistä johdetun avaimen. Tavu tavulta identtisen transaktion uudelleenlähetys on turvallista; uudelleen rakennettu (esimerkiksi uudella blockhashilla) on uusi siirto. core.SignAndSendTransaction ilmoittaa tämän koodin myös silloin, kun lähetysfunktiosi epäonnistuu, ja maksajan (fee payer) allekirjoitus on kentässä TransactionSignature. Fireblocksin PROGRAM_CALL on vain allekirjoittava eikä lähetä avainta; se ilmoittaa tämän koodin vain silloin, kun kysely osoittaa Fireblocksin lähettäneen transaktion silti verkkoon.

sig, err := core.SignAndSendTransaction(ctx, signer, tx, send)
var se *core.SignerError
if errors.As(err, &se) && se.Code == core.CodeBroadcastUnconfirmed {
// Reconcile se.ProviderTxID, se.IdempotencyKey or se.TransactionSignature
// with the provider before retrying.
}

Katso tietoturvamalli siitä, mitä kukin allekirjoitusmuoto takaa, Go README täydellistä moduulilistaa varten ja pkg.go.dev API-viitettä varten.

Mukautettujen allekirjoittajien lisääminen

Toteuta core.SolanaSigner sekä täsmälleen yksi ominaisuusrajapinta, äläkä lisää metodia, jota taustajärjestelmäsi ei voi toteuttaa: kutsujat tunnistavat ominaisuuden tyyppivahvistuksella. Katso Allekirjoittajien lisäämisen opas lisätäksesi muita avainhallintapalveluja.

Is this page helpful?

© 2026 Solana Foundation. Kaikki oikeudet pidätetään.