latency_entropy.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /* eslint-disable @typescript-eslint/restrict-plus-operands */
  2. /* eslint-disable @typescript-eslint/restrict-template-expressions */
  3. /* eslint-disable @typescript-eslint/no-unsafe-member-access */
  4. /* eslint-disable no-console */
  5. /* eslint-disable @typescript-eslint/no-unsafe-assignment */
  6. import yargs from "yargs";
  7. import { hideBin } from "yargs/helpers";
  8. import { COMMON_DEPLOY_OPTIONS, findEntropyContract } from "./common";
  9. import { toPrivateKey } from "../src/core/base";
  10. import { EvmChain } from "../src/core/chains";
  11. import { DefaultStore } from "../src/node/utils/store";
  12. const parser = yargs(hideBin(process.argv))
  13. .usage(
  14. "Requests and reveals a random number from an entropy contract while measuing the\n" +
  15. "latency between request submission and availablity of the provider revelation from fortuna.\n" +
  16. "Usage: $0 --chain <chain-id> --private-key <private-key>",
  17. )
  18. .options({
  19. chain: {
  20. type: "string",
  21. demandOption: true,
  22. desc: "test latency for the contract on this chain",
  23. },
  24. "private-key": COMMON_DEPLOY_OPTIONS["private-key"],
  25. });
  26. async function main() {
  27. const argv = await parser.argv;
  28. const chain = DefaultStore.getChainOrThrow(argv.chain, EvmChain);
  29. const contract = findEntropyContract(chain);
  30. const provider = await contract.getDefaultProvider();
  31. const providerInfo = await contract.getProviderInfo(provider);
  32. const userRandomNumber = contract.generateUserRandomNumber();
  33. const privateKey = toPrivateKey(argv.privateKey);
  34. const requestResponse = await contract.requestRandomness(
  35. userRandomNumber,
  36. provider,
  37. privateKey,
  38. );
  39. console.log("Request tx hash:", requestResponse.transactionHash);
  40. const startTime = Date.now();
  41. const sequenceNumber = providerInfo.sequenceNumber;
  42. const revealUrl = providerInfo.uri + `/revelations/${sequenceNumber}`;
  43. console.log("Checking this url for revelation:", revealUrl);
  44. // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
  45. while (true) {
  46. const fortunaResponse = await fetch(revealUrl);
  47. if (fortunaResponse.status === 200) {
  48. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  49. const payload = (await fortunaResponse.json()) as any;
  50. const endTime = Date.now();
  51. console.log(`Fortuna Latency: ${endTime - startTime}ms`);
  52. const providerRevelation = "0x" + payload.value.data;
  53. const revealResponse = await contract.revealRandomness(
  54. userRandomNumber,
  55. providerRevelation,
  56. provider,
  57. sequenceNumber,
  58. privateKey,
  59. );
  60. console.log("Reveal tx hash:", revealResponse.transactionHash);
  61. break;
  62. }
  63. await new Promise((resolve) => setTimeout(resolve, 300));
  64. }
  65. }
  66. // eslint-disable-next-line @typescript-eslint/no-floating-promises, unicorn/prefer-top-level-await
  67. main();