Verify signatures from signed messages to authenticate users or validate transactions using CosmJS.

Prerequisites

Setup CosmJS Libraries

Verify Signatures

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>
  );
}

Next Steps