New to Busy?

update for beem: create posts more easily and draw pseudo-random numbers

21 comments

holger80
74
last month6 min read

Repository

https://github.com/holgern/beem


beem-logo

beem is a python library and command line tool for HIVE. The current version is 0.23.11.

There is also a discord channel for beem: https://discord.gg/4HM592V

The newest beem version can be installed by:

pip install -U beem

Check that you are using hive nodes. The following command

beempy updatenodes --hive

updates the nodelist and uses only hive nodes. After setting hive as default_chain, beempy updatenodes can be used.

The list of nodes can be checked with

beempy config

and

beempy currentnode

shows the currently connected node.

Changelog for versions 0.23.10

  • get_node_answer_time added to NodeList
  • New node added
  • new stored parameter: default_canonical_url
  • beempy notifications sorting is reversed, a new parameter can be used to change the sorting
  • New beempy createpost command, it can be used to create an empty markdown file with YAML header for a new post
  • beempy post has now a canonical_url parameter, when not set, default_canonical_url is set
  • New beempy draw command, can be used to generate pseudo-random number from block identifiers using hashsums
  • remove enum34 dependency

Changelog for version 0.23.11

  • replace asn1 by asn1crypto

Setting canonical URLs when posting with beempy

The canonical_url field in the json_metadata of a post is part of an open standard that defines which canonical URL should be set by all hive front-ends.

The canonical URL is then parsed by the search engines and shown in search results.

A default canonical URL can now be set with

beemy set default_canonical_url https://hive.blog

When not modified, https://hive.blog is the default value. When posting now with beempy post this canonical URL is set in the json_metadata field.

It is also possible to set a canonical URL by:

beempy post --canonical-url https://hive.blog my_post.md

Create a new markdown file for posting

The following command

beempy createpost my_new_post.md

can be used to create an empty markdown file with a YAML header.
After executing the command, beempy asks the following questions:
beempy createpost
and creates the following YAML header in the created markdown file:
Resulting YAML header

Draw pseudo-random numbers and post the result as a comment

beempy draw can be used to generate pseudo-random numbers based on a seed which is generated as follows:

    if hashtype == "md5":
        seed = hashlib.md5((trx_id + block["block_id"] + block["previous"]).encode()).hexdigest()
    elif hashtype == "sha256":
        seed = hashlib.sha256((trx_id + block["block_id"] + block["previous"]).encode()).hexdigest()
    elif hashtype == "sha512":
        seed = hashlib.sha512((trx_id + block["block_id"] + block["previous"]).encode()).hexdigest()

beempy draw uses three entropy sources: the hash of the last block, the hash of the current block and the hash of a transaction inside the current block.

When using md5 as hashtype, the seed is used to initialize the random generator:

random.seed(a=seed, version=2)
number = int(random.random() * len(draw_list))

This is e.g. used in splinterlands to generate random numbers.

When using sha256 or sha512, ,<draw_number> is added to the seed and a pseudo-random number is generated by

bigRand = int.from_bytes(seed, 'big')
number = bigRand % (len(draw_list))

It is possible to choose the separator by using -s parameter.

The results for sha256 can be validated here.

Usage

The following command uses the latest block number and the last transaction for building the seed and draw three number of 1000 different ones.

beempy draw -d 3 -p 1000

creates the following output

+--------------+------------------------------------------+
| Key          | Value                                    |
+--------------+------------------------------------------+
| block number | 43892950                                 |
| trx id       | 38206e28dcbf15d8f9ce1be907fb60a99d427171 |
| block id     | 029dc0d6a1fe487b5f2907988ba72b3ba495589b |
| previous     | 029dc0d55023bdf2f6450083c52349c4cd838f65 |
| hash type    | sha256                                   |
| draws        | 3                                        |
| participants | 1000                                     |
| 1. draw      | 406                                      |
| 2. draw      | 568                                      |
| 3. draw      | 186                                      |
+--------------+------------------------------------------+

We can validate the results by adding the value of trx id, block id and previous in this order into the seed field of this pseudo-random generator:

We can see that the same numbers were generated.

The results can also be validated by

beempy draw -d 3 -p 1000 -b 43892950 -t 38206e28dcbf15d8f9ce1be907fb60a99d427171

Adding --markdown or -m creates a markdown output which can directly copied into a post. The command above with -m generates:

The following results can be checked with:

beempy draw -d 3 -p 1000 -b 43892950 -t 38206e28dcbf15d8f9ce1be907fb60a99d427171 -h sha256 -s ','
keyvalue
block number43892950
trx id38206e28dcbf15d8f9ce1be907fb60a99d427171
block id029dc0d6a1fe487b5f2907988ba72b3ba495589b
previous id029dc0d55023bdf2f6450083c52349c4cd838f65
hash typesha256
draws3
participants1000
1. draw406
2. draw568
3. draw186

Posting the results directly as reply

This can be used to directly publish results in a comment.

beempy draw -d 3 -p 10 --reply @user/my-post

@user/my-post is the parent post to which the comment is replied.

Prevent cheating

A user could rerun beempy draw until the results are fitting. This can be prevented by defining previously which future block number is used for generating the pseudo-random numbers.

Or a future broadcast is used as reference, e.g. the next post. After broadcasting a new post, the trx-id and the block number can be checked and provided to ´beempy draw´.

Creating a participants list to draw user from a list

beempy draw can be used to draw account names from a list of accounts. The participants can be stored in a text file where each line is one participant.

In order to draw one account, I can store all participating accounts in a file:

@holger80
@beembot
@beempy

A participant can now be selected by:

beempy draw -p account_list.txt

which results in

+--------------+------------------------------------------+
| Key          | Value                                    |
+--------------+------------------------------------------+
| block number | 43893720                                 |
| trx id       | c12b9911d6c9d950f02700ae70c066e105c40aba |
| block id     | 029dc3d8bc1518ad8a92c6e9fd2cce4e64095fb2 |
| previous     | 029dc3d7d7b53b31b7d389a0cc9a84e8352ddb19 |
| hash type    | sha256                                   |
| draws        | 1                                        |
| participants | 3                                        |
| 1. draw      | 2 - @beembot                             |
+--------------+------------------------------------------+

The order of the participants should be clear (e.g. ordered by date or ordered by letter) and defined previously.

When each participant should only be drawn once, the --without-replacement or -w parameter must be used.

Feedback

Do you have some new ideas or improvements for beem or beempy? Let me know.


If you like what I do, consider casting a vote for me as witness on Hivesigner or on PeakD

Comments

Sort byBest