@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
JavaScript
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();