create account

Steemit::WsClient - perl bindings to steem made easy by hoffmann

View this thread on: hive.blogpeakd.comecency.com
· @hoffmann · (edited)
$40.79
Steemit::WsClient - perl bindings to steem made easy
![steemit-perl.png](https://res.cloudinary.com/hpiynhbhq/image/upload/v1519557585/dfvtlfyaqugkrzkvcd7i.png)

# What is the project about?

I was exploring steem and it pained me that there are no Perl bindings to interact with steem. So I made it my quest to implement a perl module wich would allow the comunity to write applications in Perl to interact with steem.

It all started with some tutorials wher i explained [Howto write a steemit client in perl](https://utopian.io/utopian-io/@hoffmann/howto-write-a-steemit-client-in-perl-readonly-for-now) and i want to come back to them. Unfortunately, i quickly realized that when it comes to transaction signing there were some hurdles to overcome since perl was lacking some basic suport methods when it comes to ECDSA functionality.

Diverging from the original howtos I made the existing code into a [perl module on CPAN](https://metacpan.org/pod/Steemit::WsClient) and then came the hard part of:

## implementing a BASE58 encoding package

there were already some packages which did the job but wither they were based in the fickr-base58 or they were using [Math::GMPz](https://metacpan.org/pod/distribution/Math-GMPz/GMPz.pod) instead of [Math::BigInt](https://metacpan.org/pod/Math::BigInt) so i wrote a new module Steemit::Base58 class for handeling this task.

The interface is rather simple:

```perl

use Steemit::Base58;                                                                                                                                                                                                                       

my $binary = Steemit::Base58::decode_base58( $base58_string ); 
                                  
my $base58 = Steemit::Base58::encode_base58( $binary );

```
this was needed in order to read out the [Wallet import format](https://en.bitcoin.it/wiki/Wallet_import_format) used originally by bitcoin, which is also used in steem.

So far so good but this was actually still the easy part. Next we needed some elliptic curve cryptography things for signing and key transformations.

## implementing a new ECDSA module

There are already a new ECDSA modules up on cpan but all were lacking the functionality and code quality that was needed in order to implement all required features. Luckily there was one package [Math::EllipticCurve::Prime::Point](https://metacpan.org/pod/Math::EllipticCurve::Prime::Point) hat already handles the basic elliptic curve arithmetic well. So only the functionality on top had to be developed.

This brougt then to light the [Steemit::ECDSA](https://metacpan.org/source/Steemit::ECDSA) package. It currently supports the following methods:

```perl

sub ecdsa_sign;
sub is_signature_canonical_canonical;
sub bytes_32_sha256;
sub ecdsa_verify;
sub calcPubKeyRecoveryParam;
sub recoverPubKey;
sub get_compressed_public_key;
sub get_recovery_factor;
sub point_from_x;
sub recover_y;
sub get_public_key_point;

```
They were all needed in order to generate a valid signature for a transaction and broadcast it to steemd node. Currently this is all bundeled up under.

Finally it had to be bgought together in the Steemit::WsClient package. This is the main module of the distribution wich should then be used to write applications. 

## Existing features

* accessing all database-api calls fo steem like ( getting posts, author information, comments, the blockchain state.....)
* a vote method that allows you to cast a vote on a discussion.

An example would be:

``` perl
use Modern::Perl;

use FindBin;
use lib "$FindBin::Bin/perlSteemit/lib/";

use Steemit::WsClient;

my $steem = Steemit::WsClient->new( posting_key => '<your private posting key as listed on the steemit site>' );

my $discussions = $steem->get_discussions_by_created({
      tag => 'utopian-io',
      limit => 1,
      truncate_body => 1,
});
my $discussion = pop @$discussions;
$steem->vote( $discussion );

```

it can also be used for data extraction like calculating the average reputation of the authors of the last utopian posts:

```perl
use Steemit::WsClient;
 
my $foo = Steemit::WsClient->new();
my $steem = Steemit::WsClient->new( url => 'https://some.steemit.d.node.address');
 
say "Initialized Steemit::WsClient client with url ".$steem->url;
 
#get the last 99 discussions with the tag utopian-io
#truncate the body since we dont care here
my $discussions = $steem->get_discussions_by_created({
      tag => 'utopian-io',
      limit => 99,
      truncate_body => 100,
});
 
#extract the author names out of the result
my @author_names = map { $_->{author} } @$discussions;
say "last 99 authors: ".join(", ", @author_names);
 
#load the author details
my $authors = $steem->get_accounts( [@author_names] );
#say Dumper $authors->[0];
 
#calculate the reputation average
my $reputation_sum = 0;
for my $author ( @$authors ){
   $reputation_sum += int( $author->{reputation} / 1000_000_000 );
}
 
say "Average reputation of the last 99 utopian authors: ". ( int( $reputation_sum / scalar(@$authors) )  / 100 );

```

## Technology Stack

* the package requires a Perl environment > 5.10
* openssl packages need to be installed for https communication: libssl-dev libssl1.0-dev zlib1g-dev
* libgmp-dev is almost optional but for for decent permformance, you will need it.

# Roadmap

Currently the basic functionality is there but now comes the time for further improvements.

* more documentation is needed in order to make everything more acessible
* posting content is currently not implemented
* more tests have to be written
* more convinient input handling in the ECDSA package
* making some of the submodules into their own distributions may help kickstart more devellopment in the perl crypto space since in my research i noticed that a lot of concepts in various crypto projects are based on the same basics used in bitcoin originally


# How to contribute?

* the whole procent is up on [githup](https://github.com/snkoehn/perlSteemit) and im happy for issue reports or pull requests
* you can contact me on steem or via my cpan mail adress snkoehn@cpan.org

    

<br /><hr/><em>Posted on <a href="https://utopian.io/utopian-io/@hoffmann/steemit-wsclient-perl-bindings-to-steem-made-easy">Utopian.io -  Rewarding Open Source Contributors</a></em><hr/>
👍  , , , , , , , , , , , , , , , , , , , , , ,
properties (23)
authorhoffmann
permlinksteemit-wsclient-perl-bindings-to-steem-made-easy
categoryutopian-io
json_metadata"{"community":"utopian","app":"utopian/1.0.0","format":"markdown","repository":{"id":120881029,"name":"perlSteemit","full_name":"snkoehn/perlSteemit","html_url":"https://github.com/snkoehn/perlSteemit","fork":false,"owner":{"login":"snkoehn"}},"pullRequests":[{"url":"https://api.github.com/repos/snkoehn/perlSteemit/pulls/1","id":171222662,"html_url":"https://github.com/snkoehn/perlSteemit/pull/1","diff_url":"https://github.com/snkoehn/perlSteemit/pull/1.diff","patch_url":"https://github.com/snkoehn/perlSteemit/pull/1.patch","issue_url":"https://api.github.com/repos/snkoehn/perlSteemit/issues/1","number":1,"state":"closed","locked":false,"title":"Feat/key handling","user":{"login":"snkoehn","id":8384412,"avatar_url":"https://avatars1.githubusercontent.com/u/8384412?v=4","gravatar_id":"","url":"https://api.github.com/users/snkoehn","html_url":"https://github.com/snkoehn","followers_url":"https://api.github.com/users/snkoehn/followers","following_url":"https://api.github.com/users/snkoehn/following{/other_user}","gists_url":"https://api.github.com/users/snkoehn/gists{/gist_id}","starred_url":"https://api.github.com/users/snkoehn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snkoehn/subscriptions","organizations_url":"https://api.github.com/users/snkoehn/orgs","repos_url":"https://api.github.com/users/snkoehn/repos","events_url":"https://api.github.com/users/snkoehn/events{/privacy}","received_events_url":"https://api.github.com/users/snkoehn/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-02-25T10:08:53Z","updated_at":"2018-02-25T10:10:40Z","closed_at":"2018-02-25T10:10:37Z","merged_at":"2018-02-25T10:10:37Z","merge_commit_sha":"2e8cb942103c16ec8aefc0632b2978bbf4344a9e","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/snkoehn/perlSteemit/pulls/1/commits","review_comments_url":"https://api.github.com/repos/snkoehn/perlSteemit/pulls/1/comments","review_comment_url":"https://api.github.com/repos/snkoehn/perlSteemit/pulls/comments{/number}","comments_url":"https://api.github.com/repos/snkoehn/perlSteemit/issues/1/comments","statuses_url":"https://api.github.com/repos/snkoehn/perlSteemit/statuses/8455e091d00a43c9b09a408f06c19ebfb43988ac","head":{"label":"snkoehn:feat/key_handling","ref":"feat/key_handling","sha":"8455e091d00a43c9b09a408f06c19ebfb43988ac","user":{"login":"snkoehn","id":8384412,"avatar_url":"https://avatars1.githubusercontent.com/u/8384412?v=4","gravatar_id":"","url":"https://api.github.com/users/snkoehn","html_url":"https://github.com/snkoehn","followers_url":"https://api.github.com/users/snkoehn/followers","following_url":"https://api.github.com/users/snkoehn/following{/other_user}","gists_url":"https://api.github.com/users/snkoehn/gists{/gist_id}","starred_url":"https://api.github.com/users/snkoehn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snkoehn/subscriptions","organizations_url":"https://api.github.com/users/snkoehn/orgs","repos_url":"https://api.github.com/users/snkoehn/repos","events_url":"https://api.github.com/users/snkoehn/events{/privacy}","received_events_url":"https://api.github.com/users/snkoehn/received_events","type":"User","site_admin":false},"repo":{"id":120881029,"name":"perlSteemit","full_name":"snkoehn/perlSteemit","owner":{"login":"snkoehn","id":8384412,"avatar_url":"https://avatars1.githubusercontent.com/u/8384412?v=4","gravatar_id":"","url":"https://api.github.com/users/snkoehn","html_url":"https://github.com/snkoehn","followers_url":"https://api.github.com/users/snkoehn/followers","following_url":"https://api.github.com/users/snkoehn/following{/other_user}","gists_url":"https://api.github.com/users/snkoehn/gists{/gist_id}","starred_url":"https://api.github.com/users/snkoehn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snkoehn/subscriptions","organizations_url":"https://api.github.com/users/snkoehn/orgs","repos_url":"https://api.github.com/users/snkoehn/repos","events_url":"https://api.github.com/users/snkoehn/events{/privacy}","received_events_url":"https://api.github.com/users/snkoehn/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/snkoehn/perlSteemit","description":"implementation of the steemit api","fork":false,"url":"https://api.github.com/repos/snkoehn/perlSteemit","forks_url":"https://api.github.com/repos/snkoehn/perlSteemit/forks","keys_url":"https://api.github.com/repos/snkoehn/perlSteemit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/snkoehn/perlSteemit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/snkoehn/perlSteemit/teams","hooks_url":"https://api.github.com/repos/snkoehn/perlSteemit/hooks","issue_events_url":"https://api.github.com/repos/snkoehn/perlSteemit/issues/events{/number}","events_url":"https://api.github.com/repos/snkoehn/perlSteemit/events","assignees_url":"https://api.github.com/repos/snkoehn/perlSteemit/assignees{/user}","branches_url":"https://api.github.com/repos/snkoehn/perlSteemit/branches{/branch}","tags_url":"https://api.github.com/repos/snkoehn/perlSteemit/tags","blobs_url":"https://api.github.com/repos/snkoehn/perlSteemit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/snkoehn/perlSteemit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/snkoehn/perlSteemit/git/refs{/sha}","trees_url":"https://api.github.com/repos/snkoehn/perlSteemit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/snkoehn/perlSteemit/statuses/{sha}","languages_url":"https://api.github.com/repos/snkoehn/perlSteemit/languages","stargazers_url":"https://api.github.com/repos/snkoehn/perlSteemit/stargazers","contributors_url":"https://api.github.com/repos/snkoehn/perlSteemit/contributors","subscribers_url":"https://api.github.com/repos/snkoehn/perlSteemit/subscribers","subscription_url":"https://api.github.com/repos/snkoehn/perlSteemit/subscription","commits_url":"https://api.github.com/repos/snkoehn/perlSteemit/commits{/sha}","git_commits_url":"https://api.github.com/repos/snkoehn/perlSteemit/git/commits{/sha}","comments_url":"https://api.github.com/repos/snkoehn/perlSteemit/comments{/number}","issue_comment_url":"https://api.github.com/repos/snkoehn/perlSteemit/issues/comments{/number}","contents_url":"https://api.github.com/repos/snkoehn/perlSteemit/contents/{+path}","compare_url":"https://api.github.com/repos/snkoehn/perlSteemit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/snkoehn/perlSteemit/merges","archive_url":"https://api.github.com/repos/snkoehn/perlSteemit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/snkoehn/perlSteemit/downloads","issues_url":"https://api.github.com/repos/snkoehn/perlSteemit/issues{/number}","pulls_url":"https://api.github.com/repos/snkoehn/perlSteemit/pulls{/number}","milestones_url":"https://api.github.com/repos/snkoehn/perlSteemit/milestones{/number}","notifications_url":"https://api.github.com/repos/snkoehn/perlSteemit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/snkoehn/perlSteemit/labels{/name}","releases_url":"https://api.github.com/repos/snkoehn/perlSteemit/releases{/id}","deployments_url":"https://api.github.com/repos/snkoehn/perlSteemit/deployments","created_at":"2018-02-09T08:48:49Z","updated_at":"2018-02-09T09:20:35Z","pushed_at":"2018-02-25T10:11:38Z","git_url":"git://github.com/snkoehn/perlSteemit.git","ssh_url":"git@github.com:snkoehn/perlSteemit.git","clone_url":"https://github.com/snkoehn/perlSteemit.git","svn_url":"https://github.com/snkoehn/perlSteemit","homepage":null,"size":55,"stargazers_count":0,"watchers_count":0,"language":"Perl","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"snkoehn:master","ref":"master","sha":"3bd0e4ace3655c5182ce8fd069356a639000bbe3","user":{"login":"snkoehn","id":8384412,"avatar_url":"https://avatars1.githubusercontent.com/u/8384412?v=4","gravatar_id":"","url":"https://api.github.com/users/snkoehn","html_url":"https://github.com/snkoehn","followers_url":"https://api.github.com/users/snkoehn/followers","following_url":"https://api.github.com/users/snkoehn/following{/other_user}","gists_url":"https://api.github.com/users/snkoehn/gists{/gist_id}","starred_url":"https://api.github.com/users/snkoehn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snkoehn/subscriptions","organizations_url":"https://api.github.com/users/snkoehn/orgs","repos_url":"https://api.github.com/users/snkoehn/repos","events_url":"https://api.github.com/users/snkoehn/events{/privacy}","received_events_url":"https://api.github.com/users/snkoehn/received_events","type":"User","site_admin":false},"repo":{"id":120881029,"name":"perlSteemit","full_name":"snkoehn/perlSteemit","owner":{"login":"snkoehn","id":8384412,"avatar_url":"https://avatars1.githubusercontent.com/u/8384412?v=4","gravatar_id":"","url":"https://api.github.com/users/snkoehn","html_url":"https://github.com/snkoehn","followers_url":"https://api.github.com/users/snkoehn/followers","following_url":"https://api.github.com/users/snkoehn/following{/other_user}","gists_url":"https://api.github.com/users/snkoehn/gists{/gist_id}","starred_url":"https://api.github.com/users/snkoehn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snkoehn/subscriptions","organizations_url":"https://api.github.com/users/snkoehn/orgs","repos_url":"https://api.github.com/users/snkoehn/repos","events_url":"https://api.github.com/users/snkoehn/events{/privacy}","received_events_url":"https://api.github.com/users/snkoehn/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/snkoehn/perlSteemit","description":"implementation of the steemit api","fork":false,"url":"https://api.github.com/repos/snkoehn/perlSteemit","forks_url":"https://api.github.com/repos/snkoehn/perlSteemit/forks","keys_url":"https://api.github.com/repos/snkoehn/perlSteemit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/snkoehn/perlSteemit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/snkoehn/perlSteemit/teams","hooks_url":"https://api.github.com/repos/snkoehn/perlSteemit/hooks","issue_events_url":"https://api.github.com/repos/snkoehn/perlSteemit/issues/events{/number}","events_url":"https://api.github.com/repos/snkoehn/perlSteemit/events","assignees_url":"https://api.github.com/repos/snkoehn/perlSteemit/assignees{/user}","branches_url":"https://api.github.com/repos/snkoehn/perlSteemit/branches{/branch}","tags_url":"https://api.github.com/repos/snkoehn/perlSteemit/tags","blobs_url":"https://api.github.com/repos/snkoehn/perlSteemit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/snkoehn/perlSteemit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/snkoehn/perlSteemit/git/refs{/sha}","trees_url":"https://api.github.com/repos/snkoehn/perlSteemit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/snkoehn/perlSteemit/statuses/{sha}","languages_url":"https://api.github.com/repos/snkoehn/perlSteemit/languages","stargazers_url":"https://api.github.com/repos/snkoehn/perlSteemit/stargazers","contributors_url":"https://api.github.com/repos/snkoehn/perlSteemit/contributors","subscribers_url":"https://api.github.com/repos/snkoehn/perlSteemit/subscribers","subscription_url":"https://api.github.com/repos/snkoehn/perlSteemit/subscription","commits_url":"https://api.github.com/repos/snkoehn/perlSteemit/commits{/sha}","git_commits_url":"https://api.github.com/repos/snkoehn/perlSteemit/git/commits{/sha}","comments_url":"https://api.github.com/repos/snkoehn/perlSteemit/comments{/number}","issue_comment_url":"https://api.github.com/repos/snkoehn/perlSteemit/issues/comments{/number}","contents_url":"https://api.github.com/repos/snkoehn/perlSteemit/contents/{+path}","compare_url":"https://api.github.com/repos/snkoehn/perlSteemit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/snkoehn/perlSteemit/merges","archive_url":"https://api.github.com/repos/snkoehn/perlSteemit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/snkoehn/perlSteemit/downloads","issues_url":"https://api.github.com/repos/snkoehn/perlSteemit/issues{/number}","pulls_url":"https://api.github.com/repos/snkoehn/perlSteemit/pulls{/number}","milestones_url":"https://api.github.com/repos/snkoehn/perlSteemit/milestones{/number}","notifications_url":"https://api.github.com/repos/snkoehn/perlSteemit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/snkoehn/perlSteemit/labels{/name}","releases_url":"https://api.github.com/repos/snkoehn/perlSteemit/releases{/id}","deployments_url":"https://api.github.com/repos/snkoehn/perlSteemit/deployments","created_at":"2018-02-09T08:48:49Z","updated_at":"2018-02-09T09:20:35Z","pushed_at":"2018-02-25T10:11:38Z","git_url":"git://github.com/snkoehn/perlSteemit.git","ssh_url":"git@github.com:snkoehn/perlSteemit.git","clone_url":"https://github.com/snkoehn/perlSteemit.git","svn_url":"https://github.com/snkoehn/perlSteemit","homepage":null,"size":55,"stargazers_count":0,"watchers_count":0,"language":"Perl","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/snkoehn/perlSteemit/pulls/1"},"html":{"href":"https://github.com/snkoehn/perlSteemit/pull/1"},"issue":{"href":"https://api.github.com/repos/snkoehn/perlSteemit/issues/1"},"comments":{"href":"https://api.github.com/repos/snkoehn/perlSteemit/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/snkoehn/perlSteemit/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/snkoehn/perlSteemit/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/snkoehn/perlSteemit/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/snkoehn/perlSteemit/statuses/8455e091d00a43c9b09a408f06c19ebfb43988ac"}},"author_association":"OWNER"}],"platform":"github","type":"development","tags":["utopian-io","steemdev","steemit","perl","cryptocurrency"],"users":["hoffmann","author","cpan.org"],"links":["https://res.cloudinary.com/hpiynhbhq/image/upload/v1519557585/dfvtlfyaqugkrzkvcd7i.png","https://utopian.io/utopian-io/@hoffmann/howto-write-a-steemit-client-in-perl-readonly-for-now","https://metacpan.org/pod/Steemit::WsClient","https://metacpan.org/pod/distribution/Math-GMPz/GMPz.pod","https://metacpan.org/pod/Math::BigInt","https://en.bitcoin.it/wiki/Wallet_import_format","https://metacpan.org/pod/Math::EllipticCurve::Prime::Point","https://metacpan.org/source/Steemit::ECDSA","https://github.com/snkoehn/perlSteemit"],"image":["https://res.cloudinary.com/hpiynhbhq/image/upload/v1519557585/dfvtlfyaqugkrzkvcd7i.png"],"moderator":{"account":"codingdefined","time":"2018-02-28T04:13:06.804Z","reviewed":true,"pending":false,"flagged":false},"questions":[],"score":0}"
created2018-02-25 13:15:39
last_update2018-02-28 04:13:06
depth0
children5
last_payout2018-03-04 13:15:39
cashout_time1969-12-31 23:59:59
total_payout_value28.736 HBD
curator_payout_value12.051 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length6,277
author_reputation637,879,914,071
root_title"Steemit::WsClient - perl bindings to steem made easy"
beneficiaries
0.
accountutopian.pay
weight2,500
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id40,333,603
net_rshares9,090,954,660,212
author_curate_reward""
vote details (23)
@codingdefined ·
$0.09
Thank you for the contribution. It has been approved.

You can contact us on [Discord](https://discord.gg/uTyJkNm).
**[[utopian-moderator]](https://utopian.io/moderators)**
👍  
properties (23)
authorcodingdefined
permlinkre-hoffmann-steemit-wsclient-perl-bindings-to-steem-made-easy-20180228t041311379z
categoryutopian-io
json_metadata{"tags":["utopian-io"],"community":"utopian","app":"utopian/1.0.0"}
created2018-02-28 04:13:12
last_update2018-02-28 04:13:12
depth1
children0
last_payout2018-03-07 04:13:12
cashout_time1969-12-31 23:59:59
total_payout_value0.071 HBD
curator_payout_value0.023 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length172
author_reputation535,286,590,776,622
root_title"Steemit::WsClient - perl bindings to steem made easy"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id41,027,362
net_rshares17,323,875,358
author_curate_reward""
vote details (1)
@shantamcbain ·
$0.11
Fantastic! @hoffmann I will attempt to incorporate it into my Perl application.  I will post and comment on the progress as I make it.
👍  
properties (23)
authorshantamcbain
permlinkre-hoffmann-steemit-wsclient-perl-bindings-to-steem-made-easy-20180301t003311224z
categoryutopian-io
json_metadata{"tags":["utopian-io"],"users":["hoffmann"],"app":"steemit/0.1"}
created2018-03-01 00:33:12
last_update2018-03-01 00:33:12
depth1
children0
last_payout2018-03-08 00:33:12
cashout_time1969-12-31 23:59:59
total_payout_value0.080 HBD
curator_payout_value0.026 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length134
author_reputation1,455,168,455,192
root_title"Steemit::WsClient - perl bindings to steem made easy"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id41,250,418
net_rshares19,856,605,674
author_curate_reward""
vote details (1)
@steemitboard ·
Congratulations @hoffmann! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

[![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/votes.png)](http://steemitboard.com/@hoffmann) Award for the number of upvotes
[![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/payout.png)](http://steemitboard.com/@hoffmann) Award for the total payout received

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click [here](https://steemit.com/@steemitboard)

If you no longer want to receive notifications, reply to this comment with the word `STOP`

> Upvote this notification to help all Steemit users. Learn why [here](https://steemit.com/steemitboard/@steemitboard/http-i-cubeupload-com-7ciqeo-png)!
properties (22)
authorsteemitboard
permlinksteemitboard-notify-hoffmann-20180226t212638000z
categoryutopian-io
json_metadata{"image":["https://steemitboard.com/img/notifications.png"]}
created2018-02-26 21:26:36
last_update2018-02-26 21:26:36
depth1
children0
last_payout2018-03-05 21:26:36
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length834
author_reputation38,975,615,169,260
root_title"Steemit::WsClient - perl bindings to steem made easy"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id40,695,804
net_rshares0
@steemitstats ·
@hoffmann, Upvote is the only thing I can support you.
properties (22)
authorsteemitstats
permlink20180225t131604925z-post
categoryutopian-io
json_metadata{"tags":["utopian-io"]}
created2018-02-25 13:16:06
last_update2018-02-25 13:16:06
depth1
children0
last_payout2018-03-04 13:16:06
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length54
author_reputation351,882,871,185
root_title"Steemit::WsClient - perl bindings to steem made easy"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id40,333,690
net_rshares0
@utopian-io ·
$0.10
### Hey @hoffmann I am @utopian-io. I have just upvoted you!
#### Achievements
- You have less than 500 followers. Just gave you a gift to help you succeed!
- Seems like you contribute quite often. AMAZING!
#### Community-Driven Witness!
I am the first and only Steem Community-Driven Witness. <a href="https://discord.gg/zTrEMqB">Participate on Discord</a>. Lets GROW TOGETHER!
- <a href="https://v2.steemconnect.com/sign/account-witness-vote?witness=utopian-io&approve=1">Vote for my Witness With SteemConnect</a>
- <a href="https://v2.steemconnect.com/sign/account-witness-proxy?proxy=utopian-io&approve=1">Proxy vote to Utopian Witness with SteemConnect</a>
- Or vote/proxy on <a href="https://steemit.com/~witnesses">Steemit Witnesses</a>

[![mooncryption-utopian-witness-gif](https://steemitimages.com/DQmYPUuQRptAqNBCQRwQjKWAqWU3zJkL3RXVUtEKVury8up/mooncryption-s-utopian-io-witness-gif.gif)](https://steemit.com/~witnesses)

**Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x**
👍  
properties (23)
authorutopian-io
permlinkre-hoffmann-steemit-wsclient-perl-bindings-to-steem-made-easy-20180228t155124742z
categoryutopian-io
json_metadata{"tags":["utopian-io"],"community":"utopian","app":"utopian/1.0.0"}
created2018-02-28 15:51:24
last_update2018-02-28 15:51:24
depth1
children0
last_payout2018-03-07 15:51:24
cashout_time1969-12-31 23:59:59
total_payout_value0.077 HBD
curator_payout_value0.023 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length1,084
author_reputation152,955,367,999,756
root_title"Steemit::WsClient - perl bindings to steem made easy"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id41,156,518
net_rshares18,742,204,335
author_curate_reward""
vote details (1)