UNPKG

navio-blsct

Version:

TypeScript bindings for the `libblsct` library used by the [Navio](https://nav.io/) blockchain to construct confidential transactions based on the BLS12-381 curve.

111 lines (110 loc) 4.44 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RangeProof = void 0; const blsct_1 = require("./blsct"); const amountRecoveryRes_1 = require("./amountRecoveryRes"); const managedObj_1 = require("./managedObj"); const point_1 = require("./point"); const scalar_1 = require("./scalar"); const tokenId_1 = require("./tokenId"); class RangeProof extends managedObj_1.ManagedObj { constructor(obj) { super(obj); } static generate(amounts, nonce, msg, tokenId) { tokenId = tokenId ?? tokenId_1.TokenId.default(); const vec = (0, blsct_1.createUint64Vec)(); for (const amount of amounts) { (0, blsct_1.addToUint64Vec)(vec, amount); } const rv = (0, blsct_1.buildRangeProof)(vec, nonce.value(), msg, tokenId.value()); (0, blsct_1.freeUint64Vec)(vec); if (rv.result !== 0) { (0, blsct_1.freeObj)(rv); console.log(`exception 1`); throw new Error(`Building range proof failed. Error code = ${rv.result}`); } const x = RangeProof.fromObjAndSize(rv.value, rv.value_size); (0, blsct_1.freeObj)(rv); return x; } verifyProofs(proofs) { const vec = (0, blsct_1.createRangeProofVec)(); for (const proof of proofs) { (0, blsct_1.addRangeProofToVec)(vec, proof.size(), proof.value()); } const rv = (0, blsct_1.verifyRangeProofs)(vec); if (rv.result !== 0) { (0, blsct_1.freeObj)(rv); throw new Error(`Verifying range proofs failed. Error code = ${rv.result}`); } (0, blsct_1.freeRangeProofVec)(vec); return rv.value; } recoverAmounts(reqs) { const reqVec = (0, blsct_1.createAmountRecoveryReqVec)(); for (const req of reqs) { const blsctReq = (0, blsct_1.genAmountRecoveryReq)(req.rangeProof.value(), req.rangeProof.size(), req.nonce.value()); (0, blsct_1.addToAmountRecoveryReqVec)(reqVec, blsctReq); } const rv = (0, blsct_1.recoverAmount)(reqVec); (0, blsct_1.freeAmountRecoveryReqVec)(reqVec); if (rv.result !== 0) { (0, blsct_1.freeAmountsRetVal)(rv); throw new Error(`Recovering amount failed. Error code = ${rv.result}`); } let results = []; const size = (0, blsct_1.getAmountRecoveryResultSize)(rv.value); for (let i = 0; i < size; ++i) { const isSucc = (0, blsct_1.getAmountRecoveryResultIsSucc)(rv.value, i); const amount = (0, blsct_1.getAmountRecoveryResultAmount)(rv.value, i); const msg = (0, blsct_1.getAmountRecoveryResultMsg)(rv.value, i); const x = new amountRecoveryRes_1.AmountRecoveryRes(isSucc, amount, msg); results.push(x); } (0, blsct_1.freeAmountsRetVal)(rv); return results; } value() { return (0, blsct_1.castToRangeProof)(this.obj); } serialize() { return (0, blsct_1.serializeRangeProof)(this.value(), this.size()); } static deserialize(hex) { return RangeProof._deserialize(hex, blsct_1.deserializeRangeProof); } get_A() { const obj = (0, blsct_1.getRangeProof_A)(this.value(), this.size()); return point_1.Point.fromObj(obj); } get_A_wip() { const obj = (0, blsct_1.getRangeProof_A_wip)(this.value(), this.size()); return point_1.Point.fromObj(obj); } get_B() { const obj = (0, blsct_1.getRangeProof_B)(this.value(), this.size()); return point_1.Point.fromObj(obj); } get_r_prime() { const obj = (0, blsct_1.getRangeProof_r_prime)(this.value(), this.size()); return scalar_1.Scalar.fromObj(obj); } get_s_prime() { const obj = (0, blsct_1.getRangeProof_s_prime)(this.value(), this.size()); return scalar_1.Scalar.fromObj(obj); } get_delta_prime() { const obj = (0, blsct_1.getRangeProof_delta_prime)(this.value(), this.size()); return scalar_1.Scalar.fromObj(obj); } get_alpha_hat() { const obj = (0, blsct_1.getRangeProof_alpha_hat)(this.value(), this.size()); return scalar_1.Scalar.fromObj(obj); } get_t_aux() { const obj = (0, blsct_1.getRangeProof_t_aux)(this.value(), this.size()); return scalar_1.Scalar.fromObj(obj); } } exports.RangeProof = RangeProof;