VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.033USD
STEEM
0.005STEEM
SBD
0.054SBD
Effective Power
5.007SP
├── Own SP
0.126SP
└── Incoming DelegationsDeleg
+4.882SP
Detailed Balance
| STEEM | ||
| balance | 0.001STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.004STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 0.126SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 4.882SP | SP |
| Effective Power | 5.007SP | SP |
| Reward SP (pending) | 0.035SP | 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.054SBD | SBD |
{
"balance": "0.001 STEEM",
"savings_balance": "0.000 STEEM",
"reward_steem_balance": "0.004 STEEM",
"vesting_shares": "204.124416 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "7939.535390 VESTS",
"sbd_balance": "0.000 SBD",
"savings_sbd_balance": "0.000 SBD",
"reward_sbd_balance": "0.054 SBD",
"conversions": []
}Account Info
| name | jc1991 |
| id | 872582 |
| rank | 457,762 |
| reputation | 868709192 |
| created | 2018-03-17T17:11:39 |
| recovery_account | steem |
| proxy | None |
| post_count | 4 |
| comment_count | 0 |
| lifetime_vote_count | 0 |
| witnesses_voted_for | 0 |
| last_post | 2022-07-04T22:50:21 |
| last_root_post | 2022-07-04T22:50:21 |
| last_vote_time | 2022-11-17T02:45:24 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.001 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 0.000 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 204.124416 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 7939.535390 VESTS |
| reward_vesting_balance | 71.400327 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": [
[
"STM7MesXdyFyEYUvzHJi45t8oFnXhkhoCTwEXq3RBewjUPXoR69sp",
1
]
],
"weight_threshold": 1
},
"balance": "0.001 STEEM",
"can_vote": true,
"comment_count": 0,
"created": "2018-03-17T17:11:39",
"curation_rewards": 0,
"delegated_vesting_shares": "0.000000 VESTS",
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779068757
},
"guest_bloggers": [],
"id": 872582,
"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": "2022-07-04T22:50:21",
"last_root_post": "2022-07-04T22:50:21",
"last_vote_time": "2022-11-17T02:45:24",
"lifetime_vote_count": 0,
"market_history": [],
"memo_key": "STM5TTb16kLkSikGG9qfiHYKijGBt9GVFspTJA1qiSsPRHfXvADML",
"mined": false,
"name": "jc1991",
"next_vesting_withdrawal": "1969-12-31T23:59:59",
"other_history": [],
"owner": {
"account_auths": [],
"key_auths": [
[
"STM5xWPzUndjtcgqKFnWbFL4NoBaLhkuPs7NdQK4vj6yvCNcgM9tc",
1
]
],
"weight_threshold": 1
},
"pending_claimed_accounts": 0,
"post_bandwidth": 0,
"post_count": 4,
"post_history": [],
"posting": {
"account_auths": [],
"key_auths": [
[
"STM8aLDmjZX4CPEXCJ4s2yscXME7TUK8Dvg9rAAVVZjMut1ki4fS1",
1
]
],
"weight_threshold": 1
},
"posting_json_metadata": "",
"posting_rewards": 70,
"proxied_vsf_votes": [
0,
0,
0,
0
],
"proxy": "",
"received_vesting_shares": "7939.535390 VESTS",
"recovery_account": "steem",
"reputation": 868709192,
"reset_account": "null",
"reward_sbd_balance": "0.054 SBD",
"reward_steem_balance": "0.004 STEEM",
"reward_vesting_balance": "71.400327 VESTS",
"reward_vesting_steem": "0.035 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": "204.124416 VESTS",
"vesting_withdraw_rate": "0.000000 VESTS",
"vote_history": [],
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779068757
},
"voting_power": 0,
"withdraw_routes": 0,
"withdrawn": 0,
"witness_votes": [],
"witnesses_voted_for": 0,
"rank": 457762
}Withdraw Routes
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
2026/05/18 01:45:57
2026/05/18 01:45:57
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 7939.535390 VESTS |
| Transaction Info | Block #106145253/Trx 1251992401ab9cdebfa5d672a6f81a7ed5ba725d |
View Raw JSON Data
{
"block": 106145253,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "7939.535390 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-18T01:45:57",
"trx_id": "1251992401ab9cdebfa5d672a6f81a7ed5ba725d",
"trx_in_block": 0,
"virtual_op": 0
}2026/05/12 09:59:48
2026/05/12 09:59:48
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 5227.324985 VESTS |
| Transaction Info | Block #105983084/Trx a505ef07d12a66b7da02c0c3484c9aa5e242050c |
View Raw JSON Data
{
"block": 105983084,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "5227.324985 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-12T09:59:48",
"trx_id": "a505ef07d12a66b7da02c0c3484c9aa5e242050c",
"trx_in_block": 0,
"virtual_op": 0
}2026/04/26 01:04:24
2026/04/26 01:04:24
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 7952.051146 VESTS |
| Transaction Info | Block #105512862/Trx 798d26c47276ff5e08a2c7b2e13cfa2d70f28d05 |
View Raw JSON Data
{
"block": 105512862,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "7952.051146 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-04-26T01:04:24",
"trx_id": "798d26c47276ff5e08a2c7b2e13cfa2d70f28d05",
"trx_in_block": 4,
"virtual_op": 0
}2026/01/23 11:52:15
2026/01/23 11:52:15
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 5268.871804 VESTS |
| Transaction Info | Block #102856688/Trx dc682ea00805a67d327b9d5d97d20d461023e0cb |
View Raw JSON Data
{
"block": 102856688,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "5268.871804 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-01-23T11:52:15",
"trx_id": "dc682ea00805a67d327b9d5d97d20d461023e0cb",
"trx_in_block": 8,
"virtual_op": 0
}2024/12/17 07:09:03
2024/12/17 07:09:03
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 5433.091001 VESTS |
| Transaction Info | Block #91303040/Trx 211081a8bef64613e02fd9ddd8ab61b5813e8d3f |
View Raw JSON Data
{
"block": 91303040,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "5433.091001 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2024-12-17T07:09:03",
"trx_id": "211081a8bef64613e02fd9ddd8ab61b5813e8d3f",
"trx_in_block": 3,
"virtual_op": 0
}2023/11/13 22:51:30
2023/11/13 22:51:30
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 5602.224533 VESTS |
| Transaction Info | Block #79857233/Trx 53573387a25973194ca0c5dadda9fc2020628131 |
View Raw JSON Data
{
"block": 79857233,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "5602.224533 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-11-13T22:51:30",
"trx_id": "53573387a25973194ca0c5dadda9fc2020628131",
"trx_in_block": 3,
"virtual_op": 0
}2023/09/21 23:37:15
2023/09/21 23:37:15
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 8539.503319 VESTS |
| Transaction Info | Block #78349973/Trx 316c0005329956fca56f218ee06d1a6196626a6d |
View Raw JSON Data
{
"block": 78349973,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "8539.503319 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-09-21T23:37:15",
"trx_id": "316c0005329956fca56f218ee06d1a6196626a6d",
"trx_in_block": 6,
"virtual_op": 0
}2022/11/17 04:47:42
2022/11/17 04:47:42
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 26763.995226 VESTS |
| Transaction Info | Block #69506366/Trx f624814eb678af7151be4766efa6476e344ba7fd |
View Raw JSON Data
{
"block": 69506366,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "26763.995226 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-11-17T04:47:42",
"trx_id": "f624814eb678af7151be4766efa6476e344ba7fd",
"trx_in_block": 3,
"virtual_op": 0
}2022/11/17 02:45:24
2022/11/17 02:45:24
| author | raven203 |
| permlink | 75e4wf |
| voter | jc1991 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #69503933/Trx 4ef8d08a5beb11ba17fedf9e5ab8fb259958f455 |
View Raw JSON Data
{
"block": 69503933,
"op": [
"vote",
{
"author": "raven203",
"permlink": "75e4wf",
"voter": "jc1991",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2022-11-17T02:45:24",
"trx_id": "4ef8d08a5beb11ba17fedf9e5ab8fb259958f455",
"trx_in_block": 0,
"virtual_op": 0
}2022/11/17 02:45:15
2022/11/17 02:45:15
| author | raven203 |
| permlink | 75e4wf |
| voter | jc1991 |
| weight | -10000 (-100.00%) |
| Transaction Info | Block #69503930/Trx e39b27b0abec6fdd9d1cd7e3e8a6ae1e095913ee |
View Raw JSON Data
{
"block": 69503930,
"op": [
"vote",
{
"author": "raven203",
"permlink": "75e4wf",
"voter": "jc1991",
"weight": -10000
}
],
"op_in_trx": 0,
"timestamp": "2022-11-17T02:45:15",
"trx_id": "e39b27b0abec6fdd9d1cd7e3e8a6ae1e095913ee",
"trx_in_block": 6,
"virtual_op": 0
}2022/11/03 13:10:39
2022/11/03 13:10:39
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 8761.184757 VESTS |
| Transaction Info | Block #69115021/Trx 77119405f7bc6b7c1506cea2ffa1f6aafe5d2ac5 |
View Raw JSON Data
{
"block": 69115021,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "8761.184757 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-11-03T13:10:39",
"trx_id": "77119405f7bc6b7c1506cea2ffa1f6aafe5d2ac5",
"trx_in_block": 9,
"virtual_op": 0
}2022/07/04 23:49:33
2022/07/04 23:49:33
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 27065.620620 VESTS |
| Transaction Info | Block #65636535/Trx b10ac1209e8beaf5760d97dda464154aae4ff23b |
View Raw JSON Data
{
"block": 65636535,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "27065.620620 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-07-04T23:49:33",
"trx_id": "b10ac1209e8beaf5760d97dda464154aae4ff23b",
"trx_in_block": 3,
"virtual_op": 0
}executive-boardsent 0.001 STEEM to @jc1991- "❗ Hello jc1991, great that you are using the STEEM blockchain. The Executive Board is publishing insider infos at https://discord.gg/KyBbmhh on how you will be earning the most coins. It's easy, just ..."2022/07/04 22:52:03
executive-boardsent 0.001 STEEM to @jc1991- "❗ Hello jc1991, great that you are using the STEEM blockchain. The Executive Board is publishing insider infos at https://discord.gg/KyBbmhh on how you will be earning the most coins. It's easy, just ..."
2022/07/04 22:52:03
| amount | 0.001 STEEM |
| from | executive-board |
| memo | ❗ Hello jc1991, great that you are using the STEEM blockchain. The Executive Board is publishing insider infos at https://discord.gg/KyBbmhh on how you will be earning the most coins. It's easy, just follow the instructions. THE 1000X BOOSTER KEY is already waiting for you over there too. 😉 Warm regards, The Executive Board. |
| to | jc1991 |
| Transaction Info | Block #65635393/Trx 9a1955277b13751ea4e2d7265cdaf9f127b66c72 |
View Raw JSON Data
{
"block": 65635393,
"op": [
"transfer",
{
"amount": "0.001 STEEM",
"from": "executive-board",
"memo": "❗ Hello jc1991, great that you are using the STEEM blockchain. The Executive Board is publishing insider infos at https://discord.gg/KyBbmhh on how you will be earning the most coins. It's easy, just follow the instructions. THE 1000X BOOSTER KEY is already waiting for you over there too. 😉 Warm regards, The Executive Board.",
"to": "jc1991"
}
],
"op_in_trx": 0,
"timestamp": "2022-07-04T22:52:03",
"trx_id": "9a1955277b13751ea4e2d7265cdaf9f127b66c72",
"trx_in_block": 7,
"virtual_op": 0
}2022/07/04 22:50:21
2022/07/04 22:50:21
| author | jc1991 |
| body | xads |
| json metadata | {"tags":["dd"],"app":"steemit/0.2","format":"markdown"} |
| parent author | |
| parent permlink | dd |
| permlink | xxx |
| title | xxx |
| Transaction Info | Block #65635359/Trx f0c556d2bda2b1a018a8b361b25e91e86c45da7b |
View Raw JSON Data
{
"block": 65635359,
"op": [
"comment",
{
"author": "jc1991",
"body": "xads",
"json_metadata": "{\"tags\":[\"dd\"],\"app\":\"steemit/0.2\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "dd",
"permlink": "xxx",
"title": "xxx"
}
],
"op_in_trx": 0,
"timestamp": "2022-07-04T22:50:21",
"trx_id": "f0c556d2bda2b1a018a8b361b25e91e86c45da7b",
"trx_in_block": 1,
"virtual_op": 0
}2022/01/17 12:19:06
2022/01/17 12:19:06
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 8981.717988 VESTS |
| Transaction Info | Block #60811040/Trx a5553253aeca10d294c58f3fc9ed3f40522eb5b8 |
View Raw JSON Data
{
"block": 60811040,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "8981.717988 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-01-17T12:19:06",
"trx_id": "a5553253aeca10d294c58f3fc9ed3f40522eb5b8",
"trx_in_block": 5,
"virtual_op": 0
}2021/06/14 02:10:45
2021/06/14 02:10:45
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 9165.486646 VESTS |
| Transaction Info | Block #54609351/Trx b5f988d1dedeabdccee5aa6bdfc02093a41f7157 |
View Raw JSON Data
{
"block": 54609351,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "9165.486646 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2021-06-14T02:10:45",
"trx_id": "b5f988d1dedeabdccee5aa6bdfc02093a41f7157",
"trx_in_block": 3,
"virtual_op": 0
}2020/12/11 12:27:36
2020/12/11 12:27:36
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 9352.908620 VESTS |
| Transaction Info | Block #49356752/Trx 95ec1d6e6722bf353e5bb20e5b7e6cad16b575a9 |
View Raw JSON Data
{
"block": 49356752,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "9352.908620 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-11T12:27:36",
"trx_id": "95ec1d6e6722bf353e5bb20e5b7e6cad16b575a9",
"trx_in_block": 3,
"virtual_op": 0
}2020/12/06 06:04:24
2020/12/06 06:04:24
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #49208308/Trx e94d812c886ad616ab4cb844129e9379cbeb5fe4 |
View Raw JSON Data
{
"block": 49208308,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "1912.543513 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-06T06:04:24",
"trx_id": "e94d812c886ad616ab4cb844129e9379cbeb5fe4",
"trx_in_block": 0,
"virtual_op": 0
}2020/12/05 16:05:48
2020/12/05 16:05:48
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 9359.116474 VESTS |
| Transaction Info | Block #49191851/Trx 4a4187f83d58c1989ac95db0be72f03d97de6a7a |
View Raw JSON Data
{
"block": 49191851,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "9359.116474 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-05T16:05:48",
"trx_id": "4a4187f83d58c1989ac95db0be72f03d97de6a7a",
"trx_in_block": 5,
"virtual_op": 0
}2020/11/02 18:23:54
2020/11/02 18:23:54
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 1920.017158 VESTS |
| Transaction Info | Block #48261052/Trx cb2f8049a4ab5b14f377050ddef1816302db31ad |
View Raw JSON Data
{
"block": 48261052,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "1920.017158 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-11-02T18:23:54",
"trx_id": "cb2f8049a4ab5b14f377050ddef1816302db31ad",
"trx_in_block": 6,
"virtual_op": 0
}2020/05/09 07:03:09
2020/05/09 07:03:09
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 9561.921833 VESTS |
| Transaction Info | Block #43218575/Trx 65fe35cfa9818fce32290a9b62c95cc653bd17aa |
View Raw JSON Data
{
"block": 43218575,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "9561.921833 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-09T07:03:09",
"trx_id": "65fe35cfa9818fce32290a9b62c95cc653bd17aa",
"trx_in_block": 9,
"virtual_op": 0
}2020/05/08 10:51:12
2020/05/08 10:51:12
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #43194904/Trx a2c55dc575a4f78f92e2feb71235f37c2080ec37 |
View Raw JSON Data
{
"block": 43194904,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "1953.311140 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-08T10:51:12",
"trx_id": "a2c55dc575a4f78f92e2feb71235f37c2080ec37",
"trx_in_block": 3,
"virtual_op": 0
}2019/06/24 04:17:24
2019/06/24 04:17:24
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 9745.808960 VESTS |
| Transaction Info | Block #34069718/Trx 54f173cb51ce4f2c3da6bc8f47e268368adf344b |
View Raw JSON Data
{
"block": 34069718,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "9745.808960 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2019-06-24T04:17:24",
"trx_id": "54f173cb51ce4f2c3da6bc8f47e268368adf344b",
"trx_in_block": 16,
"virtual_op": 0
}2019/03/17 18:47:36
2019/03/17 18:47:36
| author | steemitboard |
| body | Congratulations @jc1991! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@jc1991/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@jc1991) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=jc1991)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/drugwars/@steemitboard/drugwars-early-adopter"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmYGN7R653u4hDFyq1hM7iuhr2bdAP1v2ApACDNtecJAZ5/image.png"></a></td><td><a href="https://steemit.com/drugwars/@steemitboard/drugwars-early-adopter">Are you a DrugWars early adopter? Benvenuto in famiglia!</a></td></tr></table> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| parent author | jc1991 |
| parent permlink | eos |
| permlink | steemitboard-notify-jc1991-20190317t184736000z |
| title | |
| Transaction Info | Block #31239859/Trx 48160ec98f81253643ba63ca5fe354ae75fbe578 |
View Raw JSON Data
{
"block": 31239859,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @jc1991! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@jc1991/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@jc1991) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=jc1991)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/drugwars/@steemitboard/drugwars-early-adopter\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmYGN7R653u4hDFyq1hM7iuhr2bdAP1v2ApACDNtecJAZ5/image.png\"></a></td><td><a href=\"https://steemit.com/drugwars/@steemitboard/drugwars-early-adopter\">Are you a DrugWars early adopter? Benvenuto in famiglia!</a></td></tr></table>\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
"parent_author": "jc1991",
"parent_permlink": "eos",
"permlink": "steemitboard-notify-jc1991-20190317t184736000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2019-03-17T18:47:36",
"trx_id": "48160ec98f81253643ba63ca5fe354ae75fbe578",
"trx_in_block": 5,
"virtual_op": 0
}2018/07/03 10:12:03
2018/07/03 10:12:03
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 9944.886675 VESTS |
| Transaction Info | Block #23849859/Trx 7b8d4999c0a0501fb1083777dccf1be8fe728850 |
View Raw JSON Data
{
"block": 23849859,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "9944.886675 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-07-03T10:12:03",
"trx_id": "7b8d4999c0a0501fb1083777dccf1be8fe728850",
"trx_in_block": 29,
"virtual_op": 0
}2018/04/04 07:40:36
2018/04/04 07:40:36
| author | jc1991 |
| permlink | eos |
| voter | fivealive |
| weight | 10000 (100.00%) |
| Transaction Info | Block #21265972/Trx 7737614541b0f138b3ee69124bf6a1a026af274d |
View Raw JSON Data
{
"block": 21265972,
"op": [
"vote",
{
"author": "jc1991",
"permlink": "eos",
"voter": "fivealive",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-04-04T07:40:36",
"trx_id": "7737614541b0f138b3ee69124bf6a1a026af274d",
"trx_in_block": 20,
"virtual_op": 0
}2018/04/03 07:43:39
2018/04/03 07:43:39
| author | jc1991 |
| permlink | eos |
| voter | deviliano |
| weight | 10000 (100.00%) |
| Transaction Info | Block #21237238/Trx 62902597490e6c1346e102e4ebc1351c4869e7e9 |
View Raw JSON Data
{
"block": 21237238,
"op": [
"vote",
{
"author": "jc1991",
"permlink": "eos",
"voter": "deviliano",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-04-03T07:43:39",
"trx_id": "62902597490e6c1346e102e4ebc1351c4869e7e9",
"trx_in_block": 34,
"virtual_op": 0
}2018/04/03 07:43:06
2018/04/03 07:43:06
| author | jc1991 |
| body | # EOS测试网先睹为快 EOS作为币村的希望,主网还有两个月多才会上线。上线时间大概是六月初,也就是差不多在高考的时候。 现阶段,我们只有测试网可以玩。 现在的测试网部署的是EOS DAWN2.0版本。 具可靠消息,官方将在近期上线EOS DAWN 3.0的测试网。 并停用现有EOS DAWN2.0的测试网。   4月6号,EOS的运营团队block.one将在香港举行发布会。所以3.0近在眼前了。 为了迎驾这新Dapp开发平台,本文罗列出EOS的一些基本要素以及和以太坊做一个比较: * key pair * wallet * account * smart contract * DPOS ## 准备工作 * clone EOS源码进行编译:https://github.com/EOSIO/eos * 编译成功后,生成了build目录,到build目录下的install/bin 可以看到编译出来的可执行文件: ``` ➜ bin git:(bcb5bf75) ✗ pwd /Users/joe/Workspace/eos/build/install/bin ➜ bin git:(bcb5bf75) ✗ ls abi_gen codegen embed_genesis eos-walletd eosc eoscpp eosd launcher ``` * 为了方便调用,把这个路径加入到环境变量了: ``` export PATH=$PATH:/Users/joe/Workspace/eos/build/install/bin ``` * 这些就是EOS的主要执行文件了: * eosd: 节点启动程序 * eosc: 和eos节点的交互程序 * eos-walletd: 钱包启动程序 * eoscpp: 智能合约的编译命令,可以把c++文件编译成wasm文件和abi * launcher: 快捷模拟程序。在本地创建多个节点。 由于要演示的是基于测试网,所以只需要用到```eosc```和 ```eoscpp``` 即可。 ```eosc``` 通过指定 ```-H testnet1.eos.io -p 80``` 可以与测试网节点通讯。 * 运行 /path_to_eos/scripts/start_npnode.sh, 创建节点进程以及钱包后台进程。(节点程序会不断的和测试网进行区块同步,这是一个漫长的过程,所以我们后面玩到智能合约和account的时候,通过指定 ```-H testnet1.eos.io -p 80``` 直接和测试网节点通讯,不经过本地节点。) ## wallet 钱包是EOS中第一个重要的元素。 EOS本身就已经实现了钱包。 调用 eosc wallet create 创建钱包 ``` 不指定参数 则创建名为default的钱包 $ eosc wallet create Creating wallet: default Save password to use in the future to unlock this wallet. Without password imported keys will not be retrievable. "A MASTER PASSWORD" ``` 创建成功会返回给你一串密码,需要好好保存。 ``` 指定-n 参数, 可以给钱包起一个名字: $ eosc wallet create -n periwinkle Creating wallet: periwinkle Save password to use in the future to unlock this wallet. Without password imported keys will not be retrievable. "A MASTER PASSWORD" ``` ``` 查看已创建的钱包: $ eosc wallet list Wallets: [ "default *", "periwinkle *" ] 注意到钱包后有个*号,那表示钱包是已解锁的状态。 ``` ``` 锁定第二个钱包,通过lock命令以及-n指定钱包名字 $ eosc wallet lock -n periwinkle Locked: 'periwinkle' ``` ``` 锁定之后,再看第二个钱包的*号已经不见了,此时表示是锁定状态。 $ eosc wallet list Wallets: [ "default *", "periwinkle" ] ``` ``` 解锁: $ eosc wallet unlock -n periwinkle 输入创建钱包时返回的密码。就能成功解锁。 ``` ``` 解锁之后,*号回来了。 $ eosc wallet list Wallets: [ "default *", "periwinkle *" ] ``` 当重启钱包后台进程之后,在查看钱包: ``` $ eosc wallet list Wallets: [] 会发现钱包列表空了。不见了么? ``` 使用钱包首先需要打开钱包,由于重启了,所以钱包默认是关闭的,开启钱包: ``` $ eosc wallet open $ eosc wallet list Wallets: [ "default" ] $ eosc wallet open -nperiwinkle $ eosc wallet list Wallets: [ "default", "periwinkle" ] 打开之后的钱包,是锁定状态的,要使用的话,别忘了解锁: $ eosc wallet unlock $ eosc wallet unlock -n periwinkle ``` ## key pair, 生成并向钱包导入私钥 和所有区块链钱包的概念一样,钱包不是放钱不是存放资产,而是管理私钥。 有了钱包,我们可以开始向钱包当中倒入私钥了。 首先生成EOS key pair, 一对key pair包含公钥和私钥。 ``` $ eosc create key Private key: 5JpWt1ZcqCLFaxnXgJz3xuHpD4qCQg1SmZymxAikibg2xmju6bq Public key: EOS7Fu52r9NKLB37Tzjm4Sdde8kWr3b8PwsPMXr4MwQPKRS6oHipQ $ eosc create key Private key: 5J8DwCjUykgWvZ2VpfCwx1VSUrLHDX3TfmesnRSNprhSRDhcCWj Public key: EOS6r7SrFUNRSmeuhpComoaWH8ZAcfYWyYHLY9RLBcDeG8aGsTkrx ``` 现在我们有两对EOS key pair了。现在它们只是两对平凡普通的公私钥对,没有任何权限控制。 于是,我们将它们导入到钱包中,这样钱包的密码机制就能提供一层保护。 ``` $ eosc wallet import 5JpWt1ZcqCLFaxnXgJz3xuHpD4qCQg1SmZymxAikibg2xmju6bq imported private key for: EOS7Fu52r9NKLB37Tzjm4Sdde8kWr3b8PwsPMXr4MwQPKRS6oHipQ $ eosc wallet import 5J8DwCjUykgWvZ2VpfCwx1VSUrLHDX3TfmesnRSNprhSRDhcCWj imported private key for: EOS6r7SrFUNRSmeuhpComoaWH8ZAcfYWyYHLY9RLBcDeG8aGsTkrx ``` 利用```eosc wallet import```导入私钥,记住是私钥噢,根据私钥能推导出公钥,所以导入成功,会提示打印出对应的公钥。 ``` 列出解锁状态的钱包 管理的所有key pair $ eosc wallet keys [[ "EOS6....", "5KQwr..." ], [ "EOS3....", "5Ks0e..." ] ] ``` ## 备份钱包 钱包保存着我们的私钥和公钥。所以备份钱包文件是个好习惯。以防不可避免的钱包丢失,比如硬盘损坏。 钱包文件是高强度加密的,没有密码的话,钱包里面的keys几乎不可能被破解(或许几十年之后,量子计算机研发成功了,可能可以暴力破解)。 钱包可以在以下目录中找到:后缀为.wallet 就是钱包文件。将它们拷贝到你认为安全的地方。 ``` $ cd /path_to_eos/build/programs/nodeos && ls blockchain blocks config.ini default.wallet periwinkle.wallet ``` ## 创建 Account Account,在EOS中,有了账户的概念,这样的设计,对于区块链应用的普及和推广是个好事,如果像比特币和以太坊那样,转账交易都基于一串超长难以记忆的公钥的话,也太不方便了,让不熟悉技术的人情以何堪。 有了账户,就可以方便很多了。 根据白皮书描述,账户具有以下特点: * 一个人类可读的、存储在区块链的名字 * 最多12个字符 * 由账户创建者自己选择命名。(不像公钥,想生成一个靓号,全看脸) EOS在账户这一层级,还提供了更多的权限控制,让账户安全。 账户的创建命令,4个参数, * creator: 父级账户名。(目前的设定,一个账户需要由另一个账户来帮忙创建) * name: 要创建的账户的账户名 * OwnerKey: 公钥,账户主,拥有此账户全部权限 * ActiveKey: 公钥,拥有平时使用该账户的操作权限 ``` $ eosc create account Create a new account on the blockchain Usage: eosc create account [OPTIONS] creator name OwnerKey ActiveKey ``` 如果还没有账户,目前2.0测试网的账户,需要到这里申请:https://docs.google.com/forms/d/e/1FAIpQLSel3HVFb22zYaAJfUtu_IzFgIJ4OATb0jQ3H2FV-HbwnJ090g/viewform  填写申请表,申请成功后,会邮箱通知。申请到的developer测试账户,里面有不少EOS可以用于测试。 有了自己的账户号后,也可以随意的创建账号了。 一个账号是什么样的结构呢? 让我们来看一下,比如我申请的测试账号叫: ayana1joe, 通过 ```eosc get account``` 可以查看账户信息, 需要连接测试网,所以别忘了加 ```-H testnet1.eos.io -p 80``` 因为本地节点很可能还没有同步下来。 ``` $ eosc -H testnet1.eos.io -p 80 get account ayana1joe { "account_name": "ayana1joe", "eos_balance": "100.0000 EOS", "staked_balance": "0.0001 EOS", "unstaking_balance": "0.0000 EOS", "last_unstaking_time": "1969-12-31T23:59:59", "permissions": [{ "perm_name": "active", "parent": "owner", "required_auth": { "threshold": 1, "keys": [{ "key": "EOS7BNvtNAAGjKmzfcyJ64M2cwRmQDtZGbCnZyofXpcKeNez2Cheg", "weight": 1 } ], "accounts": [] } },{ "perm_name": "owner", "parent": "", "required_auth": { "threshold": 1, "keys": [{ "key": "EOS7BNvtNAAGjKmzfcyJ64M2cwRmQDtZGbCnZyofXpcKeNez2Cheg", "weight": 1 } ], "accounts": [] } } ] } ``` 但从结构上来看,有账户余额等信息,以及最重要的权限信息,目前有active,owner两种权限,分别指向了创建时候给的参数: OwnerKey和ActiveKey 。 也就是说,只有持有OwnerKey、ActiveKey对应私钥的人,才有权限对这个账户进行操作。 而私钥又是由钱包管理的,钱包可以解锁和锁定,钱包管理者我们的私钥,只有解锁才可以使用,解锁时需要密码。 所以总结并整理下:这些元素之间的关系: * 钱包密码(创建钱包时系统给你的,需妥善保存) * 钱包: 可以管理多对私钥、公钥。当需要使用私钥进行签名时,首先需要先用钱包密码解锁钱包。 * 账户:人类可读的存在于区块链当中的唯一识别名,可以在创建的时候,赋予active,owner权限。持有OwnerKey、ActiveKey对应私钥的人,可以操作这个账户。 ## 继续创建子账户 当我申请了ayana1joe 这个测试账户后,之后再创建账户就不需要在去官网申请了,自己也能创建了,当然,这样创建出来的账户里面是没有余额的。 ``` $ eosc -H testnet1.eos.io -p 80 create account ayana1joe joeswallet EOS7f5rRAswgqr2fff5EVRWpenpUKCoGZQqHck55WqqRMF7dnoh5u EOS7BNvtNAAGjKmzfcyJ64M2cwRmQDtZGbCnZyofXpcKeNez2Cheg { "transaction_id": "1211dd50d9d1e1c7c7397f8da2675a53eb510a601899ed098fd86ac156f0f2a0", "processed": { "ref_block_num": 38715, "ref_block_prefix": 1571712708, "expiration": "2018-03-27T17:03:28", "scope": [ "ayana1joe", "eos" ], "signatures": [ "201e02063785ac51da63bc6246c2c8938d63ebdc3fa56049d80d9127f88467a5536a51f04e11f3574b1bb0ecfe446910a25448a36484177694516098e0c34a965e" ], "messages": [{ "code": "eos", "type": "newaccount", "authorization": [{ "account": "ayana1joe", "permission": "active" } ], "data": { "creator": "ayana1joe", "name": "joeswallet", "owner": { "threshold": 1, "keys": [{ "key": "EOS7f5rRAswgqr2fff5EVRWpenpUKCoGZQqHck55WqqRMF7dnoh5u", "weight": 1 } ], "accounts": [] }, "active": { "threshold": 1, "keys": [{ "key": "EOS7BNvtNAAGjKmzfcyJ64M2cwRmQDtZGbCnZyofXpcKeNez2Cheg", "weight": 1 } ], "accounts": [] }, "recovery": { "threshold": 1, "keys": [], "accounts": [{ "permission": { "account": "ayana1joe", "permission": "active" }, "weight": 1 } ] }, "deposit": "0.0001 EOS" }, "hex_data": "000050f405338d37004056311a8e157d0100000001036ca671905f004097bf266c7173ee9443797667198b01f2d70c68bde8766da7880100000100000001032dbdc517aed5ab66f8e558b4a80f79d574f5e3d7f64e81816e40f958d4ffaeb5010000010000000001000050f405338d3700000000a8ed32320100010000000000000004454f5300000000" } ], "output": [{ "notify": [], "deferred_trxs": [] } ] } } ``` 进行账户之间的转账: ``` $ eosc -H testnet1.eos.io -p 80 transfer ayana1joe joeswallet 1 { "transaction_id": "345adb2ef93c9165bdee655d20a242c5a509074213726e698fb2a8fb431811b9", "processed": { "ref_block_num": 38715, "ref_block_prefix": 1571712708, "expiration": "2018-03-27T17:03:28", "scope": [ "ayana1joe", "joeswallet" ], "signatures": [ "1f6995a7545d762cc0d815813eb22840765720c37272a5a69589f16682c19062b26d152e48535b6dbb1f8789aee11f5bcb1296778928a22103497f548de4104cdc" ], "messages": [{ "code": "eos", "type": "transfer", "authorization": [{ "account": "ayana1joe", "permission": "active" } ], "data": { "from": "ayana1joe", "to": "joeswallet", "amount": 1, "memo": "" }, "hex_data": "000050f405338d37004056311a8e157d010000000000000000" } ], "output": [{ "notify": [{ "name": "joeswallet", "output": { "notify": [], "deferred_trxs": [] } },{ "name": "ayana1joe", "output": { "notify": [], "deferred_trxs": [] } } ], "deferred_trxs": [] } ] } } ``` ## 智能合约 这是重头戏。大家对EOS的期望来自于,它号称的百万级TPS性能。 接下来我们看看EOS的智能合约以及和以太坊智能合约的不同之处。 目前EOS支持c++语言写的的智能合约,最终编译出wast文件 #### 创建合约: ``` 调用 eoscpp 生成合约模版。 $ eoscpp -n hello $ cd hello $ ls hello.abi hello.hpp hello.cpp ``` 看看hello.cpp内容: ``` $ cat hello.cpp #include <hello.hpp> /** * The init() and apply() methods must have C calling convention so that the blockchain can lookup and * call these methods. */ extern "C" { /** * This method is called once when the contract is published or updated. */ void init() { eosio::print( "Init World!\n" ); } /// The apply method implements the dispatch of events to this contract void apply( uint64_t code, uint64_t action ) { eosio::print( "Hello World: ", eosio::name(code), "->", eosio::name(action), "\n" ); } } // extern "C" ``` init: 可以理解过初始化函数 apply: 相当于分发器函数,可以根据外部传进来的action参数类型,进行程序逻辑上的无限扩展。 #### 编译合约 ``` ➜ $ eoscpp -o hello.wast hello.cpp /usr/local/wasm/bin/clang -emit-llvm -O3 --std=c++14 --target=wasm32 -ffreestanding -nostdlib -fno-threadsafe-statics -fno-rtti -fno-exceptions -I /Users/joe/Workspace/eos/build/install/include -I . -c hello.cpp -o /var/folders/80/m80ty1ms59n4gv257121dbn40000gn/T/tmp.mCLl7zio/built/hello.cpp ➜ $ ls hello.abi hello.cpp hello.hpp hello.wast ``` #### 部署合约 部署合约需要指定一个账户,需要私钥签名,所以要确保把钱包打开并解锁。才能部署成功。 ``` ➜ $ eosc -H testnet1.eos.io -p 80 set contract ayana1joe hello.wast hello.abi Reading WAST... Assembling WASM... Publishing contract... { "transaction_id": "6b141c4ff3701986c4b91c79d5f586d94bd2d0f7b8942fe9994e5c7b5a3863e4", "processed": { "ref_block_num": 38715, "ref_block_prefix": 1571712708, "expiration": "2018-03-27T17:03:28", "scope": [ "ayana1joe", "eos" ], "signatures": [ "2011f5dfc69a1602c36a449712d86f6f3112a8f9fb53a90f115d1638aca79245e8506994ab6a77df795fe6018b09ae72e791be71d71d4edffbe75629f242483d3d" ], "messages": [{ "code": "eos", "type": "setcode", "authorization": [{ "account": "ayana1joe", "permission": "active" } ], "data": { "account": "ayana1joe", "vm_type": 0, "vm_version": 0, "code": "0061736d0100000001110460017f0060017e0060000060027e7e00021b0203656e76067072696e746e000103656e76067072696e7473000003030202030404017000000503010001071903066d656d6f7279020004696e69740002056170706c7900030a21020600411010010b1800413010012000100041d00010012001100041e00010010b0b54050041040b04704000000041100b114a6f6520496e697420576f726c64210a000041300b1e48656c6c6f20576f726c642046726f6d204a6f652773204d5042203a20000041d0000b032d3e000041e0000b020a000029046e616d6504067072696e746e0100067072696e7473010004696e697400056170706c790201300131", "code_abi": { "types": [{ "new_type_name": "account_name", "type": "name" } ], "structs": [{ "name": "transfer", "base": "", "fields": { "from": "account_name", "to": "account_name", "amount": "uint64" } },{ "name": "account", "base": "", "fields": { "account": "name", "balance": "uint64" } } ], "actions": [{ "action_name": "transfer", "type": "transfer" } ], "tables": [{ "table_name": "account", "index_type": "i64", "key_names": [ "account" ], "key_types": [ "name" ], "type": "account" } ] } }, "hex_data": "000050f405338d37000087020061736d0100000001110460017f0060017e0060000060027e7e00021b0203656e76067072696e746e000103656e76067072696e7473000003030202030404017000000503010001071903066d656d6f7279020004696e69740002056170706c7900030a21020600411010010b1800413010012000100041d00010012001100041e00010010b0b54050041040b04704000000041100b114a6f6520496e697420576f726c64210a000041300b1e48656c6c6f20576f726c642046726f6d204a6f652773204d5042203a20000041d0000b032d3e000041e0000b020a000029046e616d6504067072696e746e0100067072696e7473010004696e697400056170706c790201300131010c6163636f756e745f6e616d65046e616d6502087472616e7366657200030466726f6d0c6163636f756e745f6e616d6502746f0c6163636f756e745f6e616d6506616d6f756e740675696e743634076163636f756e740002076163636f756e74046e616d650762616c616e63650675696e74363401000000572d3ccdcd087472616e7366657201000000204f4d11320369363401076163636f756e7401046e616d65076163636f756e74" } ], "output": [{ "notify": [], "deferred_trxs": [] } ] } } ``` 部署成功的话,在eosd进程的log中可以看到以下输出:执行的是合约代码中init方法: ``` 912018ms wasm_interface.cpp:1023 load ] wasm_interface::load name = ayana1joe times llvm:7 ms, init:0 ms, abi:0 ms Init World! ``` 向合约中发送消息: ``` ➜ $ eosc -H testnet1.eos.io -p 80 push message ayana1joe hello '"abcd"' --scope ayana1joe 552337ms main.cpp:1128 operator() ] Converting argument to binary... { "transaction_id": "c15d281cc278ea15b448decae0e47cf7962a760b7c7dc599977bbfe99b7788da", "processed": { "ref_block_num": 10430, "ref_block_prefix": 921642592, "expiration": "2018-03-30T02:09:42", "scope": [ "ayana1joe" ], "signatures": [], "messages": [{ "code": "ayana1joe", "type": "hello", "authorization": [], "data": "abcd" } ], "output": [{ "notify": [], "deferred_trxs": [] } ] } } ``` 后台可以看到以下输入:执行的是apply方法:并且 ``` Hello World: ayana1joe->hello ``` 一开始这种方式有点难理解,毕竟和以太坊太不一样了。 不妨先看看EOS白皮书里对智能合约的描述: > 每个账户都可以将结构化的操作发送给其他账户,并可以定义脚本来处理接收到的操作。EOS为每个账户提供了专用数据库,只能由自己的操作处理程序访问。动作处理脚本还可以将操作发送到其他账户。 **操作**(action,apply方法里的参数)和**自动操作处理程序**(apply方法中的代码)的组合正式EOS定义智能合约的方式。 那什么是结构化操作呢? 修改下上面的hello.cpp : 加入transfer结构体(struct, c++里的自定义类型) ``` #include <hello.hpp> /** * The init() and apply() methods must have C calling convention so that the blockchain can lookup and * call these methods. */ extern "C" { /** * This method is called once when the contract is published or updated. */ void init() { eosio::print( "Init World!\n" ); } struct transfer { uint64_t from; uint64_t to; uint64_t quantity; }; /// The apply method implements the dispatch of events to this contract void apply( uint64_t code, uint64_t action ) { eosio::print( "Hello World: ", eosio::name(code), "->", eosio::name(action), "\n" ); if( action == N(transfer) ) { eosio::print( "Hello World: ", eosio::name(code), "->", eosio::name(action), "\n" ); if( action == N(transfer) ) { auto message = eosio::current_message<transfer>(); eosio::require_auth( message.from ); eosio::print( "Transfer ", message.quantity, " from ", message.from, " to ", message.to, "\n" ); } } } // extern "C" ``` 然后重新编译和部署: ``` eoscpp -o hello.wast hello.cpp eosc -H testnet1.eos.io -p 80 set contract ayana1joe hello.wast hello.abi ``` 这里发现,EOS中的智能合约是支持重新部署的,这是和以太坊不一样的。以太坊,一旦部署,就不可修改,有bug的话只能废弃掉。而EOS支持改下代码,重新编译,重新部署,替换掉有问题的代码。这种机制好不好呢? 暂不讨论,毕竟“**一旦部署就不可修改**” 是当初ICO浪潮中经常被拿出来“讲道理”的一个特点。现在却完全被废弃了。 接下来调用下新部署的hello合约, ``` $ eosc push action ayana1joe transfer '{"from":"ayana1joe","to":"joeswallet","quantity":50}' --scope ayana1joe { "transaction_id": "a777539b7d5f752fb40e6f2d019b65b5401be8bf91c8036440661506875ba1c0", "processed": { "ref_block_num": 20, "ref_block_prefix": 463381070, "expiration": "2017-09-14T01:05:49", "scope": [ "ayana1joe" ], "signatures": [], "messages": [{ "code": "ayana1joe", "type": "transfer", "authorization": [], "data": { "from": "ayana1joe", "to": "joeswallet", "quantity": 50 }, "hex_data": "00000079b822651d000000008040934b3200000000000000" } ], "output": [{ "notify": [], "deferred_transactions": [] } ] } } ``` 后台可以看到以下输出: ``` Hello World: ayana1joe->transfer Transfer 50 from currency to joeswallet ``` 这次调用,传入的是一个“结构体”, 也就是: ``` '{"from":"ayana1joe","to":"joeswallet","quantity":50}' ``` 这是代码中定义的结构体的json格式。 所以可以理解为什么说 “每个账户都可以将结构化的操作发送给其他账户” 了,其实就是传入一段合约中定义好的数据类型。apply函数中,根据参数action名称进行分发,用不同的逻辑代码处理接收到的数据。 总结下,EOS智能合约的几个点: 1. EOS智能合约是和账户绑定的,每个账户可以定义一份智能合约。创建合约的账户拥有对该合约的归属权。需要权限的地方可以使用:eosio::require_auth( message.from ); 来判断。 2. 智能合约支持修改并重新部署 3. 调用智能合约的方式,可以理解为,向一个账户发送消息。账户收到之后,根据其自定义的脚本进行处理。 ## DPOS 共识算法可以说是区块链的灵魂,它决定了区块链是否安全,是否公正,是否效率。 EOS采用了DPOS (Delegate Proof of Stake) 关于DPOS,EOS白皮书里一笑而过,没提到很多,有兴趣的可以看下这篇官文补充: https://steemit.com/dpos/@dantheman/dpos-consensus-algorithm-this-missing-white-paper 或者译文: http://me.tryblockchain.org/blockchain-dpos-bm-eos.html 常见共识算法: PoW(Proof Of Work) 优点:简单,安全 缺点:浪费资源。算力集中导致过于中心化。 代表:比特币、以太坊(以太坊将在今年或明年改为新的共识算法[Casper ](https://blog.ethereum.org/2015/08/01/introducing-casper-friendly-ghost/)) PoS(Proof of Stake) 优点:节约电能,不需要消耗大量的算力。 缺点:规模和安全性不足。 DPoS(Delegate Proof of Stake) PoS的改进版 优点:节约电能,满足规模要求。 缺点:安全性不足。 代表:Steemit , BitShare , EOS ## 简单说说区块链1~4, 区块链1.0: 以比特币为首的区块链项目,实现了分布式账本、去除了第三方 开创了区块链先河。但是转账速度缓慢、交易手续费高、功能单一。 区块链2.0: 以太坊为首的区块链2.0项目,除了实现了比特币货币功能之外。还引入了智能合约,为世人打开了Dapp世界的大门。但是随着使用人数的增多。生态系统的日益臃肿,以太坊的问题也越来越明显。落后的共识算法Pow,拥堵的网络。缓慢的交易确认和相对封闭的生态系统。 区块链3.0: 以EOS为首的区块链项目3.0提供了更优化的共识算法DPos,更好的并发性,目标达到百万级/和对大规模商业应用更好的支持。尽管这些区块链3.0项目还未正式落地。 区块链4.0: 区块链3.0都还没落地呢 又来区块链4.0? 还真有这样一个项目,大家路过就了解一下 http://seele.pro/ , 元一,采用神经网络共识算法和异构森林网络的区块链。 逼格很高的概念,建议有兴趣自行到官网了解。 持续了一年的ICO,当前EOS无疑是值得期待的项目,是币王还是币妖,很快就能知道了。 ## 总结 目前官方给出的智能合约开发资料还很少,Dapp开发示例则没有。EOS号称是以太坊杀手,未来的Dapp平台。离交卷还有两个多月。到底最终如何出招呢,让我们拭目以待。 想要在EOS DAWN3.0 测试网上线的第一时间,就对它进行测试和验证的,可以加我微信。 或telegram群 : https://t.me/joinchat/GgxZkQy_seHdGk5MP3-scg 测试内容: * 部署智能合约 * 高频并发调用合约,简单测下TPS * 构建私服 * 等等。。  |
| json metadata | {"tags":["cn","blockchain","eos"],"image":["https://steemitimages.com/DQmQT2rjqZsxqJaTW8CYiXrgsGFqWZWAR5Q1Gc1ibignAnR/eos1.jpeg","https://steemitimages.com/DQmP7uVYv9qDFB6Kdmjrx5vZhVcFvyg6Dx9uRo4syiSmEys/eos2.jpeg","https://steemitimages.com/DQmSexWyHp36NE7qmQMcpjDRtLHq725d9uwqRcCLYTdFpiu/Snip20180324_1.png","https://steemitimages.com/DQmeS9HswoQsN44Pitb86GCcKQ58cWo5JKYK94dV2kVfkJe/qr.jpeg"],"links":["https://github.com/EOSIO/eos","https://docs.google.com/forms/d/e/1FAIpQLSel3HVFb22zYaAJfUtu_IzFgIJ4OATb0jQ3H2FV-HbwnJ090g/viewform","https://steemit.com/dpos/@dantheman/dpos-consensus-algorithm-this-missing-white-paper","http://me.tryblockchain.org/blockchain-dpos-bm-eos.html","https://blog.ethereum.org/2015/08/01/introducing-casper-friendly-ghost/","http://seele.pro/","https://t.me/joinchat/GgxZkQy_seHdGk5MP3-scg"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | cn |
| permlink | eos |
| title | EOS测试网先睹为快 |
| Transaction Info | Block #21237227/Trx 984d1c10f3688a442f8d2324ac63bbe62480cde7 |
View Raw JSON Data
{
"block": 21237227,
"op": [
"comment",
{
"author": "jc1991",
"body": "# EOS测试网先睹为快\n\nEOS作为币村的希望,主网还有两个月多才会上线。上线时间大概是六月初,也就是差不多在高考的时候。\n\n现阶段,我们只有测试网可以玩。 现在的测试网部署的是EOS DAWN2.0版本。\n具可靠消息,官方将在近期上线EOS DAWN 3.0的测试网。\n并停用现有EOS DAWN2.0的测试网。\n\n\n\n\n4月6号,EOS的运营团队block.one将在香港举行发布会。所以3.0近在眼前了。\n\n\n为了迎驾这新Dapp开发平台,本文罗列出EOS的一些基本要素以及和以太坊做一个比较:\n\n* key pair\n* wallet\n* account\n* smart contract\n* DPOS\n\n## 准备工作\n\n* clone EOS源码进行编译:https://github.com/EOSIO/eos \n* 编译成功后,生成了build目录,到build目录下的install/bin 可以看到编译出来的可执行文件:\n\n```\n\n➜ bin git:(bcb5bf75) ✗ pwd\n/Users/joe/Workspace/eos/build/install/bin\n➜ bin git:(bcb5bf75) ✗ ls\nabi_gen codegen embed_genesis eos-walletd eosc eoscpp eosd launcher\n\n```\n\n* 为了方便调用,把这个路径加入到环境变量了:\n\n```\nexport PATH=$PATH:/Users/joe/Workspace/eos/build/install/bin\n```\n\n* 这些就是EOS的主要执行文件了:\n * eosd: 节点启动程序\n * eosc: 和eos节点的交互程序\n * eos-walletd: 钱包启动程序\n * eoscpp: 智能合约的编译命令,可以把c++文件编译成wasm文件和abi\n * launcher: 快捷模拟程序。在本地创建多个节点。\n\n由于要演示的是基于测试网,所以只需要用到```eosc```和 ```eoscpp``` 即可。 \n```eosc``` 通过指定 ```-H testnet1.eos.io -p 80``` 可以与测试网节点通讯。\n \n * 运行 /path_to_eos/scripts/start_npnode.sh, 创建节点进程以及钱包后台进程。(节点程序会不断的和测试网进行区块同步,这是一个漫长的过程,所以我们后面玩到智能合约和account的时候,通过指定 ```-H testnet1.eos.io -p 80``` 直接和测试网节点通讯,不经过本地节点。)\n \n## wallet \n\n钱包是EOS中第一个重要的元素。\nEOS本身就已经实现了钱包。\n调用 eosc wallet create 创建钱包\n\n```\n不指定参数 则创建名为default的钱包\n$ eosc wallet create\nCreating wallet: default\nSave password to use in the future to unlock this wallet.\nWithout password imported keys will not be retrievable.\n\"A MASTER PASSWORD\"\n\n```\n创建成功会返回给你一串密码,需要好好保存。\n\n```\n指定-n 参数, 可以给钱包起一个名字: \n$ eosc wallet create -n periwinkle\nCreating wallet: periwinkle\nSave password to use in the future to unlock this wallet.\nWithout password imported keys will not be retrievable.\n\"A MASTER PASSWORD\"\n\n\n```\n\n```\n查看已创建的钱包:\n$ eosc wallet list\nWallets:\n[\n \"default *\",\n \"periwinkle *\"\n]\n注意到钱包后有个*号,那表示钱包是已解锁的状态。\n\n```\n\n\n\n```\n锁定第二个钱包,通过lock命令以及-n指定钱包名字\n\n$ eosc wallet lock -n periwinkle\nLocked: 'periwinkle'\n\n```\n\n```\n\n锁定之后,再看第二个钱包的*号已经不见了,此时表示是锁定状态。\n$ eosc wallet list\nWallets:\n[\n \"default *\",\n \"periwinkle\"\n]\n\n```\n\n\n\n```\n解锁:\n$ eosc wallet unlock -n periwinkle\n输入创建钱包时返回的密码。就能成功解锁。\n```\n\n```\n解锁之后,*号回来了。\n$ eosc wallet list\nWallets:\n[\n \"default *\",\n \"periwinkle *\"\n]\n```\n\n当重启钱包后台进程之后,在查看钱包:\n\n```\n$ eosc wallet list\nWallets:\n[]\n会发现钱包列表空了。不见了么?\n```\n使用钱包首先需要打开钱包,由于重启了,所以钱包默认是关闭的,开启钱包:\n\n```\n$ eosc wallet open\n$ eosc wallet list\nWallets:\n[\n \"default\"\n]\n\n$ eosc wallet open -nperiwinkle\n$ eosc wallet list\nWallets:\n[\n \"default\",\n \"periwinkle\"\n]\n打开之后的钱包,是锁定状态的,要使用的话,别忘了解锁:\n\n$ eosc wallet unlock \n$ eosc wallet unlock -n periwinkle\n```\n\n\n## key pair, 生成并向钱包导入私钥\n\n和所有区块链钱包的概念一样,钱包不是放钱不是存放资产,而是管理私钥。\n有了钱包,我们可以开始向钱包当中倒入私钥了。\n\n首先生成EOS key pair, 一对key pair包含公钥和私钥。\n\n```\n$ eosc create key\nPrivate key: 5JpWt1ZcqCLFaxnXgJz3xuHpD4qCQg1SmZymxAikibg2xmju6bq\nPublic key: EOS7Fu52r9NKLB37Tzjm4Sdde8kWr3b8PwsPMXr4MwQPKRS6oHipQ\n\n$ eosc create key\nPrivate key: 5J8DwCjUykgWvZ2VpfCwx1VSUrLHDX3TfmesnRSNprhSRDhcCWj\nPublic key: EOS6r7SrFUNRSmeuhpComoaWH8ZAcfYWyYHLY9RLBcDeG8aGsTkrx\n```\n现在我们有两对EOS key pair了。现在它们只是两对平凡普通的公私钥对,没有任何权限控制。\n于是,我们将它们导入到钱包中,这样钱包的密码机制就能提供一层保护。\n\n```\n$ eosc wallet import 5JpWt1ZcqCLFaxnXgJz3xuHpD4qCQg1SmZymxAikibg2xmju6bq\nimported private key for: EOS7Fu52r9NKLB37Tzjm4Sdde8kWr3b8PwsPMXr4MwQPKRS6oHipQ\n$ eosc wallet import 5J8DwCjUykgWvZ2VpfCwx1VSUrLHDX3TfmesnRSNprhSRDhcCWj\nimported private key for: EOS6r7SrFUNRSmeuhpComoaWH8ZAcfYWyYHLY9RLBcDeG8aGsTkrx\n\n```\n利用```eosc wallet import```导入私钥,记住是私钥噢,根据私钥能推导出公钥,所以导入成功,会提示打印出对应的公钥。\n\n```\n列出解锁状态的钱包 管理的所有key pair \n$ eosc wallet keys\n[[\n \"EOS6....\",\n \"5KQwr...\"\n ],\n [\n \"EOS3....\",\n \"5Ks0e...\"\n ]\n]\n\n```\n\n## 备份钱包\n\n钱包保存着我们的私钥和公钥。所以备份钱包文件是个好习惯。以防不可避免的钱包丢失,比如硬盘损坏。\n\n钱包文件是高强度加密的,没有密码的话,钱包里面的keys几乎不可能被破解(或许几十年之后,量子计算机研发成功了,可能可以暴力破解)。\n\n钱包可以在以下目录中找到:后缀为.wallet 就是钱包文件。将它们拷贝到你认为安全的地方。\n\n```\n$ cd /path_to_eos/build/programs/nodeos && ls\nblockchain blocks config.ini default.wallet periwinkle.wallet\n```\n\n\n## 创建 Account\n\nAccount,在EOS中,有了账户的概念,这样的设计,对于区块链应用的普及和推广是个好事,如果像比特币和以太坊那样,转账交易都基于一串超长难以记忆的公钥的话,也太不方便了,让不熟悉技术的人情以何堪。 有了账户,就可以方便很多了。\n根据白皮书描述,账户具有以下特点:\n\n* 一个人类可读的、存储在区块链的名字\n* 最多12个字符\n* 由账户创建者自己选择命名。(不像公钥,想生成一个靓号,全看脸)\n\nEOS在账户这一层级,还提供了更多的权限控制,让账户安全。\n\n\n账户的创建命令,4个参数,\n\n* creator: 父级账户名。(目前的设定,一个账户需要由另一个账户来帮忙创建)\n* name: 要创建的账户的账户名\n* OwnerKey: 公钥,账户主,拥有此账户全部权限\n* ActiveKey: 公钥,拥有平时使用该账户的操作权限\n\n```\n$ eosc create account\nCreate a new account on the blockchain\nUsage: eosc create account [OPTIONS] creator name OwnerKey ActiveKey\n\n```\n\n如果还没有账户,目前2.0测试网的账户,需要到这里申请:https://docs.google.com/forms/d/e/1FAIpQLSel3HVFb22zYaAJfUtu_IzFgIJ4OATb0jQ3H2FV-HbwnJ090g/viewform\n\n\n\n\n填写申请表,申请成功后,会邮箱通知。申请到的developer测试账户,里面有不少EOS可以用于测试。\n\n有了自己的账户号后,也可以随意的创建账号了。\n一个账号是什么样的结构呢?\n让我们来看一下,比如我申请的测试账号叫: ayana1joe,\n通过 ```eosc get account``` 可以查看账户信息, 需要连接测试网,所以别忘了加 ```-H testnet1.eos.io -p 80``` 因为本地节点很可能还没有同步下来。\n\n```\n$ eosc -H testnet1.eos.io -p 80 get account ayana1joe\n{\n \"account_name\": \"ayana1joe\",\n \"eos_balance\": \"100.0000 EOS\",\n \"staked_balance\": \"0.0001 EOS\",\n \"unstaking_balance\": \"0.0000 EOS\",\n \"last_unstaking_time\": \"1969-12-31T23:59:59\",\n \"permissions\": [{\n \"perm_name\": \"active\",\n \"parent\": \"owner\",\n \"required_auth\": {\n \"threshold\": 1,\n \"keys\": [{\n \"key\": \"EOS7BNvtNAAGjKmzfcyJ64M2cwRmQDtZGbCnZyofXpcKeNez2Cheg\",\n \"weight\": 1\n }\n ],\n \"accounts\": []\n }\n },{\n \"perm_name\": \"owner\",\n \"parent\": \"\",\n \"required_auth\": {\n \"threshold\": 1,\n \"keys\": [{\n \"key\": \"EOS7BNvtNAAGjKmzfcyJ64M2cwRmQDtZGbCnZyofXpcKeNez2Cheg\",\n \"weight\": 1\n }\n ],\n \"accounts\": []\n }\n }\n ]\n}\n\n```\n\n但从结构上来看,有账户余额等信息,以及最重要的权限信息,目前有active,owner两种权限,分别指向了创建时候给的参数: OwnerKey和ActiveKey 。 也就是说,只有持有OwnerKey、ActiveKey对应私钥的人,才有权限对这个账户进行操作。 而私钥又是由钱包管理的,钱包可以解锁和锁定,钱包管理者我们的私钥,只有解锁才可以使用,解锁时需要密码。 \n\n所以总结并整理下:这些元素之间的关系:\n\n* 钱包密码(创建钱包时系统给你的,需妥善保存)\n* 钱包: 可以管理多对私钥、公钥。当需要使用私钥进行签名时,首先需要先用钱包密码解锁钱包。\n* 账户:人类可读的存在于区块链当中的唯一识别名,可以在创建的时候,赋予active,owner权限。持有OwnerKey、ActiveKey对应私钥的人,可以操作这个账户。\n\n\n## 继续创建子账户\n\n当我申请了ayana1joe 这个测试账户后,之后再创建账户就不需要在去官网申请了,自己也能创建了,当然,这样创建出来的账户里面是没有余额的。 \n\n```\n$ eosc -H testnet1.eos.io -p 80 create account ayana1joe joeswallet EOS7f5rRAswgqr2fff5EVRWpenpUKCoGZQqHck55WqqRMF7dnoh5u EOS7BNvtNAAGjKmzfcyJ64M2cwRmQDtZGbCnZyofXpcKeNez2Cheg\n{\n \"transaction_id\": \"1211dd50d9d1e1c7c7397f8da2675a53eb510a601899ed098fd86ac156f0f2a0\",\n \"processed\": {\n \"ref_block_num\": 38715,\n \"ref_block_prefix\": 1571712708,\n \"expiration\": \"2018-03-27T17:03:28\",\n \"scope\": [\n \"ayana1joe\",\n \"eos\"\n ],\n \"signatures\": [\n \"201e02063785ac51da63bc6246c2c8938d63ebdc3fa56049d80d9127f88467a5536a51f04e11f3574b1bb0ecfe446910a25448a36484177694516098e0c34a965e\"\n ],\n \"messages\": [{\n \"code\": \"eos\",\n \"type\": \"newaccount\",\n \"authorization\": [{\n \"account\": \"ayana1joe\",\n \"permission\": \"active\"\n }\n ],\n \"data\": {\n \"creator\": \"ayana1joe\",\n \"name\": \"joeswallet\",\n \"owner\": {\n \"threshold\": 1,\n \"keys\": [{\n \"key\": \"EOS7f5rRAswgqr2fff5EVRWpenpUKCoGZQqHck55WqqRMF7dnoh5u\",\n \"weight\": 1\n }\n ],\n \"accounts\": []\n },\n \"active\": {\n \"threshold\": 1,\n \"keys\": [{\n \"key\": \"EOS7BNvtNAAGjKmzfcyJ64M2cwRmQDtZGbCnZyofXpcKeNez2Cheg\",\n \"weight\": 1\n }\n ],\n \"accounts\": []\n },\n \"recovery\": {\n \"threshold\": 1,\n \"keys\": [],\n \"accounts\": [{\n \"permission\": {\n \"account\": \"ayana1joe\",\n \"permission\": \"active\"\n },\n \"weight\": 1\n }\n ]\n },\n \"deposit\": \"0.0001 EOS\"\n },\n \"hex_data\": \"000050f405338d37004056311a8e157d0100000001036ca671905f004097bf266c7173ee9443797667198b01f2d70c68bde8766da7880100000100000001032dbdc517aed5ab66f8e558b4a80f79d574f5e3d7f64e81816e40f958d4ffaeb5010000010000000001000050f405338d3700000000a8ed32320100010000000000000004454f5300000000\"\n }\n ],\n \"output\": [{\n \"notify\": [],\n \"deferred_trxs\": []\n }\n ]\n }\n}\n\n```\n\n\n进行账户之间的转账:\n\n```\n$ eosc -H testnet1.eos.io -p 80 transfer ayana1joe joeswallet 1\n{\n \"transaction_id\": \"345adb2ef93c9165bdee655d20a242c5a509074213726e698fb2a8fb431811b9\",\n \"processed\": {\n \"ref_block_num\": 38715,\n \"ref_block_prefix\": 1571712708,\n \"expiration\": \"2018-03-27T17:03:28\",\n \"scope\": [\n \"ayana1joe\",\n \"joeswallet\"\n ],\n \"signatures\": [\n \"1f6995a7545d762cc0d815813eb22840765720c37272a5a69589f16682c19062b26d152e48535b6dbb1f8789aee11f5bcb1296778928a22103497f548de4104cdc\"\n ],\n \"messages\": [{\n \"code\": \"eos\",\n \"type\": \"transfer\",\n \"authorization\": [{\n \"account\": \"ayana1joe\",\n \"permission\": \"active\"\n }\n ],\n \"data\": {\n \"from\": \"ayana1joe\",\n \"to\": \"joeswallet\",\n \"amount\": 1,\n \"memo\": \"\"\n },\n \"hex_data\": \"000050f405338d37004056311a8e157d010000000000000000\"\n }\n ],\n \"output\": [{\n \"notify\": [{\n \"name\": \"joeswallet\",\n \"output\": {\n \"notify\": [],\n \"deferred_trxs\": []\n }\n },{\n \"name\": \"ayana1joe\",\n \"output\": {\n \"notify\": [],\n \"deferred_trxs\": []\n }\n }\n ],\n \"deferred_trxs\": []\n }\n ]\n }\n}\n\n```\n\n\n## 智能合约\n\n这是重头戏。大家对EOS的期望来自于,它号称的百万级TPS性能。\n\n接下来我们看看EOS的智能合约以及和以太坊智能合约的不同之处。\n\n目前EOS支持c++语言写的的智能合约,最终编译出wast文件\n\n#### 创建合约:\n\n```\n调用 eoscpp 生成合约模版。\n$ eoscpp -n hello\n$ cd hello\n$ ls\nhello.abi hello.hpp hello.cpp\n```\n看看hello.cpp内容:\n\n```\n$ cat hello.cpp\n\n#include <hello.hpp>\n\n/**\n * The init() and apply() methods must have C calling convention so that the blockchain can lookup and\n * call these methods.\n */\nextern \"C\" {\n\n /**\n * This method is called once when the contract is published or updated.\n */\n void init() {\n eosio::print( \"Init World!\\n\" );\n }\n\n /// The apply method implements the dispatch of events to this contract\n void apply( uint64_t code, uint64_t action ) {\n eosio::print( \"Hello World: \", eosio::name(code), \"->\", eosio::name(action), \"\\n\" );\n }\n\n} // extern \"C\"\n\n```\n\ninit: 可以理解过初始化函数\napply: 相当于分发器函数,可以根据外部传进来的action参数类型,进行程序逻辑上的无限扩展。\n\n\n#### 编译合约\n\n```\n➜ $ eoscpp -o hello.wast hello.cpp\n/usr/local/wasm/bin/clang -emit-llvm -O3 --std=c++14 --target=wasm32 -ffreestanding -nostdlib -fno-threadsafe-statics -fno-rtti -fno-exceptions -I /Users/joe/Workspace/eos/build/install/include -I . -c hello.cpp -o /var/folders/80/m80ty1ms59n4gv257121dbn40000gn/T/tmp.mCLl7zio/built/hello.cpp\n➜ $ ls\nhello.abi hello.cpp hello.hpp hello.wast\n\n\n```\n\n#### 部署合约\n\n部署合约需要指定一个账户,需要私钥签名,所以要确保把钱包打开并解锁。才能部署成功。\n\n```\n➜ $ eosc -H testnet1.eos.io -p 80 set contract ayana1joe hello.wast hello.abi\nReading WAST...\nAssembling WASM...\nPublishing contract...\n{\n \"transaction_id\": \"6b141c4ff3701986c4b91c79d5f586d94bd2d0f7b8942fe9994e5c7b5a3863e4\",\n \"processed\": {\n \"ref_block_num\": 38715,\n \"ref_block_prefix\": 1571712708,\n \"expiration\": \"2018-03-27T17:03:28\",\n \"scope\": [\n \"ayana1joe\",\n \"eos\"\n ],\n \"signatures\": [\n \"2011f5dfc69a1602c36a449712d86f6f3112a8f9fb53a90f115d1638aca79245e8506994ab6a77df795fe6018b09ae72e791be71d71d4edffbe75629f242483d3d\"\n ],\n \"messages\": [{\n \"code\": \"eos\",\n \"type\": \"setcode\",\n \"authorization\": [{\n \"account\": \"ayana1joe\",\n \"permission\": \"active\"\n }\n ],\n \"data\": {\n \"account\": \"ayana1joe\",\n \"vm_type\": 0,\n \"vm_version\": 0,\n \"code\": \"0061736d0100000001110460017f0060017e0060000060027e7e00021b0203656e76067072696e746e000103656e76067072696e7473000003030202030404017000000503010001071903066d656d6f7279020004696e69740002056170706c7900030a21020600411010010b1800413010012000100041d00010012001100041e00010010b0b54050041040b04704000000041100b114a6f6520496e697420576f726c64210a000041300b1e48656c6c6f20576f726c642046726f6d204a6f652773204d5042203a20000041d0000b032d3e000041e0000b020a000029046e616d6504067072696e746e0100067072696e7473010004696e697400056170706c790201300131\",\n \"code_abi\": {\n \"types\": [{\n \"new_type_name\": \"account_name\",\n \"type\": \"name\"\n }\n ],\n \"structs\": [{\n \"name\": \"transfer\",\n \"base\": \"\",\n \"fields\": {\n \"from\": \"account_name\",\n \"to\": \"account_name\",\n \"amount\": \"uint64\"\n }\n },{\n \"name\": \"account\",\n \"base\": \"\",\n \"fields\": {\n \"account\": \"name\",\n \"balance\": \"uint64\"\n }\n }\n ],\n \"actions\": [{\n \"action_name\": \"transfer\",\n \"type\": \"transfer\"\n }\n ],\n \"tables\": [{\n \"table_name\": \"account\",\n \"index_type\": \"i64\",\n \"key_names\": [\n \"account\"\n ],\n \"key_types\": [\n \"name\"\n ],\n \"type\": \"account\"\n }\n ]\n }\n },\n \"hex_data\": \"000050f405338d37000087020061736d0100000001110460017f0060017e0060000060027e7e00021b0203656e76067072696e746e000103656e76067072696e7473000003030202030404017000000503010001071903066d656d6f7279020004696e69740002056170706c7900030a21020600411010010b1800413010012000100041d00010012001100041e00010010b0b54050041040b04704000000041100b114a6f6520496e697420576f726c64210a000041300b1e48656c6c6f20576f726c642046726f6d204a6f652773204d5042203a20000041d0000b032d3e000041e0000b020a000029046e616d6504067072696e746e0100067072696e7473010004696e697400056170706c790201300131010c6163636f756e745f6e616d65046e616d6502087472616e7366657200030466726f6d0c6163636f756e745f6e616d6502746f0c6163636f756e745f6e616d6506616d6f756e740675696e743634076163636f756e740002076163636f756e74046e616d650762616c616e63650675696e74363401000000572d3ccdcd087472616e7366657201000000204f4d11320369363401076163636f756e7401046e616d65076163636f756e74\"\n }\n ],\n \"output\": [{\n \"notify\": [],\n \"deferred_trxs\": []\n }\n ]\n }\n}\n\n```\n\n部署成功的话,在eosd进程的log中可以看到以下输出:执行的是合约代码中init方法:\n\n```\n912018ms wasm_interface.cpp:1023 load ] wasm_interface::load name = ayana1joe times llvm:7 ms, init:0 ms, abi:0 ms\nInit World!\n\n```\n\n向合约中发送消息:\n\n```\n➜ $ eosc -H testnet1.eos.io -p 80 push message ayana1joe hello '\"abcd\"' --scope ayana1joe\n552337ms main.cpp:1128 operator() ] Converting argument to binary...\n{\n \"transaction_id\": \"c15d281cc278ea15b448decae0e47cf7962a760b7c7dc599977bbfe99b7788da\",\n \"processed\": {\n \"ref_block_num\": 10430,\n \"ref_block_prefix\": 921642592,\n \"expiration\": \"2018-03-30T02:09:42\",\n \"scope\": [\n \"ayana1joe\"\n ],\n \"signatures\": [],\n \"messages\": [{\n \"code\": \"ayana1joe\",\n \"type\": \"hello\",\n \"authorization\": [],\n \"data\": \"abcd\"\n }\n ],\n \"output\": [{\n \"notify\": [],\n \"deferred_trxs\": []\n }\n ]\n }\n}\n\n```\n\n后台可以看到以下输入:执行的是apply方法:并且\n\n```\nHello World: ayana1joe->hello\n```\n\n\n一开始这种方式有点难理解,毕竟和以太坊太不一样了。\n\n不妨先看看EOS白皮书里对智能合约的描述:\n\n> 每个账户都可以将结构化的操作发送给其他账户,并可以定义脚本来处理接收到的操作。EOS为每个账户提供了专用数据库,只能由自己的操作处理程序访问。动作处理脚本还可以将操作发送到其他账户。\n\n\n**操作**(action,apply方法里的参数)和**自动操作处理程序**(apply方法中的代码)的组合正式EOS定义智能合约的方式。\n\n\n\n那什么是结构化操作呢? 修改下上面的hello.cpp : 加入transfer结构体(struct, c++里的自定义类型)\n\n```\n\n#include <hello.hpp>\n\n/**\n * The init() and apply() methods must have C calling convention so that the blockchain can lookup and\n * call these methods.\n */\nextern \"C\" {\n\n /**\n * This method is called once when the contract is published or updated.\n */\n void init() {\n eosio::print( \"Init World!\\n\" );\n }\n\n struct transfer {\n uint64_t from;\n uint64_t to;\n uint64_t quantity;\n };\n\n /// The apply method implements the dispatch of events to this contract\n void apply( uint64_t code, uint64_t action ) {\n eosio::print( \"Hello World: \", eosio::name(code), \"->\", eosio::name(action), \"\\n\" );\n if( action == N(transfer) ) {\n eosio::print( \"Hello World: \", eosio::name(code), \"->\", eosio::name(action), \"\\n\" );\n if( action == N(transfer) ) {\n auto message = eosio::current_message<transfer>();\n eosio::require_auth( message.from );\n eosio::print( \"Transfer \", message.quantity, \" from \", message.from, \" to \", message.to, \"\\n\" );\n }\n }\n\n} // extern \"C\"\n\n```\n\n然后重新编译和部署:\n\n```\neoscpp -o hello.wast hello.cpp \neosc -H testnet1.eos.io -p 80 set contract ayana1joe hello.wast hello.abi\n```\n\n这里发现,EOS中的智能合约是支持重新部署的,这是和以太坊不一样的。以太坊,一旦部署,就不可修改,有bug的话只能废弃掉。而EOS支持改下代码,重新编译,重新部署,替换掉有问题的代码。这种机制好不好呢? 暂不讨论,毕竟“**一旦部署就不可修改**” 是当初ICO浪潮中经常被拿出来“讲道理”的一个特点。现在却完全被废弃了。\n\n\n接下来调用下新部署的hello合约,\n\n```\n$ eosc push action ayana1joe transfer '{\"from\":\"ayana1joe\",\"to\":\"joeswallet\",\"quantity\":50}' --scope ayana1joe\n{\n \"transaction_id\": \"a777539b7d5f752fb40e6f2d019b65b5401be8bf91c8036440661506875ba1c0\",\n \"processed\": {\n \"ref_block_num\": 20,\n \"ref_block_prefix\": 463381070,\n \"expiration\": \"2017-09-14T01:05:49\",\n \"scope\": [\n \"ayana1joe\"\n ],\n \"signatures\": [],\n \"messages\": [{\n \"code\": \"ayana1joe\",\n \"type\": \"transfer\",\n \"authorization\": [],\n \"data\": {\n \"from\": \"ayana1joe\",\n \"to\": \"joeswallet\",\n \"quantity\": 50\n },\n \"hex_data\": \"00000079b822651d000000008040934b3200000000000000\"\n }\n ],\n \"output\": [{\n \"notify\": [],\n \"deferred_transactions\": []\n }\n ]\n }\n}\n\n```\n\n后台可以看到以下输出:\n\n```\nHello World: ayana1joe->transfer\nTransfer 50 from currency to joeswallet\n\n```\n\n这次调用,传入的是一个“结构体”, 也就是:\n\n```\n\n'{\"from\":\"ayana1joe\",\"to\":\"joeswallet\",\"quantity\":50}'\n\n```\n\n这是代码中定义的结构体的json格式。\n\n所以可以理解为什么说 “每个账户都可以将结构化的操作发送给其他账户” 了,其实就是传入一段合约中定义好的数据类型。apply函数中,根据参数action名称进行分发,用不同的逻辑代码处理接收到的数据。\n\n总结下,EOS智能合约的几个点:\n\n1. EOS智能合约是和账户绑定的,每个账户可以定义一份智能合约。创建合约的账户拥有对该合约的归属权。需要权限的地方可以使用:eosio::require_auth( message.from ); 来判断。\n2. 智能合约支持修改并重新部署 \n3. 调用智能合约的方式,可以理解为,向一个账户发送消息。账户收到之后,根据其自定义的脚本进行处理。\n\n\n## DPOS\n\n共识算法可以说是区块链的灵魂,它决定了区块链是否安全,是否公正,是否效率。\nEOS采用了DPOS (Delegate Proof of Stake)\n\n关于DPOS,EOS白皮书里一笑而过,没提到很多,有兴趣的可以看下这篇官文补充:\nhttps://steemit.com/dpos/@dantheman/dpos-consensus-algorithm-this-missing-white-paper\n或者译文:\nhttp://me.tryblockchain.org/blockchain-dpos-bm-eos.html\n\n常见共识算法:\n\nPoW(Proof Of Work)\n\n优点:简单,安全\n缺点:浪费资源。算力集中导致过于中心化。\n代表:比特币、以太坊(以太坊将在今年或明年改为新的共识算法[Casper ](https://blog.ethereum.org/2015/08/01/introducing-casper-friendly-ghost/))\n\nPoS(Proof of Stake)\n\n优点:节约电能,不需要消耗大量的算力。\n缺点:规模和安全性不足。\n\nDPoS(Delegate Proof of Stake) PoS的改进版\n\n优点:节约电能,满足规模要求。\n缺点:安全性不足。\n代表:Steemit , BitShare , EOS\n\n## 简单说说区块链1~4,\n\n区块链1.0: 以比特币为首的区块链项目,实现了分布式账本、去除了第三方\n开创了区块链先河。但是转账速度缓慢、交易手续费高、功能单一。\n\n区块链2.0: 以太坊为首的区块链2.0项目,除了实现了比特币货币功能之外。还引入了智能合约,为世人打开了Dapp世界的大门。但是随着使用人数的增多。生态系统的日益臃肿,以太坊的问题也越来越明显。落后的共识算法Pow,拥堵的网络。缓慢的交易确认和相对封闭的生态系统。\n\n区块链3.0: 以EOS为首的区块链项目3.0提供了更优化的共识算法DPos,更好的并发性,目标达到百万级/和对大规模商业应用更好的支持。尽管这些区块链3.0项目还未正式落地。\n\n区块链4.0: 区块链3.0都还没落地呢 又来区块链4.0? 还真有这样一个项目,大家路过就了解一下 http://seele.pro/ , 元一,采用神经网络共识算法和异构森林网络的区块链。 逼格很高的概念,建议有兴趣自行到官网了解。\n\n持续了一年的ICO,当前EOS无疑是值得期待的项目,是币王还是币妖,很快就能知道了。\n\n## 总结\n目前官方给出的智能合约开发资料还很少,Dapp开发示例则没有。EOS号称是以太坊杀手,未来的Dapp平台。离交卷还有两个多月。到底最终如何出招呢,让我们拭目以待。\n\n想要在EOS DAWN3.0 测试网上线的第一时间,就对它进行测试和验证的,可以加我微信。 或telegram群 : https://t.me/joinchat/GgxZkQy_seHdGk5MP3-scg\n\n测试内容:\n\n* 部署智能合约\n* 高频并发调用合约,简单测下TPS\n* 构建私服\n* 等等。。\n\n",
"json_metadata": "{\"tags\":[\"cn\",\"blockchain\",\"eos\"],\"image\":[\"https://steemitimages.com/DQmQT2rjqZsxqJaTW8CYiXrgsGFqWZWAR5Q1Gc1ibignAnR/eos1.jpeg\",\"https://steemitimages.com/DQmP7uVYv9qDFB6Kdmjrx5vZhVcFvyg6Dx9uRo4syiSmEys/eos2.jpeg\",\"https://steemitimages.com/DQmSexWyHp36NE7qmQMcpjDRtLHq725d9uwqRcCLYTdFpiu/Snip20180324_1.png\",\"https://steemitimages.com/DQmeS9HswoQsN44Pitb86GCcKQ58cWo5JKYK94dV2kVfkJe/qr.jpeg\"],\"links\":[\"https://github.com/EOSIO/eos\",\"https://docs.google.com/forms/d/e/1FAIpQLSel3HVFb22zYaAJfUtu_IzFgIJ4OATb0jQ3H2FV-HbwnJ090g/viewform\",\"https://steemit.com/dpos/@dantheman/dpos-consensus-algorithm-this-missing-white-paper\",\"http://me.tryblockchain.org/blockchain-dpos-bm-eos.html\",\"https://blog.ethereum.org/2015/08/01/introducing-casper-friendly-ghost/\",\"http://seele.pro/\",\"https://t.me/joinchat/GgxZkQy_seHdGk5MP3-scg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "cn",
"permlink": "eos",
"title": "EOS测试网先睹为快"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-03T07:43:06",
"trx_id": "984d1c10f3688a442f8d2324ac63bbe62480cde7",
"trx_in_block": 4,
"virtual_op": 0
}2018/03/30 09:10:48
2018/03/30 09:10:48
| author | jc1991 |
| permlink | js |
| voter | lone.ly12 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #21123805/Trx aa06783f7728b66ba90d3b370e9ea9c10a7d25e4 |
View Raw JSON Data
{
"block": 21123805,
"op": [
"vote",
{
"author": "jc1991",
"permlink": "js",
"voter": "lone.ly12",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-03-30T09:10:48",
"trx_id": "aa06783f7728b66ba90d3b370e9ea9c10a7d25e4",
"trx_in_block": 45,
"virtual_op": 0
}2018/03/30 09:09:54
2018/03/30 09:09:54
| author | jc1991 |
| permlink | js |
| voter | jc1991 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #21123787/Trx ce731fecf9d3617088cb8d19d23394b2db412fe2 |
View Raw JSON Data
{
"block": 21123787,
"op": [
"vote",
{
"author": "jc1991",
"permlink": "js",
"voter": "jc1991",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-03-30T09:09:54",
"trx_id": "ce731fecf9d3617088cb8d19d23394b2db412fe2",
"trx_in_block": 39,
"virtual_op": 0
}2018/03/30 09:09:54
2018/03/30 09:09:54
| author | jc1991 |
| body | # 用js实现一个简单的区块链 用Javascript实现一个简单的区块链程序。来加深对区块链当中一些基本概念的理解。 ## 区块链 区块链就是一个不断增长的全网总账本,每个完全节点都拥有完整的区块链,并且,节点总是信任最长的区块链,伪造区块链需要拥有超过51%的全网算力。 > 区块链的一个重要特性就是不可篡改 为什么区块链不可篡改? 区块链是由一个一个区块构成的有序链表,每一个区块都记录了一系列交易,并且,每个区块都指向前一个区块,从而形成一个链条。 每个区块都有一个唯一的哈希标识,被称为区块哈希,同时,区块通过记录上一个区块的哈希来指向上一个区块。 每一个区块还有一个Merkle哈希用来确保该区块的所有交易记录无法被篡改。 区块链中的主要数据就是一系列交易,第一条交易通常是coinbase交易,也就是矿工的挖矿奖励,后续交易都是用户的交易。 ## 区块 一个区块,包含了以下数据 * 前一个区块hash值 * 时间戳: 记录了该区块的生成时间 * 交易数据 (以及根据交易数据生成的Merkles树) * 区块hash值 * nonce 随机数(当前区块工作量证明的参数) ## 哈希算法 区块链的不可篡改特性是由哈希算法保证的。 哈希算法,又称散列算法,它是一个单向函数,可以把任意长度的输入数据转化为固定长度的输出: h = H(x) 例如,对morning和bitcoin两个输入进行某种哈希运算,得到的结果是固定长度的数字: H("morning") = c7c3169c21f1d92e9577871831d067c8 H("bitcoin") = cd5b1e4947e304476c788cd474fb579a 我们通常用十六进制表示哈希输出。 因为哈希算法是一个单向函数,要设计一个安全的哈希算法,就必须满足:通过输入可以很容易地计算输出,但是,反过来,通过输出无法反推输入,只能暴力穷举。 H("???????") = c7c3169c21f1d92e9577871831d067c8 H("???????") = cd5b1e4947e304476c788cd474fb579a 想要根据上述结果反推输入,只能由计算机暴力穷举。... ## 哈希碰撞 一个安全的哈希算法还需要满足另一个条件:碰撞率低。 碰撞是指,如果两个输入数据不同,却恰好计算出了相同的哈希值,那么我们说发生了碰撞: H("data-123456") = a76b1fb579a02a476c789d9115d4b201 H("data-ABCDEF") = a76b1fb579a02a476c789d9115d4b201 因为输入数据长度是不固定的,所以输入数据是一个无限大的集合,而输出数据长度是固定的,所以,输出数据是一个有限的集合。把一个无限的集合中的每个元素映射到一个有限的集合,就必然存在某些不同的输入得到了相同的输出。... > > 哈希碰撞的本质是把无限的集合映射到有限的集合时必然会产生碰撞。我们需要计算的是碰撞的概率。很显然,碰撞的概率和输出的集合大小相关。输出位数越多,输出集合就越大,碰撞率就越低。 安全哈希算法还需要满足一个条件,就是输出无规律。输入数据任意一个bit(某个字节的某一个二进制位)的改动,会导致输出完全不同,从而让攻击者无法逐步猜测输入,只能依赖暴力穷举来破解: H("hello-1") = 970db54ab8a93b7173cb48f55e67fd2c H("hello-2") = 8284353b768977f05ac600baad8d3d17 比特币使用的哈希算法有两种:SHA-256和RipeMD160 SHA-256的理论碰撞概率是:尝试2的130次方的随机输入,有99.8%的概率碰撞。 注意2130是一个非常大的数字,大约是1361万亿亿亿亿。以现有的计算机的计算能力,是不可能在短期内破解的。 比特币使用两种哈希算法,一种是对数据进行两次SHA-256计算,这种算法在比特币协议中通常被称为hash256。 另一种算法是先计算SHA-256,再计算RipeMD160,这种算法在比特币协议中通常被称为hash160。 ## 工作量证明 在比特币网络中,矿工的挖矿被称为工作量证明。 挖矿的目的是为了找到一个随机数,使其最终计算出来的区块哈希值 符合当前区块链的难度值。 通过改变区块头部的一个nonce字段的值,计算机可以计算出不同的区块哈希值. 直到计算出某个特定的哈希值的时候,计算结束。这个哈希和其他的哈希相比,它的特点是前面有好几个0: hash256(block data, nonce=0) = 291656f37cdcf493c4bb7b926e46fee5c14f9b76aff28f9d00f5cca0e54f376f hash256(block data, nonce=1) = f7b2c15c4de7f482edee9e8db7287a6c5def1c99354108ef33947f34d891ea8d hash256(block data, nonce=2) = b6eebc5faa4c44d9f5232631f39ddf4211443d819208da110229b644d2a99e12 hash256(block data, nonce=3) = 00aeaaf01166a93a2217fe01021395b066dd3a81daffcd16626c308c644c5246 hash256(block data, nonce=4) = 26d33671119c9180594a91a2f1f0eb08bdd0b595e3724050acb68703dc99f9b5 hash256(block data, nonce=5) = 4e8a3dcab619a7ce5c68e8f4abdc49f98de1a71e58f0ce9a0d95e024cce7c81a hash256(block data, nonce=6) = 185f634d50b17eba93b260a911ba6dbe9427b72f74f8248774930c0d8588c193 hash256(block data, nonce=7) = 09b19f3d32e3e5771bddc5f0e1ee3c1bac1ba4a85e7b2cc30833a120e41272ed ... hash256(block data, nonce=124709132) = 00000000fba7277ef31c8ecd1f3fef071cf993485fe5eab08e4f7647f47be95c 比特币挖矿的工作量证明原理就是,不断尝试计算区块的哈希,直到计算出一个特定的哈希值,它比难度值要小。 比特币使用的SHA-256算法可以看作对随机输入产生随机输出,例如,我们对字符串Hello再加上一个数字计算两次SHA-256,根据数字的不同,得到的哈希是完全无规律的256位随机数: hash256("Hello?") = ???????????????????????????????????????????????????????????????? 大约计算16次,我们可以在得到的哈希中找到首位是0的哈希值,因为首位是0出现的概率是1/16: 如果我们要找出前两位是0的哈希值,理论上需要计算256次,因为00出现的概率是16^2 ,实际计算44次: hash256("Hello44") = 00e477f95283a544ffac7a8efc7decb887f5c073e0f3b43b3797b5dafabb49b5 如果我们要找出前3位是0的哈希值,理论上需要计算16^3 = 4096次,实际计算6591次: hash256("Hello6591") = 0008a883dacb7094d6da1a6cefc6e7cbc13635d024ac15152c4eadba7af8d11c 如果我们要找出前4位是0的哈希值,理论上需要计算16^4 = 6万5千多次,实际计算6万7千多次: hash256("Hello67859") = 00002e4af0b80d706ae749d22247d91d9b1c2e91547d888e5e7a91bcc0982b87 如果我们要找出前5位是0的哈希值,理论上需要计算16^5 = 104万次,实际计算158万次: hash256("Hello1580969") = 00000ca640d95329f965bde016b866e75a3e29e1971cf55ffd1344cdb457930e 如果我们要找出前6位是0的哈希值,理论上需要计算16^6 =1677万次,实际计算1558万次: hash256("Hello15583041") = 0000009becc5cf8c9e6ba81b1968575a1d15a93112d3bd67f4546f6172ef7e76 对于给定难度的SHA-256:假设我们用难度1表示必须算出首位1个0,难度2表示必须算出首位两个0,难度N表示必须算出首位N个0,那么,每增加一个难度,计算量将增加16倍。 对于比特币挖矿来说,就是先给定一个难度值,然后不断变换nonce,计算Block Hash,直到找到一个比给定难度值低的Block Hash,就算成功挖矿。 我们用简化的方法来说明难度,例如,必须计算出连续17个0开头的哈希值,矿工先确定Prev Hash,Merkle Hash,Timestamp,bits,然后,不断变化nonce来计算哈希,直到找出连续17个0开头的哈希值。我们可以大致推算一下,17个十六进制的0相当于计算了 16^17 次,大约需要计算2.9万亿亿次。 17个0 = 16**17 = 295147905179352825856 = 2.9万亿亿次 实际的难度是根据bits由一个公式计算出来,比特币协议要求计算出的区块的哈希值比难度值要小,这个区块才算有效: Difficuly = 402937298 = 0x18 0455d2 = 0x0455d2 * 28 * (0x18 - 3) = 106299667504289830835845558415962632664710558339861315584 = 0x00000000000000000455d2000000000000000000000000000000000000000000... 注意,难度值越小,说明哈希值前面的`0`越多,计算难度越大 比特币网络的难度值是不断变化的,它的难度值保证大约每10分钟产生一个区块,而难度值在每2015个区块调整一次:如果区块平均生成时间小于10分钟,说明全网算力增加,难度值也会增加,如果区块平均生成时间大于10分钟,说明全网算力减少,难度值也会减少。因此,难度值随着全网算力的增减会动态调整。... ## 代码实现 区块链、区块、哈希算法、哈希碰撞、工作量证明。 该祭出代码了。 #### 区块: * sha256算法可以直接从crypto-js中引入 * 构造器中设好该区块的属性 ``` const SHA256 = require("crypto-js/sha256"); class Block { constructor(timestamp, transactions, previousHash = '') { this.previousHash = previousHash; this.timestamp = timestamp; this.transactions = transactions; this.hash = this.calculateHash(); this.nonce = 0; } ... calculateHash() .. mineBlock(difficulty) ... } ``` * 计算区块哈希 计算当前区块的哈希,简单的使用前一个区块哈希值,时间戳,区块交易数据,nonce 来计算。 没有引入Merkle树。 ``` calculateHash() { return SHA256(this.previousHash + this.timestamp + JSON.stringify(this.transactions) + this.nonce).toString(); } ``` * 区块挖矿 ``` mineBlock(difficulty) { while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")) { this.nonce++; this.hash = this.calculateHash(); } console.log("\nBLOCK MINED: " + this.hash); } ``` #### 交易 一笔交易,包含谁给谁转账多少币。简单表示为: ``` class Transaction{ constructor(fromAddress, toAddress, amount){ this.fromAddress = fromAddress; this.toAddress = toAddress; this.amount = amount; } } ``` #### 区块链 * 构造器设定了 第一个创世区块,难度值,等待确认的交易,以及区块奖励。 ``` class Blockchain{ constructor() { this.chain = [this.createGenesisBlock()]; this.difficulty = 4; this.pendingTransactions = []; this.miningReward = 50; } ... createGenesisBlock()... getLatestBlock()... createTransaction()... } ``` * createGenesisBlock: 创建创世区块。 ``` createGenesisBlock() { return new Block(Date.now(), [], "0"); } ``` * getLatestBlock : 获取最后一个区块,当生成新区块时,需要获取上一个区块 ``` getLatestBlock() { return this.chain[this.chain.length - 1]; } ``` * 创建交易 生成一笔交易,push到区块链当中的pendingTransactions ``` createTransaction(transaction){ console.log(`${transaction.fromAddress} send ${transaction.amount} to ${transaction.toAddress}`) this.pendingTransactions.push(transaction); } ``` * 矿工进行挖矿 、 生成新区块 、 奖励矿工 ``` minePendingTransactions(miningRewardAddress){ let block = new Block(Date.now(), this.pendingTransactions, this.getLatestBlock().hash); block.mineBlock(this.difficulty); console.log('Block successfully mined! Miner is ' + miningRewardAddress); this.chain.push(block); this.pendingTransactions = [ new Transaction(null, miningRewardAddress, this.miningReward) ]; } ``` * 验证区块链是否有效 从创世区块开始,遍历每一个区块,计算出哈希和当前哈希是否相等,验证交易数据有没有被篡改,并验证存储的前一个区块哈希值是否等于上一个区块的哈希值,保证链的有效性。 这保证了,整条链中哪怕有一个区块中的交易数据有微小的改动,都将导致区块链验证失败。 ``` isChainValid() { for (let i = 1; i < this.chain.length; i++){ const currentBlock = this.chain[i]; const previousBlock = this.chain[i - 1]; if (currentBlock.hash !== currentBlock.calculateHash()) { return false; } if (currentBlock.previousHash !== previousBlock.hash) { return false; } } return true; } ``` * 获取余额 遍历所有交易数据。把收入和支出做一个累计。 ``` getBalanceOfAddress(address){ let balance = 0; for(const block of this.chain){ for(const trans of block.transactions){ if(trans.fromAddress === address){ balance -= trans.amount; } if(trans.toAddress === address){ balance += trans.amount; } } } return balance; } ``` #### 运行! 过程: * 创建区块链。 * Bob挖了第一个区块。此时(Bob奖励50个币,但是需要等待下一个区块确认) * Joe挖了第二个区块。(Bob的50个币被确认。Joe奖励的50个币,等待下一个区块确认) * Bob向Alice转账50 * Alice向Bob退还25 * Joe 挖了三个区块确认了上面两笔交易。 * Bob 挖了第四个区块。 * 新来的矿工 Jack 挖了第五个区块。 ``` let codeCoin = new Blockchain(); console.log('Starting the miner...'); codeCoin.minePendingTransactions('Bob'); codeCoin.minePendingTransactions('Joe'); console.log('\nBalance of Bob is', codeCoin.getBalanceOfAddress('Bob')); console.log("") codeCoin.createTransaction(new Transaction('Bob', 'Alice', 50)); codeCoin.createTransaction(new Transaction('Alice', 'Bob', 25)); codeCoin.minePendingTransactions('Joe'); console.log('\nBalance of Joe is', codeCoin.getBalanceOfAddress('Joe')); codeCoin.minePendingTransactions('Bob'); console.log('\nBalance of Joe is', codeCoin.getBalanceOfAddress('Joe')); codeCoin.minePendingTransactions('Jack'); console.log('\nBalance of Bob is', codeCoin.getBalanceOfAddress('Bob')); console.log('Balance of Joe is', codeCoin.getBalanceOfAddress('Joe')); console.log('Balance of Alice is', codeCoin.getBalanceOfAddress('Alice')); console.log('Balance of Jack is', codeCoin.getBalanceOfAddress('Jack')); ``` 输出结果可以预测下: 每次挖矿的区块奖励50, Bob挖了两次,奖励100 Joe挖了两次,奖励100 Jack挖了一次。奖励 50 (未确认) Alice 和 Bob 进行了交易,于是Alice也有25,Bob变成75. ``` ➜ js-blockchain node test.js Starting the miner... BLOCK MINED: 0000362f807f2388cd71b83dd1d479cb5b970313dab214d1fda73bc4e6d984a1 Block successfully mined! Miner is Bob BLOCK MINED: 000023ac01723580e393dfaf4e08119a0a29d8719e0de28521779662da091eb2 Block successfully mined! Miner is Joe Balance of Bob is 50 Bob send 50 to Alice Alice send 25 to Bob BLOCK MINED: 0000224074414014b4b11aedf73d53a22d66d7d5c3b42096de28c59a00ad516d Block successfully mined! Miner is Joe Balance of Joe is 50 BLOCK MINED: 0000c3de2e45f316428d412e7b4b7b1ca8b797f8c3878c4eb6ffce6152c7ddda Block successfully mined! Miner is Bob Balance of Joe is 100 BLOCK MINED: 00005da59c20889203d88c436aee89b308e550dd9f884d30e4c1bde62bb55832 Block successfully mined! Miner is Jack Balance of Bob is 75 Balance of Joe is 100 Balance of Alice is 25 Balance of Jack is 0 ``` ## 总结 利用Javascript实现了一个的区块链。加深对一些基本概念的理解。 |
| json metadata | {"tags":["blockchain","cn","js"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | blockchain |
| permlink | js |
| title | 用js实现一个简单的区块链 |
| Transaction Info | Block #21123787/Trx ce731fecf9d3617088cb8d19d23394b2db412fe2 |
View Raw JSON Data
{
"block": 21123787,
"op": [
"comment",
{
"author": "jc1991",
"body": "# 用js实现一个简单的区块链\n\n用Javascript实现一个简单的区块链程序。来加深对区块链当中一些基本概念的理解。\n\n\n## 区块链\n\n区块链就是一个不断增长的全网总账本,每个完全节点都拥有完整的区块链,并且,节点总是信任最长的区块链,伪造区块链需要拥有超过51%的全网算力。\n\n> 区块链的一个重要特性就是不可篡改\n\n为什么区块链不可篡改?\n\n区块链是由一个一个区块构成的有序链表,每一个区块都记录了一系列交易,并且,每个区块都指向前一个区块,从而形成一个链条。\n\n每个区块都有一个唯一的哈希标识,被称为区块哈希,同时,区块通过记录上一个区块的哈希来指向上一个区块。\n\n每一个区块还有一个Merkle哈希用来确保该区块的所有交易记录无法被篡改。\n\n区块链中的主要数据就是一系列交易,第一条交易通常是coinbase交易,也就是矿工的挖矿奖励,后续交易都是用户的交易。\n\n\n## 区块\n\n一个区块,包含了以下数据\n\n* 前一个区块hash值\n* 时间戳: 记录了该区块的生成时间\n* 交易数据 (以及根据交易数据生成的Merkles树)\n* 区块hash值\n* nonce 随机数(当前区块工作量证明的参数)\n\n\n## 哈希算法\n区块链的不可篡改特性是由哈希算法保证的。\n\n哈希算法,又称散列算法,它是一个单向函数,可以把任意长度的输入数据转化为固定长度的输出:\n\n h = H(x)\n \n例如,对morning和bitcoin两个输入进行某种哈希运算,得到的结果是固定长度的数字:\n\n H(\"morning\") = c7c3169c21f1d92e9577871831d067c8\n H(\"bitcoin\") = cd5b1e4947e304476c788cd474fb579a\n \n我们通常用十六进制表示哈希输出。\n\n因为哈希算法是一个单向函数,要设计一个安全的哈希算法,就必须满足:通过输入可以很容易地计算输出,但是,反过来,通过输出无法反推输入,只能暴力穷举。\n\n H(\"???????\") = c7c3169c21f1d92e9577871831d067c8\n H(\"???????\") = cd5b1e4947e304476c788cd474fb579a\n \n想要根据上述结果反推输入,只能由计算机暴力穷举。...\n\n## 哈希碰撞\n\n一个安全的哈希算法还需要满足另一个条件:碰撞率低。\n\n碰撞是指,如果两个输入数据不同,却恰好计算出了相同的哈希值,那么我们说发生了碰撞:\n\n H(\"data-123456\") = a76b1fb579a02a476c789d9115d4b201\n H(\"data-ABCDEF\") = a76b1fb579a02a476c789d9115d4b201\n \n因为输入数据长度是不固定的,所以输入数据是一个无限大的集合,而输出数据长度是固定的,所以,输出数据是一个有限的集合。把一个无限的集合中的每个元素映射到一个有限的集合,就必然存在某些不同的输入得到了相同的输出。...\n\n> \n> 哈希碰撞的本质是把无限的集合映射到有限的集合时必然会产生碰撞。我们需要计算的是碰撞的概率。很显然,碰撞的概率和输出的集合大小相关。输出位数越多,输出集合就越大,碰撞率就越低。\n\n安全哈希算法还需要满足一个条件,就是输出无规律。输入数据任意一个bit(某个字节的某一个二进制位)的改动,会导致输出完全不同,从而让攻击者无法逐步猜测输入,只能依赖暴力穷举来破解:\n\n H(\"hello-1\") = 970db54ab8a93b7173cb48f55e67fd2c\n H(\"hello-2\") = 8284353b768977f05ac600baad8d3d17\n\n\n比特币使用的哈希算法有两种:SHA-256和RipeMD160\n\nSHA-256的理论碰撞概率是:尝试2的130次方的随机输入,有99.8%的概率碰撞。\n注意2130是一个非常大的数字,大约是1361万亿亿亿亿。以现有的计算机的计算能力,是不可能在短期内破解的。\n\n比特币使用两种哈希算法,一种是对数据进行两次SHA-256计算,这种算法在比特币协议中通常被称为hash256。\n另一种算法是先计算SHA-256,再计算RipeMD160,这种算法在比特币协议中通常被称为hash160。\n\n\n## 工作量证明\n\n在比特币网络中,矿工的挖矿被称为工作量证明。 挖矿的目的是为了找到一个随机数,使其最终计算出来的区块哈希值 符合当前区块链的难度值。\n\n通过改变区块头部的一个nonce字段的值,计算机可以计算出不同的区块哈希值.\n\n直到计算出某个特定的哈希值的时候,计算结束。这个哈希和其他的哈希相比,它的特点是前面有好几个0:\n\n hash256(block data, nonce=0) = 291656f37cdcf493c4bb7b926e46fee5c14f9b76aff28f9d00f5cca0e54f376f\n hash256(block data, nonce=1) = f7b2c15c4de7f482edee9e8db7287a6c5def1c99354108ef33947f34d891ea8d\n hash256(block data, nonce=2) = b6eebc5faa4c44d9f5232631f39ddf4211443d819208da110229b644d2a99e12\n hash256(block data, nonce=3) = 00aeaaf01166a93a2217fe01021395b066dd3a81daffcd16626c308c644c5246\n hash256(block data, nonce=4) = 26d33671119c9180594a91a2f1f0eb08bdd0b595e3724050acb68703dc99f9b5\n hash256(block data, nonce=5) = 4e8a3dcab619a7ce5c68e8f4abdc49f98de1a71e58f0ce9a0d95e024cce7c81a\n hash256(block data, nonce=6) = 185f634d50b17eba93b260a911ba6dbe9427b72f74f8248774930c0d8588c193\n hash256(block data, nonce=7) = 09b19f3d32e3e5771bddc5f0e1ee3c1bac1ba4a85e7b2cc30833a120e41272ed\n ...\n hash256(block data, nonce=124709132) = 00000000fba7277ef31c8ecd1f3fef071cf993485fe5eab08e4f7647f47be95c\n \n \n 比特币挖矿的工作量证明原理就是,不断尝试计算区块的哈希,直到计算出一个特定的哈希值,它比难度值要小。\n \n 比特币使用的SHA-256算法可以看作对随机输入产生随机输出,例如,我们对字符串Hello再加上一个数字计算两次SHA-256,根据数字的不同,得到的哈希是完全无规律的256位随机数:\n \n hash256(\"Hello?\") = ????????????????????????????????????????????????????????????????\n \n大约计算16次,我们可以在得到的哈希中找到首位是0的哈希值,因为首位是0出现的概率是1/16:\n \n如果我们要找出前两位是0的哈希值,理论上需要计算256次,因为00出现的概率是16^2 ,实际计算44次:\n\n hash256(\"Hello44\") = 00e477f95283a544ffac7a8efc7decb887f5c073e0f3b43b3797b5dafabb49b5\n\n如果我们要找出前3位是0的哈希值,理论上需要计算16^3 = 4096次,实际计算6591次:\n\n hash256(\"Hello6591\") = 0008a883dacb7094d6da1a6cefc6e7cbc13635d024ac15152c4eadba7af8d11c\n\n如果我们要找出前4位是0的哈希值,理论上需要计算16^4 = 6万5千多次,实际计算6万7千多次:\n\n hash256(\"Hello67859\") = 00002e4af0b80d706ae749d22247d91d9b1c2e91547d888e5e7a91bcc0982b87\n \n如果我们要找出前5位是0的哈希值,理论上需要计算16^5 = 104万次,实际计算158万次:\n\n hash256(\"Hello1580969\") = 00000ca640d95329f965bde016b866e75a3e29e1971cf55ffd1344cdb457930e\n \n如果我们要找出前6位是0的哈希值,理论上需要计算16^6 =1677万次,实际计算1558万次:\n\n hash256(\"Hello15583041\") = 0000009becc5cf8c9e6ba81b1968575a1d15a93112d3bd67f4546f6172ef7e76\n\n 对于给定难度的SHA-256:假设我们用难度1表示必须算出首位1个0,难度2表示必须算出首位两个0,难度N表示必须算出首位N个0,那么,每增加一个难度,计算量将增加16倍。\n\n对于比特币挖矿来说,就是先给定一个难度值,然后不断变换nonce,计算Block Hash,直到找到一个比给定难度值低的Block Hash,就算成功挖矿。\n\n\n我们用简化的方法来说明难度,例如,必须计算出连续17个0开头的哈希值,矿工先确定Prev Hash,Merkle Hash,Timestamp,bits,然后,不断变化nonce来计算哈希,直到找出连续17个0开头的哈希值。我们可以大致推算一下,17个十六进制的0相当于计算了 16^17 次,大约需要计算2.9万亿亿次。\n\n 17个0 = 16**17 = 295147905179352825856 = 2.9万亿亿次\n\n实际的难度是根据bits由一个公式计算出来,比特币协议要求计算出的区块的哈希值比难度值要小,这个区块才算有效:\n\n Difficuly = 402937298\n = 0x18 0455d2\n = 0x0455d2 * 28 * (0x18 - 3)\n = 106299667504289830835845558415962632664710558339861315584\n = 0x00000000000000000455d2000000000000000000000000000000000000000000...\n\n\n注意,难度值越小,说明哈希值前面的`0`越多,计算难度越大\n\n比特币网络的难度值是不断变化的,它的难度值保证大约每10分钟产生一个区块,而难度值在每2015个区块调整一次:如果区块平均生成时间小于10分钟,说明全网算力增加,难度值也会增加,如果区块平均生成时间大于10分钟,说明全网算力减少,难度值也会减少。因此,难度值随着全网算力的增减会动态调整。...\n\n \n \n## 代码实现\n区块链、区块、哈希算法、哈希碰撞、工作量证明。\n该祭出代码了。\n \n#### 区块: \n\n* sha256算法可以直接从crypto-js中引入\n* 构造器中设好该区块的属性\n\n\n```\n\nconst SHA256 = require(\"crypto-js/sha256\");\n\nclass Block {\n constructor(timestamp, transactions, previousHash = '') {\n this.previousHash = previousHash;\n this.timestamp = timestamp;\n this.transactions = transactions;\n this.hash = this.calculateHash();\n this.nonce = 0;\n }\n ...\n calculateHash() ..\n mineBlock(difficulty) ...\n}\n\n```\n\n* 计算区块哈希\n 计算当前区块的哈希,简单的使用前一个区块哈希值,时间戳,区块交易数据,nonce 来计算。 没有引入Merkle树。\n \n```\ncalculateHash() {\n return SHA256(this.previousHash + this.timestamp + JSON.stringify(this.transactions) + this.nonce).toString();\n}\n\n```\n\n* 区块挖矿 \n\n```\n\nmineBlock(difficulty) {\n while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join(\"0\")) {\n this.nonce++;\n this.hash = this.calculateHash();\n }\n \n console.log(\"\\nBLOCK MINED: \" + this.hash);\n}\n \n \n```\n\n#### 交易\n\n一笔交易,包含谁给谁转账多少币。简单表示为:\n\n```\nclass Transaction{\n constructor(fromAddress, toAddress, amount){\n this.fromAddress = fromAddress;\n this.toAddress = toAddress;\n this.amount = amount;\n }\n}\n\n```\n\n#### 区块链\n\n* 构造器设定了 第一个创世区块,难度值,等待确认的交易,以及区块奖励。\n\n``` \nclass Blockchain{\n constructor() {\n this.chain = [this.createGenesisBlock()];\n this.difficulty = 4;\n this.pendingTransactions = [];\n this.miningReward = 50;\n }\n ...\n createGenesisBlock()...\n getLatestBlock()...\n createTransaction()...\n}\n \n```\n\n* createGenesisBlock: 创建创世区块。\n\n```\ncreateGenesisBlock() {\n return new Block(Date.now(), [], \"0\");\n}\n\n```\n\n* getLatestBlock : 获取最后一个区块,当生成新区块时,需要获取上一个区块\n\n```\ngetLatestBlock() {\n return this.chain[this.chain.length - 1];\n}\n\n```\n\n* 创建交易\n\n生成一笔交易,push到区块链当中的pendingTransactions\n\n```\ncreateTransaction(transaction){\n console.log(`${transaction.fromAddress} send ${transaction.amount} to ${transaction.toAddress}`)\n this.pendingTransactions.push(transaction);\n}\n\n```\n\n* 矿工进行挖矿 、 生成新区块 、 奖励矿工 \n\n```\nminePendingTransactions(miningRewardAddress){\n let block = new Block(Date.now(), this.pendingTransactions, this.getLatestBlock().hash);\n block.mineBlock(this.difficulty);\n\n console.log('Block successfully mined! Miner is ' + miningRewardAddress);\n this.chain.push(block);\n\n this.pendingTransactions = [\n new Transaction(null, miningRewardAddress, this.miningReward)\n ];\n}\n \n```\n\n* 验证区块链是否有效\n\n从创世区块开始,遍历每一个区块,计算出哈希和当前哈希是否相等,验证交易数据有没有被篡改,并验证存储的前一个区块哈希值是否等于上一个区块的哈希值,保证链的有效性。 \n这保证了,整条链中哪怕有一个区块中的交易数据有微小的改动,都将导致区块链验证失败。\n\n```\nisChainValid() {\n for (let i = 1; i < this.chain.length; i++){\n const currentBlock = this.chain[i];\n const previousBlock = this.chain[i - 1];\n\n if (currentBlock.hash !== currentBlock.calculateHash()) {\n return false;\n }\n\n if (currentBlock.previousHash !== previousBlock.hash) {\n return false;\n }\n }\n\n return true;\n}\n\n\n```\n\n\n* 获取余额\n 遍历所有交易数据。把收入和支出做一个累计。\n\n```\ngetBalanceOfAddress(address){\n let balance = 0;\n\n for(const block of this.chain){\n for(const trans of block.transactions){\n if(trans.fromAddress === address){\n balance -= trans.amount;\n }\n\n if(trans.toAddress === address){\n balance += trans.amount;\n }\n }\n }\n\n return balance;\n }\n \n```\n\n\n#### 运行!\n\n过程: \n\n* 创建区块链。\n* Bob挖了第一个区块。此时(Bob奖励50个币,但是需要等待下一个区块确认)\n* Joe挖了第二个区块。(Bob的50个币被确认。Joe奖励的50个币,等待下一个区块确认)\n* Bob向Alice转账50\n* Alice向Bob退还25\n* Joe 挖了三个区块确认了上面两笔交易。\n* Bob 挖了第四个区块。\n* 新来的矿工 Jack 挖了第五个区块。\n\n```\nlet codeCoin = new Blockchain();\nconsole.log('Starting the miner...');\n\ncodeCoin.minePendingTransactions('Bob');\ncodeCoin.minePendingTransactions('Joe');\n\nconsole.log('\\nBalance of Bob is', codeCoin.getBalanceOfAddress('Bob'));\n\nconsole.log(\"\")\ncodeCoin.createTransaction(new Transaction('Bob', 'Alice', 50));\ncodeCoin.createTransaction(new Transaction('Alice', 'Bob', 25));\n\ncodeCoin.minePendingTransactions('Joe');\n\nconsole.log('\\nBalance of Joe is', codeCoin.getBalanceOfAddress('Joe'));\n\ncodeCoin.minePendingTransactions('Bob');\n\nconsole.log('\\nBalance of Joe is', codeCoin.getBalanceOfAddress('Joe'));\n\ncodeCoin.minePendingTransactions('Jack');\n\nconsole.log('\\nBalance of Bob is', codeCoin.getBalanceOfAddress('Bob'));\nconsole.log('Balance of Joe is', codeCoin.getBalanceOfAddress('Joe'));\nconsole.log('Balance of Alice is', codeCoin.getBalanceOfAddress('Alice'));\nconsole.log('Balance of Jack is', codeCoin.getBalanceOfAddress('Jack'));\n\n```\n\n输出结果可以预测下: \n每次挖矿的区块奖励50,\nBob挖了两次,奖励100\nJoe挖了两次,奖励100\nJack挖了一次。奖励 50 (未确认)\nAlice 和 Bob 进行了交易,于是Alice也有25,Bob变成75.\n\n\n```\n➜ js-blockchain node test.js\nStarting the miner...\n\nBLOCK MINED: 0000362f807f2388cd71b83dd1d479cb5b970313dab214d1fda73bc4e6d984a1\nBlock successfully mined! Miner is Bob\n\nBLOCK MINED: 000023ac01723580e393dfaf4e08119a0a29d8719e0de28521779662da091eb2\nBlock successfully mined! Miner is Joe\n\nBalance of Bob is 50\n\nBob send 50 to Alice\nAlice send 25 to Bob\n\nBLOCK MINED: 0000224074414014b4b11aedf73d53a22d66d7d5c3b42096de28c59a00ad516d\nBlock successfully mined! Miner is Joe\n\nBalance of Joe is 50\n\nBLOCK MINED: 0000c3de2e45f316428d412e7b4b7b1ca8b797f8c3878c4eb6ffce6152c7ddda\nBlock successfully mined! Miner is Bob\n\nBalance of Joe is 100\n\nBLOCK MINED: 00005da59c20889203d88c436aee89b308e550dd9f884d30e4c1bde62bb55832\nBlock successfully mined! Miner is Jack\n\nBalance of Bob is 75\nBalance of Joe is 100\nBalance of Alice is 25\nBalance of Jack is 0\n\n\n```\n\n## 总结\n\n利用Javascript实现了一个的区块链。加深对一些基本概念的理解。",
"json_metadata": "{\"tags\":[\"blockchain\",\"cn\",\"js\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "blockchain",
"permlink": "js",
"title": "用js实现一个简单的区块链"
}
],
"op_in_trx": 0,
"timestamp": "2018-03-30T09:09:54",
"trx_id": "ce731fecf9d3617088cb8d19d23394b2db412fe2",
"trx_in_block": 39,
"virtual_op": 0
}2018/03/29 08:10:45
2018/03/29 08:10:45
| author | jc1991 |
| permlink | 49navv |
| sbd payout | 0.054 SBD |
| steem payout | 0.004 STEEM |
| vesting payout | 71.400327 VESTS |
| Transaction Info | Block #21093814/Virtual Operation #15 |
View Raw JSON Data
{
"block": 21093814,
"op": [
"author_reward",
{
"author": "jc1991",
"permlink": "49navv",
"sbd_payout": "0.054 SBD",
"steem_payout": "0.004 STEEM",
"vesting_payout": "71.400327 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-03-29T08:10:45",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 15
}felixsteemupvoted (100.00%) @jc1991 / 49navv2018/03/22 12:22:21
felixsteemupvoted (100.00%) @jc1991 / 49navv
2018/03/22 12:22:21
| author | jc1991 |
| permlink | 49navv |
| voter | felixsteem |
| weight | 10000 (100.00%) |
| Transaction Info | Block #20897655/Trx 040aac1158ad1b3d4d6c1aac2e1825c3e00143fb |
View Raw JSON Data
{
"block": 20897655,
"op": [
"vote",
{
"author": "jc1991",
"permlink": "49navv",
"voter": "felixsteem",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-03-22T12:22:21",
"trx_id": "040aac1158ad1b3d4d6c1aac2e1825c3e00143fb",
"trx_in_block": 37,
"virtual_op": 0
}brysj22952upvoted (100.00%) @jc1991 / 49navv2018/03/22 11:05:12
brysj22952upvoted (100.00%) @jc1991 / 49navv
2018/03/22 11:05:12
| author | jc1991 |
| permlink | 49navv |
| voter | brysj22952 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #20896112/Trx 3716ec30e27bbe9673b2d7a471abe26038819191 |
View Raw JSON Data
{
"block": 20896112,
"op": [
"vote",
{
"author": "jc1991",
"permlink": "49navv",
"voter": "brysj22952",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-03-22T11:05:12",
"trx_id": "3716ec30e27bbe9673b2d7a471abe26038819191",
"trx_in_block": 16,
"virtual_op": 0
}2018/03/22 08:41:15
2018/03/22 08:41:15
| author | jc1991 |
| permlink | 49navv |
| voter | pinoy |
| weight | 3000 (30.00%) |
| Transaction Info | Block #20893233/Trx 35b29c584a04e641fd172fb8d2772320a0ccd18b |
View Raw JSON Data
{
"block": 20893233,
"op": [
"vote",
{
"author": "jc1991",
"permlink": "49navv",
"voter": "pinoy",
"weight": 3000
}
],
"op_in_trx": 0,
"timestamp": "2018-03-22T08:41:15",
"trx_id": "35b29c584a04e641fd172fb8d2772320a0ccd18b",
"trx_in_block": 14,
"virtual_op": 0
}2018/03/22 08:40:45
2018/03/22 08:40:45
| author | jc1991 |
| permlink | 49navv |
| voter | hr1 |
| weight | 2 (0.02%) |
| Transaction Info | Block #20893223/Trx f520801148c20502d759cf8f2b8400327c4b0025 |
View Raw JSON Data
{
"block": 20893223,
"op": [
"vote",
{
"author": "jc1991",
"permlink": "49navv",
"voter": "hr1",
"weight": 2
}
],
"op_in_trx": 0,
"timestamp": "2018-03-22T08:40:45",
"trx_id": "f520801148c20502d759cf8f2b8400327c4b0025",
"trx_in_block": 45,
"virtual_op": 0
}2018/03/22 08:10:45
2018/03/22 08:10:45
| author | jc1991 |
| permlink | 49navv |
| voter | jc1991 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #20892623/Trx 38b75ef7078fdc5a1620acfd422e17c99e4b2c39 |
View Raw JSON Data
{
"block": 20892623,
"op": [
"vote",
{
"author": "jc1991",
"permlink": "49navv",
"voter": "jc1991",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-03-22T08:10:45",
"trx_id": "38b75ef7078fdc5a1620acfd422e17c99e4b2c39",
"trx_in_block": 70,
"virtual_op": 0
}2018/03/22 08:10:45
2018/03/22 08:10:45
| author | jc1991 |
| body | # 用区块链实现共产主义 也许是最近放太多精力在区块链技术上了。以至于做梦时都在区块链, 我梦见了未来有人用区块链技术,实现了共产主义,实现了大同社会。在这个世界上,开启了一个有秩序的理想世界。 接下来,让我来解解梦。我将一步步的说明,怎么用区块链技术,来构建一个理想世界。 提到区块链,就不得不说说“去中心化”和“自治组织”。这是区块链技术带给我们的礼物。 这和 “共产主义” 里的 “公有制、自由、平等” 是很融洽的。 以现在的以太坊平台为例,我们可以在上面用一份智能合约,创建出一个“去中心化的自治组织”。 技术上的实现可以参考以太坊的文档: [How to build a Decentralized Autonomous Organization](https://www.ethereum.org/dao#the-shareholder-association) 我先放出我的代码框架: ``` pragma solidity ^0.4.19; /** * An ideal or perfect society */ contract GreatHarmon { /* Initializes contract */ function GreatHarmon() public { } } ``` 当然,还有很多代码,我会慢慢放出来,并解释。 现在假设我已经创建好了这份智能合约,并且部署到区块链上了。一个智能合约一旦创建,就有了使命和意义,它已经开启了一个世界,并敞开大门,等待着它的居民来入驻。 在这里我们约定下,从现在开始称这个“合约”为“大同世界” 吧。 大同世界里有它自己的游戏规则,这些规则如何制定呢? 我们要先来看下“伟大的共产主义”的理想是什么。然后按照”共产主义“的理想来构建这些规则。 从小就唱着 “我们是共产主义接班人” 的歌, 但很多人其实并不很清楚什么是“共产主义”,以为它只不过是一个口号。 我摘取一些百科资料,让大家有个共识: > 共产主义(Communism)是一种政治观点和思想体系,现今的共产主义奉马克思、恩格斯思想为基本思想。共产主义主张消灭生产资料私有制,并建立一个没有阶级制度、没有剥削、没有压迫,实现人类自我解放的社会,也是社会化集体大生产的社会,面对恶势力也会团结一致。共产主义者认为未来所有阶级社会最终将过渡到各尽所能 各取所需的共产主义社会,人类社会的意识形态将进入高级阶段。 > ### 概念 > 马克思充分研究了人类的历史、经济和科技的发展,发现人类社会是以物质生产为基础的,现有生产力所决定的分工造成的不同人的经济地位,决定了不同人的社会地位,人们之间的经济关系决定了整个社会的形态,法律、道德等上层建筑只是由经济地位占统治地位的群体而决定的。 简易地说,人类社会是一个群体的社会,在群体社会的管理过程中人们对社会资源占有( 或社会分配 )的方式,,大概可以分成三种形式: 『两极分化』即一小撮人占有社会的绝大部分资源,也就是人们的贫富差距很大,占有绝大部分社会资源的一小撮人就是统治阶级; 『相对平等』即整个社会的人们贫富差距不大,仍旧是私有制社会,人们各自的财产被限制在社会相对均匀的数量里, 控制社会财富分配的是统治阶级; 『按需所取』即人们共同占有社会资源并根据自己的需求而提取, 既社会资源已成为人们共享资源,没有私有制后也就没有统治阶级。 > 共产主义就是人们对社会资源整体占有形式的一种,或者是属于社会整体上分配形式的一种, 既它是一种人们共同占有社会资源、共同劳动、共同分享劳动成果的公有制形式,从而达到人民当家做主的目标。 > ### 本质 > 共产主义的本质特征就是人民能够当家做主,也就是说民主、自由是公有制社会与私有制社会的根本区别, 同时公有制社会是人类意识形态的高级阶段,私有制社会是人类意识形态的低级阶段。 > ### 实现条件 > 由于公有制社会只是一种社会财产的分配形式,因此列宁认为共产主义公有制社会可以在任何的社会形态里实现;而马克思认为在资本主义的最高阶段是过渡到共产主义社会是必然结果, 因为有强劲的社会生产力造就了丰富的物质基础后,人类的整体意识形态也将得以逐步的提高, 同时意识到 "按劳取酬" 的私有制分配形式已经是落后的社会分配形式,并成为人类社会进一步发展的障碍。 这么一看,共产主义的理想其实是挺美好的,总结一下: * 形成条件:有强劲的社会生产力造就了丰富的物质基础后,人类的整体意识形态也将得以逐步的提高。 * 本质:民主、自由的公有制社会。资源共享,人们共同占有社会资源、共同劳动、共同分享劳动成果的公有制形式,从而达到人民当家做主的目标 * 人类社会的进步: "按劳取酬" 的私有制分配形式已经是落后的社会分配形式,并成为人类社会进一步发展的障碍。 * 没有阶级制度、没有剥削、没有压迫,实现人类自我解放的社会。面对恶势力也会团结一致。 形成条件提到,首先需要的是意识形态达到一定程度的人。 那么如何加入“大同世界”呢? 想加入“大同世界”成为自治组织的人,可以通过Dapp界面(文章后面放出Dapp Demo)申请加入。 加入之后,就成为这个世界的成员了。 下面放代码: ``` //居民加入事件 event JoinGreatHarmon(uint id, string name, string identity); // 居民 struct Resident { string name; //姓名 string identity; //记录生日、性别等个人信息。类似身份证。 uint ghCoin; //大同货币。"Basic income system" 会把保障性收入放在这里。 uint32 prestige; //声望值,大同世界中,鼓励人们“达则兼济天下”。做更多的好事。将提高声望值。 uint32 joinDate; //何时加入。 uint32 readyTime; //"Basic income system" 的冷却时间。 } Resident[] public residents; //存储居民id索引 mapping (address => uint) idOf; /** * @dev 加入“大同世界”的唯一入口。 * 加入“大同世界”的操作,除要消耗支付给以太坊矿工的gas,不需要再任何费用。 * 但我知道有很多好心人,乐于奉献, 于是这里作为一个payable函数, 你可以再加入“大同世界”的时候, * 向这个理想丰满而美好的组织捐赠任意大小的ether,助它更好的成长。 * @_name 居民的显示名字 * @_identity 各种实名认证之后产生的身份唯一标识. * (目前只需传身份证号码,并且非常相信愿意加入“大同世界”的人的行为,没有做太多的认证, * 假设这项目有人看好,再做更复杂的认证) */ function joinGreatHarmon(string _name, string _identity) public payable { //检测是否重复加入。 require(idOf[msg.sender] == 0); _createResident(_name, _identity); } function _createResident(string _name, string _identity) internal { uint id = residents.push(Resident(_name, _identity, 0, 0, uint32(now + cooldownTime), uint32(now))) ; idOf[msg.sender] = id; JoinGreatHarmon(id, _name, _identity); } ``` 接下来,介绍“大同世界”的运作方式。 ## Basic Income System 按照“各取所需”这个理想目标。 我目前能实现的,是一个“Basic Income System”。即无条件提供保障性收入。 这是一个让人“不劳而获系统” 可以这么说。 这有个[Basic Income](https://www.reddit.com/r/basicincome/wiki/index)的wiki。列举了Basic Income的一大堆好处。 总结下吧: * 减少了贫困和不平等。 这世界上有62个人掌握了全球一半以上的财富,与此同时超过20亿人口,在每天不足$2生活费的生活夹缝里生存。这是否有点过于不平等和不科学了? 于是很早就有人提出Basic Income的概念,试图改变钱的工作方式。如今有了区块链的技术支撑,Basic Income的概念有机会得以实现了。 * 降低失业率。 * 减少甚至可以完全避免因贫困而产生的犯罪、盗窃等社会问题。 * 保证人的最低的生存标准。是一种人文主义。 为什么需要一个Basic Income System来实现“各取所需”呢? 我们再来看下,马克思给我们描绘的理想画面: > 当公有制社会完全的战胜了私有制社会后,国家、政府、商品经济、货币经济等会完全消失。最后,人类开始完全的进入共产主义的阶段。这个时候,社会公共机构非常发达,没有城乡差异,人与人待遇差异和社会分工会完全消失,人人都能得到开放式的教育与医疗、交通运输工具,人们不再像私有制社会那样每天工作8小时,每周工作五天,在『各尽所能各取所需』的社会里,有开放式的社会资源的保障下,人们不再追求物质生活,探索世界成为人们的第一需求。科技非常发达,人民就能够以低工作量去满足优质的生活所需,所有的财产归全体人民所有,生活资料各取所需,人民的工作产出和生活消耗都被记录,作为社会生产和社会规划的依据,对社会有更多贡献的人将得到更多更好的社会资源和社会福利,人们从一出生就平等地享受社会的公共福利,人们可以充分的利用社会资源来探索宇宙的奥秘、生命的奥秘。人不会被分工所局限着,达到“各尽所能,各取所需”的阶段。在共产主义社会里,任何人都可以有自己的的活动范围,而且根据自身发展的特点可以在任何部门工作,社会公共机构调节着整个生产,能力强的人可以自愿的参与更复杂的工作, 人们以个体愿意为主的时候同时也会根据社会的需要去参与社会协调的功能,『因而使我有可能随自己的兴趣今天干这事,明天干那事,上午打猎,下午捕鱼,傍晚从事畜牧,晚饭后从事批判,这样就不会使我老是一个猎人、渔夫、牧人或批判者』— 卡尔马克思。 在不受劳动力压榨、人们可以随心的去做内心真正喜欢的、感兴趣的事的时候,更能够创造价值。 于是“各取所需” 是为了让人们能够“各尽其能”。 **在『各尽所能各取所需』的社会里,有开放式的社会资源的保障下,人们不再追求物质生活,探索世界成为人们的第一需求。** 好了接下来是代码: ``` //领取Basic income的冷却时间, 暂且设定为1天。 uint cooldownTime = 1 days; //basicIncome发放限制 uint basicIncomeLimit = 10000; //日常发放 uint dailySupply = 50; //累计发放 uint totalSupply = 0; /** * @dev 分发基本收入 */ function getBasicIncome() public { Resident storage _resident = residents[idOf[msg.sender]-1]; require(_isReady(_resident)); require(_isUnderLimit(_resident)); _resident.ghCoin = _resident.ghCoin.add(dailySupply); totalSupply = totalSupply.add(dailySupply); _triggerCooldown(_resident); } function _triggerCooldown(Resident storage _resident) internal { _resident.readyTime = uint32(now + cooldownTime); } /** * @dev BasicIncome 设定为每日领取一次。 领取之后,进入一天的冷却时间。 * 这里检测是否在冷却周期内。 */ function _isReady(Resident storage _resident) internal view returns (bool) { return (_resident.readyTime <= now); } /** * @dev 分发基本收入之前,需检测是否符合发放规则。 * 大同世界崇尚“按需索取”,贪婪获取是不应该的。 * 此函数检测居民的当前ghCoin,如果大于系统设定的basicIncomeLimit, * 则不能再获取basicIncome。 */ function _isUnderLimit(Resident storage _resident) internal view returns (bool) { return (_resident.ghCoin <= basicIncomeLimit); } ``` 这段智能合约代码,将这么执行: 1. 每人每天可以领取一定数量的GreatHarmon Coin (简称GHC),具体数量依据系统环境会有浮动。但价值 理想上要约等于一日三餐一杯咖啡。 2. GHC作为“大同世界”里的价值交换媒介。可以在有“大同世界”共识的人群中流通。 3. 每日领取过后,24小时内不可再领取。 4. 领取是一个主动行为。不领取,视为“无需”,不会自动发放。也即“按需获取”。 5. 区块链会详尽记录下所有生成和消耗的记录。 6. 账户上持有GHC数量达到一定数量后,在消耗掉之前。将不能再继续领取。(鼓励按需领取,但防止过度索取) 7. 因违规被冻结或拉黑的人不能够领取。 8. **最重要的一点:** 和当前世界上所有的区块链应用的代币不一样,它们都是一开始就生成几千万甚至几亿个代币,并把百分之90以上数量的代币掌握在少数人手里。 大同世界的Great Harmon Coin不一样,反其道而行,一开始的数量为零。总体发行量,是在每一次有人领取Basic Income的时候一点点增加的。 ### 制约处理 前面摘取的百科资料提到了,"共产主义"形成条件是“人类的整体意识形态的提高”。 也就是说这应该是个属于“善人“们的世界, 正因为”人之初、性本善“,”大同世界”接纳并欢迎所有人的加入,但是当人心向恶时,比方说伤人、害人。那么“大同世界”也该有个机制来抑制这种行为,比如冻结账户、加入黑名单、甚至驱逐出“大同世界”,所以违背“大同世界”的规则,代价就是,无法再享受到“大同世界”的福利了。 下面是实现代码: ``` mapping (address => bool) public frozenAccount; /* This generates a public event on the blockchain that will notify clients */ event FrozenAccount(address target, bool frozen); /// @notice `freeze? Prevent | Allow` `target` from get Basic Income /// @param target Address to be frozen /// @param freeze either to freeze it or not function freezeAccount(address target, bool freeze) external onlyOwner { frozenAccount[target] = freeze; FrozenAccount(target, freeze); } ``` ### 让GHC可流通 如何让GHC拥有货币属性?毕竟我们想要用它来兑换牛奶、面包和咖啡。 这点只要实现ERC20标准接口即可。 ``` // Public variables of the token string public name ="Great Harmon Coin" ; string public symbol = "GHC"; uint8 public decimals = 18; // This creates an array with all balances mapping (address => uint256) public balanceOf; mapping (address => mapping (address => uint256)) public allowance; // This generates a public event on the blockchain that will notify clients event Transfer(address indexed from, address indexed to, uint256 value); /** * Internal transfer, only can be called by this contract */ function _transfer(address _from, address _to, uint _value) internal { // Prevent transfer to 0x0 address. Use burn() instead require(_to != 0x0); // Check if the sender has enough require(balanceOf[_from] >= _value); // Check for overflows require(balanceOf[_to] + _value > balanceOf[_to]); // Save this for an assertion in the future uint previousBalances = balanceOf[_from] + balanceOf[_to]; // Subtract from the sender balanceOf[_from] -= _value; // Add the same to the recipient balanceOf[_to] += _value; Transfer(_from, _to, _value); // Asserts are used to use static analysis to find bugs in your code. They should never fail assert(balanceOf[_from] + balanceOf[_to] == previousBalances); } /** * Transfer tokens * * Send `_value` tokens to `_to` from your account * * @param _to The address of the recipient * @param _value the amount to send */ function transfer(address _to, uint256 _value) public { _transfer(msg.sender, _to, _value); } /** * Transfer tokens from other address * * Send `_value` tokens to `_to` in behalf of `_from` * * @param _from The address of the sender * @param _to The address of the recipient * @param _value the amount to send */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { require(_value <= allowance[_from][msg.sender]); // Check allowance allowance[_from][msg.sender] -= _value; _transfer(_from, _to, _value); return true; } /** * Set allowance for other address * * Allows `_spender` to spend no more than `_value` tokens in your behalf * * @param _spender The address authorized to spend * @param _value the max amount they can spend */ function approve(address _spender, uint256 _value) public returns (bool success) { allowance[msg.sender][_spender] = _value; return true; } ``` ### 让“大同世界”可持续发展 作为一个“分布式、去中心化、自治组织”,它的发展,前期很大部分要依赖于社区的捐赠和贡献。 于是“大同世界”的智能合约还需提供一个捐赠入口。 当然,还需要记录捐赠名单。哪怕只有一分,区块链也会永远记录下每一笔捐赠。 ``` mapping (address => uint) donateMap; event Donate(address sender, uint amount); // accept ether donate function donate() payable public { if (msg.value > 0) { donateMap[msg.sender] += msg.value; Donate(msg.sender, msg.value); } } ``` ### 一些未完成的idea * 或许需要委员会、理事会等虚拟组织。来进行某些重要的决策。 * 需要所谓的“声望系统”。用来表示“贡献度”以及鼓励成员多进行爱的奉献。“己之所欲,亦施于人”。在这世界上“得到”固然是件快乐的是,而“给予”有时是一件更幸福的事。 * 作为以太坊的智能合约,天生是可以和其他合约通过“Interface”进行交互的。于是又为“大同世界”提供了无限可能性。 我现在在这里实现的,只是一个基本版的“Basic Income”系统,未来集成了更多更多承载着“共产主义思维”的其他智能合约,那么就形成了一个真正的“大同世界了”。 ## 新共产主义 马克思、恩格斯提出的思想。毕竟是一百多年前了。他们的思想环境里,没有当今世界的各种因素。于是我们基于当今的现实和可幻想的未来100年,来重新勾勒一幅“新共产主义画面”。 > * 那时的人类社会科技十分发达。智能机器十分成熟,完全代替了大部分人类的劳动性工作。由智能机器管理的农业轻松的亩产万斤,轻轻松松的养活了整个地球人。 > > * 生物工程、基因工程也到了难以想象的地步,各种食品直接用元素合成,不管什么肉、什么蛋白质和维生素,它的化学元素结构均已被科学家破解,可以利用最基本的元素单位来逆向合成。 于是出现了食物合成工厂,同样由智能机器管理,每天向全人类输送充足的蛋白质食物。人类不再饲养宰杀禽畜,因为合成的食品更加卫生和安全。为了不使得被解放的禽畜数量暴涨,人类开始对禽畜实行计划生育。 > > * 建筑领域,机器人驾驶着巨型3D打印机在空地上不停的创造着结构复杂、设计精妙的建筑物。 城市的理论人口容量增加百倍。人类不再有什么住房需求,因为无论到哪儿,总能找到舒适的居住场所。建一座摩天大楼对智能机器来说和复制黏贴一样容易。 > > * 普通人不会再想去找份工作赚钱(是否还有“钱”这东西还不好说),因为普通的劳动已经创造不了什么价值,智能机器的产出效率是人的几万倍。 > > * 未来的各种组织形态会不断地演化,去中心化,分布式,强化合作,适应变化,直到彻底地被网络化。 > > * 国家、政府、商品经济、货币经济等会完全消失。最后,人类开始完全的进入共产主义的阶段。这个时候,社会公共机构非常发达,没有城乡差异,人与人待遇差异和社会分工会完全消失,人人都能得到开放式的教育与医疗、交通运输工具,人们不再像私有制社会那样每天工作8小时。(这段是马克思的) > > * 任何事物都可以被拆解,任何事物都可以被重组。任何可被测量之物都会被量测,任何可被跟踪之物一定会被跟踪,任何能够被分享的事物一定会被分享。我们需相信那些不可能之事。(凯文凯利) > > * 为了维持世界稳定,提高人类的精神文明。 > 人类用区块链8.0技术, 建立了一个高级版的“Global Basic Income System”, 从人出生那刻起,就享有整个世界的开放式的教育与医疗福利。人类探索科学、探索世界,各种文学、艺术进入了前所未有的繁华。后来开始探索宇宙.. 再后面就是《三体》的剧情了。。。 > >* 无论是人工智能、还是区块链、还是生物基因工程工程、脑工程、都处以一个渐进发展的状态。跟30年后的我们相比,现在的我们就是一无所知。世界上最伟大的东西,现在还没有被发明出来。一切皆有可能。 >* 说一句梦话吧,世界统一就靠区块链了。 ## 结语 回想中国改革开放初期,口号之一就是“让一部分人先富起来”。 在构建共产主义的梦想上,我们依然也可以“让一部分人先共产主义起来”。 只要具备了一定数量有共识的人,那实现了共产主义的“大同世界”就成立了,一个没有贫困和饥饿的社会就出现了。 话不多说,我已经把代码实现了,部署在了以太坊上。只需访问Dapp便可入驻,随后每天都可以上来领取Basic Income噢。至于领取的GHC什么时候能流通,什么时候能换披萨,就要看你能不能找到和你一样有“大同世界共识”的人了。期待未来有更多人加入到“大同世界”里来。 文章一开头,就说了这是个梦。不相信的可以当作是梦话看看。我只是跟大家分享分享区块链能做什么。 **当下大家都喊着“区块链改变世界”、“区块链塑造未来”,但到现在大抵是炒币圈钱割韭菜的,以及做着一夜爆富的梦,有多少人正在为了区块链改变世界而努力么?** 我们用一则古代名篇来结尾。 > 大道之行也,天下为公,选贤与能,讲信修睦。故人不独亲其亲,不独子其子,使老有所终,壮有所用,幼有所长,矜、寡、孤、独、废疾者皆有所养,男有分,女有归。货恶其弃于地也,不必藏于己;力恶其不出于身也,不必为己。是故谋闭而不兴,盗窃乱贼而不作,故外户而不闭,是谓大同。 以及 > “这不是神经病,这是理想 ” --紫霞仙子 --- --- ### 链接 * Dapp访问地址: ``` https://geteway.ipfs.io/ipfs/QmSV8ShPEAhru1HsNbFu2TcW1DMQA23spexxU7bzwX36WS https://ipfs.io/ipfs/QmSV8ShPEAhru1HsNbFu2TcW1DMQA23spexxU7bzwX36WS ``` 如果翻不了墙访问不了ipfs的朋友,可以访问:http://54.255.218.51/ 这是一台AWS云主机。国内访问速度比较慢哦。 * 智能合约地址:https://etherscan.io/address/0x723437FAdE99e15A33a0355189e0a00eCE23A7D6 * Great Harmon Coin (GHC)地址: https://etherscan.io/token/0x723437FAdE99e15A33a0355189e0a00eCE23A7D6 * 代码:代码包括了智能合约代码和Dapp项目代码。有兴趣的话。点赞评论留邮箱哈。 * **注意事项**: * 请用chrome浏览器安装MetaMask, 并连接到主网. 其他类型浏览器暂不支持访问以太坊区块链的数据。  * 无论是加入“大同世界”,还是领取”Basic Income“的操作, 都是对区块链的写入操作,需要支付gas给以太坊矿工,俗称手续费。 * 加入“大同世界”、获取“Basci Income”,"捐款", 都是区块链的写入操作,执行操作后,不会马上响应,要等待矿工确认,所以Dapp在实时反馈上的交互设计上不好做。有Dapp开发者的话,可以交流下怎么处理的。 * 可以直接上etherscan.io 查看操作的进度: https://etherscan.io/address/0x723437FAdE99e15A33a0355189e0a00eCE23A7D6 * 如果使用MetaMask上有什么问题,请参考下加密猫的FAQ: https://www.cryptokitties.co/faq       |
| json metadata | {"tags":["blockchain","cn","dapp","etherum"],"image":["https://steemitimages.com/DQmbg9PEu7TSX3E4ZeDXo9AuQU2Vm21nduHEV7h8hPDnN7n/main-network.png","https://steemitimages.com/DQmVZzevTQY59iEN4D4exrHNGk2FCkDqTyZqtm8x9XELVnp/15216866083066.jpg","https://steemitimages.com/DQmcMY1cXcJD3dZap8jCgfboKycqo8JzhET53YSbanAwBcG/15216866534739.jpg","https://steemitimages.com/DQmT2awqAVFrVTqzAHqFpXrrVf68wNL7cd2PUdoQE5VZJcW/15216865467430.jpg","https://steemitimages.com/DQmauaQ2MtaweeYj7sSqe1WHDakkKrghGpZtjUQBfWR5noy/15216867113279.jpg","https://steemitimages.com/DQmWpwNPbECvngsaiKt2AS9kHpd36B8jadPVioFq5EgTQiL/15216867582903.jpg","https://steemitimages.com/DQmdnthWJJhTLnj1ZKQVKMK5JDhzRWU5SMuagyDcqfUkqvR/15216867757265.jpg"],"links":["https://www.ethereum.org/dao#the-shareholder-association","https://www.reddit.com/r/basicincome/wiki/index","http://54.255.218.51/","https://etherscan.io/address/0x723437FAdE99e15A33a0355189e0a00eCE23A7D6","https://etherscan.io/token/0x723437FAdE99e15A33a0355189e0a00eCE23A7D6","https://www.cryptokitties.co/faq"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | blockchain |
| permlink | 49navv |
| title | 用区块链实现共产主义 |
| Transaction Info | Block #20892623/Trx 38b75ef7078fdc5a1620acfd422e17c99e4b2c39 |
View Raw JSON Data
{
"block": 20892623,
"op": [
"comment",
{
"author": "jc1991",
"body": "# 用区块链实现共产主义\n\n也许是最近放太多精力在区块链技术上了。以至于做梦时都在区块链, 我梦见了未来有人用区块链技术,实现了共产主义,实现了大同社会。在这个世界上,开启了一个有秩序的理想世界。\n\n接下来,让我来解解梦。我将一步步的说明,怎么用区块链技术,来构建一个理想世界。\n\n提到区块链,就不得不说说“去中心化”和“自治组织”。这是区块链技术带给我们的礼物。\n这和 “共产主义” 里的 “公有制、自由、平等” 是很融洽的。\n\n以现在的以太坊平台为例,我们可以在上面用一份智能合约,创建出一个“去中心化的自治组织”。\n\n技术上的实现可以参考以太坊的文档: [How to build a Decentralized Autonomous Organization](https://www.ethereum.org/dao#the-shareholder-association)\n\n我先放出我的代码框架:\n\n```\npragma solidity ^0.4.19;\n\n/**\n * An ideal or perfect society\n */\ncontract GreatHarmon {\n\n /* Initializes contract */\n function GreatHarmon() public {\n }\n \n}\n\n```\n当然,还有很多代码,我会慢慢放出来,并解释。\n\n现在假设我已经创建好了这份智能合约,并且部署到区块链上了。一个智能合约一旦创建,就有了使命和意义,它已经开启了一个世界,并敞开大门,等待着它的居民来入驻。\n在这里我们约定下,从现在开始称这个“合约”为“大同世界” 吧。\n\n大同世界里有它自己的游戏规则,这些规则如何制定呢?\n我们要先来看下“伟大的共产主义”的理想是什么。然后按照”共产主义“的理想来构建这些规则。\n\n从小就唱着 “我们是共产主义接班人” 的歌, 但很多人其实并不很清楚什么是“共产主义”,以为它只不过是一个口号。\n\n我摘取一些百科资料,让大家有个共识:\n\n\n\n> 共产主义(Communism)是一种政治观点和思想体系,现今的共产主义奉马克思、恩格斯思想为基本思想。共产主义主张消灭生产资料私有制,并建立一个没有阶级制度、没有剥削、没有压迫,实现人类自我解放的社会,也是社会化集体大生产的社会,面对恶势力也会团结一致。共产主义者认为未来所有阶级社会最终将过渡到各尽所能 各取所需的共产主义社会,人类社会的意识形态将进入高级阶段。\n> ### 概念\n> 马克思充分研究了人类的历史、经济和科技的发展,发现人类社会是以物质生产为基础的,现有生产力所决定的分工造成的不同人的经济地位,决定了不同人的社会地位,人们之间的经济关系决定了整个社会的形态,法律、道德等上层建筑只是由经济地位占统治地位的群体而决定的。\n简易地说,人类社会是一个群体的社会,在群体社会的管理过程中人们对社会资源占有( 或社会分配 )的方式,,大概可以分成三种形式:\n『两极分化』即一小撮人占有社会的绝大部分资源,也就是人们的贫富差距很大,占有绝大部分社会资源的一小撮人就是统治阶级;\n『相对平等』即整个社会的人们贫富差距不大,仍旧是私有制社会,人们各自的财产被限制在社会相对均匀的数量里, 控制社会财富分配的是统治阶级;\n『按需所取』即人们共同占有社会资源并根据自己的需求而提取, 既社会资源已成为人们共享资源,没有私有制后也就没有统治阶级。\n\n> 共产主义就是人们对社会资源整体占有形式的一种,或者是属于社会整体上分配形式的一种, 既它是一种人们共同占有社会资源、共同劳动、共同分享劳动成果的公有制形式,从而达到人民当家做主的目标。\n> ### 本质\n> 共产主义的本质特征就是人民能够当家做主,也就是说民主、自由是公有制社会与私有制社会的根本区别, 同时公有制社会是人类意识形态的高级阶段,私有制社会是人类意识形态的低级阶段。\n> ### 实现条件\n> 由于公有制社会只是一种社会财产的分配形式,因此列宁认为共产主义公有制社会可以在任何的社会形态里实现;而马克思认为在资本主义的最高阶段是过渡到共产主义社会是必然结果, 因为有强劲的社会生产力造就了丰富的物质基础后,人类的整体意识形态也将得以逐步的提高, 同时意识到 \"按劳取酬\" 的私有制分配形式已经是落后的社会分配形式,并成为人类社会进一步发展的障碍。\n\n\n这么一看,共产主义的理想其实是挺美好的,总结一下:\n\n* 形成条件:有强劲的社会生产力造就了丰富的物质基础后,人类的整体意识形态也将得以逐步的提高。\n\n* 本质:民主、自由的公有制社会。资源共享,人们共同占有社会资源、共同劳动、共同分享劳动成果的公有制形式,从而达到人民当家做主的目标\n\n* 人类社会的进步: \"按劳取酬\" 的私有制分配形式已经是落后的社会分配形式,并成为人类社会进一步发展的障碍。\n* 没有阶级制度、没有剥削、没有压迫,实现人类自我解放的社会。面对恶势力也会团结一致。\n\n形成条件提到,首先需要的是意识形态达到一定程度的人。\n\n\n\n那么如何加入“大同世界”呢?\n\n想加入“大同世界”成为自治组织的人,可以通过Dapp界面(文章后面放出Dapp Demo)申请加入。\n加入之后,就成为这个世界的成员了。\n\n下面放代码:\n\n```\n //居民加入事件\n event JoinGreatHarmon(uint id, string name, string identity);\n\n // 居民\n struct Resident {\n string name; //姓名\n string identity; //记录生日、性别等个人信息。类似身份证。\n uint ghCoin; //大同货币。\"Basic income system\" 会把保障性收入放在这里。\n uint32 prestige; //声望值,大同世界中,鼓励人们“达则兼济天下”。做更多的好事。将提高声望值。\n uint32 joinDate; //何时加入。\n uint32 readyTime; //\"Basic income system\" 的冷却时间。\n }\n\n Resident[] public residents;\n //存储居民id索引\n mapping (address => uint) idOf;\n\n /**\n * @dev 加入“大同世界”的唯一入口。\n * 加入“大同世界”的操作,除要消耗支付给以太坊矿工的gas,不需要再任何费用。\n * 但我知道有很多好心人,乐于奉献, 于是这里作为一个payable函数, 你可以再加入“大同世界”的时候,\n * 向这个理想丰满而美好的组织捐赠任意大小的ether,助它更好的成长。\n * @_name 居民的显示名字\n * @_identity 各种实名认证之后产生的身份唯一标识.\n * (目前只需传身份证号码,并且非常相信愿意加入“大同世界”的人的行为,没有做太多的认证,\n * 假设这项目有人看好,再做更复杂的认证)\n */\n function joinGreatHarmon(string _name, string _identity) public payable {\n //检测是否重复加入。\n require(idOf[msg.sender] == 0);\n _createResident(_name, _identity);\n }\n\n function _createResident(string _name, string _identity) internal {\n uint id = residents.push(Resident(_name, _identity, 0, 0, uint32(now + cooldownTime), uint32(now))) ;\n idOf[msg.sender] = id;\n JoinGreatHarmon(id, _name, _identity);\n }\n\n\n```\n\n\n接下来,介绍“大同世界”的运作方式。\n\n## Basic Income System\n\n按照“各取所需”这个理想目标。\n我目前能实现的,是一个“Basic Income System”。即无条件提供保障性收入。 这是一个让人“不劳而获系统” 可以这么说。\n\n这有个[Basic Income](https://www.reddit.com/r/basicincome/wiki/index)的wiki。列举了Basic Income的一大堆好处。\n\n总结下吧:\n\n* 减少了贫困和不平等。\n\n这世界上有62个人掌握了全球一半以上的财富,与此同时超过20亿人口,在每天不足$2生活费的生活夹缝里生存。这是否有点过于不平等和不科学了? 于是很早就有人提出Basic Income的概念,试图改变钱的工作方式。如今有了区块链的技术支撑,Basic Income的概念有机会得以实现了。\n\n* 降低失业率。\n \n* 减少甚至可以完全避免因贫困而产生的犯罪、盗窃等社会问题。\n\n* 保证人的最低的生存标准。是一种人文主义。\n\n为什么需要一个Basic Income System来实现“各取所需”呢?\n\n我们再来看下,马克思给我们描绘的理想画面:\n\n> 当公有制社会完全的战胜了私有制社会后,国家、政府、商品经济、货币经济等会完全消失。最后,人类开始完全的进入共产主义的阶段。这个时候,社会公共机构非常发达,没有城乡差异,人与人待遇差异和社会分工会完全消失,人人都能得到开放式的教育与医疗、交通运输工具,人们不再像私有制社会那样每天工作8小时,每周工作五天,在『各尽所能各取所需』的社会里,有开放式的社会资源的保障下,人们不再追求物质生活,探索世界成为人们的第一需求。科技非常发达,人民就能够以低工作量去满足优质的生活所需,所有的财产归全体人民所有,生活资料各取所需,人民的工作产出和生活消耗都被记录,作为社会生产和社会规划的依据,对社会有更多贡献的人将得到更多更好的社会资源和社会福利,人们从一出生就平等地享受社会的公共福利,人们可以充分的利用社会资源来探索宇宙的奥秘、生命的奥秘。人不会被分工所局限着,达到“各尽所能,各取所需”的阶段。在共产主义社会里,任何人都可以有自己的的活动范围,而且根据自身发展的特点可以在任何部门工作,社会公共机构调节着整个生产,能力强的人可以自愿的参与更复杂的工作, 人们以个体愿意为主的时候同时也会根据社会的需要去参与社会协调的功能,『因而使我有可能随自己的兴趣今天干这事,明天干那事,上午打猎,下午捕鱼,傍晚从事畜牧,晚饭后从事批判,这样就不会使我老是一个猎人、渔夫、牧人或批判者』— 卡尔马克思。\n\n\n在不受劳动力压榨、人们可以随心的去做内心真正喜欢的、感兴趣的事的时候,更能够创造价值。 于是“各取所需” 是为了让人们能够“各尽其能”。 \n\n**在『各尽所能各取所需』的社会里,有开放式的社会资源的保障下,人们不再追求物质生活,探索世界成为人们的第一需求。**\n\n好了接下来是代码:\n\n```\n //领取Basic income的冷却时间, 暂且设定为1天。\n uint cooldownTime = 1 days;\n\n //basicIncome发放限制\n uint basicIncomeLimit = 10000;\n\n //日常发放\n uint dailySupply = 50;\n\n //累计发放\n uint totalSupply = 0;\n\n /**\n * @dev 分发基本收入\n */\n function getBasicIncome() public {\n Resident storage _resident = residents[idOf[msg.sender]-1];\n require(_isReady(_resident));\n require(_isUnderLimit(_resident));\n \n _resident.ghCoin = _resident.ghCoin.add(dailySupply);\n totalSupply = totalSupply.add(dailySupply);\n\n _triggerCooldown(_resident);\n }\n\n function _triggerCooldown(Resident storage _resident) internal {\n _resident.readyTime = uint32(now + cooldownTime);\n }\n\n /**\n * @dev BasicIncome 设定为每日领取一次。 领取之后,进入一天的冷却时间。\n * 这里检测是否在冷却周期内。\n */\n function _isReady(Resident storage _resident) internal view returns (bool) {\n return (_resident.readyTime <= now);\n }\n\n /**\n * @dev 分发基本收入之前,需检测是否符合发放规则。\n * 大同世界崇尚“按需索取”,贪婪获取是不应该的。\n * 此函数检测居民的当前ghCoin,如果大于系统设定的basicIncomeLimit,\n * 则不能再获取basicIncome。\n */\n function _isUnderLimit(Resident storage _resident) internal view returns (bool) {\n return (_resident.ghCoin <= basicIncomeLimit);\n }\n\n```\n\n这段智能合约代码,将这么执行:\n\n1. 每人每天可以领取一定数量的GreatHarmon Coin (简称GHC),具体数量依据系统环境会有浮动。但价值 理想上要约等于一日三餐一杯咖啡。\n2. GHC作为“大同世界”里的价值交换媒介。可以在有“大同世界”共识的人群中流通。\n3. 每日领取过后,24小时内不可再领取。\n4. 领取是一个主动行为。不领取,视为“无需”,不会自动发放。也即“按需获取”。\n5. 区块链会详尽记录下所有生成和消耗的记录。\n6. 账户上持有GHC数量达到一定数量后,在消耗掉之前。将不能再继续领取。(鼓励按需领取,但防止过度索取)\n7. 因违规被冻结或拉黑的人不能够领取。\n8. **最重要的一点:** 和当前世界上所有的区块链应用的代币不一样,它们都是一开始就生成几千万甚至几亿个代币,并把百分之90以上数量的代币掌握在少数人手里。 大同世界的Great Harmon Coin不一样,反其道而行,一开始的数量为零。总体发行量,是在每一次有人领取Basic Income的时候一点点增加的。\n\n\n### 制约处理\n\n前面摘取的百科资料提到了,\"共产主义\"形成条件是“人类的整体意识形态的提高”。\n\n也就是说这应该是个属于“善人“们的世界, 正因为”人之初、性本善“,”大同世界”接纳并欢迎所有人的加入,但是当人心向恶时,比方说伤人、害人。那么“大同世界”也该有个机制来抑制这种行为,比如冻结账户、加入黑名单、甚至驱逐出“大同世界”,所以违背“大同世界”的规则,代价就是,无法再享受到“大同世界”的福利了。\n\n下面是实现代码:\n\n```\n mapping (address => bool) public frozenAccount;\n /* This generates a public event on the blockchain that will notify clients */\n event FrozenAccount(address target, bool frozen);\n\n /// @notice `freeze? Prevent | Allow` `target` from get Basic Income\n /// @param target Address to be frozen\n /// @param freeze either to freeze it or not\n function freezeAccount(address target, bool freeze) external onlyOwner {\n frozenAccount[target] = freeze;\n FrozenAccount(target, freeze);\n }\n\n```\n\n\n\n### 让GHC可流通\n如何让GHC拥有货币属性?毕竟我们想要用它来兑换牛奶、面包和咖啡。\n\n这点只要实现ERC20标准接口即可。\n\n```\n// Public variables of the token\n string public name =\"Great Harmon Coin\" ;\n string public symbol = \"GHC\";\n uint8 public decimals = 18;\n\n // This creates an array with all balances\n mapping (address => uint256) public balanceOf;\n mapping (address => mapping (address => uint256)) public allowance;\n\n // This generates a public event on the blockchain that will notify clients\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * Internal transfer, only can be called by this contract\n */\n function _transfer(address _from, address _to, uint _value) internal {\n // Prevent transfer to 0x0 address. Use burn() instead\n require(_to != 0x0);\n // Check if the sender has enough\n require(balanceOf[_from] >= _value);\n // Check for overflows\n require(balanceOf[_to] + _value > balanceOf[_to]);\n // Save this for an assertion in the future\n uint previousBalances = balanceOf[_from] + balanceOf[_to];\n // Subtract from the sender\n balanceOf[_from] -= _value;\n // Add the same to the recipient\n balanceOf[_to] += _value;\n Transfer(_from, _to, _value);\n // Asserts are used to use static analysis to find bugs in your code. They should never fail\n assert(balanceOf[_from] + balanceOf[_to] == previousBalances);\n }\n\n /**\n * Transfer tokens\n *\n * Send `_value` tokens to `_to` from your account\n *\n * @param _to The address of the recipient\n * @param _value the amount to send\n */\n function transfer(address _to, uint256 _value) public {\n _transfer(msg.sender, _to, _value);\n }\n\n /**\n * Transfer tokens from other address\n *\n * Send `_value` tokens to `_to` in behalf of `_from`\n *\n * @param _from The address of the sender\n * @param _to The address of the recipient\n * @param _value the amount to send\n */\n function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {\n require(_value <= allowance[_from][msg.sender]); // Check allowance\n allowance[_from][msg.sender] -= _value;\n _transfer(_from, _to, _value);\n return true;\n }\n\n /**\n * Set allowance for other address\n *\n * Allows `_spender` to spend no more than `_value` tokens in your behalf\n *\n * @param _spender The address authorized to spend\n * @param _value the max amount they can spend\n */\n function approve(address _spender, uint256 _value) public returns (bool success) {\n allowance[msg.sender][_spender] = _value;\n return true;\n }\n\n```\n\n### 让“大同世界”可持续发展\n作为一个“分布式、去中心化、自治组织”,它的发展,前期很大部分要依赖于社区的捐赠和贡献。\n\n于是“大同世界”的智能合约还需提供一个捐赠入口。\n\n当然,还需要记录捐赠名单。哪怕只有一分,区块链也会永远记录下每一笔捐赠。\n\n```\n mapping (address => uint) donateMap;\n\n event Donate(address sender, uint amount);\n\n // accept ether donate\n function donate() payable public {\n if (msg.value > 0) {\n donateMap[msg.sender] += msg.value;\n Donate(msg.sender, msg.value);\n }\n }\n```\n\n### 一些未完成的idea\n\n* 或许需要委员会、理事会等虚拟组织。来进行某些重要的决策。\n\n* 需要所谓的“声望系统”。用来表示“贡献度”以及鼓励成员多进行爱的奉献。“己之所欲,亦施于人”。在这世界上“得到”固然是件快乐的是,而“给予”有时是一件更幸福的事。\n\n* 作为以太坊的智能合约,天生是可以和其他合约通过“Interface”进行交互的。于是又为“大同世界”提供了无限可能性。\n\n\n\n我现在在这里实现的,只是一个基本版的“Basic Income”系统,未来集成了更多更多承载着“共产主义思维”的其他智能合约,那么就形成了一个真正的“大同世界了”。\n\n## 新共产主义\n马克思、恩格斯提出的思想。毕竟是一百多年前了。他们的思想环境里,没有当今世界的各种因素。于是我们基于当今的现实和可幻想的未来100年,来重新勾勒一幅“新共产主义画面”。\n\n\n> * 那时的人类社会科技十分发达。智能机器十分成熟,完全代替了大部分人类的劳动性工作。由智能机器管理的农业轻松的亩产万斤,轻轻松松的养活了整个地球人。\n> \n> * 生物工程、基因工程也到了难以想象的地步,各种食品直接用元素合成,不管什么肉、什么蛋白质和维生素,它的化学元素结构均已被科学家破解,可以利用最基本的元素单位来逆向合成。 于是出现了食物合成工厂,同样由智能机器管理,每天向全人类输送充足的蛋白质食物。人类不再饲养宰杀禽畜,因为合成的食品更加卫生和安全。为了不使得被解放的禽畜数量暴涨,人类开始对禽畜实行计划生育。\n>\n> * 建筑领域,机器人驾驶着巨型3D打印机在空地上不停的创造着结构复杂、设计精妙的建筑物。 城市的理论人口容量增加百倍。人类不再有什么住房需求,因为无论到哪儿,总能找到舒适的居住场所。建一座摩天大楼对智能机器来说和复制黏贴一样容易。\n> \n> * 普通人不会再想去找份工作赚钱(是否还有“钱”这东西还不好说),因为普通的劳动已经创造不了什么价值,智能机器的产出效率是人的几万倍。\n> \n> * 未来的各种组织形态会不断地演化,去中心化,分布式,强化合作,适应变化,直到彻底地被网络化。\n> \n> * 国家、政府、商品经济、货币经济等会完全消失。最后,人类开始完全的进入共产主义的阶段。这个时候,社会公共机构非常发达,没有城乡差异,人与人待遇差异和社会分工会完全消失,人人都能得到开放式的教育与医疗、交通运输工具,人们不再像私有制社会那样每天工作8小时。(这段是马克思的)\n> \n> * 任何事物都可以被拆解,任何事物都可以被重组。任何可被测量之物都会被量测,任何可被跟踪之物一定会被跟踪,任何能够被分享的事物一定会被分享。我们需相信那些不可能之事。(凯文凯利)\n> \n> * 为了维持世界稳定,提高人类的精神文明。\n> 人类用区块链8.0技术, 建立了一个高级版的“Global Basic Income System”, 从人出生那刻起,就享有整个世界的开放式的教育与医疗福利。人类探索科学、探索世界,各种文学、艺术进入了前所未有的繁华。后来开始探索宇宙.. 再后面就是《三体》的剧情了。。。\n>\n>* 无论是人工智能、还是区块链、还是生物基因工程工程、脑工程、都处以一个渐进发展的状态。跟30年后的我们相比,现在的我们就是一无所知。世界上最伟大的东西,现在还没有被发明出来。一切皆有可能。\n>* 说一句梦话吧,世界统一就靠区块链了。\n\n\n\n\n\n## 结语\n回想中国改革开放初期,口号之一就是“让一部分人先富起来”。\n\n在构建共产主义的梦想上,我们依然也可以“让一部分人先共产主义起来”。\n\n只要具备了一定数量有共识的人,那实现了共产主义的“大同世界”就成立了,一个没有贫困和饥饿的社会就出现了。\n\n\n话不多说,我已经把代码实现了,部署在了以太坊上。只需访问Dapp便可入驻,随后每天都可以上来领取Basic Income噢。至于领取的GHC什么时候能流通,什么时候能换披萨,就要看你能不能找到和你一样有“大同世界共识”的人了。期待未来有更多人加入到“大同世界”里来。\n\n\n文章一开头,就说了这是个梦。不相信的可以当作是梦话看看。我只是跟大家分享分享区块链能做什么。\n\n**当下大家都喊着“区块链改变世界”、“区块链塑造未来”,但到现在大抵是炒币圈钱割韭菜的,以及做着一夜爆富的梦,有多少人正在为了区块链改变世界而努力么?**\n\n我们用一则古代名篇来结尾。\n\n> 大道之行也,天下为公,选贤与能,讲信修睦。故人不独亲其亲,不独子其子,使老有所终,壮有所用,幼有所长,矜、寡、孤、独、废疾者皆有所养,男有分,女有归。货恶其弃于地也,不必藏于己;力恶其不出于身也,不必为己。是故谋闭而不兴,盗窃乱贼而不作,故外户而不闭,是谓大同。\n\n以及\n\n> “这不是神经病,这是理想 ” --紫霞仙子\n\n---\n---\n\n\n\n### 链接\n\n* Dapp访问地址:\n\n\n```\nhttps://geteway.ipfs.io/ipfs/QmSV8ShPEAhru1HsNbFu2TcW1DMQA23spexxU7bzwX36WS\n\nhttps://ipfs.io/ipfs/QmSV8ShPEAhru1HsNbFu2TcW1DMQA23spexxU7bzwX36WS\n\n```\n\n \n如果翻不了墙访问不了ipfs的朋友,可以访问:http://54.255.218.51/ 这是一台AWS云主机。国内访问速度比较慢哦。 \n\n* 智能合约地址:https://etherscan.io/address/0x723437FAdE99e15A33a0355189e0a00eCE23A7D6\n* Great Harmon Coin (GHC)地址:\nhttps://etherscan.io/token/0x723437FAdE99e15A33a0355189e0a00eCE23A7D6\n* 代码:代码包括了智能合约代码和Dapp项目代码。有兴趣的话。点赞评论留邮箱哈。\n* **注意事项**:\n * 请用chrome浏览器安装MetaMask, 并连接到主网. 其他类型浏览器暂不支持访问以太坊区块链的数据。\n \n * 无论是加入“大同世界”,还是领取”Basic Income“的操作, 都是对区块链的写入操作,需要支付gas给以太坊矿工,俗称手续费。\n * 加入“大同世界”、获取“Basci Income”,\"捐款\", 都是区块链的写入操作,执行操作后,不会马上响应,要等待矿工确认,所以Dapp在实时反馈上的交互设计上不好做。有Dapp开发者的话,可以交流下怎么处理的。\n * 可以直接上etherscan.io 查看操作的进度: https://etherscan.io/address/0x723437FAdE99e15A33a0355189e0a00eCE23A7D6\n \n* 如果使用MetaMask上有什么问题,请参考下加密猫的FAQ: https://www.cryptokitties.co/faq\n\n \n\n\n\n\n\n\n\n\n\n",
"json_metadata": "{\"tags\":[\"blockchain\",\"cn\",\"dapp\",\"etherum\"],\"image\":[\"https://steemitimages.com/DQmbg9PEu7TSX3E4ZeDXo9AuQU2Vm21nduHEV7h8hPDnN7n/main-network.png\",\"https://steemitimages.com/DQmVZzevTQY59iEN4D4exrHNGk2FCkDqTyZqtm8x9XELVnp/15216866083066.jpg\",\"https://steemitimages.com/DQmcMY1cXcJD3dZap8jCgfboKycqo8JzhET53YSbanAwBcG/15216866534739.jpg\",\"https://steemitimages.com/DQmT2awqAVFrVTqzAHqFpXrrVf68wNL7cd2PUdoQE5VZJcW/15216865467430.jpg\",\"https://steemitimages.com/DQmauaQ2MtaweeYj7sSqe1WHDakkKrghGpZtjUQBfWR5noy/15216867113279.jpg\",\"https://steemitimages.com/DQmWpwNPbECvngsaiKt2AS9kHpd36B8jadPVioFq5EgTQiL/15216867582903.jpg\",\"https://steemitimages.com/DQmdnthWJJhTLnj1ZKQVKMK5JDhzRWU5SMuagyDcqfUkqvR/15216867757265.jpg\"],\"links\":[\"https://www.ethereum.org/dao#the-shareholder-association\",\"https://www.reddit.com/r/basicincome/wiki/index\",\"http://54.255.218.51/\",\"https://etherscan.io/address/0x723437FAdE99e15A33a0355189e0a00eCE23A7D6\",\"https://etherscan.io/token/0x723437FAdE99e15A33a0355189e0a00eCE23A7D6\",\"https://www.cryptokitties.co/faq\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "blockchain",
"permlink": "49navv",
"title": "用区块链实现共产主义"
}
],
"op_in_trx": 0,
"timestamp": "2018-03-22T08:10:45",
"trx_id": "38b75ef7078fdc5a1620acfd422e17c99e4b2c39",
"trx_in_block": 70,
"virtual_op": 0
}2018/03/17 17:53:48
2018/03/17 17:53:48
| delegatee | jc1991 |
| delegator | steem |
| vesting shares | 30414.499401 VESTS |
| Transaction Info | Block #20760772/Trx f693a6c7b3ccad65515ba9e56810f6a32d899248 |
View Raw JSON Data
{
"block": 20760772,
"op": [
"delegate_vesting_shares",
{
"delegatee": "jc1991",
"delegator": "steem",
"vesting_shares": "30414.499401 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-03-17T17:53:48",
"trx_id": "f693a6c7b3ccad65515ba9e56810f6a32d899248",
"trx_in_block": 31,
"virtual_op": 0
}2018/03/17 17:11:39
2018/03/17 17:11:39
| active | {"account_auths":[],"key_auths":[["STM7MesXdyFyEYUvzHJi45t8oFnXhkhoCTwEXq3RBewjUPXoR69sp",1]],"weight_threshold":1} |
| creator | steem |
| delegation | 30690.000000 VESTS |
| extensions | [] |
| fee | 0.100 STEEM |
| json metadata | {} |
| memo key | STM5TTb16kLkSikGG9qfiHYKijGBt9GVFspTJA1qiSsPRHfXvADML |
| new account name | jc1991 |
| owner | {"account_auths":[],"key_auths":[["STM5xWPzUndjtcgqKFnWbFL4NoBaLhkuPs7NdQK4vj6yvCNcgM9tc",1]],"weight_threshold":1} |
| posting | {"account_auths":[],"key_auths":[["STM8aLDmjZX4CPEXCJ4s2yscXME7TUK8Dvg9rAAVVZjMut1ki4fS1",1]],"weight_threshold":1} |
| Transaction Info | Block #20759929/Trx f2a14b0dbe4362eb7fb1c1e23070b84c69cd3638 |
View Raw JSON Data
{
"block": 20759929,
"op": [
"account_create_with_delegation",
{
"active": {
"account_auths": [],
"key_auths": [
[
"STM7MesXdyFyEYUvzHJi45t8oFnXhkhoCTwEXq3RBewjUPXoR69sp",
1
]
],
"weight_threshold": 1
},
"creator": "steem",
"delegation": "30690.000000 VESTS",
"extensions": [],
"fee": "0.100 STEEM",
"json_metadata": "{}",
"memo_key": "STM5TTb16kLkSikGG9qfiHYKijGBt9GVFspTJA1qiSsPRHfXvADML",
"new_account_name": "jc1991",
"owner": {
"account_auths": [],
"key_auths": [
[
"STM5xWPzUndjtcgqKFnWbFL4NoBaLhkuPs7NdQK4vj6yvCNcgM9tc",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [],
"key_auths": [
[
"STM8aLDmjZX4CPEXCJ4s2yscXME7TUK8Dvg9rAAVVZjMut1ki4fS1",
1
]
],
"weight_threshold": 1
}
}
],
"op_in_trx": 0,
"timestamp": "2018-03-17T17:11:39",
"trx_id": "f2a14b0dbe4362eb7fb1c1e23070b84c69cd3638",
"trx_in_block": 19,
"virtual_op": 0
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress0.00%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779068757
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779068757
},
"rc_account": {
"account": "jc1991",
"max_rc": "10164408779",
"max_rc_creation_adjustment": {
"amount": "2020748973",
"nai": "@@000000037",
"precision": 6
},
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779068757
}
}
}Account Metadata
| POSTING JSON METADATA | |
| None | |
| JSON METADATA | |
| None |
{
"posting_json_metadata": {},
"json_metadata": {}
}Auth Keys
Owner
Single Signature
Public Keys
STM5xWPzUndjtcgqKFnWbFL4NoBaLhkuPs7NdQK4vj6yvCNcgM9tc1/1
Active
Single Signature
Public Keys
STM7MesXdyFyEYUvzHJi45t8oFnXhkhoCTwEXq3RBewjUPXoR69sp1/1
Posting
Single Signature
Public Keys
STM8aLDmjZX4CPEXCJ4s2yscXME7TUK8Dvg9rAAVVZjMut1ki4fS11/1
Memo
STM5TTb16kLkSikGG9qfiHYKijGBt9GVFspTJA1qiSsPRHfXvADML
{
"owner": {
"account_auths": [],
"key_auths": [
[
"STM5xWPzUndjtcgqKFnWbFL4NoBaLhkuPs7NdQK4vj6yvCNcgM9tc",
1
]
],
"weight_threshold": 1
},
"active": {
"account_auths": [],
"key_auths": [
[
"STM7MesXdyFyEYUvzHJi45t8oFnXhkhoCTwEXq3RBewjUPXoR69sp",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [],
"key_auths": [
[
"STM8aLDmjZX4CPEXCJ4s2yscXME7TUK8Dvg9rAAVVZjMut1ki4fS1",
1
]
],
"weight_threshold": 1
},
"memo": "STM5TTb16kLkSikGG9qfiHYKijGBt9GVFspTJA1qiSsPRHfXvADML"
}Witness Votes
0 / 30
No active witness votes.
[]