generateRandomAddress static method

Uint8List generateRandomAddress(
  1. Uint8List? tag,
  2. Uint8List secret, [
  3. RandomGenerator randomGenerator = randomBytes
])

Generates a random WOTS address using the randomGenerator Note: use your own randomGenerator that fills in deterministic bytes if you want to generate a specific address

Implementation

static Uint8List generateRandomAddress(
  Uint8List? tag,
  Uint8List secret, [
  RandomGenerator randomGenerator = randomBytes,
]) {
  if (secret.length != PARAMSN) {
    throw ArgumentError('Invalid secret length');
  }
  if (tag != null && tag.length != 12) {
    throw ArgumentError('Invalid tag length');
  }

  final address = Uint8List(2208);
  final rnd2 = Uint8List(PARAMSN);

  // Generate random bytes for address
  randomGenerator(address);

  // Copy random bytes to rnd2
  rnd2.setRange(0, PARAMSN, address, 2176);

  // Generate public key
  wotsPkgen(address, secret,
      address.sublist(WOTSSIGBYTES, WOTSSIGBYTES + PARAMSN), 0, rnd2);

  // Copy rnd2 back to address
  address.setRange(2176, 2208, rnd2);

  // Apply tag if provided using Tag.tag
  final readyAddress = tag != null ? Tag.tag(address, tag) : address;

  // Validate address
  for (int i = 0; i < 10; i++) {
    if (!isValid(secret, readyAddress, randomGenerator)) {
      throw ArgumentError('Invalid WOTS');
    }
  }

  return readyAddress;
}