replicatr

command module
v1.2.17 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 9, 2024 License: GPL-2.0 Imports: 3 Imported by: 0

README

Replicatr

logo

replicatr is a relay for the nostr protocol:

  • Supports most applicable NIPs: 1, 2, 4, 9, 11, 12, 15, 16, 20, 22, 28, 33, 40, 42
  • Websocket compression: permessage-deflate with optional sliding window, when supported by clients
  • Extremely configurable making it seamlessly customizable across several parameters for relay operators
  • No external database required: All data is stored first locally on the filesystem in BadgerDB and optionally on the Internet Computer for inter-relay synchronization.
  • The local badgerDB has been additionally equipped with a nostr-specific, highly configurable garbage collection scheme and a nostr-specific prefix-indexing scheme for seamless data management and rapid querying
  • Supports optionally mandating nip-42 authorization upon initial connection for enhanced security
  • Internet Computer-integration for efficient syncing with remote relays

Syncing

The most original feature of replicatr is its Internet Computer integration allowing for quick and seamless inter-relay synchronization. This is achieved by defining relay clusters, an interconnected group of relays that're given authorization by a replicatr canister owner to utilize the canister's synchronization tooling to achieve consistency across the cluster.

Click here to learn more about the nostrific problem this addresses.

Click here to learn more about the synchronization architecture.

Usage

Setup

Works with Linux, MacOS, and WSL2

Install Go and Clone Repo

Go 1.2+ is recommended - Click here for installation instructions and specifications.

Then, run to the following to clone the repo:

git clone https://github.com/Hubmakerlabs/replicatr.git && cd replicatr
To setup an Owner relay (and start your own cluster):
  1. Ensure dfx and all corresponding dependencies are installed in the repo root directory. Ensure a valid dfx identity with an initialized wallet is created and is being used.
  2. Use NNS to create a canister and top it up with at least half an ICP worth of cycles (or more depending on your intended bandwidth usage).
  3. From the root directory, run the initialization script:
chmod +x pkg/ic/setup/owner.sh
./pkg/ic/setup/owner.sh

Input the canister-id for the previously created canister when prompted:

Please enter the canister ID: <canister-id>

This will generate a relay secret key, initialize your relay and deploy a replicatr canister on the Internet Computer with your relay as the specified owner. Click here to see where the secret key as well other settings are stored.

If you have any issues with the owner setup, here is some troubleshooting help.

To setup as a Minion/Secondary-Owner relay (and join a preexisting cluster):
  1. Identify the a relay cluster you would like to join and ask the owner for their canister-id and if you can join.

  2. Run the following command from the root directory to initialize the relay with the previously obtained canister-id:

    go run . initcfg -e ic -I <canister-id> 
    
  3. Run the following command to obtain your canister-facing relay pubkey:

    go run . pubkey
    
  4. Send the resulting pubkey to the canister owner and wait for them to grant you user/owner level access

To learn more about canister permissions, click here.

Building and Running

You can run the relay directly from the root of the repository:

go run . <flags> <args>

add flags to configure the relay as needed or run without any flags to use defaults. Click here to view customizable parameters, configuration, and subcommand details

Or you can build it and place it in the location GOBIN as defined here:

go install

Additional Features and Documentation

Package Name Links Description
config README Parameters and commands to configure the relay
blowr README CLI tool that facilitates the uploading of Nostr events from a JSONL file to a specified Nostr relay
loggr README DOC highly-informative, configurable logger to monitor relay activity
agent DOC IC-tooling for Nostr data
IC-ACL README DOC Commands for managing relays' canister access
testr README builds and executes highly customizable and exhaustive test cases for the relay

Credits

This project would not be possible without the significant contributions and support from the following organizations and projects:

  1. DFINITY - For funding our project and enabling us to build on their cutting-edge blockchain technology.
  2. Hubmaker Labs - For their funding and ongoing support throughout the development process.
  3. nbd-wtf - We forked their go-nostr package, which forms a substantial part of our Nostr tooling.
  4. fiatjaf - We based our project on his khatru relay, using it as the foundational structure for our development.
  5. Aviate Labs - Their agent-go tooling has been instrumental in facilitating our interaction with Internet Computer canisters.

We extend our deepest gratitude to all our contributors and supporters, as their efforts and resources have been vital to the success of this project.

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
app
acl
cmd
firehose
Package main provides a configurable, frequency and event/size volume control that hoses a relay with events to test garbage collection.
Package main provides a configurable, frequency and event/size volume control that hoses a relay with events to test garbage collection.
pkg
atomic
Package atomic provides simple wrappers around numerics to enforce atomic access.
Package atomic provides simple wrappers around numerics to enforce atomic access.
atomic/internal/gen-atomicint
gen-atomicint generates an atomic wrapper around an integer type.
gen-atomicint generates an atomic wrapper around an integer type.
atomic/internal/gen-atomicwrapper
gen-atomicwrapper generates wrapper types around other atomic types.
gen-atomicwrapper generates wrapper types around other atomic types.
bech32
Package bech32 provides a Go implementation of the bech32 format specified in BIP 173.
Package bech32 provides a Go implementation of the bech32 format specified in BIP 173.
ec
Package btcec implements support for the elliptic curves needed for bitcoin.
Package btcec implements support for the elliptic curves needed for bitcoin.
ec/chainhash
Package chainhash provides abstracted hash functionality.
Package chainhash provides abstracted hash functionality.
ec/ecdsa
Package ecdsa provides secp256k1-optimized ECDSA signing and verification.
Package ecdsa provides secp256k1-optimized ECDSA signing and verification.
ec/schnorr
Package schnorr provides custom Schnorr signing and verification via secp256k1.
Package schnorr provides custom Schnorr signing and verification via secp256k1.
ec/secp256k1
Package secp256k1 implements optimized secp256k1 elliptic curve operations in pure Go.
Package secp256k1 implements optimized secp256k1 elliptic curve operations in pure Go.
nostr/context
Package context is a set of shorter names for the very stuttery context library.
Package context is a set of shorter names for the very stuttery context library.
nostr/eventstore/badger/keys
Package keys is a composable framework for constructing badger keys from fields of events.
Package keys is a composable framework for constructing badger keys from fields of events.
nostr/eventstore/l2
Package l2 is a testing data store that implements a level 2 cache for events with a badger eventstore.
Package l2 is a testing data store that implements a level 2 cache for events with a badger eventstore.
nostr/nostrbinary
Package nostrbinary provides a simple interface for using Gob encoding on nostr events.
Package nostrbinary provides a simple interface for using Gob encoding on nostr events.
nostr/pool
Package pool is
Package pool is
nostr/wire/array
Package array implements an interface slice data structure that produces JSON as its string/byte string output.
Package array implements an interface slice data structure that produces JSON as its string/byte string output.
nostr/wire/object
Package object implements an ordered key/value data structure for use with JSON documents that must be strictly ordered in order to create a consistent blob of data in canonical order for creating verifiable signatures while delivering the data over the wire or storing it with its signature and object hash also present, as is used for nostr events.
Package object implements an ordered key/value data structure for use with JSON documents that must be strictly ordered in order to create a consistent blob of data in canonical order for creating verifiable signatures while delivering the data over the wire or storing it with its signature and object hash also present, as is used for nostr events.
qu

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL