VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS46.39%
Net Worth
0.037USD
STEEM
0.000STEEM
SBD
0.000SBD
Effective Power
5.008SP
├── Own SP
0.634SP
└── Incoming DelegationsDeleg
+4.374SP
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.634SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 4.374SP | SP |
| Effective Power | 5.008SP | SP |
| Reward SP (pending) | 3.613SP | 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": "1031.104092 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "7112.555714 VESTS",
"sbd_balance": "0.000 SBD",
"savings_sbd_balance": "0.000 SBD",
"reward_sbd_balance": "0.000 SBD",
"conversions": []
}Account Info
| name | electroman |
| id | 342298 |
| rank | 907,676 |
| reputation | 31332060679 |
| created | 2017-08-30T13:46:06 |
| recovery_account | steem |
| proxy | None |
| post_count | 13 |
| comment_count | 0 |
| lifetime_vote_count | 0 |
| witnesses_voted_for | 0 |
| last_post | 2017-10-29T15:22:45 |
| last_root_post | 2017-10-29T15:22:45 |
| last_vote_time | 2017-08-31T13:06:06 |
| 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 | 1031.104092 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 7112.555714 VESTS |
| reward_vesting_balance | 7424.860500 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 | 1970-01-01T00:00:00 |
| 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": [
[
"STM6KLWdYd1Lq4fG1rwTjUBxtGRYYN8Uqtc6CPh2xr2gi6Z9Q3GsJ",
1
]
],
"weight_threshold": 1
},
"balance": "0.000 STEEM",
"can_vote": true,
"comment_count": 0,
"created": "2017-08-30T13:46:06",
"curation_rewards": 0,
"delegated_vesting_shares": "0.000000 VESTS",
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779062022
},
"guest_bloggers": [],
"id": 342298,
"json_metadata": "",
"last_account_recovery": "1970-01-01T00:00:00",
"last_account_update": "1970-01-01T00:00:00",
"last_owner_update": "1970-01-01T00:00:00",
"last_post": "2017-10-29T15:22:45",
"last_root_post": "2017-10-29T15:22:45",
"last_vote_time": "2017-08-31T13:06:06",
"lifetime_vote_count": 0,
"market_history": [],
"memo_key": "STM6Gy7eB9yEKDgoKiagcvajh26Vce7XgEcpL34sCBcwKUNbL6g8g",
"mined": false,
"name": "electroman",
"next_vesting_withdrawal": "1969-12-31T23:59:59",
"other_history": [],
"owner": {
"account_auths": [],
"key_auths": [
[
"STM6noqEiEmjLjPfmGeWigF8Ch3r4v5cz4Zcs5cJnEeFEWkZZD8rU",
1
]
],
"weight_threshold": 1
},
"pending_claimed_accounts": 0,
"post_bandwidth": 0,
"post_count": 13,
"post_history": [],
"posting": {
"account_auths": [],
"key_auths": [
[
"STM7WgMxYWiz7gCFat6TW3QrY4LXjVJqFg7N9fBGq82jGteUfESr8",
1
]
],
"weight_threshold": 1
},
"posting_json_metadata": "",
"posting_rewards": 3613,
"proxied_vsf_votes": [
0,
0,
0,
0
],
"proxy": "",
"received_vesting_shares": "7112.555714 VESTS",
"recovery_account": "steem",
"reputation": "31332060679",
"reset_account": "null",
"reward_sbd_balance": "0.000 SBD",
"reward_steem_balance": "0.000 STEEM",
"reward_vesting_balance": "7424.860500 VESTS",
"reward_vesting_steem": "3.613 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": "1031.104092 VESTS",
"vesting_withdraw_rate": "0.000000 VESTS",
"vote_history": [],
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779062022
},
"voting_power": 0,
"withdraw_routes": 0,
"withdrawn": 0,
"witness_votes": [],
"witnesses_voted_for": 0,
"rank": 907676
}Withdraw Routes
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
steemdelegated 4.374 SP to @electroman2026/05/17 23:53:42
steemdelegated 4.374 SP to @electroman
2026/05/17 23:53:42
| delegatee | electroman |
| delegator | steem |
| vesting shares | 7112.555714 VESTS |
| Transaction Info | Block #106143021/Trx a9764ebfd9971e8b0e31025a869e6aa4df00bb93 |
View Raw JSON Data
{
"block": 106143021,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "7112.555714 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-17T23:53:42",
"trx_id": "a9764ebfd9971e8b0e31025a869e6aa4df00bb93",
"trx_in_block": 0,
"virtual_op": 0
}steemdelegated 2.706 SP to @electroman2026/05/12 02:22:03
steemdelegated 2.706 SP to @electroman
2026/05/12 02:22:03
| delegatee | electroman |
| delegator | steem |
| vesting shares | 4400.345309 VESTS |
| Transaction Info | Block #105973944/Trx edb32ba1012bad176915133c3afcf7d6f922f5f8 |
View Raw JSON Data
{
"block": 105973944,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "4400.345309 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-12T02:22:03",
"trx_id": "edb32ba1012bad176915133c3afcf7d6f922f5f8",
"trx_in_block": 1,
"virtual_op": 0
}steemdelegated 4.381 SP to @electroman2026/04/25 23:15:09
steemdelegated 4.381 SP to @electroman
2026/04/25 23:15:09
| delegatee | electroman |
| delegator | steem |
| vesting shares | 7125.071470 VESTS |
| Transaction Info | Block #105510681/Trx 771553e950c679b7d0abc252eeb1a488bed5a500 |
View Raw JSON Data
{
"block": 105510681,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "7125.071470 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-04-25T23:15:09",
"trx_id": "771553e950c679b7d0abc252eeb1a488bed5a500",
"trx_in_block": 0,
"virtual_op": 0
}steemdelegated 2.731 SP to @electroman2026/01/23 06:49:30
steemdelegated 2.731 SP to @electroman
2026/01/23 06:49:30
| delegatee | electroman |
| delegator | steem |
| vesting shares | 4441.892128 VESTS |
| Transaction Info | Block #102850638/Trx f7a82413f7eccf472ef1971e489d49f7c2d12810 |
View Raw JSON Data
{
"block": 102850638,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "4441.892128 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-01-23T06:49:30",
"trx_id": "f7a82413f7eccf472ef1971e489d49f7c2d12810",
"trx_in_block": 1,
"virtual_op": 0
}steemdelegated 2.832 SP to @electroman2024/12/17 02:09:00
steemdelegated 2.832 SP to @electroman
2024/12/17 02:09:00
| delegatee | electroman |
| delegator | steem |
| vesting shares | 4606.111325 VESTS |
| Transaction Info | Block #91297058/Trx 35acf83c1cc275b1abfe852638ba6c93e31c6838 |
View Raw JSON Data
{
"block": 91297058,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "4606.111325 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2024-12-17T02:09:00",
"trx_id": "35acf83c1cc275b1abfe852638ba6c93e31c6838",
"trx_in_block": 6,
"virtual_op": 0
}steemdelegated 2.936 SP to @electroman2023/11/13 17:51:42
steemdelegated 2.936 SP to @electroman
2023/11/13 17:51:42
| delegatee | electroman |
| delegator | steem |
| vesting shares | 4775.244857 VESTS |
| Transaction Info | Block #79851258/Trx d01d84d385ac9470a6be68de7d0a19d167b296f7 |
View Raw JSON Data
{
"block": 79851258,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "4775.244857 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-11-13T17:51:42",
"trx_id": "d01d84d385ac9470a6be68de7d0a19d167b296f7",
"trx_in_block": 3,
"virtual_op": 0
}steemdelegated 4.743 SP to @electroman2023/09/21 21:24:06
steemdelegated 4.743 SP to @electroman
2023/09/21 21:24:06
| delegatee | electroman |
| delegator | steem |
| vesting shares | 7712.523643 VESTS |
| Transaction Info | Block #78347314/Trx 50e75c7f763c3e513dacebb97a15e32fdc88418c |
View Raw JSON Data
{
"block": 78347314,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "7712.523643 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-09-21T21:24:06",
"trx_id": "50e75c7f763c3e513dacebb97a15e32fdc88418c",
"trx_in_block": 6,
"virtual_op": 0
}steemdelegated 4.879 SP to @electroman2022/11/03 11:15:24
steemdelegated 4.879 SP to @electroman
2022/11/03 11:15:24
| delegatee | electroman |
| delegator | steem |
| vesting shares | 7934.205081 VESTS |
| Transaction Info | Block #69112728/Trx b4140a6d0981488f9bc7503d6acb191922dd737f |
View Raw JSON Data
{
"block": 69112728,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "7934.205081 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-11-03T11:15:24",
"trx_id": "b4140a6d0981488f9bc7503d6acb191922dd737f",
"trx_in_block": 4,
"virtual_op": 0
}steemdelegated 5.014 SP to @electroman2022/01/17 10:33:24
steemdelegated 5.014 SP to @electroman
2022/01/17 10:33:24
| delegatee | electroman |
| delegator | steem |
| vesting shares | 8154.738312 VESTS |
| Transaction Info | Block #60808934/Trx d3591deb1286d895a0e6ec7db00ccd347c23cb6b |
View Raw JSON Data
{
"block": 60808934,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "8154.738312 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-01-17T10:33:24",
"trx_id": "d3591deb1286d895a0e6ec7db00ccd347c23cb6b",
"trx_in_block": 1,
"virtual_op": 0
}steemdelegated 5.127 SP to @electroman2021/06/14 00:29:39
steemdelegated 5.127 SP to @electroman
2021/06/14 00:29:39
| delegatee | electroman |
| delegator | steem |
| vesting shares | 8338.506970 VESTS |
| Transaction Info | Block #54607344/Trx ea217e3f7fe5186a37d5afa37096cd7fcbdd8aa2 |
View Raw JSON Data
{
"block": 54607344,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "8338.506970 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2021-06-14T00:29:39",
"trx_id": "ea217e3f7fe5186a37d5afa37096cd7fcbdd8aa2",
"trx_in_block": 5,
"virtual_op": 0
}steemdelegated 5.243 SP to @electroman2020/12/11 10:49:15
steemdelegated 5.243 SP to @electroman
2020/12/11 10:49:15
| delegatee | electroman |
| delegator | steem |
| vesting shares | 8525.928944 VESTS |
| Transaction Info | Block #49354821/Trx 490ad935e5a9ccc9bef3cd91e744ce8c1839fe7b |
View Raw JSON Data
{
"block": 49354821,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "8525.928944 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-11T10:49:15",
"trx_id": "490ad935e5a9ccc9bef3cd91e744ce8c1839fe7b",
"trx_in_block": 7,
"virtual_op": 0
}steemdelegated 1.176 SP to @electroman2020/12/06 04:26:33
steemdelegated 1.176 SP to @electroman
2020/12/06 04:26:33
| delegatee | electroman |
| delegator | steem |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #49206389/Trx e94e18ace00c57117c0255f9509f27afc4de7cd8 |
View Raw JSON Data
{
"block": 49206389,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "1912.543513 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-06T04:26:33",
"trx_id": "e94e18ace00c57117c0255f9509f27afc4de7cd8",
"trx_in_block": 12,
"virtual_op": 0
}steemdelegated 5.246 SP to @electroman2020/12/05 14:27:30
steemdelegated 5.246 SP to @electroman
2020/12/05 14:27:30
| delegatee | electroman |
| delegator | steem |
| vesting shares | 8532.136798 VESTS |
| Transaction Info | Block #49189921/Trx 89ddd9e549359d2539b2c94c7c732fe592fbbb17 |
View Raw JSON Data
{
"block": 49189921,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "8532.136798 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-05T14:27:30",
"trx_id": "89ddd9e549359d2539b2c94c7c732fe592fbbb17",
"trx_in_block": 3,
"virtual_op": 0
}steemdelegated 1.181 SP to @electroman2020/11/02 14:54:24
steemdelegated 1.181 SP to @electroman
2020/11/02 14:54:24
| delegatee | electroman |
| delegator | steem |
| vesting shares | 1920.017158 VESTS |
| Transaction Info | Block #48256935/Trx 8d6522d5d91dfd8fca5ff7a786fe95274a7d58d1 |
View Raw JSON Data
{
"block": 48256935,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "1920.017158 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-11-02T14:54:24",
"trx_id": "8d6522d5d91dfd8fca5ff7a786fe95274a7d58d1",
"trx_in_block": 1,
"virtual_op": 0
}steemdelegated 5.371 SP to @electroman2020/05/09 05:23:27
steemdelegated 5.371 SP to @electroman
2020/05/09 05:23:27
| delegatee | electroman |
| delegator | steem |
| vesting shares | 8734.942157 VESTS |
| Transaction Info | Block #43216626/Trx c690c47cb6c4a954715140dc481730e3ee2a544c |
View Raw JSON Data
{
"block": 43216626,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "8734.942157 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-09T05:23:27",
"trx_id": "c690c47cb6c4a954715140dc481730e3ee2a544c",
"trx_in_block": 12,
"virtual_op": 0
}steemdelegated 1.201 SP to @electroman2020/05/08 08:56:15
steemdelegated 1.201 SP to @electroman
2020/05/08 08:56:15
| delegatee | electroman |
| delegator | steem |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #43192661/Trx f32f6a26326b5499acbfc6069c8d37deb6e7b869 |
View Raw JSON Data
{
"block": 43192661,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "1953.311140 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-08T08:56:15",
"trx_id": "f32f6a26326b5499acbfc6069c8d37deb6e7b869",
"trx_in_block": 11,
"virtual_op": 0
}steemdelegated 5.379 SP to @electroman2020/04/15 21:24:09
steemdelegated 5.379 SP to @electroman
2020/04/15 21:24:09
| delegatee | electroman |
| delegator | steem |
| vesting shares | 8747.919576 VESTS |
| Transaction Info | Block #42562312/Trx 619aa7db9e156bf75e20c50f8ed415aec7ef910f |
View Raw JSON Data
{
"block": 42562312,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "8747.919576 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-04-15T21:24:09",
"trx_id": "619aa7db9e156bf75e20c50f8ed415aec7ef910f",
"trx_in_block": 14,
"virtual_op": 0
}2019/08/30 15:05:39
2019/08/30 15:05:39
| author | steemitboard |
| body | Congratulations @electroman! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@electroman/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/@electroman) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=electroman)_</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 | electroman |
| parent permlink | 6taapu-8-main-7 |
| permlink | steemitboard-notify-electroman-20190830t150538000z |
| title | |
| Transaction Info | Block #36003002/Trx 67aa83528204f4b2d96d8e9b374c7afa6b4b8e14 |
View Raw JSON Data
{
"block": 36003002,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @electroman! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@electroman/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/@electroman) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=electroman)_</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": "electroman",
"parent_permlink": "6taapu-8-main-7",
"permlink": "steemitboard-notify-electroman-20190830t150538000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2019-08-30T15:05:39",
"trx_id": "67aa83528204f4b2d96d8e9b374c7afa6b4b8e14",
"trx_in_block": 5,
"virtual_op": 0
}steemdelegated 5.499 SP to @electroman2019/05/12 14:39:00
steemdelegated 5.499 SP to @electroman
2019/05/12 14:39:00
| delegatee | electroman |
| delegator | steem |
| vesting shares | 8943.542381 VESTS |
| Transaction Info | Block #32845183/Trx 86bd62deab4d187fe1ef2f8bacb5069f827aad09 |
View Raw JSON Data
{
"block": 32845183,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "8943.542381 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2019-05-12T14:39:00",
"trx_id": "86bd62deab4d187fe1ef2f8bacb5069f827aad09",
"trx_in_block": 13,
"virtual_op": 0
}2018/08/30 14:55:57
2018/08/30 14:55:57
| author | steemitboard |
| body | Congratulations @electroman! You have received a personal award! [](http://steemitboard.com/@electroman) 1 Year on Steemit <sub>_Click on the badge to view your Board of Honor._</sub> > Do you like [SteemitBoard's project](https://steemit.com/@steemitboard)? Then **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| parent author | electroman |
| parent permlink | 6taapu-8-main-7 |
| permlink | steemitboard-notify-electroman-20180830t145559000z |
| title | |
| Transaction Info | Block #25523833/Trx 0629fc41c44cc6674c0cbb040267d91e20e0adf9 |
View Raw JSON Data
{
"block": 25523833,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @electroman! You have received a personal award!\n\n[](http://steemitboard.com/@electroman) 1 Year on Steemit\n<sub>_Click on the badge to view your Board of Honor._</sub>\n\n\n> Do you like [SteemitBoard's project](https://steemit.com/@steemitboard)? Then **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
"parent_author": "electroman",
"parent_permlink": "6taapu-8-main-7",
"permlink": "steemitboard-notify-electroman-20180830t145559000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T14:55:57",
"trx_id": "0629fc41c44cc6674c0cbb040267d91e20e0adf9",
"trx_in_block": 32,
"virtual_op": 0
}steemdelegated 5.622 SP to @electroman2018/05/16 20:15:45
steemdelegated 5.622 SP to @electroman
2018/05/16 20:15:45
| delegatee | electroman |
| delegator | steem |
| vesting shares | 9143.094816 VESTS |
| Transaction Info | Block #22489816/Trx 241e0b6b280d81506f966b76c2cf6638d03316f0 |
View Raw JSON Data
{
"block": 22489816,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "9143.094816 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-05-16T20:15:45",
"trx_id": "241e0b6b280d81506f966b76c2cf6638d03316f0",
"trx_in_block": 5,
"virtual_op": 0
}steemdelegated 18.217 SP to @electroman2018/02/22 12:19:48
steemdelegated 18.217 SP to @electroman
2018/02/22 12:19:48
| delegatee | electroman |
| delegator | steem |
| vesting shares | 29625.019817 VESTS |
| Transaction Info | Block #20092424/Trx d7da0e5e285a7cdc7bab552c604185be2177682a |
View Raw JSON Data
{
"block": 20092424,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "29625.019817 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-22T12:19:48",
"trx_id": "d7da0e5e285a7cdc7bab552c604185be2177682a",
"trx_in_block": 4,
"virtual_op": 0
}jiangonemmupvoted (100.00%) @electroman / 5-main-42018/02/07 12:49:21
jiangonemmupvoted (100.00%) @electroman / 5-main-4
2018/02/07 12:49:21
| author | electroman |
| permlink | 5-main-4 |
| voter | jiangonemm |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19661494/Trx 35ec785d364f2eb38f74233a6be7f4c32544a6e7 |
View Raw JSON Data
{
"block": 19661494,
"op": [
"vote",
{
"author": "electroman",
"permlink": "5-main-4",
"voter": "jiangonemm",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-02-07T12:49:21",
"trx_id": "35ec785d364f2eb38f74233a6be7f4c32544a6e7",
"trx_in_block": 56,
"virtual_op": 0
}jiangonemmupvoted (100.00%) @electroman / 4-main-32018/02/07 12:49:15
jiangonemmupvoted (100.00%) @electroman / 4-main-3
2018/02/07 12:49:15
| author | electroman |
| permlink | 4-main-3 |
| voter | jiangonemm |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19661492/Trx 93e436ef583f2310ea4d1b099ea489ad3475efe5 |
View Raw JSON Data
{
"block": 19661492,
"op": [
"vote",
{
"author": "electroman",
"permlink": "4-main-3",
"voter": "jiangonemm",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-02-07T12:49:15",
"trx_id": "93e436ef583f2310ea4d1b099ea489ad3475efe5",
"trx_in_block": 53,
"virtual_op": 0
}2018/02/07 11:27:24
2018/02/07 11:27:24
| author | jiangonemm |
| body | 感谢你的分享,受益良多。 |
| json metadata | {"tags":["btc"],"app":"steemit/0.1"} |
| parent author | electroman |
| parent permlink | 2-main-1 |
| permlink | re-electroman-2-main-1-20180207t112725654z |
| title | |
| Transaction Info | Block #19659859/Trx 5ff8fb79809b0165f0483c5f8f5ca3ac819e3218 |
View Raw JSON Data
{
"block": 19659859,
"op": [
"comment",
{
"author": "jiangonemm",
"body": "感谢你的分享,受益良多。",
"json_metadata": "{\"tags\":[\"btc\"],\"app\":\"steemit/0.1\"}",
"parent_author": "electroman",
"parent_permlink": "2-main-1",
"permlink": "re-electroman-2-main-1-20180207t112725654z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-02-07T11:27:24",
"trx_id": "5ff8fb79809b0165f0483c5f8f5ca3ac819e3218",
"trx_in_block": 51,
"virtual_op": 0
}jiangonemmupvoted (100.00%) @electroman / 3-main-22018/02/07 11:26:33
jiangonemmupvoted (100.00%) @electroman / 3-main-2
2018/02/07 11:26:33
| author | electroman |
| permlink | 3-main-2 |
| voter | jiangonemm |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19659842/Trx 390abbd9d9e541c4052787025b7de67add58f534 |
View Raw JSON Data
{
"block": 19659842,
"op": [
"vote",
{
"author": "electroman",
"permlink": "3-main-2",
"voter": "jiangonemm",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-02-07T11:26:33",
"trx_id": "390abbd9d9e541c4052787025b7de67add58f534",
"trx_in_block": 18,
"virtual_op": 0
}jiangonemmupvoted (100.00%) @electroman / 2-main-12018/02/07 10:00:51
jiangonemmupvoted (100.00%) @electroman / 2-main-1
2018/02/07 10:00:51
| author | electroman |
| permlink | 2-main-1 |
| voter | jiangonemm |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19658130/Trx 615691574bab56f34333ed05b1e7e966a54b87bf |
View Raw JSON Data
{
"block": 19658130,
"op": [
"vote",
{
"author": "electroman",
"permlink": "2-main-1",
"voter": "jiangonemm",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-02-07T10:00:51",
"trx_id": "615691574bab56f34333ed05b1e7e966a54b87bf",
"trx_in_block": 12,
"virtual_op": 0
}2018/02/02 21:29:42
2018/02/02 21:29:42
| author | steemitboard |
| body | Congratulations @electroman! You have completed some achievement on Steemit and have been rewarded with new badge(s) : [](http://steemitboard.com/@electroman) You got your First payout 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 | electroman |
| parent permlink | 6taapu-8-main-7 |
| permlink | steemitboard-notify-electroman-20180202t212944000z |
| title | |
| Transaction Info | Block #19528080/Trx e698db4cd41eaa5a6e6ede12bcbef187238f20ab |
View Raw JSON Data
{
"block": 19528080,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @electroman! You have completed some achievement on Steemit and have been rewarded with new badge(s) :\n\n[](http://steemitboard.com/@electroman) You got your First payout\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": "electroman",
"parent_permlink": "6taapu-8-main-7",
"permlink": "steemitboard-notify-electroman-20180202t212944000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T21:29:42",
"trx_id": "e698db4cd41eaa5a6e6ede12bcbef187238f20ab",
"trx_in_block": 58,
"virtual_op": 0
}electromanreceived 2.280 SP author reward for @electroman / 5nha4v-8-main-72017/11/05 15:17:24
electromanreceived 2.280 SP author reward for @electroman / 5nha4v-8-main-7
2017/11/05 15:17:24
| author | electroman |
| permlink | 5nha4v-8-main-7 |
| sbd payout | 0.000 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 3707.292270 VESTS |
| Transaction Info | Block #16959070/Virtual Operation #4 |
View Raw JSON Data
{
"block": 16959070,
"op": [
"author_reward",
{
"author": "electroman",
"permlink": "5nha4v-8-main-7",
"sbd_payout": "0.000 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "3707.292270 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2017-11-05T15:17:24",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 4
}electromanreceived 2.286 SP author reward for @electroman / 8-main-72017/11/05 15:11:42
electromanreceived 2.286 SP author reward for @electroman / 8-main-7
2017/11/05 15:11:42
| author | electroman |
| permlink | 8-main-7 |
| sbd payout | 0.000 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 3717.568230 VESTS |
| Transaction Info | Block #16958956/Virtual Operation #4 |
View Raw JSON Data
{
"block": 16958956,
"op": [
"author_reward",
{
"author": "electroman",
"permlink": "8-main-7",
"sbd_payout": "0.000 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "3717.568230 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2017-11-05T15:11:42",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 4
}steemitboardupvoted (1.00%) @electroman / 6taapu-8-main-72017/10/30 12:52:03
steemitboardupvoted (1.00%) @electroman / 6taapu-8-main-7
2017/10/30 12:52:03
| author | electroman |
| permlink | 6taapu-8-main-7 |
| voter | steemitboard |
| weight | 100 (1.00%) |
| Transaction Info | Block #16783397/Trx e62490453493d2b9d8366c614482aa3b94ce2865 |
View Raw JSON Data
{
"block": 16783397,
"op": [
"vote",
{
"author": "electroman",
"permlink": "6taapu-8-main-7",
"voter": "steemitboard",
"weight": 100
}
],
"op_in_trx": 0,
"timestamp": "2017-10-30T12:52:03",
"trx_id": "e62490453493d2b9d8366c614482aa3b94ce2865",
"trx_in_block": 3,
"virtual_op": 0
}2017/10/30 12:52:00
2017/10/30 12:52:00
| author | steemitboard |
| body | Congratulations @electroman! You have completed some achievement on Steemit and have been rewarded with new badge(s) : [](http://steemitboard.com/@electroman) Award for the number of posts published [](http://steemitboard.com/@electroman) Award for the number of upvotes received 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 | electroman |
| parent permlink | 6taapu-8-main-7 |
| permlink | steemitboard-notify-electroman-20171030t125202000z |
| title | |
| Transaction Info | Block #16783396/Trx 68295814ae7d1e690fbb60c972f11b5522a0c538 |
View Raw JSON Data
{
"block": 16783396,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @electroman! You have completed some achievement on Steemit and have been rewarded with new badge(s) :\n\n[](http://steemitboard.com/@electroman) Award for the number of posts published\n[](http://steemitboard.com/@electroman) Award for the number of upvotes received\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": "electroman",
"parent_permlink": "6taapu-8-main-7",
"permlink": "steemitboard-notify-electroman-20171030t125202000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2017-10-30T12:52:00",
"trx_id": "68295814ae7d1e690fbb60c972f11b5522a0c538",
"trx_in_block": 17,
"virtual_op": 0
}2017/10/30 11:49:33
2017/10/30 11:49:33
| author | brysj22952 |
| body | 学习了,感谢! |
| json metadata | {"tags":["btc"],"app":"steemit/0.1"} |
| parent author | electroman |
| parent permlink | 6taapu-8-main-7 |
| permlink | re-electroman-6taapu-8-main-7-20171030t114902733z |
| title | |
| Transaction Info | Block #16782147/Trx 105086753c73236ce305a0bb3d1ea2d309b882a8 |
View Raw JSON Data
{
"block": 16782147,
"op": [
"comment",
{
"author": "brysj22952",
"body": "学习了,感谢!",
"json_metadata": "{\"tags\":[\"btc\"],\"app\":\"steemit/0.1\"}",
"parent_author": "electroman",
"parent_permlink": "6taapu-8-main-7",
"permlink": "re-electroman-6taapu-8-main-7-20171030t114902733z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2017-10-30T11:49:33",
"trx_id": "105086753c73236ce305a0bb3d1ea2d309b882a8",
"trx_in_block": 5,
"virtual_op": 0
}brysj22952upvoted (100.00%) @electroman / 6taapu-8-main-72017/10/30 11:49:15
brysj22952upvoted (100.00%) @electroman / 6taapu-8-main-7
2017/10/30 11:49:15
| author | electroman |
| permlink | 6taapu-8-main-7 |
| voter | brysj22952 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #16782141/Trx 76270621a5236720b1b14f9b0f6fab348026821d |
View Raw JSON Data
{
"block": 16782141,
"op": [
"vote",
{
"author": "electroman",
"permlink": "6taapu-8-main-7",
"voter": "brysj22952",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-30T11:49:15",
"trx_id": "76270621a5236720b1b14f9b0f6fab348026821d",
"trx_in_block": 4,
"virtual_op": 0
}redteaupvoted (100.00%) @electroman / 8-main-72017/10/29 23:40:36
redteaupvoted (100.00%) @electroman / 8-main-7
2017/10/29 23:40:36
| author | electroman |
| permlink | 8-main-7 |
| voter | redtea |
| weight | 10000 (100.00%) |
| Transaction Info | Block #16767571/Trx a0b9864bd172fbf3078830040becb4012efd5c52 |
View Raw JSON Data
{
"block": 16767571,
"op": [
"vote",
{
"author": "electroman",
"permlink": "8-main-7",
"voter": "redtea",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-29T23:40:36",
"trx_id": "a0b9864bd172fbf3078830040becb4012efd5c52",
"trx_in_block": 5,
"virtual_op": 0
}hr1upvoted (20.00%) @electroman / 5nha4v-8-main-72017/10/29 15:46:30
hr1upvoted (20.00%) @electroman / 5nha4v-8-main-7
2017/10/29 15:46:30
| author | electroman |
| permlink | 5nha4v-8-main-7 |
| voter | hr1 |
| weight | 2000 (20.00%) |
| Transaction Info | Block #16758090/Trx 474806ae221af1e304530dad7e1a0cf5f98c8b8f |
View Raw JSON Data
{
"block": 16758090,
"op": [
"vote",
{
"author": "electroman",
"permlink": "5nha4v-8-main-7",
"voter": "hr1",
"weight": 2000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-29T15:46:30",
"trx_id": "474806ae221af1e304530dad7e1a0cf5f98c8b8f",
"trx_in_block": 10,
"virtual_op": 0
}hr1upvoted (20.00%) @electroman / 8-main-72017/10/29 15:40:51
hr1upvoted (20.00%) @electroman / 8-main-7
2017/10/29 15:40:51
| author | electroman |
| permlink | 8-main-7 |
| voter | hr1 |
| weight | 2000 (20.00%) |
| Transaction Info | Block #16757977/Trx e55f58eed89e89489e858b6516408c0c8828491b |
View Raw JSON Data
{
"block": 16757977,
"op": [
"vote",
{
"author": "electroman",
"permlink": "8-main-7",
"voter": "hr1",
"weight": 2000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-29T15:40:51",
"trx_id": "e55f58eed89e89489e858b6516408c0c8828491b",
"trx_in_block": 2,
"virtual_op": 0
}electromanupdated options for 6taapu-8-main-72017/10/29 15:22:45
electromanupdated options for 6taapu-8-main-7
2017/10/29 15:22:45
| allow curation rewards | true |
| allow votes | true |
| author | electroman |
| extensions | [] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 0 |
| permlink | 6taapu-8-main-7 |
| Transaction Info | Block #16757615/Trx e806dbb3557053504a281ac3b37858885fc156c4 |
View Raw JSON Data
{
"block": 16757615,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "electroman",
"extensions": [],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 0,
"permlink": "6taapu-8-main-7"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-29T15:22:45",
"trx_id": "e806dbb3557053504a281ac3b37858885fc156c4",
"trx_in_block": 0,
"virtual_op": 0
}electromanpublished a new post: 6taapu-8-main-72017/10/29 15:22:45
electromanpublished a new post: 6taapu-8-main-7
2017/10/29 15:22:45
| author | electroman |
| body | 2)读取配置文件:读取配置文件,如果配置文件出错,则弹出错误提示框,并且程序退出 try { gArgs.ReadConfigFile(gArgs.GetArg("-conf",BITCOIN_CONF_FILENAME)); } catch (const std::exception&e) { fprintf(stderr,"Error reading configuration file: %s\n",e.what()); returnfalse; } 该函数流程图如下:  分析1:BITCOIN_CONF_FILENAME,宏定义在util.cpp文件中,定义如下: const char * const BITCOIN_CONF_FILENAME = "bitcoin.conf"; bitcoin.conf是客户端的配置文件,位置是bitcoin/contrib/init,该文件定义了很多env,如下 env BITCOIND_BIN="/usr/bin/bitcoind" env BITCOIND_USER="bitcoin" env BITCOIND_GROUP="bitcoin" env BITCOIND_PIDDIR="/var/run/bitcoind" envBITCOIND_PIDFILE="/var/run/bitcoind/bitcoind.pid" envBITCOIND_CONFIGFILE="/etc/bitcoin/bitcoin.conf" env BITCOIND_DATADIR="/var/lib/bitcoind" 分析2:GetArg函数  由函数可以看出,如果找到conf文件,则用这个conf文件,如果没有找到,则用默认文件。 分析3:ReadConfigFile voidArgsManager::ReadConfigFile(const std::string& confPath) { fs::ifstream streamConfig(GetConfigFile(confPath)); if (!streamConfig.good()) return; // No bitcoin.conf file is OK { LOCK(cs_args); std::set setOptions; setOptions.insert("*"); for(boost::program_options::detail::config_file_iterator it(streamConfig,setOptions), end; it != end; ++it) { // Don't overwrite existingsettings so command line settings override bitcoin.conf std::string strKey =std::string("-") + it->string_key; std::string strValue =it->value[0]; InterpretNegativeSetting(strKey,strValue); if (mapArgs.count(strKey) == 0) mapArgs[strKey] = strValue; mapMultiArgs[strKey].push_back(strValue); } } // If datadir is changed in .conf file: ClearDatadirCache(); } fs::ifstream把硬盘上的文件读取到内存中,定义一个文件流streamConfig ifstream的详细解释见:http://www.cplusplus.com/reference/fstream/ifstream/ streamConfig读取的文件是GetConfigFile(confPath),我们再看看这个函数: fs::pathGetConfigFile(const std::string& confPath) { fs::path pathConfigFile(confPath); if (!pathConfigFile.is_complete()) pathConfigFile = GetDataDir(false) /pathConfigFile; return pathConfigFile; } 读取confPath,也就是BITCOIN_CONF_FILENAME文件,判断文件是否完整,如果不完整则读取默认的配置文件,GetDataDir函数见 [比特币源码研读(7)-main函数(6)](http://www.jianshu.com/p/0df718dffdac) 紧接着就开始判断这个文件是否为conf文件,如果不是则直接退出 if(!streamConfig.good()) return; // No bitcoin.conf file is OK 如果判断文件正常,开始执行for循环,读取配置文件的信息,写到mapArgs和mapMultiArgs中。 最后,清空文件路径:函数最后是为防止配置文件中设置了数据目录参数datadir,通过ClearDatadirCache()函数将数据文件路径参数设置为空目录,这样下次进入GetDataDir()时,我们将会根据新的datadir创建数据目录。 // If datadir is changed in .conffile: ClearDatadirCache(); ////////////////////////读取配置文件函数分析完毕//////////////////// 区块链研习社比特币源码研读班 electroman 以下是广告: 我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。  |
| json metadata | {"tags":["btc","cn"],"image":["https://steemitimages.com/DQmNRRvKyVsGE7bCdhh1yQKFX2AaY4GzX6f93wcoA8dVpvA/1.png","https://steemitimages.com/DQmPSXL3vYM7mFFJTZrHraM6aNN5YE1eyRxndg3bFMHvU9Y/2.png","https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png"],"links":["http://www.cplusplus.com/reference/fstream/ifstream/","http://www.jianshu.com/p/0df718dffdac"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | btc |
| permlink | 6taapu-8-main-7 |
| title | 比特币源码研读(8)-main函数(7) |
| Transaction Info | Block #16757615/Trx e806dbb3557053504a281ac3b37858885fc156c4 |
View Raw JSON Data
{
"block": 16757615,
"op": [
"comment",
{
"author": "electroman",
"body": "2)读取配置文件:读取配置文件,如果配置文件出错,则弹出错误提示框,并且程序退出\n\ntry\n\n{\n\n gArgs.ReadConfigFile(gArgs.GetArg(\"-conf\",BITCOIN_CONF_FILENAME));\n\n}\ncatch (const std::exception&e)\n\n{\n\n fprintf(stderr,\"Error reading configuration file: %s\\n\",e.what());\n\n returnfalse;\n\n}\n该函数流程图如下:\n\n\n\n\n\n分析1:BITCOIN_CONF_FILENAME,宏定义在util.cpp文件中,定义如下:\n\nconst char * const\n\nBITCOIN_CONF_FILENAME = \"bitcoin.conf\";\nbitcoin.conf是客户端的配置文件,位置是bitcoin/contrib/init,该文件定义了很多env,如下\n\nenv BITCOIND_BIN=\"/usr/bin/bitcoind\"\n\nenv BITCOIND_USER=\"bitcoin\"\n\nenv BITCOIND_GROUP=\"bitcoin\"\n\nenv BITCOIND_PIDDIR=\"/var/run/bitcoind\"\n\nenvBITCOIND_PIDFILE=\"/var/run/bitcoind/bitcoind.pid\"\n\nenvBITCOIND_CONFIGFILE=\"/etc/bitcoin/bitcoin.conf\"\n\nenv BITCOIND_DATADIR=\"/var/lib/bitcoind\"\n\n分析2:GetArg函数\n\n\n\n\n由函数可以看出,如果找到conf文件,则用这个conf文件,如果没有找到,则用默认文件。\n\n分析3:ReadConfigFile\n\nvoidArgsManager::ReadConfigFile(const std::string& confPath)\n\n{\n\n fs::ifstream streamConfig(GetConfigFile(confPath));\n\n if (!streamConfig.good())\n\n return; // No bitcoin.conf file is OK\n\n{\n\nLOCK(cs_args);\n\nstd::set setOptions;\n\nsetOptions.insert(\"*\");\n\nfor(boost::program_options::detail::config_file_iterator it(streamConfig,setOptions), end; it != end; ++it)\n\n{\n\n// Don't overwrite existingsettings so command line settings override bitcoin.conf\n\nstd::string strKey =std::string(\"-\") + it->string_key;\n\nstd::string strValue =it->value[0];\n\nInterpretNegativeSetting(strKey,strValue);\n\nif (mapArgs.count(strKey) == 0)\n\nmapArgs[strKey] = strValue;\n\nmapMultiArgs[strKey].push_back(strValue);\n\n}\n}\n// If datadir is changed in .conf file:\n\nClearDatadirCache();\n\n}\nfs::ifstream把硬盘上的文件读取到内存中,定义一个文件流streamConfig\n\nifstream的详细解释见:http://www.cplusplus.com/reference/fstream/ifstream/\n\nstreamConfig读取的文件是GetConfigFile(confPath),我们再看看这个函数:\n\nfs::pathGetConfigFile(const std::string& confPath)\n\n{\n\nfs::path pathConfigFile(confPath);\n\nif (!pathConfigFile.is_complete())\n\npathConfigFile = GetDataDir(false) /pathConfigFile;\n\nreturn pathConfigFile;\n\n}\n读取confPath,也就是BITCOIN_CONF_FILENAME文件,判断文件是否完整,如果不完整则读取默认的配置文件,GetDataDir函数见 [比特币源码研读(7)-main函数(6)](http://www.jianshu.com/p/0df718dffdac)\n\n紧接着就开始判断这个文件是否为conf文件,如果不是则直接退出\n\nif(!streamConfig.good())\n\nreturn; // No bitcoin.conf file is OK\n如果判断文件正常,开始执行for循环,读取配置文件的信息,写到mapArgs和mapMultiArgs中。\n\n最后,清空文件路径:函数最后是为防止配置文件中设置了数据目录参数datadir,通过ClearDatadirCache()函数将数据文件路径参数设置为空目录,这样下次进入GetDataDir()时,我们将会根据新的datadir创建数据目录。\n\n// If datadir is changed in .conffile:\n\nClearDatadirCache();\n////////////////////////读取配置文件函数分析完毕////////////////////\n\n\n区块链研习社比特币源码研读班 electroman\n\n以下是广告:\n\n我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。\n\n\n",
"json_metadata": "{\"tags\":[\"btc\",\"cn\"],\"image\":[\"https://steemitimages.com/DQmNRRvKyVsGE7bCdhh1yQKFX2AaY4GzX6f93wcoA8dVpvA/1.png\",\"https://steemitimages.com/DQmPSXL3vYM7mFFJTZrHraM6aNN5YE1eyRxndg3bFMHvU9Y/2.png\",\"https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png\"],\"links\":[\"http://www.cplusplus.com/reference/fstream/ifstream/\",\"http://www.jianshu.com/p/0df718dffdac\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "btc",
"permlink": "6taapu-8-main-7",
"title": "比特币源码研读(8)-main函数(7)"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-29T15:22:45",
"trx_id": "e806dbb3557053504a281ac3b37858885fc156c4",
"trx_in_block": 0,
"virtual_op": 0
}electromanupdated options for 5nha4v-8-main-72017/10/29 15:17:24
electromanupdated options for 5nha4v-8-main-7
2017/10/29 15:17:24
| allow curation rewards | true |
| allow votes | true |
| author | electroman |
| extensions | [] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 0 |
| permlink | 5nha4v-8-main-7 |
| Transaction Info | Block #16757508/Trx f110f9bc6dd4b74d7b195d17407156e06075f624 |
View Raw JSON Data
{
"block": 16757508,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "electroman",
"extensions": [],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 0,
"permlink": "5nha4v-8-main-7"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-29T15:17:24",
"trx_id": "f110f9bc6dd4b74d7b195d17407156e06075f624",
"trx_in_block": 3,
"virtual_op": 0
}electromanpublished a new post: 5nha4v-8-main-72017/10/29 15:17:24
electromanpublished a new post: 5nha4v-8-main-7
2017/10/29 15:17:24
| author | electroman |
| body | 2)读取配置文件:读取配置文件,如果配置文件出错,则弹出错误提示框,并且程序退出 try { gArgs.ReadConfigFile(gArgs.GetArg("-conf",BITCOIN_CONF_FILENAME)); } catch (const std::exception&e) { fprintf(stderr,"Error reading configuration file: %s\n",e.what()); returnfalse; } 该函数流程图如下:  分析1:BITCOIN_CONF_FILENAME,宏定义在util.cpp文件中,定义如下: const char * const BITCOIN_CONF_FILENAME = "bitcoin.conf"; bitcoin.conf是客户端的配置文件,位置是bitcoin/contrib/init,该文件定义了很多env,如下 env BITCOIND_BIN="/usr/bin/bitcoind" env BITCOIND_USER="bitcoin" env BITCOIND_GROUP="bitcoin" env BITCOIND_PIDDIR="/var/run/bitcoind" envBITCOIND_PIDFILE="/var/run/bitcoind/bitcoind.pid" envBITCOIND_CONFIGFILE="/etc/bitcoin/bitcoin.conf" env BITCOIND_DATADIR="/var/lib/bitcoind" 分析2:GetArg函数  由函数可以看出,如果找到conf文件,则用这个conf文件,如果没有找到,则用默认文件。 分析3:ReadConfigFile voidArgsManager::ReadConfigFile(const std::string& confPath) { fs::ifstream streamConfig(GetConfigFile(confPath)); if (!streamConfig.good()) return; // No bitcoin.conf file is OK { LOCK(cs_args); std::set setOptions; setOptions.insert("*"); for(boost::program_options::detail::config_file_iterator it(streamConfig,setOptions), end; it != end; ++it) { // Don't overwrite existingsettings so command line settings override bitcoin.conf std::string strKey =std::string("-") + it->string_key; std::string strValue =it->value[0]; InterpretNegativeSetting(strKey,strValue); if (mapArgs.count(strKey) == 0) mapArgs[strKey] = strValue; mapMultiArgs[strKey].push_back(strValue); } } // If datadir is changed in .conf file: ClearDatadirCache(); } fs::ifstream把硬盘上的文件读取到内存中,定义一个文件流streamConfig ifstream的详细解释见:http://www.cplusplus.com/reference/fstream/ifstream/ streamConfig读取的文件是GetConfigFile(confPath),我们再看看这个函数: fs::pathGetConfigFile(const std::string& confPath) { fs::path pathConfigFile(confPath); if (!pathConfigFile.is_complete()) pathConfigFile = GetDataDir(false) /pathConfigFile; return pathConfigFile; } 读取confPath,也就是BITCOIN_CONF_FILENAME文件,判断文件是否完整,如果不完整则读取默认的配置文件,GetDataDir函数见比特币源码研读(7)-main函数(6)(http://www.jianshu.com/p/0df718dffdac) 紧接着就开始判断这个文件是否为conf文件,如果不是则直接退出 if(!streamConfig.good()) return; // No bitcoin.conf file is OK 如果判断文件正常,开始执行for循环,读取配置文件的信息,写到mapArgs和mapMultiArgs中。 最后,清空文件路径:函数最后是为防止配置文件中设置了数据目录参数datadir,通过ClearDatadirCache()函数将数据文件路径参数设置为空目录,这样下次进入GetDataDir()时,我们将会根据新的datadir创建数据目录。 // If datadir is changed in .conffile: ClearDatadirCache(); ////////////////////////读取配置文件函数分析完毕//////////////////// 区块链研习社比特币源码研读班 electroman 以下是广告: 我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。  |
| json metadata | {"tags":["btc","cn"],"image":["https://steemitimages.com/DQmNRRvKyVsGE7bCdhh1yQKFX2AaY4GzX6f93wcoA8dVpvA/1.png","https://steemitimages.com/DQmPSXL3vYM7mFFJTZrHraM6aNN5YE1eyRxndg3bFMHvU9Y/2.png","https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png"],"links":["http://www.cplusplus.com/reference/fstream/ifstream/","http://www.jianshu.com/p/0df718dffdac"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | btc |
| permlink | 5nha4v-8-main-7 |
| title | 比特币源码研读(8)-main函数(7) |
| Transaction Info | Block #16757508/Trx f110f9bc6dd4b74d7b195d17407156e06075f624 |
View Raw JSON Data
{
"block": 16757508,
"op": [
"comment",
{
"author": "electroman",
"body": "2)读取配置文件:读取配置文件,如果配置文件出错,则弹出错误提示框,并且程序退出\n\ntry\n\n{\n\n gArgs.ReadConfigFile(gArgs.GetArg(\"-conf\",BITCOIN_CONF_FILENAME));\n\n}\ncatch (const std::exception&e)\n\n{\n\n fprintf(stderr,\"Error reading configuration file: %s\\n\",e.what());\n\n returnfalse;\n\n}\n该函数流程图如下:\n\n\n\n\n\n分析1:BITCOIN_CONF_FILENAME,宏定义在util.cpp文件中,定义如下:\n\nconst char * const\n\nBITCOIN_CONF_FILENAME = \"bitcoin.conf\";\nbitcoin.conf是客户端的配置文件,位置是bitcoin/contrib/init,该文件定义了很多env,如下\n\nenv BITCOIND_BIN=\"/usr/bin/bitcoind\"\n\nenv BITCOIND_USER=\"bitcoin\"\n\nenv BITCOIND_GROUP=\"bitcoin\"\n\nenv BITCOIND_PIDDIR=\"/var/run/bitcoind\"\n\nenvBITCOIND_PIDFILE=\"/var/run/bitcoind/bitcoind.pid\"\n\nenvBITCOIND_CONFIGFILE=\"/etc/bitcoin/bitcoin.conf\"\n\nenv BITCOIND_DATADIR=\"/var/lib/bitcoind\"\n\n分析2:GetArg函数\n\n\n\n\n由函数可以看出,如果找到conf文件,则用这个conf文件,如果没有找到,则用默认文件。\n\n分析3:ReadConfigFile\n\nvoidArgsManager::ReadConfigFile(const std::string& confPath)\n\n{\n\n fs::ifstream streamConfig(GetConfigFile(confPath));\n\n if (!streamConfig.good())\n\n return; // No bitcoin.conf file is OK\n\n{\n\nLOCK(cs_args);\n\nstd::set setOptions;\n\nsetOptions.insert(\"*\");\n\nfor(boost::program_options::detail::config_file_iterator it(streamConfig,setOptions), end; it != end; ++it)\n\n{\n\n// Don't overwrite existingsettings so command line settings override bitcoin.conf\n\nstd::string strKey =std::string(\"-\") + it->string_key;\n\nstd::string strValue =it->value[0];\n\nInterpretNegativeSetting(strKey,strValue);\n\nif (mapArgs.count(strKey) == 0)\n\nmapArgs[strKey] = strValue;\n\nmapMultiArgs[strKey].push_back(strValue);\n\n}\n}\n// If datadir is changed in .conf file:\n\nClearDatadirCache();\n\n}\nfs::ifstream把硬盘上的文件读取到内存中,定义一个文件流streamConfig\n\nifstream的详细解释见:http://www.cplusplus.com/reference/fstream/ifstream/\n\nstreamConfig读取的文件是GetConfigFile(confPath),我们再看看这个函数:\n\nfs::pathGetConfigFile(const std::string& confPath)\n\n{\n\nfs::path pathConfigFile(confPath);\n\nif (!pathConfigFile.is_complete())\n\npathConfigFile = GetDataDir(false) /pathConfigFile;\n\nreturn pathConfigFile;\n\n}\n读取confPath,也就是BITCOIN_CONF_FILENAME文件,判断文件是否完整,如果不完整则读取默认的配置文件,GetDataDir函数见比特币源码研读(7)-main函数(6)(http://www.jianshu.com/p/0df718dffdac)\n\n紧接着就开始判断这个文件是否为conf文件,如果不是则直接退出\n\nif(!streamConfig.good())\n\nreturn; // No bitcoin.conf file is OK\n如果判断文件正常,开始执行for循环,读取配置文件的信息,写到mapArgs和mapMultiArgs中。\n\n最后,清空文件路径:函数最后是为防止配置文件中设置了数据目录参数datadir,通过ClearDatadirCache()函数将数据文件路径参数设置为空目录,这样下次进入GetDataDir()时,我们将会根据新的datadir创建数据目录。\n\n// If datadir is changed in .conffile:\n\nClearDatadirCache();\n////////////////////////读取配置文件函数分析完毕////////////////////\n\n\n区块链研习社比特币源码研读班 electroman\n\n以下是广告:\n\n我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。\n\n\n",
"json_metadata": "{\"tags\":[\"btc\",\"cn\"],\"image\":[\"https://steemitimages.com/DQmNRRvKyVsGE7bCdhh1yQKFX2AaY4GzX6f93wcoA8dVpvA/1.png\",\"https://steemitimages.com/DQmPSXL3vYM7mFFJTZrHraM6aNN5YE1eyRxndg3bFMHvU9Y/2.png\",\"https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png\"],\"links\":[\"http://www.cplusplus.com/reference/fstream/ifstream/\",\"http://www.jianshu.com/p/0df718dffdac\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "btc",
"permlink": "5nha4v-8-main-7",
"title": "比特币源码研读(8)-main函数(7)"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-29T15:17:24",
"trx_id": "f110f9bc6dd4b74d7b195d17407156e06075f624",
"trx_in_block": 3,
"virtual_op": 0
}electromanupdated options for 8-main-72017/10/29 15:11:42
electromanupdated options for 8-main-7
2017/10/29 15:11:42
| allow curation rewards | true |
| allow votes | true |
| author | electroman |
| extensions | [] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 0 |
| permlink | 8-main-7 |
| Transaction Info | Block #16757394/Trx 861c4235ae9fda97d6966f199bdfb7f6af1ffb14 |
View Raw JSON Data
{
"block": 16757394,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "electroman",
"extensions": [],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 0,
"permlink": "8-main-7"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-29T15:11:42",
"trx_id": "861c4235ae9fda97d6966f199bdfb7f6af1ffb14",
"trx_in_block": 11,
"virtual_op": 0
}electromanpublished a new post: 8-main-72017/10/29 15:11:42
electromanpublished a new post: 8-main-7
2017/10/29 15:11:42
| author | electroman |
| body | 2)读取配置文件:读取配置文件,如果配置文件出错,则弹出错误提示框,并且程序退出 try { gArgs.ReadConfigFile(gArgs.GetArg("-conf",BITCOIN_CONF_FILENAME)); } catch (const std::exception&e) { fprintf(stderr,"Error reading configuration file: %s\n",e.what()); returnfalse; } 该函数流程图如下:  分析1:BITCOIN_CONF_FILENAME,宏定义在util.cpp文件中,定义如下: const char * const BITCOIN_CONF_FILENAME = "bitcoin.conf"; bitcoin.conf是客户端的配置文件,位置是bitcoin/contrib/init,该文件定义了很多env,如下 env BITCOIND_BIN="/usr/bin/bitcoind" env BITCOIND_USER="bitcoin" env BITCOIND_GROUP="bitcoin" env BITCOIND_PIDDIR="/var/run/bitcoind" envBITCOIND_PIDFILE="/var/run/bitcoind/bitcoind.pid" envBITCOIND_CONFIGFILE="/etc/bitcoin/bitcoin.conf" env BITCOIND_DATADIR="/var/lib/bitcoind" 分析2:GetArg函数  由函数可以看出,如果找到conf文件,则用这个conf文件,如果没有找到,则用默认文件。 分析3:ReadConfigFile voidArgsManager::ReadConfigFile(const std::string& confPath) { fs::ifstream streamConfig(GetConfigFile(confPath)); if (!streamConfig.good()) return; // No bitcoin.conf file is OK { LOCK(cs_args); std::set setOptions; setOptions.insert("*"); for(boost::program_options::detail::config_file_iterator it(streamConfig,setOptions), end; it != end; ++it) { // Don't overwrite existingsettings so command line settings override bitcoin.conf std::string strKey =std::string("-") + it->string_key; std::string strValue =it->value[0]; InterpretNegativeSetting(strKey,strValue); if (mapArgs.count(strKey) == 0) mapArgs[strKey] = strValue; mapMultiArgs[strKey].push_back(strValue); } } // If datadir is changed in .conf file: ClearDatadirCache(); } fs::ifstream把硬盘上的文件读取到内存中,定义一个文件流streamConfig ifstream的详细解释见:http://www.cplusplus.com/reference/fstream/ifstream/ streamConfig读取的文件是GetConfigFile(confPath),我们再看看这个函数: fs::pathGetConfigFile(const std::string& confPath) { fs::path pathConfigFile(confPath); if (!pathConfigFile.is_complete()) pathConfigFile = GetDataDir(false) /pathConfigFile; return pathConfigFile; } 读取confPath,也就是BITCOIN_CONF_FILENAME文件,判断文件是否完整,如果不完整则读取默认的配置文件,GetDataDir函数见比特币源码研读(7)-main函数(6)(http://www.jianshu.com/p/0df718dffdac) 紧接着就开始判断这个文件是否为conf文件,如果不是则直接退出 if(!streamConfig.good()) return; // No bitcoin.conf file is OK 如果判断文件正常,开始执行for循环,读取配置文件的信息,写到mapArgs和mapMultiArgs中。 最后,清空文件路径:函数最后是为防止配置文件中设置了数据目录参数datadir,通过ClearDatadirCache()函数将数据文件路径参数设置为空目录,这样下次进入GetDataDir()时,我们将会根据新的datadir创建数据目录。 // If datadir is changed in .conffile: ClearDatadirCache(); ////////////////////////读取配置文件函数分析完毕//////////////////// 区块链研习社比特币源码研读班 electroman 以下是广告: 我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。  |
| json metadata | {"tags":["btc","cn"],"image":["https://steemitimages.com/DQmNRRvKyVsGE7bCdhh1yQKFX2AaY4GzX6f93wcoA8dVpvA/1.png","https://steemitimages.com/DQmPSXL3vYM7mFFJTZrHraM6aNN5YE1eyRxndg3bFMHvU9Y/2.png","https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png"],"links":["http://www.cplusplus.com/reference/fstream/ifstream/","http://www.jianshu.com/p/0df718dffdac"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | btc |
| permlink | 8-main-7 |
| title | 比特币源码研读(8)-main函数(7) |
| Transaction Info | Block #16757394/Trx 861c4235ae9fda97d6966f199bdfb7f6af1ffb14 |
View Raw JSON Data
{
"block": 16757394,
"op": [
"comment",
{
"author": "electroman",
"body": "2)读取配置文件:读取配置文件,如果配置文件出错,则弹出错误提示框,并且程序退出\n\ntry\n\n{\n\n gArgs.ReadConfigFile(gArgs.GetArg(\"-conf\",BITCOIN_CONF_FILENAME));\n\n}\ncatch (const std::exception&e)\n\n{\n\n fprintf(stderr,\"Error reading configuration file: %s\\n\",e.what());\n\n returnfalse;\n\n}\n该函数流程图如下:\n\n\n\n\n\n分析1:BITCOIN_CONF_FILENAME,宏定义在util.cpp文件中,定义如下:\n\nconst char * const\n\nBITCOIN_CONF_FILENAME = \"bitcoin.conf\";\nbitcoin.conf是客户端的配置文件,位置是bitcoin/contrib/init,该文件定义了很多env,如下\n\nenv BITCOIND_BIN=\"/usr/bin/bitcoind\"\n\nenv BITCOIND_USER=\"bitcoin\"\n\nenv BITCOIND_GROUP=\"bitcoin\"\n\nenv BITCOIND_PIDDIR=\"/var/run/bitcoind\"\n\nenvBITCOIND_PIDFILE=\"/var/run/bitcoind/bitcoind.pid\"\n\nenvBITCOIND_CONFIGFILE=\"/etc/bitcoin/bitcoin.conf\"\n\nenv BITCOIND_DATADIR=\"/var/lib/bitcoind\"\n\n分析2:GetArg函数\n\n\n\n\n由函数可以看出,如果找到conf文件,则用这个conf文件,如果没有找到,则用默认文件。\n\n分析3:ReadConfigFile\n\nvoidArgsManager::ReadConfigFile(const std::string& confPath)\n\n{\n\n fs::ifstream streamConfig(GetConfigFile(confPath));\n\n if (!streamConfig.good())\n\n return; // No bitcoin.conf file is OK\n\n{\n\nLOCK(cs_args);\n\nstd::set setOptions;\n\nsetOptions.insert(\"*\");\n\nfor(boost::program_options::detail::config_file_iterator it(streamConfig,setOptions), end; it != end; ++it)\n\n{\n\n// Don't overwrite existingsettings so command line settings override bitcoin.conf\n\nstd::string strKey =std::string(\"-\") + it->string_key;\n\nstd::string strValue =it->value[0];\n\nInterpretNegativeSetting(strKey,strValue);\n\nif (mapArgs.count(strKey) == 0)\n\nmapArgs[strKey] = strValue;\n\nmapMultiArgs[strKey].push_back(strValue);\n\n}\n}\n// If datadir is changed in .conf file:\n\nClearDatadirCache();\n\n}\nfs::ifstream把硬盘上的文件读取到内存中,定义一个文件流streamConfig\n\nifstream的详细解释见:http://www.cplusplus.com/reference/fstream/ifstream/\n\nstreamConfig读取的文件是GetConfigFile(confPath),我们再看看这个函数:\n\nfs::pathGetConfigFile(const std::string& confPath)\n\n{\n\nfs::path pathConfigFile(confPath);\n\nif (!pathConfigFile.is_complete())\n\npathConfigFile = GetDataDir(false) /pathConfigFile;\n\nreturn pathConfigFile;\n\n}\n读取confPath,也就是BITCOIN_CONF_FILENAME文件,判断文件是否完整,如果不完整则读取默认的配置文件,GetDataDir函数见比特币源码研读(7)-main函数(6)(http://www.jianshu.com/p/0df718dffdac)\n\n紧接着就开始判断这个文件是否为conf文件,如果不是则直接退出\n\nif(!streamConfig.good())\n\nreturn; // No bitcoin.conf file is OK\n如果判断文件正常,开始执行for循环,读取配置文件的信息,写到mapArgs和mapMultiArgs中。\n\n最后,清空文件路径:函数最后是为防止配置文件中设置了数据目录参数datadir,通过ClearDatadirCache()函数将数据文件路径参数设置为空目录,这样下次进入GetDataDir()时,我们将会根据新的datadir创建数据目录。\n\n// If datadir is changed in .conffile:\n\nClearDatadirCache();\n////////////////////////读取配置文件函数分析完毕////////////////////\n\n\n区块链研习社比特币源码研读班 electroman\n\n以下是广告:\n\n我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。\n\n\n",
"json_metadata": "{\"tags\":[\"btc\",\"cn\"],\"image\":[\"https://steemitimages.com/DQmNRRvKyVsGE7bCdhh1yQKFX2AaY4GzX6f93wcoA8dVpvA/1.png\",\"https://steemitimages.com/DQmPSXL3vYM7mFFJTZrHraM6aNN5YE1eyRxndg3bFMHvU9Y/2.png\",\"https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png\"],\"links\":[\"http://www.cplusplus.com/reference/fstream/ifstream/\",\"http://www.jianshu.com/p/0df718dffdac\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "btc",
"permlink": "8-main-7",
"title": "比特币源码研读(8)-main函数(7)"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-29T15:11:42",
"trx_id": "861c4235ae9fda97d6966f199bdfb7f6af1ffb14",
"trx_in_block": 11,
"virtual_op": 0
}ubgupvoted (1.00%) @electroman / 7-main-62017/10/18 02:32:42
ubgupvoted (1.00%) @electroman / 7-main-6
2017/10/18 02:32:42
| author | electroman |
| permlink | 7-main-6 |
| voter | ubg |
| weight | 100 (1.00%) |
| Transaction Info | Block #16425606/Trx c96c89027178801b5285dad2d7d9b5d3122a0be3 |
View Raw JSON Data
{
"block": 16425606,
"op": [
"vote",
{
"author": "electroman",
"permlink": "7-main-6",
"voter": "ubg",
"weight": 100
}
],
"op_in_trx": 0,
"timestamp": "2017-10-18T02:32:42",
"trx_id": "c96c89027178801b5285dad2d7d9b5d3122a0be3",
"trx_in_block": 7,
"virtual_op": 0
}2017/10/18 02:18:42
2017/10/18 02:18:42
| author | forexmaster |
| body | Excellent post. @electroman |
| json metadata | {"tags":["btc"],"users":["electroman"],"app":"steemit/0.1"} |
| parent author | electroman |
| parent permlink | 7-main-6 |
| permlink | re-electroman-7-main-6-20171018t021835537z |
| title | |
| Transaction Info | Block #16425326/Trx 9d5f6f63ae3d76c0d0c315bbfd42c0c81e10f2eb |
View Raw JSON Data
{
"block": 16425326,
"op": [
"comment",
{
"author": "forexmaster",
"body": "Excellent post. @electroman",
"json_metadata": "{\"tags\":[\"btc\"],\"users\":[\"electroman\"],\"app\":\"steemit/0.1\"}",
"parent_author": "electroman",
"parent_permlink": "7-main-6",
"permlink": "re-electroman-7-main-6-20171018t021835537z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2017-10-18T02:18:42",
"trx_id": "9d5f6f63ae3d76c0d0c315bbfd42c0c81e10f2eb",
"trx_in_block": 2,
"virtual_op": 0
}electromanupdated options for 7-main-62017/10/18 02:06:42
electromanupdated options for 7-main-6
2017/10/18 02:06:42
| allow curation rewards | true |
| allow votes | true |
| author | electroman |
| extensions | [] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 0 |
| permlink | 7-main-6 |
| Transaction Info | Block #16425086/Trx 559d77aefee8f10da0337e8989a5429cab96c5fd |
View Raw JSON Data
{
"block": 16425086,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "electroman",
"extensions": [],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 0,
"permlink": "7-main-6"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-18T02:06:42",
"trx_id": "559d77aefee8f10da0337e8989a5429cab96c5fd",
"trx_in_block": 4,
"virtual_op": 0
}electromanpublished a new post: 7-main-62017/10/18 02:06:42
electromanpublished a new post: 7-main-6
2017/10/18 02:06:42
| author | electroman |
| body | 识别完帮助信息和版本信息以后,下面是对异常时间的处理 try{ //保护代码 } catch (const std::exception& e) { PrintExceptionContinue(&e, "AppInit()"); } catch (...) { PrintExceptionContinue(nullptr, "AppInit()"); } 即如果try中的代码出现异常,则会被catch捕获。在这里我们先分析try中的“保护代码” 1)判断目录是否正确:如果目录不正确,则弹出对话框,提示数据目录不存在,并退出软件 if(!fs::is_directory(GetDataDir(false))) { fprintf(stderr, "Error: Specified data directory \"%s\"does not exist.\n", gArgs.GetArg("-datadir", "").c_str()); returnfalse; } if语句中fs定义是 namespace fs = boost::filesystem; filesystem库是一种可移植的文件系统操作库,可以跨平台的操作目录、文件等,filesystem库的所有内容定义在boost名字空间的一个下级名字空间里,它叫boost::filesytem。这里介绍几个代码中用到的函数。 boost::filesystem::path path("");//初始化 boost::filesystem::is_directory(file_path)//判断file_path是否为目录。 /**********GetDataDir()函数分析****************************/  GetDataDir函数流程图  总体来说: 如果有path路径,则直接返回这个路径; 如果没有,则查看参数gArgs中是否设置了路径,如果设置且正确(如果设置的是网络目录,则转换成本地路径),则在本地创建这个路径,并返回路径;如果设置但错误,则清空path,返回空目录; 其中的函数说明: 函数1,L558 pathCached ,pathCachedNetSpecific定义在util.cpp中,如下 void ClearDatadirCache() { LOCK(csPathCached); pathCached =fs::path(); pathCachedNetSpecific = fs::path(); } 函数2, L566 path =fs::system_complete(gArgs.GetArg("-datadir", "")); 转化路径为完整路径,详见 https://msdn.microsoft.com/en-us/library/hh874650(v=vs.120).aspx 函数3,L572 GetDefaultDataDir() 定义在util.cpp.返回默认路径,那默认路径是什么呢? // Windows // Windows >= Vista:C:\Users\Username\AppData\Roaming\Bitcoin // Mac:~/Library/Application Support/Bitcoin // Unix:~/.bitcoin 函数4,L 575 BaseParams().DataDir(); 其中BaseParams函数定义在chainparamsbase.cpp文件,函数定义如下 const CBaseChainParams& BaseParams() { assert(globalChainBaseParams); return*globalChainBaseParams; } 返回的是*globalChainBaseParams,定义也在这个文件里, static std::unique_ptrglobalChainBaseParams; 由定义可以看出,BaseParams是类CBaseChainParams,我们看看类CBaseChainParams class CBaseChainParams { public: /** BIP70 chainname strings (main, test or regtest) */ static conststd::string MAIN; static conststd::string TESTNET; static conststd::string REGTEST; conststd::string& DataDir() const { return strDataDir; } int RPCPort()const { return nRPCPort; } protected: CBaseChainParams() {} int nRPCPort; std::stringstrDataDir; }; 其中,可以看到DataDir()函数定义: const std::string& DataDir() const { returnstrDataDir; } 定义在chainparamsbase.cpp中: const std::string& DataDir() const { returnstrDataDir; } //类注释中,我们可以看到BIP70,说明这个改进协议BIP70中应用到的。 /**********GetDataDir()函数分析结束****************************/ 区块链研习社比特币源码研读班 electroman 以下是广告: 我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。  |
| json metadata | {"tags":["btc","cn"],"image":["https://steemitimages.com/DQmQTZe2UT7nJ8Y7SoRdd7iHG5naj8Fcsk4vcYN4VfmXf7T/1.png","https://steemitimages.com/DQmP3UTepcFKhfagW1MRWYgzFFPUGYAttofXXzyXwoL2HFW/2.png","https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png"],"links":["https://msdn.microsoft.com/en-us/library/hh874650"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | btc |
| permlink | 7-main-6 |
| title | 比特币源码研读(7)-main函数(6) |
| Transaction Info | Block #16425086/Trx 559d77aefee8f10da0337e8989a5429cab96c5fd |
View Raw JSON Data
{
"block": 16425086,
"op": [
"comment",
{
"author": "electroman",
"body": "识别完帮助信息和版本信息以后,下面是对异常时间的处理\n\ntry{\n\n//保护代码\n\n}\n\ncatch (const std::exception& e) {\n\nPrintExceptionContinue(&e, \"AppInit()\");\n\n}\n\ncatch (...) {\n\nPrintExceptionContinue(nullptr, \"AppInit()\");\n\n}\n\n即如果try中的代码出现异常,则会被catch捕获。在这里我们先分析try中的“保护代码”\n1)判断目录是否正确:如果目录不正确,则弹出对话框,提示数据目录不存在,并退出软件\n\nif(!fs::is_directory(GetDataDir(false)))\n\n{\n\nfprintf(stderr, \"Error: Specified data directory \\\"%s\\\"does not exist.\\n\", gArgs.GetArg(\"-datadir\", \"\").c_str());\n\nreturnfalse;\n\n}\nif语句中fs定义是\n\nnamespace fs = boost::filesystem;\nfilesystem库是一种可移植的文件系统操作库,可以跨平台的操作目录、文件等,filesystem库的所有内容定义在boost名字空间的一个下级名字空间里,它叫boost::filesytem。这里介绍几个代码中用到的函数。\n\nboost::filesystem::path path(\"\");//初始化\n\nboost::filesystem::is_directory(file_path)//判断file_path是否为目录。\n/**********GetDataDir()函数分析****************************/\n\n\n\n\n\n\nGetDataDir函数流程图\n\n\n\n总体来说:\n\n如果有path路径,则直接返回这个路径;\n\n如果没有,则查看参数gArgs中是否设置了路径,如果设置且正确(如果设置的是网络目录,则转换成本地路径),则在本地创建这个路径,并返回路径;如果设置但错误,则清空path,返回空目录;\n\n其中的函数说明:\n\n函数1,L558\n\npathCached ,pathCachedNetSpecific定义在util.cpp中,如下\n\nvoid ClearDatadirCache()\n\n{\n\nLOCK(csPathCached);\n\npathCached =fs::path();\n\npathCachedNetSpecific = fs::path();\n\n}\n函数2, L566\n\npath =fs::system_complete(gArgs.GetArg(\"-datadir\", \"\"));\n转化路径为完整路径,详见\n\nhttps://msdn.microsoft.com/en-us/library/hh874650(v=vs.120).aspx\n\n函数3,L572\n\nGetDefaultDataDir()\n定义在util.cpp.返回默认路径,那默认路径是什么呢?\n\n// Windows\n\n// Windows >= Vista:C:\\Users\\Username\\AppData\\Roaming\\Bitcoin\n\n// Mac:~/Library/Application Support/Bitcoin\n\n// Unix:~/.bitcoin\n函数4,L 575\n\nBaseParams().DataDir();\n其中BaseParams函数定义在chainparamsbase.cpp文件,函数定义如下\n\nconst CBaseChainParams& BaseParams()\n\n{\n\nassert(globalChainBaseParams);\n\nreturn*globalChainBaseParams;\n\n}\n返回的是*globalChainBaseParams,定义也在这个文件里,\n\nstatic std::unique_ptrglobalChainBaseParams;\n由定义可以看出,BaseParams是类CBaseChainParams,我们看看类CBaseChainParams\n\nclass CBaseChainParams\n\n{\n\npublic:\n\n/** BIP70 chainname strings (main, test or regtest) */\n\nstatic conststd::string MAIN;\n\nstatic conststd::string TESTNET;\n\nstatic conststd::string REGTEST;\n\nconststd::string& DataDir() const { return strDataDir; }\n\nint RPCPort()const { return nRPCPort; }\n\nprotected:\n\nCBaseChainParams() {}\n\nint nRPCPort;\n\nstd::stringstrDataDir;\n\n};\n其中,可以看到DataDir()函数定义:\n\nconst std::string& DataDir() const { returnstrDataDir; }\n定义在chainparamsbase.cpp中:\n\nconst std::string& DataDir() const { returnstrDataDir; }\n//类注释中,我们可以看到BIP70,说明这个改进协议BIP70中应用到的。\n/**********GetDataDir()函数分析结束****************************/\n\n区块链研习社比特币源码研读班 electroman\n\n以下是广告:\n\n我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。\n",
"json_metadata": "{\"tags\":[\"btc\",\"cn\"],\"image\":[\"https://steemitimages.com/DQmQTZe2UT7nJ8Y7SoRdd7iHG5naj8Fcsk4vcYN4VfmXf7T/1.png\",\"https://steemitimages.com/DQmP3UTepcFKhfagW1MRWYgzFFPUGYAttofXXzyXwoL2HFW/2.png\",\"https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png\"],\"links\":[\"https://msdn.microsoft.com/en-us/library/hh874650\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "btc",
"permlink": "7-main-6",
"title": "比特币源码研读(7)-main函数(6)"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-18T02:06:42",
"trx_id": "559d77aefee8f10da0337e8989a5429cab96c5fd",
"trx_in_block": 4,
"virtual_op": 0
}steemdelegated 18.343 SP to @electroman2017/10/13 16:11:03
steemdelegated 18.343 SP to @electroman
2017/10/13 16:11:03
| delegatee | electroman |
| delegator | steem |
| vesting shares | 29829.895908 VESTS |
| Transaction Info | Block #16298403/Trx a329215078d346a08a2f1a0982d70cb7c02ce7da |
View Raw JSON Data
{
"block": 16298403,
"op": [
"delegate_vesting_shares",
{
"delegatee": "electroman",
"delegator": "steem",
"vesting_shares": "29829.895908 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-13T16:11:03",
"trx_id": "a329215078d346a08a2f1a0982d70cb7c02ce7da",
"trx_in_block": 19,
"virtual_op": 0
}electromanupdated options for 6-main-52017/10/06 14:59:18
electromanupdated options for 6-main-5
2017/10/06 14:59:18
| allow curation rewards | true |
| allow votes | true |
| author | electroman |
| extensions | [] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 0 |
| permlink | 6-main-5 |
| Transaction Info | Block #16095472/Trx 28a8e71601fbb5c5a03a8586d0e583a905c2a5b3 |
View Raw JSON Data
{
"block": 16095472,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "electroman",
"extensions": [],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 0,
"permlink": "6-main-5"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-06T14:59:18",
"trx_id": "28a8e71601fbb5c5a03a8586d0e583a905c2a5b3",
"trx_in_block": 43,
"virtual_op": 0
}electromanpublished a new post: 6-main-52017/10/06 14:59:18
electromanpublished a new post: 6-main-5
2017/10/06 14:59:18
| author | electroman |
| body | 上一次,我们代码看到了 gArgs.ParseParameters(argc, argv); 分析输入的参数,今天我们继续看下面的代码。 // Process help and version before taking care about datadir if (gArgs.IsArgSet("-?") || gArgs.IsArgSet("-h") || gArgs.IsArgSet("-help") || gArgs.IsArgSet("-version")) { std::string strUsage = strprintf(_("%s Daemon"), _(PACKAGE_NAME)) + " " + _("version") + " " + FormatFullVersion() + "\n"; if (gArgs.IsArgSet("-version")) { strUsage += FormatParagraph(LicenseInfo()); } else { strUsage += "\n" + _("Usage:") + "\n" + " bitcoind [options] " + strprintf(_("Start %s Daemon"), _(PACKAGE_NAME)) + "\n"; strUsage += "\n" + HelpMessage(HMM_BITCOIND); } fprintf(stdout, "%s", strUsage.c_str()); return true; } 从注释,我们可以看出,这是在读取数据目录以前,先处理版本信息和帮助文档 如果if语句成立,则执行if中的语句,执行完成后,返回true,程序结束,如果不执行if语句,则执行if后面的语句。 其中if语句中的函数IsArgSet是昨天讲的类ArgsManager中的函数,定义在util.h,实现在util.cpp.我们看看他的实现函数 bool ArgsManager::IsArgSet(const std::string& strArg) const { LOCK(cs_args);//所存这个变量,保证该线程调用时,其他线程不会调用 return mapArgs.count(strArg); } 这个函数中我们先看看变量mapArgs,定义为 std::map mapArgs; 在标准库std中,map是一类关联式容器。map的key-value用于1对1的映射情况 count函数,查找map中,是否有这个value,如果有则返回true,如果没有则返回false. 因此 IsArgSet(const std::string& strArg) 就是检查mapArgs中是否有strArg,如果有,则返回true,如果没有,则返回false. 昨天看到的 mapArgs.clear(); clear是清空mapArgs中所有的元素 再返回去,看if语句 if (gArgs.IsArgSet("-?") ||gArgs.IsArgSet("-h") ||gArgs.IsArgSet("-help")|| gArgs.IsArgSet("-version")) 即查看gArgs中是否有“-?”,"-h","-help","-version",前3个是帮助标识,后一个是版本标识,如果检测到其中一个,则进入if语句,开始执行,执行完成后,返回true。否则不进入if'语句,执行下面的语句。 1) 版本信息 第一句是 std::string strUsage =strprintf(_("%s Daemon"), _(PACKAGE_NAME)) + " " +_("version") + " " + FormatFullVersion() + "\n"; 读取版本信息,在菜菜子的文章中,对这句代码有详细说明。 /********************以下是菜菜子的分析****************************/ strprintf函数为字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。此处是将PACKAGE_NAME写入_("%s Daemon")中,生成PACKAGE_NAME Daemon形式的字符串内容。PACKAGE_NAME的定义位于src/config/bitcoin-config.h中,其定义为: 该文件在我们下载的源码中一开始是不存在的,需经过对源码进行./configure命令后才能生成。源码的./configure过程可参见我的《聊聊比特币(Bitcoin)客户端源码编译那些事》一文。 FormatFullVersion函数的功能是输出比特币核心的完整版本信息。该函数的实现位于src/clientversion.cpp中,其实现代码如下: std::string FormatFullVersion() { return CLIENT_BUILD; } 函数中直接调用了CLIENT_BUILD函数,该函数的定义也在当前文件 const std::stringCLIENT_BUILD(BUILD_DESC CLIENT_VERSION_SUFFIX); 再来看BUILD_DESC,其定义就在当前文件: #ifndef BUILD_DESC #ifdef BUILD_SUFFIX #defineBUILD_DESCBUILD_DESC_WITH_SUFFIX(CLIENT_VERSION_MAJOR,CLIENT_VERSION_MINOR,CLIENT_VERSION_REVISION, CLIENT_VERSION_BUILD,BUILD_SUFFIX) #elif defined(GIT_COMMIT_ID) #defineBUILD_DESCBUILD_DESC_FROM_COMMIT(CLIENT_VERSION_MAJOR,CLIENT_VERSION_MINOR,CLIENT_VERSION_REVISION, CLIENT_VERSION_BUILD,GIT_COMMIT_ID) #else #define BUILD_DESCBUILD_DESC_FROM_UNKNOWN(CLIENT_VERSION_MAJOR,CLIENT_VERSION_MINOR, CLIENT_VERSION_REVISION, CLIENT_VERSION_BUILD) #endif #endif 通过分析#ifndef BUILD_DESC,我们可以判断BUILD_DESC将在BUILD_DESC_FROM_UNKNOWN函数中执行,该函数采用的是预编译实现方式,这样的好处是对于小型、通用性函数采用预编译方式可以提高程序的执行效率。 #defineBUILD_DESC_FROM_UNKNOWN(maj, min,rev, build) \ "v" DO_STRINGIZE(maj)"." DO_STRINGIZE(min)"." DO_STRINGIZE(rev) "."DO_STRINGIZE(build)"-unk" 在函数实现中调用了DO_STRINGIZE函数,该函数的实现位于src/clientversion.h中 /** * Converts theparameter X to astring after macro replacement on X has been performed. * Don't mergethese into onemacro! */ #define STRINGIZE(X)DO_STRINGIZE(X) #define DO_STRINGIZE(X) #X 通过其注释,我们可以知道该函数的作用是将宏定义的参数X转变为字符串。那问题来了,BUILD_DESC_FROM_UNKNOWN函数中调用的4次DO_STRINGIZE函数包含的变量是宏定义变量吗?答案肯定是的,不然程序就出错了。那包含的maj, min, rev, build在哪定义呢?那我们就需要看BUILD_DESC_FROM_UNKNOWN调用位置传入的四个变量: CLIENT_VERSION_MAJOR CLIENT_VERSION_MINOR CLIENT_VERSION_REVISION CLIENT_VERSION_BUILD 他们的定义位于src/clientversion.h中,通过定义我们可知其为宏定义,因此传入DO_STRINGIZE函数中是没问题的。 #define CLIENT_VERSION_MAJOR 0 #define CLIENT_VERSION_MINOR 14 #define CLIENT_VERSION_REVISION 2 #define CLIENT_VERSION_BUILD 0 再来看BUILD_DESC_FROM_UNKNOWN的实现,其功能是将版本信息的主要、次要、修正以及建立4个值进行拼接,从而输出完整的版本号信息。 /*****************************************以上为菜菜子分析*********************/ 2)版本许可 下面开始判断,如果检测到的是版本信息 if (gArgs.IsArgSet("-version")) { strUsage +=FormatParagraph(LicenseInfo()); } 代码的意思是将LicenseInfo()返回的字符串拼接到strUsage上。 其中:FormatParagraph()函数 /** * Format aparagraph of text to a fixed width, adding spaces for * indentation toany added line. */ std::string FormatParagraph(const std::string& in,size_t width = 79, size_t indent = 0); 从注释可以看出,该函数主要是通过添加空格的方式把一段文本变成固定宽度。 函数处理的内容是LicenseInfo()而,这个函数包含着版权许可信息。 因此,if语句的功能就是输出版本许可信息,下面我们用ubuntu进行测试。在终端中输入命令"bitcoin -version",  3)帮助信息 else { strUsage += "\n" +_("Usage:") + "\n" + "bitcoind [options]" +strprintf(_("Start %s Daemon"), _(PACKAGE_NAME)) + "\n"; strUsage += "\n" +HelpMessage(HMM_BITCOIND); } 其中HelpMessage函数的注释如下 /** * Format a stringto be used as group of options in help messages * * @param messageGroup name (e.g. "RPC server options:") * @return theformatted string */ std::string HelpMessageGroup(const std::string&message); 用于显示帮助信息。 HMM_BITCOIND定义如下 /** The help message mode determines what help message toshow */ enum HelpMessageMode { HMM_BITCOIND,//比特币后台进程帮助信息 HMM_BITCOIN_QT//比特币前台进程帮助信息 }; 此处我们研读的代码为后台进程bitcoind程序,所以参数为HMM_BITCOIND。在HelpMessage函数中,将会根据具体的类型输出相应的帮助信息内容,其帮助内容主要为后台进程涉及参数的使用方法说明。所以,大家后续在使用后台进程时,如果遇到不会的命令,可以通过“bitcoind -?”、"bitcoind -h"或" bitcoind -help"得到帮助信息。 下面在ubuntu中测试一下,输入命令“bitcoind -?”输出的信息,与HelpMessage函数中的一致  最后程序通过fprintf(stdout, "%s",strUsage.c_str());实现版本或帮助信息的输出 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 区块链研习社比特币源码研读班 electroman 以下是广告: 我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。  |
| json metadata | {"tags":["btc","cn","ifndef","ifdef","definebuild"],"users":["param","return"],"image":["https://steemitimages.com/DQmTkCcokfNxhsT4SdgUB4AAQSjMcMssoQ596iTnCnaZLF3/1.png","https://steemitimages.com/DQmWoKT9MP1waFN9XiZPgfBiEwwYKJ4Q5peD4NFpz15spWE/2.png","https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | btc |
| permlink | 6-main-5 |
| title | 比特币源码研读(6)-main函数(5) |
| Transaction Info | Block #16095472/Trx 28a8e71601fbb5c5a03a8586d0e583a905c2a5b3 |
View Raw JSON Data
{
"block": 16095472,
"op": [
"comment",
{
"author": "electroman",
"body": "上一次,我们代码看到了\n\ngArgs.ParseParameters(argc, argv);\n分析输入的参数,今天我们继续看下面的代码。\n\n // Process help and version before taking care about datadir\n\n if (gArgs.IsArgSet(\"-?\") || gArgs.IsArgSet(\"-h\") || gArgs.IsArgSet(\"-help\") || gArgs.IsArgSet(\"-version\"))\n\n {\n\n std::string strUsage = strprintf(_(\"%s Daemon\"), _(PACKAGE_NAME)) + \" \" + _(\"version\") + \" \" + FormatFullVersion() + \"\\n\";\n\nif (gArgs.IsArgSet(\"-version\"))\n\n{\n\nstrUsage += FormatParagraph(LicenseInfo());\n\n}\nelse\n\n{\n\nstrUsage += \"\\n\" + _(\"Usage:\") + \"\\n\" +\n\n\" bitcoind [options] \" + strprintf(_(\"Start %s Daemon\"), _(PACKAGE_NAME)) + \"\\n\";\n\nstrUsage += \"\\n\" + HelpMessage(HMM_BITCOIND);\n\n}\nfprintf(stdout, \"%s\", strUsage.c_str());\n\nreturn true;\n\n}\n从注释,我们可以看出,这是在读取数据目录以前,先处理版本信息和帮助文档\n\n如果if语句成立,则执行if中的语句,执行完成后,返回true,程序结束,如果不执行if语句,则执行if后面的语句。\n\n其中if语句中的函数IsArgSet是昨天讲的类ArgsManager中的函数,定义在util.h,实现在util.cpp.我们看看他的实现函数\n\nbool ArgsManager::IsArgSet(const std::string& strArg)\n\nconst\n\n{\n\nLOCK(cs_args);//所存这个变量,保证该线程调用时,其他线程不会调用\n\nreturn mapArgs.count(strArg);\n\n}\n这个函数中我们先看看变量mapArgs,定义为\n\nstd::map mapArgs;\n在标准库std中,map是一类关联式容器。map的key-value用于1对1的映射情况\n\ncount函数,查找map中,是否有这个value,如果有则返回true,如果没有则返回false.\n\n因此\n\nIsArgSet(const std::string& strArg)\n就是检查mapArgs中是否有strArg,如果有,则返回true,如果没有,则返回false.\n\n昨天看到的\n\nmapArgs.clear();\nclear是清空mapArgs中所有的元素\n\n再返回去,看if语句\n\nif (gArgs.IsArgSet(\"-?\") ||gArgs.IsArgSet(\"-h\") ||gArgs.IsArgSet(\"-help\")|| gArgs.IsArgSet(\"-version\"))\n即查看gArgs中是否有“-?”,\"-h\",\"-help\",\"-version\",前3个是帮助标识,后一个是版本标识,如果检测到其中一个,则进入if语句,开始执行,执行完成后,返回true。否则不进入if'语句,执行下面的语句。\n\n1) 版本信息\n\n第一句是\n\nstd::string strUsage =strprintf(_(\"%s Daemon\"), _(PACKAGE_NAME)) + \" \" +_(\"version\") + \" \" + FormatFullVersion() + \"\\n\";\n\n读取版本信息,在菜菜子的文章中,对这句代码有详细说明。\n\n/********************以下是菜菜子的分析****************************/\n\nstrprintf函数为字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。此处是将PACKAGE_NAME写入_(\"%s Daemon\")中,生成PACKAGE_NAME\n\nDaemon形式的字符串内容。PACKAGE_NAME的定义位于src/config/bitcoin-config.h中,其定义为:\n\n该文件在我们下载的源码中一开始是不存在的,需经过对源码进行./configure命令后才能生成。源码的./configure过程可参见我的《聊聊比特币(Bitcoin)客户端源码编译那些事》一文。\n\nFormatFullVersion函数的功能是输出比特币核心的完整版本信息。该函数的实现位于src/clientversion.cpp中,其实现代码如下:\n\nstd::string FormatFullVersion()\n\n{\n\nreturn CLIENT_BUILD;\n\n}\n函数中直接调用了CLIENT_BUILD函数,该函数的定义也在当前文件\n\nconst std::stringCLIENT_BUILD(BUILD_DESC CLIENT_VERSION_SUFFIX);\n再来看BUILD_DESC,其定义就在当前文件:\n\n#ifndef BUILD_DESC\n\n#ifdef BUILD_SUFFIX\n\n#defineBUILD_DESCBUILD_DESC_WITH_SUFFIX(CLIENT_VERSION_MAJOR,CLIENT_VERSION_MINOR,CLIENT_VERSION_REVISION, CLIENT_VERSION_BUILD,BUILD_SUFFIX)\n\n#elif defined(GIT_COMMIT_ID)\n\n#defineBUILD_DESCBUILD_DESC_FROM_COMMIT(CLIENT_VERSION_MAJOR,CLIENT_VERSION_MINOR,CLIENT_VERSION_REVISION, CLIENT_VERSION_BUILD,GIT_COMMIT_ID)\n\n#else\n\n#define BUILD_DESCBUILD_DESC_FROM_UNKNOWN(CLIENT_VERSION_MAJOR,CLIENT_VERSION_MINOR,\n\nCLIENT_VERSION_REVISION, CLIENT_VERSION_BUILD)\n\n#endif\n#endif\n通过分析#ifndef BUILD_DESC,我们可以判断BUILD_DESC将在BUILD_DESC_FROM_UNKNOWN函数中执行,该函数采用的是预编译实现方式,这样的好处是对于小型、通用性函数采用预编译方式可以提高程序的执行效率。\n\n#defineBUILD_DESC_FROM_UNKNOWN(maj, min,rev, build) \\\n\n\"v\" DO_STRINGIZE(maj)\".\" DO_STRINGIZE(min)\".\" DO_STRINGIZE(rev) \".\"DO_STRINGIZE(build)\"-unk\"\n在函数实现中调用了DO_STRINGIZE函数,该函数的实现位于src/clientversion.h中\n\n/**\n\n* Converts theparameter X to astring after macro replacement on X has been performed.\n\n* Don't mergethese into onemacro!\n\n*/\n\n#define STRINGIZE(X)DO_STRINGIZE(X)\n\n#define DO_STRINGIZE(X) #X\n通过其注释,我们可以知道该函数的作用是将宏定义的参数X转变为字符串。那问题来了,BUILD_DESC_FROM_UNKNOWN函数中调用的4次DO_STRINGIZE函数包含的变量是宏定义变量吗?答案肯定是的,不然程序就出错了。那包含的maj, min, rev, build在哪定义呢?那我们就需要看BUILD_DESC_FROM_UNKNOWN调用位置传入的四个变量:\n\nCLIENT_VERSION_MAJOR\n\nCLIENT_VERSION_MINOR\n\nCLIENT_VERSION_REVISION\n\nCLIENT_VERSION_BUILD\n他们的定义位于src/clientversion.h中,通过定义我们可知其为宏定义,因此传入DO_STRINGIZE函数中是没问题的。\n\n#define CLIENT_VERSION_MAJOR 0\n\n#define CLIENT_VERSION_MINOR 14\n\n#define CLIENT_VERSION_REVISION 2\n\n#define CLIENT_VERSION_BUILD 0\n再来看BUILD_DESC_FROM_UNKNOWN的实现,其功能是将版本信息的主要、次要、修正以及建立4个值进行拼接,从而输出完整的版本号信息。\n\n/*****************************************以上为菜菜子分析*********************/\n\n2)版本许可\n\n下面开始判断,如果检测到的是版本信息\n\nif (gArgs.IsArgSet(\"-version\"))\n\n{\n\nstrUsage +=FormatParagraph(LicenseInfo());\n\n}\n代码的意思是将LicenseInfo()返回的字符串拼接到strUsage上。\n\n其中:FormatParagraph()函数\n\n/**\n\n* Format aparagraph of text to a fixed width, adding spaces for\n\n* indentation toany added line.\n\n*/\n\nstd::string FormatParagraph(const std::string& in,size_t width = 79, size_t indent = 0);\n从注释可以看出,该函数主要是通过添加空格的方式把一段文本变成固定宽度。\n\n函数处理的内容是LicenseInfo()而,这个函数包含着版权许可信息。\n\n因此,if语句的功能就是输出版本许可信息,下面我们用ubuntu进行测试。在终端中输入命令\"bitcoin -version\",\n\n\n\n\n3)帮助信息\n\nelse\n\n{\n\nstrUsage += \"\\n\" +_(\"Usage:\") + \"\\n\" +\n\n\"bitcoind [options]\" +strprintf(_(\"Start %s Daemon\"), _(PACKAGE_NAME)) + \"\\n\";\n\nstrUsage += \"\\n\" +HelpMessage(HMM_BITCOIND);\n\n}\n其中HelpMessage函数的注释如下\n\n/**\n\n* Format a stringto be used as group of options in help messages\n\n*\n\n* @param messageGroup name (e.g. \"RPC server options:\")\n\n* @return theformatted string\n\n*/\n\nstd::string HelpMessageGroup(const std::string&message);\n用于显示帮助信息。\n\nHMM_BITCOIND定义如下\n\n/** The help message mode determines what help message toshow */\n\nenum HelpMessageMode {\n\nHMM_BITCOIND,//比特币后台进程帮助信息\n\nHMM_BITCOIN_QT//比特币前台进程帮助信息\n\n};\n此处我们研读的代码为后台进程bitcoind程序,所以参数为HMM_BITCOIND。在HelpMessage函数中,将会根据具体的类型输出相应的帮助信息内容,其帮助内容主要为后台进程涉及参数的使用方法说明。所以,大家后续在使用后台进程时,如果遇到不会的命令,可以通过“bitcoind -?”、\"bitcoind -h\"或\" bitcoind -help\"得到帮助信息。\n\n下面在ubuntu中测试一下,输入命令“bitcoind -?”输出的信息,与HelpMessage函数中的一致\n\n\n\n最后程序通过fprintf(stdout, \"%s\",strUsage.c_str());实现版本或帮助信息的输出\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n区块链研习社比特币源码研读班 electroman\n\n以下是广告:\n\n我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。\n\n",
"json_metadata": "{\"tags\":[\"btc\",\"cn\",\"ifndef\",\"ifdef\",\"definebuild\"],\"users\":[\"param\",\"return\"],\"image\":[\"https://steemitimages.com/DQmTkCcokfNxhsT4SdgUB4AAQSjMcMssoQ596iTnCnaZLF3/1.png\",\"https://steemitimages.com/DQmWoKT9MP1waFN9XiZPgfBiEwwYKJ4Q5peD4NFpz15spWE/2.png\",\"https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "btc",
"permlink": "6-main-5",
"title": "比特币源码研读(6)-main函数(5)"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-06T14:59:18",
"trx_id": "28a8e71601fbb5c5a03a8586d0e583a905c2a5b3",
"trx_in_block": 43,
"virtual_op": 0
}cxj6174upvoted (100.00%) @electroman / 5-main-42017/10/05 11:33:03
cxj6174upvoted (100.00%) @electroman / 5-main-4
2017/10/05 11:33:03
| author | electroman |
| permlink | 5-main-4 |
| voter | cxj6174 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #16062576/Trx e282e6f0471d4f729223e4bd893dcb09fb6bc32b |
View Raw JSON Data
{
"block": 16062576,
"op": [
"vote",
{
"author": "electroman",
"permlink": "5-main-4",
"voter": "cxj6174",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-05T11:33:03",
"trx_id": "e282e6f0471d4f729223e4bd893dcb09fb6bc32b",
"trx_in_block": 15,
"virtual_op": 0
}avikantupvoted (100.00%) @electroman / utxo2017/10/05 09:37:54
avikantupvoted (100.00%) @electroman / utxo
2017/10/05 09:37:54
| author | electroman |
| permlink | utxo |
| voter | avikant |
| weight | 10000 (100.00%) |
| Transaction Info | Block #16060275/Trx 0d992352f2203837f456a6574cdcaed59f1b29b4 |
View Raw JSON Data
{
"block": 16060275,
"op": [
"vote",
{
"author": "electroman",
"permlink": "utxo",
"voter": "avikant",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-05T09:37:54",
"trx_id": "0d992352f2203837f456a6574cdcaed59f1b29b4",
"trx_in_block": 23,
"virtual_op": 0
}avikantupvoted (100.00%) @electroman / 12017/10/05 09:37:48
avikantupvoted (100.00%) @electroman / 1
2017/10/05 09:37:48
| author | electroman |
| permlink | 1 |
| voter | avikant |
| weight | 10000 (100.00%) |
| Transaction Info | Block #16060273/Trx c4e9cc7cba54160877d40b84e85b3821f4d317e7 |
View Raw JSON Data
{
"block": 16060273,
"op": [
"vote",
{
"author": "electroman",
"permlink": "1",
"voter": "avikant",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-05T09:37:48",
"trx_id": "c4e9cc7cba54160877d40b84e85b3821f4d317e7",
"trx_in_block": 15,
"virtual_op": 0
}avikantupvoted (100.00%) @electroman / 2-main-12017/10/05 09:37:36
avikantupvoted (100.00%) @electroman / 2-main-1
2017/10/05 09:37:36
| author | electroman |
| permlink | 2-main-1 |
| voter | avikant |
| weight | 10000 (100.00%) |
| Transaction Info | Block #16060269/Trx e6f9220d529365c5d5d4639395545e197770b58b |
View Raw JSON Data
{
"block": 16060269,
"op": [
"vote",
{
"author": "electroman",
"permlink": "2-main-1",
"voter": "avikant",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-05T09:37:36",
"trx_id": "e6f9220d529365c5d5d4639395545e197770b58b",
"trx_in_block": 0,
"virtual_op": 0
}avikantupvoted (100.00%) @electroman / imtoken2017/10/05 09:37:24
avikantupvoted (100.00%) @electroman / imtoken
2017/10/05 09:37:24
| author | electroman |
| permlink | imtoken |
| voter | avikant |
| weight | 10000 (100.00%) |
| Transaction Info | Block #16060265/Trx dbbac7eb6161c16e6e52da0ea1ce7443ec28bfdf |
View Raw JSON Data
{
"block": 16060265,
"op": [
"vote",
{
"author": "electroman",
"permlink": "imtoken",
"voter": "avikant",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-05T09:37:24",
"trx_id": "dbbac7eb6161c16e6e52da0ea1ce7443ec28bfdf",
"trx_in_block": 14,
"virtual_op": 0
}avikantupvoted (100.00%) @electroman / 3-main-22017/10/05 09:37:18
avikantupvoted (100.00%) @electroman / 3-main-2
2017/10/05 09:37:18
| author | electroman |
| permlink | 3-main-2 |
| voter | avikant |
| weight | 10000 (100.00%) |
| Transaction Info | Block #16060263/Trx dc472b7dd14e42ae55b1f2fc2dcead50dd96654f |
View Raw JSON Data
{
"block": 16060263,
"op": [
"vote",
{
"author": "electroman",
"permlink": "3-main-2",
"voter": "avikant",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-05T09:37:18",
"trx_id": "dc472b7dd14e42ae55b1f2fc2dcead50dd96654f",
"trx_in_block": 29,
"virtual_op": 0
}avikantupvoted (100.00%) @electroman / 4-main-32017/10/05 09:37:12
avikantupvoted (100.00%) @electroman / 4-main-3
2017/10/05 09:37:12
| author | electroman |
| permlink | 4-main-3 |
| voter | avikant |
| weight | 10000 (100.00%) |
| Transaction Info | Block #16060261/Trx 10fd5f35c98ac88ee747c0301de0fada2dda9187 |
View Raw JSON Data
{
"block": 16060261,
"op": [
"vote",
{
"author": "electroman",
"permlink": "4-main-3",
"voter": "avikant",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-05T09:37:12",
"trx_id": "10fd5f35c98ac88ee747c0301de0fada2dda9187",
"trx_in_block": 38,
"virtual_op": 0
}avikantupvoted (100.00%) @electroman / 5-main-42017/10/05 09:37:09
avikantupvoted (100.00%) @electroman / 5-main-4
2017/10/05 09:37:09
| author | electroman |
| permlink | 5-main-4 |
| voter | avikant |
| weight | 10000 (100.00%) |
| Transaction Info | Block #16060260/Trx 30c91cfc1fc8295094aba4c285683ef9d285a8d9 |
View Raw JSON Data
{
"block": 16060260,
"op": [
"vote",
{
"author": "electroman",
"permlink": "5-main-4",
"voter": "avikant",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-05T09:37:09",
"trx_id": "30c91cfc1fc8295094aba4c285683ef9d285a8d9",
"trx_in_block": 21,
"virtual_op": 0
}electromanupdated options for 5-main-42017/10/05 09:35:45
electromanupdated options for 5-main-4
2017/10/05 09:35:45
| allow curation rewards | true |
| allow votes | true |
| author | electroman |
| extensions | [] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 0 |
| permlink | 5-main-4 |
| Transaction Info | Block #16060232/Trx a8ebd4a71094565fce74c00cfc36e3a3fcef4a02 |
View Raw JSON Data
{
"block": 16060232,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "electroman",
"extensions": [],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 0,
"permlink": "5-main-4"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-05T09:35:45",
"trx_id": "a8ebd4a71094565fce74c00cfc36e3a3fcef4a02",
"trx_in_block": 15,
"virtual_op": 0
}electromanpublished a new post: 5-main-42017/10/05 09:35:45
electromanpublished a new post: 5-main-4
2017/10/05 09:35:45
| author | electroman |
| body | AppInit()函数 App初始化函数 上一次,我们研究到了 boost::thread_group threadGroup; CScheduler scheduler; 下面继续看:  从注释开看,该函数是在解析设置的参数或者是配置文件的。 1)先看gArgs变量,定义在bitcoind.cpp文件中,L93行  是一个ArgsManager类变量,这个类定义在util.h中,实现在util.cpp中。其中的函数,我们用到的时候再做分析 2)再看其中的函数ParseParameters函数 ParseParameters函数是类ArgsManager中定义的一个函数  第388行代码:LOCK(cs_args);字面意思,锁存变量cs_args.那如何实现的呢? 先看变量cs_args  其定义是 mutable CCriticalSection cs_args; 类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。 再看LOCK(cs),在src/sync.h文件中定义  LOCK是一个宏定义,定义内容 #define LOCK(cs) CCriticalBlockPASTE2(criticalblock, __COUNTER__)(cs, #cs, __FILE__, __LINE__) LOCK(cs_args)即保证在该代码后面的全局变量在程序运行过程中不会被其他线程对其后的变量进行篡改 接着看第389,390行代码  程序利用mapArgs,mapMultiArgs传递参数,mapArgs存储单个值,mapMultiArgs存储多个值。  389,390行是利用clear函数清空空间。 再看下面的for循环  for循环是解析输入参数。 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 区块链研习社比特币源码研读班 electroman 以下是广告: 我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。  |
| json metadata | {"tags":["btc","cn","define","cs"],"image":["https://steemitimages.com/DQmeDLub1NJQxpCriDDMR1uSqcFDatPtrayFCWhHiG9YucB/1.png","https://steemitimages.com/DQmRDNYbWAxg3XP8v1juvaABGy2DhpfQwbvCa3TXCpCMQmD/2.png","https://steemitimages.com/DQmTo6xRzTMvfgK2CUGBEprC8AYqsvnKYjU9MdvqG5WDpBG/3.png","https://steemitimages.com/DQmWYDmhdDS5PFM4M2HC2Fj741LjHvfkbzXqHVGoKUYWG1B/4.png","https://steemitimages.com/DQmPfTVNeQVjKVPjPsFqkSu4fktn1xHAaYvdS39JYZam4Cp/5.png","https://steemitimages.com/DQmRWysqT2XeaKdcnh83mSrbGXDn1ndNxLBML4NnVMUr5Sw/6.png","https://steemitimages.com/DQmNaCQQCH2hVMSz2zgVH3y4tqUvnzGYAnkuPjUzK1YPbKo/7.png","https://steemitimages.com/DQmNoEBDY7x4qtMdxeJzNbkh2xDYDi3mEFqBKXVvTGKX5Cu/8.png","https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | btc |
| permlink | 5-main-4 |
| title | 比特币源码研读(5)-main函数(4) |
| Transaction Info | Block #16060232/Trx a8ebd4a71094565fce74c00cfc36e3a3fcef4a02 |
View Raw JSON Data
{
"block": 16060232,
"op": [
"comment",
{
"author": "electroman",
"body": "AppInit()函数\n\nApp初始化函数\n\n上一次,我们研究到了\n\nboost::thread_group threadGroup;\n\nCScheduler scheduler;\n下面继续看:\n\n\n\n\n从注释开看,该函数是在解析设置的参数或者是配置文件的。\n\n1)先看gArgs变量,定义在bitcoind.cpp文件中,L93行\n\n\n\n\n是一个ArgsManager类变量,这个类定义在util.h中,实现在util.cpp中。其中的函数,我们用到的时候再做分析\n\n2)再看其中的函数ParseParameters函数\n\nParseParameters函数是类ArgsManager中定义的一个函数\n\n\n\n\n第388行代码:LOCK(cs_args);字面意思,锁存变量cs_args.那如何实现的呢?\n\n先看变量cs_args\n\n\n\n\n其定义是\n\nmutable CCriticalSection cs_args;\n类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。\n\n再看LOCK(cs),在src/sync.h文件中定义\n\n\n\n\nLOCK是一个宏定义,定义内容\n\n#define LOCK(cs) CCriticalBlockPASTE2(criticalblock, __COUNTER__)(cs, #cs, __FILE__, __LINE__)\nLOCK(cs_args)即保证在该代码后面的全局变量在程序运行过程中不会被其他线程对其后的变量进行篡改\n\n接着看第389,390行代码\n\n\n\n\n程序利用mapArgs,mapMultiArgs传递参数,mapArgs存储单个值,mapMultiArgs存储多个值。\n\n\n\n\n389,390行是利用clear函数清空空间。\n\n再看下面的for循环\n\n\n\n\nfor循环是解析输入参数。\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n区块链研习社比特币源码研读班 electroman\n\n以下是广告:\n\n我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。\n",
"json_metadata": "{\"tags\":[\"btc\",\"cn\",\"define\",\"cs\"],\"image\":[\"https://steemitimages.com/DQmeDLub1NJQxpCriDDMR1uSqcFDatPtrayFCWhHiG9YucB/1.png\",\"https://steemitimages.com/DQmRDNYbWAxg3XP8v1juvaABGy2DhpfQwbvCa3TXCpCMQmD/2.png\",\"https://steemitimages.com/DQmTo6xRzTMvfgK2CUGBEprC8AYqsvnKYjU9MdvqG5WDpBG/3.png\",\"https://steemitimages.com/DQmWYDmhdDS5PFM4M2HC2Fj741LjHvfkbzXqHVGoKUYWG1B/4.png\",\"https://steemitimages.com/DQmPfTVNeQVjKVPjPsFqkSu4fktn1xHAaYvdS39JYZam4Cp/5.png\",\"https://steemitimages.com/DQmRWysqT2XeaKdcnh83mSrbGXDn1ndNxLBML4NnVMUr5Sw/6.png\",\"https://steemitimages.com/DQmNaCQQCH2hVMSz2zgVH3y4tqUvnzGYAnkuPjUzK1YPbKo/7.png\",\"https://steemitimages.com/DQmNoEBDY7x4qtMdxeJzNbkh2xDYDi3mEFqBKXVvTGKX5Cu/8.png\",\"https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "btc",
"permlink": "5-main-4",
"title": "比特币源码研读(5)-main函数(4)"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-05T09:35:45",
"trx_id": "a8ebd4a71094565fce74c00cfc36e3a3fcef4a02",
"trx_in_block": 15,
"virtual_op": 0
}2017/10/04 16:04:36
2017/10/04 16:04:36
| author | steemitboard |
| body | Congratulations @electroman! You have completed some achievement on Steemit and have been rewarded with new badge(s) : [](http://steemitboard.com/@electroman) 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 | electroman |
| parent permlink | 4-main-3 |
| permlink | steemitboard-notify-electroman-20171004t160436000z |
| title | |
| Transaction Info | Block #16039214/Trx 14a776ca7a30d73df01f4994091e3303594d35b6 |
View Raw JSON Data
{
"block": 16039214,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @electroman! You have completed some achievement on Steemit and have been rewarded with new badge(s) :\n\n[](http://steemitboard.com/@electroman) 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": "electroman",
"parent_permlink": "4-main-3",
"permlink": "steemitboard-notify-electroman-20171004t160436000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2017-10-04T16:04:36",
"trx_id": "14a776ca7a30d73df01f4994091e3303594d35b6",
"trx_in_block": 19,
"virtual_op": 0
}electromanupvoted (100.00%) @facer / steem2017/10/04 13:04:54
electromanupvoted (100.00%) @facer / steem
2017/10/04 13:04:54
| author | facer |
| permlink | steem |
| voter | electroman |
| weight | 10000 (100.00%) |
| Transaction Info | Block #16035621/Trx 71ac2814cd70daa9c33eb5b96c3f3021d3fb90fa |
View Raw JSON Data
{
"block": 16035621,
"op": [
"vote",
{
"author": "facer",
"permlink": "steem",
"voter": "electroman",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2017-10-04T13:04:54",
"trx_id": "71ac2814cd70daa9c33eb5b96c3f3021d3fb90fa",
"trx_in_block": 3,
"virtual_op": 0
}2017/10/04 12:54:45
2017/10/04 12:54:45
| author | electroman |
| body | 为什么我找不到转发或者收藏的按钮呢? |
| json metadata | {"tags":["cn"],"app":"steemit/0.1"} |
| parent author | rivalhw |
| parent permlink | steem-sbd |
| permlink | re-rivalhw-steem-sbd-20171004t125442818z |
| title | |
| Transaction Info | Block #16035418/Trx 85de99916202dd2ff07c92d06be854e900e4841f |
View Raw JSON Data
{
"block": 16035418,
"op": [
"comment",
{
"author": "electroman",
"body": "为什么我找不到转发或者收藏的按钮呢?",
"json_metadata": "{\"tags\":[\"cn\"],\"app\":\"steemit/0.1\"}",
"parent_author": "rivalhw",
"parent_permlink": "steem-sbd",
"permlink": "re-rivalhw-steem-sbd-20171004t125442818z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2017-10-04T12:54:45",
"trx_id": "85de99916202dd2ff07c92d06be854e900e4841f",
"trx_in_block": 13,
"virtual_op": 0
}electromanfollowed @facer2017/10/04 11:39:03
electromanfollowed @facer
2017/10/04 11:39:03
| id | follow |
| json | ["follow",{"follower":"electroman","following":"facer","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["electroman"] |
| Transaction Info | Block #16033904/Trx 4cc33d400f2dac5f8b7573a36dead1a7975e03a9 |
View Raw JSON Data
{
"block": 16033904,
"op": [
"custom_json",
{
"id": "follow",
"json": "[\"follow\",{\"follower\":\"electroman\",\"following\":\"facer\",\"what\":[\"blog\"]}]",
"required_auths": [],
"required_posting_auths": [
"electroman"
]
}
],
"op_in_trx": 0,
"timestamp": "2017-10-04T11:39:03",
"trx_id": "4cc33d400f2dac5f8b7573a36dead1a7975e03a9",
"trx_in_block": 42,
"virtual_op": 0
}electromanfollowed @rivalhw2017/10/04 11:35:27
electromanfollowed @rivalhw
2017/10/04 11:35:27
| id | follow |
| json | ["follow",{"follower":"electroman","following":"rivalhw","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["electroman"] |
| Transaction Info | Block #16033832/Trx 6596115efc2f28493339e4f15785fc2626e3871a |
View Raw JSON Data
{
"block": 16033832,
"op": [
"custom_json",
{
"id": "follow",
"json": "[\"follow\",{\"follower\":\"electroman\",\"following\":\"rivalhw\",\"what\":[\"blog\"]}]",
"required_auths": [],
"required_posting_auths": [
"electroman"
]
}
],
"op_in_trx": 0,
"timestamp": "2017-10-04T11:35:27",
"trx_id": "6596115efc2f28493339e4f15785fc2626e3871a",
"trx_in_block": 6,
"virtual_op": 0
}electromanpublished a new post: 4-main-32017/10/04 10:39:15
electromanpublished a new post: 4-main-3
2017/10/04 10:39:15
| author | electroman |
| body | AppInit()函数 App初始化函数  1)boost::thread_groupthreadGroup 在AppInit函数中,需要声明线程组变量的时候,可以调用这个空间的类来定义,即 boost::thread_group threadGroup; 注:Thread_group是线程组的意思,可以实现多个线程统一管理。 关于线程组可参考 http://blog.sina.com.cn/s/blog_788c13b00100v7ma.html http://www.jianshu.com/p/0b2e360243f4 http://zh.highscore.de/cpp/boost/multithreading.html boost是库函数,我们在编译系统是,会先编译boost库 sudo apt-get install libboost-all-dev //安装boost标准库(c++) 因此,源码中,可以直接调用boost 那为什么还要在init.h中声明一个 class thread_group呢?  因为init.h中使用了boost::thread,如下图  但是并没有包含 #include<boost/thread.hpp> 所以,做了一个前向声明 namespace boost { class thread_group; } // namespace boost 这样init.h中就可以识别boost::thread_group了, 而在init.cpp中在包含thread.cpp,实现thread_group 2)Cscheduler scheduler 类Cscheduler,定义在src/Scheduler.h,实现在src/Scheduler.cpp 该类的目的是:管理周期运行或临时运行的任务 区块链研习社比特币源码研读班 electroman 以下是广告 我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。  |
| json metadata | {"tags":["btc"],"image":["https://steemitimages.com/DQmVurq6Fyxzo8brt5H3vFbHYuSjiN1T6rXUozXzvVx8y6M/1.png","https://steemitimages.com/DQmVLu4ZvdbsmqQJe9wSdofeHPv28C4RSXDTcmP3EZNCG3R/2.png","https://steemitimages.com/DQmZggMHNLvDaX8KGEc5CCSJWuzgtDWdBeCN19NRzHscPep/3.png","https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | btc |
| permlink | 4-main-3 |
| title | 比特币源码研读(4)-main函数(3) |
| Transaction Info | Block #16032708/Trx 7e96c9427d5cf1a7f70443c559716b527361899f |
View Raw JSON Data
{
"block": 16032708,
"op": [
"comment",
{
"author": "electroman",
"body": "AppInit()函数\n\nApp初始化函数\n\n\n\n\n1)boost::thread_groupthreadGroup\n\n在AppInit函数中,需要声明线程组变量的时候,可以调用这个空间的类来定义,即\n\n boost::thread_group threadGroup;\n注:Thread_group是线程组的意思,可以实现多个线程统一管理。\n\n关于线程组可参考\n\n http://blog.sina.com.cn/s/blog_788c13b00100v7ma.html\n http://www.jianshu.com/p/0b2e360243f4\n http://zh.highscore.de/cpp/boost/multithreading.html\n\nboost是库函数,我们在编译系统是,会先编译boost库\n\n sudo apt-get install libboost-all-dev //安装boost标准库(c++)\n因此,源码中,可以直接调用boost\n\n那为什么还要在init.h中声明一个 class thread_group呢?\n\n\n\n因为init.h中使用了boost::thread,如下图\n\n\n\n\n但是并没有包含\n\n #include<boost/thread.hpp>\n所以,做了一个前向声明\n\n namespace boost\n {\n class thread_group; \n } // namespace boost\n\n这样init.h中就可以识别boost::thread_group了,\n\n而在init.cpp中在包含thread.cpp,实现thread_group\n\n2)Cscheduler scheduler\n\n类Cscheduler,定义在src/Scheduler.h,实现在src/Scheduler.cpp\n\n该类的目的是:管理周期运行或临时运行的任务\n\n\n区块链研习社比特币源码研读班 electroman\n\n以下是广告\n\n我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。\n\n",
"json_metadata": "{\"tags\":[\"btc\"],\"image\":[\"https://steemitimages.com/DQmVurq6Fyxzo8brt5H3vFbHYuSjiN1T6rXUozXzvVx8y6M/1.png\",\"https://steemitimages.com/DQmVLu4ZvdbsmqQJe9wSdofeHPv28C4RSXDTcmP3EZNCG3R/2.png\",\"https://steemitimages.com/DQmZggMHNLvDaX8KGEc5CCSJWuzgtDWdBeCN19NRzHscPep/3.png\",\"https://steemitimages.com/DQmZ7DkPcTbD4WMdTaamcyqhDEFi1WHQRPUaaC9hQjUfpxK/%E5%8C%BA%E5%9D%97%E9%93%BE%E7%A0%94%E4%B9%A0%E7%A4%BE%E5%B8%81%E5%9C%88%E4%BA%A4%E6%B5%81.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "btc",
"permlink": "4-main-3",
"title": "比特币源码研读(4)-main函数(3)"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-04T10:39:15",
"trx_id": "7e96c9427d5cf1a7f70443c559716b527361899f",
"trx_in_block": 22,
"virtual_op": 0
}electromanupdated options for 3-main-22017/10/01 12:39:00
electromanupdated options for 3-main-2
2017/10/01 12:39:00
| allow curation rewards | true |
| allow votes | true |
| author | electroman |
| extensions | [] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 0 |
| permlink | 3-main-2 |
| Transaction Info | Block #15948837/Trx 5798297b9fe2dcacb7338bbaa0624c964265bf7c |
View Raw JSON Data
{
"block": 15948837,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "electroman",
"extensions": [],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 0,
"permlink": "3-main-2"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-01T12:39:00",
"trx_id": "5798297b9fe2dcacb7338bbaa0624c964265bf7c",
"trx_in_block": 12,
"virtual_op": 0
}electromanpublished a new post: 3-main-22017/10/01 12:39:00
electromanpublished a new post: 3-main-2
2017/10/01 12:39:00
| author | electroman |
| body | 今天介绍noui_connect(). noui_connect()位于noui.cpp文件中,line52。该文件实现无操作界面情况下的信息连接。 void noui_connect() { // Connectbitcoind signal handlers uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox); uiInterface.ThreadSafeQuestion.connect(noui_ThreadSafeQuestion); uiInterface.InitMessage.connect(noui_InitMessage); } 分别处理消息弹出框,问题询问,消息初始化。 uiInterface是一个CClientUIInterface类,在ui_interface.h中声明,line27。 CClientUIInterface uiInterface; 下面,我们看CClientUIInterface中对ThreadSafeMessageBox,ThreadSafeQuestion InitMessage三个变量的定义。已ThreadSafeMessageBox为例。 ThreadSafeMessageBox定义 boost::signals2::signal> ThreadSafeMessageBox; 抽象一下,就是boost::signals2::signalThreadSafeMessageBox 这里用到了信号/槽的概念,google了很多,但仍不太明白,试着按照我的理解做个说明。有理解错误的地方,希望大神指证。 信号槽定义:信号就是某个事件发生时,发出的通知(被观察者)给所有监听这个信息的函数(观察者)。槽是所有可能处理这个通知的函数(观察者)。当信号发生时,信号发出者有义务告诉(调用)所有对这个信息感兴趣的槽,说“我来了,你们看着办”。每个槽也可以同时监控多个信号,根据不同的信号进行不同的处理。因此,信号和槽是多对多的关系,一个信号可以给多个槽,一个槽也可以监控多个信号。 Signals2是基于boost的库函数,其中connect函数是插槽管理函数,它把插槽连接到信号上。 在看第一行代码: uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox); 信号ThreadSafeMessageBox(下图中1),通过插槽管理函数connect(下图中的2)连接到槽noui_ThreadSafeMessageBox(下图中的3)上。  在反回去看定义,bool函数就是信号ThreadSafeMessageBox对应的槽必须具备的要求,bool值就是这个槽函数的返回值类型。即ThreadSafeMessageBox信号对应的槽函数应该是 bool (const std::string& message, const std::string& caption, unsigned int style), 这个槽函数的返回值类型是 boost::signals2::last_value 我们在看第一行代码 uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox); noui_ThreadSafeMessageBox,定义在noui.cpp文件中, line15。 其函数定义static bool noui_ThreadSafeMessageBox(const std::string& message, const std::string& caption, unsigned int style)。是不是与信号里的一致。  信号中要求的槽函数定义  noui_ThreadSafeMessageBox函数的输入变量 至此,noui_connect的信号流程算是了解了。 但对于信号/槽,signals库并不上很了解,尤其是里面常用的库函数 Connect函数,Disconnect函数等,并不熟悉,改天在仔细看看。 区块链研习社比特币源码研读班 electroman |
| json metadata | {"tags":["btc"],"image":["https://steemitimages.com/DQmP7M1F8vBNLpLN8bLZfoJDBgAAUYgMVSsYH3PjF84ufzZ/1.png","https://steemitimages.com/DQmbPbn8UApzv8XbDo28gUL6jYgD4cPaVhm5dkNh2RxcGks/2.png","https://steemitimages.com/DQmQG7aJaagbE68BdbCMBcHWkYuzrEKG4bEJAi9MtV1RTug/3.png"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | btc |
| permlink | 3-main-2 |
| title | 比特币源码研读(3)-main(2) |
| Transaction Info | Block #15948837/Trx 5798297b9fe2dcacb7338bbaa0624c964265bf7c |
View Raw JSON Data
{
"block": 15948837,
"op": [
"comment",
{
"author": "electroman",
"body": "今天介绍noui_connect().\n\nnoui_connect()位于noui.cpp文件中,line52。该文件实现无操作界面情况下的信息连接。\n\nvoid noui_connect()\n\n{\n\n// Connectbitcoind signal handlers\n\nuiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox);\n\nuiInterface.ThreadSafeQuestion.connect(noui_ThreadSafeQuestion);\n\nuiInterface.InitMessage.connect(noui_InitMessage);\n\n}\n\n分别处理消息弹出框,问题询问,消息初始化。\n\nuiInterface是一个CClientUIInterface类,在ui_interface.h中声明,line27。\n\nCClientUIInterface uiInterface;\n\n下面,我们看CClientUIInterface中对ThreadSafeMessageBox,ThreadSafeQuestion\n\nInitMessage三个变量的定义。已ThreadSafeMessageBox为例。\n\nThreadSafeMessageBox定义\n\nboost::signals2::signal> ThreadSafeMessageBox;\n\n抽象一下,就是boost::signals2::signalThreadSafeMessageBox\n\n这里用到了信号/槽的概念,google了很多,但仍不太明白,试着按照我的理解做个说明。有理解错误的地方,希望大神指证。\n\n信号槽定义:信号就是某个事件发生时,发出的通知(被观察者)给所有监听这个信息的函数(观察者)。槽是所有可能处理这个通知的函数(观察者)。当信号发生时,信号发出者有义务告诉(调用)所有对这个信息感兴趣的槽,说“我来了,你们看着办”。每个槽也可以同时监控多个信号,根据不同的信号进行不同的处理。因此,信号和槽是多对多的关系,一个信号可以给多个槽,一个槽也可以监控多个信号。\n\nSignals2是基于boost的库函数,其中connect函数是插槽管理函数,它把插槽连接到信号上。\n\n在看第一行代码:\n\nuiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox);\n\n信号ThreadSafeMessageBox(下图中1),通过插槽管理函数connect(下图中的2)连接到槽noui_ThreadSafeMessageBox(下图中的3)上。\n\n\n\n在反回去看定义,bool函数就是信号ThreadSafeMessageBox对应的槽必须具备的要求,bool值就是这个槽函数的返回值类型。即ThreadSafeMessageBox信号对应的槽函数应该是\n\nbool (const std::string& message, const std::string& caption, unsigned int style),\n\n这个槽函数的返回值类型是\n\nboost::signals2::last_value\n\n我们在看第一行代码\n\nuiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox);\n\nnoui_ThreadSafeMessageBox,定义在noui.cpp文件中, line15。\n\n其函数定义static bool noui_ThreadSafeMessageBox(const std::string&\n\nmessage, const std::string& caption, unsigned int style)。是不是与信号里的一致。\n\n\n\n信号中要求的槽函数定义\n\n\n\nnoui_ThreadSafeMessageBox函数的输入变量\n\n至此,noui_connect的信号流程算是了解了。\n\n但对于信号/槽,signals库并不上很了解,尤其是里面常用的库函数\n\nConnect函数,Disconnect函数等,并不熟悉,改天在仔细看看。\n\n区块链研习社比特币源码研读班 electroman",
"json_metadata": "{\"tags\":[\"btc\"],\"image\":[\"https://steemitimages.com/DQmP7M1F8vBNLpLN8bLZfoJDBgAAUYgMVSsYH3PjF84ufzZ/1.png\",\"https://steemitimages.com/DQmbPbn8UApzv8XbDo28gUL6jYgD4cPaVhm5dkNh2RxcGks/2.png\",\"https://steemitimages.com/DQmQG7aJaagbE68BdbCMBcHWkYuzrEKG4bEJAi9MtV1RTug/3.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "btc",
"permlink": "3-main-2",
"title": "比特币源码研读(3)-main(2)"
}
],
"op_in_trx": 0,
"timestamp": "2017-10-01T12:39:00",
"trx_id": "5798297b9fe2dcacb7338bbaa0624c964265bf7c",
"trx_in_block": 12,
"virtual_op": 0
}electromanupdated options for imtoken2017/09/24 13:41:48
electromanupdated options for imtoken
2017/09/24 13:41:48
| allow curation rewards | true |
| allow votes | true |
| author | electroman |
| extensions | [] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 0 |
| permlink | imtoken |
| Transaction Info | Block #15748567/Trx 9cda7ddeff14e4298a37557e0594f6fef0867363 |
View Raw JSON Data
{
"block": 15748567,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "electroman",
"extensions": [],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 0,
"permlink": "imtoken"
}
],
"op_in_trx": 0,
"timestamp": "2017-09-24T13:41:48",
"trx_id": "9cda7ddeff14e4298a37557e0594f6fef0867363",
"trx_in_block": 10,
"virtual_op": 0
}electromanpublished a new post: imtoken2017/09/24 13:41:48
electromanpublished a new post: imtoken
2017/09/24 13:41:48
| author | electroman |
| body | 昨天imtoken钱包被盗,写出过程来,供大家参考。 下午,计划直投EOS,第一次投,经验不足。于是,参考higer的教程,开始操作。 教程中提示,从myetherwall官网上投。但因为很少登陆,没有将官网加书签。于是从谷歌上搜索了myetherwall地址。 进到官网,导入自己的keystore,输入密码,提示密码错误,以为自己输错了,又重新输入了一遍,进入到钱包,能看到自己的所有资产。并没有起什么疑心。 接着又看了看EOS的教程和EOS上的一些信息,正巧此时,有朋友来访,所以,关上电脑出去了。今天就没有操作。 第二天,打开电脑继续投EOS,同样的从谷歌搜索myetherwall,进入官网,输入keystore,输入密码,结果,突然发现,自己的资产全部为0,心里一震。马上查看自己的手机钱包imtoken,果然已经全部被转走了。查看转入时间,就是昨天,我关闭电脑10分钟以后。 当时很震惊,一是因为资产被盗,另外是因为,不知道自己那个环节出错了。因此,不知道以后改怎么办。我在精英群里诉说我的经历,大家都很热情,提了很多可疑点:电脑是否中毒,私钥是否泄露,别人是否用过自己的电脑等等。后来有人提到钓鱼网站,我才隐隐约约的想起今天登陆的网址和昨天的好像不一样,于是查看浏览器的历史记录,发现,昨天登陆的果然是个钓鱼网址。问题的根源也就出在这个基本的环节上。 现在,回想昨天的整个过程,实际上,自己从谷歌搜索出地址以后,是有过怀疑的,所以今天在搜索出正确的地址,才会有疑惑。但当时,自己并没有台太在意。 因此,自己真正意识到,在自己的潜意识里,实际上并不重视资产保护,尽管我看了很多关于钱包注意事项的文章,尽管我把keystore单独存在一个不接触网络的U盘上,尽管我把私钥写到纸上,尽管我建立钱包的时候是用的离线模式。但没经历过被盗经历,对自己的防护有很有信心,所以,就在这种低级问题上犯了错误。 因此,对于钱包的重视是一方面,对自己的操作过程的每一步也要注意。 总结一些昨天大家的意见,供大家参考 1 重要的网址要加入标签,最好自己记下来。 2 重要网址的标识一定要记清 3 网址上钱包密码第一次输错,如果能进去,则一定有问题(感谢“小天下”) 4 输入密码时,如果第一次输对,但没进入,则切换到另一个电脑上试试,如果能进,则可能有问题。 5 有需要输入验证码的,如果第一次输入正确,要求再次输入,那么一定注意 (以上两点,就要求输入密码和验证码的时候,一定小心,确保输入正确,避免怀疑自己是否打错的可能性,我就是经常输入密码错误,所以在输入正确的时候,网址却提示错误,我没起疑心) 6 可以把资产分几个钱包存,这样被盗也只是部分资产。 下面是精英群的丁昆朋YKPD总结的关于钱包的注意事项,大家也可以参考。 http://www.jianshu.com/p/516dc5ab7d4e 如果您有更多的注意事项或者相关的文章,请您留言,我将继续完善“避免被盗技巧“。感谢! 如果对朋友们有所帮助,请留下您的脚印,也可到我的steemit上去看看,点个赞。 |
| json metadata | {"tags":["imtoken"],"links":["http://www.jianshu.com/p/516dc5ab7d4e"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | imtoken |
| permlink | imtoken |
| title | imtoken被盗经历 |
| Transaction Info | Block #15748567/Trx 9cda7ddeff14e4298a37557e0594f6fef0867363 |
View Raw JSON Data
{
"block": 15748567,
"op": [
"comment",
{
"author": "electroman",
"body": "昨天imtoken钱包被盗,写出过程来,供大家参考。\n\n下午,计划直投EOS,第一次投,经验不足。于是,参考higer的教程,开始操作。\n\n教程中提示,从myetherwall官网上投。但因为很少登陆,没有将官网加书签。于是从谷歌上搜索了myetherwall地址。\n\n进到官网,导入自己的keystore,输入密码,提示密码错误,以为自己输错了,又重新输入了一遍,进入到钱包,能看到自己的所有资产。并没有起什么疑心。\n\n接着又看了看EOS的教程和EOS上的一些信息,正巧此时,有朋友来访,所以,关上电脑出去了。今天就没有操作。\n\n第二天,打开电脑继续投EOS,同样的从谷歌搜索myetherwall,进入官网,输入keystore,输入密码,结果,突然发现,自己的资产全部为0,心里一震。马上查看自己的手机钱包imtoken,果然已经全部被转走了。查看转入时间,就是昨天,我关闭电脑10分钟以后。\n\n当时很震惊,一是因为资产被盗,另外是因为,不知道自己那个环节出错了。因此,不知道以后改怎么办。我在精英群里诉说我的经历,大家都很热情,提了很多可疑点:电脑是否中毒,私钥是否泄露,别人是否用过自己的电脑等等。后来有人提到钓鱼网站,我才隐隐约约的想起今天登陆的网址和昨天的好像不一样,于是查看浏览器的历史记录,发现,昨天登陆的果然是个钓鱼网址。问题的根源也就出在这个基本的环节上。\n\n现在,回想昨天的整个过程,实际上,自己从谷歌搜索出地址以后,是有过怀疑的,所以今天在搜索出正确的地址,才会有疑惑。但当时,自己并没有台太在意。\n\n因此,自己真正意识到,在自己的潜意识里,实际上并不重视资产保护,尽管我看了很多关于钱包注意事项的文章,尽管我把keystore单独存在一个不接触网络的U盘上,尽管我把私钥写到纸上,尽管我建立钱包的时候是用的离线模式。但没经历过被盗经历,对自己的防护有很有信心,所以,就在这种低级问题上犯了错误。\n\n因此,对于钱包的重视是一方面,对自己的操作过程的每一步也要注意。\n\n总结一些昨天大家的意见,供大家参考\n\n1 重要的网址要加入标签,最好自己记下来。\n\n2 重要网址的标识一定要记清\n\n3 网址上钱包密码第一次输错,如果能进去,则一定有问题(感谢“小天下”)\n\n4 输入密码时,如果第一次输对,但没进入,则切换到另一个电脑上试试,如果能进,则可能有问题。\n\n5 有需要输入验证码的,如果第一次输入正确,要求再次输入,那么一定注意\n\n(以上两点,就要求输入密码和验证码的时候,一定小心,确保输入正确,避免怀疑自己是否打错的可能性,我就是经常输入密码错误,所以在输入正确的时候,网址却提示错误,我没起疑心)\n\n6 可以把资产分几个钱包存,这样被盗也只是部分资产。\n\n下面是精英群的丁昆朋YKPD总结的关于钱包的注意事项,大家也可以参考。\nhttp://www.jianshu.com/p/516dc5ab7d4e\n如果您有更多的注意事项或者相关的文章,请您留言,我将继续完善“避免被盗技巧“。感谢!\n如果对朋友们有所帮助,请留下您的脚印,也可到我的steemit上去看看,点个赞。",
"json_metadata": "{\"tags\":[\"imtoken\"],\"links\":[\"http://www.jianshu.com/p/516dc5ab7d4e\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "imtoken",
"permlink": "imtoken",
"title": "imtoken被盗经历"
}
],
"op_in_trx": 0,
"timestamp": "2017-09-24T13:41:48",
"trx_id": "9cda7ddeff14e4298a37557e0594f6fef0867363",
"trx_in_block": 10,
"virtual_op": 0
}fitzgibbonupvoted (10.00%) @electroman / 2-main-12017/09/15 10:59:09
fitzgibbonupvoted (10.00%) @electroman / 2-main-1
2017/09/15 10:59:09
| author | electroman |
| permlink | 2-main-1 |
| voter | fitzgibbon |
| weight | 1000 (10.00%) |
| Transaction Info | Block #15486195/Trx 556d49371ae84b0b27f4d3d538a91e374597d818 |
View Raw JSON Data
{
"block": 15486195,
"op": [
"vote",
{
"author": "electroman",
"permlink": "2-main-1",
"voter": "fitzgibbon",
"weight": 1000
}
],
"op_in_trx": 0,
"timestamp": "2017-09-15T10:59:09",
"trx_id": "556d49371ae84b0b27f4d3d538a91e374597d818",
"trx_in_block": 2,
"virtual_op": 0
}fitzgibbonreplied to @electroman / re-2-main-1-20170915t1058442017/09/15 10:59:06
fitzgibbonreplied to @electroman / re-2-main-1-20170915t105844
2017/09/15 10:59:06
| author | fitzgibbon |
| body | [ ](https://steemit.com/@fitzgibbon)<br> <br>I sometimes worry about bitcoin at night. There is some comfort in thinking that every night, we are getting closer to the moon. |
| json metadata | {"app": "pysteem/0.5.6"} |
| parent author | electroman |
| parent permlink | 2-main-1 |
| permlink | re-2-main-1-20170915t105844 |
| title | |
| Transaction Info | Block #15486194/Trx 3035f3f8b93e0a5eb28a00090a358181c0cda5a4 |
View Raw JSON Data
{
"block": 15486194,
"op": [
"comment",
{
"author": "fitzgibbon",
"body": "[ ](https://steemit.com/@fitzgibbon)<br> <br>I sometimes worry about bitcoin at night. There is some comfort in thinking that every night, we are getting closer to the moon.",
"json_metadata": "{\"app\": \"pysteem/0.5.6\"}",
"parent_author": "electroman",
"parent_permlink": "2-main-1",
"permlink": "re-2-main-1-20170915t105844",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2017-09-15T10:59:06",
"trx_id": "3035f3f8b93e0a5eb28a00090a358181c0cda5a4",
"trx_in_block": 25,
"virtual_op": 0
}ubgupvoted (1.00%) @electroman / 2-main-12017/09/13 16:21:39
ubgupvoted (1.00%) @electroman / 2-main-1
2017/09/13 16:21:39
| author | electroman |
| permlink | 2-main-1 |
| voter | ubg |
| weight | 100 (1.00%) |
| Transaction Info | Block #15435054/Trx 15ccf95ea9909f023fca3c74b8ab0567eaa2371e |
View Raw JSON Data
{
"block": 15435054,
"op": [
"vote",
{
"author": "electroman",
"permlink": "2-main-1",
"voter": "ubg",
"weight": 100
}
],
"op_in_trx": 0,
"timestamp": "2017-09-13T16:21:39",
"trx_id": "15ccf95ea9909f023fca3c74b8ab0567eaa2371e",
"trx_in_block": 6,
"virtual_op": 0
}electromanupdated options for 2-main-12017/09/13 15:59:36
electromanupdated options for 2-main-1
2017/09/13 15:59:36
| allow curation rewards | true |
| allow votes | true |
| author | electroman |
| extensions | [] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 0 |
| permlink | 2-main-1 |
| Transaction Info | Block #15434614/Trx e458159f8dfdb6b2f7d474637e489feb483bedea |
View Raw JSON Data
{
"block": 15434614,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "electroman",
"extensions": [],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 0,
"permlink": "2-main-1"
}
],
"op_in_trx": 0,
"timestamp": "2017-09-13T15:59:36",
"trx_id": "e458159f8dfdb6b2f7d474637e489feb483bedea",
"trx_in_block": 16,
"virtual_op": 0
}electromanpublished a new post: 2-main-12017/09/13 15:59:36
electromanpublished a new post: 2-main-1
2017/09/13 15:59:36
| author | electroman |
| body | 比特币源码研读(2)-main函数(1) main函数介绍 Main函数位置:bitcoin/src/bitcoind.cpp Main函数流程图: Main函数的框架很简单,设置环境进行noui_connect()(无界面通信)----初始化参数-----返回是否成功值。 SetupEnvironment()函数 在util.cpp中。 该函数分为三部分:内存分配区设置,本地化设置,本地化文件路径设置 voidSetupEnvironment() { #ifdef HAVE_MALLOPT_ARENA_MAX // glibc-specific: On 32-bit systems setthe number of arenas to 1. // By default, since glibc 2.10, the Clibrary will create up to two heap // arenas per core. This is known to causeexcessive virtual address space // usage in our usage. Work around it bysetting the maximum number of // arenas to 1. if (sizeof(void*) == 4) { mallopt(M_ARENA_MAX, 1); } #endif 说明: 内存分配区设置,32位体统中,arenas设置位1,从glibc2.10开始,C库默认每个core创建2个heap arenas。众所周知,这会引起过多的虚拟地址空间使用。因此设置arenas最大值为1 // On most POSIX systems (e.g. Linux, butnot BSD) the environment's locale // may be invalid, in which case the"C" locale is used as fallback. #if !defined(WIN32) &&!defined(MAC_OSX) && !defined(__FreeBSD__) &&!defined(__OpenBSD__) //如果不是POSIX系统 try { std::locale(""); // Raises aruntime error if current locale is invalid //如果本地系统无效,则报runtime error错误 } catch (const std::runtime_error&) { setenv("LC_ALL", "C",1); //检测到runtime error,查询本地的C相关的变量 } #endif 说明 本地化设置。在大部分的POSIX系统中,(比如linux,但不上BSD系统),本地环境都是无效的,在此情况下,C会fallback // The path locale is lazy initializedand to avoid deinitialization errors // in multithreading environments, it isset explicitly by the main thread. // A dummy locale is used to extract theinternal default locale, used by // fs::path, which is then used toexplicitly imbue the path. std::locale loc =fs::path::imbue(std::locale::classic()); fs::path::imbue(loc);//使用本地区域语言 } 说明: 使用本地语言。地化文件路径设置,我理解的这段代码意思,读取本地的语言类型,比如中文, 本地路径会被延迟初始化,为了避免在多个线程环境中出现未定义错误,在main主线程中会被单独设置,通过fs::path命令,dummy locale提取内部默认路径,用于明确地imbue the path 知识普及: QT:linux种的C++的图形库,用于应用程序开发 try:c++中处理异常数据用。如果try语句块中的程序段发生异常,且抛弃了该异常,则这个异常就 可以被try语句块语句块后面的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常 类型与chatch语句的异常类型相匹配。 POSIX :可移植操作系统portable operating system interface Locate:让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内 所有档案名称及路径的数据库,之后当寻找时就只需要查询这个数据库,而不必实际深入档 案系统之中 setenv命令:查询和显示环境变量 imbue函数:输出使用的区域语言对象 |
| json metadata | {"tags":["btc","ifdef","endif","if"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | btc |
| permlink | 2-main-1 |
| title | 比特币源码研读(2)-main(1) |
| Transaction Info | Block #15434614/Trx e458159f8dfdb6b2f7d474637e489feb483bedea |
View Raw JSON Data
{
"block": 15434614,
"op": [
"comment",
{
"author": "electroman",
"body": "比特币源码研读(2)-main函数(1)\n\nmain函数介绍\n\nMain函数位置:bitcoin/src/bitcoind.cpp\n\nMain函数流程图:\n\n\n\n\nMain函数的框架很简单,设置环境进行noui_connect()(无界面通信)----初始化参数-----返回是否成功值。\n\nSetupEnvironment()函数\n\n在util.cpp中。\n\n该函数分为三部分:内存分配区设置,本地化设置,本地化文件路径设置\n\n\n\n\nvoidSetupEnvironment()\n\n{\n\n#ifdef HAVE_MALLOPT_ARENA_MAX\n\n// glibc-specific: On 32-bit systems setthe number of arenas to 1.\n\n// By default, since glibc 2.10, the Clibrary will create up to two heap\n\n// arenas per core. This is known to causeexcessive virtual address space\n\n// usage in our usage. Work around it bysetting the maximum number of\n\n// arenas to 1.\n\nif (sizeof(void*) == 4) {\n\nmallopt(M_ARENA_MAX, 1);\n\n}\n\n#endif\n说明:\n\n内存分配区设置,32位体统中,arenas设置位1,从glibc2.10开始,C库默认每个core创建2个heap arenas。众所周知,这会引起过多的虚拟地址空间使用。因此设置arenas最大值为1\n\n// On most POSIX systems (e.g. Linux, butnot BSD) the environment's locale\n\n// may be invalid, in which case the\"C\" locale is used as fallback.\n\n#if !defined(WIN32) &&!defined(MAC_OSX) && !defined(__FreeBSD__) &&!defined(__OpenBSD__) //如果不是POSIX系统\n\ntry {\n\nstd::locale(\"\"); // Raises aruntime error if current locale is invalid\n\n //如果本地系统无效,则报runtime error错误\n\n} catch (const std::runtime_error&) {\n\nsetenv(\"LC_ALL\", \"C\",1); //检测到runtime error,查询本地的C相关的变量\n\n}\n\n#endif\n说明\n\n本地化设置。在大部分的POSIX系统中,(比如linux,但不上BSD系统),本地环境都是无效的,在此情况下,C会fallback\n\n// The path locale is lazy initializedand to avoid deinitialization errors\n\n// in multithreading environments, it isset explicitly by the main thread.\n\n// A dummy locale is used to extract theinternal default locale, used by\n\n// fs::path, which is then used toexplicitly imbue the path.\n\nstd::locale loc =fs::path::imbue(std::locale::classic());\n\nfs::path::imbue(loc);//使用本地区域语言\n\n}\n说明:\n\n使用本地语言。地化文件路径设置,我理解的这段代码意思,读取本地的语言类型,比如中文,\n\n本地路径会被延迟初始化,为了避免在多个线程环境中出现未定义错误,在main主线程中会被单独设置,通过fs::path命令,dummy locale提取内部默认路径,用于明确地imbue the path\n\n知识普及:\n\nQT:linux种的C++的图形库,用于应用程序开发\n\ntry:c++中处理异常数据用。如果try语句块中的程序段发生异常,且抛弃了该异常,则这个异常就 可以被try语句块语句块后面的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常 类型与chatch语句的异常类型相匹配。\n\nPOSIX :可移植操作系统portable operating system interface\n\nLocate:让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内 所有档案名称及路径的数据库,之后当寻找时就只需要查询这个数据库,而不必实际深入档 案系统之中\n\nsetenv命令:查询和显示环境变量\n\nimbue函数:输出使用的区域语言对象",
"json_metadata": "{\"tags\":[\"btc\",\"ifdef\",\"endif\",\"if\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "btc",
"permlink": "2-main-1",
"title": "比特币源码研读(2)-main(1)"
}
],
"op_in_trx": 0,
"timestamp": "2017-09-13T15:59:36",
"trx_id": "e458159f8dfdb6b2f7d474637e489feb483bedea",
"trx_in_block": 16,
"virtual_op": 0
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress46.39%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779062022
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779062022
},
"rc_account": {
"account": "electroman",
"max_rc": "10164408779",
"max_rc_creation_adjustment": {
"amount": "2020748973",
"nai": "@@000000037",
"precision": 6
},
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779062022
}
}
}Account Metadata
| POSTING JSON METADATA | |
| None | |
| JSON METADATA | |
| None |
{
"posting_json_metadata": {},
"json_metadata": {}
}Auth Keys
Owner
Single Signature
Public Keys
STM6noqEiEmjLjPfmGeWigF8Ch3r4v5cz4Zcs5cJnEeFEWkZZD8rU1/1
Active
Single Signature
Public Keys
STM6KLWdYd1Lq4fG1rwTjUBxtGRYYN8Uqtc6CPh2xr2gi6Z9Q3GsJ1/1
Posting
Single Signature
Public Keys
STM7WgMxYWiz7gCFat6TW3QrY4LXjVJqFg7N9fBGq82jGteUfESr81/1
Memo
STM6Gy7eB9yEKDgoKiagcvajh26Vce7XgEcpL34sCBcwKUNbL6g8g
{
"owner": {
"account_auths": [],
"key_auths": [
[
"STM6noqEiEmjLjPfmGeWigF8Ch3r4v5cz4Zcs5cJnEeFEWkZZD8rU",
1
]
],
"weight_threshold": 1
},
"active": {
"account_auths": [],
"key_auths": [
[
"STM6KLWdYd1Lq4fG1rwTjUBxtGRYYN8Uqtc6CPh2xr2gi6Z9Q3GsJ",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [],
"key_auths": [
[
"STM7WgMxYWiz7gCFat6TW3QrY4LXjVJqFg7N9fBGq82jGteUfESr8",
1
]
],
"weight_threshold": 1
},
"memo": "STM6Gy7eB9yEKDgoKiagcvajh26Vce7XgEcpL34sCBcwKUNbL6g8g"
}Witness Votes
0 / 30
No active witness votes.
[]