fetchWitnessListForClaim function
List<WitnessData>
fetchWitnessListForClaim(
- BeaconState beaconState,
- dynamic params,
- 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;
}