Подписание офлайн-транзакций
Некоторые модели безопасности требуют хранения ключей подписи и, следовательно, процесса подписи отдельно от создания транзакций и широковещательной рассылки по сети. Примеры включают:
- Сбор подписей от географически разрозненных подписантов в схеме с несколькими подписями
- Подписание транзакций с помощью устройства для подписи 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 может дать вам необходимое дополнительное время.