nostr
nostr copied to clipboard
A pure Erlang implementation of the nostr protocol
nostr
An implementation of nostr in pure Erlang using OTP stack with minimal dependencies. Here the list of features offered by this application:
-
[ ] A library defined in module
nostrlib
-
[ ] A client defined in module
nostr_client
-
[ ] A relay defined in module
nostr_relay
-
[ ] A common interface called
nostr
to play with previously defined modules.
Disclamer
This project is in active development and cannot provide a stable application. This application should be used only for test at the moment.
NIP Support
Here the list of currently supported nips:
- [x] nip/01: Basic protocol flow description
- [ ] nip/02: Contact List and Petnames
- [ ] nip/03: OpenTimestamps Attestations for Events
- [ ] nip/04: Encrypted Direct Message
- [ ] nip/05: Mapping Nostr keys to DNS-based internet identifiers
- [ ] nip/06: Basic key derivation from mnemonic seed phrase
- [ ] nip/07:
window.nostr
capability for web browsers - [ ] nip/08: Handling Mentions
- [ ] nip/09: Event Deletion
- [ ] nip/10: On "e" and "p" tags in Text Events (kind 1)
- [ ] nip/11: Relay Information Document
- [ ] nip/12: Generic Tag Queries
- [ ] nip/13: Proof of Work
- [ ] nip/14: Subject tag in Text events
- [ ] nip/15: End of Stored Events Notice
- [ ] nip/16: Event Treatment
- [ ] nip/18: Reposts
- [ ] nip/19: bech32-encoded entities
- [ ] nip/20: Command Results
- [ ] nip/21: URL scheme
- [ ] nip/22: Event
created_at
Limits - [ ] nip/23: Long-form Content
- [ ] nip/25: Reactions
- [ ] nip/26: Delegated Event Signing
- [ ] nip/27: Text Note References
- [ ] nip/28: Public Chat
- [ ] nip/30: Custom Emoji
- [ ] nip/31: Dealing with unknown event kinds
- [ ] nip/32: Labeling
- [ ] nip/33: Parameterized Replaceable Events
- [ ] nip/36: Sensitive Content/Content Warning
- [ ] nip/38: User Statuses
- [ ] nip/39: External Identities in Profiles
- [ ] nip/40: Expiration Timestamp
- [ ] nip/42: Authentication of clients to relays
- [ ] nip/45: Event Counts
- [ ] nip/46: Nostr Connect
- [ ] nip/47: Nostr Wallet Connect
- [ ] nip/48: Proxy Tags
- [ ] nip/50: Search Capability
- [ ] nip/51: Lists
- [ ] nip/52: Calendar Events
- [ ] nip/53: Live Activities
- [ ] nip/56: Reporting
- [ ] nip/57: Lightning Zaps
- [ ] nip/58: Badges
- [ ] nip/65: Relay List Metadata
- [ ] nip/78: Arbitrary custom app data
- [ ] nip/89: Recommended Application Handlers
- [ ] nip/94: File Metadata
- [ ] nip/98: HTTP Auth
Other Implementation (required by nostr)
- [x] BIP-0340: Schnorr Signatures for secp256k1
- [x] BIP-0173: Base32 address format for native v0-16 witness outputs
- [x] BIP-0350: Bech32m format for v1+ witness addresses
Build
The code can be compiled using
rebar3
Erlang project manager.
$ rebar3 compile
Test
The current implementation is tested using
eunit
and
common_test
both directly integrated with all default Erlang/OTP
release. cover
is
enabled by default to have an idea of the coverage of the test. An
alias called check
has been created to help using these tools.
$ rebar3 check
Documentation
A developer documentation is provided using
edoc
and can be
generated on demand (automatically created if using rebar3 check
alias).
$ rebar3 edoc
This project has been created to explain how to create an Erlang/OTP
from scratch using only a release and few dependencies. The design
choices for the infrastructure, data-structures and algorithms can be
found in in notes directory. Those notes can be exported in
html, epub, pdf or plaintext using make
.
$ make
The documents will be generated in _build/notes
directory.
Development
For the developers, this project is using
asdf
. The tools used are listed in
.tool-versions
file. To bootstrap your system, install asdf
and
just execute this command in the repository:
$ git clone https://github.com/erlang-punch/nostr
$ cd nostr
$ asdf install
Usage
This project is a work in progress, and no usages are currently displayed here.