创建签名消息后,我不确定如何使用生成的签名来使用 publicKey 验证消息。
我的用例是,我想使用 Solana 钱包登录 API 服务器,其模式如下:
GET message: String (from API server)
sign message with privateKey
POST signature (to API server)
verify signature with stored publicKey
我尝试使用 nodeJScrypto.verify
来解码 API 端的签名消息,但是我对缓冲区和椭圆曲线的深入挖掘有点超出了我的深度:
// Front-end code
const toHexString = (buffer: Buffer) =>
buffer.reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), "");
const data = new TextEncoder().encode('message to verify');
const signed = await wallet.sign(data, "hex");
await setLogin({ // sends API post call to backend
variables: {
publicAddress: walletPublicKey,
signature: toHexString(signed.signature),
},
});
// Current WIP for backend code
const ALGORITHM = "ed25519";
const fromHexString = (hexString) =>
new Uint8Array(hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
const signature = fromHexString(args.signature);
const nonceUint8 = new TextEncoder().encode('message to verify');
const verified = crypto.verify(
ALGORITHM,
nonceUint8,
`-----BEGIN PUBLIC KEY-----\n${user.publicAddress}\n-----END PUBLIC KEY-----`,
signature
);
console.log("isVerified: ", verified);
我很确定我会以错误的方式解决这个问题,并且一定有一个明显的方法我错过了。
随着空间的成熟,我希望验证函数或库似乎会消耗const signed = await wallet.sign(data, "hex");
就像是:
import { VerifyMessage } from '@solana/web3.js';
const verified = VerifyMessage(message, publicKey, signature, 'hex');
但是经过 3 天的努力,我开始达到我的极限,我的大脑正在衰竭。非常感谢任何帮助或方向