Częściowe podpisywanie

Częściowe podpisywanie pozwala wielu stronom podpisać tę samą transakcję w różnym czasie lub na różnych urządzeniach. Koordynator buduje wiadomość, każdy wymagany podpisujący podpisuje dokładnie te same bajty zserializowanej wiadomości, a koordynator weryfikuje i scala podpisy przed przesłaniem.

Podpisy autoryzują bajty, a nie intencje

Zmiana płatnika opłaty, blockhasha, kolejności instrukcji, listy kont lub dowolnych instruction data skutkuje powstaniem innej wiadomości i unieważnia wszystkie podpisy, które zostały już zebrane.

Przebieg częściowego podpisywania

  1. Uzgodnij instrukcje transakcji oraz to, kto zapłaci opłatę.
  2. Ustaw okres ważności transakcji i płatnika opłaty.
  3. Zserializuj wiadomość tylko raz. Traktuj te bajty jako niezmienne.
  4. Przekaż każdemu podpisującemu bajty wiadomości oraz czytelne dla człowieka podsumowanie.
  5. Zbierz i zweryfikuj każdy podpis Ed25519 względem tych samych bajtów wiadomości.
  6. Dołącz podpisy do odpowiadających im wymaganych adresów podpisujących.
  7. Upewnij się, że każdy wymagany podpis jest obecny i prawidłowy, a następnie prześlij transakcję.

Kompletny przykład

Płatnik opłaty i nadawca SOL podpisują poniżej niezależnie. Koordynator weryfikuje oba podpisy, scala je i przesyła gotową transakcję.

Przykład wykorzystuje surowe podpisywanie Ed25519, aby wyraźnie oddzielić rolę koordynatora od ról poszczególnych podpisujących. Portfel, urządzenie sprzętowe, usługa przechowywania kluczy lub podpisujący offline mogą zastąpić każdy z lokalnych keypair, o ile podpisują dokładnie te same bajty wiadomości.

Zamroź wiadomość przed podpisaniem

Każdy podpis obejmuje zserializowaną wiadomość transakcji. Wiadomość zawiera wszystkie poniższe elementy:

  • płatnika opłaty
  • ostatni blockhash lub durable nonce
  • adres każdego programu i konta
  • uprawnienia kont do podpisywania i zapisu
  • kolejność instrukcji i instruction data

Najpierw zbuduj te pola, zserializuj wiadomość tylko raz i przekaż tę tablicę bajtów każdemu podpisującemu. Warto przechowywać skrót wiadomości razem z każdym żądaniem podpisu, aby koordynator mógł odrzucić podpis zwrócony dla innej wiadomości.

Nie deserializuj wiadomości, nie zmieniaj jej i nie oczekuj, że wcześniej zebrane podpisy pozostaną ważne. Nawet zmiana, która wygląda na operacyjną, taka jak wymiana wygasłego blockhasha lub zmiana płatnika opłaty, wymaga ponownego podpisania przez każdego podpisującego.

Skoordynuj płatnika opłaty

Płatnik opłaty jest zawsze wymaganym podpisującym i musi zostać wybrany, zanim wiadomość zostanie zamrożona. Upewnij się, że konto ma wystarczającą ilość SOL na opłatę podstawową i ewentualną opłatę priorytetową. Jeśli opłatę zapłaci sponsor lub backend, umieść jego adres w wiadomości przed zebraniem podpisu użytkownika; dodanie sponsora później zmienia podpisane bajty.

Koordynator powinien zweryfikować, że przychodzący podpis należy do adresu wymienionego jako wymagany podpisujący. Nigdy nie akceptuj dowolnego klucza publicznego i nie dołączaj go do transakcji.

Zarządzanie okresem ważności transakcji

Transakcja z ostatnim blockhashem jest ważna tylko dopóki jej blockhash pozostaje w kolejce ostatnich blockhashy walidatora. Przed rozpoczęciem wielostronnego podpisywania oszacuj, czy wszyscy podpisujący zdążą odpowiedzieć przed lastValidBlockHeight.

Jeśli blockhash wygaśnie, zbuduj nową wiadomość ze świeżym blockhashem i zbierz wszystkie podpisy ponownie. W przypadku procesów, które mogą trwać dłużej lub obejmować podpisujących offline, użyj durable nonce. Durable nonce pozwala uniknąć okna ostatniego blockhasha, ale przesunięcie lub inne zużycie tego nonce nadal unieważnia oczekującą transakcję.

Weryfikacja przed przesłaniem

Dla każdego zwróconego podpisu:

  1. Zweryfikuj podpis względem zamrożonych bajtów wiadomości i oczekiwanego klucza publicznego podpisującego.
  2. Dołącz go do miejsca tego podpisującego w tablicy podpisów transakcji.
  3. Sprawdź, czy złożona transakcja zawiera prawidłowe podpisy wszystkich wymaganych podpisujących.
  4. Prześlij zserializowaną transakcję bez ponownego budowania jej wiadomości.

Po przesłaniu potwierdź transakcję, używając tych samych informacji o okresie ważności, które zostały zawarte w podpisanej wiadomości. Jeśli potwierdzenie zgłasza wygasły blockhash lub zużyty nonce, nie ponawiaj próby ze zmodyfikowaną transakcją; rozpocznij proces podpisywania od nowa.

Is this page helpful?

Spis treści

Edytuj stronę