Verify message and transaction signatures using CosmJS
Verify signatures from signed messages to authenticate users or validate transactions using CosmJS.
import { verifyAminoSignature, verifyDirectSignature } from "@cosmjs/stargate";
import { fromBase64 } from "@cosmjs/encoding";
import { Secp256k1, Secp256k1Signature } from "@cosmjs/crypto";
function SignatureVerification() {
const verifySignature = async () => {
const pubkeyBase64 = "A08EGB7ro1ORuFhjOnZcSgwYlpe0DSFjVNUIkNNQxwKQ";
const signatureBase64 = "MEUCIQD02fsDPra8MtbRxG1CcjHnCDNrsyL0K0WDlhSAb9c1SgIgavB5559FUxuFMRkURerN6Ws6foXEP1pYSe0tYb2qvxE=";
const pubkey = fromBase64(pubkeyBase64);
const signature = fromBase64(signatureBase64);
const signDoc = {
chain_id: "cosmoshub-4",
account_number: "0",
sequence: "0",
fee: {
amount: [],
gas: "0",
},
msgs: [],
memo: "Sign this message to authenticate with Para",
};
try {
const isValid = await verifyAminoSignature(
signDoc,
{ pub_key: { type: "tendermint/PubKeySecp256k1", value: pubkeyBase64 }, signature: signatureBase64 }
);
console.log("Amino signature valid:", isValid);
const message = new TextEncoder().encode("Hello Para!");
const secp256k1 = await Secp256k1.makeKeypair(pubkey);
const sig = Secp256k1Signature.fromFixedLength(signature);
const directValid = await Secp256k1.verifySignature(sig, message, secp256k1.pubkey);
console.log("Direct signature valid:", directValid);
} catch (error) {
console.error("Verification failed:", error);
}
};
return (
<button onClick={verifySignature}>Verify Signature</button>
);
}