UNPKG

@ellcrys/spell

Version:

The official JavaScript library for Ellcrys

74 lines (70 loc) 1.75 kB
/** * @module TxUtility */ import msgpack = require("msgpack5"); import { PrivateKey } from ".."; import { Transaction } from "../../.."; const blake2 = require("blake2"); /** * TxUtility provides transaction * processing functions to be used * by other modules. * * @class TxUtility */ export default class TxUtility { /** * Returns the byte equivalent of * a given transaction but does not * include the transaction `hash` and * `sig` fields * * @param {Transaction} tx The transaction * @returns {Buffer} * @memberof TxUtility */ public getBytesNoHashAndSig(tx: Transaction): Buffer { const data = [ tx.fee, tx.from, null, // reserved for invoke args tx.nonce, tx.senderPubKey, tx.timestamp, tx.to, tx.type, tx.value, ]; return msgpack() .encode(data) .slice(0); } /** * Compute and return the hash of a transaction * * @param {Transaction} tx The transaction * @param {string} [prefix="0x"] Add a prefix to the hash * @returns {string} * @memberof TxUtility */ public hash(tx: Transaction, prefix = "0x"): string { const data = this.getBytesNoHashAndSig(tx); const h = blake2.createHash("blake2b", { digestLength: 32 }); h.update(data); return prefix + h.digest("hex"); } /** * Sign and return a signature of the * transaction. * * @param {Transaction} tx The transaction * @param {PrivateKey} sk The private key to use for signing * @param {string} [prefix="0x"] A prefix to add to the signature * @returns {string} An hex string * @memberof TxUtility */ public sign(tx: Transaction, sk: PrivateKey, prefix = "0x"): string { const data = this.getBytesNoHashAndSig(tx); return prefix + sk.sign(data).toString("hex"); } }