hivemind-ruby - Object Relational Mapping for Hivemind
If you run your own
hivemind node, you can leverage your local subset of the blockchain you've synchronized to Postgres using ActiveRecord.
What does that mean? It means if, for example, you have an existing Rails application, you can use this gem to access your
hivemind node and access all of the data stored there.
Full documentation: http://www.rubydoc.info/gems/hivemind-ruby
What problem does this tool solve?
It allows you to bypass
steemd and access a representation of the blockchain maintained by
hivemind for certain types of queries.
Why would I want to bypass
steemd? Isn't that the authoritative way to access the blockchain?
steemd is authoritative. But for certain kinds of queries, there are alternatives. For example, if you wanted to find all users that have the letter
z in their account name,
steemd is not the best tool.
Instead, we can use an SQL statement like:
SELECT "hive_accounts".* FROM "hive_accounts" WHERE (name LIKE '%z%');
But, you don't have to write this SQL. You can let ActiveRecord do it instead:
::.where("name LIKE ?", '%z%')
To do this query comprehensively with
steemd would require hours of API calls to find accounts that match. But using SQL, it takes less than a second.
What can I query with
The focus of
hivemind is on communities:
Hive is a "consensus interpretation" layer for the Steem blockchain, maintaining the state of social features such as post feeds, follows, and communities. Written in Python, it synchronizes an SQL database with chain state, providing developers with a more flexible/extensible alternative to the raw steemd API.
You should refer to the main
hivemind purpose to determine specifically what blockchain data it will index.
This tool will allow rubyists to access the same database that
The hivemind-ruby gem is compatible with Ruby 2.2.5 or later. Also targets ActiveRecord 5.2, but older versions may work as well.
First, you need your own
hivemind node. A
hivemind node requires at least 310GB of HDD storage for the database (as of August of 2018).
Also install the minimal set of
PostgreSQL binaries and headers requried for building 3rd-party applications:
$ apt-get install libpq-dev
Should already be provided if you have
PostgreSQL provided by homebrew.
Once it's running and all synced, just make sure you can access Postgres locally, e.g.:
If that works, you can use this gem. Keep in mind, if you stop the sync, your Postgres database will fall behind the head block. Once you resume,
hivemind will pick up where it left off.
It's that easy!
Add this line to your application's Gemfile:
gem 'hivemind-ruby', require: 'hive'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install hivemind-ruby
If you've already installed the gem, to check on your configuration, use this command from the terminal:
export DATABASE_URL=postgresql://user:[email protected]:5432/hive hivmind-ruby
Or, if you'd like to use the interactive ruby console with
hive already required:
Here are a bunch of ActiveRecord queries you can do in your app (or from the interactive console).
This will return the number of accounts currently synced:
To do the same as accounts, but for posts, this counts everything, including root posts and comments:
This counts just the number of root posts (not comments):
This counts just the number of comments (not root posts):
::.replies.count ::.replies(parent_author: 'alice').count # just replies to alice ::.replies(parent_author: %w(alice bob)).count # just replies to alice or bob
This will report the number of accounts with
z in their name:
accounts = ::.where("name LIKE ?", '%z%') accounts.count
This will show you the number of root posts by
alice = ::.find_by_name 'alice' alice.posts.root_posts.count
This will show you the number of reblogs by
alice = ::.find_by_name 'alice' alice.reblogged_posts.count
This is the number of accounts that
alice = ::.find_by_name 'alice' alice.following.count
This is the number of accounts that follow
alice = ::.find_by_name 'alice' alice.followers.count
The entire feed for
alice (all content created by accounts
alice follows, roughly analogous to https://steemit.com/@alice/feed):
alice = ::.find_by_name 'alice' alice.feed.count
This is the entire discussion for the first post on the Steem platform (e.g.: https://steemit.com/@steemit/firstpost):
firstpost = ::.first firstpost.discussion.count
To get the direct children of a post:
firstpost = ::.first firstpost.children.count
- Clone the client repository into a directory of your choice:
git clone https://github.com/steemit/hivemind-ruby.git
- Navigate into the new folder
- All tests can be invoked as follows:
DATABASE_URL=postgresql://user:[email protected]:5432/hive bundle exec rake test
Patches are welcome! Contributors are listed in the
hivemind-ruby.gemspec file. Please run the tests (
rake test) before opening a pull request and make sure that you are passing all of them. If you would like to contribute, but don't know what to work on, check the issues list.
When you find issues, please report them!