Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.007USD
STEEM
0.000STEEM
SBD
0.000SBD
Effective Power
5.007SP
├── Own SP
0.125SP
└── Incoming Deleg
+4.882SP

Detailed Balance

STEEM
balance
0.000STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
0.125SP
Delegated Out
0.000SP
Delegation In
4.882SP
Effective Power
5.007SP
Reward SP (pending)
0.000SP
SBD
sbd_balance
0.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.000SBD
{
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "203.557164 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7940.102642 VESTS",
  "sbd_balance": "0.000 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.000 SBD",
  "conversions": []
}

Account Info

namerajita
id975711
rank279,486
reputation0
created2018-05-09T22:11:39
recovery_accountsteem
proxyNone
post_count1
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-05-09T22:24:57
last_root_post2018-05-09T22:24:57
last_vote_time1970-01-01T00:00:00
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares203.557164 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7940.102642 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
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_update1970-01-01T00:00:00
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM5RBMRwVSoL7saWCzzctPFsGxDyfojb2hcPL2gxbDMSxTCGktL4",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "balance": "0.000 STEEM",
  "can_vote": true,
  "comment_count": 0,
  "created": "2018-05-09T22:11:39",
  "curation_rewards": 0,
  "delegated_vesting_shares": "0.000000 VESTS",
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779082068
  },
  "guest_bloggers": [],
  "id": 975711,
  "json_metadata": "{}",
  "last_account_recovery": "1970-01-01T00:00:00",
  "last_account_update": "1970-01-01T00:00:00",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_post": "2018-05-09T22:24:57",
  "last_root_post": "2018-05-09T22:24:57",
  "last_vote_time": "1970-01-01T00:00:00",
  "lifetime_vote_count": 0,
  "market_history": [],
  "memo_key": "STM6AkYBYwHR8AkBcquDH3UZxDLuPvoW1PZC7kR1SqS7i3uqJ1ZaE",
  "mined": false,
  "name": "rajita",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "other_history": [],
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM5k3bVfCuiNGAKfzqkJ5VU2VE3LLLLHRAXt9fNMYxxdxk4rJb5b",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "pending_claimed_accounts": 0,
  "post_bandwidth": 0,
  "post_count": 1,
  "post_history": [],
  "posting": {
    "account_auths": [],
    "key_auths": [
      [
        "STM8CLS1GDf4YZKoX1BEwYRCWiFi9VLXwysecnDsnb9VrDP9KPD4v",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting_json_metadata": "",
  "posting_rewards": 0,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "proxy": "",
  "received_vesting_shares": "7940.102642 VESTS",
  "recovery_account": "steem",
  "reputation": 0,
  "reset_account": "null",
  "reward_sbd_balance": "0.000 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "0.000000 VESTS",
  "reward_vesting_steem": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "sbd_balance": "0.000 SBD",
  "sbd_last_interest_payment": "1970-01-01T00:00:00",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "1970-01-01T00:00:00",
  "tags_usage": [],
  "to_withdraw": 0,
  "transfer_history": [],
  "vesting_balance": "0.000 STEEM",
  "vesting_shares": "203.557164 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "vote_history": [],
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779082068
  },
  "voting_power": 0,
  "withdraw_routes": 0,
  "withdrawn": 0,
  "witness_votes": [],
  "witnesses_voted_for": 0,
  "rank": 279486
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.882 SP to @rajita
2026/05/18 05:27:48
delegateerajita
delegatorsteem
vesting shares7940.102642 VESTS
Transaction InfoBlock #106149671/Trx 909d6e4733ba48ed064ca4ea95f01e1b838109ac
View Raw JSON Data
{
  "block": 106149671,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "7940.102642 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-05-18T05:27:48",
  "trx_id": "909d6e4733ba48ed064ca4ea95f01e1b838109ac",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 3.214 SP to @rajita
2026/05/13 01:00:39
delegateerajita
delegatorsteem
vesting shares5227.892237 VESTS
Transaction InfoBlock #106001058/Trx 0ac62fb3302e19528a3f4692e76ff7d1376d03b0
View Raw JSON Data
{
  "block": 106001058,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "5227.892237 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-05-13T01:00:39",
  "trx_id": "0ac62fb3302e19528a3f4692e76ff7d1376d03b0",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 4.889 SP to @rajita
2026/04/26 04:40:48
delegateerajita
delegatorsteem
vesting shares7952.618398 VESTS
Transaction InfoBlock #105517181/Trx 9fba04869bcb79d5a7356d54ee0f034908d3e8ef
View Raw JSON Data
{
  "block": 105517181,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "7952.618398 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-04-26T04:40:48",
  "trx_id": "9fba04869bcb79d5a7356d54ee0f034908d3e8ef",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 3.240 SP to @rajita
2026/01/23 21:48:45
delegateerajita
delegatorsteem
vesting shares5269.439056 VESTS
Transaction InfoBlock #102868597/Trx 7bb7e4d632bf379e81c4cbfd8b237a9b7b4725b3
View Raw JSON Data
{
  "block": 102868597,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "5269.439056 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-01-23T21:48:45",
  "trx_id": "7bb7e4d632bf379e81c4cbfd8b237a9b7b4725b3",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 3.341 SP to @rajita
2024/12/17 16:59:30
delegateerajita
delegatorsteem
vesting shares5433.658253 VESTS
Transaction InfoBlock #91314825/Trx 11f497680c773fc9a8aa2c29f458a1d46c635378
View Raw JSON Data
{
  "block": 91314825,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "5433.658253 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2024-12-17T16:59:30",
  "trx_id": "11f497680c773fc9a8aa2c29f458a1d46c635378",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 3.445 SP to @rajita
2023/11/14 08:41:06
delegateerajita
delegatorsteem
vesting shares5602.791785 VESTS
Transaction InfoBlock #79868985/Trx a23ae6000a22b834574ec179469b08adf7c5c45b
View Raw JSON Data
{
  "block": 79868985,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "5602.791785 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2023-11-14T08:41:06",
  "trx_id": "a23ae6000a22b834574ec179469b08adf7c5c45b",
  "trx_in_block": 7,
  "virtual_op": 0
}
steemdelegated 5.250 SP to @rajita
2023/09/22 09:24:51
delegateerajita
delegatorsteem
vesting shares8539.700571 VESTS
Transaction InfoBlock #78361695/Trx 02c1dab48ebc977c866a177ff11d8e4dde8dbf67
View Raw JSON Data
{
  "block": 78361695,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "8539.700571 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2023-09-22T09:24:51",
  "trx_id": "02c1dab48ebc977c866a177ff11d8e4dde8dbf67",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 5.387 SP to @rajita
2022/11/03 16:59:54
delegateerajita
delegatorsteem
vesting shares8761.752009 VESTS
Transaction InfoBlock #69119584/Trx 80b5556270c141394d43e03ac3fcdfc3e0224531
View Raw JSON Data
{
  "block": 69119584,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "8761.752009 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2022-11-03T16:59:54",
  "trx_id": "80b5556270c141394d43e03ac3fcdfc3e0224531",
  "trx_in_block": 4,
  "virtual_op": 0
}
steemdelegated 5.522 SP to @rajita
2022/01/17 22:16:54
delegateerajita
delegatorsteem
vesting shares8981.859610 VESTS
Transaction InfoBlock #60822933/Trx fd3c5b63ec11b525ab1b723546e22f9546104b3c
View Raw JSON Data
{
  "block": 60822933,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "8981.859610 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2022-01-17T22:16:54",
  "trx_id": "fd3c5b63ec11b525ab1b723546e22f9546104b3c",
  "trx_in_block": 14,
  "virtual_op": 0
}
steemdelegated 5.635 SP to @rajita
2021/06/14 05:30:00
delegateerajita
delegatorsteem
vesting shares9166.053898 VESTS
Transaction InfoBlock #54613306/Trx f334b52bdf14e5d9e0d50a240f50890334920c16
View Raw JSON Data
{
  "block": 54613306,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "9166.053898 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2021-06-14T05:30:00",
  "trx_id": "f334b52bdf14e5d9e0d50a240f50890334920c16",
  "trx_in_block": 13,
  "virtual_op": 0
}
steemdelegated 5.751 SP to @rajita
2020/12/11 15:42:54
delegateerajita
delegatorsteem
vesting shares9353.475872 VESTS
Transaction InfoBlock #49360592/Trx 326848dc2179b51a4cdebe881aa4ea43c64ed8fd
View Raw JSON Data
{
  "block": 49360592,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "9353.475872 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-11T15:42:54",
  "trx_id": "326848dc2179b51a4cdebe881aa4ea43c64ed8fd",
  "trx_in_block": 5,
  "virtual_op": 0
}
steemdelegated 1.176 SP to @rajita
2020/12/06 09:18:57
delegateerajita
delegatorsteem
vesting shares1912.543513 VESTS
Transaction InfoBlock #49212121/Trx 43fdd7b04dc8fb1042099d8a3940d5bf9b7c6432
View Raw JSON Data
{
  "block": 49212121,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "1912.543513 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-06T09:18:57",
  "trx_id": "43fdd7b04dc8fb1042099d8a3940d5bf9b7c6432",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 5.754 SP to @rajita
2020/12/05 19:20:51
delegateerajita
delegatorsteem
vesting shares9359.683726 VESTS
Transaction InfoBlock #49195676/Trx 6f578b02bdeb83e5f4ffdaaea0a5db42bd64e734
View Raw JSON Data
{
  "block": 49195676,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "9359.683726 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-05T19:20:51",
  "trx_id": "6f578b02bdeb83e5f4ffdaaea0a5db42bd64e734",
  "trx_in_block": 11,
  "virtual_op": 0
}
steemdelegated 1.180 SP to @rajita
2020/11/03 01:08:27
delegateerajita
delegatorsteem
vesting shares1920.017158 VESTS
Transaction InfoBlock #48268992/Trx b711813e7c76cffaffc779be95ed5c6d75537b73
View Raw JSON Data
{
  "block": 48268992,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "1920.017158 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-11-03T01:08:27",
  "trx_id": "b711813e7c76cffaffc779be95ed5c6d75537b73",
  "trx_in_block": 5,
  "virtual_op": 0
}
steemdelegated 5.879 SP to @rajita
2020/05/09 10:21:15
delegateerajita
delegatorsteem
vesting shares9562.489085 VESTS
Transaction InfoBlock #43222437/Trx af8e318ec4c31858b33273f042c771a91979b60c
View Raw JSON Data
{
  "block": 43222437,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "9562.489085 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-05-09T10:21:15",
  "trx_id": "af8e318ec4c31858b33273f042c771a91979b60c",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 1.201 SP to @rajita
2020/05/08 14:38:51
delegateerajita
delegatorsteem
vesting shares1953.311140 VESTS
Transaction InfoBlock #43199353/Trx 41b1899acffae5820a371698622e350eec2b7834
View Raw JSON Data
{
  "block": 43199353,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "1953.311140 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-05-08T14:38:51",
  "trx_id": "41b1899acffae5820a371698622e350eec2b7834",
  "trx_in_block": 20,
  "virtual_op": 0
}
steemdelegated 5.980 SP to @rajita
2019/07/26 15:27:30
delegateerajita
delegatorsteem
vesting shares9727.178959 VESTS
Transaction InfoBlock #35003198/Trx d78272eee06d597f7a7290a4a6502b3bcbccfa79
View Raw JSON Data
{
  "block": 35003198,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "9727.178959 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-07-26T15:27:30",
  "trx_id": "d78272eee06d597f7a7290a4a6502b3bcbccfa79",
  "trx_in_block": 37,
  "virtual_op": 0
}
2019/05/09 23:23:18
authorsteemitboard
bodyCongratulations @rajita! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@rajita/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/@rajita) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=rajita)_</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></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!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
parent authorrajita
parent permlinkbest-practices-for-building-blockchain-solutions-with-solidity-part-i
permlinksteemitboard-notify-rajita-20190509t232317000z
title
Transaction InfoBlock #32769295/Trx ddd2b83fcd83254416e84b3a2191786966a4549c
View Raw JSON Data
{
  "block": 32769295,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @rajita! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@rajita/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/@rajita) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=rajita)_</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></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!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
      "parent_author": "rajita",
      "parent_permlink": "best-practices-for-building-blockchain-solutions-with-solidity-part-i",
      "permlink": "steemitboard-notify-rajita-20190509t232317000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-05-09T23:23:18",
  "trx_id": "ddd2b83fcd83254416e84b3a2191786966a4549c",
  "trx_in_block": 6,
  "virtual_op": 0
}
steemdelegated 6.103 SP to @rajita
2018/08/08 23:19:48
delegateerajita
delegatorsteem
vesting shares9925.846121 VESTS
Transaction InfoBlock #24900566/Trx c02973a2567f79a645bf9fe7e5556dd42b027a57
View Raw JSON Data
{
  "block": 24900566,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "9925.846121 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-08-08T23:19:48",
  "trx_id": "c02973a2567f79a645bf9fe7e5556dd42b027a57",
  "trx_in_block": 19,
  "virtual_op": 0
}
2018/05/10 00:55:03
authorrajita
permlinkbest-practices-for-building-blockchain-solutions-with-solidity-part-i
votersensation
weight10000 (100.00%)
Transaction InfoBlock #22293827/Trx ffeaa451342c5f3af90479183ae69048db4b8392
View Raw JSON Data
{
  "block": 22293827,
  "op": [
    "vote",
    {
      "author": "rajita",
      "permlink": "best-practices-for-building-blockchain-solutions-with-solidity-part-i",
      "voter": "sensation",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-10T00:55:03",
  "trx_id": "ffeaa451342c5f3af90479183ae69048db4b8392",
  "trx_in_block": 3,
  "virtual_op": 0
}
steemdelegated 18.647 SP to @rajita
2018/05/09 23:48:12
delegateerajita
delegatorsteem
vesting shares30329.925965 VESTS
Transaction InfoBlock #22292490/Trx 85bfa29a3b11369b45b612899bf8b9e251bd5715
View Raw JSON Data
{
  "block": 22292490,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "rajita",
      "delegator": "steem",
      "vesting_shares": "30329.925965 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-09T23:48:12",
  "trx_id": "85bfa29a3b11369b45b612899bf8b9e251bd5715",
  "trx_in_block": 16,
  "virtual_op": 0
}
2018/05/09 22:24:57
authorrajita
body(https://steemitimages.com/DQmW5rmVB4A53cLciZH6zs6Ez26EVQTz65nYCP9iSQHG1nc/blockchain.jpg) Overview The purpose of this article is to consolidate findings around design and development best practices in the Solidity environment. While blockchain technologies are still evolving, it is implicitly understood that some of the best practices outlined in this article are subject to change and subject to debate. As the market continues to evolve, it is imperative that discussions around governance and standards of excellence happen on a continual basis. As such, feedback is highly welcome. Guidelines that are specifically geared towards building Dapps, in many cases, leverage and build upon software best practices that have existed in the Information Technology industry for decades. This article intends to be a starting point, or at least one of the starting points, for a conversation around Solidity best practices on the Linkedin forum. Furthermore, this article intends to be the first in a series of articles that subsequently cover advanced topics via collaboration with other blockchain professionals. Scope The content here is geared towards Ethereum Solidity. This article will touch upon recommendations for nomenclature, account management, user interface development, error handling, security, inheritance, performance and scalability, and robustness. Upward migration and deployment using truffle are out of scope for this installment. The intended audience is blockchain enthusiasts. The Solidity snippets illustrated herein are compatible with the 0.4.23 parser and the Javascript snippets use ES6 syntax. Please note that for the sake of conciseness, the snippets are fragmented. I) Nomenclature for Solidity Contracts 1. Smart contract names are typically nouns with the starting letter in upper case and the rest in lower. 2. The above bullet applies to struct declarations as well since they describe abstract entities. 3. All variable declarations should be in lower case. II) Account Management 1. Passwords and private keys should be saved as soon as they are generated. The password will be needed when unlocking an account. 2. In order to safeguard your password, accounts should be unlocked in interactive mode as opposed to typing the password at the command line where it might be captured in the console history. The danger of exposing the password on the screen is evident in b) or using --password parameter in a). Choose a) over b). a) geth --unlock <account_address> By executing this line, you will be prompted for the password (for the reasons explained above, it is not advisable to use the --password parameter in this command). b) web3.eth.personal.unlockAccount(<account_address>, < pass_word >) 3. The 12-word mnemonic (seed-phrase) generated by Metamask should be stored somewhere safe. In the event private keys are lost or misplaced, the mnemonic can be used to regenerate the existing set of accounts. III) User Interfaces Decentralized solutions need special considerations when it comes to developing intuitive and interactive end-user applications. End users do not interact with a smart contract directly but with the front-end app that provides an interface between the user and the Dapp. For illustration purposes, it is assumed that UI is built with Javascript. 1. Present Users with Confirmation dialogs informing them with the irreversibility of transactions. Blockchain transactions are architected for immutability in a P2P distributed environment. The end user needs to be aware that they cannot create a support ticket with a central authority that can reverse the unintended transaction like they did with traditional apps. As such, it's best practice to prompt the end user with a confirmation dialog with the salient features of the transaction especially all the financial attributes involved, giving the user the option to scrutinize the values one more time so they can choose to proceed or cancel. 2. Consider the channels used for consuming the Dapp; mobile, web or both. 3. Provision UI widgets that account for latency. While transaction latency largely depends on the consensus algorithm, it is best practice to provision widgets such as button spinners or Progress views that let the end user know that the transaction may not be processed instantaneously given the nature of the blockchain. This is especially true of Proof-Of-Work consensus algorithms as used by Solidity currently. 4. Rendering of UI for mobile clients with slow connections. Server-side rendering might alleviate some of the frustration of an end user's Dapp experience from a cell phone interface on a slow connection. In these scenarios, using a utility such as Next.js can create some initial HTML content on the screen while the javascript code is rendered by the react utility inside the browser. On the flip side, if the browser (client) has to do all the work, that might leave users with an empty screen for a while until rendering completes. 5. UI widget and page visibility Since the blockchain relies on users to perform transactions based on assigned authority, UI design should follow suit by presenting the appropriate functionality to authorized users. In the design phase, it needs to be determined which pages/screens different users have access to, what widgets they can see and what actions they can perform. 6. Ensure that the render() method accounts for any changes to the state of the contract. By doing so, you can ensure that new values appear on the screen without a manual refresh. 7. Wrap transaction calls in try-catch blocks. All calls to the smart contract from the front-end app should be wrapped in try-catch blocks so that a user-friendly error is returned to the message on the UI component such as a form. This is covered further in the next section. IV) Error Handling 1. Use try-catch blocks. As covered in the earlier section on UI, try-catch blocks should be used when invoking smart contract methods from the application and error messages should be displayed on the UI. This is cleaner and easier than doing explicit input validations, etc. 2. Capture error messages. In the event of an error, ensure that the UI component (such a form) re-renders by capturing the value of the error object in a state variable. class IndexPage extends Component { state = {errorMsg: ''} onClick = async () => { try { //invoke a call to the smart contract } catch (err) { this.setState({errorMsg: err.message}); } ….. } render() { /*Use a react or semantic-ui-react component like Message to return the value of state variable errorMsg to the user. When using a Form, be sure to add an error property to the Form. */ } } The above is preferable to Metamask returning a cryptic error in the console but no user-friendly message to the user in a contained widget. V) Security The smart contract needs to ensure that functions that modify the state of the blockchain (transactions) can only be invoked by the authorized parties. Create reusable modifiers to qualify functions instead of implementing checks at the code-level inside the function (in order to keep the snippets concise, the constructor function that assigns the msg.sender attribute to the manager variable will not be written below. Please assume that it exists in the contract). Given the following options, choose a) over b). a) contract Game { address manager; modifier restricted() { require(msg.sender == manager); _; (the underscore servers as a placeholder for code substitution ) } function pickWinner (uint i) public restricted returns (address) { ….. ….. } } b) contract Game { address manager; function pickWinner (uint i) public returns (address) { require(msg.sender == manager); //(where manager is a wallet address of the manager of the contract) …... ….. } } In a), we have defined a reusable modifier that can be applied to multiple functions, that substitutes the underscore with the function code after checking for AuthZ. In a), the function can focus on its core logic instead of checking for Auth issues. VI) Inheritance Reusability across multiple contracts should be considered in the design phase. It's very likely that there will be other smart contracts in the future that will require a manager. In that event, the previous section could be rewritten in the following way (as mentioned in the previous section, please assume that the constructor exists). contract Manageable{ address manager; modifier restricted() { require(msg.sender == manager); _; // (the underscore serves as a placeholder for code substitution from the function) } } import "./Manageable.sol"; //for the sake of simplicity for this article, assume it's in the same folder contract Game is Manageable{ function pickWinner(uint i) public restricted returns (address) { ….. } } This method and notation eliminates redundant declarations of the manager variable across multiple contracts and also makes the restricted modifier reusable with a two-fold benefit. 1. Functions can focus on the business/transaction related code and not have to keep up with AuthZ changes. 2. Core AuthZ functionality can be managed in one spot, which might reduce the amount of regression testing. VII) Performance/Scalability and Gas Consumption 1. While blockchain algorithms are evolving in order to alleviate gas charges to the user, the deployment of smart contract code entails gas, as does any transaction that alters data/state on the blockchain. Computationally intensive functions that require high processing power and high bandwidth cost more than those that require less. The following recommendations can not only decrease said costs but also create more readable, maintainable and efficient code. 2. Where possible, replace array traversals that use loops with mapping lookups. 3. Arrays are suitable for collections where all that is needed for a lookup is an index. 4. When using uint for variable declarations, if the maximum size is identified and set in stone during design-time, a precision in the maximum number of digits is recommended in the declaration, for instance, uint16, uint32, etc. 5. Examine code for the possibility of infinite loops by checking if terminal conditions are met in all scenarios. 6. If a multi-part expression is going to be referenced multiple times, consider saving it to a variable and referencing the variable instead within if statements, etc. 7. Infrastructure auto-scalability should be provisioned either horizontally or vertically (depending on what is appropriate) for mining nodes when anticipating peak loads. VIII) Robustness In addition to implementing all of the above practices towards building robust code, the safest way to ensure robustness is through creating comprehensive, repeatable and automated test cases. Node.js provides various test frameworks such as mocha, chai, and jest that allow you to interact with smart contracts. 1. Put Remix to Use Before starting to write test code using any of the frameworks mentioned above, the use of Remix (https://remix.ethereum.org/) is highly recommended for testing the smart contract. Remix is a browser-based on-the-fly development and testing platform. It allows access to 10 accounts with 10 pseudo ether each inside an embedded JavaScript VM that makes testing contract calls fast and convenient. 2. Using test frameworks Create test cases for every use case that the contract covers. Specifically, every financial transaction should be accounted for. 3. Verify balances Sender and receiver wallets should be validated against the exact expected debit and credit amounts as well as gas consumption where appropriate. The contract balance should be validated regularly against expected amounts. Beginning and ending balances should be verified for accuracy. 4. Ensure all test cases pass before UI design/development and upstream migration. Design and thoroughly test the contract before UI development. Making changes to the smart contract and UI code after UI development could entail substantial work and is therefore not recommended. All test suites should be executed successfully before deploying to testnet or mainnet or any network that requires real currency. Test cases should be validated using assertions. 5. Plan for performance testing System peak loads should be anticipated based on the SLAs and should be simulated prior to testnet deployments. 6. Consider async nature of transactions. As mentioned in the UI section, calls to web3 from javascript should be wrapped in try-catch blocks, Within the try block, smart contract function calls should be wrapped with async-await due to the asynchronous nature of calls to web3, which serves as the bridge between Javascript and the Ethereum network. In the snippet below, the ES6 syntax allows the use of async/await instead of promises and also provides a cleaner and compact look. onClick = async () => { const accounts = await web3.eth.getAccounts(); /*assume web3 module was imported …. } Conclusion As covered at the beginning of the document, these are still early days of a revolutionary technology that is currently very much in flux. It is therefore incumbent upon all of us to evaluate architectural and development practices on a regular basis and contribute our findings to the community. This document is not meant to be viewed as a Bible for development but rather as a starting point for a conversation. Any blockchain solution's ultimate goal should be to enhance and enrich the end user's experience. There is no substitution for communication with end users so that they are proactively informed with how their experiences with blockchain solutions will deviate from that of traditional centralized solutions, which might have spanned decades. Any suggestions/corrections related to the content of this document are absolutely welcome. Image credits: 1) istockphoto.com - Person looking at Blockchain Concept on Screen, Standard license
json metadata{"tags":["cryptocurrency","ethereum","solidity","bestpractices","blockchain"],"image":["https://steemitimages.com/DQmW5rmVB4A53cLciZH6zs6Ez26EVQTz65nYCP9iSQHG1nc/blockchain.jpg"],"links":["https://remix.ethereum.org/"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcryptocurrency
permlinkbest-practices-for-building-blockchain-solutions-with-solidity-part-i
titleBest Practices for Building Blockchain Solutions with Solidity - Part I
Transaction InfoBlock #22290825/Trx 3b3845cdce30ac1eb97c2057a70b493c36fc81c1
View Raw JSON Data
{
  "block": 22290825,
  "op": [
    "comment",
    {
      "author": "rajita",
      "body": "(https://steemitimages.com/DQmW5rmVB4A53cLciZH6zs6Ez26EVQTz65nYCP9iSQHG1nc/blockchain.jpg)\n\nOverview \n\nThe purpose of this article is to consolidate findings around design and development best practices in the Solidity environment. While blockchain technologies are still evolving, it is implicitly understood that some of the best practices outlined in this article are subject to change and subject to debate. As the market continues to evolve, it is imperative that discussions around governance and standards of excellence happen on a continual basis. As such, feedback is highly welcome. Guidelines that are specifically geared towards building Dapps, in many cases, leverage and build upon software best practices that have existed in the Information Technology industry for decades. \n\nThis article intends to be a starting point, or at least one of the starting points, for a conversation around Solidity best practices on the Linkedin forum. Furthermore, this article intends to be the first in a series of articles that subsequently cover advanced topics via collaboration with other blockchain professionals. \n\nScope \n\nThe content here is geared towards Ethereum Solidity. This article will touch upon recommendations for nomenclature, account management, user interface development, error handling, security, inheritance, performance and scalability, and robustness. Upward migration and deployment using truffle are out of scope for this installment. The intended audience is blockchain enthusiasts. The Solidity snippets illustrated herein are compatible with the 0.4.23 parser and the Javascript snippets use ES6 syntax. Please note that for the sake of conciseness, the snippets are fragmented. \n\n I) Nomenclature for Solidity Contracts \n1. Smart contract names are typically nouns with the starting letter in upper case and the rest in lower. \n\n2. The above bullet applies to struct declarations as well since they describe abstract entities. \n\n3. All variable declarations should be in lower case. \n\n II) Account Management \n1. Passwords and private keys should be saved as soon as they are generated. The password will be needed when unlocking an account. \n\n2. In order to safeguard your password, accounts should be unlocked in interactive mode as opposed to typing the password at the command line where it might be captured in the console history. The danger of exposing the password on the screen is evident in b) or using --password parameter in a). Choose a) over b). \n\na) geth --unlock <account_address>   By executing this line, you will be prompted for the password (for the reasons explained above, it is not advisable to use the --password parameter in this command). \n\nb) web3.eth.personal.unlockAccount(<account_address>, < pass_word >) \n\n3. The 12-word mnemonic (seed-phrase) generated by Metamask should be stored somewhere safe. In the event private keys are lost or misplaced, the mnemonic can be used to regenerate the existing set of accounts.    \n\nIII) User Interfaces \n\nDecentralized solutions need special considerations when it comes to developing intuitive and interactive end-user applications. End users do not interact with a smart contract directly but with the front-end app that provides an interface between the user and the Dapp. For illustration purposes, it is assumed that UI is built with Javascript. \n\n1. Present Users with Confirmation dialogs informing them with the irreversibility of transactions. \nBlockchain transactions are architected for immutability in a P2P distributed environment. The end user needs to be aware that they cannot create a support ticket with a central authority that can reverse the unintended transaction like they did with traditional apps. As such, it's best practice to prompt the end user with a confirmation dialog with the salient features of the transaction especially all the financial attributes involved, giving the user the option to scrutinize the values one more time so they can choose to proceed or cancel. \n\n2. Consider the channels used for consuming the Dapp; mobile, web or both.\n\n3. Provision UI widgets that account for latency. \nWhile transaction latency largely depends on the consensus algorithm, it is best practice to provision widgets such as button spinners or Progress views that let the end user know that the transaction may not be processed instantaneously given the nature of the blockchain. This is especially true of Proof-Of-Work consensus algorithms as used by Solidity currently. \n\n4. Rendering of UI for mobile clients with slow connections.  \nServer-side rendering might alleviate some of the frustration of an end user's Dapp experience from a cell phone interface on a slow connection. In these scenarios, using a utility such as Next.js can create some initial HTML content on the screen while the javascript code is rendered by the react utility inside the browser. On the flip side, if the browser (client) has to do all the work, that might leave users with an empty screen for a while until rendering completes. \n\n5. UI widget and page visibility \nSince the blockchain relies on users to perform transactions based on assigned authority, UI design should follow suit by presenting the appropriate functionality to authorized users. In the design phase, it needs to be determined which pages/screens different users have access to, what widgets they can see and what actions they can perform. \n\n6. Ensure that the render() method accounts for any changes to the state of the contract.\nBy doing so, you can ensure that new values appear on the screen without a manual refresh. \n\n7. Wrap transaction calls in try-catch blocks.\nAll calls to the smart contract from the front-end app should be wrapped in try-catch blocks so that a user-friendly error is returned to the message on the UI component such as a form. This is covered further in the next section. \n\nIV) Error Handling \n\n1. Use try-catch blocks.\nAs covered in the earlier section on UI, try-catch blocks should be used when invoking smart contract methods from the application and error messages should be displayed on the UI. This is cleaner and easier than doing explicit input validations, etc. \n\n2. Capture error messages.\nIn the event of an error, ensure that the UI component (such a form) re-renders by capturing the value of the error object in a state variable. \n\n  class IndexPage extends Component { \n\n        state = {errorMsg: ''} \n\n         onClick = async () => { \n\n         try { \n\n            //invoke a call to the smart contract \n\n         } \n\n        catch (err) { \n\n              this.setState({errorMsg: err.message});\n\n} \n\n ….. \n\n} \n\nrender() { \n\n    /*Use a react or semantic-ui-react component like Message to return the value of state variable errorMsg to the user. When using a Form, be sure to add an error property to the Form. */\n\n} \n\n} \n\nThe above is preferable to Metamask returning a cryptic error in the console but no user-friendly message to the user in a contained widget. \n\n V) Security \nThe smart contract needs to ensure that functions that modify the state of the blockchain (transactions) can only be invoked by the authorized parties.  \n\nCreate reusable modifiers to qualify functions instead of implementing checks at the code-level inside the function (in order to keep the snippets concise, the constructor function that assigns the msg.sender attribute to the manager variable will not be written below. Please assume that it exists in the contract). Given the following options, choose a) over b). \n\na) contract Game { \n\n       address manager; \n\n               modifier restricted() { \n\n                       require(msg.sender == manager); \n\n                        _;               (the underscore servers as a placeholder for code substitution ) \n\n                       } \n\n                function pickWinner (uint i) public restricted returns (address) { \n\n              ….. \n\n              ….. \n\n         } \n\n} \n\nb) contract Game { \n\n        address manager; \n\n               function pickWinner (uint i) public returns (address) { \n\n                 require(msg.sender == manager); //(where manager is a wallet address of                                                                                            the manager of the contract) \n\n                   …... \n\n                          ….. \n\n               } \n\n      } \n\nIn a), we have defined a reusable modifier that can be applied to multiple functions, that substitutes the underscore with the function code after checking for AuthZ. In a), the function can focus on its core logic instead of checking for Auth issues. \n\nVI) Inheritance  \n\nReusability across multiple contracts should be considered in the design phase. It's very likely that there will be other smart contracts in the future that will require a manager. In that event, the previous section could be rewritten in the following way (as mentioned in the previous section, please assume that the constructor exists). \n\ncontract Manageable{ \n\n  address manager; \n\n  modifier restricted() { \n\n        require(msg.sender == manager); \n\n            _;        // (the underscore serves as a placeholder for code substitution from the function) \n\n         } \n\n } \n\n \n\nimport \"./Manageable.sol\"; //for the sake of simplicity for this article, assume it's in the same folder \n\ncontract Game is Manageable{ \n\n    function pickWinner(uint i) public restricted returns (address) { \n\n                ….. \n\n   } \n\n} \n\nThis method and notation eliminates redundant declarations of the manager variable across multiple contracts and also makes the restricted modifier reusable with a two-fold benefit. \n\n1. Functions can focus on the business/transaction related code and not have to keep up with AuthZ changes. \n\n2. Core AuthZ functionality can be managed in one spot, which might reduce the amount of regression testing.       \n\nVII) Performance/Scalability and Gas Consumption \n\n1. While blockchain algorithms are evolving in order to alleviate gas charges to the user, the deployment of smart contract code entails gas, as does any transaction that alters data/state on the blockchain. Computationally intensive functions that require high processing power and high bandwidth cost more than those that require less. The following recommendations can not only decrease said costs but also create more readable, maintainable and efficient code. \n\n2. Where possible, replace array traversals that use loops with mapping lookups. \n\n3. Arrays are suitable for collections where all that is needed for a lookup is an index. \n\n4. When using uint for variable declarations, if the maximum size is identified and set in stone during design-time, a precision in the maximum number of digits is recommended in the declaration, for instance, uint16, uint32, etc.  \n\n5. Examine code for the possibility of infinite loops by checking if terminal conditions are met in all scenarios. \n\n6. If a multi-part expression is going to be referenced multiple times, consider saving it to a variable and referencing the variable instead within if statements, etc. \n\n7. Infrastructure auto-scalability should be provisioned either horizontally or vertically (depending on what is appropriate) for mining nodes when anticipating peak loads. \n\nVIII) Robustness \n\nIn addition to implementing all of the above practices towards building robust code, the safest way to ensure robustness is through creating comprehensive, repeatable and automated test cases. \n\nNode.js provides various test frameworks such as mocha, chai, and jest that allow you to interact with smart contracts. \n\n1. Put Remix to Use\nBefore starting to write test code using any of the frameworks mentioned above, the use of Remix (https://remix.ethereum.org/) is highly recommended for testing the smart contract. Remix is a browser-based on-the-fly development and testing platform. It allows access to 10 accounts with 10 pseudo ether each inside an embedded JavaScript VM that makes testing contract calls fast and convenient. \n\n2. Using test frameworks\nCreate test cases for every use case that the contract covers. Specifically, every financial transaction should be accounted for.\n\n3. Verify balances\nSender and receiver wallets should be validated against the exact expected debit and credit amounts as well as gas consumption where appropriate. The contract balance should be validated regularly against expected amounts. Beginning and ending balances should be verified for accuracy. \n\n4. Ensure all test cases pass before UI design/development and upstream migration.\nDesign and thoroughly test the contract before UI development. Making changes to the smart contract and UI code after UI development could entail substantial work and is therefore not recommended. All test suites should be executed successfully before deploying to testnet or mainnet or any network that requires real currency. Test cases should be validated using assertions. \n\n5. Plan for performance testing\nSystem peak loads should be anticipated based on the SLAs and should be simulated prior to testnet deployments. \n\n6. Consider async nature of transactions.\nAs mentioned in the UI section, calls to web3 from javascript should be wrapped in try-catch blocks, Within the try block, smart contract function calls should be wrapped with async-await due to the asynchronous nature of calls to web3, which serves as the bridge between Javascript and the Ethereum network. In the snippet below, the ES6 syntax allows the use of async/await instead of promises and also provides a cleaner and compact look. \n\n       onClick = async () => { \n\n              const accounts = await web3.eth.getAccounts();   /*assume web3 module was imported \n\n             …. \n\n        }\n\nConclusion \n\nAs covered at the beginning of the document, these are still early days of a revolutionary technology that is currently very much in flux. It is therefore incumbent upon all of us to evaluate architectural and development practices on a regular basis and contribute our findings to the community. This document is not meant to be viewed as a Bible for development but rather as a starting point for a conversation.  \n\nAny blockchain solution's ultimate goal should be to enhance and enrich the end user's experience. There is no substitution for communication with end users so that they are proactively informed with how their experiences with blockchain solutions will deviate from that of traditional centralized solutions, which might have spanned decades. Any suggestions/corrections related to the content of this document are absolutely welcome.  \n\n Image credits:  \n\n1) istockphoto.com - Person looking at Blockchain Concept on Screen, Standard license",
      "json_metadata": "{\"tags\":[\"cryptocurrency\",\"ethereum\",\"solidity\",\"bestpractices\",\"blockchain\"],\"image\":[\"https://steemitimages.com/DQmW5rmVB4A53cLciZH6zs6Ez26EVQTz65nYCP9iSQHG1nc/blockchain.jpg\"],\"links\":[\"https://remix.ethereum.org/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "cryptocurrency",
      "permlink": "best-practices-for-building-blockchain-solutions-with-solidity-part-i",
      "title": "Best Practices for Building Blockchain Solutions with Solidity - Part I"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-09T22:24:57",
  "trx_id": "3b3845cdce30ac1eb97c2057a70b493c36fc81c1",
  "trx_in_block": 45,
  "virtual_op": 0
}
steemcreated a new account: @rajita
2018/05/09 22:11:39
active{"account_auths":[],"key_auths":[["STM5RBMRwVSoL7saWCzzctPFsGxDyfojb2hcPL2gxbDMSxTCGktL4",1]],"weight_threshold":1}
creatorsteem
delegation30690.000000 VESTS
extensions[]
fee0.100 STEEM
json metadata{}
memo keySTM6AkYBYwHR8AkBcquDH3UZxDLuPvoW1PZC7kR1SqS7i3uqJ1ZaE
new account namerajita
owner{"account_auths":[],"key_auths":[["STM5k3bVfCuiNGAKfzqkJ5VU2VE3LLLLHRAXt9fNMYxxdxk4rJb5b",1]],"weight_threshold":1}
posting{"account_auths":[],"key_auths":[["STM8CLS1GDf4YZKoX1BEwYRCWiFi9VLXwysecnDsnb9VrDP9KPD4v",1]],"weight_threshold":1}
Transaction InfoBlock #22290559/Trx 68e575b957ca2111b1a38a52135a11ed122d248f
View Raw JSON Data
{
  "block": 22290559,
  "op": [
    "account_create_with_delegation",
    {
      "active": {
        "account_auths": [],
        "key_auths": [
          [
            "STM5RBMRwVSoL7saWCzzctPFsGxDyfojb2hcPL2gxbDMSxTCGktL4",
            1
          ]
        ],
        "weight_threshold": 1
      },
      "creator": "steem",
      "delegation": "30690.000000 VESTS",
      "extensions": [],
      "fee": "0.100 STEEM",
      "json_metadata": "{}",
      "memo_key": "STM6AkYBYwHR8AkBcquDH3UZxDLuPvoW1PZC7kR1SqS7i3uqJ1ZaE",
      "new_account_name": "rajita",
      "owner": {
        "account_auths": [],
        "key_auths": [
          [
            "STM5k3bVfCuiNGAKfzqkJ5VU2VE3LLLLHRAXt9fNMYxxdxk4rJb5b",
            1
          ]
        ],
        "weight_threshold": 1
      },
      "posting": {
        "account_auths": [],
        "key_auths": [
          [
            "STM8CLS1GDf4YZKoX1BEwYRCWiFi9VLXwysecnDsnb9VrDP9KPD4v",
            1
          ]
        ],
        "weight_threshold": 1
      }
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-09T22:11:39",
  "trx_id": "68e575b957ca2111b1a38a52135a11ed122d248f",
  "trx_in_block": 42,
  "virtual_op": 0
}

Account Metadata

POSTING JSON METADATA
None
JSON METADATA
None
{
  "posting_json_metadata": {},
  "json_metadata": {}
}

Auth Keys

Owner
Single Signature
Public Keys
STM5k3bVfCuiNGAKfzqkJ5VU2VE3LLLLHRAXt9fNMYxxdxk4rJb5b1/1
Active
Single Signature
Public Keys
STM5RBMRwVSoL7saWCzzctPFsGxDyfojb2hcPL2gxbDMSxTCGktL41/1
Posting
Single Signature
Public Keys
STM8CLS1GDf4YZKoX1BEwYRCWiFi9VLXwysecnDsnb9VrDP9KPD4v1/1
Memo
STM6AkYBYwHR8AkBcquDH3UZxDLuPvoW1PZC7kR1SqS7i3uqJ1ZaE
{
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM5k3bVfCuiNGAKfzqkJ5VU2VE3LLLLHRAXt9fNMYxxdxk4rJb5b",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM5RBMRwVSoL7saWCzzctPFsGxDyfojb2hcPL2gxbDMSxTCGktL4",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting": {
    "account_auths": [],
    "key_auths": [
      [
        "STM8CLS1GDf4YZKoX1BEwYRCWiFi9VLXwysecnDsnb9VrDP9KPD4v",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "memo": "STM6AkYBYwHR8AkBcquDH3UZxDLuPvoW1PZC7kR1SqS7i3uqJ1ZaE"
}

Witness Votes

0 / 30
No active witness votes.
[]