3 releases
0.1.2 | Mar 2, 2023 |
---|---|
0.1.1 | Mar 2, 2023 |
0.1.0 | Mar 2, 2023 |
#26 in #relation
Used in sgraph-usersig
175KB
223 lines
Contains (ELF lib, 1.5MB) tests/fixtures/ac.so, (ELF lib, 40KB) tests/fixtures/noop.so
sgraph
Welcome to sgraph monorepo
What is sgraph?
A permissionless social graph that enables any relation or event to become a shared record on the web.
Sgraph allows to:
- Publish - enable users to plug-in their social graph, so they can focus on experiences, not gaining the audience for your app
- Discover - unlock new recommendation algorithms and discover insights based on data providers you select
- Build - get started within minutes with developer-friendly SDK for Typescript and Rust
Design principles of sgraph:
While various different graph technologies and protocols exist, there isn't a single technology which could combine them together into a single universal public registry that is:
- Permissionless – anyone can start creating graph data or reading it from providers they select. Sgraph data providers don't need user consent to write on behalf of them.
- Custom types – anyone can create their own types and subtypes of relations and events (follow, subscribe, flag, new content object, notification, etc)
- Space efficient – sgraph uses Merkle tree compression to optimize space usage. It allows to store up to one billion records per tree at no cost.
- Optimized for high performance – indexer synchronizes on-chain data from sgraph and builds a local copy, allowing to query graph data efficiently. library/tree/master/account-compression)
- Built for builders – developer-friendly and open source from the day one.
How it works
Imagine that Alice follows Bob on Platform X and Bob flagged Charlie on Platform Y. Instead of storing those relations locally on, sgraph allows to share these relations on-chain so Platform X, Platform Y, and any others apps and users can benefit from that information.
Implementation
sgraph is operating on Solana blockchain. Core contract manages all writes to the graph.
In order to consume as little space as possible while making writes essentially free, sgraph uses technology called SPL Account Compression. Instead of actual data (relations), only hashes are stored on-chain. Naturally, in order to read data, it must be indexed somewhere off-chain. To do this, one must run indexer
- a dedicated binary that maintains a local copy of all the relations.
We aim to make indexer
easy to deploy and maintain, so that it's benefits (such as incredible read performace) outweigh the initial investment in setting it up. Hosted version of indexer
will also be available.
Diagram explaining different sgraph entities (click to view)
Project structure:
|-- programs
| |-- graph => Core contract
| `-- usersig => Manual signature provider (checkout out it's README.md)
| `-- cli => Utilities to create relations using usersig
|-- sdk
| `-- js => Typescript SDK
| `-- _examples => Examples of interaction with the graph
|-- indexer => Worker that caches relations locally
Development environment quick start
# start localnet
solana-test-validator
# deploy contracts on localnet
# install anchor at https://www.anchor-lang.com/docs/installation
anchor build && anchor deploy
npx ts-node ~/sgraph/sdk/js/cli/initTree.ts <tree-keypair> <authority-keypair>
# run examples
set -x ANCHOR_WALLET "~/.config/solana/id.json" # set to path to your wallet
npx ts-node sdk/js/_examples/full.ts
Program details
Addresses:
Crates/Docs | Mainnet/Devnet/Testnet | Provider addr | |
---|---|---|---|
graph | graph8zS8zjLVJHdiSvP7S9PP7hNJpnHdbnJLR81FMg | N/A | |
usersig | s1gsZrDJAXNYSCRhQZk5X3mYyBjAmaVBTYnNhCzj8t2 | 8MgDy6gEztWYsS2PKhBkYPCVDb6VQJ4XkTChtwayXvyB |
Public indexer instances:
env | url |
---|---|
mainnet | https://api.sgraph.io |
devnet | https://dev.api.sgraph.io |
Running indexer locally
Running locally is recommended for production use
Read how you can run your instance of in ./indexer/README.md
Future work
Coming soon: Events
- Events are one-time broadcasts about user activity
- Events will not be stored in Merkle tree, but rather emitted once in transaction for indexer to catch
- Events will be sent by a provider, so you are free to choose from whom to consume the events
TODO:
- Integration tests
- More SDK helpers
- More providers!
Questions, suggestions, feedback
Open issue, start a discussion or don't hesitate to ping us at hello at sgraph.io
.
Security-related issues should only be reported to email listed above.
License
Apache 2.0. See LICENSE
Dependencies
~20–30MB
~495K SLoC