fetchWitnessListForClaim function

List<WitnessData> fetchWitnessListForClaim(
  1. BeaconState beaconState,
  2. dynamic params,
  3. int timestampS
)

Implementation

List<WitnessData> fetchWitnessListForClaim(
  BeaconState beaconState,
  dynamic params,
  int timestampS,
) {
  final String identifier = params is String
      ? params
      : getIdentifierFromClaimInfo(params as ClaimInfo);
  final completeInput = [
    identifier,
    beaconState.epoch.toString(),
    beaconState.witnessesRequiredForClaim.toString(),
    timestampS.toString(),
  ].join('\n');

  final completeHash =
      keccak256(Uint8List.fromList(utf8.encode(completeInput)));
  final completeHashView = ByteData.view(completeHash.buffer);
  final witnessesLeft = List<WitnessData>.from(beaconState.witnesses);
  final selectedWitnesses = <WitnessData>[];
  var byteOffset = 0;

  for (var i = 0; i < beaconState.witnessesRequiredForClaim; i++) {
    final randomSeed = completeHashView.getUint32(byteOffset, Endian.big);
    final witnessIndex = randomSeed % witnessesLeft.length;
    final witness = witnessesLeft[witnessIndex];
    selectedWitnesses.add(witness);

    witnessesLeft[witnessIndex] = witnessesLeft.last;
    witnessesLeft.removeLast();
    byteOffset = (byteOffset + 4) % completeHash.length;
  }

  return selectedWitnesses;
}