Ecoer Logo
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 Deleg
+4.372SP

Detailed Balance

STEEM
balance
0.000STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
0.636SP
Delegated Out
0.000SP
Delegation In
4.372SP
Effective Power
5.008SP
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": "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

namec1ay
id251471
rank980,823
reputation17863574
created2017-07-09T13:23:45
recovery_accountsteem
proxyNone
post_count2
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2017-07-10T02:33:45
last_root_post2017-07-10T02:22:51
last_vote_time2021-05-09T14:53:45
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_shares1033.949020 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7109.710786 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_update2017-07-10T02:45:51
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 251471,
  "name": "c1ay",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7zHay7NW1VHfzPgzXH1d1uUEAaeqaNfPC49CYYN9ULJoYeU94Z",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5KD8MMpLNa7YNd5sVXA9iVUEZhaFRNNBBwVX8SSANttW8p9f7x",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6G9ytQSMXtwoKKZd5353hB1C2RPBZATLj1v9VZg2V9v8GEL44g",
        1
      ]
    ]
  },
  "memo_key": "STM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F",
  "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\"}}",
  "proxy": "",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_account_update": "2017-07-10T02:45:51",
  "created": "2017-07-09T13:23:45",
  "mined": false,
  "recovery_account": "steem",
  "last_account_recovery": "1970-01-01T00:00:00",
  "reset_account": "null",
  "comment_count": 0,
  "lifetime_vote_count": 0,
  "post_count": 2,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779056721
  },
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779056721
  },
  "voting_power": 0,
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "sbd_balance": "0.000 SBD",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "1970-01-01T00:00:00",
  "sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "reward_sbd_balance": "0.000 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "0.000000 VESTS",
  "reward_vesting_steem": "0.000 STEEM",
  "vesting_shares": "1033.949020 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7109.710786 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "withdrawn": 0,
  "to_withdraw": 0,
  "withdraw_routes": 0,
  "curation_rewards": 0,
  "posting_rewards": 0,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    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",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "vesting_balance": "0.000 STEEM",
  "reputation": 17863574,
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 980823
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.372 SP to @c1ay
2026/05/17 22:25:21
delegatorsteem
delegateec1ay
vesting shares7109.710786 VESTS
Transaction InfoBlock #106141261/Trx 028b5d3f2b793afc08e2756551b93a60bd8e5bd7
View Raw JSON Data
{
  "trx_id": "028b5d3f2b793afc08e2756551b93a60bd8e5bd7",
  "block": 106141261,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-17T22:25:21",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "7109.710786 VESTS"
    }
  ]
}
steemdelegated 2.704 SP to @c1ay
2026/05/11 20:33:21
delegatorsteem
delegateec1ay
vesting shares4397.500381 VESTS
Transaction InfoBlock #105966993/Trx fdf98393819f57124b7f89c574f6eff212b2903d
View Raw JSON Data
{
  "trx_id": "fdf98393819f57124b7f89c574f6eff212b2903d",
  "block": 105966993,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-11T20:33:21",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "4397.500381 VESTS"
    }
  ]
}
steemdelegated 4.380 SP to @c1ay
2026/04/25 21:49:06
delegatorsteem
delegateec1ay
vesting shares7122.226542 VESTS
Transaction InfoBlock #105508965/Trx bb8a695e3b6b591b471500b01f8670c8293f8cff
View Raw JSON Data
{
  "trx_id": "bb8a695e3b6b591b471500b01f8670c8293f8cff",
  "block": 105508965,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-04-25T21:49:06",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "7122.226542 VESTS"
    }
  ]
}
steemdelegated 2.730 SP to @c1ay
2026/01/23 02:58:39
delegatorsteem
delegateec1ay
vesting shares4439.047200 VESTS
Transaction InfoBlock #102846037/Trx 29e2368e14ec8f2cae0a4792f80efd3e40325be5
View Raw JSON Data
{
  "trx_id": "29e2368e14ec8f2cae0a4792f80efd3e40325be5",
  "block": 102846037,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-01-23T02:58:39",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "4439.047200 VESTS"
    }
  ]
}
steemdelegated 2.831 SP to @c1ay
2024/12/16 22:18:03
delegatorsteem
delegateec1ay
vesting shares4603.266397 VESTS
Transaction InfoBlock #91292445/Trx 3e674a10c5d39b346970a7b8bb5a7eda5aec3399
View Raw JSON Data
{
  "trx_id": "3e674a10c5d39b346970a7b8bb5a7eda5aec3399",
  "block": 91292445,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-12-16T22:18:03",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "4603.266397 VESTS"
    }
  ]
}
steemdelegated 2.935 SP to @c1ay
2023/11/13 14:03:00
delegatorsteem
delegateec1ay
vesting shares4772.399929 VESTS
Transaction InfoBlock #79846705/Trx 8e14a61d88a121c4221d13ee38af524ef126bb4e
View Raw JSON Data
{
  "trx_id": "8e14a61d88a121c4221d13ee38af524ef126bb4e",
  "block": 79846705,
  "trx_in_block": 9,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-11-13T14:03:00",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "4772.399929 VESTS"
    }
  ]
}
steemdelegated 4.741 SP to @c1ay
2023/09/21 19:42:15
delegatorsteem
delegateec1ay
vesting shares7709.678715 VESTS
Transaction InfoBlock #78345291/Trx a292a11f79499326be4b131f97815429c2bf169c
View Raw JSON Data
{
  "trx_id": "a292a11f79499326be4b131f97815429c2bf169c",
  "block": 78345291,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-09-21T19:42:15",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "7709.678715 VESTS"
    }
  ]
}
steemdelegated 4.872 SP to @c1ay
2022/11/15 21:37:18
delegatorsteem
delegateec1ay
vesting shares7922.326194 VESTS
Transaction InfoBlock #69469131/Trx 699775e52a54511470222015b7901c014fa3bade
View Raw JSON Data
{
  "trx_id": "699775e52a54511470222015b7901c014fa3bade",
  "block": 69469131,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-11-15T21:37:18",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "7922.326194 VESTS"
    }
  ]
}
steemdelegated 4.982 SP to @c1ay
2022/03/21 17:54:24
delegatorsteem
delegateec1ay
vesting shares8101.489745 VESTS
Transaction InfoBlock #62620838/Trx 94a176786c3461e48c324b35bd645341580714fb
View Raw JSON Data
{
  "trx_id": "94a176786c3461e48c324b35bd645341580714fb",
  "block": 62620838,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-03-21T17:54:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "8101.489745 VESTS"
    }
  ]
}
steemdelegated 5.094 SP to @c1ay
2021/08/08 14:57:24
delegatorsteem
delegateec1ay
vesting shares8284.270595 VESTS
Transaction InfoBlock #56189181/Trx 60437c9e32463e7e42b9b68c5b5c8d3db93d17c7
View Raw JSON Data
{
  "trx_id": "60437c9e32463e7e42b9b68c5b5c8d3db93d17c7",
  "block": 56189181,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2021-08-08T14:57:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "8284.270595 VESTS"
    }
  ]
}
steemdelegated 16.915 SP to @c1ay
2021/07/13 14:44:18
delegatorsteem
delegateec1ay
vesting shares27508.053421 VESTS
Transaction InfoBlock #55447955/Trx 0156849579916eebca6052d6213194590236b2e8
View Raw JSON Data
{
  "trx_id": "0156849579916eebca6052d6213194590236b2e8",
  "block": 55447955,
  "trx_in_block": 12,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2021-07-13T14:44:18",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "27508.053421 VESTS"
    }
  ]
}
steemdelegated 17.030 SP to @c1ay
2021/05/09 14:56:09
delegatorsteem
delegateec1ay
vesting shares27694.940254 VESTS
Transaction InfoBlock #53595791/Trx 8b4fd5f9d1693a5f9b6cbdcba84bb0243728c60e
View Raw JSON Data
{
  "trx_id": "8b4fd5f9d1693a5f9b6cbdcba84bb0243728c60e",
  "block": 53595791,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2021-05-09T14:56:09",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "27694.940254 VESTS"
    }
  ]
}
c1ayupvoted (100.00%) @ydmicd / qss3bz
2021/05/09 14:53:45
voterc1ay
authorydmicd
permlinkqss3bz
weight10000 (100.00%)
Transaction InfoBlock #53595743/Trx 57d1f6e01d7b3a0f2a20c46226902f0fc9899bbc
View Raw JSON Data
{
  "trx_id": "57d1f6e01d7b3a0f2a20c46226902f0fc9899bbc",
  "block": 53595743,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2021-05-09T14:53:45",
  "op": [
    "vote",
    {
      "voter": "c1ay",
      "author": "ydmicd",
      "permlink": "qss3bz",
      "weight": 10000
    }
  ]
}
c1ayupvoted (100.00%) @salamdeen / qsinzo
2021/05/09 14:53:36
voterc1ay
authorsalamdeen
permlinkqsinzo
weight10000 (100.00%)
Transaction InfoBlock #53595740/Trx e9e0240f279a7380a3c813495c1b9bab14422c5b
View Raw JSON Data
{
  "trx_id": "e9e0240f279a7380a3c813495c1b9bab14422c5b",
  "block": 53595740,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2021-05-09T14:53:36",
  "op": [
    "vote",
    {
      "voter": "c1ay",
      "author": "salamdeen",
      "permlink": "qsinzo",
      "weight": 10000
    }
  ]
}
steemdelegated 5.241 SP to @c1ay
2020/12/11 09:30:36
delegatorsteem
delegateec1ay
vesting shares8523.084016 VESTS
Transaction InfoBlock #49353276/Trx 3a21cb10af67e37a1d86b30bd461704e03f62587
View Raw JSON Data
{
  "trx_id": "3a21cb10af67e37a1d86b30bd461704e03f62587",
  "block": 49353276,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-11T09:30:36",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "8523.084016 VESTS"
    }
  ]
}
steemdelegated 1.176 SP to @c1ay
2020/12/06 03:08:03
delegatorsteem
delegateec1ay
vesting shares1912.543513 VESTS
Transaction InfoBlock #49204846/Trx 5df8e4289b4d3f55a1dbfb38eb652e36dce39793
View Raw JSON Data
{
  "trx_id": "5df8e4289b4d3f55a1dbfb38eb652e36dce39793",
  "block": 49204846,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-06T03:08:03",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "1912.543513 VESTS"
    }
  ]
}
steemdelegated 5.245 SP to @c1ay
2020/12/05 11:05:00
delegatorsteem
delegateec1ay
vesting shares8529.450655 VESTS
Transaction InfoBlock #49185950/Trx 68ce65cf3a61ac0834363d250042fa3216392400
View Raw JSON Data
{
  "trx_id": "68ce65cf3a61ac0834363d250042fa3216392400",
  "block": 49185950,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-05T11:05:00",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "8529.450655 VESTS"
    }
  ]
}
steemdelegated 1.181 SP to @c1ay
2020/11/02 12:05:33
delegatorsteem
delegateec1ay
vesting shares1920.017158 VESTS
Transaction InfoBlock #48253629/Trx 8b88c400105efdc39bb3f053257fbafac9a1078b
View Raw JSON Data
{
  "trx_id": "8b88c400105efdc39bb3f053257fbafac9a1078b",
  "block": 48253629,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-11-02T12:05:33",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "1920.017158 VESTS"
    }
  ]
}
steemdelegated 5.370 SP to @c1ay
2020/05/09 04:03:24
delegatorsteem
delegateec1ay
vesting shares8732.097229 VESTS
Transaction InfoBlock #43215065/Trx 0bf031af56edbddd0a39032a35b592dc88d92419
View Raw JSON Data
{
  "trx_id": "0bf031af56edbddd0a39032a35b592dc88d92419",
  "block": 43215065,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-09T04:03:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "8732.097229 VESTS"
    }
  ]
}
steemdelegated 1.201 SP to @c1ay
2020/05/08 07:24:39
delegatorsteem
delegateec1ay
vesting shares1953.311140 VESTS
Transaction InfoBlock #43190870/Trx 51015fe914f0d72aaf61d58b655ae971d1dc99ef
View Raw JSON Data
{
  "trx_id": "51015fe914f0d72aaf61d58b655ae971d1dc99ef",
  "block": 43190870,
  "trx_in_block": 9,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-08T07:24:39",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "1953.311140 VESTS"
    }
  ]
}
steemdelegated 5.378 SP to @c1ay
2020/04/15 20:33:06
delegatorsteem
delegateec1ay
vesting shares8745.074648 VESTS
Transaction InfoBlock #42561324/Trx 65ddab5068636942ee1ef0d3405d1e0e238f49df
View Raw JSON Data
{
  "trx_id": "65ddab5068636942ee1ef0d3405d1e0e238f49df",
  "block": 42561324,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-04-15T20:33:06",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "8745.074648 VESTS"
    }
  ]
}
2019/07/09 14:04:12
parent authorc1ay
parent permlinkpython-ethereum
authorsteemitboard
permlinksteemitboard-notify-c1ay-20190709t140412000z
title
bodyCongratulations @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"]}
Transaction InfoBlock #34512868/Trx 735f3887597470fb403e5ec161b537cc3ece3fb9
View Raw JSON Data
{
  "trx_id": "735f3887597470fb403e5ec161b537cc3ece3fb9",
  "block": 34512868,
  "trx_in_block": 29,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-07-09T14:04:12",
  "op": [
    "comment",
    {
      "parent_author": "c1ay",
      "parent_permlink": "python-ethereum",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-c1ay-20190709t140412000z",
      "title": "",
      "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\"]}"
    }
  ]
}
steemdelegated 5.498 SP to @c1ay
2019/05/12 13:47:48
delegatorsteem
delegateec1ay
vesting shares8940.697453 VESTS
Transaction InfoBlock #32844159/Trx 711bf90333055d3c34dd536edfd474f47c7fbdeb
View Raw JSON Data
{
  "trx_id": "711bf90333055d3c34dd536edfd474f47c7fbdeb",
  "block": 32844159,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-05-12T13:47:48",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "8940.697453 VESTS"
    }
  ]
}
steemdelegated 5.621 SP to @c1ay
2018/05/16 20:09:45
delegatorsteem
delegateec1ay
vesting shares9140.249888 VESTS
Transaction InfoBlock #22489696/Trx 6fa9c35c310b716c5f552b60d5a48917250ca9af
View Raw JSON Data
{
  "trx_id": "6fa9c35c310b716c5f552b60d5a48917250ca9af",
  "block": 22489696,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-16T20:09:45",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "9140.249888 VESTS"
    }
  ]
}
changtimwuupvoted (100.00%) @c1ay / python-ethereum
2018/01/18 21:40:27
voterchangtimwu
authorc1ay
permlinkpython-ethereum
weight10000 (100.00%)
Transaction InfoBlock #19096612/Trx 86f98648793236f0852dc6f4da972d90b83ff4db
View Raw JSON Data
{
  "trx_id": "86f98648793236f0852dc6f4da972d90b83ff4db",
  "block": 19096612,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-01-18T21:40:27",
  "op": [
    "vote",
    {
      "voter": "changtimwu",
      "author": "c1ay",
      "permlink": "python-ethereum",
      "weight": 10000
    }
  ]
}
steemdelegated 18.258 SP to @c1ay
2018/01/09 06:35:54
delegatorsteem
delegateec1ay
vesting shares29691.240272 VESTS
Transaction InfoBlock #18819518/Trx 6aceb8bdf3e9a3fd96fab5c422930408ccf44ae7
View Raw JSON Data
{
  "trx_id": "6aceb8bdf3e9a3fd96fab5c422930408ccf44ae7",
  "block": 18819518,
  "trx_in_block": 9,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-01-09T06:35:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "29691.240272 VESTS"
    }
  ]
}
steemdelegated 18.412 SP to @c1ay
2017/08/04 05:15:42
delegatorsteem
delegateec1ay
vesting shares29942.050980 VESTS
Transaction InfoBlock #14271394/Trx 843f90f36f90e8de603a8ddcb3673d8620f1a556
View Raw JSON Data
{
  "trx_id": "843f90f36f90e8de603a8ddcb3673d8620f1a556",
  "block": 14271394,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-04T05:15:42",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "c1ay",
      "vesting_shares": "29942.050980 VESTS"
    }
  ]
}
c1ayupvoted (100.00%) @oflyhigh / yy
2017/07/10 10:23:48
voterc1ay
authoroflyhigh
permlinkyy
weight10000 (100.00%)
Transaction InfoBlock #13558117/Trx ea1e5f6f93695b4f78962b35655619faaca580bb
View Raw JSON Data
{
  "trx_id": "ea1e5f6f93695b4f78962b35655619faaca580bb",
  "block": 13558117,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-10T10:23:48",
  "op": [
    "vote",
    {
      "voter": "c1ay",
      "author": "oflyhigh",
      "permlink": "yy",
      "weight": 10000
    }
  ]
}
2017/07/10 10:23:33
voterc1ay
authorjubi
permlinkre-oflyhigh-yy-20170709t130423314z
weight10000 (100.00%)
Transaction InfoBlock #13558112/Trx 877a6437112d727b03b08aa50f20e243fa44a54c
View Raw JSON Data
{
  "trx_id": "877a6437112d727b03b08aa50f20e243fa44a54c",
  "block": 13558112,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-10T10:23:33",
  "op": [
    "vote",
    {
      "voter": "c1ay",
      "author": "jubi",
      "permlink": "re-oflyhigh-yy-20170709t130423314z",
      "weight": 10000
    }
  ]
}
2017/07/10 04:46:54
parent authorc1ay
parent permlinkpython-ethereum
authorsteemitboard
permlinksteemitboard-notify-c1ay-20170710t044654000z
title
bodyCongratulations @c1ay! You have completed some achievement on Steemit and have been rewarded with new badge(s) : [![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/firstcomment.png)](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"]}
Transaction InfoBlock #13551463/Trx af6e1f4f7de3da5b594173f0925f5b77d4fac44b
View Raw JSON Data
{
  "trx_id": "af6e1f4f7de3da5b594173f0925f5b77d4fac44b",
  "block": 13551463,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-10T04:46:54",
  "op": [
    "comment",
    {
      "parent_author": "c1ay",
      "parent_permlink": "python-ethereum",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-c1ay-20170710t044654000z",
      "title": "",
      "body": "Congratulations @c1ay! You have completed some achievement on Steemit and have been rewarded with new badge(s) :\n\n[![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/firstcomment.png)](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\"]}"
    }
  ]
}
c1ayupdated their account properties
2017/07/10 02:45:51
accountc1ay
memo keySTM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F
json metadata{"profile":{"profile_image":"https://assets.rbl.ms/4314213/980x.jpg"}}
Transaction InfoBlock #13549043/Trx 0396f8e640e897493bb6763e550006c09fe180e0
View Raw JSON Data
{
  "trx_id": "0396f8e640e897493bb6763e550006c09fe180e0",
  "block": 13549043,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-10T02:45:51",
  "op": [
    "account_update",
    {
      "account": "c1ay",
      "memo_key": "STM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F",
      "json_metadata": "{\"profile\":{\"profile_image\":\"https://assets.rbl.ms/4314213/980x.jpg\"}}"
    }
  ]
}
c1aypublished a new post: python-ethereum
2017/07/10 02:35:21
parent author
parent permlinkcn
authorc1ay
permlinkpython-ethereum
titlepython ethereum 代码分析(一)
bodypython 版本以太坊 项目地址 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 模块 代码整体结构 ![](https://steemitimages.com/DQmcZ59aR3qAYLEa8rjLSmM5Ay1n5pojzpkNSCugihW9Aaj/image.png) 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"}
Transaction InfoBlock #13548833/Trx 431cab687e31b4abb756290af4ead22f6c9b9723
View Raw JSON Data
{
  "trx_id": "431cab687e31b4abb756290af4ead22f6c9b9723",
  "block": 13548833,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-10T02:35:21",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "cn",
      "author": "c1ay",
      "permlink": "python-ethereum",
      "title": "python ethereum 代码分析(一)",
      "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![](https://steemitimages.com/DQmcZ59aR3qAYLEa8rjLSmM5Ay1n5pojzpkNSCugihW9Aaj/image.png)\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\"}"
    }
  ]
}
c1ayfollowed @bziing
2017/07/10 02:34:09
required auths[]
required posting auths["c1ay"]
idfollow
json["follow",{"follower":"c1ay","following":"bziing","what":["blog"]}]
Transaction InfoBlock #13548809/Trx 1fdb6e4253ff873e5ca76a9c0e996d0ffc5dbf76
View Raw JSON Data
{
  "trx_id": "1fdb6e4253ff873e5ca76a9c0e996d0ffc5dbf76",
  "block": 13548809,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-10T02:34:09",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "c1ay"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"c1ay\",\"following\":\"bziing\",\"what\":[\"blog\"]}]"
    }
  ]
}
c1ayupvoted (100.00%) @bziing / steemit-logo
2017/07/10 02:33:45
voterc1ay
authorbziing
permlinksteemit-logo
weight10000 (100.00%)
Transaction InfoBlock #13548801/Trx 29c12d5c988f8fc8360c71940885cdb8010b43fc
View Raw JSON Data
{
  "trx_id": "29c12d5c988f8fc8360c71940885cdb8010b43fc",
  "block": 13548801,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-10T02:33:45",
  "op": [
    "vote",
    {
      "voter": "c1ay",
      "author": "bziing",
      "permlink": "steemit-logo",
      "weight": 10000
    }
  ]
}
2017/07/10 02:33:45
parent authorbziing
parent permlinksteemit-logo
authorc1ay
permlinkre-bziing-steemit-logo-20170710t023340044z
title
bodyI will vote u
json metadata{"tags":["steemit"],"app":"steemit/0.1"}
Transaction InfoBlock #13548801/Trx c74d377873d207d551556da5d46c6ac30a4f1b6e
View Raw JSON Data
{
  "trx_id": "c74d377873d207d551556da5d46c6ac30a4f1b6e",
  "block": 13548801,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-10T02:33:45",
  "op": [
    "comment",
    {
      "parent_author": "bziing",
      "parent_permlink": "steemit-logo",
      "author": "c1ay",
      "permlink": "re-bziing-steemit-logo-20170710t023340044z",
      "title": "",
      "body": "I will vote u",
      "json_metadata": "{\"tags\":[\"steemit\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
c1ayupvoted (100.00%) @c1ay / python-ethereum
2017/07/10 02:23:06
voterc1ay
authorc1ay
permlinkpython-ethereum
weight10000 (100.00%)
Transaction InfoBlock #13548588/Trx 404a6d3656e5250f59cc0c3b71ac3ec17316ac6d
View Raw JSON Data
{
  "trx_id": "404a6d3656e5250f59cc0c3b71ac3ec17316ac6d",
  "block": 13548588,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-10T02:23:06",
  "op": [
    "vote",
    {
      "voter": "c1ay",
      "author": "c1ay",
      "permlink": "python-ethereum",
      "weight": 10000
    }
  ]
}
c1aypublished a new post: python-ethereum
2017/07/10 02:22:51
parent author
parent permlinkcn
authorc1ay
permlinkpython-ethereum
titlepython ethereum 代码分析(一)
bodypython 版本以太坊 项目地址 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 模块 代码整体结构 ![](https://steemitimages.com/DQmcZ59aR3qAYLEa8rjLSmM5Ay1n5pojzpkNSCugihW9Aaj/image.png) 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"}
Transaction InfoBlock #13548583/Trx 0b013eb97912067b32bf744ffef2c60a7bb9c763
View Raw JSON Data
{
  "trx_id": "0b013eb97912067b32bf744ffef2c60a7bb9c763",
  "block": 13548583,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-10T02:22:51",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "cn",
      "author": "c1ay",
      "permlink": "python-ethereum",
      "title": "python ethereum 代码分析(一)",
      "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![](https://steemitimages.com/DQmcZ59aR3qAYLEa8rjLSmM5Ay1n5pojzpkNSCugihW9Aaj/image.png)\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\"}"
    }
  ]
}
2017/07/10 01:51:30
voterc1ay
authorsweetsssj
permlinktravel-with-me-75-saying-hello-to-sharks-stingrays-sawfish-at-the-predator-lagoon-photos-video
weight10000 (100.00%)
Transaction InfoBlock #13547956/Trx 111679f659210dec1d0921cf67c2be6141d524fd
View Raw JSON Data
{
  "trx_id": "111679f659210dec1d0921cf67c2be6141d524fd",
  "block": 13547956,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-10T01:51:30",
  "op": [
    "vote",
    {
      "voter": "c1ay",
      "author": "sweetsssj",
      "permlink": "travel-with-me-75-saying-hello-to-sharks-stingrays-sawfish-at-the-predator-lagoon-photos-video",
      "weight": 10000
    }
  ]
}
steemcreated a new account: @c1ay
2017/07/09 13:23:45
fee0.500 STEEM
delegation57000.000000 VESTS
creatorsteem
new account namec1ay
owner{"weight_threshold":1,"account_auths":[],"key_auths":[["STM7zHay7NW1VHfzPgzXH1d1uUEAaeqaNfPC49CYYN9ULJoYeU94Z",1]]}
active{"weight_threshold":1,"account_auths":[],"key_auths":[["STM5KD8MMpLNa7YNd5sVXA9iVUEZhaFRNNBBwVX8SSANttW8p9f7x",1]]}
posting{"weight_threshold":1,"account_auths":[],"key_auths":[["STM6G9ytQSMXtwoKKZd5353hB1C2RPBZATLj1v9VZg2V9v8GEL44g",1]]}
memo keySTM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F
json metadata
extensions[]
Transaction InfoBlock #13533003/Trx 1d8d015e0b283aba571ae36be225f5cee2c42d09
View Raw JSON Data
{
  "trx_id": "1d8d015e0b283aba571ae36be225f5cee2c42d09",
  "block": 13533003,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-09T13:23:45",
  "op": [
    "account_create_with_delegation",
    {
      "fee": "0.500 STEEM",
      "delegation": "57000.000000 VESTS",
      "creator": "steem",
      "new_account_name": "c1ay",
      "owner": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM7zHay7NW1VHfzPgzXH1d1uUEAaeqaNfPC49CYYN9ULJoYeU94Z",
            1
          ]
        ]
      },
      "active": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM5KD8MMpLNa7YNd5sVXA9iVUEZhaFRNNBBwVX8SSANttW8p9f7x",
            1
          ]
        ]
      },
      "posting": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM6G9ytQSMXtwoKKZd5353hB1C2RPBZATLj1v9VZg2V9v8GEL44g",
            1
          ]
        ]
      },
      "memo_key": "STM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F",
      "json_metadata": "",
      "extensions": []
    }
  ]
}

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": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7zHay7NW1VHfzPgzXH1d1uUEAaeqaNfPC49CYYN9ULJoYeU94Z",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5KD8MMpLNa7YNd5sVXA9iVUEZhaFRNNBBwVX8SSANttW8p9f7x",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6G9ytQSMXtwoKKZd5353hB1C2RPBZATLj1v9VZg2V9v8GEL44g",
        1
      ]
    ]
  },
  "memo": "STM6HXSC16ivtk2mMu6u75d4yew5LVaHx2pWP4PxQWS4vY2JzaL7F"
}

Witness Votes

0 / 30
No active witness votes.
[]