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
JavaScript
;
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;