latency_entropy.ts 2.2 KB

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