Repository
https://github.com/holgern/beem
beem is a python library and command line tool for HIVE. The current version is 0.23.12.
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.12
- add participation_rate to Blockchain
- beembase.transactions is deprecated
- get_block_params added to TransactionBuilder
- add Prefix class for PasswordKey, Brainkey, Address, PublicKey, PrivateKey, Base58
- New Class BitcoinAddress
- Address class has now from_pubkey class method
- Message class improved
- beempy message can be used to sign and to verify a message
- decryption of long messages fixed
- varint decoding added to memo decryption
- beempy encrypt / decrypt can be used to encrypt/decrypt a memo text with your memo key
Sign and verify a message
I can now sign a message with my private memo key and everyone can verify the signature.
Assuming I would like to sign the following message with my memo key:
This is a text message from holger80!
I can do this by storing the message into a text file and run
beempy message -a holger80 my_message.txt
The message is read and signed and the following result is stored in the text file:
-----BEGIN HIVE SIGNED MESSAGE-----
This is a text message from holger80!
-----BEGIN META-----
account=holger80
memokey=STM6MQBLaX9Q15CK3prXoWK4C6EqtsL7C4rqq1h6BQjxvfk9tuT3N
block=44092995
timestamp=2020-06-07T20:26:54
-----BEGIN SIGNATURE-----
203020dbdde48c910ccf565413c6b44eeb7d8908c70169ce27be99d8907cf35e661e5e08abd77309b6bab4dceb9a3c6f48c0bc3ba27445b957a47b3019ec810cc1
-----END HIVE SIGNED MESSAGE-----
Any receiver of my signed message can now verify that the message was not modified and that it's signed with the memo key from my account.
beempy message --verify my_message.txt
returns
Could verify message!
when successful.
Addresses
I merged new changes of python-graphenelib to beemgraphenebase.account
which handle public and private keys as well as address generation. Prefix (STM
for hive) handling is now improved.
Did you know that each hive account has also 4 bitcoin addresses that are able to receive bitcoin? You could use the corresponding private key to move then received bitcoin. Let's check if there any bitcoin on the bitcoin address corresponding to my active key.
from beem.account import Account
from beemgraphenebase.account import BitcoinPublicKey
account = Account("holger80")
pub_key = account["active"]["key_auths"][0][0]
btc_address = BitcoinPublicKey(pub_key).address
print(str(btc_address))
returns
19HWfZyax16TwFHjpDCBMzExQg9TKHTQ9f
Let's check : https://live.blockcypher.com/btc/address/19HWfZyax16TwFHjpDCBMzExQg9TKHTQ9f/
Nothing there yet. It would be also possible to convert the private key into a segwit or bech32 address (but not with beem, as do not think this is very useful).
Bitcoin address generation is used in beem for encrypting wifs for storing them in the beempy wallet according to BIP38. The bitcoin address is used in beemgraphenebase.bip38
for encrypt
and decrypt
which is then used in beem.wallet
.
Encrypting / Decrypting memos
I finally fixed memo encryption / decryption in beem and added a new beempy command for easier memo encrytion/decryption. It is now possible to encrypt/decrypt long messages.
I estimated the length of the varint part of the encrypted message by
numBytes = 16 - len(cipher) % 16
n = 16 - numBytes
message = cipher[n:]
Before n
was fixed to 2 (assuming that the varint has a length of 2), which did not work for long messages, as the varint has then 4 bytes or even more.
I fixed the memo decryption (prevously the first chars of a decrypted memo were wrong) by doing a varintdecode on the decrypted memo:
n = varintdecode(message)
return '#' + message[len(message) - n:].decode("utf8")
which allows me to remove the varint (stores the message length) part at the beginning of the decrypted message correctly.
I can now decrypt the following long message beempy:
The encrypted memo should be put into quotes:
beempy decrypt -a holger80 hive.revolution "#2BVUtjeRYh3en8QLHgLDRojcRWMZEiKLaqPkxD9gubLcfFyH3c3JmwgGGScoEAWVTDAgsVpvC4HtsEbmsKkQuMksK8UhXu5eG2sYk1rJg3ry42bn31D5bopjmk1nAXhxenTUbsBPmeW2AQtj4CJg3DtPeUc9JCUPKd5sEbYpN2oJks3fDqcVSx8xAtw3Hk51zkxxnwECKsQ1moricvjA4rTmexCxx2RLQ89NdzQxvzQdVooJcFKRWqF3RiMdihif7bExuKffTAeqonYfN6FynA1T4hjL3y1BpYAYdPYBigdxSzNuS6EcmqRXF7vGeVeGMqZjrDZ73odakLziAW15xqTQGQYbFdo1Y72Gpt49jdk5WqQSSecNAvagCN7qYXwLUteHg84nA7mQp2mLSy2uBsftK9Q53vHbDZbu9Ldo8arF4ijBj3YDkjj5TNQq6EB4adp5JTY4tCV6AWRgBEPVHDCvTXCMQBM85L9DK9fctCou8yr61daCyxUVnfiPA9SMvTJdk4sFz6AYF7t5ZJeuLzEVE1XNYDVDfSqXoLTdkHfJv8rHiqEPny4ZqWjQNrhgqaZUvxEE7Zqvkb5UXwgWnAmR6KEP5p1U3An1USjndThtYTsRWRenWvBHZj617eunGAghr5ikFxn2fn9gqBMmyLEC1tiX3KfyYPvwtoxvU7AQqkdQhgeAdGaNezx"
Returns now the correct beginning and is able to decrypt the memo (in previous beem versions, the decryption of this memo did not work at all):
#Hello comrade, ...
It is also possible to encrypt a message:
beempy encrypt -a holger80 beempy "#test1"
or more than one message:
beempy encrypt -a holger80 beempy "#test1" "#test2"
I can also encrypt a memo that is only decryptable by myself:
beempy encrypt -a holger80 holger80 "#test1" "#test2"
When using the --text
flag, the memo text is read from the provided text file and overwritten by the encrypted/decrypted text.
beempy encrypt -a holger80 --text beempy my-memo-text.txt
If you like what I do, consider casting a vote for me as witness on Hivesigner or on PeakD
Hey man what you're doing is really awesome. I'm trying to do the same with dhive. Do you need to do serialization of buffer with decoding memo? I noticed you don't do any of that with beem.
I'm doing this inside the Memo class, you can see it here:
https://github.com/holgern/beem/blob/87f462aa2fa86df40e38c9a46784fc45eab7effc/beembase/memo.py#L204
Have you checked the implementation if hive-js: https://gitlab.syncad.com/hive/hive-js/-/blob/master/src/auth/memo.js ?
Thank you for sharing so I can learn more about beem.
After making the script it didn't run and I got an error. And I didn't get the error until I realized that I hadn't updated. I had installed version 0.23.11 of your previous post and when I updated to version 0.23.12 it ran perfectly and threw me the address:1G2SsQGpXsc5TGdw1i5wZv8PssiqNZC1cs. Very happy and me because the script ran. Greetings
I had no idea our hive accounts also have bitcoins addresses we can use. :)
Nice updates to beem/beempy!
One of the other days I was wondering if something like this would be helpful:
A feature in an API like beem to be able to retrieve account history entries from a local blockchain mirror, provided the block id needed is older than the last block on the local blockchain mirror. Otherwise, send a request to a seed node which provides account history for newer blocks.
How I believe it would help?
Do you think it's worth the effort to implement such an extension to beem for account history?
Fantastic tools that will bring better user experience to the Hive ecosystem. Big ups to the developers
Nice tool to check out, decrypting and encrypting the message. The best part no need to send fees.
I will play around.
Bello, Nice to meet you?
Hi @holger80, you have received a small bonus upvote from MAXUV.
This is to inform you that you now have new MPATH tokens in your Hive-Engine wallet.
Please read this post for more information.
Thanks for being a member of both MAXUV and MPATH!
Hi
I have picked your post for my daily hive voting initiative, Keep it up and Hive On!!