UNPKG

@btc-vision/transaction

Version:

OPNet transaction library allows you to create and sign transactions for the OPNet network.

44 lines (43 loc) 1.67 kB
import * as ecc from '@bitcoinerlab/secp256k1'; import { crypto, toXOnly } from '@btc-vision/bitcoin'; import { TweakedSigner } from '../signer/TweakedSigner.js'; import { EcKeyPair } from './EcKeyPair.js'; class MessageSignerBase { sha256(message) { return crypto.sha256(Buffer.from(message)); } tweakAndSignMessage(keypair, message, network) { const tweaked = TweakedSigner.tweakSigner(keypair, { network, }); return this.signMessage(tweaked, message); } signMessage(keypair, message) { if (typeof message === 'string') { message = Buffer.from(message, 'utf-8'); } if (!keypair.privateKey) { throw new Error('Private key not found in keypair.'); } const hashedMessage = this.sha256(message); return { signature: ecc.signSchnorr(hashedMessage, keypair.privateKey), message: hashedMessage, }; } verifySignature(publicKey, message, signature) { if (typeof message === 'string') { message = Buffer.from(message, 'utf-8'); } if (signature.length !== 64) { throw new Error('Invalid signature length.'); } const hashedMessage = this.sha256(message); return ecc.verifySchnorr(hashedMessage, toXOnly(Buffer.from(publicKey)), signature); } tweakAndVerifySignature(publicKey, message, signature) { const tweakedPublicKey = EcKeyPair.tweakPublicKey(Buffer.from(publicKey)); return this.verifySignature(tweakedPublicKey, message, signature); } } export const MessageSigner = new MessageSignerBase();