generate method

Uint8List generate(
  1. int startEpoch,
  2. int endEpoch
)

Implementation

Uint8List generate(int startEpoch, int endEpoch) {
  const HEADER_SIZE = 80;
  const EPOCH_ENTRY_SIZE = 96;

  var numEpochs = endEpoch - startEpoch + 1;
  var buffer = ByteData(HEADER_SIZE + (EPOCH_ENTRY_SIZE * numEpochs));

  buffer.setUint64(0, startEpoch, Endian.little); // start key identifier
  buffer.setUint64(8, endEpoch, Endian.little); // end key identifier
  setUint64(buffer, 16, 0xFFFFFFFF, 0xFFFFFFFF, Endian.little); // reserved - last (used) key identifier
  setUint64(buffer, 24, 0xFFFFFFFF, 0xFFFFFFFF, Endian.little); // reserved - last wiped key identifier

  setBuffer(buffer, 32, rootKeyPair.publicKey.bytes); // root voting public key
  buffer.setUint64(64, startEpoch, Endian.little); // level 1/1 start key identifier
  buffer.setUint64(72, endEpoch, Endian.little); // level 1/1 end key identifier

  for (var i = 0; i < numEpochs; i++) {
    var identifier = endEpoch - i;
    var childPrivateKey = privateKeyGenerator();
    var childKeyPair = KeyPair(childPrivateKey);

    var parentSignedPayloadBuffer = ByteData(40);
    setBuffer(parentSignedPayloadBuffer, 0, childKeyPair.publicKey.bytes);
    parentSignedPayloadBuffer.setUint64(32, identifier, Endian.little);
    var signature = rootKeyPair.sign(parentSignedPayloadBuffer.buffer.asUint8List());

    var startOffset = HEADER_SIZE + (EPOCH_ENTRY_SIZE * i);
    setBuffer(buffer, startOffset, childKeyPair.privateKey.bytes); // child voting private key used to sign votes for an epoch
    setBuffer(buffer, startOffset + PrivateKey.SIZE, signature.bytes); // signature proving derivation of child key pair from root
  }

  return buffer.buffer.asUint8List();
}