Ecoer Logo
ajose01

@ajose01

25

Blockchain / bot builder / engineering lead for @sensay / http://makesense.com . Exploring crypto, blockchains and bots :) #EOS_IO $SENSE

hive.blog/@ajose01
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
9.285USD
HIVE
0.001HIVE
HBD
0.000HBD
Own HP
18.107HP

Detailed Balance

HIVE
balance
0.001HIVE
market_balance
0.000HIVE
savings_balance
0.000HIVE
reward_hive_balance
0.397HIVE
HIVE POWER
Own HP
18.107HP
Delegated Out
0.000HP
Delegation In
0.000HP
Effective Power
18.107HP
Reward HP (pending)
1.365HP
HBD
hbd_balance
0.000HBD
hbd_conversions
0.000HBD
hbd_market_balance
0.000HBD
savings_hbd_balance
0.000HBD
reward_hbd_balance
1.883HBD
{
  "balance": "0.001 HIVE",
  "savings_balance": "0.000 HIVE",
  "reward_hive_balance": "0.397 HIVE",
  "vesting_shares": "29393.378778 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "0.000000 VESTS",
  "hbd_balance": "0.000 HBD",
  "savings_hbd_balance": "0.000 HBD",
  "reward_hbd_balance": "1.883 HBD"
}

Account Info

nameajose01
id967825
rank0
reputation0
created2018-05-07T18:52:30
recovery_accountsteemcreate
proxyNone
invited_bynull
post_count9
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2019-04-12T07:30:15
last_root_post2019-04-12T07:30:15
last_vote_time1970-01-01T00:00:00
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votesNone
governance_vote_expiration_ts1969-12-31T23:59:59
balance0.001 HIVE
savings_balance0.000 HIVE
hbd_balance0.000 HBD
savings_hbd_balance0.000 HBD
vesting_shares29393.378778 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares0.000000 VESTS
reward_vesting_balance2772.564472 VESTS
vesting_balance0.000 HIVE
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2018-05-17T00:06:54
minedNo
hbd_seconds0
hbd_last_interest_payment1970-01-01T00:00:00
savings_hbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 967825,
  "name": "ajose01",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7wd6bDHaccjZtVcEh4MRby2qkv23sWR5XXrVyynLabG7uHackF",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5cb2xX7FRdEZvwUBLsJvTVkzieSDpStJbF16T2g4BxF9WFSxZi",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [
      [
        "dlive.app",
        1
      ]
    ],
    "key_auths": [
      [
        "STM7e2edM8YhV6vM6zASK33AGXCWijwvexKYvnsrXzMjcKjJiw5Qm",
        1
      ]
    ]
  },
  "memo_key": "STM6yYFUmm4tg74FNeZ5QMioTq45hyuhvW9opk4cEZ3UYpZStWLac",
  "json_metadata": "{\"profile\":{\"profile_image\":\"https://steemitimages.com/DQmQKiEhpoZV9oVgEMpkFji1M8CxVsaUQ7qSki3HhZkuVZQ/angel_social.JPG\",\"name\":\"Angel Jose\",\"about\":\"Blockchain / bot builder / engineering lead for @sensay / http://makesense.com . Exploring crypto, blockchains and bots :) #EOS_IO $SENSE\"}}",
  "posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://steemitimages.com/DQmQKiEhpoZV9oVgEMpkFji1M8CxVsaUQ7qSki3HhZkuVZQ/angel_social.JPG\",\"name\":\"Angel Jose\",\"about\":\"Blockchain / bot builder / engineering lead for @sensay / http://makesense.com . Exploring crypto, blockchains and bots :) #EOS_IO $SENSE\"}}",
  "proxy": "",
  "previous_owner_update": "1970-01-01T00:00:00",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_account_update": "2018-05-17T00:06:54",
  "created": "2018-05-07T18:52:30",
  "mined": false,
  "recovery_account": "steemcreate",
  "last_account_recovery": "1970-01-01T00:00:00",
  "reset_account": "null",
  "comment_count": 0,
  "lifetime_vote_count": 0,
  "post_count": 9,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": 29393378778,
    "last_update_time": 1555054128
  },
  "downvote_manabar": {
    "current_mana": 0,
    "last_update_time": 1525719147
  },
  "voting_power": 0,
  "balance": "0.001 HIVE",
  "savings_balance": "0.000 HIVE",
  "hbd_balance": "0.000 HBD",
  "hbd_seconds": "0",
  "hbd_seconds_last_update": "1970-01-01T00:00:00",
  "hbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_hbd_balance": "0.000 HBD",
  "savings_hbd_seconds": "0",
  "savings_hbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_hbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "reward_hbd_balance": "1.883 HBD",
  "reward_hive_balance": "0.397 HIVE",
  "reward_vesting_balance": "2772.564472 VESTS",
  "reward_vesting_hive": "1.365 HIVE",
  "vesting_shares": "29393.378778 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "0.000000 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "post_voting_power": "29393.378778 VESTS",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "withdrawn": 0,
  "to_withdraw": 0,
  "withdraw_routes": 0,
  "pending_transfers": 0,
  "curation_rewards": 0,
  "posting_rewards": 2727,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "witnesses_voted_for": 0,
  "last_post": "2019-04-12T07:30:15",
  "last_root_post": "2019-04-12T07:30:15",
  "last_vote_time": "1970-01-01T00:00:00",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "governance_vote_expiration_ts": "1969-12-31T23:59:59",
  "delayed_votes": [],
  "open_recurrent_transfers": 0,
  "vesting_balance": "0.000 HIVE",
  "reputation": 0,
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 0
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
vorygasent 0.001 HIVE to @ajose01- "UA_SOSAT"
2026/03/14 23:11:51
toajose01
fromvoryga
memoUA_SOSAT
amount0.001 HIVE
Transaction InfoBlock #104635563/Trx cc33c4b2da87ed0c53a281961250ea37125e8482
View Raw JSON Data
{
  "op": [
    "transfer",
    {
      "to": "ajose01",
      "from": "voryga",
      "memo": "UA_SOSAT",
      "amount": "0.001 HIVE"
    }
  ],
  "block": 104635563,
  "trx_id": "cc33c4b2da87ed0c53a281961250ea37125e8482",
  "op_in_trx": 0,
  "timestamp": "2026-03-14T23:11:51",
  "virtual_op": false,
  "trx_in_block": 11
}
2021/01/08 19:13:42
bodyCongratulations @ajose01! You have completed the following achievement on the Hive blockchain and have been rewarded with new badge(s) : <table><tr><td><img src="https://images.hive.blog/60x70/http://hivebuzz.me/@ajose01/replies.png?202101081555"></td><td>You got more than 10 replies. Your next target is to reach 50 replies.</td></tr> </table> <sub>_You can view your badges on [your board](https://hivebuzz.me/@ajose01) and compare yourself to others in the [Ranking](https://hivebuzz.me/ranking)_</sub> <sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub> **Do not miss the last post from @hivebuzz:** <table><tr><td><a href="/hivebuzz/@hivebuzz/pud-202101-feedback"><img src="https://images.hive.blog/64x128/https://i.imgur.com/xQGM37X.png"></a></td><td><a href="/hivebuzz/@hivebuzz/pud-202101-feedback">Feedback from the January 1st Hive Power Up Day</a></td></tr></table>
title
authorhivebuzz
permlinkhivebuzz-notify-ajose01-20210108t191341000z
json metadata{"image":["http://hivebuzz.me/notify.t6.png"]}
parent authorajose01
parent permlink4qpcsr-eos-signature-verification-with-elixir
Transaction InfoBlock #50268031/Trx 72ba2ef456c57d4e79d089930d32a064db43c710
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "Congratulations @ajose01! You have completed the following achievement on the Hive blockchain and have been rewarded with new badge(s) :\n\n<table><tr><td><img src=\"https://images.hive.blog/60x70/http://hivebuzz.me/@ajose01/replies.png?202101081555\"></td><td>You got more than 10 replies. Your next target is to reach 50 replies.</td></tr>\n</table>\n\n<sub>_You can view your badges on [your board](https://hivebuzz.me/@ajose01) and compare yourself to others in the [Ranking](https://hivebuzz.me/ranking)_</sub>\n<sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub>\n\n\n\n**Do not miss the last post from @hivebuzz:**\n<table><tr><td><a href=\"/hivebuzz/@hivebuzz/pud-202101-feedback\"><img src=\"https://images.hive.blog/64x128/https://i.imgur.com/xQGM37X.png\"></a></td><td><a href=\"/hivebuzz/@hivebuzz/pud-202101-feedback\">Feedback from the January 1st Hive Power Up Day</a></td></tr></table>",
      "title": "",
      "author": "hivebuzz",
      "permlink": "hivebuzz-notify-ajose01-20210108t191341000z",
      "json_metadata": "{\"image\":[\"http://hivebuzz.me/notify.t6.png\"]}",
      "parent_author": "ajose01",
      "parent_permlink": "4qpcsr-eos-signature-verification-with-elixir"
    }
  ],
  "block": 50268031,
  "trx_id": "72ba2ef456c57d4e79d089930d32a064db43c710",
  "op_in_trx": 0,
  "timestamp": "2021-01-08T19:13:42",
  "virtual_op": false,
  "trx_in_block": 20
}
2019/05/07 20:08:30
bodyCongratulations @ajose01! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@ajose01/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@ajose01) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=ajose01)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/steemitboard/@steemitboard/steemitboard-witness-update-2019-05"><img src="https://steemitimages.com/64x128/http://i.cubeupload.com/7CiQEO.png"></a></td><td><a href="https://steemit.com/steemitboard/@steemitboard/steemitboard-witness-update-2019-05">SteemitBoard - Witness Update</a></td></tr><tr><td><a href="https://steemit.com/steemmeetupaachen/@steemitboard/steemitboard-to-support-the-german-speaking-community-meetups"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmeoNp9iCaCfd2D6TqnWa3Aky2mU4Fm3xaSmjTM91YoNBS/image.png"></a></td><td><a href="https://steemit.com/steemmeetupaachen/@steemitboard/steemitboard-to-support-the-german-speaking-community-meetups">SteemitBoard to support the german speaking community meetups</a></td></tr></table> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
title
authorsteemitboard
permlinksteemitboard-notify-ajose01-20190507t200827000z
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
parent authorajose01
parent permlink4qpcsr-eos-signature-verification-with-elixir
Transaction InfoBlock #32707822/Trx 1b2fd5978978cccabc7b29a4c0bf8f380a010190
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "Congratulations @ajose01! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@ajose01/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@ajose01) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=ajose01)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/steemitboard/@steemitboard/steemitboard-witness-update-2019-05\"><img src=\"https://steemitimages.com/64x128/http://i.cubeupload.com/7CiQEO.png\"></a></td><td><a href=\"https://steemit.com/steemitboard/@steemitboard/steemitboard-witness-update-2019-05\">SteemitBoard - Witness Update</a></td></tr><tr><td><a href=\"https://steemit.com/steemmeetupaachen/@steemitboard/steemitboard-to-support-the-german-speaking-community-meetups\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmeoNp9iCaCfd2D6TqnWa3Aky2mU4Fm3xaSmjTM91YoNBS/image.png\"></a></td><td><a href=\"https://steemit.com/steemmeetupaachen/@steemitboard/steemitboard-to-support-the-german-speaking-community-meetups\">SteemitBoard to support the german speaking community meetups</a></td></tr></table>\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "title": "",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-ajose01-20190507t200827000z",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
      "parent_author": "ajose01",
      "parent_permlink": "4qpcsr-eos-signature-verification-with-elixir"
    }
  ],
  "block": 32707822,
  "trx_id": "1b2fd5978978cccabc7b29a4c0bf8f380a010190",
  "op_in_trx": 0,
  "timestamp": "2019-05-07T20:08:30",
  "virtual_op": false,
  "trx_in_block": 6
}
2019/04/19 07:30:15
authorajose01
permlink4qpcsr-eos-signature-verification-with-elixir
Transaction InfoBlock #32174566/Virtual Operation 4294967295:3
View Raw JSON Data
{
  "op": [
    "comment_payout_update",
    {
      "author": "ajose01",
      "permlink": "4qpcsr-eos-signature-verification-with-elixir"
    }
  ],
  "block": 32174566,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 3,
  "timestamp": "2019-04-19T07:30:15",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
2019/04/19 06:44:12
authorajose01
permlinkeos-signature-verification-with-elixir
Transaction InfoBlock #32173645/Virtual Operation 4294967295:4
View Raw JSON Data
{
  "op": [
    "comment_payout_update",
    {
      "author": "ajose01",
      "permlink": "eos-signature-verification-with-elixir"
    }
  ],
  "block": 32173645,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 4,
  "timestamp": "2019-04-19T06:44:12",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
2019/04/12 07:30:18
body# EOS Signature Verification and ECDSA Tooling with Elixir ![kelly-sikkema-1485308-unsplash.jpg](https://cdn.steemitimages.com/DQmX3cUD6T2ZEQDfPLzFVBf9hbMr8EvWoMTGjKRzFbPvFwX/kelly-sikkema-1485308-unsplash.jpg) Photo by Kelly Sikkema on Unsplash Elixir is one of my favorite programming languages. It's a wonderful backend languages and it really lends itself to glueing many of the backend processes that support synchronizing blockchain world to current infrastructures. A recent task I worked on requires verifying using an EOS signature to prove a request on our services. After plenty google-fu and reading through the [eosjs-ecc](https://github.com/EOSIO/eosjs-ecc) library here's what I came up with: First, to simplify things for the elixir side we'll grab the EOS signature in hex format vs. the standard `SIG_K1_` format. Doing so isn't too difficult with `eosjs-ecc`: ``` const sig = ecc.Signature.sign('helloworld', privateKey).toHex(); // or if you already have a signature const sig = ecc.Signature.fromString('SIG_K1_....'); sig.toHex(); //sample hex: //'1f529f1b2b1373565975c7cfaf4e1217c5d24bbd26ebab6f9186c6c5cd26ad1b004b4f6d329f4e1ed2e5ee2bbf60d99ce4ef8ee4726699580c45c31ddff227821b' ``` The signature hex is what we'll use below. Everything else is in the standard form, i.e.: ``` defmodule EOSClient.KeyTool do use Bitwise def address_match?(eos_pub, msg, signature_hex) do {:ok, recovered_pub} = recover_eos_pub(msg, signature_hex) eos_pub == recovered_pub end def recover_eos_pub(msg, eos_signature) do msg_hash = :crypto.hash(:sha256, msg) # Here R, S are the same as ETH. V for EOS is found at the beginning of the # hash {r, s, v} = destructure_sig(eos_signature) signature = BitHelper.pad(:binary.encode_unsigned(r), 32) <> BitHelper.pad(:binary.encode_unsigned(s), 32) # Calculate i # https://github.com/EOSIO/eosjs-ecc/blob/master/src/signature.js#L109 i = (v - 27) &&& 3 IO.inspect ["i", i] case :libsecp256k1.ecdsa_recover_compact(msg_hash, signature, :compressed, i) do {:ok, pub} -> {:ok, Base.encode16(pub, case: :lower) |> pub_hex_to_eos} {:error, err} -> {:error, err} end end def destructure_sig(sig) do { String.slice(sig, 2, 64) |> EthClient.Hex.decode_hex |> :binary.decode_unsigned, String.slice(sig, 66,64) |> EthClient.Hex.decode_hex |> :binary.decode_unsigned, String.slice(sig, 0, 2) |> EthClient.Hex.decode_hex |> :binary.decode_unsigned } end def eth_to_eos_sig(eth_hex) do {sig, pad} = eth_hex |> String.slice(2..-1) |> String.split_at(-2) {int, _} = Integer.parse(pad, 16) prefix = Integer.to_string(int + 4, 16) raw_sig = prefix <> sig "SIG_K1_" <> check_encode(raw_sig, "K1") end def pub_hex_to_eos(pubkey, key_type \\ nil) do IO.inspect pubkey pub_bin = pubkey |> Base.decode16!(case: :lower) check = case key_type do nil -> [pub_bin] key -> [pub_bin, key] end check_bin = check |> :erlang.iolist_to_binary checksum = hash(check_bin, :ripemd160) |> :binary.part(0, 4) "EOS" <> EthClient.Base58.encode(pub_bin <> checksum) end def check_encode(key, key_type \\ nil) do bin = key |> Base.decode16!(case: :lower) check = case key_type do nil -> [bin] key -> [bin, key] end check_bin = check |> :erlang.iolist_to_binary checksum = hash(check_bin, :ripemd160) |> :binary.part(0, 4) EthClient.Base58.encode(bin <> checksum) end def hash(data, algorithm) do :crypto.hash(algorithm, data) end end ``` There's some helpers along with this that I had written before for Ethereum sig validation. Since it's the same encryption under the hood, those work here as well. (Yes I should rename these). Hex helper ``` defmodule EthClient.Hex do @moduledoc """ Helpers for Compound to encode and decode to Ethereum's hex format. """ require Integer @spec encode_hex(binary()) :: String.t def encode_hex(hex), do: "0x" <> Base.encode16(hex, case: :lower) # TODO: This should be shorten for odd length strings? @spec decode_hex(String.t) :: binary() def decode_hex("0x" <> hex_data), do: decode_hex(hex_data) def decode_hex(hex_data) when Integer.is_odd(byte_size(hex_data)), do: decode_hex("0" <> hex_data) def decode_hex(hex_data) do Base.decode16!(hex_data, case: :mixed) end @spec maybe_decode_hex(String.t | nil) :: binary() | nil def maybe_decode_hex(nil), do: nil def maybe_decode_hex(hex), do: decode_hex(hex) @spec maybe_decode_hex_int(String.t | nil) :: integer() | nil def maybe_decode_hex_int(hex) do case maybe_decode_hex(hex) do nil -> nil bin -> :binary.decode_unsigned(bin) end end end ``` Base58 helper: ``` defmodule EthClient.Base58 do @alphabet '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' def encode(data, hash \\ "") def encode(data, hash) when is_binary(data) do encode_zeros(data) <> encode(:binary.decode_unsigned(data), hash) end def encode(0, hash), do: hash def encode(data, hash) do character = <<Enum.at(@alphabet, rem(data, 58))>> encode(div(data, 58), character <> hash) end defp encode_zeros(data) do <<Enum.at(@alphabet, 0)>> |> String.duplicate(leading_zeros(data)) end defp leading_zeros(data) do :binary.bin_to_list(data) |> Enum.find_index(&(&1 != 0)) end end ``` Most of the steps to get here have been derived from reading some excellent blog posts on Bitcoin, and reading through some elixir crypto libraries that deal with either bitcoin or ethereum. I've just managed to glue them together to apply them to EOSIO. 🚀 Some of the posts and/or repos that are helpful (and many more that I lost the chrome tab to): https://blog.lelonek.me/how-to-calculate-bitcoin-address-in-elixir-68939af4f0e9 https://github.com/KamilLelonek/ex_wallet http://www.petecorey.com/blog/2018/01/08/bitcoins-base58check-in-pure-elixir/ https://github.com/exthereum/exth_crypto/blob/master/lib/signature/signature.ex Until next time! Angel [twitter](https://twitter.com/ajose01) [sense.chat](https://my.sense.chat/amazingangel)
titleEOS Signature verification with Elixir 😍
authorajose01
permlink4qpcsr-eos-signature-verification-with-elixir
json metadata{"tags":["eosio","elixir","ecdsa","ecc","libsecp256k1"],"image":["https://cdn.steemitimages.com/DQmX3cUD6T2ZEQDfPLzFVBf9hbMr8EvWoMTGjKRzFbPvFwX/kelly-sikkema-1485308-unsplash.jpg"],"links":["https://github.com/EOSIO/eosjs-ecc","https://blog.lelonek.me/how-to-calculate-bitcoin-address-in-elixir-68939af4f0e9","https://github.com/KamilLelonek/ex_wallet","http://www.petecorey.com/blog/2018/01/08/bitcoins-base58check-in-pure-elixir/","https://github.com/exthereum/exth_crypto/blob/master/lib/signature/signature.ex","https://twitter.com/ajose01","https://my.sense.chat/amazingangel"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkeosio
Transaction InfoBlock #31974302/Trx 54896c313eaee44f0f42d193af816affb14d202e
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "# EOS Signature Verification and ECDSA Tooling with Elixir\n\n![kelly-sikkema-1485308-unsplash.jpg](https://cdn.steemitimages.com/DQmX3cUD6T2ZEQDfPLzFVBf9hbMr8EvWoMTGjKRzFbPvFwX/kelly-sikkema-1485308-unsplash.jpg)\nPhoto by Kelly Sikkema on Unsplash\n\n\nElixir is one of my favorite programming languages. It's a wonderful backend languages and it really lends itself to glueing many of the backend processes that support synchronizing blockchain world to current infrastructures. A recent task I worked on requires verifying using an EOS signature to prove a request on our services. After plenty google-fu and reading through the [eosjs-ecc](https://github.com/EOSIO/eosjs-ecc) library here's what I came up with:\n\nFirst, to simplify things for the elixir side we'll grab the EOS signature in hex format vs. the standard `SIG_K1_` format. Doing so isn't too difficult with `eosjs-ecc`:\n```\nconst sig = ecc.Signature.sign('helloworld', privateKey).toHex();\n// or if you already have a signature\nconst sig = ecc.Signature.fromString('SIG_K1_....');\nsig.toHex();\n//sample hex:\n//'1f529f1b2b1373565975c7cfaf4e1217c5d24bbd26ebab6f9186c6c5cd26ad1b004b4f6d329f4e1ed2e5ee2bbf60d99ce4ef8ee4726699580c45c31ddff227821b'\n```\n\nThe signature hex is what we'll use below. Everything else is in the standard form, i.e.:\n\n```\ndefmodule EOSClient.KeyTool do\n  use Bitwise\n\n  def address_match?(eos_pub, msg, signature_hex) do\n    {:ok, recovered_pub} = recover_eos_pub(msg, signature_hex)\n    eos_pub == recovered_pub\n  end\n\n  def recover_eos_pub(msg, eos_signature) do\n    msg_hash = :crypto.hash(:sha256, msg)\n\n    # Here R, S are the same as ETH. V for EOS is found at the beginning of the\n    # hash\n    {r, s, v} = destructure_sig(eos_signature)\n    signature = BitHelper.pad(:binary.encode_unsigned(r), 32) <> BitHelper.pad(:binary.encode_unsigned(s), 32)\n\n    # Calculate i\n    # https://github.com/EOSIO/eosjs-ecc/blob/master/src/signature.js#L109\n    i = (v - 27) &&& 3\n    IO.inspect [\"i\", i]\n\n    case :libsecp256k1.ecdsa_recover_compact(msg_hash, signature, :compressed, i) do\n      {:ok, pub} ->\n        {:ok, Base.encode16(pub, case: :lower)\n              |> pub_hex_to_eos}\n      {:error, err} ->\n        {:error, err}\n    end\n  end\n\n  def destructure_sig(sig) do\n    {\n      String.slice(sig, 2, 64)\n      |> EthClient.Hex.decode_hex\n      |> :binary.decode_unsigned,\n      String.slice(sig, 66,64)\n      |> EthClient.Hex.decode_hex\n      |> :binary.decode_unsigned,\n      String.slice(sig, 0, 2)\n      |> EthClient.Hex.decode_hex\n      |> :binary.decode_unsigned\n    }\n  end\n\n  def eth_to_eos_sig(eth_hex) do\n    {sig, pad} =\n      eth_hex\n      |> String.slice(2..-1)\n      |> String.split_at(-2)\n\n    {int, _} = Integer.parse(pad, 16)\n\n    prefix = Integer.to_string(int + 4, 16)\n    raw_sig = prefix <> sig\n    \"SIG_K1_\" <> check_encode(raw_sig, \"K1\")\n  end\n\n  def pub_hex_to_eos(pubkey, key_type \\\\ nil) do\n    IO.inspect pubkey\n    pub_bin = pubkey\n              |> Base.decode16!(case: :lower)\n\n\n    check = case key_type do\n      nil -> [pub_bin]\n      key -> [pub_bin, key]\n    end\n\n    check_bin =\n      check\n      |> :erlang.iolist_to_binary\n\n    checksum =\n        hash(check_bin, :ripemd160)\n        |> :binary.part(0, 4)\n\n    \"EOS\" <> EthClient.Base58.encode(pub_bin <> checksum)\n  end\n\n\n  def check_encode(key, key_type \\\\ nil) do\n    bin = key\n          |> Base.decode16!(case: :lower)\n\n    check = case key_type do\n      nil -> [bin]\n      key -> [bin, key]\n    end\n\n    check_bin =\n      check\n      |> :erlang.iolist_to_binary\n\n    checksum =\n        hash(check_bin, :ripemd160)\n        |> :binary.part(0, 4)\n\n    EthClient.Base58.encode(bin <> checksum)\n  end\n\n  def hash(data, algorithm) do\n    :crypto.hash(algorithm, data)\n  end\n\nend\n```\n\nThere's some helpers along with this that I had written before for Ethereum sig validation. Since it's the same encryption under the hood, those work here as well. (Yes I should rename these).\n\nHex helper\n```\ndefmodule EthClient.Hex do\n  @moduledoc \"\"\"\n  Helpers for Compound to encode and decode to Ethereum's\n  hex format.\n  \"\"\"\n\n  require Integer\n\n  @spec encode_hex(binary()) :: String.t\n  def encode_hex(hex), do: \"0x\" <> Base.encode16(hex, case: :lower) # TODO: This should be shorten for odd length strings?\n\n  @spec decode_hex(String.t) :: binary()\n  def decode_hex(\"0x\" <> hex_data), do: decode_hex(hex_data)\n  def decode_hex(hex_data) when Integer.is_odd(byte_size(hex_data)), do: decode_hex(\"0\" <> hex_data)\n  def decode_hex(hex_data) do\n    Base.decode16!(hex_data, case: :mixed)\n  end\n\n  @spec maybe_decode_hex(String.t | nil) :: binary() | nil\n  def maybe_decode_hex(nil), do: nil\n  def maybe_decode_hex(hex), do: decode_hex(hex)\n\n  @spec maybe_decode_hex_int(String.t | nil) :: integer() | nil\n  def maybe_decode_hex_int(hex) do\n    case maybe_decode_hex(hex) do\n      nil -> nil\n      bin -> :binary.decode_unsigned(bin)\n    end\n  end\nend\n```\nBase58 helper:\n```\ndefmodule EthClient.Base58 do\n  @alphabet '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n\n  def encode(data, hash \\\\ \"\")\n\n  def encode(data, hash) when is_binary(data) do\n    encode_zeros(data) <> encode(:binary.decode_unsigned(data), hash)\n  end\n\n  def encode(0, hash), do: hash\n\n  def encode(data, hash) do\n    character = <<Enum.at(@alphabet, rem(data, 58))>>\n    encode(div(data, 58), character <> hash)\n  end\n\n  defp encode_zeros(data) do\n    <<Enum.at(@alphabet, 0)>>\n    |> String.duplicate(leading_zeros(data))\n  end\n\n  defp leading_zeros(data) do\n    :binary.bin_to_list(data)\n    |> Enum.find_index(&(&1 != 0))\n  end\nend\n```\n\nMost of the steps to get here have been derived from reading some excellent blog posts on Bitcoin, and reading through some elixir crypto libraries that deal with either bitcoin or ethereum. I've just managed to glue them together to apply them to EOSIO. 🚀\n\nSome of the posts and/or repos that are helpful (and many more that I lost the chrome tab to):\nhttps://blog.lelonek.me/how-to-calculate-bitcoin-address-in-elixir-68939af4f0e9\nhttps://github.com/KamilLelonek/ex_wallet\nhttp://www.petecorey.com/blog/2018/01/08/bitcoins-base58check-in-pure-elixir/\nhttps://github.com/exthereum/exth_crypto/blob/master/lib/signature/signature.ex\n\nUntil next time!\n\nAngel\n[twitter](https://twitter.com/ajose01)\n[sense.chat](https://my.sense.chat/amazingangel)",
      "title": "EOS Signature verification with Elixir 😍",
      "author": "ajose01",
      "permlink": "4qpcsr-eos-signature-verification-with-elixir",
      "json_metadata": "{\"tags\":[\"eosio\",\"elixir\",\"ecdsa\",\"ecc\",\"libsecp256k1\"],\"image\":[\"https://cdn.steemitimages.com/DQmX3cUD6T2ZEQDfPLzFVBf9hbMr8EvWoMTGjKRzFbPvFwX/kelly-sikkema-1485308-unsplash.jpg\"],\"links\":[\"https://github.com/EOSIO/eosjs-ecc\",\"https://blog.lelonek.me/how-to-calculate-bitcoin-address-in-elixir-68939af4f0e9\",\"https://github.com/KamilLelonek/ex_wallet\",\"http://www.petecorey.com/blog/2018/01/08/bitcoins-base58check-in-pure-elixir/\",\"https://github.com/exthereum/exth_crypto/blob/master/lib/signature/signature.ex\",\"https://twitter.com/ajose01\",\"https://my.sense.chat/amazingangel\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "eosio"
    }
  ],
  "block": 31974302,
  "trx_id": "54896c313eaee44f0f42d193af816affb14d202e",
  "op_in_trx": 0,
  "timestamp": "2019-04-12T07:30:18",
  "virtual_op": false,
  "trx_in_block": 25
}
blocktradesblockchain operation: transfer to vesting completed
2019/04/12 07:28:51
to accountajose01
hive vested11.652 HIVE
from accountblocktrades
vesting shares received23285.988303 VESTS
Transaction InfoBlock #31974273/Trx 0e483be2d618f6c5e6a7d876774892fd57853586
View Raw JSON Data
{
  "op": [
    "transfer_to_vesting_completed",
    {
      "to_account": "ajose01",
      "hive_vested": "11.652 HIVE",
      "from_account": "blocktrades",
      "vesting_shares_received": "23285.988303 VESTS"
    }
  ],
  "block": 31974273,
  "trx_id": "0e483be2d618f6c5e6a7d876774892fd57853586",
  "op_in_trx": 1,
  "timestamp": "2019-04-12T07:28:51",
  "virtual_op": true,
  "trx_in_block": 1
}
blocktradespowered up 11.652 HIVE to @ajose01
2019/04/12 07:28:51
toajose01
fromblocktrades
amount11.652 HIVE
Transaction InfoBlock #31974273/Trx 0e483be2d618f6c5e6a7d876774892fd57853586
View Raw JSON Data
{
  "op": [
    "transfer_to_vesting",
    {
      "to": "ajose01",
      "from": "blocktrades",
      "amount": "11.652 HIVE"
    }
  ],
  "block": 31974273,
  "trx_id": "0e483be2d618f6c5e6a7d876774892fd57853586",
  "op_in_trx": 0,
  "timestamp": "2019-04-12T07:28:51",
  "virtual_op": false,
  "trx_in_block": 1
}
2019/04/12 06:44:15
body# EOS Signature Verification and ECDSA Tooling with Elixir ![kelly-sikkema-1485308-unsplash.jpg](https://cdn.steemitimages.com/DQmX3cUD6T2ZEQDfPLzFVBf9hbMr8EvWoMTGjKRzFbPvFwX/kelly-sikkema-1485308-unsplash.jpg) Photo by Kelly Sikkema on Unsplash Elixir is one of my favorite programming languages. It's a wonderful backend languages and it really lends itself to glueing many of the backend processes that support synchronizing blockchain world to current infrastructures. A recent task I worked on requires verifying using an EOS signature to prove a request on our services. After plenty google-fu and reading through the [eosjs-ecc](https://github.com/EOSIO/eosjs-ecc) library here's what I came up with: First, to simplify things for the elixir side we'll grab the EOS signature in hex format vs. the standard `SIG_K1_` format. Doing so isn't too difficult with `eosjs-ecc`: ``` const sig = ecc.Signature.sign('helloworld', privateKey).toHex(); // or if you already have a signature const sig = ecc.Signature.fromString('SIG_K1_....'); sig.toHex(); //sample hex: //'1f529f1b2b1373565975c7cfaf4e1217c5d24bbd26ebab6f9186c6c5cd26ad1b004b4f6d329f4e1ed2e5ee2bbf60d99ce4ef8ee4726699580c45c31ddff227821b' ``` The signature hex is what we'll use below. Everything else is in the standard form, i.e.: ``` defmodule EOSClient.KeyTool do use Bitwise def address_match?(eos_pub, msg, signature_hex) do {:ok, recovered_pub} = recover_eos_pub(msg, signature_hex) eos_pub == recovered_pub end def recover_eos_pub(msg, eos_signature) do msg_hash = :crypto.hash(:sha256, msg) # Here R, S are the same as ETH. V for EOS is found at the beginning of the # hash {r, s, v} = destructure_sig(eos_signature) signature = BitHelper.pad(:binary.encode_unsigned(r), 32) <> BitHelper.pad(:binary.encode_unsigned(s), 32) # Calculate i # https://github.com/EOSIO/eosjs-ecc/blob/master/src/signature.js#L109 i = (v - 27) &&& 3 IO.inspect ["i", i] case :libsecp256k1.ecdsa_recover_compact(msg_hash, signature, :compressed, i) do {:ok, pub} -> {:ok, Base.encode16(pub, case: :lower) |> pub_hex_to_eos} {:error, err} -> {:error, err} end end def destructure_sig(sig) do { String.slice(sig, 2, 64) |> EthClient.Hex.decode_hex |> :binary.decode_unsigned, String.slice(sig, 66,64) |> EthClient.Hex.decode_hex |> :binary.decode_unsigned, String.slice(sig, 0, 2) |> EthClient.Hex.decode_hex |> :binary.decode_unsigned } end def eth_to_eos_sig(eth_hex) do {sig, pad} = eth_hex |> String.slice(2..-1) |> String.split_at(-2) {int, _} = Integer.parse(pad, 16) prefix = Integer.to_string(int + 4, 16) raw_sig = prefix <> sig "SIG_K1_" <> check_encode(raw_sig, "K1") end def pub_hex_to_eos(pubkey, key_type \\ nil) do IO.inspect pubkey pub_bin = pubkey |> Base.decode16!(case: :lower) check = case key_type do nil -> [pub_bin] key -> [pub_bin, key] end check_bin = check |> :erlang.iolist_to_binary checksum = hash(check_bin, :ripemd160) |> :binary.part(0, 4) "EOS" <> EthClient.Base58.encode(pub_bin <> checksum) end def check_encode(key, key_type \\ nil) do bin = key |> Base.decode16!(case: :lower) check = case key_type do nil -> [bin] key -> [bin, key] end check_bin = check |> :erlang.iolist_to_binary checksum = hash(check_bin, :ripemd160) |> :binary.part(0, 4) EthClient.Base58.encode(bin <> checksum) end def hash(data, algorithm) do :crypto.hash(algorithm, data) end end ``` There's some helpers along with this that I had written before for Ethereum sig validation. Since it's the same encryption under the hood, those work here as well. (Yes I should rename these). Hex helper ``` defmodule EthClient.Hex do @moduledoc """ Helpers for Compound to encode and decode to Ethereum's hex format. """ require Integer @spec encode_hex(binary()) :: String.t def encode_hex(hex), do: "0x" <> Base.encode16(hex, case: :lower) # TODO: This should be shorten for odd length strings? @spec decode_hex(String.t) :: binary() def decode_hex("0x" <> hex_data), do: decode_hex(hex_data) def decode_hex(hex_data) when Integer.is_odd(byte_size(hex_data)), do: decode_hex("0" <> hex_data) def decode_hex(hex_data) do Base.decode16!(hex_data, case: :mixed) end @spec maybe_decode_hex(String.t | nil) :: binary() | nil def maybe_decode_hex(nil), do: nil def maybe_decode_hex(hex), do: decode_hex(hex) @spec maybe_decode_hex_int(String.t | nil) :: integer() | nil def maybe_decode_hex_int(hex) do case maybe_decode_hex(hex) do nil -> nil bin -> :binary.decode_unsigned(bin) end end end ``` Base58 helper: ``` defmodule EthClient.Base58 do @alphabet '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' def encode(data, hash \\ "") def encode(data, hash) when is_binary(data) do encode_zeros(data) <> encode(:binary.decode_unsigned(data), hash) end def encode(0, hash), do: hash def encode(data, hash) do character = <<Enum.at(@alphabet, rem(data, 58))>> encode(div(data, 58), character <> hash) end defp encode_zeros(data) do <<Enum.at(@alphabet, 0)>> |> String.duplicate(leading_zeros(data)) end defp leading_zeros(data) do :binary.bin_to_list(data) |> Enum.find_index(&(&1 != 0)) end end ``` Most of the steps to get here have been derived from reading some excellent blog posts on Bitcoin, and reading through some elixir crypto libraries that deal with either bitcoin or ethereum. I've just managed to glue them together to apply them to EOSIO. 🚀 Some of the posts and/or repos that are helpful (and many more that I lost the chrome tab to): https://blog.lelonek.me/how-to-calculate-bitcoin-address-in-elixir-68939af4f0e9 https://github.com/KamilLelonek/ex_wallet http://www.petecorey.com/blog/2018/01/08/bitcoins-base58check-in-pure-elixir/ https://github.com/exthereum/exth_crypto/blob/master/lib/signature/signature.ex Until next time! Angel [twitter](https://twitter.com/ajose01) [sense.chat](https://my.sense.chat/amazingangel)
titleEOS Signature verification with Elixir 😍
authorajose01
permlinkeos-signature-verification-with-elixir
json metadata{"tags":["elixir","eosio","ecdsa","ecc","libsecp256k1"],"image":["https://cdn.steemitimages.com/DQmX3cUD6T2ZEQDfPLzFVBf9hbMr8EvWoMTGjKRzFbPvFwX/kelly-sikkema-1485308-unsplash.jpg"],"links":["https://github.com/EOSIO/eosjs-ecc","https://blog.lelonek.me/how-to-calculate-bitcoin-address-in-elixir-68939af4f0e9","https://github.com/KamilLelonek/ex_wallet","http://www.petecorey.com/blog/2018/01/08/bitcoins-base58check-in-pure-elixir/","https://github.com/exthereum/exth_crypto/blob/master/lib/signature/signature.ex","https://twitter.com/ajose01","https://my.sense.chat/amazingangel"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkelixir
Transaction InfoBlock #31973382/Trx 6e79939fbd19c92986956df616cbac0eeb689ee5
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "# EOS Signature Verification and ECDSA Tooling with Elixir\n\n![kelly-sikkema-1485308-unsplash.jpg](https://cdn.steemitimages.com/DQmX3cUD6T2ZEQDfPLzFVBf9hbMr8EvWoMTGjKRzFbPvFwX/kelly-sikkema-1485308-unsplash.jpg)\nPhoto by Kelly Sikkema on Unsplash\n\n\nElixir is one of my favorite programming languages. It's a wonderful backend languages and it really lends itself to glueing many of the backend processes that support synchronizing blockchain world to current infrastructures. A recent task I worked on requires verifying using an EOS signature to prove a request on our services. After plenty google-fu and reading through the [eosjs-ecc](https://github.com/EOSIO/eosjs-ecc) library here's what I came up with:\n\nFirst, to simplify things for the elixir side we'll grab the EOS signature in hex format vs. the standard `SIG_K1_` format. Doing so isn't too difficult with `eosjs-ecc`:\n```\nconst sig = ecc.Signature.sign('helloworld', privateKey).toHex();\n// or if you already have a signature\nconst sig = ecc.Signature.fromString('SIG_K1_....');\nsig.toHex();\n//sample hex:\n//'1f529f1b2b1373565975c7cfaf4e1217c5d24bbd26ebab6f9186c6c5cd26ad1b004b4f6d329f4e1ed2e5ee2bbf60d99ce4ef8ee4726699580c45c31ddff227821b'\n```\n\nThe signature hex is what we'll use below. Everything else is in the standard form, i.e.:\n\n```\ndefmodule EOSClient.KeyTool do\n  use Bitwise\n\n  def address_match?(eos_pub, msg, signature_hex) do\n    {:ok, recovered_pub} = recover_eos_pub(msg, signature_hex)\n    eos_pub == recovered_pub\n  end\n\n  def recover_eos_pub(msg, eos_signature) do\n    msg_hash = :crypto.hash(:sha256, msg)\n\n    # Here R, S are the same as ETH. V for EOS is found at the beginning of the\n    # hash\n    {r, s, v} = destructure_sig(eos_signature)\n    signature = BitHelper.pad(:binary.encode_unsigned(r), 32) <> BitHelper.pad(:binary.encode_unsigned(s), 32)\n\n    # Calculate i\n    # https://github.com/EOSIO/eosjs-ecc/blob/master/src/signature.js#L109\n    i = (v - 27) &&& 3\n    IO.inspect [\"i\", i]\n\n    case :libsecp256k1.ecdsa_recover_compact(msg_hash, signature, :compressed, i) do\n      {:ok, pub} ->\n        {:ok, Base.encode16(pub, case: :lower)\n              |> pub_hex_to_eos}\n      {:error, err} ->\n        {:error, err}\n    end\n  end\n\n  def destructure_sig(sig) do\n    {\n      String.slice(sig, 2, 64)\n      |> EthClient.Hex.decode_hex\n      |> :binary.decode_unsigned,\n      String.slice(sig, 66,64)\n      |> EthClient.Hex.decode_hex\n      |> :binary.decode_unsigned,\n      String.slice(sig, 0, 2)\n      |> EthClient.Hex.decode_hex\n      |> :binary.decode_unsigned\n    }\n  end\n\n  def eth_to_eos_sig(eth_hex) do\n    {sig, pad} =\n      eth_hex\n      |> String.slice(2..-1)\n      |> String.split_at(-2)\n\n    {int, _} = Integer.parse(pad, 16)\n\n    prefix = Integer.to_string(int + 4, 16)\n    raw_sig = prefix <> sig\n    \"SIG_K1_\" <> check_encode(raw_sig, \"K1\")\n  end\n\n  def pub_hex_to_eos(pubkey, key_type \\\\ nil) do\n    IO.inspect pubkey\n    pub_bin = pubkey\n              |> Base.decode16!(case: :lower)\n\n\n    check = case key_type do\n      nil -> [pub_bin]\n      key -> [pub_bin, key]\n    end\n\n    check_bin =\n      check\n      |> :erlang.iolist_to_binary\n\n    checksum =\n        hash(check_bin, :ripemd160)\n        |> :binary.part(0, 4)\n\n    \"EOS\" <> EthClient.Base58.encode(pub_bin <> checksum)\n  end\n\n\n  def check_encode(key, key_type \\\\ nil) do\n    bin = key\n          |> Base.decode16!(case: :lower)\n\n    check = case key_type do\n      nil -> [bin]\n      key -> [bin, key]\n    end\n\n    check_bin =\n      check\n      |> :erlang.iolist_to_binary\n\n    checksum =\n        hash(check_bin, :ripemd160)\n        |> :binary.part(0, 4)\n\n    EthClient.Base58.encode(bin <> checksum)\n  end\n\n  def hash(data, algorithm) do\n    :crypto.hash(algorithm, data)\n  end\n\nend\n```\n\nThere's some helpers along with this that I had written before for Ethereum sig validation. Since it's the same encryption under the hood, those work here as well. (Yes I should rename these).\n\nHex helper\n```\ndefmodule EthClient.Hex do\n  @moduledoc \"\"\"\n  Helpers for Compound to encode and decode to Ethereum's\n  hex format.\n  \"\"\"\n\n  require Integer\n\n  @spec encode_hex(binary()) :: String.t\n  def encode_hex(hex), do: \"0x\" <> Base.encode16(hex, case: :lower) # TODO: This should be shorten for odd length strings?\n\n  @spec decode_hex(String.t) :: binary()\n  def decode_hex(\"0x\" <> hex_data), do: decode_hex(hex_data)\n  def decode_hex(hex_data) when Integer.is_odd(byte_size(hex_data)), do: decode_hex(\"0\" <> hex_data)\n  def decode_hex(hex_data) do\n    Base.decode16!(hex_data, case: :mixed)\n  end\n\n  @spec maybe_decode_hex(String.t | nil) :: binary() | nil\n  def maybe_decode_hex(nil), do: nil\n  def maybe_decode_hex(hex), do: decode_hex(hex)\n\n  @spec maybe_decode_hex_int(String.t | nil) :: integer() | nil\n  def maybe_decode_hex_int(hex) do\n    case maybe_decode_hex(hex) do\n      nil -> nil\n      bin -> :binary.decode_unsigned(bin)\n    end\n  end\nend\n```\nBase58 helper:\n```\ndefmodule EthClient.Base58 do\n  @alphabet '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n\n  def encode(data, hash \\\\ \"\")\n\n  def encode(data, hash) when is_binary(data) do\n    encode_zeros(data) <> encode(:binary.decode_unsigned(data), hash)\n  end\n\n  def encode(0, hash), do: hash\n\n  def encode(data, hash) do\n    character = <<Enum.at(@alphabet, rem(data, 58))>>\n    encode(div(data, 58), character <> hash)\n  end\n\n  defp encode_zeros(data) do\n    <<Enum.at(@alphabet, 0)>>\n    |> String.duplicate(leading_zeros(data))\n  end\n\n  defp leading_zeros(data) do\n    :binary.bin_to_list(data)\n    |> Enum.find_index(&(&1 != 0))\n  end\nend\n```\n\nMost of the steps to get here have been derived from reading some excellent blog posts on Bitcoin, and reading through some elixir crypto libraries that deal with either bitcoin or ethereum. I've just managed to glue them together to apply them to EOSIO. 🚀\n\nSome of the posts and/or repos that are helpful (and many more that I lost the chrome tab to):\nhttps://blog.lelonek.me/how-to-calculate-bitcoin-address-in-elixir-68939af4f0e9\nhttps://github.com/KamilLelonek/ex_wallet\nhttp://www.petecorey.com/blog/2018/01/08/bitcoins-base58check-in-pure-elixir/\nhttps://github.com/exthereum/exth_crypto/blob/master/lib/signature/signature.ex\n\nUntil next time!\n\nAngel\n[twitter](https://twitter.com/ajose01)\n[sense.chat](https://my.sense.chat/amazingangel)",
      "title": "EOS Signature verification with Elixir 😍",
      "author": "ajose01",
      "permlink": "eos-signature-verification-with-elixir",
      "json_metadata": "{\"tags\":[\"elixir\",\"eosio\",\"ecdsa\",\"ecc\",\"libsecp256k1\"],\"image\":[\"https://cdn.steemitimages.com/DQmX3cUD6T2ZEQDfPLzFVBf9hbMr8EvWoMTGjKRzFbPvFwX/kelly-sikkema-1485308-unsplash.jpg\"],\"links\":[\"https://github.com/EOSIO/eosjs-ecc\",\"https://blog.lelonek.me/how-to-calculate-bitcoin-address-in-elixir-68939af4f0e9\",\"https://github.com/KamilLelonek/ex_wallet\",\"http://www.petecorey.com/blog/2018/01/08/bitcoins-base58check-in-pure-elixir/\",\"https://github.com/exthereum/exth_crypto/blob/master/lib/signature/signature.ex\",\"https://twitter.com/ajose01\",\"https://my.sense.chat/amazingangel\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "elixir"
    }
  ],
  "block": 31973382,
  "trx_id": "6e79939fbd19c92986956df616cbac0eeb689ee5",
  "op_in_trx": 0,
  "timestamp": "2019-04-12T06:44:15",
  "virtual_op": false,
  "trx_in_block": 9
}
2019/03/13 22:13:12
votermakesense
authorajose01
weight10000 (100.00%)
permlinksecuring-messages-using-eos-and-ecdh-and-aes
Transaction InfoBlock #31128883/Trx 2b1443b71d000a906398b6d1b9ad0d48454daeb1
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "makesense",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "securing-messages-using-eos-and-ecdh-and-aes"
    }
  ],
  "block": 31128883,
  "trx_id": "2b1443b71d000a906398b6d1b9ad0d48454daeb1",
  "op_in_trx": 0,
  "timestamp": "2019-03-13T22:13:12",
  "virtual_op": false,
  "trx_in_block": 0
}
2019/02/25 22:38:45
bodyHello @ajose01! This is a friendly reminder that you have 3000 Partiko Points unclaimed in your Partiko account! Partiko is a fast and beautiful mobile app for Steem, and it’s the most popular Steem mobile app out there! Download Partiko using the link below and login using SteemConnect to claim your 3000 Partiko points! You can easily convert them into Steem token! https://partiko.app/referral/partiko ![](https://d1vof77qrk4l5q.cloudfront.net/statics/partiko-poster-best-steem-app-for-your-phone.jpg)
title
authorpartiko
permlinkpartiko-re-ajose01-securing-messages-using-eos-and-ecdh-and-aes-20190225t223842089z
json metadata{"app":"partiko"}
parent authorajose01
parent permlinksecuring-messages-using-eos-and-ecdh-and-aes
Transaction InfoBlock #30668896/Trx e4c4b37cdc113acc8ff63db7a695aea82561f5b4
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "Hello @ajose01! This is a friendly reminder that you have 3000 Partiko Points unclaimed in your Partiko account!\n\nPartiko is a fast and beautiful mobile app for Steem, and it’s the most popular Steem mobile app out there! Download Partiko using the link below and login using SteemConnect to claim your 3000 Partiko points! You can easily convert them into Steem token!\n\nhttps://partiko.app/referral/partiko\n\n![](https://d1vof77qrk4l5q.cloudfront.net/statics/partiko-poster-best-steem-app-for-your-phone.jpg)",
      "title": "",
      "author": "partiko",
      "permlink": "partiko-re-ajose01-securing-messages-using-eos-and-ecdh-and-aes-20190225t223842089z",
      "json_metadata": "{\"app\":\"partiko\"}",
      "parent_author": "ajose01",
      "parent_permlink": "securing-messages-using-eos-and-ecdh-and-aes"
    }
  ],
  "block": 30668896,
  "trx_id": "e4c4b37cdc113acc8ff63db7a695aea82561f5b4",
  "op_in_trx": 0,
  "timestamp": "2019-02-25T22:38:45",
  "virtual_op": false,
  "trx_in_block": 14
}
2019/02/12 21:38:33
bodyCongratulations @ajose01! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) : <table><tr><td>https://steemitimages.com/60x60/http://steemitboard.com/notifications/firstvote.png</td><td>You made your First Vote</td></tr> </table> <sub>_[Click here to view your Board](https://steemitboard.com/@ajose01)_</sub> <sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub> > Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
title
authorsteemitboard
permlinksteemitboard-notify-ajose01-20190212t213832000z
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
parent authorajose01
parent permlinksecuring-messages-using-eos-and-ecdh-and-aes
Transaction InfoBlock #30293582/Trx 698f9a965241c028f661f23b662db328552b73c9
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "Congratulations @ajose01! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :\n\n<table><tr><td>https://steemitimages.com/60x60/http://steemitboard.com/notifications/firstvote.png</td><td>You made your First Vote</td></tr>\n</table>\n\n<sub>_[Click here to view your Board](https://steemitboard.com/@ajose01)_</sub>\n<sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub>\n\n\n\n> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
      "title": "",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-ajose01-20190212t213832000z",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
      "parent_author": "ajose01",
      "parent_permlink": "securing-messages-using-eos-and-ecdh-and-aes"
    }
  ],
  "block": 30293582,
  "trx_id": "698f9a965241c028f661f23b662db328552b73c9",
  "op_in_trx": 0,
  "timestamp": "2019-02-12T21:38:33",
  "virtual_op": false,
  "trx_in_block": 54
}
2019/02/12 20:11:45
voterajose01
authorbefractal
weight10000 (100.00%)
permlinkwe-are-fractal-and-we-love-you
Transaction InfoBlock #30291846/Trx 5c648c95de69b382d4c5171e4f61c97690831b54
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "ajose01",
      "author": "befractal",
      "weight": 10000,
      "permlink": "we-are-fractal-and-we-love-you"
    }
  ],
  "block": 30291846,
  "trx_id": "5c648c95de69b382d4c5171e4f61c97690831b54",
  "op_in_trx": 0,
  "timestamp": "2019-02-12T20:11:45",
  "virtual_op": false,
  "trx_in_block": 8
}
2019/01/15 06:17:18
authorajose01
permlinksecuring-messages-using-eos-and-ecdh-and-aes
Transaction InfoBlock #29469554/Virtual Operation 4294967295:6
View Raw JSON Data
{
  "op": [
    "comment_payout_update",
    {
      "author": "ajose01",
      "permlink": "securing-messages-using-eos-and-ecdh-and-aes"
    }
  ],
  "block": 29469554,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 6,
  "timestamp": "2019-01-15T06:17:18",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
ajose01received 0.043 HBD reward share for securing-messages-using-eos-and-ecdh-and-aes
2019/01/15 06:17:18
authorajose01
payout0.043 HBD
permlinksecuring-messages-using-eos-and-ecdh-and-aes
author rewards95
total payout value0.032 HBD
curator payout value0.010 HBD
beneficiary payout value0.000 HBD
Transaction InfoBlock #29469554/Virtual Operation 4294967295:5
View Raw JSON Data
{
  "op": [
    "comment_reward",
    {
      "author": "ajose01",
      "payout": "0.043 HBD",
      "permlink": "securing-messages-using-eos-and-ecdh-and-aes",
      "author_rewards": 95,
      "total_payout_value": "0.032 HBD",
      "curator_payout_value": "0.010 HBD",
      "beneficiary_payout_value": "0.000 HBD"
    }
  ],
  "block": 29469554,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 5,
  "timestamp": "2019-01-15T06:17:18",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
ajose01received 0.047 HIVE, 0.059 HP author reward for @ajose01 / securing-messages-using-eos-and-ecdh-and-aes
2019/01/15 06:17:18
authorajose01
permlinksecuring-messages-using-eos-and-ecdh-and-aes
hbd payout0.000 HBD
hive payout0.047 HIVE
vesting payout96.406418 VESTS
payout must be claimedtrue
curators vesting payout60.254011 VESTS
Transaction InfoBlock #29469554/Virtual Operation 4294967295:4
View Raw JSON Data
{
  "op": [
    "author_reward",
    {
      "author": "ajose01",
      "permlink": "securing-messages-using-eos-and-ecdh-and-aes",
      "hbd_payout": "0.000 HBD",
      "hive_payout": "0.047 HIVE",
      "vesting_payout": "96.406418 VESTS",
      "payout_must_be_claimed": true,
      "curators_vesting_payout": "60.254011 VESTS"
    }
  ],
  "block": 29469554,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 4,
  "timestamp": "2019-01-15T06:17:18",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
2019/01/08 08:16:33
votervirtualgrowth
authorajose01
weight273455
rshares82403427180
permlinksecuring-messages-using-eos-and-ecdh-and-aes
pending payout0.046 HBD
total vote weight288683
Transaction InfoBlock #29270468/Trx 0b36f496ca305f02428f77238877bf412af7b2c4
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "virtualgrowth",
      "author": "ajose01",
      "weight": 273455,
      "rshares": 82403427180,
      "permlink": "securing-messages-using-eos-and-ecdh-and-aes",
      "pending_payout": "0.046 HBD",
      "total_vote_weight": 288683
    }
  ],
  "block": 29270468,
  "trx_id": "0b36f496ca305f02428f77238877bf412af7b2c4",
  "op_in_trx": 1,
  "timestamp": "2019-01-08T08:16:33",
  "virtual_op": true,
  "trx_in_block": 0
}
2019/01/08 08:16:33
votervirtualgrowth
authorajose01
weight10000 (100.00%)
permlinksecuring-messages-using-eos-and-ecdh-and-aes
Transaction InfoBlock #29270468/Trx 0b36f496ca305f02428f77238877bf412af7b2c4
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "virtualgrowth",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "securing-messages-using-eos-and-ecdh-and-aes"
    }
  ],
  "block": 29270468,
  "trx_id": "0b36f496ca305f02428f77238877bf412af7b2c4",
  "op_in_trx": 0,
  "timestamp": "2019-01-08T08:16:33",
  "virtual_op": false,
  "trx_in_block": 0
}
2019/01/08 06:37:21
voterfyrstikken
authorajose01
weight15228
rshares230558787
permlinksecuring-messages-using-eos-and-ecdh-and-aes
pending payout0.000 HBD
total vote weight15228
Transaction InfoBlock #29268484/Trx c8ea1174e749d0b2708f7db1fffac5ce8b1d328b
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "fyrstikken",
      "author": "ajose01",
      "weight": 15228,
      "rshares": 230558787,
      "permlink": "securing-messages-using-eos-and-ecdh-and-aes",
      "pending_payout": "0.000 HBD",
      "total_vote_weight": 15228
    }
  ],
  "block": 29268484,
  "trx_id": "c8ea1174e749d0b2708f7db1fffac5ce8b1d328b",
  "op_in_trx": 1,
  "timestamp": "2019-01-08T06:37:21",
  "virtual_op": true,
  "trx_in_block": 88
}
2019/01/08 06:37:21
voterfyrstikken
authorajose01
weight100 (1.00%)
permlinksecuring-messages-using-eos-and-ecdh-and-aes
Transaction InfoBlock #29268484/Trx c8ea1174e749d0b2708f7db1fffac5ce8b1d328b
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "fyrstikken",
      "author": "ajose01",
      "weight": 100,
      "permlink": "securing-messages-using-eos-and-ecdh-and-aes"
    }
  ],
  "block": 29268484,
  "trx_id": "c8ea1174e749d0b2708f7db1fffac5ce8b1d328b",
  "op_in_trx": 0,
  "timestamp": "2019-01-08T06:37:21",
  "virtual_op": false,
  "trx_in_block": 88
}
2019/01/08 06:22:39
voterraise-me-up
authorajose01
weight0 (0.00%)
rshares0
permlinksecuring-messages-using-eos-and-ecdh-and-aes
pending payout0.000 HBD
total vote weight0
Transaction InfoBlock #29268190/Trx a7af61815801190902a19443febf672fb28e5e01
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "raise-me-up",
      "author": "ajose01",
      "weight": 0,
      "rshares": 0,
      "permlink": "securing-messages-using-eos-and-ecdh-and-aes",
      "pending_payout": "0.000 HBD",
      "total_vote_weight": 0
    }
  ],
  "block": 29268190,
  "trx_id": "a7af61815801190902a19443febf672fb28e5e01",
  "op_in_trx": 1,
  "timestamp": "2019-01-08T06:22:39",
  "virtual_op": true,
  "trx_in_block": 2
}
2019/01/08 06:22:39
voterraise-me-up
authorajose01
weight1 (0.01%)
permlinksecuring-messages-using-eos-and-ecdh-and-aes
Transaction InfoBlock #29268190/Trx a7af61815801190902a19443febf672fb28e5e01
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "raise-me-up",
      "author": "ajose01",
      "weight": 1,
      "permlink": "securing-messages-using-eos-and-ecdh-and-aes"
    }
  ],
  "block": 29268190,
  "trx_id": "a7af61815801190902a19443febf672fb28e5e01",
  "op_in_trx": 0,
  "timestamp": "2019-01-08T06:22:39",
  "virtual_op": false,
  "trx_in_block": 2
}
2019/01/08 06:17:21
body![Locks](https://cdn.steemitimages.com/DQmYb1GYUm6iRAksGi3acW36fVwfs6GQahioZjoMMSmuME3/image.png) [Photo - @neonbrand via unsplash](https://unsplash.com/@neonbrand) # Securing messages using EOS (and ECDH and AES) _Disclaimer: I'm sharing as I'm learning... please use at your own risk, or better yet share in comments how to improve! Also, I will use terms as seed / password loosely, to illustrate the process._ Can we encrypt communication between two EOS users using the private / public keys already in our possession? YES! Well... with some caveats. ECC in itself is not an encryption algorithm. In EOS and other blockchains it is used to sign transactions, but not to obscure what is being signed. However, it can be leveraged to encrypt communications if we take a couple steps. ## Preface We are going to do this first the long way, to learn a bit about the process. We'll finish with a simpler (and quicker) way using some existing EOS tooling (Skip to Step 5 if you want to just see that). This is in Javascript, so here's what we'll need: ```Javascript const EC = require('elliptic').ec; const hkdf = require('futoin-hkdf'); const aesjs = require('aes-js'); const ecc = require('eosjs-ecc'); ``` We'll also generate some EOS keys for ourselves: ```Javascript let eosPk1 = await PrivateKey.randomKey(); let eosPk2 = await PrivateKey.randomKey() let eosPub1 = ecc.privateToPublic(eosPk1); let eosPub2 = ecc.privateToPublic(eosPk2); console.log("EOS USER 1: ", eosPub1); console.log("EOS USER 2: ", eosPub2); ``` ## Step 1 - Generate a shared encryption seed. In order to encrypt our communications, we would usually need an encryption seed (for us encryption noobs, think something like a password) that we use to secure our communication. As long as both parties know the password, we can decrypt our message. The trick is having a common seed / pass that we never have to communicate to the other party. In crypto world, we already have enough keys to worry about! How can we accomplish this? Enter [ECDH](https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman). Using this protocol, we can use our EOS (or any ECC) private key and the other parties EOS public key. Here's the process assuming we are EOS user 1: ```Javascript // EOS KEY1 - Generating shared key console.log("Scenario 1. EOS User 1 generating shared key via own PK, and User 2 public key\n") const key1 = ec.keyFromPrivate(eosPk1.toBuffer()); // We simulate not knowing the other parties PK. let eosPubBuffer2 = ecc.PublicKey(eosPub2).toBuffer(); const ecpub2 = ec.keyFromPublic(eosPubBuffer2); const pub2 = ecpub2.getPublic(); console.log("PubKey2: ", pub2); const shared1 = key1.derive(pub2).toString(16); console.log("Shared key derived by EOS USER 1: ", shared1); ``` We'd do the reverse for the other user, and we would end up generating the same shared key #winning. ## Step 2 - Convert our shared key to a valid AES key / encryption seed. Our shared key here needs to be converted to a seed we can use with AES. To do that we use a Key Derivation Function, in this case [HKDF](https://en.wikipedia.org/wiki/HKDF). ```Javascript // Convert shared key to AES valid key let key = hkdf(shared1, 16) ``` ## Step 3 - Encrypt our message via AES Now that we have a valid key to use for AES encryption, we can finally get to making our messages secret. ```Javascript let text = "Let's encrypt... secret taco meetup!" console.log("Test string: ", text) let textBytes = aesjs.utils.utf8.toBytes(text); let aesCtr = new aesjs.ModeOfOperation.ctr(key); let encryptedBytes = aesCtr.encrypt(textBytes); // We convert to hex to make it easy to transmit as text let encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes); console.log("Encrypted text as it would be transmitted:\n", encryptedHex); // Encrypted text as it would be transmitted: // 9c27303372372cda33c70441f0960fde77fff9b118ddc64f2bcf027f3823da142f5e6baa ``` Here we could have used a nonce or a counter to add a bit more security to the messages we are sending or receiving. ```Javascript // The counter is optional, and if omitted will begin at 1 let aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5)); ``` ## Step 4 - Decrypting message The other user would have been able to generate the same shared key using the steps above. On receiving this message, they would now use that key to decrypt the message. ```Javascript // Time to decrypt console.log("Now going to decrypt...:\n", encryptedHex); let encryptedBytes2 = aesjs.utils.hex.toBytes(encryptedHex); // Use same shared key to decrypt let aesCtr2 = new aesjs.ModeOfOperation.ctr(key); let decryptedBytes = aesCtr2.decrypt(encryptedBytes2); let decryptedText = aesjs.utils.utf8.fromBytes(decryptedBytes); console.log("Decrypted text result: ", decryptedText); //Now going to decrypt...: // 9c27303372372cda33c70441f0960fde77fff9b118ddc64f2bcf027f3823da142f5e6baa //Decrypted text result: Let's encrypt... secret taco meetup! ``` Wooohooo! We have communicated without letting prying eyes know what we wrote. 🌮🌮🌮 The full code to test this out is [here](https://github.com/ajose01/eos_ecdh/blob/master/eosEncrypt.js). Feel free to give it a try. ## Step 5 - EOS tooling makes it (somewhat) simpler. Going through the steps above was a good exercise for me to learn how things are working under the hood, especially because I am interested in learning more about cryptography. However, there is a [simpler way](https://github.com/EOSIO/eosjs-ecc/issues/19) to do this via `eosjs-ecc`. Let's give it a whirl: ###### First we encrypt using the same keys generated earlier. ```Javascript // Message let message = "Tacos via EOS"; console.log("Message to encrypt: ", message); // EOS KEY1 - Encrypting console.log("EOS User 1 encrypting the message\n") let encryptedMessage = ecc.Aes.encrypt(eosPk1, eosPub2, message) let nonce = encryptedMessage.nonce.toString(); let checksum = encryptedMessage.checksum; let messageHex = encryptedMessage.message.toString('hex'); console.log("Items to send to user 2:\n", messageHex,nonce,checksum); // Items to send to user 2: // 28e2fa0c4bc8a339a5b7e096883e51fa 101379311011030238 1143290642 ``` You'll notice that we will have to send over some additional items with the user aside from the message: nonce and checksum. ###### Now we can decrypt with the other user. ```Javascript // EOS KEY2 - Decrypting the message console.log("EOS User 2 decrypting the message\n"); let messageBuffer = Buffer.from(messageHex, 'hex'); let decryptedMessageBuffer = ecc.Aes.decrypt(eosPk2, eosPub1, nonce, messageBuffer, checksum); let decryptedMessage = decryptedMessageBuffer.toString(); console.log("decrypted message: ", decryptedMessage); console.log("message match?: ", (message == decryptedMessage)); //decrypted message: Tacos via EOS //message match?: true ``` This takes care of generating the shared keys under the hood, so it let's us write less code. You can see or download the code [here](https://github.com/ajose01/eos_ecdh/blob/master/eosOnlyEncrypt.js). ## Conclusion Learning the tools that are already available is super valuable. It opens up different options on dapp design, encryption and communications. I hope this was post was helpful 🙏 Angel Jose / @ajose01 - I poke at the blockchain with the [Sense team](https://makesense.com/), host [EOS meetups](https://www.meetup.com/EOS-Dapp-Development-Meetup/), learn and share about crypto and eat 🌮🌮. * [sense.chat](https://sense.chat) * [steemit](https://steemit.com/@ajose01/) * [twitter](https://twitter.com/ajose01) * [youtube](https://www.youtube.com/channel/UC3TaA9_obCreXZrhECmKs2Q) * [past meetups](https://www.youtube.com/channel/UCN2TfO4zmz1PaezhBMtZXrw/videos) * [github](https://github.com/ajose01)
titleSecuring messages using EOS (and ECDH and AES)
authorajose01
permlinksecuring-messages-using-eos-and-ecdh-and-aes
json metadata{"tags":["eos","blockchain","encryption","tutorial","dapps"],"users":["ajose01"],"image":["https://cdn.steemitimages.com/DQmYb1GYUm6iRAksGi3acW36fVwfs6GQahioZjoMMSmuME3/image.png"],"links":["https://unsplash.com/@neonbrand","https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman","https://en.wikipedia.org/wiki/HKDF","https://github.com/ajose01/eos_ecdh/blob/master/eosEncrypt.js","https://github.com/EOSIO/eosjs-ecc/issues/19","https://github.com/ajose01/eos_ecdh/blob/master/eosOnlyEncrypt.js","https://makesense.com/","https://www.meetup.com/EOS-Dapp-Development-Meetup/","https://sense.chat","https://steemit.com/@ajose01/","https://twitter.com/ajose01","https://www.youtube.com/channel/UC3TaA9_obCreXZrhECmKs2Q","https://www.youtube.com/channel/UCN2TfO4zmz1PaezhBMtZXrw/videos","https://github.com/ajose01"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkeos
Transaction InfoBlock #29268084/Trx b81d971f217871b1a866a5306ca5d0707a4bca18
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "![Locks](https://cdn.steemitimages.com/DQmYb1GYUm6iRAksGi3acW36fVwfs6GQahioZjoMMSmuME3/image.png)\n[Photo - @neonbrand via unsplash](https://unsplash.com/@neonbrand)\n\n# Securing messages using EOS (and ECDH and AES)\n\n_Disclaimer: I'm sharing as I'm learning... please use at your own risk, or better yet share in comments how to improve! Also, I will use terms as seed / password loosely, to illustrate the process._\n\nCan we encrypt communication between two EOS users using the private / public keys already in our possession? YES! Well... with some caveats. ECC in itself is not an encryption algorithm. In EOS and other blockchains it is used to sign transactions, but not to obscure what is being signed. However, it can be leveraged to encrypt communications if we take a couple steps.\n\n## Preface\nWe are going to do this first the long way, to learn a bit about the process. We'll finish with a simpler (and quicker) way using some existing EOS tooling (Skip to Step 5 if you want to just see that). This is in Javascript, so here's what we'll need:\n```Javascript\nconst EC = require('elliptic').ec;\nconst hkdf = require('futoin-hkdf');\nconst aesjs = require('aes-js');\nconst ecc = require('eosjs-ecc');\n```\nWe'll also generate some EOS keys for ourselves:\n```Javascript\nlet eosPk1 = await PrivateKey.randomKey();\nlet eosPk2 = await PrivateKey.randomKey()\nlet eosPub1 = ecc.privateToPublic(eosPk1);\nlet eosPub2 = ecc.privateToPublic(eosPk2);\nconsole.log(\"EOS USER 1: \", eosPub1);\nconsole.log(\"EOS USER 2: \", eosPub2);\n```\n\n## Step 1 - Generate a shared encryption seed.\n\nIn order to encrypt our communications, we would usually need an encryption seed (for us encryption noobs, think something like a password) that we use to secure our communication. As long as both parties know the password, we can decrypt our message. The trick is having a common seed / pass that we never have to communicate to the other party. In crypto world, we already have enough keys to worry about! How can we accomplish this?\n\nEnter [ECDH](https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman). Using this protocol, we can use our EOS (or any ECC) private key and the other parties EOS public key.\n\nHere's the process assuming we are EOS user 1:\n```Javascript\n// EOS KEY1 - Generating shared key\nconsole.log(\"Scenario 1. EOS User 1 generating shared key via own PK, and User 2 public key\\n\")\nconst key1 = ec.keyFromPrivate(eosPk1.toBuffer());\n// We simulate not knowing the other parties PK.\nlet eosPubBuffer2 = ecc.PublicKey(eosPub2).toBuffer();\nconst ecpub2 = ec.keyFromPublic(eosPubBuffer2);\nconst pub2 = ecpub2.getPublic();\nconsole.log(\"PubKey2: \", pub2);\nconst shared1 = key1.derive(pub2).toString(16);\nconsole.log(\"Shared key derived by EOS USER 1: \", shared1);\n```\nWe'd do the reverse for the other user, and we would end up generating the same shared key #winning.\n\n## Step 2 - Convert our shared key to a valid AES key / encryption seed.\n\nOur shared key here needs to be converted to a seed we can use with AES. To do that we use a Key Derivation Function, in this case [HKDF](https://en.wikipedia.org/wiki/HKDF).\n\n```Javascript\n// Convert shared key to AES valid key\nlet key = hkdf(shared1, 16)\n```\n\n## Step 3 - Encrypt our message via AES\n\nNow that we have a valid key to use for AES encryption, we can finally get to making our messages secret.\n```Javascript\nlet text = \"Let's encrypt... secret taco meetup!\"\nconsole.log(\"Test string: \", text)\nlet textBytes = aesjs.utils.utf8.toBytes(text);\nlet aesCtr = new aesjs.ModeOfOperation.ctr(key);\nlet encryptedBytes = aesCtr.encrypt(textBytes);\n// We convert to hex to make it easy to transmit as text\nlet encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes);\nconsole.log(\"Encrypted text as it would be transmitted:\\n\", encryptedHex);\n// Encrypted text as it would be transmitted:\n// 9c27303372372cda33c70441f0960fde77fff9b118ddc64f2bcf027f3823da142f5e6baa\n\n```\nHere we could have used a nonce or a counter to add a bit more security to the messages we are sending or receiving.\n```Javascript\n// The counter is optional, and if omitted will begin at 1\nlet aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));\n```\n\n## Step 4 - Decrypting message\n\nThe other user would have been able to generate the same shared key using the steps above. On receiving this message, they would now use that key to decrypt the message.\n```Javascript\n// Time to decrypt\nconsole.log(\"Now going to decrypt...:\\n\", encryptedHex);\n\nlet encryptedBytes2 = aesjs.utils.hex.toBytes(encryptedHex);\n// Use same shared key to decrypt\nlet aesCtr2 = new aesjs.ModeOfOperation.ctr(key);\nlet decryptedBytes = aesCtr2.decrypt(encryptedBytes2);\nlet decryptedText = aesjs.utils.utf8.fromBytes(decryptedBytes);\nconsole.log(\"Decrypted text result: \", decryptedText);\n//Now going to decrypt...:\n// 9c27303372372cda33c70441f0960fde77fff9b118ddc64f2bcf027f3823da142f5e6baa\n//Decrypted text result:  Let's encrypt... secret taco meetup!\n```\nWooohooo! We have communicated without letting prying eyes know what we wrote. 🌮🌮🌮\n\nThe full code to test this out is [here](https://github.com/ajose01/eos_ecdh/blob/master/eosEncrypt.js). Feel free to give it a try.\n\n## Step 5 - EOS tooling makes it (somewhat) simpler.\nGoing through the steps above was a good exercise for me to learn how things are working under the hood, especially because I am interested in learning more about cryptography. However, there is a [simpler way](https://github.com/EOSIO/eosjs-ecc/issues/19) to do this via `eosjs-ecc`. Let's give it a whirl:\n\n###### First we encrypt using the same keys generated earlier.\n```Javascript\n// Message\nlet message = \"Tacos via EOS\";\nconsole.log(\"Message to encrypt: \", message);\n\n// EOS KEY1 - Encrypting\nconsole.log(\"EOS User 1 encrypting the message\\n\")\nlet encryptedMessage = ecc.Aes.encrypt(eosPk1, eosPub2, message)\nlet nonce = encryptedMessage.nonce.toString();\nlet checksum = encryptedMessage.checksum;\nlet messageHex = encryptedMessage.message.toString('hex');\nconsole.log(\"Items to send to user 2:\\n\", messageHex,nonce,checksum);\n// Items to send to user 2:\n// 28e2fa0c4bc8a339a5b7e096883e51fa 101379311011030238 1143290642\n```\nYou'll notice that we will have to send over some additional items with the user aside from the message: nonce and checksum.\n###### Now we can decrypt with the other user.\n```Javascript\n// EOS KEY2 - Decrypting the message\nconsole.log(\"EOS User 2 decrypting the message\\n\");\nlet messageBuffer = Buffer.from(messageHex, 'hex');\nlet decryptedMessageBuffer = ecc.Aes.decrypt(eosPk2, eosPub1, nonce, messageBuffer, checksum);\nlet decryptedMessage = decryptedMessageBuffer.toString();\nconsole.log(\"decrypted message: \", decryptedMessage);\nconsole.log(\"message match?: \", (message == decryptedMessage));\n//decrypted message:  Tacos via EOS\n//message match?:  true\n```\nThis takes care of generating the shared keys under the hood, so it let's us write less code. You can see or download the code [here](https://github.com/ajose01/eos_ecdh/blob/master/eosOnlyEncrypt.js).\n\n## Conclusion\nLearning the tools that are already available is super valuable. It opens up different options on dapp design, encryption and communications. I hope this was post was helpful 🙏\n\nAngel Jose / @ajose01 - I poke at the blockchain with the [Sense team](https://makesense.com/), host [EOS meetups](https://www.meetup.com/EOS-Dapp-Development-Meetup/), learn and share about crypto and eat 🌮🌮.\n* [sense.chat](https://sense.chat)\n* [steemit](https://steemit.com/@ajose01/)\n* [twitter](https://twitter.com/ajose01)\n* [youtube](https://www.youtube.com/channel/UC3TaA9_obCreXZrhECmKs2Q)\n* [past meetups](https://www.youtube.com/channel/UCN2TfO4zmz1PaezhBMtZXrw/videos)\n* [github](https://github.com/ajose01)",
      "title": "Securing messages using EOS (and ECDH and AES)",
      "author": "ajose01",
      "permlink": "securing-messages-using-eos-and-ecdh-and-aes",
      "json_metadata": "{\"tags\":[\"eos\",\"blockchain\",\"encryption\",\"tutorial\",\"dapps\"],\"users\":[\"ajose01\"],\"image\":[\"https://cdn.steemitimages.com/DQmYb1GYUm6iRAksGi3acW36fVwfs6GQahioZjoMMSmuME3/image.png\"],\"links\":[\"https://unsplash.com/@neonbrand\",\"https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman\",\"https://en.wikipedia.org/wiki/HKDF\",\"https://github.com/ajose01/eos_ecdh/blob/master/eosEncrypt.js\",\"https://github.com/EOSIO/eosjs-ecc/issues/19\",\"https://github.com/ajose01/eos_ecdh/blob/master/eosOnlyEncrypt.js\",\"https://makesense.com/\",\"https://www.meetup.com/EOS-Dapp-Development-Meetup/\",\"https://sense.chat\",\"https://steemit.com/@ajose01/\",\"https://twitter.com/ajose01\",\"https://www.youtube.com/channel/UC3TaA9_obCreXZrhECmKs2Q\",\"https://www.youtube.com/channel/UCN2TfO4zmz1PaezhBMtZXrw/videos\",\"https://github.com/ajose01\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "eos"
    }
  ],
  "block": 29268084,
  "trx_id": "b81d971f217871b1a866a5306ca5d0707a4bca18",
  "op_in_trx": 0,
  "timestamp": "2019-01-08T06:17:21",
  "virtual_op": false,
  "trx_in_block": 40
}
2018/12/04 10:03:42
body@@ -75,10 +75,4 @@ 4k90 -&t=27s
title
authorcryptolions
permlinkre-ajose01-scatter-and-the-jungle-testnet-20181204t100326492z
json metadata{"tags":["eos"],"image":["https://img.youtube.com/vi/6Yf-cHg4k90/0.jpg"],"links":["https://www.youtube.com/watch?v=6Yf-cHg4k90"],"app":"steemit/0.1"}
parent authorajose01
parent permlinkscatter-and-the-jungle-testnet
Transaction InfoBlock #28265334/Trx 509e66749d96bb72f6cbe1c5adfb0ad102760de2
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "@@ -75,10 +75,4 @@\n 4k90\n-&t=27s\n",
      "title": "",
      "author": "cryptolions",
      "permlink": "re-ajose01-scatter-and-the-jungle-testnet-20181204t100326492z",
      "json_metadata": "{\"tags\":[\"eos\"],\"image\":[\"https://img.youtube.com/vi/6Yf-cHg4k90/0.jpg\"],\"links\":[\"https://www.youtube.com/watch?v=6Yf-cHg4k90\"],\"app\":\"steemit/0.1\"}",
      "parent_author": "ajose01",
      "parent_permlink": "scatter-and-the-jungle-testnet"
    }
  ],
  "block": 28265334,
  "trx_id": "509e66749d96bb72f6cbe1c5adfb0ad102760de2",
  "op_in_trx": 0,
  "timestamp": "2018-12-04T10:03:42",
  "virtual_op": false,
  "trx_in_block": 17
}
2018/12/04 10:03:30
bodyThis video tutorial may help too: https://www.youtube.com/watch?v=6Yf-cHg4k90&t=27s
title
authorcryptolions
permlinkre-ajose01-scatter-and-the-jungle-testnet-20181204t100326492z
json metadata{"tags":["eos"],"image":["https://img.youtube.com/vi/6Yf-cHg4k90/0.jpg"],"links":["https://www.youtube.com/watch?v=6Yf-cHg4k90&t=27s"],"app":"steemit/0.1"}
parent authorajose01
parent permlinkscatter-and-the-jungle-testnet
Transaction InfoBlock #28265330/Trx 93bcb6bccd4462970b9ef61c613af63398f6802c
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "This video tutorial may help too:  https://www.youtube.com/watch?v=6Yf-cHg4k90&t=27s",
      "title": "",
      "author": "cryptolions",
      "permlink": "re-ajose01-scatter-and-the-jungle-testnet-20181204t100326492z",
      "json_metadata": "{\"tags\":[\"eos\"],\"image\":[\"https://img.youtube.com/vi/6Yf-cHg4k90/0.jpg\"],\"links\":[\"https://www.youtube.com/watch?v=6Yf-cHg4k90&t=27s\"],\"app\":\"steemit/0.1\"}",
      "parent_author": "ajose01",
      "parent_permlink": "scatter-and-the-jungle-testnet"
    }
  ],
  "block": 28265330,
  "trx_id": "93bcb6bccd4462970b9ef61c613af63398f6802c",
  "op_in_trx": 0,
  "timestamp": "2018-12-04T10:03:30",
  "virtual_op": false,
  "trx_in_block": 21
}
2018/09/01 03:58:57
body"Step 2: You'll need to create an account and create an identity. Easiest way is to click on "Play Around"" in Scatter? there's no such button or link there. I've created an account on EOS via zeos and I can create an identity in Scatter but how do I bind the two together?
title
authorekkis
permlinkre-ajose01-eos-and-scatter-part-1-20180901t035853062z
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authorajose01
parent permlinkeos-and-scatter-part-1
Transaction InfoBlock #25568274/Trx e3e66320a789aea0cb000a5f76bce41ae30df7cc
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "\"Step 2: You'll need to create an account and create an identity. Easiest way is to click on \"Play Around\"\"\n\nin Scatter? there's no such button or link there.  I've created an account on EOS via zeos and I can create an identity in Scatter but how do I bind the two together?",
      "title": "",
      "author": "ekkis",
      "permlink": "re-ajose01-eos-and-scatter-part-1-20180901t035853062z",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
      "parent_author": "ajose01",
      "parent_permlink": "eos-and-scatter-part-1"
    }
  ],
  "block": 25568274,
  "trx_id": "e3e66320a789aea0cb000a5f76bce41ae30df7cc",
  "op_in_trx": 0,
  "timestamp": "2018-09-01T03:58:57",
  "virtual_op": false,
  "trx_in_block": 1
}
smitopblockchain operation: transfer from savings
2018/08/01 17:58:54
toajose01
fromsmitop
memoHi, it looks like you're not voting for any witnesses. Witnesses help secure the Steem network. You should vote for some, at https://steemit.com/~witnesses, or by pressing 'Vote for witnesses' in the Steemit sidebar (top right corner). I'm a bot.
amount0.001 HBD
request id15887
Transaction InfoBlock #24692632/Trx 4906b0759dd5480d6e3f2e5805d9539d227f20cd
View Raw JSON Data
{
  "op": [
    "transfer_from_savings",
    {
      "to": "ajose01",
      "from": "smitop",
      "memo": "Hi, it looks like you're not voting for any witnesses. Witnesses help secure the Steem network. You should vote for some, at https://steemit.com/~witnesses, or by pressing 'Vote for witnesses' in the Steemit sidebar (top right corner). I'm a bot.",
      "amount": "0.001 HBD",
      "request_id": 15887
    }
  ],
  "block": 24692632,
  "trx_id": "4906b0759dd5480d6e3f2e5805d9539d227f20cd",
  "op_in_trx": 116,
  "timestamp": "2018-08-01T17:58:54",
  "virtual_op": false,
  "trx_in_block": 1
}
2018/07/27 07:02:39
bodyHello ajose01, After scatter.getIndentity, does it returns the imported public key from the created identity in scatter or something else ?
title
authoramolm
permlinkre-ajose01-eos-and-scatter-part-1-20180727t070234271z
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authorajose01
parent permlinkeos-and-scatter-part-1
Transaction InfoBlock #24535997/Trx 50dadd941d2f3f20cfb030995882e06e41e8dbc4
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "Hello ajose01,\n   After scatter.getIndentity, does it returns the imported public key from the created identity in scatter or something else ?",
      "title": "",
      "author": "amolm",
      "permlink": "re-ajose01-eos-and-scatter-part-1-20180727t070234271z",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
      "parent_author": "ajose01",
      "parent_permlink": "eos-and-scatter-part-1"
    }
  ],
  "block": 24535997,
  "trx_id": "50dadd941d2f3f20cfb030995882e06e41e8dbc4",
  "op_in_trx": 0,
  "timestamp": "2018-07-27T07:02:39",
  "virtual_op": false,
  "trx_in_block": 4
}
2018/07/24 06:34:12
voteramolm
authorajose01
weight10000 (100.00%)
permlinkscatter-and-the-jungle-testnet
Transaction InfoBlock #24449122/Trx 28aa8fe8883672579c3e4b14b97b01aa11f88ac9
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "amolm",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "scatter-and-the-jungle-testnet"
    }
  ],
  "block": 24449122,
  "trx_id": "28aa8fe8883672579c3e4b14b97b01aa11f88ac9",
  "op_in_trx": 0,
  "timestamp": "2018-07-24T06:34:12",
  "virtual_op": false,
  "trx_in_block": 22
}
2018/07/04 16:49:30
voterfher98
authorajose01
weight10000 (100.00%)
permlinkscatter-and-the-jungle-testnet
Transaction InfoBlock #23885754/Trx 2f23b44213afdf433153321a6092ed6217eabcdf
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "fher98",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "scatter-and-the-jungle-testnet"
    }
  ],
  "block": 23885754,
  "trx_id": "2f23b44213afdf433153321a6092ed6217eabcdf",
  "op_in_trx": 0,
  "timestamp": "2018-07-04T16:49:30",
  "virtual_op": false,
  "trx_in_block": 36
}
2018/06/22 09:52:45
votermishanti
authorajose01
weight10000 (100.00%)
permlinkeos-and-scatter-part-1
Transaction InfoBlock #23541751/Trx c22212bdb305447f1799e9ee10e364514b8dcf25
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "mishanti",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "eos-and-scatter-part-1"
    }
  ],
  "block": 23541751,
  "trx_id": "c22212bdb305447f1799e9ee10e364514b8dcf25",
  "op_in_trx": 0,
  "timestamp": "2018-06-22T09:52:45",
  "virtual_op": false,
  "trx_in_block": 29
}
2018/06/18 15:12:30
voterkruligh
authorajose01
weight10000 (100.00%)
permlinkre-kruligh-re-ajose01-eos-and-scatter-part-1-20180601t173840149z
Transaction InfoBlock #23432993/Trx e7c5ec3e0ea2428eb1c24930b2ad9cee4869f9b6
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "kruligh",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "re-kruligh-re-ajose01-eos-and-scatter-part-1-20180601t173840149z"
    }
  ],
  "block": 23432993,
  "trx_id": "e7c5ec3e0ea2428eb1c24930b2ad9cee4869f9b6",
  "op_in_trx": 0,
  "timestamp": "2018-06-18T15:12:30",
  "virtual_op": false,
  "trx_in_block": 36
}
2018/06/14 19:17:33
bodyGood article. I have one question. Currently i don't have eos token. After mainnet launch, I have to create account. Some KYC will be required? What will I have to do this?
title
authorkruligh
permlinkre-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180614t191729399z
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authorajose01
parent permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23322714/Trx 8c805d45f025097e82db94094d9d846337fcc01e
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "Good article. I have one question. Currently i don't have eos token. After mainnet launch, I have to create account. Some KYC will be required? What will I have to do this?",
      "title": "",
      "author": "kruligh",
      "permlink": "re-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180614t191729399z",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
      "parent_author": "ajose01",
      "parent_permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23322714,
  "trx_id": "8c805d45f025097e82db94094d9d846337fcc01e",
  "op_in_trx": 0,
  "timestamp": "2018-06-14T19:17:33",
  "virtual_op": false,
  "trx_in_block": 32
}
2018/06/13 20:39:39
authorajose01
permlinkre-eosvenezuela-re-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t203940786z
Transaction InfoBlock #23295566/Virtual Operation 4294967295:19
View Raw JSON Data
{
  "op": [
    "comment_payout_update",
    {
      "author": "ajose01",
      "permlink": "re-eosvenezuela-re-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t203940786z"
    }
  ],
  "block": 23295566,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 19,
  "timestamp": "2018-06-13T20:39:39",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
2018/06/13 06:24:27
authorajose01
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23278463/Virtual Operation 4294967295:14
View Raw JSON Data
{
  "op": [
    "comment_payout_update",
    {
      "author": "ajose01",
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23278463,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 14,
  "timestamp": "2018-06-13T06:24:27",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
2018/06/13 06:24:27
authorajose01
payout3.969 HBD
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
author rewards1658
total payout value3.071 HBD
curator payout value0.896 HBD
beneficiary payout value0.000 HBD
Transaction InfoBlock #23278463/Virtual Operation 4294967295:13
View Raw JSON Data
{
  "op": [
    "comment_reward",
    {
      "author": "ajose01",
      "payout": "3.969 HBD",
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer",
      "author_rewards": 1658,
      "total_payout_value": "3.071 HBD",
      "curator_payout_value": "0.896 HBD",
      "beneficiary_payout_value": "0.000 HBD"
    }
  ],
  "block": 23278463,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 13,
  "timestamp": "2018-06-13T06:24:27",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
ajose01received 0.255 HIVE, 1.063 HBD, 1.038 HP author reward for @ajose01 / ethereum-addresses-vs-eos-accounts-a-long-ish-explainer
2018/06/13 06:24:27
authorajose01
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
hbd payout1.063 HBD
hive payout0.255 HIVE
vesting payout1684.484613 VESTS
payout must be claimedtrue
curators vesting payout983.462669 VESTS
Transaction InfoBlock #23278463/Virtual Operation 4294967295:12
View Raw JSON Data
{
  "op": [
    "author_reward",
    {
      "author": "ajose01",
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer",
      "hbd_payout": "1.063 HBD",
      "hive_payout": "0.255 HIVE",
      "vesting_payout": "1684.484613 VESTS",
      "payout_must_be_claimed": true,
      "curators_vesting_payout": "983.462669 VESTS"
    }
  ],
  "block": 23278463,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 12,
  "timestamp": "2018-06-13T06:24:27",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
2018/06/12 17:02:42
authorajose01
permlinkre-facer-re-ajose01-scatter-and-the-jungle-testnet-20180605t170243529z
Transaction InfoBlock #23262430/Virtual Operation 4294967295:13
View Raw JSON Data
{
  "op": [
    "comment_payout_update",
    {
      "author": "ajose01",
      "permlink": "re-facer-re-ajose01-scatter-and-the-jungle-testnet-20180605t170243529z"
    }
  ],
  "block": 23262430,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 13,
  "timestamp": "2018-06-12T17:02:42",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
2018/06/12 04:41:09
authorajose01
permlinkscatter-and-the-jungle-testnet
Transaction InfoBlock #23247602/Virtual Operation 4294967295:11
View Raw JSON Data
{
  "op": [
    "comment_payout_update",
    {
      "author": "ajose01",
      "permlink": "scatter-and-the-jungle-testnet"
    }
  ],
  "block": 23247602,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 11,
  "timestamp": "2018-06-12T04:41:09",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
ajose01received 2.370 HBD reward share for scatter-and-the-jungle-testnet
2018/06/12 04:41:09
authorajose01
payout2.370 HBD
permlinkscatter-and-the-jungle-testnet
author rewards927
total payout value1.927 HBD
curator payout value0.442 HBD
beneficiary payout value0.000 HBD
Transaction InfoBlock #23247602/Virtual Operation 4294967295:10
View Raw JSON Data
{
  "op": [
    "comment_reward",
    {
      "author": "ajose01",
      "payout": "2.370 HBD",
      "permlink": "scatter-and-the-jungle-testnet",
      "author_rewards": 927,
      "total_payout_value": "1.927 HBD",
      "curator_payout_value": "0.442 HBD",
      "beneficiary_payout_value": "0.000 HBD"
    }
  ],
  "block": 23247602,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 10,
  "timestamp": "2018-06-12T04:41:09",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
ajose01received 0.093 HIVE, 0.769 HBD, 0.581 HP author reward for @ajose01 / scatter-and-the-jungle-testnet
2018/06/12 04:41:09
authorajose01
permlinkscatter-and-the-jungle-testnet
hbd payout0.769 HBD
hive payout0.093 HIVE
vesting payout942.876736 VESTS
payout must be claimedtrue
curators vesting payout432.829191 VESTS
Transaction InfoBlock #23247602/Virtual Operation 4294967295:9
View Raw JSON Data
{
  "op": [
    "author_reward",
    {
      "author": "ajose01",
      "permlink": "scatter-and-the-jungle-testnet",
      "hbd_payout": "0.769 HBD",
      "hive_payout": "0.093 HIVE",
      "vesting_payout": "942.876736 VESTS",
      "payout_must_be_claimed": true,
      "curators_vesting_payout": "432.829191 VESTS"
    }
  ],
  "block": 23247602,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 9,
  "timestamp": "2018-06-12T04:41:09",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
2018/06/11 10:42:21
voterpelviero
authorajose01
weight10000 (100.00%)
permlinkeos-and-scatter-part-1
Transaction InfoBlock #23226298/Trx a3aab0430f4846caa041172e66167217b203dc70
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "pelviero",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "eos-and-scatter-part-1"
    }
  ],
  "block": 23226298,
  "trx_id": "a3aab0430f4846caa041172e66167217b203dc70",
  "op_in_trx": 0,
  "timestamp": "2018-06-11T10:42:21",
  "virtual_op": false,
  "trx_in_block": 31
}
2018/06/08 17:38:39
authorajose01
permlinkre-kruligh-re-ajose01-eos-and-scatter-part-1-20180601t173840149z
Transaction InfoBlock #23148539/Virtual Operation 4294967295:7
View Raw JSON Data
{
  "op": [
    "comment_payout_update",
    {
      "author": "ajose01",
      "permlink": "re-kruligh-re-ajose01-eos-and-scatter-part-1-20180601t173840149z"
    }
  ],
  "block": 23148539,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 7,
  "timestamp": "2018-06-08T17:38:39",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
2018/06/08 17:38:39
authorajose01
payout0.103 HBD
permlinkre-kruligh-re-ajose01-eos-and-scatter-part-1-20180601t173840149z
author rewards33
total payout value0.076 HBD
curator payout value0.025 HBD
beneficiary payout value0.000 HBD
Transaction InfoBlock #23148539/Virtual Operation 4294967295:6
View Raw JSON Data
{
  "op": [
    "comment_reward",
    {
      "author": "ajose01",
      "payout": "0.103 HBD",
      "permlink": "re-kruligh-re-ajose01-eos-and-scatter-part-1-20180601t173840149z",
      "author_rewards": 33,
      "total_payout_value": "0.076 HBD",
      "curator_payout_value": "0.025 HBD",
      "beneficiary_payout_value": "0.000 HBD"
    }
  ],
  "block": 23148539,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 6,
  "timestamp": "2018-06-08T17:38:39",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
ajose01received 0.002 HIVE, 0.032 HBD, 0.021 HP author reward for @ajose01 / re-kruligh-re-ajose01-eos-and-scatter-part-1-20180601t173840149z
2018/06/08 17:38:39
authorajose01
permlinkre-kruligh-re-ajose01-eos-and-scatter-part-1-20180601t173840149z
hbd payout0.032 HBD
hive payout0.002 HIVE
vesting payout34.551274 VESTS
payout must be claimedtrue
curators vesting payout22.356707 VESTS
Transaction InfoBlock #23148539/Virtual Operation 4294967295:5
View Raw JSON Data
{
  "op": [
    "author_reward",
    {
      "author": "ajose01",
      "permlink": "re-kruligh-re-ajose01-eos-and-scatter-part-1-20180601t173840149z",
      "hbd_payout": "0.032 HBD",
      "hive_payout": "0.002 HIVE",
      "vesting_payout": "34.551274 VESTS",
      "payout_must_be_claimed": true,
      "curators_vesting_payout": "22.356707 VESTS"
    }
  ],
  "block": 23148539,
  "trx_id": "0000000000000000000000000000000000000000",
  "op_in_trx": 5,
  "timestamp": "2018-06-08T17:38:39",
  "virtual_op": true,
  "trx_in_block": 4294967295
}
chilieceffective vote applied for @ajose01 / scatter-and-the-jungle-testnet
2018/06/08 04:27:12
voterchiliec
authorajose01
weight842 (8.42%)
rshares1765062022
permlinkscatter-and-the-jungle-testnet
pending payout2.697 HBD
total vote weight866845
Transaction InfoBlock #23132714/Trx b5cf8cb956b699f927d3fe106a3fb309b8f90331
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "chiliec",
      "author": "ajose01",
      "weight": 842,
      "rshares": 1765062022,
      "permlink": "scatter-and-the-jungle-testnet",
      "pending_payout": "2.697 HBD",
      "total_vote_weight": 866845
    }
  ],
  "block": 23132714,
  "trx_id": "b5cf8cb956b699f927d3fe106a3fb309b8f90331",
  "op_in_trx": 1,
  "timestamp": "2018-06-08T04:27:12",
  "virtual_op": true,
  "trx_in_block": 36
}
2018/06/08 04:27:12
voterchiliec
authorajose01
weight10000 (100.00%)
permlinkscatter-and-the-jungle-testnet
Transaction InfoBlock #23132714/Trx b5cf8cb956b699f927d3fe106a3fb309b8f90331
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "chiliec",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "scatter-and-the-jungle-testnet"
    }
  ],
  "block": 23132714,
  "trx_id": "b5cf8cb956b699f927d3fe106a3fb309b8f90331",
  "op_in_trx": 0,
  "timestamp": "2018-06-08T04:27:12",
  "virtual_op": false,
  "trx_in_block": 36
}
2018/06/08 01:29:57
voterleordev
authorajose01
weight291 (2.91%)
rshares610992211
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
pending payout5.058 HBD
total vote weight1169080
Transaction InfoBlock #23129170/Trx 39d4394694d77c4fb9650d2137dc2766c261afa0
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "leordev",
      "author": "ajose01",
      "weight": 291,
      "rshares": 610992211,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer",
      "pending_payout": "5.058 HBD",
      "total_vote_weight": 1169080
    }
  ],
  "block": 23129170,
  "trx_id": "39d4394694d77c4fb9650d2137dc2766c261afa0",
  "op_in_trx": 1,
  "timestamp": "2018-06-08T01:29:57",
  "virtual_op": true,
  "trx_in_block": 15
}
2018/06/08 01:29:57
voterleordev
authorajose01
weight10000 (100.00%)
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23129170/Trx 39d4394694d77c4fb9650d2137dc2766c261afa0
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "leordev",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23129170,
  "trx_id": "39d4394694d77c4fb9650d2137dc2766c261afa0",
  "op_in_trx": 0,
  "timestamp": "2018-06-08T01:29:57",
  "virtual_op": false,
  "trx_in_block": 15
}
slavixeffective vote applied for @ajose01 / scatter-and-the-jungle-testnet
2018/06/07 18:26:30
voterslavix
authorajose01
weight272423
rshares369093300957
permlinkscatter-and-the-jungle-testnet
pending payout2.692 HBD
total vote weight866003
Transaction InfoBlock #23120709/Trx 08b1d496c812898311b89e3ef65fecb1608194fb
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "slavix",
      "author": "ajose01",
      "weight": 272423,
      "rshares": 369093300957,
      "permlink": "scatter-and-the-jungle-testnet",
      "pending_payout": "2.692 HBD",
      "total_vote_weight": 866003
    }
  ],
  "block": 23120709,
  "trx_id": "08b1d496c812898311b89e3ef65fecb1608194fb",
  "op_in_trx": 1,
  "timestamp": "2018-06-07T18:26:30",
  "virtual_op": true,
  "trx_in_block": 57
}
2018/06/07 18:26:30
voterslavix
authorajose01
weight10000 (100.00%)
permlinkscatter-and-the-jungle-testnet
Transaction InfoBlock #23120709/Trx 08b1d496c812898311b89e3ef65fecb1608194fb
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "slavix",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "scatter-and-the-jungle-testnet"
    }
  ],
  "block": 23120709,
  "trx_id": "08b1d496c812898311b89e3ef65fecb1608194fb",
  "op_in_trx": 0,
  "timestamp": "2018-06-07T18:26:30",
  "virtual_op": false,
  "trx_in_block": 57
}
2018/06/07 08:26:00
votertomaszb
authorajose01
weight291 (2.91%)
rshares610235453
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
pending payout5.147 HBD
total vote weight1168789
Transaction InfoBlock #23108708/Trx 831fe18be4a7aaa2dc31f708ba5848dfe668beab
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "tomaszb",
      "author": "ajose01",
      "weight": 291,
      "rshares": 610235453,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer",
      "pending_payout": "5.147 HBD",
      "total_vote_weight": 1168789
    }
  ],
  "block": 23108708,
  "trx_id": "831fe18be4a7aaa2dc31f708ba5848dfe668beab",
  "op_in_trx": 1,
  "timestamp": "2018-06-07T08:26:00",
  "virtual_op": true,
  "trx_in_block": 29
}
2018/06/07 08:26:00
votertomaszb
authorajose01
weight10000 (100.00%)
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23108708/Trx 831fe18be4a7aaa2dc31f708ba5848dfe668beab
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "tomaszb",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23108708,
  "trx_id": "831fe18be4a7aaa2dc31f708ba5848dfe668beab",
  "op_in_trx": 0,
  "timestamp": "2018-06-07T08:26:00",
  "virtual_op": false,
  "trx_in_block": 29
}
2018/06/07 05:15:03
voterne0thrill
authorajose01
weight291 (2.91%)
rshares610361074
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
pending payout5.125 HBD
total vote weight1168498
Transaction InfoBlock #23104889/Trx 4e15bc7778d51379125e9242991f1758a8ab48ac
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "ne0thrill",
      "author": "ajose01",
      "weight": 291,
      "rshares": 610361074,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer",
      "pending_payout": "5.125 HBD",
      "total_vote_weight": 1168498
    }
  ],
  "block": 23104889,
  "trx_id": "4e15bc7778d51379125e9242991f1758a8ab48ac",
  "op_in_trx": 1,
  "timestamp": "2018-06-07T05:15:03",
  "virtual_op": true,
  "trx_in_block": 69
}
2018/06/07 05:15:03
voterne0thrill
authorajose01
weight10000 (100.00%)
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23104889/Trx 4e15bc7778d51379125e9242991f1758a8ab48ac
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "ne0thrill",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23104889,
  "trx_id": "4e15bc7778d51379125e9242991f1758a8ab48ac",
  "op_in_trx": 0,
  "timestamp": "2018-06-07T05:15:03",
  "virtual_op": false,
  "trx_in_block": 69
}
2018/06/07 01:08:15
bodyThis is great info! Thanks! I upvoted 100%. I am friends with Gustavo and Kirill. We are neighbors. I hope we cross paths soon! Check out my first blog here. Thanks! https://steemit.com/fundinggym/@fundinggym/iprn4yf1
title
authorfundinggym
permlinkre-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180607t010811344z
json metadata{"tags":["eos"],"links":["https://steemit.com/fundinggym/@fundinggym/iprn4yf1"],"app":"steemit/0.1"}
parent authorajose01
parent permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23099955/Trx e581882492d6b8dfaee8c6a0c0a4cb7e02e4dfea
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "This is great info! Thanks! I upvoted 100%.\nI am friends with Gustavo and Kirill. We are neighbors. I hope we cross paths soon!\nCheck out my first blog here. Thanks!\nhttps://steemit.com/fundinggym/@fundinggym/iprn4yf1",
      "title": "",
      "author": "fundinggym",
      "permlink": "re-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180607t010811344z",
      "json_metadata": "{\"tags\":[\"eos\"],\"links\":[\"https://steemit.com/fundinggym/@fundinggym/iprn4yf1\"],\"app\":\"steemit/0.1\"}",
      "parent_author": "ajose01",
      "parent_permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23099955,
  "trx_id": "e581882492d6b8dfaee8c6a0c0a4cb7e02e4dfea",
  "op_in_trx": 0,
  "timestamp": "2018-06-07T01:08:15",
  "virtual_op": false,
  "trx_in_block": 10
}
2018/06/07 01:06:36
voterfundinggym
authorajose01
weight244503
rshares512758375771
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
pending payout5.104 HBD
total vote weight1168207
Transaction InfoBlock #23099922/Trx 36add1efe19e64209ee4018912e4548eb875f2b1
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "fundinggym",
      "author": "ajose01",
      "weight": 244503,
      "rshares": 512758375771,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer",
      "pending_payout": "5.104 HBD",
      "total_vote_weight": 1168207
    }
  ],
  "block": 23099922,
  "trx_id": "36add1efe19e64209ee4018912e4548eb875f2b1",
  "op_in_trx": 1,
  "timestamp": "2018-06-07T01:06:36",
  "virtual_op": true,
  "trx_in_block": 9
}
2018/06/07 01:06:36
voterfundinggym
authorajose01
weight10000 (100.00%)
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23099922/Trx 36add1efe19e64209ee4018912e4548eb875f2b1
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "fundinggym",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23099922,
  "trx_id": "36add1efe19e64209ee4018912e4548eb875f2b1",
  "op_in_trx": 0,
  "timestamp": "2018-06-07T01:06:36",
  "virtual_op": false,
  "trx_in_block": 9
}
2018/06/06 20:39:57
bodyHola amigos! 🇲🇽👋🇻🇪
title
authorajose01
permlinkre-eosvenezuela-re-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t203940786z
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authoreosvenezuela
parent permlinkre-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t191741048z
Transaction InfoBlock #23094589/Trx 8d276621d30b36523e88e9fbd308e122ee682da6
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "Hola amigos! 🇲🇽👋🇻🇪",
      "title": "",
      "author": "ajose01",
      "permlink": "re-eosvenezuela-re-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t203940786z",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
      "parent_author": "eosvenezuela",
      "parent_permlink": "re-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t191741048z"
    }
  ],
  "block": 23094589,
  "trx_id": "8d276621d30b36523e88e9fbd308e122ee682da6",
  "op_in_trx": 0,
  "timestamp": "2018-06-06T20:39:57",
  "virtual_op": false,
  "trx_in_block": 41
}
2018/06/06 20:39:42
bodyHola amigos! 🇲🇽
title
authorajose01
permlinkre-eosvenezuela-re-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t203940786z
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authoreosvenezuela
parent permlinkre-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t191741048z
Transaction InfoBlock #23094584/Trx 38a797c28fd9ce3070f524e44afd71521f5ee6a8
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "Hola amigos! 🇲🇽",
      "title": "",
      "author": "ajose01",
      "permlink": "re-eosvenezuela-re-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t203940786z",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
      "parent_author": "eosvenezuela",
      "parent_permlink": "re-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t191741048z"
    }
  ],
  "block": 23094584,
  "trx_id": "38a797c28fd9ce3070f524e44afd71521f5ee6a8",
  "op_in_trx": 0,
  "timestamp": "2018-06-06T20:39:42",
  "virtual_op": false,
  "trx_in_block": 40
}
2018/06/06 19:17:45
bodyGreat post @ajose01. Greetings from #EOSVenezuela https://s33.postimg.cc/nnqmdgzwf/instagram_format_32.jpg
title
authoreosvenezuela
permlinkre-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t191741048z
json metadata{"tags":["eos","eosvenezuela"],"users":["ajose01"],"image":["https://s33.postimg.cc/nnqmdgzwf/instagram_format_32.jpg"],"app":"steemit/0.1"}
parent authorajose01
parent permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23092945/Trx c1b6960a13110f408ffd7c48c9c10e9b0391a0af
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "Great post @ajose01. Greetings from #EOSVenezuela \n\nhttps://s33.postimg.cc/nnqmdgzwf/instagram_format_32.jpg",
      "title": "",
      "author": "eosvenezuela",
      "permlink": "re-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t191741048z",
      "json_metadata": "{\"tags\":[\"eos\",\"eosvenezuela\"],\"users\":[\"ajose01\"],\"image\":[\"https://s33.postimg.cc/nnqmdgzwf/instagram_format_32.jpg\"],\"app\":\"steemit/0.1\"}",
      "parent_author": "ajose01",
      "parent_permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23092945,
  "trx_id": "c1b6960a13110f408ffd7c48c9c10e9b0391a0af",
  "op_in_trx": 0,
  "timestamp": "2018-06-06T19:17:45",
  "virtual_op": false,
  "trx_in_block": 8
}
2018/06/06 19:17:24
votereosvenezuela
authorajose01
weight155 (1.55%)
rshares326506690
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
pending payout3.161 HBD
total vote weight923704
Transaction InfoBlock #23092938/Trx c860e3c3fa14f1326286c289e1de8c6c74694a28
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "eosvenezuela",
      "author": "ajose01",
      "weight": 155,
      "rshares": 326506690,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer",
      "pending_payout": "3.161 HBD",
      "total_vote_weight": 923704
    }
  ],
  "block": 23092938,
  "trx_id": "c860e3c3fa14f1326286c289e1de8c6c74694a28",
  "op_in_trx": 1,
  "timestamp": "2018-06-06T19:17:24",
  "virtual_op": true,
  "trx_in_block": 22
}
2018/06/06 19:17:24
votereosvenezuela
authorajose01
weight10000 (100.00%)
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23092938/Trx c860e3c3fa14f1326286c289e1de8c6c74694a28
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "eosvenezuela",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23092938,
  "trx_id": "c860e3c3fa14f1326286c289e1de8c6c74694a28",
  "op_in_trx": 0,
  "timestamp": "2018-06-06T19:17:24",
  "virtual_op": false,
  "trx_in_block": 22
}
2018/06/06 14:52:39
votermariusfebruary
authorajose01
weight699783
rshares788712979122
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
pending payout3.192 HBD
total vote weight923549
Transaction InfoBlock #23087644/Trx 2f325661044ce48b75588f1c87751c109cfb93a1
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "mariusfebruary",
      "author": "ajose01",
      "weight": 699783,
      "rshares": 788712979122,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer",
      "pending_payout": "3.192 HBD",
      "total_vote_weight": 923549
    }
  ],
  "block": 23087644,
  "trx_id": "2f325661044ce48b75588f1c87751c109cfb93a1",
  "op_in_trx": 1,
  "timestamp": "2018-06-06T14:52:39",
  "virtual_op": true,
  "trx_in_block": 78
}
2018/06/06 14:52:39
votermariusfebruary
authorajose01
weight10000 (100.00%)
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23087644/Trx 2f325661044ce48b75588f1c87751c109cfb93a1
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "mariusfebruary",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23087644,
  "trx_id": "2f325661044ce48b75588f1c87751c109cfb93a1",
  "op_in_trx": 0,
  "timestamp": "2018-06-06T14:52:39",
  "virtual_op": false,
  "trx_in_block": 78
}
2018/06/06 08:16:39
voterantimetica
authorajose01
weight3238 (32.38%)
rshares1697808322
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
pending payout0.186 HBD
total vote weight223766
Transaction InfoBlock #23079725/Trx 8e3a1e8f0536810b5c10be5ec86196f9e38b91d7
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "antimetica",
      "author": "ajose01",
      "weight": 3238,
      "rshares": 1697808322,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer",
      "pending_payout": "0.186 HBD",
      "total_vote_weight": 223766
    }
  ],
  "block": 23079725,
  "trx_id": "8e3a1e8f0536810b5c10be5ec86196f9e38b91d7",
  "op_in_trx": 1,
  "timestamp": "2018-06-06T08:16:39",
  "virtual_op": true,
  "trx_in_block": 22
}
2018/06/06 08:16:39
voterantimetica
authorajose01
weight10000 (100.00%)
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23079725/Trx 8e3a1e8f0536810b5c10be5ec86196f9e38b91d7
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "antimetica",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23079725,
  "trx_id": "8e3a1e8f0536810b5c10be5ec86196f9e38b91d7",
  "op_in_trx": 0,
  "timestamp": "2018-06-06T08:16:39",
  "virtual_op": false,
  "trx_in_block": 22
}
2018/06/06 07:52:06
bodythats gives a good understanding why generating key pairs wasnt working on scatter & always gave the error.. "no account"
title
authorivrmakers
permlinkre-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t075200104z
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authorajose01
parent permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23079234/Trx d1cb65caeb5011d27c7a3bbc8b6fbbcd244c0a88
View Raw JSON Data
{
  "op": [
    "comment",
    {
      "body": "thats gives a good understanding why generating key pairs wasnt working on scatter & always gave the error.. \"no account\"",
      "title": "",
      "author": "ivrmakers",
      "permlink": "re-ajose01-ethereum-addresses-vs-eos-accounts-a-long-ish-explainer-20180606t075200104z",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
      "parent_author": "ajose01",
      "parent_permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23079234,
  "trx_id": "d1cb65caeb5011d27c7a3bbc8b6fbbcd244c0a88",
  "op_in_trx": 0,
  "timestamp": "2018-06-06T07:52:06",
  "virtual_op": false,
  "trx_in_block": 68
}
2018/06/06 07:44:57
voterivrmakers
authorajose01
weight9853 (98.53%)
rshares5165847292
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
pending payout0.180 HBD
total vote weight220528
Transaction InfoBlock #23079091/Trx 665bf842fe4868cb8e2ae939a19ec4735892b997
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "ivrmakers",
      "author": "ajose01",
      "weight": 9853,
      "rshares": 5165847292,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer",
      "pending_payout": "0.180 HBD",
      "total_vote_weight": 220528
    }
  ],
  "block": 23079091,
  "trx_id": "665bf842fe4868cb8e2ae939a19ec4735892b997",
  "op_in_trx": 1,
  "timestamp": "2018-06-06T07:44:57",
  "virtual_op": true,
  "trx_in_block": 28
}
2018/06/06 07:44:57
voterivrmakers
authorajose01
weight3300 (33.00%)
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23079091/Trx 665bf842fe4868cb8e2ae939a19ec4735892b997
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "ivrmakers",
      "author": "ajose01",
      "weight": 3300,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23079091,
  "trx_id": "665bf842fe4868cb8e2ae939a19ec4735892b997",
  "op_in_trx": 0,
  "timestamp": "2018-06-06T07:44:57",
  "virtual_op": false,
  "trx_in_block": 28
}
2018/06/06 06:56:30
voteranomaly
authorajose01
weight444 (4.44%)
rshares232382246
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
pending payout0.160 HBD
total vote weight210675
Transaction InfoBlock #23078122/Trx c263202440df48877afec4b9d4e89d6142489c8b
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "anomaly",
      "author": "ajose01",
      "weight": 444,
      "rshares": 232382246,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer",
      "pending_payout": "0.160 HBD",
      "total_vote_weight": 210675
    }
  ],
  "block": 23078122,
  "trx_id": "c263202440df48877afec4b9d4e89d6142489c8b",
  "op_in_trx": 1,
  "timestamp": "2018-06-06T06:56:30",
  "virtual_op": true,
  "trx_in_block": 73
}
2018/06/06 06:56:30
voteranomaly
authorajose01
weight100 (1.00%)
permlinkethereum-addresses-vs-eos-accounts-a-long-ish-explainer
Transaction InfoBlock #23078122/Trx c263202440df48877afec4b9d4e89d6142489c8b
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "anomaly",
      "author": "ajose01",
      "weight": 100,
      "permlink": "ethereum-addresses-vs-eos-accounts-a-long-ish-explainer"
    }
  ],
  "block": 23078122,
  "trx_id": "c263202440df48877afec4b9d4e89d6142489c8b",
  "op_in_trx": 0,
  "timestamp": "2018-06-06T06:56:30",
  "virtual_op": false,
  "trx_in_block": 73
}
2018/06/06 06:41:18
votervirtualgrowth
authorajose01
weight34868
rshares36561401000
permlinkscatter-and-the-jungle-testnet
pending payout1.336 HBD
total vote weight593580
Transaction InfoBlock #23077818/Trx 035c002d7ac13d3530020fd4fd636e800d72b53e
View Raw JSON Data
{
  "op": [
    "effective_comment_vote",
    {
      "voter": "virtualgrowth",
      "author": "ajose01",
      "weight": 34868,
      "rshares": 36561401000,
      "permlink": "scatter-and-the-jungle-testnet",
      "pending_payout": "1.336 HBD",
      "total_vote_weight": 593580
    }
  ],
  "block": 23077818,
  "trx_id": "035c002d7ac13d3530020fd4fd636e800d72b53e",
  "op_in_trx": 1,
  "timestamp": "2018-06-06T06:41:18",
  "virtual_op": true,
  "trx_in_block": 21
}
2018/06/06 06:41:18
votervirtualgrowth
authorajose01
weight10000 (100.00%)
permlinkscatter-and-the-jungle-testnet
Transaction InfoBlock #23077818/Trx 035c002d7ac13d3530020fd4fd636e800d72b53e
View Raw JSON Data
{
  "op": [
    "vote",
    {
      "voter": "virtualgrowth",
      "author": "ajose01",
      "weight": 10000,
      "permlink": "scatter-and-the-jungle-testnet"
    }
  ],
  "block": 23077818,
  "trx_id": "035c002d7ac13d3530020fd4fd636e800d72b53e",
  "op_in_trx": 0,
  "timestamp": "2018-06-06T06:41:18",
  "virtual_op": false,
  "trx_in_block": 21
}

Account Metadata

POSTING JSON METADATA
profile{"profile_image":"https://steemitimages.com/DQmQKiEhpoZV9oVgEMpkFji1M8CxVsaUQ7qSki3HhZkuVZQ/angel_social.JPG","name":"Angel Jose","about":"Blockchain / bot builder / engineering lead for @sensay / http://makesense.com . Exploring crypto, blockchains and bots :) #EOS_IO $SENSE"}
JSON METADATA
profile{"profile_image":"https://steemitimages.com/DQmQKiEhpoZV9oVgEMpkFji1M8CxVsaUQ7qSki3HhZkuVZQ/angel_social.JPG","name":"Angel Jose","about":"Blockchain / bot builder / engineering lead for @sensay / http://makesense.com . Exploring crypto, blockchains and bots :) #EOS_IO $SENSE"}
{
  "posting_json_metadata": {
    "profile": {
      "profile_image": "https://steemitimages.com/DQmQKiEhpoZV9oVgEMpkFji1M8CxVsaUQ7qSki3HhZkuVZQ/angel_social.JPG",
      "name": "Angel Jose",
      "about": "Blockchain / bot builder / engineering lead for @sensay / http://makesense.com . Exploring crypto, blockchains and bots :) #EOS_IO $SENSE"
    }
  },
  "json_metadata": {
    "profile": {
      "profile_image": "https://steemitimages.com/DQmQKiEhpoZV9oVgEMpkFji1M8CxVsaUQ7qSki3HhZkuVZQ/angel_social.JPG",
      "name": "Angel Jose",
      "about": "Blockchain / bot builder / engineering lead for @sensay / http://makesense.com . Exploring crypto, blockchains and bots :) #EOS_IO $SENSE"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM7wd6bDHaccjZtVcEh4MRby2qkv23sWR5XXrVyynLabG7uHackF1/1
Active
Single Signature
Public Keys
STM5cb2xX7FRdEZvwUBLsJvTVkzieSDpStJbF16T2g4BxF9WFSxZi1/1
Posting
Single Signature
Public Keys
STM7e2edM8YhV6vM6zASK33AGXCWijwvexKYvnsrXzMjcKjJiw5Qm1/1
App Permissions
Memo
STM6yYFUmm4tg74FNeZ5QMioTq45hyuhvW9opk4cEZ3UYpZStWLac
{
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7wd6bDHaccjZtVcEh4MRby2qkv23sWR5XXrVyynLabG7uHackF",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5cb2xX7FRdEZvwUBLsJvTVkzieSDpStJbF16T2g4BxF9WFSxZi",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [
      [
        "dlive.app",
        1
      ]
    ],
    "key_auths": [
      [
        "STM7e2edM8YhV6vM6zASK33AGXCWijwvexKYvnsrXzMjcKjJiw5Qm",
        1
      ]
    ]
  },
  "memo": "STM6yYFUmm4tg74FNeZ5QMioTq45hyuhvW9opk4cEZ3UYpZStWLac"
}

Witness Votes

0 / 30
No active witness votes.
[]