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)
如果您想验证签名,您还需要签名的数据,并使用底层验证程序:
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