latency_entropy.ts 2.2 KB

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