Kısmi İmzalama

Kısmi imzalama, birden fazla tarafın aynı işlemi farklı zamanlarda veya farklı cihazlarda imzalamasına olanak tanır. Koordinatör mesajı oluşturur, gerekli her imzacı serileştirilmiş mesaj baytlarının tamamını imzalar ve koordinatör göndermeden önce imzaları doğrulayıp birleştirir.

İmzalar niyeti değil, baytları yetkilendirir

Ücret ödeyicisini, blockhash'i, talimat sırasını, hesap listesini veya herhangi bir instruction data değerini değiştirmek farklı bir mesaj üretir ve o ana kadar toplanan tüm imzaları geçersiz kılar.

Kısmi imzalama akışı

  1. İşlem talimatları ve ücreti kimin ödeyeceği konusunda anlaşın.
  2. İşlem ömrünü ve ücret ödeyicisini belirleyin.
  3. Mesajı yalnızca bir kez serileştirin. Bu baytları değiştirilemez kabul edin.
  4. Mesaj baytlarını ve insan tarafından okunabilir bir özeti her imzacıya dağıtın.
  5. Her Ed25519 imzasını aynı mesaj baytlarına karşı toplayın ve doğrulayın.
  6. İmzaları, ilgili gerekli imzacı adreslerine ekleyin.
  7. Gerekli her imzanın mevcut ve geçerli olduğunu doğrulayın, ardından gönderin.

Tam örnek

Aşağıdaki ücret ödeyicisi ve SOL gönderen tarafı bağımsız olarak imzalar. Koordinatör iki imzayı da doğrular, birleştirir ve tamamlanan işlemi gönderir.

Örnek, koordinatör ile her imzacı arasındaki sınırı açıkça göstermek için ham Ed25519 imzalamayı kullanır. Bir cüzdan, donanım cihazı, saklama hizmeti veya çevrimdışı imzacı, aynı mesaj baytlarını imzaladığı sürece yerel keypair'lerden herhangi birinin yerine geçebilir.

İmzalamadan önce mesajı dondurun

Her imza, serileştirilmiş işlem mesajının tamamını kapsar. Mesaj şunların hepsini içerir:

  • ücret ödeyicisi
  • son blockhash veya kalıcı nonce
  • her program ve hesap adresi
  • hesabın imzacı ve yazılabilir izinleri
  • talimat sırası ve instruction data

Önce bu alanları oluşturun, mesajı bir kez serileştirin ve bu bayt dizisini her imzacıya dağıtın. Koordinatörün farklı bir mesaj için döndürülen imzayı reddedebilmesi amacıyla, mesajın özetini (digest) her imzalama isteğiyle birlikte saklamak faydalıdır.

Bir mesajı serileştirmeyi geri alıp değiştirmeyin ve daha önce toplanan imzaların geçerli kalmasını beklemeyin. Süresi dolmuş bir blockhash'i değiştirmek veya ücret ödeyicisini değiştirmek gibi operasyonel görünen bir değişiklik bile tüm imzacıların yeniden imzalamasını gerektirir.

Ücret ödeyicisini koordine edin

Ücret ödeyicisi her zaman gerekli bir imzacıdır ve mesaj dondurulmadan önce belirlenmelidir. Hesabın temel ücret ve olası öncelik ücreti için yeterli SOL'a sahip olduğunu doğrulayın. Ücreti bir sponsor veya arka uç ödeyecekse, kullanıcının imzasını toplamadan önce bu adresi mesaja ekleyin; sponsoru sonradan eklemek imzalanan baytları değiştirir.

Koordinatör, gelen bir imzanın gerekli imzacılar arasında listelenen bir adrese ait olduğunu doğrulamalıdır. Rastgele bir açık anahtarı asla kabul edip işleme eklemeyin.

İşlem ömrünü yönetin

Son blockhash kullanan bir işlem, yalnızca blockhash'i validator'ın son blockhash kuyruğunda kaldığı sürece geçerlidir. Çok taraflı bir imzalama akışına başlamadan önce, tüm imzacıların lastValidBlockHeight değerinden önce yanıt verip veremeyeceğini tahmin edin.

Blockhash'in süresi dolarsa, yeni bir blockhash ile yeni bir mesaj oluşturun ve tüm imzaları yeniden toplayın. Daha uzun sürebilecek veya çevrimdışı imzacılar içeren iş akışlarında kalıcı nonce kullanın. Kalıcı nonce, son blockhash penceresini ortadan kaldırır; ancak bu nonce'u ilerletmek veya başka şekilde tüketmek, bekleyen işlemi yine de geçersiz kılar.

Göndermeden önce doğrulayın

Döndürülen her imza için:

  1. İmzayı, dondurulmuş mesaj baytlarına ve beklenen imzacının açık anahtarına karşı doğrulayın.
  2. İmzayı, işlem imza dizisinde o imzacının yuvasına ekleyin.
  3. Birleştirilen işlemin gerekli her imzacı için geçerli imzalara sahip olduğunu doğrulayın.
  4. Mesajını yeniden oluşturmadan serileştirilmiş işlemi gönderin.

Gönderdikten sonra, imzalanan mesajda yer alan aynı ömür bilgisini kullanarak onaylayın. Onay, blockhash'in süresinin dolduğunu veya nonce'un tüketildiğini bildirirse, değiştirilmiş bir işlemle yeniden denemeyin; imzalama akışını baştan başlatın.

Is this page helpful?

İçindekiler

Sayfayı Düzenle
© 2026 Solana Vakfı. Tüm hakları saklıdır.