VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.037USD
STEEM
0.000STEEM
SBD
0.000SBD
Effective Power
5.008SP
├── Own SP
0.636SP
└── Incoming DelegationsDeleg
+4.372SP
Detailed Balance
| STEEM | ||
| balance | 0.000STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 0.636SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 4.372SP | SP |
| Effective Power | 5.008SP | SP |
| Reward SP (pending) | 0.000SP | SP |
| SBD | ||
| sbd_balance | 0.000SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.000SBD | SBD |
{
"balance": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"reward_steem_balance": "0.000 STEEM",
"vesting_shares": "1033.949020 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "7109.710786 VESTS",
"sbd_balance": "0.000 SBD",
"savings_sbd_balance": "0.000 SBD",
"reward_sbd_balance": "0.000 SBD",
"conversions": []
}Account Info
| name | c1ay |
| id | 251471 |
| rank | 1,419,064 |
| reputation | 17863574 |
| created | 2017-07-09T13:23:45 |
| recovery_account | steem |
| proxy | None |
| post_count | 2 |
| comment_count | 0 |
| lifetime_vote_count | 0 |
| witnesses_voted_for | 0 |
| last_post | 2017-07-10T02:33:45 |
| last_root_post | 2017-07-10T02:22:51 |
| last_vote_time | 2021-05-09T14:53:45 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.000 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 0.000 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 1033.949020 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 7109.710786 VESTS |
| reward_vesting_balance | 0.000000 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 1970-01-01T00:00:00 |
| last_account_update | 2017-07-10T02:45:51 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 1970-01-01T00:00:00 |
| savings_sbd_last_interest_payment | 1970-01-01T00:00:00 |
{
"active": {
"account_auths": [],
"key_auths": [
[
"STM5KD8MMpLNa7YNd5sVXA9iVUEZhaFRNNBBwVX8SSANttW8p9f7x",
1
]
],
"weight_threshold": 1
},
"balance": "0.000 STEEM",
"can_vote": true,
"comment_count": 0,
"created": "2017-07-09T13:23:45",
"curation_rewards": 0,
"delegated_vesting_shares": "0.000000 VESTS",
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779056721
},
"guest_bloggers": [],
"id": 251471,
"json_metadata": "{\"profile\":{\"profile_image\":\"https://assets.rbl.ms/4314213/980x.jpg\"}}",
"last_account_recovery": "1970-01-01T00:00:00",
"last_account_update": "2017-07-10T02:45:51",
"last_owner_update": "1970-01-01T00:00:00",
"last_post": "2017-07-10T02:33:45",
"last_root_post": "2017-07-10T02:22:51",
"last_vote_time": "2021-05-09T14:53:45",
"lifetime_vote_count": 0,
"market_history": [],
"memo_key": "STM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F",
"mined": false,
"name": "c1ay",
"next_vesting_withdrawal": "1969-12-31T23:59:59",
"other_history": [],
"owner": {
"account_auths": [],
"key_auths": [
[
"STM7zHay7NW1VHfzPgzXH1d1uUEAaeqaNfPC49CYYN9ULJoYeU94Z",
1
]
],
"weight_threshold": 1
},
"pending_claimed_accounts": 0,
"post_bandwidth": 0,
"post_count": 2,
"post_history": [],
"posting": {
"account_auths": [],
"key_auths": [
[
"STM6G9ytQSMXtwoKKZd5353hB1C2RPBZATLj1v9VZg2V9v8GEL44g",
1
]
],
"weight_threshold": 1
},
"posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://assets.rbl.ms/4314213/980x.jpg\"}}",
"posting_rewards": 0,
"proxied_vsf_votes": [
0,
0,
0,
0
],
"proxy": "",
"received_vesting_shares": "7109.710786 VESTS",
"recovery_account": "steem",
"reputation": 17863574,
"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": "1033.949020 VESTS",
"vesting_withdraw_rate": "0.000000 VESTS",
"vote_history": [],
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779056721
},
"voting_power": 0,
"withdraw_routes": 0,
"withdrawn": 0,
"witness_votes": [],
"witnesses_voted_for": 0,
"rank": 1419064
}Withdraw Routes
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
2026/05/17 22:25:21
2026/05/17 22:25:21
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 7109.710786 VESTS |
| Transaction Info | Block #106141261/Trx 028b5d3f2b793afc08e2756551b93a60bd8e5bd7 |
View Raw JSON Data
{
"block": 106141261,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "7109.710786 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-17T22:25:21",
"trx_id": "028b5d3f2b793afc08e2756551b93a60bd8e5bd7",
"trx_in_block": 3,
"virtual_op": 0
}2026/05/11 20:33:21
2026/05/11 20:33:21
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 4397.500381 VESTS |
| Transaction Info | Block #105966993/Trx fdf98393819f57124b7f89c574f6eff212b2903d |
View Raw JSON Data
{
"block": 105966993,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "4397.500381 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-11T20:33:21",
"trx_id": "fdf98393819f57124b7f89c574f6eff212b2903d",
"trx_in_block": 0,
"virtual_op": 0
}2026/04/25 21:49:06
2026/04/25 21:49:06
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 7122.226542 VESTS |
| Transaction Info | Block #105508965/Trx bb8a695e3b6b591b471500b01f8670c8293f8cff |
View Raw JSON Data
{
"block": 105508965,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "7122.226542 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-04-25T21:49:06",
"trx_id": "bb8a695e3b6b591b471500b01f8670c8293f8cff",
"trx_in_block": 4,
"virtual_op": 0
}2026/01/23 02:58:39
2026/01/23 02:58:39
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 4439.047200 VESTS |
| Transaction Info | Block #102846037/Trx 29e2368e14ec8f2cae0a4792f80efd3e40325be5 |
View Raw JSON Data
{
"block": 102846037,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "4439.047200 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-01-23T02:58:39",
"trx_id": "29e2368e14ec8f2cae0a4792f80efd3e40325be5",
"trx_in_block": 5,
"virtual_op": 0
}2024/12/16 22:18:03
2024/12/16 22:18:03
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 4603.266397 VESTS |
| Transaction Info | Block #91292445/Trx 3e674a10c5d39b346970a7b8bb5a7eda5aec3399 |
View Raw JSON Data
{
"block": 91292445,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "4603.266397 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2024-12-16T22:18:03",
"trx_id": "3e674a10c5d39b346970a7b8bb5a7eda5aec3399",
"trx_in_block": 3,
"virtual_op": 0
}2023/11/13 14:03:00
2023/11/13 14:03:00
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 4772.399929 VESTS |
| Transaction Info | Block #79846705/Trx 8e14a61d88a121c4221d13ee38af524ef126bb4e |
View Raw JSON Data
{
"block": 79846705,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "4772.399929 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-11-13T14:03:00",
"trx_id": "8e14a61d88a121c4221d13ee38af524ef126bb4e",
"trx_in_block": 9,
"virtual_op": 0
}2023/09/21 19:42:15
2023/09/21 19:42:15
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 7709.678715 VESTS |
| Transaction Info | Block #78345291/Trx a292a11f79499326be4b131f97815429c2bf169c |
View Raw JSON Data
{
"block": 78345291,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "7709.678715 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-09-21T19:42:15",
"trx_id": "a292a11f79499326be4b131f97815429c2bf169c",
"trx_in_block": 0,
"virtual_op": 0
}2022/11/15 21:37:18
2022/11/15 21:37:18
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 7922.326194 VESTS |
| Transaction Info | Block #69469131/Trx 699775e52a54511470222015b7901c014fa3bade |
View Raw JSON Data
{
"block": 69469131,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "7922.326194 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-11-15T21:37:18",
"trx_id": "699775e52a54511470222015b7901c014fa3bade",
"trx_in_block": 3,
"virtual_op": 0
}2022/03/21 17:54:24
2022/03/21 17:54:24
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 8101.489745 VESTS |
| Transaction Info | Block #62620838/Trx 94a176786c3461e48c324b35bd645341580714fb |
View Raw JSON Data
{
"block": 62620838,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "8101.489745 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-03-21T17:54:24",
"trx_id": "94a176786c3461e48c324b35bd645341580714fb",
"trx_in_block": 7,
"virtual_op": 0
}2021/08/08 14:57:24
2021/08/08 14:57:24
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 8284.270595 VESTS |
| Transaction Info | Block #56189181/Trx 60437c9e32463e7e42b9b68c5b5c8d3db93d17c7 |
View Raw JSON Data
{
"block": 56189181,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "8284.270595 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2021-08-08T14:57:24",
"trx_id": "60437c9e32463e7e42b9b68c5b5c8d3db93d17c7",
"trx_in_block": 3,
"virtual_op": 0
}2021/07/13 14:44:18
2021/07/13 14:44:18
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 27508.053421 VESTS |
| Transaction Info | Block #55447955/Trx 0156849579916eebca6052d6213194590236b2e8 |
View Raw JSON Data
{
"block": 55447955,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "27508.053421 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2021-07-13T14:44:18",
"trx_id": "0156849579916eebca6052d6213194590236b2e8",
"trx_in_block": 12,
"virtual_op": 0
}2021/05/09 14:56:09
2021/05/09 14:56:09
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 27694.940254 VESTS |
| Transaction Info | Block #53595791/Trx 8b4fd5f9d1693a5f9b6cbdcba84bb0243728c60e |
View Raw JSON Data
{
"block": 53595791,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "27694.940254 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2021-05-09T14:56:09",
"trx_id": "8b4fd5f9d1693a5f9b6cbdcba84bb0243728c60e",
"trx_in_block": 0,
"virtual_op": 0
}2021/05/09 14:53:45
2021/05/09 14:53:45
| author | ydmicd |
| permlink | qss3bz |
| voter | c1ay |
| weight | 10000 (100.00%) |
| Transaction Info | Block #53595743/Trx 57d1f6e01d7b3a0f2a20c46226902f0fc9899bbc |
View Raw JSON Data
{
"block": 53595743,
"op": [
"vote",
{
"author": "ydmicd",
"permlink": "qss3bz",
"voter": "c1ay",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2021-05-09T14:53:45",
"trx_id": "57d1f6e01d7b3a0f2a20c46226902f0fc9899bbc",
"trx_in_block": 4,
"virtual_op": 0
}c1ayupvoted (100.00%) @salamdeen / qsinzo2021/05/09 14:53:36
c1ayupvoted (100.00%) @salamdeen / qsinzo
2021/05/09 14:53:36
| author | salamdeen |
| permlink | qsinzo |
| voter | c1ay |
| weight | 10000 (100.00%) |
| Transaction Info | Block #53595740/Trx e9e0240f279a7380a3c813495c1b9bab14422c5b |
View Raw JSON Data
{
"block": 53595740,
"op": [
"vote",
{
"author": "salamdeen",
"permlink": "qsinzo",
"voter": "c1ay",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2021-05-09T14:53:36",
"trx_id": "e9e0240f279a7380a3c813495c1b9bab14422c5b",
"trx_in_block": 1,
"virtual_op": 0
}2020/12/11 09:30:36
2020/12/11 09:30:36
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 8523.084016 VESTS |
| Transaction Info | Block #49353276/Trx 3a21cb10af67e37a1d86b30bd461704e03f62587 |
View Raw JSON Data
{
"block": 49353276,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "8523.084016 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-11T09:30:36",
"trx_id": "3a21cb10af67e37a1d86b30bd461704e03f62587",
"trx_in_block": 3,
"virtual_op": 0
}2020/12/06 03:08:03
2020/12/06 03:08:03
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #49204846/Trx 5df8e4289b4d3f55a1dbfb38eb652e36dce39793 |
View Raw JSON Data
{
"block": 49204846,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "1912.543513 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-06T03:08:03",
"trx_id": "5df8e4289b4d3f55a1dbfb38eb652e36dce39793",
"trx_in_block": 0,
"virtual_op": 0
}2020/12/05 11:05:00
2020/12/05 11:05:00
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 8529.450655 VESTS |
| Transaction Info | Block #49185950/Trx 68ce65cf3a61ac0834363d250042fa3216392400 |
View Raw JSON Data
{
"block": 49185950,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "8529.450655 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-05T11:05:00",
"trx_id": "68ce65cf3a61ac0834363d250042fa3216392400",
"trx_in_block": 3,
"virtual_op": 0
}2020/11/02 12:05:33
2020/11/02 12:05:33
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 1920.017158 VESTS |
| Transaction Info | Block #48253629/Trx 8b88c400105efdc39bb3f053257fbafac9a1078b |
View Raw JSON Data
{
"block": 48253629,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "1920.017158 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-11-02T12:05:33",
"trx_id": "8b88c400105efdc39bb3f053257fbafac9a1078b",
"trx_in_block": 8,
"virtual_op": 0
}2020/05/09 04:03:24
2020/05/09 04:03:24
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 8732.097229 VESTS |
| Transaction Info | Block #43215065/Trx 0bf031af56edbddd0a39032a35b592dc88d92419 |
View Raw JSON Data
{
"block": 43215065,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "8732.097229 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-09T04:03:24",
"trx_id": "0bf031af56edbddd0a39032a35b592dc88d92419",
"trx_in_block": 15,
"virtual_op": 0
}2020/05/08 07:24:39
2020/05/08 07:24:39
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #43190870/Trx 51015fe914f0d72aaf61d58b655ae971d1dc99ef |
View Raw JSON Data
{
"block": 43190870,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "1953.311140 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-08T07:24:39",
"trx_id": "51015fe914f0d72aaf61d58b655ae971d1dc99ef",
"trx_in_block": 9,
"virtual_op": 0
}2020/04/15 20:33:06
2020/04/15 20:33:06
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 8745.074648 VESTS |
| Transaction Info | Block #42561324/Trx 65ddab5068636942ee1ef0d3405d1e0e238f49df |
View Raw JSON Data
{
"block": 42561324,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "8745.074648 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-04-15T20:33:06",
"trx_id": "65ddab5068636942ee1ef0d3405d1e0e238f49df",
"trx_in_block": 5,
"virtual_op": 0
}2019/07/09 14:04:12
2019/07/09 14:04:12
| author | steemitboard |
| body | Congratulations @c1ay! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@c1ay/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@c1ay) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=c1ay)_</sub> ###### [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 | c1ay |
| parent permlink | python-ethereum |
| permlink | steemitboard-notify-c1ay-20190709t140412000z |
| title | |
| Transaction Info | Block #34512868/Trx 735f3887597470fb403e5ec161b537cc3ece3fb9 |
View Raw JSON Data
{
"block": 34512868,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @c1ay! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@c1ay/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@c1ay) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=c1ay)_</sub>\n\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": "c1ay",
"parent_permlink": "python-ethereum",
"permlink": "steemitboard-notify-c1ay-20190709t140412000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2019-07-09T14:04:12",
"trx_id": "735f3887597470fb403e5ec161b537cc3ece3fb9",
"trx_in_block": 29,
"virtual_op": 0
}2019/05/12 13:47:48
2019/05/12 13:47:48
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 8940.697453 VESTS |
| Transaction Info | Block #32844159/Trx 711bf90333055d3c34dd536edfd474f47c7fbdeb |
View Raw JSON Data
{
"block": 32844159,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "8940.697453 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2019-05-12T13:47:48",
"trx_id": "711bf90333055d3c34dd536edfd474f47c7fbdeb",
"trx_in_block": 3,
"virtual_op": 0
}2018/05/16 20:09:45
2018/05/16 20:09:45
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 9140.249888 VESTS |
| Transaction Info | Block #22489696/Trx 6fa9c35c310b716c5f552b60d5a48917250ca9af |
View Raw JSON Data
{
"block": 22489696,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "9140.249888 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-05-16T20:09:45",
"trx_id": "6fa9c35c310b716c5f552b60d5a48917250ca9af",
"trx_in_block": 18,
"virtual_op": 0
}changtimwuupvoted (100.00%) @c1ay / python-ethereum2018/01/18 21:40:27
changtimwuupvoted (100.00%) @c1ay / python-ethereum
2018/01/18 21:40:27
| author | c1ay |
| permlink | python-ethereum |
| voter | changtimwu |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19096612/Trx 86f98648793236f0852dc6f4da972d90b83ff4db |
View Raw JSON Data
{
"block": 19096612,
"op": [
"vote",
{
"author": "c1ay",
"permlink": "python-ethereum",
"voter": "changtimwu",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-01-18T21:40:27",
"trx_id": "86f98648793236f0852dc6f4da972d90b83ff4db",
"trx_in_block": 17,
"virtual_op": 0
}2018/01/09 06:35:54
2018/01/09 06:35:54
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 29691.240272 VESTS |
| Transaction Info | Block #18819518/Trx 6aceb8bdf3e9a3fd96fab5c422930408ccf44ae7 |
View Raw JSON Data
{
"block": 18819518,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "29691.240272 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-01-09T06:35:54",
"trx_id": "6aceb8bdf3e9a3fd96fab5c422930408ccf44ae7",
"trx_in_block": 9,
"virtual_op": 0
}2017/08/04 05:15:42
2017/08/04 05:15:42
| delegatee | c1ay |
| delegator | steem |
| vesting shares | 29942.050980 VESTS |
| Transaction Info | Block #14271394/Trx 843f90f36f90e8de603a8ddcb3673d8620f1a556 |
View Raw JSON Data
{
"block": 14271394,
"op": [
"delegate_vesting_shares",
{
"delegatee": "c1ay",
"delegator": "steem",
"vesting_shares": "29942.050980 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2017-08-04T05:15:42",
"trx_id": "843f90f36f90e8de603a8ddcb3673d8620f1a556",
"trx_in_block": 7,
"virtual_op": 0
}2017/07/10 10:23:48
2017/07/10 10:23:48
| author | oflyhigh |
| permlink | yy |
| voter | c1ay |
| weight | 10000 (100.00%) |
| Transaction Info | Block #13558117/Trx ea1e5f6f93695b4f78962b35655619faaca580bb |
View Raw JSON Data
{
"block": 13558117,
"op": [
"vote",
{
"author": "oflyhigh",
"permlink": "yy",
"voter": "c1ay",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-07-10T10:23:48",
"trx_id": "ea1e5f6f93695b4f78962b35655619faaca580bb",
"trx_in_block": 7,
"virtual_op": 0
}c1ayupvoted (100.00%) @jubi / re-oflyhigh-yy-20170709t130423314z2017/07/10 10:23:33
c1ayupvoted (100.00%) @jubi / re-oflyhigh-yy-20170709t130423314z
2017/07/10 10:23:33
| author | jubi |
| permlink | re-oflyhigh-yy-20170709t130423314z |
| voter | c1ay |
| weight | 10000 (100.00%) |
| Transaction Info | Block #13558112/Trx 877a6437112d727b03b08aa50f20e243fa44a54c |
View Raw JSON Data
{
"block": 13558112,
"op": [
"vote",
{
"author": "jubi",
"permlink": "re-oflyhigh-yy-20170709t130423314z",
"voter": "c1ay",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-07-10T10:23:33",
"trx_id": "877a6437112d727b03b08aa50f20e243fa44a54c",
"trx_in_block": 11,
"virtual_op": 0
}2017/07/10 04:46:54
2017/07/10 04:46:54
| author | steemitboard |
| body | Congratulations @c1ay! You have completed some achievement on Steemit and have been rewarded with new badge(s) : [](http://steemitboard.com/@c1ay) You made your First Comment Click on any badge to view your own Board of Honor on SteemitBoard. For more information about SteemitBoard, click [here](https://steemit.com/@steemitboard) If you no longer want to receive notifications, reply to this comment with the word `STOP` > By upvoting this notification, you can help all Steemit users. Learn how [here](https://steemit.com/steemitboard/@steemitboard/http-i-cubeupload-com-7ciqeo-png)! |
| json metadata | {"image":["https://steemitboard.com/img/notifications.png"]} |
| parent author | c1ay |
| parent permlink | python-ethereum |
| permlink | steemitboard-notify-c1ay-20170710t044654000z |
| title | |
| Transaction Info | Block #13551463/Trx af6e1f4f7de3da5b594173f0925f5b77d4fac44b |
View Raw JSON Data
{
"block": 13551463,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @c1ay! You have completed some achievement on Steemit and have been rewarded with new badge(s) :\n\n[](http://steemitboard.com/@c1ay) You made your First Comment\n\nClick on any badge to view your own Board of Honor on SteemitBoard.\nFor more information about SteemitBoard, click [here](https://steemit.com/@steemitboard)\n\nIf you no longer want to receive notifications, reply to this comment with the word `STOP`\n\n> By upvoting this notification, you can help all Steemit users. Learn how [here](https://steemit.com/steemitboard/@steemitboard/http-i-cubeupload-com-7ciqeo-png)!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notifications.png\"]}",
"parent_author": "c1ay",
"parent_permlink": "python-ethereum",
"permlink": "steemitboard-notify-c1ay-20170710t044654000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2017-07-10T04:46:54",
"trx_id": "af6e1f4f7de3da5b594173f0925f5b77d4fac44b",
"trx_in_block": 3,
"virtual_op": 0
}c1ayupdated their account properties2017/07/10 02:45:51
c1ayupdated their account properties
2017/07/10 02:45:51
| account | c1ay |
| json metadata | {"profile":{"profile_image":"https://assets.rbl.ms/4314213/980x.jpg"}} |
| memo key | STM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F |
| Transaction Info | Block #13549043/Trx 0396f8e640e897493bb6763e550006c09fe180e0 |
View Raw JSON Data
{
"block": 13549043,
"op": [
"account_update",
{
"account": "c1ay",
"json_metadata": "{\"profile\":{\"profile_image\":\"https://assets.rbl.ms/4314213/980x.jpg\"}}",
"memo_key": "STM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F"
}
],
"op_in_trx": 0,
"timestamp": "2017-07-10T02:45:51",
"trx_id": "0396f8e640e897493bb6763e550006c09fe180e0",
"trx_in_block": 3,
"virtual_op": 0
}c1aypublished a new post: python-ethereum2017/07/10 02:35:21
c1aypublished a new post: python-ethereum
2017/07/10 02:35:21
| author | c1ay |
| body | python 版本以太坊 项目地址 https://github.com/ethereum/pyethapp https://github.com/ethereum/pyethereum https://github.com/ethereum/pydevp2p 其中 pyethapp 依赖pyethereum 和 pydevp2p。pyethereum主要包括对block的处理,对transaction的处理以及以太坊虚拟机部分;pydevp2p 是p2p网络库,主要包括节点发现协议(Node Discovery)的实现,p2p通信协议的实现,并定义了protocol基类和service基类 pydevp2p 模块 代码整体结构  1.协议基类BaseProtocol [查看代码](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L18) 子类协议继承BaseProtocol中的command类 来实现对不同command进行处理。 [receive_packet方法](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L161) ```python def _setup(self): # collect commands klasses = [k for k in self.__class__.__dict__.values() if isinstance(k, type) and issubclass(k, self.command) and k != self.command] assert len(set(k.cmd_id for k in klasses)) == len(klasses) def create_methods(klass): instance = klass() def receive(packet): "decode rlp, create dict, call receive" assert isinstance(packet, Packet) instance.receive(proto=self, data=klass.decode_payload(packet.payload)) def create(*args, **kargs): "get data, rlp encode, return packet" res = instance.create(self, *args, **kargs) payload = klass.encode_payload(res) return Packet(self.protocol_id, klass.cmd_id, payload=payload) def send(*args, **kargs): "create and send packet" packet = create(*args, **kargs) self.send_packet(packet) return receive, create, send, instance.receive_callbacks for klass in klasses: receive, create, send, receive_callbacks = create_methods(klass) setattr(self, '_receive_' + klass.__name__, receive) setattr(self, 'receive_' + klass.__name__ + '_callbacks', receive_callbacks) setattr(self, 'create_' + klass.__name__, create) setattr(self, 'send_' + klass.__name__, send) self.cmd_by_id = dict((klass.cmd_id, klass.__name__) for klass in klasses) ``` 2.启动peermanager Service [基类BaseService](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/service.py#L6),一个service对应一个WireProtocol 先看下客户端启动时用到哪些服务: [ethapp启动的服务 ](https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L41) 其中NodeDiscovery(节点发现服务), PeerManager(节点管理服务)在pydevp2p 模块中实现。 [注册服务并启动](https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L219) ```python for service in services + contrib_services: assert issubclass(service, BaseService) if service.name not in app.config['deactivated_services'] + [AccountsService.name]: assert service.name not in app.services service.register_with_app(app) assert hasattr(app.services, service.name) # start app log.info('starting') app.start() ``` app.start() 中调用了所有service的start方法 先看peermanager的[start方法](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/peermanager.py#L156) ```python def start(self): log.info('starting peermanager') # try upnp nat self.nat_upnp = add_portmap( self.config['p2p']['listen_port'], 'TCP', 'Ethereum DEVP2P Peermanager' ) # start a listening server log.info('starting listener', addr=self.listen_addr) self.server.set_handle(self._on_new_connection) self.server.start() super(PeerManager, self).start() gevent.spawn_later(0.001, self._bootstrap, self.config['p2p']['bootstrap_nodes']) gevent.spawn_later(1, self._discovery_loop) ``` gevent.spawn_later(0.001, self._bootstrap, self.config[‘p2p’][‘bootstrap_nodes’]) 将_bootstrap方法加入协程调度队列,_bootstrap方法将初始化节点(bootstrap_nodes)生成peer对象并开始监听,如果没有bootstrap_nodes,则节点无法加入网络。 gevent.spawn_later(1, self._discovery_loop) 启动节点发现服务 self.server.start()启动gevent的StreamServer并用_on_new_connection函数处理新链接 ```python def _on_new_connection(self, connection, address): log.debug('incoming connection', connection=connection) peer = self._start_peer(connection, address) # Explicit join is required in gevent >= 1.1. # See: https://github.com/gevent/gevent/issues/594 # and http://www.gevent.org/whatsnew_1_1.html#compatibility peer.join() def _start_peer(self, connection, address, remote_pubkey=None): # create peer peer = Peer(self, connection, remote_pubkey=remote_pubkey) peer.link(on_peer_exit) log.debug('created new peer', peer=peer, fno=connection.fileno()) self.peers.append(peer) # loop peer.start() log.debug('peer started', peer=peer, fno=connection.fileno()) assert not connection.closed return peer ``` |
| json metadata | {"tags":["cn","python","ethereum","steemit"],"image":["https://steemitimages.com/DQmcZ59aR3qAYLEa8rjLSmM5Ay1n5pojzpkNSCugihW9Aaj/image.png"],"links":["https://github.com/ethereum/pyethapp","https://github.com/ethereum/pyethereum","https://github.com/ethereum/pydevp2p","https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L18","https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L161","https://github.com/ethereum/pydevp2p/blob/develop/devp2p/service.py#L6","https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L41","https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L219","https://github.com/ethereum/pydevp2p/blob/develop/devp2p/peermanager.py#L156"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | cn |
| permlink | python-ethereum |
| title | python ethereum 代码分析(一) |
| Transaction Info | Block #13548833/Trx 431cab687e31b4abb756290af4ead22f6c9b9723 |
View Raw JSON Data
{
"block": 13548833,
"op": [
"comment",
{
"author": "c1ay",
"body": "python 版本以太坊\n\n项目地址 \nhttps://github.com/ethereum/pyethapp \nhttps://github.com/ethereum/pyethereum \nhttps://github.com/ethereum/pydevp2p \n其中 pyethapp 依赖pyethereum 和 pydevp2p。pyethereum主要包括对block的处理,对transaction的处理以及以太坊虚拟机部分;pydevp2p 是p2p网络库,主要包括节点发现协议(Node Discovery)的实现,p2p通信协议的实现,并定义了protocol基类和service基类\n\npydevp2p 模块\n\n代码整体结构\n\n\n1.协议基类BaseProtocol [查看代码](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L18)\n\n子类协议继承BaseProtocol中的command类 \n来实现对不同command进行处理。 \n\n[receive_packet方法](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L161)\n\n```python\n def _setup(self):\n\n # collect commands\n klasses = [k for k in self.__class__.__dict__.values()\n if isinstance(k, type) and issubclass(k, self.command) and k != self.command]\n assert len(set(k.cmd_id for k in klasses)) == len(klasses)\n\n def create_methods(klass):\n instance = klass()\n\n def receive(packet):\n \"decode rlp, create dict, call receive\"\n assert isinstance(packet, Packet)\n instance.receive(proto=self, data=klass.decode_payload(packet.payload))\n\n def create(*args, **kargs):\n \"get data, rlp encode, return packet\"\n res = instance.create(self, *args, **kargs)\n payload = klass.encode_payload(res)\n return Packet(self.protocol_id, klass.cmd_id, payload=payload)\n\n def send(*args, **kargs):\n \"create and send packet\"\n packet = create(*args, **kargs)\n self.send_packet(packet)\n\n return receive, create, send, instance.receive_callbacks\n\n for klass in klasses:\n receive, create, send, receive_callbacks = create_methods(klass)\n setattr(self, '_receive_' + klass.__name__, receive)\n setattr(self, 'receive_' + klass.__name__ + '_callbacks', receive_callbacks)\n setattr(self, 'create_' + klass.__name__, create)\n setattr(self, 'send_' + klass.__name__, send)\n\n self.cmd_by_id = dict((klass.cmd_id, klass.__name__) for klass in klasses)\n```\n\n2.启动peermanager Service\n\n[基类BaseService](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/service.py#L6),一个service对应一个WireProtocol \n\n先看下客户端启动时用到哪些服务:\n[ethapp启动的服务 ](https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L41)\n\n其中NodeDiscovery(节点发现服务), PeerManager(节点管理服务)在pydevp2p 模块中实现。 \n[注册服务并启动](https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L219)\n\n```python\n for service in services + contrib_services:\n assert issubclass(service, BaseService)\n if service.name not in app.config['deactivated_services'] + [AccountsService.name]:\n assert service.name not in app.services\n service.register_with_app(app)\n assert hasattr(app.services, service.name)\n\n # start app\n log.info('starting')\n app.start()\n```\napp.start() 中调用了所有service的start方法 \n先看peermanager的[start方法](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/peermanager.py#L156)\n\n```python\n def start(self):\n log.info('starting peermanager')\n # try upnp nat\n self.nat_upnp = add_portmap(\n self.config['p2p']['listen_port'],\n 'TCP',\n 'Ethereum DEVP2P Peermanager'\n )\n # start a listening server\n log.info('starting listener', addr=self.listen_addr)\n self.server.set_handle(self._on_new_connection)\n self.server.start()\n super(PeerManager, self).start()\n gevent.spawn_later(0.001, self._bootstrap, self.config['p2p']['bootstrap_nodes'])\n gevent.spawn_later(1, self._discovery_loop)\n```\ngevent.spawn_later(0.001, self._bootstrap, self.config[‘p2p’][‘bootstrap_nodes’]) 将_bootstrap方法加入协程调度队列,_bootstrap方法将初始化节点(bootstrap_nodes)生成peer对象并开始监听,如果没有bootstrap_nodes,则节点无法加入网络。 \ngevent.spawn_later(1, self._discovery_loop) 启动节点发现服务\n\nself.server.start()启动gevent的StreamServer并用_on_new_connection函数处理新链接\n\n```python\n def _on_new_connection(self, connection, address):\n log.debug('incoming connection', connection=connection)\n peer = self._start_peer(connection, address)\n # Explicit join is required in gevent >= 1.1.\n # See: https://github.com/gevent/gevent/issues/594\n # and http://www.gevent.org/whatsnew_1_1.html#compatibility\n peer.join()\n\n def _start_peer(self, connection, address, remote_pubkey=None):\n # create peer\n peer = Peer(self, connection, remote_pubkey=remote_pubkey)\n peer.link(on_peer_exit)\n log.debug('created new peer', peer=peer, fno=connection.fileno())\n self.peers.append(peer)\n # loop\n peer.start()\n log.debug('peer started', peer=peer, fno=connection.fileno())\n assert not connection.closed\n return peer\n```",
"json_metadata": "{\"tags\":[\"cn\",\"python\",\"ethereum\",\"steemit\"],\"image\":[\"https://steemitimages.com/DQmcZ59aR3qAYLEa8rjLSmM5Ay1n5pojzpkNSCugihW9Aaj/image.png\"],\"links\":[\"https://github.com/ethereum/pyethapp\",\"https://github.com/ethereum/pyethereum\",\"https://github.com/ethereum/pydevp2p\",\"https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L18\",\"https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L161\",\"https://github.com/ethereum/pydevp2p/blob/develop/devp2p/service.py#L6\",\"https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L41\",\"https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L219\",\"https://github.com/ethereum/pydevp2p/blob/develop/devp2p/peermanager.py#L156\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "cn",
"permlink": "python-ethereum",
"title": "python ethereum 代码分析(一)"
}
],
"op_in_trx": 0,
"timestamp": "2017-07-10T02:35:21",
"trx_id": "431cab687e31b4abb756290af4ead22f6c9b9723",
"trx_in_block": 13,
"virtual_op": 0
}2017/07/10 02:34:09
2017/07/10 02:34:09
| id | follow |
| json | ["follow",{"follower":"c1ay","following":"bziing","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["c1ay"] |
| Transaction Info | Block #13548809/Trx 1fdb6e4253ff873e5ca76a9c0e996d0ffc5dbf76 |
View Raw JSON Data
{
"block": 13548809,
"op": [
"custom_json",
{
"id": "follow",
"json": "[\"follow\",{\"follower\":\"c1ay\",\"following\":\"bziing\",\"what\":[\"blog\"]}]",
"required_auths": [],
"required_posting_auths": [
"c1ay"
]
}
],
"op_in_trx": 0,
"timestamp": "2017-07-10T02:34:09",
"trx_id": "1fdb6e4253ff873e5ca76a9c0e996d0ffc5dbf76",
"trx_in_block": 5,
"virtual_op": 0
}c1ayupvoted (100.00%) @bziing / steemit-logo2017/07/10 02:33:45
c1ayupvoted (100.00%) @bziing / steemit-logo
2017/07/10 02:33:45
| author | bziing |
| permlink | steemit-logo |
| voter | c1ay |
| weight | 10000 (100.00%) |
| Transaction Info | Block #13548801/Trx 29c12d5c988f8fc8360c71940885cdb8010b43fc |
View Raw JSON Data
{
"block": 13548801,
"op": [
"vote",
{
"author": "bziing",
"permlink": "steemit-logo",
"voter": "c1ay",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-07-10T02:33:45",
"trx_id": "29c12d5c988f8fc8360c71940885cdb8010b43fc",
"trx_in_block": 15,
"virtual_op": 0
}c1ayreplied to @bziing / re-bziing-steemit-logo-20170710t023340044z2017/07/10 02:33:45
c1ayreplied to @bziing / re-bziing-steemit-logo-20170710t023340044z
2017/07/10 02:33:45
| author | c1ay |
| body | I will vote u |
| json metadata | {"tags":["steemit"],"app":"steemit/0.1"} |
| parent author | bziing |
| parent permlink | steemit-logo |
| permlink | re-bziing-steemit-logo-20170710t023340044z |
| title | |
| Transaction Info | Block #13548801/Trx c74d377873d207d551556da5d46c6ac30a4f1b6e |
View Raw JSON Data
{
"block": 13548801,
"op": [
"comment",
{
"author": "c1ay",
"body": "I will vote u",
"json_metadata": "{\"tags\":[\"steemit\"],\"app\":\"steemit/0.1\"}",
"parent_author": "bziing",
"parent_permlink": "steemit-logo",
"permlink": "re-bziing-steemit-logo-20170710t023340044z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2017-07-10T02:33:45",
"trx_id": "c74d377873d207d551556da5d46c6ac30a4f1b6e",
"trx_in_block": 0,
"virtual_op": 0
}c1ayupvoted (100.00%) @c1ay / python-ethereum2017/07/10 02:23:06
c1ayupvoted (100.00%) @c1ay / python-ethereum
2017/07/10 02:23:06
| author | c1ay |
| permlink | python-ethereum |
| voter | c1ay |
| weight | 10000 (100.00%) |
| Transaction Info | Block #13548588/Trx 404a6d3656e5250f59cc0c3b71ac3ec17316ac6d |
View Raw JSON Data
{
"block": 13548588,
"op": [
"vote",
{
"author": "c1ay",
"permlink": "python-ethereum",
"voter": "c1ay",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-07-10T02:23:06",
"trx_id": "404a6d3656e5250f59cc0c3b71ac3ec17316ac6d",
"trx_in_block": 3,
"virtual_op": 0
}c1aypublished a new post: python-ethereum2017/07/10 02:22:51
c1aypublished a new post: python-ethereum
2017/07/10 02:22:51
| author | c1ay |
| body | python 版本以太坊 项目地址 https://github.com/ethereum/pyethapp https://github.com/ethereum/pyethereum https://github.com/ethereum/pydevp2p 其中 pyethapp 依赖pyethereum 和 pydevp2p。pyethereum主要包括对block的处理,对transaction的处理以及以太坊虚拟机部分;pydevp2p 是p2p网络库,主要包括节点发现协议(Node Discovery)的实现,p2p通信协议的实现,并定义了protocol基类和service基类 pydevp2p 模块 代码整体结构  1.协议基类BaseProtocol [查看代码](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L18) 子类协议继承BaseProtocol中的command类 来实现对不同command进行处理。 [receive_packet方法](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L161) ```python def _setup(self): # collect commands klasses = [k for k in self.__class__.__dict__.values() if isinstance(k, type) and issubclass(k, self.command) and k != self.command] assert len(set(k.cmd_id for k in klasses)) == len(klasses) def create_methods(klass): instance = klass() def receive(packet): "decode rlp, create dict, call receive" assert isinstance(packet, Packet) instance.receive(proto=self, data=klass.decode_payload(packet.payload)) def create(*args, **kargs): "get data, rlp encode, return packet" res = instance.create(self, *args, **kargs) payload = klass.encode_payload(res) return Packet(self.protocol_id, klass.cmd_id, payload=payload) def send(*args, **kargs): "create and send packet" packet = create(*args, **kargs) self.send_packet(packet) return receive, create, send, instance.receive_callbacks for klass in klasses: receive, create, send, receive_callbacks = create_methods(klass) setattr(self, '_receive_' + klass.__name__, receive) setattr(self, 'receive_' + klass.__name__ + '_callbacks', receive_callbacks) setattr(self, 'create_' + klass.__name__, create) setattr(self, 'send_' + klass.__name__, send) self.cmd_by_id = dict((klass.cmd_id, klass.__name__) for klass in klasses) ``` 2.启动peermanager Service [基类BaseService](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/service.py#L6),一个service对应一个WireProtocol 先看下客户端启动时用到哪些服务: [ethapp启动的服务 ](https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L41) 其中NodeDiscovery(节点发现服务), PeerManager(节点管理服务)在pydevp2p 模块中实现。 [注册服务并启动](https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L219) ```python for service in services + contrib_services: assert issubclass(service, BaseService) if service.name not in app.config['deactivated_services'] + [AccountsService.name]: assert service.name not in app.services service.register_with_app(app) assert hasattr(app.services, service.name) # start app log.info('starting') app.start() ``` app.start() 中调用了所有service的start方法 先看peermanager的[start方法](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/peermanager.py#L156) ```python def start(self): log.info('starting peermanager') # try upnp nat self.nat_upnp = add_portmap( self.config['p2p']['listen_port'], 'TCP', 'Ethereum DEVP2P Peermanager' ) # start a listening server log.info('starting listener', addr=self.listen_addr) self.server.set_handle(self._on_new_connection) self.server.start() super(PeerManager, self).start() gevent.spawn_later(0.001, self._bootstrap, self.config['p2p']['bootstrap_nodes']) gevent.spawn_later(1, self._discovery_loop) ``` gevent.spawn_later(0.001, self._bootstrap, self.config[‘p2p’][‘bootstrap_nodes’]) 将_bootstrap方法加入协程调度队列,_bootstrap方法将初始化节点(bootstrap_nodes)生成peer对象并开始监听,如果没有bootstrap_nodes,则节点无法加入网络。 gevent.spawn_later(1, self._discovery_loop) 启动节点发现服务 self.server.start()启动gevent的StreamServer并用_on_new_connection函数处理新链接 ```python def _on_new_connection(self, connection, address): log.debug('incoming connection', connection=connection) peer = self._start_peer(connection, address) # Explicit join is required in gevent >= 1.1. # See: https://github.com/gevent/gevent/issues/594 # and http://www.gevent.org/whatsnew_1_1.html#compatibility peer.join() def _start_peer(self, connection, address, remote_pubkey=None): # create peer peer = Peer(self, connection, remote_pubkey=remote_pubkey) peer.link(on_peer_exit) log.debug('created new peer', peer=peer, fno=connection.fileno()) self.peers.append(peer) # loop peer.start() log.debug('peer started', peer=peer, fno=connection.fileno()) assert not connection.closed return peer ``` |
| json metadata | {"tags":["cn","python","ethereum"],"image":["https://steemitimages.com/DQmcZ59aR3qAYLEa8rjLSmM5Ay1n5pojzpkNSCugihW9Aaj/image.png"],"links":["https://github.com/ethereum/pyethapp","https://github.com/ethereum/pyethereum","https://github.com/ethereum/pydevp2p","https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L18","https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L161","https://github.com/ethereum/pydevp2p/blob/develop/devp2p/service.py#L6","https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L41","https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L219","https://github.com/ethereum/pydevp2p/blob/develop/devp2p/peermanager.py#L156"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | cn |
| permlink | python-ethereum |
| title | python ethereum 代码分析(一) |
| Transaction Info | Block #13548583/Trx 0b013eb97912067b32bf744ffef2c60a7bb9c763 |
View Raw JSON Data
{
"block": 13548583,
"op": [
"comment",
{
"author": "c1ay",
"body": "python 版本以太坊\n\n项目地址 \nhttps://github.com/ethereum/pyethapp \nhttps://github.com/ethereum/pyethereum \nhttps://github.com/ethereum/pydevp2p \n其中 pyethapp 依赖pyethereum 和 pydevp2p。pyethereum主要包括对block的处理,对transaction的处理以及以太坊虚拟机部分;pydevp2p 是p2p网络库,主要包括节点发现协议(Node Discovery)的实现,p2p通信协议的实现,并定义了protocol基类和service基类\n\npydevp2p 模块\n\n代码整体结构\n\n\n1.协议基类BaseProtocol [查看代码](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L18)\n\n子类协议继承BaseProtocol中的command类 \n来实现对不同command进行处理。 \n\n[receive_packet方法](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L161)\n\n```python\n def _setup(self):\n\n # collect commands\n klasses = [k for k in self.__class__.__dict__.values()\n if isinstance(k, type) and issubclass(k, self.command) and k != self.command]\n assert len(set(k.cmd_id for k in klasses)) == len(klasses)\n\n def create_methods(klass):\n instance = klass()\n\n def receive(packet):\n \"decode rlp, create dict, call receive\"\n assert isinstance(packet, Packet)\n instance.receive(proto=self, data=klass.decode_payload(packet.payload))\n\n def create(*args, **kargs):\n \"get data, rlp encode, return packet\"\n res = instance.create(self, *args, **kargs)\n payload = klass.encode_payload(res)\n return Packet(self.protocol_id, klass.cmd_id, payload=payload)\n\n def send(*args, **kargs):\n \"create and send packet\"\n packet = create(*args, **kargs)\n self.send_packet(packet)\n\n return receive, create, send, instance.receive_callbacks\n\n for klass in klasses:\n receive, create, send, receive_callbacks = create_methods(klass)\n setattr(self, '_receive_' + klass.__name__, receive)\n setattr(self, 'receive_' + klass.__name__ + '_callbacks', receive_callbacks)\n setattr(self, 'create_' + klass.__name__, create)\n setattr(self, 'send_' + klass.__name__, send)\n\n self.cmd_by_id = dict((klass.cmd_id, klass.__name__) for klass in klasses)\n```\n\n2.启动peermanager Service\n\n[基类BaseService](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/service.py#L6),一个service对应一个WireProtocol \n\n先看下客户端启动时用到哪些服务:\n[ethapp启动的服务 ](https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L41)\n\n其中NodeDiscovery(节点发现服务), PeerManager(节点管理服务)在pydevp2p 模块中实现。 \n[注册服务并启动](https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L219)\n\n```python\n for service in services + contrib_services:\n assert issubclass(service, BaseService)\n if service.name not in app.config['deactivated_services'] + [AccountsService.name]:\n assert service.name not in app.services\n service.register_with_app(app)\n assert hasattr(app.services, service.name)\n\n # start app\n log.info('starting')\n app.start()\n```\napp.start() 中调用了所有service的start方法 \n先看peermanager的[start方法](https://github.com/ethereum/pydevp2p/blob/develop/devp2p/peermanager.py#L156)\n\n```python\n def start(self):\n log.info('starting peermanager')\n # try upnp nat\n self.nat_upnp = add_portmap(\n self.config['p2p']['listen_port'],\n 'TCP',\n 'Ethereum DEVP2P Peermanager'\n )\n # start a listening server\n log.info('starting listener', addr=self.listen_addr)\n self.server.set_handle(self._on_new_connection)\n self.server.start()\n super(PeerManager, self).start()\n gevent.spawn_later(0.001, self._bootstrap, self.config['p2p']['bootstrap_nodes'])\n gevent.spawn_later(1, self._discovery_loop)\n```\ngevent.spawn_later(0.001, self._bootstrap, self.config[‘p2p’][‘bootstrap_nodes’]) 将_bootstrap方法加入协程调度队列,_bootstrap方法将初始化节点(bootstrap_nodes)生成peer对象并开始监听,如果没有bootstrap_nodes,则节点无法加入网络。 \ngevent.spawn_later(1, self._discovery_loop) 启动节点发现服务\n\nself.server.start()启动gevent的StreamServer并用_on_new_connection函数处理新链接\n\n```python\n def _on_new_connection(self, connection, address):\n log.debug('incoming connection', connection=connection)\n peer = self._start_peer(connection, address)\n # Explicit join is required in gevent >= 1.1.\n # See: https://github.com/gevent/gevent/issues/594\n # and http://www.gevent.org/whatsnew_1_1.html#compatibility\n peer.join()\n\n def _start_peer(self, connection, address, remote_pubkey=None):\n # create peer\n peer = Peer(self, connection, remote_pubkey=remote_pubkey)\n peer.link(on_peer_exit)\n log.debug('created new peer', peer=peer, fno=connection.fileno())\n self.peers.append(peer)\n # loop\n peer.start()\n log.debug('peer started', peer=peer, fno=connection.fileno())\n assert not connection.closed\n return peer\n```",
"json_metadata": "{\"tags\":[\"cn\",\"python\",\"ethereum\"],\"image\":[\"https://steemitimages.com/DQmcZ59aR3qAYLEa8rjLSmM5Ay1n5pojzpkNSCugihW9Aaj/image.png\"],\"links\":[\"https://github.com/ethereum/pyethapp\",\"https://github.com/ethereum/pyethereum\",\"https://github.com/ethereum/pydevp2p\",\"https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L18\",\"https://github.com/ethereum/pydevp2p/blob/develop/devp2p/protocol.py#L161\",\"https://github.com/ethereum/pydevp2p/blob/develop/devp2p/service.py#L6\",\"https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L41\",\"https://github.com/ethereum/pyethapp/blob/develop/pyethapp/app.py#L219\",\"https://github.com/ethereum/pydevp2p/blob/develop/devp2p/peermanager.py#L156\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "cn",
"permlink": "python-ethereum",
"title": "python ethereum 代码分析(一)"
}
],
"op_in_trx": 0,
"timestamp": "2017-07-10T02:22:51",
"trx_id": "0b013eb97912067b32bf744ffef2c60a7bb9c763",
"trx_in_block": 8,
"virtual_op": 0
}2017/07/10 01:51:30
2017/07/10 01:51:30
| author | sweetsssj |
| permlink | travel-with-me-75-saying-hello-to-sharks-stingrays-sawfish-at-the-predator-lagoon-photos-video |
| voter | c1ay |
| weight | 10000 (100.00%) |
| Transaction Info | Block #13547956/Trx 111679f659210dec1d0921cf67c2be6141d524fd |
View Raw JSON Data
{
"block": 13547956,
"op": [
"vote",
{
"author": "sweetsssj",
"permlink": "travel-with-me-75-saying-hello-to-sharks-stingrays-sawfish-at-the-predator-lagoon-photos-video",
"voter": "c1ay",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-07-10T01:51:30",
"trx_id": "111679f659210dec1d0921cf67c2be6141d524fd",
"trx_in_block": 18,
"virtual_op": 0
}2017/07/09 13:23:45
2017/07/09 13:23:45
| active | {"account_auths":[],"key_auths":[["STM5KD8MMpLNa7YNd5sVXA9iVUEZhaFRNNBBwVX8SSANttW8p9f7x",1]],"weight_threshold":1} |
| creator | steem |
| delegation | 57000.000000 VESTS |
| extensions | [] |
| fee | 0.500 STEEM |
| json metadata | |
| memo key | STM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F |
| new account name | c1ay |
| owner | {"account_auths":[],"key_auths":[["STM7zHay7NW1VHfzPgzXH1d1uUEAaeqaNfPC49CYYN9ULJoYeU94Z",1]],"weight_threshold":1} |
| posting | {"account_auths":[],"key_auths":[["STM6G9ytQSMXtwoKKZd5353hB1C2RPBZATLj1v9VZg2V9v8GEL44g",1]],"weight_threshold":1} |
| Transaction Info | Block #13533003/Trx 1d8d015e0b283aba571ae36be225f5cee2c42d09 |
View Raw JSON Data
{
"block": 13533003,
"op": [
"account_create_with_delegation",
{
"active": {
"account_auths": [],
"key_auths": [
[
"STM5KD8MMpLNa7YNd5sVXA9iVUEZhaFRNNBBwVX8SSANttW8p9f7x",
1
]
],
"weight_threshold": 1
},
"creator": "steem",
"delegation": "57000.000000 VESTS",
"extensions": [],
"fee": "0.500 STEEM",
"json_metadata": "",
"memo_key": "STM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F",
"new_account_name": "c1ay",
"owner": {
"account_auths": [],
"key_auths": [
[
"STM7zHay7NW1VHfzPgzXH1d1uUEAaeqaNfPC49CYYN9ULJoYeU94Z",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [],
"key_auths": [
[
"STM6G9ytQSMXtwoKKZd5353hB1C2RPBZATLj1v9VZg2V9v8GEL44g",
1
]
],
"weight_threshold": 1
}
}
],
"op_in_trx": 0,
"timestamp": "2017-07-09T13:23:45",
"trx_id": "1d8d015e0b283aba571ae36be225f5cee2c42d09",
"trx_in_block": 16,
"virtual_op": 0
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress0.00%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779056721
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779056721
},
"rc_account": {
"account": "c1ay",
"max_rc": "10164408779",
"max_rc_creation_adjustment": {
"amount": "2020748973",
"nai": "@@000000037",
"precision": 6
},
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779056721
}
}
}Account Metadata
| POSTING JSON METADATA | |
| profile | {"profile_image":"https://assets.rbl.ms/4314213/980x.jpg"} |
| JSON METADATA | |
| profile | {"profile_image":"https://assets.rbl.ms/4314213/980x.jpg"} |
{
"posting_json_metadata": {
"profile": {
"profile_image": "https://assets.rbl.ms/4314213/980x.jpg"
}
},
"json_metadata": {
"profile": {
"profile_image": "https://assets.rbl.ms/4314213/980x.jpg"
}
}
}Auth Keys
Owner
Single Signature
Public Keys
STM7zHay7NW1VHfzPgzXH1d1uUEAaeqaNfPC49CYYN9ULJoYeU94Z1/1
Active
Single Signature
Public Keys
STM5KD8MMpLNa7YNd5sVXA9iVUEZhaFRNNBBwVX8SSANttW8p9f7x1/1
Posting
Single Signature
Public Keys
STM6G9ytQSMXtwoKKZd5353hB1C2RPBZATLj1v9VZg2V9v8GEL44g1/1
Memo
STM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F
{
"owner": {
"account_auths": [],
"key_auths": [
[
"STM7zHay7NW1VHfzPgzXH1d1uUEAaeqaNfPC49CYYN9ULJoYeU94Z",
1
]
],
"weight_threshold": 1
},
"active": {
"account_auths": [],
"key_auths": [
[
"STM5KD8MMpLNa7YNd5sVXA9iVUEZhaFRNNBBwVX8SSANttW8p9f7x",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [],
"key_auths": [
[
"STM6G9ytQSMXtwoKKZd5353hB1C2RPBZATLj1v9VZg2V9v8GEL44g",
1
]
],
"weight_threshold": 1
},
"memo": "STM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F"
}Witness Votes
0 / 30
No active witness votes.
[]