Giter Club home page Giter Club logo

drand-client's People

Contributors

alanshaw avatar cluelessuk avatar dependabot[bot] avatar very-lame-username avatar webmaster128 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

drand-client's Issues

watch returns the same round multiple times

I have the following deno script:

import { HttpCachingChain, HttpChainClient, watch } from "npm:[email protected]";

const chainHash = "8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce";
const publicKey =
  "868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31"; // (hex encoded)

const options = {
  disableBeaconVerification: false,
  noCache: false,
  chainVerificationParams: { chainHash, publicKey },
};

if (import.meta.main) {
  const chain = new HttpCachingChain("https://api.drand.sh", options);
  const client = new HttpChainClient(chain, options);

  const abortController = new AbortController();
  for await (const beacon of watch(client, abortController)) {
    console.log(new Date().toUTCString(), "Watch returned a beacon:", beacon);
  }
}

and run it with deno run --allow-read --allow-net main.ts > log.txt. As you can see in the logs, the same round is returned multiple times. E.g. round: 2618607 is there 302 times.

log.txt

Rust client for Drand

I am working on a drand-client in rust. I am using the go implementation drand/client for reference and so far it checks fine. For verification I am using drand-verify. Before I put some serious effort in drand-rs I want to make sure that the rust-client aligns with Drand requirements and specification. We can have this as the tracking issue for that.

code: https://github.com/prataprc/drand-rs

Consider using Rust implementation for Wasm build

drand-verify is a Rust implementation of drand beacon verification based on paired. It can be compiled to Wasm and comes with JavaScript bindings for different environments.

The Wasm blob is 448K big (compared to 3.0M of the current Go-based build). It also speeds up verification time from 150ms to 50ms.


Those are the benchmarks I ran in Node.js 14.10. Please note that instantiation times canot be compared fairly since my proof of concept uses synconous CommonJS module loading in Node.js where the Wasm instantiation happens during module loading. However, beacon verification times should be fair.

Verification timings current master

> [email protected] test /projects/drand-client
> ava -v -T 10m
(node:1839) ExperimentalWarning: The ESM module loader is experimental.
(node:1840) ExperimentalWarning: The ESM module loader is experimental.
  โœ” optimizing โ€บ should fail to get info if all clients fail
  โœ” optimizing โ€บ should fail to get randomness if all clients fail
  โœ” optimizing โ€บ should get info from working client
  โœ” optimizing โ€บ should get from the fastest client (107ms)
  โœ” optimizing โ€บ should get randomness from working client (223ms)
  โœ” optimizing โ€บ should switch to a faster client (413ms)
(node:1838) ExperimentalWarning: The ESM module loader is experimental.
  โœ” chain โ€บ should get round 1 when time is less than genesis
  โœ” chain โ€บ should get round 1 for first round
  โœ” chain โ€บ should get round 2 for second round
  โœ” chain โ€บ should get time 0 when round is < 0
  โœ” chain โ€บ should get time 0 for first round
  โœ” chain โ€บ should get time 1000 for second round
Verification time: 1726ms (0ms info; 163ms instantiation; 1563ms verify beacon)
Verification time: 1720ms (0ms info; 797ms instantiation; 923ms verify beacon)
Verification time: 1719ms (0ms info; 1210ms instantiation; 509ms verify beacon)
Verification time: 1606ms (0ms info; 1382ms instantiation; 224ms verify beacon)
  โœ” drand โ€บ should abort get (1.8s)
  โœ” drand โ€บ should disable beacon verification (1.8s)
Verification time: 155ms (0ms info; 0ms instantiation; 155ms verify beacon)
  โœ” drand โ€บ should get specific randomness round (2s)
  โœ” optimizing โ€บ should watch from the fastest client (2.1s)
Verification time: 158ms (0ms info; 0ms instantiation; 158ms verify beacon)
Verification time: 143ms (0ms info; 0ms instantiation; 143ms verify beacon)
  โœ” drand โ€บ should get latest randomness (2.3s)
Verification time: 313ms (0ms info; 0ms instantiation; 313ms verify beacon)
Verification time: 151ms (0ms info; 0ms instantiation; 151ms verify beacon)
Verification time: 140ms (0ms info; 0ms instantiation; 140ms verify beacon)
  โœ” drand โ€บ should watch for randomness (1m 16.6s)
  โ”€

  18 tests passed

Verification timings using the Rust implementation

> [email protected] test /projects/drand-client
> ava -v -T 10m


(node:1917) ExperimentalWarning: The ESM module loader is experimental.
  โœ” chain โ€บ should get round 1 when time is less than genesis
  โœ” chain โ€บ should get round 1 for first round
  โœ” chain โ€บ should get round 2 for second round
  โœ” chain โ€บ should get time 0 when round is < 0
  โœ” chain โ€บ should get time 0 for first round
  โœ” chain โ€บ should get time 1000 for second round
(node:1918) ExperimentalWarning: The ESM module loader is experimental.
(node:1919) ExperimentalWarning: The ESM module loader is experimental.
  โœ” optimizing โ€บ should fail to get info if all clients fail
  โœ” optimizing โ€บ should fail to get randomness if all clients fail
  โœ” optimizing โ€บ should get info from working client
  โœ” optimizing โ€บ should get from the fastest client (107ms)
  โœ” optimizing โ€บ should get randomness from working client (181ms)
Verification time: 44ms (0ms info; 0ms instantiation; 44ms verify beacon)
  โœ” drand โ€บ should abort get (172ms)
Verification time: 49ms (0ms info; 0ms instantiation; 49ms verify beacon)
Verification time: 44ms (0ms info; 0ms instantiation; 44ms verify beacon)
Verification time: 59ms (0ms info; 0ms instantiation; 59ms verify beacon)
  โœ” optimizing โ€บ should switch to a faster client (406ms)
Verification time: 49ms (0ms info; 0ms instantiation; 49ms verify beacon)
  โœ” drand โ€บ should get specific randomness round (413ms)
Verification time: 47ms (0ms info; 0ms instantiation; 47ms verify beacon)
  โœ” drand โ€บ should disable beacon verification (657ms)
Verification time: 43ms (0ms info; 0ms instantiation; 43ms verify beacon)
  โœ” drand โ€บ should get latest randomness (755ms)
  โœ” optimizing โ€บ should watch from the fastest client (2.1s)
Verification time: 45ms (0ms info; 0ms instantiation; 45ms verify beacon)
Verification time: 43ms (0ms info; 0ms instantiation; 43ms verify beacon)
Verification time: 51ms (0ms info; 0ms instantiation; 51ms verify beacon)
  โœ” drand โ€บ should watch for randomness (56.3s)
  โ”€

  18 tests passed

Update tests to work with newest node LTS

All the jest-http-mock tests fail on the latest LTS version of node, as they appear to use actual fetch rather than the mock (presumably because fetch is now available on LTS)

deno support for v1.0.0

Deno was supported in v0.* via storing all the JS on a CDN. This is not currently the case for v1 and should be implemented for parity.

Remove backwards compat default DST for v2

In order to not break v1 users of the client, we pass the DST for beacon verification as an optional parameter and set some defaults.
This can be removed in v2 to ensure users don't accidentally try and verify a beacon with the wrong DST

Support Webpack 4 (e.g. for Create React App)

When trying to use this lib from npm in a React project, I get the error

Failed to compile.

./node_modules/drand-client/verifying.js 16:29
Module parse failed: Unexpected token (16:29)
File was processed with these loaders:
 * ./node_modules/react-scripts/node_modules/babel-loader/lib/index.js
You may need an additional loader to handle the result of these loaders.
|         // TODO: switch to TinyGo when math/big works for smaller wasm file and non-global exports.
|         const go = new Go();
>         const url = `${import.meta.url.split('/').slice(0, -1).join('/')}/wasm/drand.wasm`;
|         let result;
|

This is because import.meta.url is not supported in Webpack 4. Webpack 5 support probably will take some more time.

I have no great idea how to solve this, but let's see.

Fetch chains

In order to support multiple chains, the client should be able to fetch the list of chains using, e.g. http://pl-us.testnet.drand.sh/chains which is currently supported in the go client. This allows a user to make followup requests to chainInfo and programmatically select chains that fulfill their required criteria (e.g. chained vs unchained)

`deno` sample code error

Tried to run with the deno sample code and cli invocation which fails, copied from the README. deno was installed on macOS with brew install deno.

import Client, { HTTP } from 'https://cdn.jsdelivr.net/npm/drand-client/drand.js'

const chainHash = '8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce' // (hex encoded)
const urls = [
  'https://api.drand.sh',
  'https://drand.cloudflare.com'
]

async function main() {
  const options = { chainHash }

  const client = await Client.wrap(HTTP.forURLs(urls, chainHash), options)

  // e.g. use the client to get the latest randomness round:
  const res = await client.get()

  console.log(res.round, res.randomness)
}

main()

Failing run:

$ deno -V
deno 1.3.2

$ deno run --allow-net index.js
error: Uncaught TypeError: WebAssembly.compile(): Argument 0 must be a buffer source

package.json

{
  "name": "foo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "abort-controller": "^3.0.0",
    "drand-client": "^0.2.0",
    "node-fetch": "^2.6.0"
  }
}

Update testnet node URLs

Two of the tree testnet endpoints used for testing this lib (https://github.com/drand/drand-client/blob/42b9dfe/drand.test.js#L10-L14 and https://github.com/drand/drand-client/blob/42b9dfe/optimizing.test.js#L12-L16) are currently unavailable for me:

Are they expected to become available again? Are there alternative nodes that can be used for testing with multiple clients?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.