zcash-primitives-js/src/proof_witness.js

129 lines
2.8 KiB
JavaScript

'use strict'
var bufferutils = require('./bufferutils')
var typeforce = require('typeforce')
var types = require('./types')
var zconst = require('./const')
var JSInput = require('./jsinput')
var Note = require('./note')
function JSProofWitness (phi, rt, hSig, inputs, notes, vpubOld, vpubNew) {
typeforce(types.tuple(
types.Buffer252bit,
types.Buffer256bit,
types.Buffer256bit,
[types.JSInput],
[types.Note],
types.Zatoshi,
types.Zatoshi
), arguments)
this.phi = phi
this.rt = rt
this.hSig = hSig
this.inputs = inputs
this.notes = notes
this.vpub_old = vpubOld
this.vpub_new = vpubNew
}
JSProofWitness.fromBuffer = function (buffer, __noStrict) {
var offset = 0
function readSlice (n) {
offset += n
return buffer.slice(offset - n, offset)
}
function readUInt64 () {
var i = bufferutils.readUInt64LE(buffer, offset)
offset += 8
return i
}
function readJSInput () {
var input = JSInput.fromBuffer(buffer.slice(offset), true)
offset += input.byteLength()
return input
}
function readNote () {
var proof = Note.fromBuffer(buffer.slice(offset), true)
offset += proof.byteLength()
return proof
}
var phi = readSlice(32)
var rt = readSlice(32)
var hSig = readSlice(32)
var inputs = []
for (var i = 0; i < zconst.ZC_NUM_JS_INPUTS; ++i) {
inputs.push(readJSInput())
}
var notes = []
for (i = 0; i < zconst.ZC_NUM_JS_OUTPUTS; ++i) {
notes.push(readNote())
}
var vpubOld = readUInt64()
var vpubNew = readUInt64()
var witness = new JSProofWitness(phi, rt, hSig, inputs, notes, vpubOld, vpubNew)
if (__noStrict) return witness
if (offset !== buffer.length) throw new Error('JSProofWitness has unexpected data')
return witness
}
JSProofWitness.fromHex = function (hex) {
return JSProofWitness.fromBuffer(Buffer.from(hex, 'hex'))
}
JSProofWitness.prototype.byteLength = function () {
return (
112 +
this.inputs.reduce(function (sum, input) { return sum + input.byteLength() }, 0) +
this.notes.reduce(function (sum, note) { return sum + note.byteLength() }, 0)
)
}
JSProofWitness.prototype.toBuffer = function () {
var buffer = Buffer.alloc(this.byteLength())
var offset = 0
function writeSlice (slice) {
slice.copy(buffer, offset)
offset += slice.length
}
function writeUInt64 (i) {
bufferutils.writeUInt64LE(buffer, i, offset)
offset += 8
}
writeSlice(this.phi)
writeSlice(this.rt)
writeSlice(this.hSig)
this.inputs.forEach(function (input) {
writeSlice(input.toBuffer())
})
this.notes.forEach(function (note) {
writeSlice(note.toBuffer())
})
writeUInt64(this.vpub_old)
writeUInt64(this.vpub_new)
return buffer
}
JSProofWitness.prototype.toHex = function () {
return this.toBuffer().toString('hex')
}
module.exports = JSProofWitness