Arkkitehtuurin Yleiskatsaus
Kora käyttää ulkoista
solana-keychain
crate-pakettia kaikkiin allekirjoitusoperaatioihin. Tämä arkkitehtuuri tarjoaa
yhtenäisen allekirjoitusrajapinnan Solana-tapahtumien allekirjoittamiseen. Uuden
allekirjoittajan lisäämiseksi Koraan sinun täytyy:
- Ensin: Lisää allekirjoittajatoteutuksesi
solana-keychaincrate-pakettiin - Toiseksi: Lisää määritystuki allekirjoittajallesi Korassa
Vaiheittainen Integrointiopas
Pikaintegroinnin Tarkistuslista
Osa 1: Lisää Allekirjoittaja solana-keychain Crate-pakettiin
- Toteuta allekirjoittajasi noudattaen solana-keychain-integrointiopasta
- Odota PR-hyväksyntää ja crate-julkaisua
Osa 2: Lisää Koran Määritystuki
- Päivitä Cargo.toml-riippuvuus niin, että
solana-keychaincrate käyttää uusinta versiota (joka sisältää allekirjoittajasi) - Lisää määritysrakenne allekirjoittajasi ympäristömuuttujille
- Päivitä
SignerTypeConfigenum tiedostossacrates/lib/src/signer/config.rs - Lisää validointilogiikka allekirjoittajasi määritykselle
- Lisää rakennuslogiikka allekirjoittajasi luomiseen määrityksestä
- Vie määritysrakenne tiedostossa
crates/lib/src/signer/mod.rs - (Valinnainen) Lisää testisimulaation rakentaja tiedostoon
crates/lib/src/tests/config_mock.rs - Päivitä esimerkkimääritysten tiedostot
- Päivitä testiskriptit sisällyttämään allekirjoittajasi (katso alta)
- Päivitä dokumentaatio sisällyttämään allekirjoittajasi (katso alta)
- Lähetä PR Kora-repositorioon
Lisää allekirjoittajatuki Koraan
Varmista ensin, että allekirjoittajasi on tuettu solana-keychain-crate:ssa.
Jos sitä ei tueta, noudata ohjetta osoitteessa:
https://github.com/solana-foundation/solana-keychain/blob/main/docs/ADDING_SIGNERS.md
Vaihe 1: Päivitä Cargo.toml
Päivitä Cargo.toml:n riippuvuus siten, että solana-keychain-crate käyttää
uusinta versiota (joka sisältää allekirjoittajasi):
[dependencies]solana-keychain = { version = "X.Y.Z", default-features = false, features = ["all","sdk-v3",] }
Vaihe 2: Määrittele konfiguraatiorakenne
Lisää crates/lib/src/signer/config.rs-tiedostoon uusi konfiguraatiorakenne
allekirjoittajallesi, joka määrittelee tarvittavat ympäristömuuttujat.
Esimerkiksi:
/// YourService signer configuration#[derive(Clone, Serialize, Deserialize)]pub struct YourServiceSignerConfig {pub api_key_env: String,pub api_secret_env: String,pub wallet_id_env: String,}
Vaihe 2: Lisää allekirjoittajasi SignerTypeConfig-enumiin
Lisää allekirjoittajavarianttisi SignerTypeConfig-enumiin
crates/lib/src/signer/config.rs-tiedostossa:
/// Signer type-specific configuration#[derive(Clone, Serialize, Deserialize)]#[serde(tag = "type", rename_all = "snake_case")]pub enum SignerTypeConfig {// Existing signer variantsMemory { #[serde(flatten)] config: MemorySignerConfig },// ... existing variants ...// Add your signer hereYourService {#[serde(flatten)]config: YourServiceSignerConfig,},}
Vaihe 3: Lisää rakennuslogiikka
Lisää samaan tiedostoon (config.rs) metodi, joka rakentaa allekirjoittajasi
konfiguraatiosta SignerConfig-toteutuksessa:
impl SignerConfig {pub async fn build_signer_from_config(config: &SignerConfig) -> Result<Signer, KoraError> {match &config.config {// ... existing casesSignerTypeConfig::YourService { config: your_service_config } => {Self::build_your_service_signer(your_service_config, &config.name).await}}}// Add this new methodasync fn build_your_service_signer(config: &YourServiceSignerConfig,signer_name: &str,) -> Result<Signer, KoraError> {// Update the environment variable names to match your signer's configurationlet api_key = get_env_var_for_signer(&config.api_key_env, signer_name)?;let api_secret = get_env_var_for_signer(&config.api_secret_env, signer_name)?;let wallet_id = get_env_var_for_signer(&config.wallet_id_env, signer_name)?;// Call the constructor from solana-keychain crateSigner::from_your_service(api_key, api_secret, wallet_id).await.map_err(|e| {KoraError::SigningError(format!("Failed to create YourService signer '{signer_name}': {}",sanitize_error!(e)))})}}
Huomautus: Metodin nimen Signer::from_your_service() tulisi vastata sitä,
minkä toteutit solana-keychain-cratessa.
Vaihe 4: Lisää validointilogiikka
Lisää validointi allekirjoittajasi konfiguraatiolle
validate_individual_signer_config-metodissa:
impl SignerConfig {pub fn validate_individual_signer_config(&self, index: usize) -> Result<(), KoraError> {// ... existing validationmatch &self.config {// ... existing casesSignerTypeConfig::YourService { config } => {Self::validate_your_service_config(config, &self.name)}}}// Add this new validation methodfn validate_your_service_config(config: &YourServiceSignerConfig,signer_name: &str,) -> Result<(), KoraError> {// Update the environment variable names to match your signer's configurationlet env_vars = [("api_key_env", &config.api_key_env),("api_secret_env", &config.api_secret_env),("wallet_id_env", &config.wallet_id_env),];for (field_name, env_var) in env_vars {if env_var.is_empty() {return Err(KoraError::ValidationError(format!("YourService signer '{signer_name}' must specify non-empty {field_name}")));}}Ok(())}}
Vaihe 5: Vie konfiguraatiosi
Lisää uusi config-rakenteesi moduulin vienteihin
crates/lib/src/signer/mod.rs-tiedostossa (tai tiedoston alussa, jos se on
julkinen):
pub use config::{MemorySignerConfig,PrivySignerConfig,SignerTypeConfig,TurnkeySignerConfig,VaultSignerConfig,YourServiceSignerConfig, // Add this// ... other exports};
Integraation testaaminen
Lisää testimock-rakentaja
Testauksen helpottamiseksi lisää rakentajametodi
SignerPoolConfigBuilder-rakenteeseen
crates/lib/src/tests/config_mock.rs-tiedostossa:
impl SignerPoolConfigBuilder {// ... existing methodspub fn with_your_service_signer(mut self,name: String,api_key_env: String,api_secret_env: String,wallet_id_env: String,weight: Option<u32>,) -> Self {let signer = SignerConfig {name,weight,config: SignerTypeConfig::YourService {config: YourServiceSignerConfig {api_key_env,api_secret_env,wallet_id_env,},},};self.config.signers.push(signer);self}}
Tämä mahdollistaa muiden testien luoda helposti mock-konfiguraatioita, jotka sisältävät allekirjoittajasi:
use crate::tests::config_mock::SignerPoolConfigBuilder;let config = SignerPoolConfigBuilder::new().with_your_service_signer("yourservice_test".to_string(),"YOUR_SERVICE_API_KEY".to_string(),"YOUR_SERVICE_API_SECRET".to_string(),"YOUR_SERVICE_WALLET_ID".to_string(),Some(1)).build();
Ympäristömuuttujat
Lisää esimerkin ympäristömuuttujat seuraaviin tiedostoihin:
.env.example(projektin juuressa).env(projektin juuressa, paikallista testausta varten)./sdks/ts/.env.example./sdks/ts/.env
# YourService Signer ConfigurationYOUR_SERVICE_API_KEY=your_api_key_hereYOUR_SERVICE_API_SECRET=your_api_secret_hereYOUR_SERVICE_WALLET_ID=your_wallet_id_here
Integraatiotestit
Jokainen integraatiovaihe on oma [[test]]-kohteensa tiedostossa tests/Cargo.toml. Jokainen
kohde käynnistää harness_contextin kautta upotetun surfnetin ja Kora-noden,
alustettuna tyhjästä. Kora säilyttää konfiguraation prosessikohtaisessa globaalissa tilassa, joten uusi
allekirjoittaja tarvitsee uuden kohteen eikä uutta moduulia olemassa olevaan kohteeseen.
1. Lisää allekirjoittajan testikonfiguraatio
Luo allekirjoittajan konfiguraatio kohteeseen tests/src/common/fixtures/:
# tests/src/common/fixtures/signers-your-service.toml[signer_pool]strategy = "round_robin"[[signers]]name = "yourservice_main"type = "your_service"api_key_env = "YOUR_SERVICE_API_KEY"api_secret_env = "YOUR_SERVICE_API_SECRET"wallet_id_env = "YOUR_SERVICE_WALLET_ID"
2. Lisää testikohde
Rekisteröi vaihe tiedostoon tests/Cargo.toml:
[[test]]name = "your_service"path = "your_service/main.rs"
Luo sitten tiedosto tests/your_service/main.rs. Se osoittaa harnessin fixtureesi
ja sen on sisällettävä vähintään yksi #[tokio::test], joka testaa allekirjoittajaa:
#[path = "../src/common/mod.rs"]mod common;use common::*;use jsonrpsee::rpc_params;pub async fn ctx() -> TestContext {harness_context(KoraSpec {config: "tests/src/common/fixtures/kora-test.toml",signers: "tests/src/common/fixtures/signers-your-service.toml",initialize_payments_atas: false,}).await}#[tokio::test]async fn test_your_service_signs_as_fee_payer() {let ctx = ctx().await;let response: serde_json::Value = ctx.rpc_call("getPayerSigner", rpc_params![]).await.expect("Failed to get payer signer");response.assert_success();assert!(response["signer_address"].as_str().is_some());}
Lisää myös signTransaction-testi, jotta allekirjoittajan allekirjoituspolku tulee ajettua eikä vain
avaimen hakua. tests/multi_signer/ on täydellinen esimerkki, jota voit kopioida.
3. Testien suorittaminen
just installexport YOUR_SERVICE_API_KEY="your_key"export YOUR_SERVICE_API_SECRET="your_secret"export YOUR_SERVICE_WALLET_ID="your_wallet"# Run only your phasecargo test -p tests --test your_service# Run every integration phasejust integration-test
Dokumentointivaatimukset
Sisällytä PR:ääsi lähetettäessä:
1. Päivitä allekirjoittajien opas
Lisää allekirjoittajan dokumentaatio noudattaen
ADDING_SIGNERS.md-opasta,
selittäen esivalmistelut, asennuksen ja käytön.
## YourService Signer[YourService](https://yourservice.com) provides [brief description of yourservice].### Prerequisites- YourService account- API credentials- Funded wallet### Setup1. Get your API credentials from [dashboard link]2. Create a wallet...3. Configure environment variables:\```bash YOUR_SERVICE_API_KEY="your_api_key"YOUR_SERVICE_API_SECRET="your_api_secret"YOUR_SERVICE_WALLET_ID="your_wallet_id" \```### Configure signers.toml\```toml [signer_pool] strategy = "round_robin"[[signers]] name = "yourservice_main" type = "your_service" api_key_env ="YOUR_SERVICE_API_KEY" api_secret_env = "YOUR_SERVICE_API_SECRET" wallet_id_env= "YOUR_SERVICE_WALLET_ID" weight = 1 \```### Run Kora with YourService Signer\```bash kora rpc start --signers-config signers.toml \```
2. Päivitä README
Lisää palvelusi pääasiallisen README:n validator-listaan.
Lähetysten tarkistuslista
- Allekirjoittajasi on tuettu
solana-keychain-kirjastossa - Päivitetty
solana-keychain-riippuvuus Cargo.toml:ssa uusimpaan versioon - Lisätty konfiguraatiorakenne allekirjoittajallesi
- Lisätty
SignerTypeConfig-variantti - Lisätty rakennuslogiikka kohteessa
build_signer_from_config - Lisätty validointilogiikka kohteessa
validate_individual_signer_config - Konfiguraatiorakenne viety käyttöön kohteessa
mod.rs - (Valinnainen) Lisätty testimallin rakentajametodi kohteessa
config_mock.rs - Koodi kääntyy ilman varoituksia
- Kaikki testit läpäistään (
just test) - Dokumentaatio lisätty ohjeiden mukaisesti
ADDING_SIGNERS.md - Esimerkkikonfiguraatiotiedostot luotu (
.tomlja.env.example) - Ei kovakoodattuja arvoja tai salaisuuksia
- Virheilmoitukset ovat hyödyllisiä
- Noudattaa Rustin nimeämiskäytäntöjä (snake_case)
- Linting läpäisty (
make lint) - Ota yhteyttä Kora-tiimiin API-avaimilla integrointitestausta varten
Avun saaminen
- Allekirjoittajan toteutukseen: Avaa issue
solana-keychain-repositoriossa - Kora-integraatioon: Avaa issue Kora-repositoriossa suunnittelukeskusteluja varten
- Liity yhteisökanavillemme
- Tutustu olemassa oleviin allekirjoittajakonfiguraatioihin
crates/lib/src/signer/config.rs
Esimerkki PR-rakenteesta
Kora-repositoriolle:
feat(signer): add YourService signer configuration support- Add YourServiceSignerConfig struct- Add YourService variant to SignerTypeConfig enum- Add build and validation logic for YourService- Add example configuration files- Add documentation to SIGNERS.md- Add integration tests
Tervetuloa Kora-ekosysteemiin! Olemme innoissamme siitä, että avaintenhallintatoteutuksesi on osa alustaa.
Is this page helpful?