latency_entropy.ts 2.3 KB

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