GithubHelp home page GithubHelp logo

sphinx-stack's Introduction

sphinx-stack

Full stack Sphinx cluster, including:

  • bitcoind
  • LND
  • relay
  • sphinx-tribes
  • sphinx-memes
  • sphinx-auth
  • sphinx-mqtt

run

Open a terminal inside the root directory of this repository. Then:

docker-compose pull

docker-compose up -d

stop

docker-compose down

Running docker-compose down instead of sending a SIGINT or SIGTERM is very important! Otherwise bitcoind will not finish writing to its database, and on the next run LND will crash with a block index mismatch.

You can also run with Docker Desktop and just use the "play" and "stop" buttons (and view the logs from each container).

clear

Clear the existing configs, so you can start fresh:

./clearall.sh

aperture enabled paywall

The sphinx-stack docker compose file uses profiles to opt-in to particular services. To run with an aperture-enabled paywall, start the stack with the following command:

docker compose -f docker-compose.yml --profile aperture --project-directory . up  -d

This will use the configs set in /aperture/aperture.yaml. To update the timeout and other paywall related configs, edit that file.

developing/contributing to Sphinx

  • Run one of the sphinx clients on your local computer, and enter the exported_keys that you can find in /relay/NODES.json (make sure to copy the trailing = equal signs if there are any!)

  • the easiest client to get up and running is Sphinx Desktop

  • To find out how to modify sphinx components and contribute to the stack vist Developing/Contributing on Sphinx

  • To find out how to develop bots on the sphinx stack visit Developing bots on sphinx

troubleshooting

There's lots of moving pieces! On a slower computer (or an M1 mac), do export COMPOSE_HTTP_TIMEOUT=120 first

sphinx-stack's People

Contributors

bucko13 avatar evanfeenstra avatar kevkevinpal avatar omoniyi24 avatar tobi-bams avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

sphinx-stack's Issues

Add a test for "unique" aliases - $@ 300,000

[Description]
This is a test for when two users join a tribe with the same alias
The first person to join the tribe will get their correct alias
but the second person joining the tribe will get a slightly different name
so users of the tribe can differentiate the two

we want to write an automated test to check that we are not breaking this functionality


This is a Sample PR for adding a test

You will need sphinx-stack running to test if it works locally

stakwork/sphinx-relay#292 on sphinx-relay for the test issue

Please post below for any questions or suggestions

[Complexity] (1,2,3,5,7)
2

[To Reproduce]
First you want to have sphinx-stack running, then when you have sphinx stack running and
have moved the sphinx-stack/relay/NODES.json -> sphinx-relay/src/tests/configs/nodes.json

then when you run
npx ava src/tests/controllers/tribe.test.ts --verbose --serial --timeout=2m

it should pass with the new test you added testing the unique alias

[Acceptance Criteria]

Given We have a test with two users being added to a tribe with the same alias
When we run the test against sphinx stack using npx ava src/tests/controllers/tribe.test.ts --verbose --serial --timeout=2m
Then the test should pass with the response of adding two users with the same name giving the second user added a different alias than the first
[Dependecies/Parent Tasks]
none

ERROR: for bob-lnd ... Error starting userland proxy: listen tcp4 0.0.0.0:38882: bind: address already in use

ERROR: for bob-lnd  Cannot start service bob-lnd: driver failed programming external connectivity on endpoint bob-lnd.sphinx (f3203a19e10b8f065727923e0a9fcec427180a8d857a4005517a31f81f609b79): Error starting userland proxy: listen tcp4 0.0.0.0:38882: bind: address already in use

sometimes at random an integration test in sphinx-relay fails early because a port is already in use
this is always the same port (38882) and it's always bob-lnd
EDIT: just saw this also for dave... there must be something with this port range

can this port be changed to something different?

relevant code:

$ grep -rn 38882
lnd/setup/nodes/proxynodes.js:55:    hostname: "bob-lnd.sphinx:38882",
lnd/setup/nodes/nodes.js:50:    hostname: "bob-lnd.sphinx:38882",
lnd/setup/bob.conf:5:restlisten=0.0.0.0:38882
docker-compose.yml:37:      - 38882:38882
alts/proxy.yml:37:      - 38882:38882
alts/no-tribes.yml:38:      - 38882:38882
alts/no-alice.yml:37:      - 38882:38882

chat invoices test - $@ 125,000

Here is a video with some tips for setting up the sphinx-stack: https://www.loom.com/share/46fc47f208194317a78048d2e12b9c09

After running the sphinx-stack, you can copy the contents of relay/NODES.json into sphinx-relay/src/testing/configs/nodes.json to the relay tests against your local sphinx-stack

`sphinx-stack-lndsetup-1` and `sphinx-stack-relaysetup-1` give errors during startup

my stack wasnt working right (i got initGrpcSubscriptions error cannot read LND macaroon or cert error in relay) so i removed my entire docker dir and stack itself, cloned it fresh from github and ran docker-compose -f ./alts/no-alice.yml --project-directory . up -d

after that running the following docker logs commands the 2 setup container gave some js errors

$ docker logs sphinx-stack-lndsetup-1 
internal/modules/cjs/loader.js:818
  throw err;
  ^

Error: Cannot find module './nodes'
Require stack:
- /lndsetup/index.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15)
    at Function.Module._load (internal/modules/cjs/loader.js:667:27)
    at Module.require (internal/modules/cjs/loader.js:887:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (/lndsetup/index.js:2:13)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
    at Module.load (internal/modules/cjs/loader.js:863:32)
    at Function.Module._load (internal/modules/cjs/loader.js:708:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/lndsetup/index.js' ]
}
$ docker logs sphinx-stack-relaysetup-1 
=> /relay/botEnvVars.json does not exist, creating now false
=> /relay/NODES.json does not exist, creating now false
=> preSetup error Error: ENOENT: no such file or directory, copyfile '/relay/nodes_partial.json' -> '/relay/NODES.json'
    at Object.copyFileSync (fs.js:1907:3)
    at preSetup (/relay/setup/index.js:124:10)
    at setup (/relay/setup/index.js:8:9)
    at Object.<anonymous> (/relay/setup/index.js:58:1)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
    at Module.load (internal/modules/cjs/loader.js:863:32)
    at Function.Module._load (internal/modules/cjs/loader.js:708:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
    at internal/main/run_main_module.js:17:47 {
  errno: -2,
  syscall: 'copyfile',
  code: 'ENOENT',
  path: '/relay/nodes_partial.json',
  dest: '/relay/NODES.json'
}
(node:1) UnhandledPromiseRejectionWarning: Error: Cannot find module '/relay/NODES.json'
Require stack:
- /relay/setup/index.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15)
    at Function.Module._load (internal/modules/cjs/loader.js:667:27)
    at Module.require (internal/modules/cjs/loader.js:887:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at setup (/relay/setup/index.js:9:15)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:1) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

i actually got here by trying to setup stack and relay couldnt connect to it, turns out alice-lnd dit not unlock and was waiting for a password

$ docker logs alice-lnd.sphinx 
+ lnd_init
+ '[' '!' -e /lnd/.lnd/lnd.conf ']'
+ mkdir -p /lnd/.lnd
+ echo 'Creating lnd.conf'
+ cat
Creating lnd.conf
+ cat /lnd/.lnd/lnd.conf
+ echo 'Initialization completed successfully'
Initialization completed successfully
+ unlock
[lnd_unlock] Please set PASSWORD in order to unlock wallet automatically.
+ PARAMS=' --configfile=/lndsetup/alice.conf'
+ echo 'Command: lnd  --configfile=/lndsetup/alice.conf'
Command: lnd  --configfile=/lndsetup/alice.conf
+ exec lnd --configfile=/lndsetup/alice.conf
2022-09-13 19:09:16.187 [INF] LTND: Version: 0.12.1-beta commit=v0.12.1-beta-2-gb4b25fff, build=production, logging=default, debuglevel=info
2022-09-13 19:09:16.187 [INF] LTND: Active chain: Bitcoin (network=regtest)
2022-09-13 19:09:16.187 [INF] LTND: Opening the main database, this might take a few minutes...
2022-09-13 19:09:16.187 [INF] LTND: Opening bbolt database, sync_freelist=false, auto_compact=false
2022-09-13 19:09:16.191 [INF] CHDB: Checking for schema update: latest_version=20, db_version=20
2022-09-13 19:09:16.191 [INF] LTND: Database now open (time_to_open=3.74953ms)!
2022-09-13 19:09:16.191 [INF] RPCS: Generating TLS certificates...
2022-09-13 19:09:16.246 [INF] RPCS: Done generating TLS certificates
2022-09-13 19:09:16.247 [INF] RPCS: Password gRPC proxy started at 0.0.0.0:38881
2022-09-13 19:09:16.247 [INF] RPCS: Password RPC server listening on 0.0.0.0:10009
2022-09-13 19:09:16.247 [INF] LTND: Waiting for wallet encryption password. Use `lncli create` to create a wallet, `lncli unlock` to unlock an existing wallet, or `lncli changepassword` to change the password of an existing wallet and unlock it.

tor proxy for tribes server. $@ 250,000

  • sphinx-relay creates JWT tokens (with extremely limited permissions), that are passed to https://people.sphinx.chat when you login there. This allows the people page to alter your price_to_meet when you save your profile. In the future, it will also enable other actions (like bot creation) from external websites.
  • there is one problem: if relay is running a tor service, the people page cannot access it!
  • the tribes server should run a tor proxy service, that allows contacting a relay instance that has a .onion address.
  • Here, you can see how relay accept a POST to /profile from the people page: https://github.com/stakwork/sphinx-tribes/blob/master/frontend/app/src/people/editMe.tsx#L156

Add timestamps to all of our logs - $@ 200,000

200,000 satoshi bounty

Currently, some of our relay logs do not include timestamps
eg => got msgs 1

if we can make it look similar to the route endpoint logs that we currently have that would be ideal
eg -> 2021-12-27 17:21:11: POST /messages/21/read 200 71ms

So we want all of our logs to include timestamping

Message below to claim bounty or to ask further questions about the issue

Run CLN in Docker $@500000

make a docker-compose setup with bitcoind and CLN running together.

I started one from scratch and failed :( But here is my progress:

docker-compose.yml

version: "3"

services:

  bitcoind:
    image: lncm/bitcoind:v0.21.1
    restart: on-failure
    container_name: bitcoind
    volumes:
      - ./bitcoind:/data/.bitcoin
    ports:
      - 18443:18443
      - 8333:8333
      - 28332:28332
      - 28333:28333

  alice-cln:
    image: elementsproject/lightningd
    restart: on-failure
    container_name: alice-cln
    links:
      - bitcoind
    volumes:
      - ./lightning/regtest:/root/.lightning/regtest
      - ./bitcoind:/root/.bitcoin
    ports:
      - 10019:10019
    command: |
      --network=regtest

lightning/config

bitcoin-rpcuser=theuser
bitcoin-rpcpassword=thepass
bitcoin-rpcconnect=bitcoind
bitcoin-rpcport=18443
grpc-port=10019

bitcoind/bitcoin.conf:

regtest=1
fallbackfee=0.0002
rpcuser=theuser
rpcpassword=thepass
zmqpubhashblock=tcp://0.0.0.0:28332
zmqpubhashtx=tcp://0.0.0.0:28333

[regtest]
txindex=1
server=1
rpcport=18443
rpcbind=bitcoind
rpcbind=127.0.0.1
rpcallowip=0.0.0.0/0

Reusable lsat

List of changes that need to occur to achieve this

sphinx-relay

  • create an endpoint to get active lsat
  • make an update to the existing updateLsat endpoint to accommodate update of lsat when expired.
  • add a new column to the lsat table called status, to keep track of lsat status
    All these have been implemented, here is the PR [https://github.com/stakwork/sphinx-relay/pull/439]

sphinx-bridge

  • create a getActiveLsat method to get active lsat from sphinx-relay
  • create the updateLsat method to update lsat in sphinx-relay
    This has been merged to sphinx-bridge already, here is the PR: [https://github.com/kevkevinpal/sphinx-bridge/pull/2]

sphinx-mac

  • create a method that handles the getLsat method passed from sphinx-bridge
  • create a method that handles the updateLsat method passed from sphinx-bridge
    This has been implemented, here is the PR [https://github.com/kevkevinpal/sphinx-mac/pull/2]

sphinx-nav-fiber

  • get active lsat from sphinx-relay through sphinx-bridge
  • update lsat when marked as expired from the bolt-wall server.
    All this has been implemented, here is the PR [https://github.com/stakwork/sphinx-nav-fiber/pull/41]

@kevkevinpal

test for really long messages - $@ 300,000

[Description]

Create a test that checks to see that if we send a long message that on the other end we will get the same message on the other side.

This will probably be similar to a few of our tests we just need the text to be long

We want to test this both with individual messages and tribe messages

This is a Sample PR for adding a test

You will need sphinx-stack running to test if it works locally

Open issue on sphinx-relay for the test

Please post below for any questions or suggestions


[Complexity] (1,2,3,5,7)

2


[To Reproduce]

First you want to have sphinx-stack running, then when you have sphinx stack running and
have moved the sphinx-stack/relay/NODES.json -> sphinx-relay/src/tests/configs/nodes.json

then when you run
npx ava src/tests/controllers/tribe3Messages.test.ts --verbose --serial --timeout=2m
and also maybe a new test called messages.test.ts might be good which we would run with
npx ava src/tests/controllers/messages.test.ts --verbose --serial --timeout=2m


[Acceptance Criteria]

Given We have a test with a message with a very long length being sent
When we run the test against sphinx stack using npx ava src/tests/controllers/messages.test.ts --verbose --serial --timeout=2m
Then the test should pass with the response of the message being sent is the same text of what was received

Given We have a test with a message with a very long length being sent in a tribe
When we run the test against sphinx stack using npx ava src/tests/controllers/tribe3Messages.test.ts --verbose --serial --timeout=2m
Then the test should pass with the response of the message being sent to the tribe is the same text of what was received by tribe members


[Dependecies/Parent Tasks]

none

CLN-based proxy full test suite

test suite like this one: https://github.com/stakwork/sphinx-stack/blob/master/alts/proxy.yml

Except with CLN for Dave (proxy node) instead. Alice,Bob,Carol are still LND.

For CLN, using the image and configs found here https://github.com/stakwork/sphinx-swarm/blob/master/src/images/cln.rs (no external signer)

There will need to be some modifications to the lnd/setup script (because CLN does not need to be "unlocked"). The wallet script will need to be different for CLN also https://github.com/stakwork/sphinx-stack/blob/master/lnd/setup/wallet.js. Not sure the best way to do this... but maybe we can use https://lightning.readthedocs.io/lightning-hsmtool.8.html generatehsm command?

I suggest using an environment variable to let the script know if the node is CLN instead of LND

Eslint checks on the sphinx relay repo - $@ 1,400,000

Right now we don't automatically run eslint which means some of our code is not 100% consistent and eslint can help us have better code quality so we want to implement an eslint check and fix the issues that eslint finds. Feel free to make modifications to the eslint config that we already have

To reproduce the issue run
npm install eslint --save-dev

then go into package.json and under scripts add this line
"lint": "eslint ./src/**/*.ts --ignore-pattern node_modules/ --fix"

(the --fix will automatically fix some of the code)

then again in the command line run
npm run lint

and this should output 143 errors and 735 warnings we want to get that as low as possible and to write a check that could be a git action that runs this check on every PR

let me know if you have any questions :)

Reconnection test - $@ 400,000

[Description]
sphinx-relay automatically reconnects to LND (or other lightning provider) when the connection is lost.

[Complexity] (1,2,3,5,8)
3

[Acceptance Criteria] (Given, When, Then)
A new test in sphinx-stack, that tests that the reconnection logic is solid. Somehow LND needs to be stopped or locked, and then restarted. Then relay should reconnect without problems and continue to be able to send-receive messages.

https://github.com/stakwork/sphinx-relay/blob/0ab446ba5b74b060a967362d29b43400e5161ee2/src/grpc/subscribe.ts#L84

Update logging to have shorter timestamp - $@ 10,000

Bounty for 10,000 sats

This is a pretty simple change but will be good for anyone trying to learn the sphinx-stack and dev environment.

We recently updated our logging to include timestamps and other data for every log, but the timestamp is a bit too long and takes too much space


What it currently looks like
Mon, 24 Jan 2022 18:05:40 GMT

We can try making this shorter to maybe look something like this
01-24-22T18:05:40
but feel free to include other ideas


the file you will want to make your changes in is
./sphinx-relay/src/util/logger
or just click here
https://github.com/stakwork/sphinx-relay/blob/master/src/utils/logger.ts#L59


For this bounty, you probably want to get sphinx-stack running and then running docker logs alice.sphinx to check if your changes look good

feel free to DM me, post questions on the developing on sphinx tribe or right here and I can point you in the right direction

full stack testing - 250,000 $@

We need a full test suite for the whole sphinx stack! We have started building it out here: https://github.com/stakwork/sphinx-relay/tree/master/src/tests. These tests run against a local sphinx-stack setup. After getting sphinx-stack up and running:

  • replace sphinx-relay/tree/master/src/tests/configs/nodes.json with your own file from sphinx-stack/relay/NODES.json
  • in sphinx-relay run the "contact" test with npx ava src/tests/controllers/contacts.test.ts --verbose --serial --timeout=2m
  • This tests one of the most important parts of Sphinx: the key exchange that ensures all messages are end-to-end encrypted!
  • try changing the test to work with alice + carol instead of alice + bob. https://github.com/stakwork/sphinx-relay/blob/master/src/tests/controllers/contacts.test.ts#L25 (checkContact(t, nodes[0], nodes[2])). For me it does not work with alice + carol!
  • This should work every time. For me it is intermittent
  • Please respond to this issue with your findings

Example bounty/template - $@ <Satoshi Payout>

[Description]
A Simple descrition of the problem and what you're trying to solve

[Complexity] (1,2,3,5,7)
This will give an idea to the user on how long and how complex the bounty actually is
I used the Fibonacci sequence here since as we go higher the likelihood of it being even more complicated increases

I'm also explicitly avoiding time estimates since they tend to be wrong 90% of the time, general rule of thumb is that the task
should take around the (complexity - complexity * 3) so for a 3 complexity it should take between 3 to 9 "days"

Note: if this value is 5 or higher it is strongly encouraged to break down to multiple bounties

[To Reproduce]
Simply put no one can take your bounty if they can reproduce the same scenario/issue that you've found.
This should be the most detailed section

[Acceptance Criteria] (Given, When, Then)
This gives the person who's completing the bounty an idea of what exactly needs to happen for this bounty to be completed

This also gives you a good framework to write tests for the task, Scenario -> Action -> Result

[Dependecies/Parent Tasks]
If you're bounty is dependent on other bounties or tasks to be done before this one can begin list them here
This section can be deleted if no dependecies


Example Bounty

Hello world node.js - $@ 200,000

[Description]
Our team is having trouble getting hello world working on node js we were able to install node and npm but
we just can't get the code to work.

[Complexity] (1,2,3,5,7)
1

[To Reproduce]
we run the code node helloWorld.js but nothing is outputted

here is the code we have in helloWorld.js


[Acceptance Criteria]

Given We have nodejs installed and the helloWorld.js file
When we run the code node helloWorld.js
Then it should display in the command line Hello World!

[Dependecies/Parent Tasks]
none

Sphinx VLS ESP32 naming contest

The Sphinx team is looking to name its new hardware signing device, and we are hoping you can help. The device allows you to run a hosted lightning node while keeping the keys private. The features we would like to reflect in the name are “fast, secure, and innovative.” Whoever comes up with the best name will receive 150,000 sats!

Linked is an article further explaining how the signing device operates.

We look forward to your submissions!

[A Lightning Nodes Problem with Hats](url)

In Need of a Short Video: How Staking Works on Sphinx

Looking for someone proficient in Photoshop and video editing to create a short video explaining how staking works on Sphinx.

REQUIREMENTS:
-Should be between 10-12 seconds
-Use simple text and graphics during video
-Easy to understand and must flow well
-Use the script as your text in the video
-Anything in parenthases is a suggested graphic, but be creative!
-"Sphinx blue" should be the dominant color during video

SCRIPT:
Scene 1: “Staking sats to fight spam"
(Graphic of Sphinx logo)

Scene 2: “Most messaging apps don’t require skin in the game”

Scene 3: “Malicious actors can spam a network with few consequences”
(Graphic of a meme troll face)

Scene 4: “Staking a small amount of sats fixes this”

Scene 5: “Skin in the game creates a consequence for bad behavior”

Scene 6:“A moderator can use the staked sats as collateral”
(Graphic showing a user giving sats to a tribe)

Scene 7: “If a user behaves poorly -> the sats are taken and the post is deleted from the tribe"

Scene 8: “And just like that -> Spamming becomes a costly and inefficient”
(Meme troll face with a frowny face instead of smile)

Scene 9: “The only people left are the ones who should be there”

Boost testing $@250,000

Here is a video with some tips for setting up the sphinx-stack: https://www.loom.com/share/46fc47f208194317a78048d2e12b9c09

After running the sphinx-stack, you can copy the contents of relay/NODES.json into sphinx-relay/src/testing/configs/nodes.json to the relay tests against your local sphinx-stack

chat payments test $@ 125,000

Here is a video with some tips for setting up the sphinx-stack: https://www.loom.com/share/46fc47f208194317a78048d2e12b9c09

After running the sphinx-stack, you can copy the contents of relay/NODES.json into sphinx-relay/src/testing/configs/nodes.json to the relay tests against your local sphinx-stack

Dockerize VLS + CLN + HSMD ($@ 1000000)

As a preliminary step to getting Core Lightning and a remote signer into our docker setup, we need to Dockerize this repo:

https://gitlab.com/lightning-signer/vls-hsmd

setup info: https://gitlab.com/lightning-signer/vls-hsmd/-/blob/main/SETUP.md

There is a Dockerfile in there already, but its old and incomplete. It would be great to get the multiple modes of remote_hsmd working (remote_hsmd, remote_hsmd_vls, remote_hsmd_socket_test).

  • build a Docker container with Core Lightning and a remote signer, that we can run tests against (like tests/test_pay.py::test_pay).
  • learn about how remote signing is integrated in this repo and how report on how we can add our own remote signer binary

Greenlight automation

In order to test Greenlight integration directly in the stack, we need setup automation (with deterministic keys). Meaning a script to generate keys for a greenlight relay node on startup. This will be the first step toward VLS integration

Building sphinx-relay in Docker - 500,000 $@

Batching MQTT messages in sphinx-tribes - $@ 650,000

[Description]
Right now encrypted MQTT messages are individually sent from tribe admin's node to the MQTT broker, where they are propagated to the recipients. As tribes grow larger, this will become a bottleneck. Instead, there should be a POST endpoint that receives a batch of messages, and sends them over MQTT (and sets the "activity" in the tribe)

[Complexity] (1,2,3,5,8)
3

[Acceptance Criteria] (Given, When, Then)
All existing tests in sphinx-stack passing, but without relay sending the messages individually.

Tribes server should have a new route, which accepts the batch, and also connects to sphinx-mqtt to send them off. Tribes server will need an mqtt "client" using this lib github.com/eclipse/paho.mqtt.golang

In relay https://github.com/stakwork/sphinx-relay/blob/master/src/network/send.ts, instead of each message being sent individually, they should be signed and collected, then sent as a batch call to tribes server.

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.