как проверить подпись сообщения в фантомной солане?

Я пытаюсь аутентифицировать фантомный кошелек, подписав его сообщением, которое я использовал ниже кода, чтобы подписать сообщение, и оно возвращает мне подпись, как я могу проверить эту подпись в бэкэнде.

          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

Другие вопросы по тегам