Подписание офлайн-транзакций
Некоторые модели безопасности требуют хранения ключей подписи и, следовательно, процесса подписи отдельно от создания транзакций и широковещательной рассылки по сети. Примеры включают:
- Сбор подписей от географически разрозненных подписантов в схеме с несколькими подписями
- Подписание транзакций с помощью устройства для подписи airgapped
В этом документе описывается использование интерфейса командной строки Solana для отдельной подписи и отправки транзакции.
Команды, поддерживающие автономную подпись
В настоящее время автономную подпись поддерживают следующие команды:
Подписание транзакций в автономном режиме
Чтобы подписать транзакцию в автономном режиме, передайте следующие аргументы в командной строке.
- --sign-onlyзапрещает клиенту отправлять подписанную транзакцию в сеть. Вместо этого пары открытый ключ/подпись выводятся на стандартный вывод.
- --blockhash BASE58_HASHпозволяет вызывающей стороне указать значение, используемое для заполнения поля транзакции- recent_blockhash. Это служит ряду целей, а именно: _ Устраняет необходимость подключения к сети и запроса последнего хэша блока через RPC _ Позволяет подписывающим сторонам координировать хеш блока в схеме с несколькими подписями
Пример: автономная подпись платежа
Команда
solana@offline$ solana pay --sign-only --blockhash 5Tx8F3jgSHx21CbtjwmdaKPLM5tWmreWAnPrbqHomSJF \
    recipient-keypair.json 1
Вывод
Blockhash: 5Tx8F3jgSHx21CbtjwmdaKPLM5tWmreWAnPrbqHomSJF
Signers (Pubkey=Signature):
  FhtzLVsmcV7S5XqGD79ErgoseCLhZYmEZnz9kQg1Rp7j=4vC38p4bz7XyiXrk6HtaooUqwxTWKocf45cstASGtmrD398biNJnmTcUCVEojE7wVQvgdYbjHJqRFZPpzfCQpmUN
{"blockhash":"5Tx8F3jgSHx21CbtjwmdaKPLM5tWmreWAnPrbqHomSJF","signers":["FhtzLVsmcV7S5XqGD79ErgoseCLhZYmEZnz9kQg1Rp7j=4vC38p4bz7XyiXrk6HtaooUqwxTWKocf45cstASGtmrD398biNJnmTcUCVEojE7wVQvgdYbjHJqRFZPpzfCQpmUN"]}'
Отправка автономных подписанных транзакций в сеть
Чтобы отправить транзакцию, подписанную в автономном режиме, в сеть, передайте следующие аргументы в командной строке.
- --blockhash BASE58_HASHдолжен быть тем же хэшем, который использовался для подписи.
- --signer BASE58_PUBKEY=BASE58_SIGNATURE, по одному для каждого подписавшего в автономном режиме. Это включает в себя пары открытого ключа/подписи непосредственно в транзакции, а не ее подписание какой-либо локальной парой ключей.
Пример: отправка платежа с подписью в автономном режиме
Команда
solana@online$ solana pay --blockhash 5Tx8F3jgSHx21CbtjwmdaKPLM5tWmreWAnPrbqHomSJF \
    --signer FhtzLVsmcV7S5XqGD79ErgoseCLhZYmEZnz9kQg1Rp7j=4vC38p4bz7XyiXrk6HtaooUqwxTWKocf45cstASGtmrD398biNJnmTcUCVEojE7wVQvgdYbjHJqRFZPpzfCQpmUN
    recipient-keypair.json 1
Вывод
4vC38p4bz7XyiXrk6HtaooUqwxTWKocf45cstASGtmrD398biNJnmTcUCVEojE7wVQvgdYbjHJqRFZPpzfCQpmUN
Автономный вход в течение нескольких сеансов
Подписание в автономном режиме также может выполняться в течение нескольких сеансов. В этом случае передайте открытый ключ отсутствующей подписывающей стороны для каждой роли. Все публичные ключи, которые были указаны, но для которых не была сгенерирована подпись, будут указаны как отсутствующие в выходных данных автономной подписи.
Пример: передача с двумя автономными сеансами подписи
Команда (оффлайн сеанс № 1)
solana@offline1$ solana transfer Fdri24WUGtrCXZ55nXiewAj6RM18hRHPGAjZk3o6vBut 10 \
    --blockhash 7ALDjLv56a8f6sH6upAZALQKkXyjAwwENH9GomyM8Dbc \
    --sign-only \
    --keypair fee_payer.json \
    --from 674RgFMgdqdRoVtMqSBg7mHFbrrNm1h1r721H1ZMquHL
Вывод (оффлайн сеанс № 1)
Blockhash: 7ALDjLv56a8f6sH6upAZALQKkXyjAwwENH9GomyM8Dbc
Signers (Pubkey=Signature):
  3bo5YiRagwmRikuH6H1d2gkKef5nFZXE3gJeoHxJbPjy=ohGKvpRC46jAduwU9NW8tP91JkCT5r8Mo67Ysnid4zc76tiiV1Ho6jv3BKFSbBcr2NcPPCarmfTLSkTHsJCtdYi
Absent Signers (Pubkey):
  674RgFMgdqdRoVtMqSBg7mHFbrrNm1h1r721H1ZMquHL
Команда (оффлайн сеанс № 2)
solana@offline2$ solana transfer Fdri24WUGtrCXZ55nXiewAj6RM18hRHPGAjZk3o6vBut 10 \
    --blockhash 7ALDjLv56a8f6sH6upAZALQKkXyjAwwENH9GomyM8Dbc \
    --sign-only \
    --keypair from.json \
    --fee-payer 3bo5YiRagwmRikuH6H1d2gkKef5nFZXE3gJeoHxJbPjy
Вывод (оффлайн сеанс № 2)
Blockhash: 7ALDjLv56a8f6sH6upAZALQKkXyjAwwENH9GomyM8Dbc
Signers (Pubkey=Signature):
  674RgFMgdqdRoVtMqSBg7mHFbrrNm1h1r721H1ZMquHL=3vJtnba4dKQmEAieAekC1rJnPUndBcpvqRPRMoPWqhLEMCty2SdUxt2yvC1wQW6wVUa5putZMt6kdwCaTv8gk7sQ
Absent Signers (Pubkey):
  3bo5YiRagwmRikuH6H1d2gkKef5nFZXE3gJeoHxJbPjy
Команда (онлайн сеанс)
solana@online$ solana transfer Fdri24WUGtrCXZ55nXiewAj6RM18hRHPGAjZk3o6vBut 10 \
    --blockhash 7ALDjLv56a8f6sH6upAZALQKkXyjAwwENH9GomyM8Dbc \
    --from 674RgFMgdqdRoVtMqSBg7mHFbrrNm1h1r721H1ZMquHL \
    --signer 674RgFMgdqdRoVtMqSBg7mHFbrrNm1h1r721H1ZMquHL=3vJtnba4dKQmEAieAekC1rJnPUndBcpvqRPRMoPWqhLEMCty2SdUxt2yvC1wQW6wVUa5putZMt6kdwCaTv8gk7sQ \
    --fee-payer 3bo5YiRagwmRikuH6H1d2gkKef5nFZXE3gJeoHxJbPjy \
    --signer 3bo5YiRagwmRikuH6H1d2gkKef5nFZXE3gJeoHxJbPjy=ohGKvpRC46jAduwU9NW8tP91JkCT5r8Mo67Ysnid4zc76tiiV1Ho6jv3BKFSbBcr2NcPPCarmfTLSkTHsJCtdYi
Вывод (онлайн сеанс)
ohGKvpRC46jAduwU9NW8tP91JkCT5r8Mo67Ysnid4zc76tiiV1Ho6jv3BKFSbBcr2NcPPCarmfTLSkTHsJCtdYi
Выиграйте больше времени для подписания
Обычно транзакция Solana должна быть подписана и принята сетью в пределах нескольких слотов от хэша блока в его поле recent_blockhash (~ 1 минута на момент написания этой статьи). Если ваша процедура подписания занимает больше времени, Durable Transaction Nonce может дать вам необходимое дополнительное время.
 Dudochkin Victor
        Dudochkin Victor