@wavesenterprise/voting-encrypt
TypeScript icon, indicating that this package has built-in type declarations

3.1.0 • Public • Published

Usage example

Get params and encrypt one bulletin

// Get config from cryptolib GET /v1/getParamSet. E.g https://voting.welocal.dev/cryptoService/v1/getParamSet
const cryplolibParams = {
	"a": "0",
	"b": "7",
	"basePoint": [
		"55066263022277343669578718895168534326250603453777594175500187360389116729240",
		"32670510020758816978083085130507043184471273380659243275938904335757337482424"
	],
	"hashLength": "256",
	"p": "115792089237316195423570985008687907853269984665640564039457584007908834671663",
	"pedersenBase": [
		"31840000124805594708716908823730049919282872088758887139161784794466556143989",
		"34159713578909946807425318728956240239794987299568203108985430402093588737051"
	],
	"q": "115792089237316195423570985008687907852837564279074904382605163141518161494337",
}

/* Dimesion type
 *  [
 *    [
 *      min: number,      // minimum amount of selected options
 *      max: number,      // maximum amount of selected options
 *      total: number   // total options num in question
 *    ],
 *    ..
 *  ]
 */
const dimension = [[1,1,2],[1,2,3]]

// get from poll info. e.g https://voting-dev.welocal.dev/decryptServiceMaster/v1/poll/2012
// everything except mainKey will be constant after poll creation.
// Main key will be generated during dkg proccess before dateStart and then never changes.
const type='common'
const mainKey = [
	"57524282568728082791232576457478242943818952557343747344126049585929786788758",
	"38787228570461587633267528340413718686005272951935064150467570181538022969944",
]
const txId = '7RJXEBC73cELphuoQNKWmQFbDcrXgEenrAAPoVHAz1uF'
const multiplier=1

const weight = 1
// selected 1st option in the 1st question and 1st and 3rd in the 2dn question
const bulletin = [[1,0], [1,0,1]]

const encryptedBulletin = encrypt({
	...cryplolibParams,
	mainKey,
	type,
	dimension,
	bulletin,
})

console.log('encryptedBulletin', JSON.stringify(encryptedBulletin))

/// ...

Encode to bytes / Decode from bytes

// ...
const encrypted = encrypt(encryptOptions)
const binary = serialize(encrypted)
const decoded = deserialize(binary)
console.log(`Binary size: ${binary.length}`)

Calculating mainKey from Pedersen's commitments and scalars

const { mainKey, dkgCommits, dkgScalars } = {
  "mainKey": [
    "57524282568728082791232576457478242943818952557343747344126049585929786788758",
    "38787228570461587633267528340413718686005272951935064150467570181538022969944"
  ],
  "dkgScalars": [
    "60205190671371004052027574671005427581107002065061497157579481218698888136211",
    "59574457923147341647686899237823522695249872693694764462154125327640876089030",
    "62412122924432091887200600446458193045824422914909193997032220320572755918169"
  ],
  "dkgCommits": [
    {
      "x": "53223510927926924044821712271603075123426104274557218213053365857469041906786",
      "y": "63812211576732480897403235008742810396190456041389943747378921353807308231394"
    },
    {
      "x": "31487217581766849517295031273817794483626722217369663455992733898856595599183",
      "y": "82028928866030698176659688780576011462734544450397693113073209813925075425706"
    },
    {
      "x": "91417142484544224273770657056726197723275714351299031732568048344701157739195",
      "y": "111868356246544901009252079534910516693040811004478292518237552911866514740597"
    }
  ]
}

const keyPairs = dkgCommits
  .map(utils.mapPointTuple)
  .map((publicKey, i) => ({
    publicKey,
    privateKey: dkgScalars[i],
  }))

console.log('\nVerify main key:')
console.log('FROM BLOCKCHAIN:', mainKey)
console.log('COMPUTED:', calculateMainKey(config, keyPairs))

Bulletins and dimension generator

// generator settings
const bulletinsNum = 1
const questionsNum = 3
const optionsNum = 8
const maxSelected = 4
const minSelected = 0

const bulletins = Array(bulletinsNum)
  .fill(0)
  .map(() => Array(questionsNum)
    .fill(0)
    .map(() => {
      const selected = minSelected + Math.round(Math.random() * maxSelected - minSelected)
      return [
        ...Array(selected).fill(1),
        ...Array(optionsNum - selected).fill(0)
      ].sort(() => Math.random() - 0.5)
    })
  )

const dimension = Array(questionsNum)
	.fill(0)
	.map((_, i) => ([
		minSelected,
		maxSelected,
		bulletins[0][i].length
	]))

Readme

Keywords

none

Package Sidebar

Install

npm i @wavesenterprise/voting-encrypt

Weekly Downloads

0

Version

3.1.0

License

ISC

Unpacked Size

357 kB

Total Files

10

Last publish

Collaborators

  • stfy
  • sergeymart
  • nbugaev
  • wavesadmin
  • aklyavlin
  • dimalitvinov
  • mikhail.milekhin