latency_entropy.ts 2.3 KB

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