bsocial-planaria

Bitcoin Social indexer to MongoDB

Usage no npm install needed!

<script type="module">
  import bsocialPlanaria from 'https://cdn.skypack.dev/bsocial-planaria';
</script>

README

bsocial-planaria

Bitcoin Social (BitcoinSchema) transaction indexer

bSocial-planaria is a Bitbus compatible Bitcoin Social indexer. It scans all MAP compatible transactions and processes them into a global bSocial state using the bitsocket.network servers.

There are other ways to index bSocial transaction, for instance with bmap-planaria. The difference is that bSocial is optimized for the bitcoin social networking features and is less generic than bmap-planaria.

NOTE: This is still work in progress and should be considered beta software. Issues / requests and PR's are welcome.

global installation

npm install -g bsocial-planaria

Set the environment variables. You must at least set the planaria token.

export BSOCIAL_PLANARIA_TOKEN=""

The token is a Planaria Token that can be created here: https://token.planaria.network/

And optionally overwrite the defaults for the database:

export BSOCIAL_MONGO_URL="mongodb://localhost:27017/bsocial-planaria"

Indexing bSocial blocks can now be done by running

bsocial-planaria

If you want to run continuously and also listen to the mempool, run:

bsocial-planaria -a watch

It's also possible to get transactions directly from bitbus with the bsocial-planaria cli

bsocial-planaria -a get -t <txId>

Or run a query for at most 10 transactions

bsocial-planaria -a get -q '{"out.tape.cell":"MAP SET app type"}' -p bob

The arguments to the bsocial-planaria cli are:

arg Description
-a <action> Action to call (index (default), watch, get)
-t <txId> Transaction Id to search for. Only works together with -a get
-q <query> JSON stringified query. Only works together with -a get
-p <parser> Parser to use for the returned transaction (txo (default), bob). Only works together with -a get

local installation

git clone https://github.com/icellan/bsocial-planaria.git

bsocial-planaria can run either with settings from a config file (config.json) or from environment variables.

config.json

{
  "token": "ey...",
  "mongoUrl": "mongodb://..."
}

environment

export BSOCIAL_PLANARIA_TOKEN="ey..."
export BSOCIAL_MONGO_URL="mongo://..."
export BSOCIAL_DEBUG=""
export BSOCIAL_VERBOSE=1
export BSOCIAL_BITFS_STORE=1
export BSOCIAL_BITFS_MAX_LENGTH=10000

run

To run the indexer once to index all blocks:

./start.sh

To run the indexer in watch mode, which also indexes all transactions in the mempool:

./watch.sh

testing

npm run test

or

npm run testwatch

Including in your own package or site

npm install bsocial-planaria

Make sure you set the environment variables before running any scripts:

export BSOCIAL_PLANARIA_TOKEN = '<planaria token>';
export BSOCIAL_MONGO_URL = 'mongodb://localhost:27017/bsocial-planaria';

Index all mined bSocial transactions:

import { indexBSocialTransactions } from 'bsocial-planaria/dist';

(async function() {
  await indexBSocialTransactions();
})();

or, index all mined transactions + listen to the mempool:

import { watchBSocialTransactions } from 'bsocial-planaria/dist/watch';

(async function() {
  await watchBSocialTransactions();
})();

You can also pass a custom query to the bSocial scripts, overriding the default query that searches for transactions.

import { watchBSocialTransactions } from 'bsocial-planaria/dist/watch';

(async function() {
  // this will only watch for new ID transactions
  await watchBSocialTransactions({
    'out.s2': 'MAP',
    'out.s3': 'SET',
    'out.s4': 'app'
  });
})();

There are also hooks available on all the BSocial collections, which you can use to do your own processing when a transaction comes in.

import { watchBSocialTransactions } from 'bsocial-planaria/dist/watch';
import { BSOCIAL } from 'bsocial-planaria/dist/schemas/bsocial';
import { LIKES } from 'bsocial-planaria/dist/schemas/likes';

// BSocial contains the raw posts in bmap format
BSOCIAL.after('insert', async (doc) => {
  // do something with the doc after insert
});

// The LIKES collection contains the like referenced to the tx and idKey
LIKES.before('insert', async(doc) => {
  // do something with the doc before insert
  // the modified doc is what will be inserted
});

(async function() {
  await watchBSocialTransactions();
})();

Babel

Make sure babel is set up properly or that es6 is supported by your own package.