如何在 phantom solana 中验证消息的签名?

SUM*_*ALE 5 javascript solana phantom-wallet solana-web3js

我试图通过使用下面的代码对消息进行签名的消息来对其进行身份验证,它会返回给我一个签名,我如何在后端验证该签名。

    const encodedMessage = new TextEncoder().encode("Message to sign");
    const signedMessage = await window.solana.request({
      method: "signMessage",
      params: {
        message: encodedMessage,
        display: "utf8", //hex,utf8
      },
    });
Run Code Online (Sandbox Code Playgroud)

这里签名的消息用公钥和签名来响应这个答案

{
    "publicKey": "Gy4xSKsLHXScRMVZgKt5f6BvDawp1JW8PrenA3GbakCK",
    "signature": "5BoNFSoV9WEafBnXon2ujPzH5zgjwZkXHL9vkHuUHEnc1AqLSN38LEx5XtAz68JFEt9RhvuhmPL3GkMPdMcQPuzN"
}
Run Code Online (Sandbox Code Playgroud)

Sce*_*eat 12

  • 在后端生成唯一的消息并将其保存在数据库中
  • 从前端请求
  • 通过提供商签署消息
  • 将结果发送到后端
  • 从数据库中检索消息
  • 根据收到的签名进行验证

前端

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)
  })
})
Run Code Online (Sandbox Code Playgroud)

后端

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)
  )
Run Code Online (Sandbox Code Playgroud)


Jon*_*n C 1

如果您想验证签名,您还需要签名的数据,并使用底层验证程序:

nacl.sign.detached.verify(signData, signature, publicKey.toBuffer())
Run Code Online (Sandbox Code Playgroud)

verifySignatures一般来说,您可能希望直接验证已签名的交易,而不是要求用户使用以下方法签署另一条消息Transaction: https: //github.com/solana-labs/solana/blob/d4e7ebf4f8821dfa59a1f278898cf9a7ad70ebd9/web3.js/src /交易.ts#L673