我正在使用 Petra 钱包和 Aptos Typescript SDK 开发 dApp。 我可以在前端进行签名,但我不知道如何在 Nodejs 后端验证签名。我试图在他们的文档和 Github 上找到一种方法,但找不到。
环境: 前端:
"@aptos-labs/ts-sdk": "^1.2.0",
"@aptos-labs/wallet-adapter-react": "^2.1.2",
后端:
"@aptos-labs/ts-sdk": "^1.2.0",
简短回答,如果您确定目标钱包地址的身份验证方案是
Ed25519
import { Ed25519PublicKey, Ed25519Signature } from "@aptos-labs/ts-sdk";
const verifySignature = (
message: string,
signature: string,
publicKey: string
): boolean => {
return new Ed25519PublicKey(publicKey)
.verifySignature({
message: message,
signature: new Ed25519Signature(signature),
});
}
上下文:
深入挖掘
@aptos-labs/ts-sdk
的源代码后,我发现Aptos SDK有一个PublicKey
抽象类定义了verifySignature
接口,就像这样
export interface VerifySignatureArgs {
message: HexInput;
signature: Signature;
}
export abstract class PublicKey extends Serializable {
/**
* Verifies that the private key associated with this public key signed the message with the given signature.
* @param args.message The message that was signed
* @param args.signature The signature to verify
*/
abstract verifySignature(args: VerifySignatureArgs): boolean;
...
}
但问题是,如果你想创建
PublicKey
的实例,你需要知道该钱包地址使用什么 认证方案,没有辅助函数,所以你可能需要实现一些确定这一点的逻辑。
此外,
VerifySignatureArgs
的signature
参数是Signature
类型,并且这种类型也有多种实现,我假设您正在使用aptos-labs/aptos-wallet-adapter
的signMessage
函数来生成签名。在这种情况下,你将得到一个签名,该签名的类型是联合类型string | string[] | Signature
,你得到的具体类型将由不同的钱包实现决定,对于Petra来说,它是一个string
。因此,您将面临同样的问题 PublicKey
。