Часткове підписання дозволяє кільком сторонам підписувати одну й ту саму транзакцію в різний час або на різних пристроях. Координатор створює повідомлення, кожен необхідний підписант підписує точні серіалізовані байти повідомлення, а координатор перевіряє й об’єднує підписи перед надсиланням.
Підписи авторизують байти, а не наміри
Зміна платника комісії, blockhash, порядку інструкцій, списку акаунтів або будь-яких instruction data створює інше повідомлення й анулює всі підписи, які вже були зібрані.
Процес часткового підписання
- Узгодьте інструкції транзакції та того, хто сплачуватиме комісію.
- Встановіть строк дії транзакції та платника комісії.
- Серіалізуйте повідомлення один раз. Вважайте ці байти незмінними.
- Передайте байти повідомлення та зрозумілий для людини опис кожному підписанту.
- Зберіть і перевірте кожен підпис Ed25519 щодо тих самих байтів повідомлення.
- Прикріпіть підписи до адрес відповідних обов’язкових підписантів.
- Переконайтеся, що всі обов’язкові підписи присутні та дійсні, а потім надішліть транзакцію.
Повний приклад
Платник комісії та відправник SOL нижче підписують незалежно один від одного. Координатор перевіряєобидва підписи, об’єднує їх і надсилає готову транзакцію.
У прикладі використовується низькорівневе підписання Ed25519, щоб чітко позначити межу між координатором і кожним підписантом. Гаманець, апаратний пристрій, служба зберігання або офлайн-підписант можуть замінити будь-яку локальну keypair, якщо вони підписують точно ті самі байти повідомлення.
Зафіксуйте повідомлення перед підписанням
Кожен підпис охоплює серіалізоване повідомлення транзакції. Повідомлення містить усе перелічене нижче:
- платника комісії
- актуальний blockhash або довговічний nonce
- адресу кожної програми та кожного акаунта
- дозволи акаунтів на підписання та запис
- порядок інструкцій та instruction data
Спочатку сформуйте ці поля, серіалізуйте повідомлення один раз і передайте цей масив байтів кожному підписанту. Корисно зберігати дайджест повідомлення разом із кожним запитом на підписання, щоб координатор міг відхилити підпис, повернений для іншого повідомлення.
Не десеріалізуйте повідомлення, не змінюйте його й не очікуйте, що раніше зібрані підписи залишаться дійсними. Навіть зміна, яка здається операційною, наприклад заміна прострочленого blockhash або зміна платника комісії, вимагає, щоб кожен підписант підписав повторно.
Узгодьте платника комісії
Платник комісії завжди є обов’язковим підписантом, і його необхідно обрати до того, як повідомлення буде зафіксовано. Переконайтеся, що на акаунті достатньо SOL для базової комісії та будь-якої пріоритетної комісії. Якщо комісію сплачуватиме спонсор або бекенд, додайте його адресу до повідомлення до збору підпису користувача: додавання спонсора пізніше змінює підписані байти.
Координатор має перевірити, що вхідний підпис належить адресі, яка вказана серед обов’язкових підписантів. Ніколи не приймайте довільний публічний ключ і не додавайте його до транзакції.
Керування строком дії транзакції
Транзакція з нещодавнім blockhash дійсна лише доти, доки її blockhash залишається в черзі
нещодавніх blockhash validator. Перш ніж починати багатосторонній процес підписання,
оцініть, чи зможуть усі підписанти відповісти до lastValidBlockHeight.
Якщо blockhash прострочується, створіть нове повідомлення зі свіжим blockhash і зберіть усі підписи знову. Для процесів, які можуть тривати довше або включати офлайн- підписантів, використовуйте довговічний nonce. Довговічний nonce дозволяє уникнути обмеження вікна нещодавнього blockhash, але просування або інше використання цього nonce все одно анулює транзакцію, що очікує на надсилання.
Перевірка перед надсиланням
Для кожного отриманого підпису:
- Перевірте підпис щодо зафіксованих байтів повідомлення та очікуваного публічного ключа підписанта.
- Прикріпіть його до місця цього підписанта в масиві підписів транзакції.
- Переконайтеся, що зібрана транзакція має дійсні підписи від кожного обов’язкового підписанта.
- Надішліть серіалізовану транзакцію, не перебудовуючи її повідомлення.
Після надсилання підтверджуйте транзакцію, використовуючи ту саму інформацію про строк дії, що була включена у підписане повідомлення. Якщо підтвердження повідомляє про прострочений blockhash або використаний nonce, не повторюйте спробу зі зміненою транзакцією; перезапустіть процес підписання.
Is this page helpful?