как проверить подпись сообщения в фантомной солане?
Я пытаюсь аутентифицировать фантомный кошелек, подписав его сообщением, которое я использовал ниже кода, чтобы подписать сообщение, и оно возвращает мне подпись, как я могу проверить эту подпись в бэкэнде.
const encodedMessage = new TextEncoder().encode("Message to sign");
const signedMessage = await window.solana.request({
method: "signMessage",
params: {
message: encodedMessage,
display: "utf8", //hex,utf8
},
});
Здесь подписанное сообщение отвечает этим ответом с открытым ключом и подписью
{
"publicKey": "Gy4xSKsLHXScRMVZgKt5f6BvDawp1JW8PrenA3GbakCK",
"signature": "5BoNFSoV9WEafBnXon2ujPzH5zgjwZkXHL9vkHuUHEnc1AqLSN38LEx5XtAz68JFEt9RhvuhmPL3GkMPdMcQPuzN"
}
2 ответа
- сгенерировать уникальное сообщение на бэкенде и сохранить его в своей базе данных
- запросить его из внешнего интерфейса
- подписать сообщение через провайдера
- отправить этот результат на сервер
- получить сообщение из базы данных
- сверить его с полученной подписью
Внешний интерфейс
import bs58 from 'bs58'
const message_from_backend = 'hello world'
const { signature, publicKey } = window
.solana
.signMessage(
new TextEncoder().encode(message_from_backend),
'utf8'
)
fetch('/backend', {
method: 'POST',
body: JSON.stringify({
public_key: publicKey.toBase58(),
signature: bs58.encode(signature)
})
})
Бэкенд
import nacl from 'tweetnacl'
import bs58 from 'bs58'
const message = 'hello world'
const { public_key, signature } = received_from_frontend
const verified = nacl
.sign
.detached
.verify(
new TextEncoder().encode(message),
bs58.decode(signature),
bs58.decode(public_key)
)
Если вы хотите проверить подпись, вам также потребуются подписанные данные и используйте базовый верификатор как:
nacl.sign.detached.verify(signData, signature, publicKey.toBuffer())
В общем, вы можете захотеть напрямую проверить подписанную транзакцию, а не просить пользователя подписать другое сообщение, используя
verifySignatures
метод на
Transaction
: https://github.com/solana-labs/solana/blob/d4e7ebf4f8821dfa59a1f278898cf9a7ad70ebd9/web3.js/src/transaction.ts#L673