VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.007USD
STEEM
0.000STEEM
SBD
0.000SBD
Effective Power
5.007SP
├── Own SP
0.125SP
└── Incoming DelegationsDeleg
+4.882SP
Detailed Balance
| STEEM | ||
| balance | 0.000STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 0.125SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 4.882SP | SP |
| Effective Power | 5.007SP | SP |
| Reward SP (pending) | 0.000SP | SP |
| SBD | ||
| sbd_balance | 0.000SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.000SBD | SBD |
{
"balance": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"reward_steem_balance": "0.000 STEEM",
"vesting_shares": "203.862807 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "7939.796999 VESTS",
"sbd_balance": "0.000 SBD",
"savings_sbd_balance": "0.000 SBD",
"reward_sbd_balance": "0.000 SBD",
"conversions": []
}Account Info
| name | redbutterfly |
| id | 931518 |
| rank | 1,023,368 |
| reputation | 146546336 |
| created | 2018-04-11T01:22:09 |
| recovery_account | steem |
| proxy | None |
| post_count | 6 |
| comment_count | 0 |
| lifetime_vote_count | 0 |
| witnesses_voted_for | 0 |
| last_post | 2018-06-10T13:59:33 |
| last_root_post | 2018-06-10T13:35:12 |
| last_vote_time | 2018-06-12T07:15:39 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.000 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 0.000 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 203.862807 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 7939.796999 VESTS |
| reward_vesting_balance | 0.000000 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 1970-01-01T00:00:00 |
| last_account_update | 2018-06-08T08:58:36 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 1970-01-01T00:00:00 |
| savings_sbd_last_interest_payment | 1970-01-01T00:00:00 |
{
"id": 931518,
"name": "redbutterfly",
"owner": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM86s5bihM9d7arvcX6kM6xbpPYBuAW4Qh2zs1wFk8rxBMCcUHFi",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM8L68gdZ31BEizGexpuwD8pKtWGUZULq4bve4Xea2kkxEP7ZadX",
1
]
]
},
"posting": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM8Y4XRsxP46imm7hPF5cUHJLvoYHPnifcHzfE56VVNakWW1MbBH",
1
]
]
},
"memo_key": "STM8JkpU157wEHaA9LVcr3EX2KyqJar88vRw1j6sZGwue6NkcHmGp",
"json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmP1rdYGBVJiAeHGspuwSiS2eidVBHcqU34Cqo87x8KrEt/175424rgwmaw4wwd6dmszg.jpg\"}}",
"posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmP1rdYGBVJiAeHGspuwSiS2eidVBHcqU34Cqo87x8KrEt/175424rgwmaw4wwd6dmszg.jpg\"}}",
"proxy": "",
"last_owner_update": "1970-01-01T00:00:00",
"last_account_update": "2018-06-08T08:58:36",
"created": "2018-04-11T01:22:09",
"mined": false,
"recovery_account": "steem",
"last_account_recovery": "1970-01-01T00:00:00",
"reset_account": "null",
"comment_count": 0,
"lifetime_vote_count": 0,
"post_count": 6,
"can_vote": true,
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779082539
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779082539
},
"voting_power": 0,
"balance": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"sbd_balance": "0.000 SBD",
"sbd_seconds": "0",
"sbd_seconds_last_update": "1970-01-01T00:00:00",
"sbd_last_interest_payment": "1970-01-01T00:00:00",
"savings_sbd_balance": "0.000 SBD",
"savings_sbd_seconds": "0",
"savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
"savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
"savings_withdraw_requests": 0,
"reward_sbd_balance": "0.000 SBD",
"reward_steem_balance": "0.000 STEEM",
"reward_vesting_balance": "0.000000 VESTS",
"reward_vesting_steem": "0.000 STEEM",
"vesting_shares": "203.862807 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "7939.796999 VESTS",
"vesting_withdraw_rate": "0.000000 VESTS",
"next_vesting_withdrawal": "1969-12-31T23:59:59",
"withdrawn": 0,
"to_withdraw": 0,
"withdraw_routes": 0,
"curation_rewards": 0,
"posting_rewards": 0,
"proxied_vsf_votes": [
0,
0,
0,
0
],
"witnesses_voted_for": 0,
"last_post": "2018-06-10T13:59:33",
"last_root_post": "2018-06-10T13:35:12",
"last_vote_time": "2018-06-12T07:15:39",
"post_bandwidth": 0,
"pending_claimed_accounts": 0,
"vesting_balance": "0.000 STEEM",
"reputation": 146546336,
"transfer_history": [],
"market_history": [],
"post_history": [],
"vote_history": [],
"other_history": [],
"witness_votes": [],
"tags_usage": [],
"guest_bloggers": [],
"rank": 1023368
}Withdraw Routes
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
steemdelegated 4.882 SP to @redbutterfly2026/05/18 05:35:39
steemdelegated 4.882 SP to @redbutterfly
2026/05/18 05:35:39
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 7939.796999 VESTS |
| Transaction Info | Block #106149828/Trx 081ddc4d7cce2414104c164f0321bde3316634d8 |
View Raw JSON Data
{
"block": 106149828,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "7939.796999 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-18T05:35:39",
"trx_id": "081ddc4d7cce2414104c164f0321bde3316634d8",
"trx_in_block": 1,
"virtual_op": 0
}steemdelegated 3.214 SP to @redbutterfly2026/05/13 01:32:54
steemdelegated 3.214 SP to @redbutterfly
2026/05/13 01:32:54
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 5227.586594 VESTS |
| Transaction Info | Block #106001700/Trx fd3905f4fbd396272c7fdb138c3fc9207646326c |
View Raw JSON Data
{
"block": 106001700,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "5227.586594 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-13T01:32:54",
"trx_id": "fd3905f4fbd396272c7fdb138c3fc9207646326c",
"trx_in_block": 1,
"virtual_op": 0
}steemdelegated 4.890 SP to @redbutterfly2026/04/26 04:48:27
steemdelegated 4.890 SP to @redbutterfly
2026/04/26 04:48:27
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 7952.312755 VESTS |
| Transaction Info | Block #105517334/Trx cf4736fd5dc67ec5335a6a07e46d1f68465b16d4 |
View Raw JSON Data
{
"block": 105517334,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "7952.312755 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-04-26T04:48:27",
"trx_id": "cf4736fd5dc67ec5335a6a07e46d1f68465b16d4",
"trx_in_block": 0,
"virtual_op": 0
}steemdelegated 3.240 SP to @redbutterfly2026/01/23 22:10:24
steemdelegated 3.240 SP to @redbutterfly
2026/01/23 22:10:24
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 5269.133413 VESTS |
| Transaction Info | Block #102869029/Trx 1ecb9ef0c6b7d43e6aa90ba6cb043ac69ae73f1c |
View Raw JSON Data
{
"block": 102869029,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "5269.133413 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-01-23T22:10:24",
"trx_id": "1ecb9ef0c6b7d43e6aa90ba6cb043ac69ae73f1c",
"trx_in_block": 1,
"virtual_op": 0
}steemdelegated 3.341 SP to @redbutterfly2024/12/17 17:21:03
steemdelegated 3.341 SP to @redbutterfly
2024/12/17 17:21:03
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 5433.352610 VESTS |
| Transaction Info | Block #91315255/Trx 9bf16c89e36b634dab61387476249d33eff002dd |
View Raw JSON Data
{
"block": 91315255,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "5433.352610 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2024-12-17T17:21:03",
"trx_id": "9bf16c89e36b634dab61387476249d33eff002dd",
"trx_in_block": 1,
"virtual_op": 0
}steemdelegated 3.445 SP to @redbutterfly2023/11/14 09:02:30
steemdelegated 3.445 SP to @redbutterfly
2023/11/14 09:02:30
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 5602.486142 VESTS |
| Transaction Info | Block #79869409/Trx 9b23a68fb7182b4cfe10a376d92a06292b3e6018 |
View Raw JSON Data
{
"block": 79869409,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "5602.486142 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-11-14T09:02:30",
"trx_id": "9b23a68fb7182b4cfe10a376d92a06292b3e6018",
"trx_in_block": 2,
"virtual_op": 0
}steemdelegated 5.251 SP to @redbutterfly2023/09/22 09:34:24
steemdelegated 5.251 SP to @redbutterfly
2023/09/22 09:34:24
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 8539.394928 VESTS |
| Transaction Info | Block #78361886/Trx 4511ef2d4195d3e4fc2ef6b8c0f1838ba0fc867c |
View Raw JSON Data
{
"block": 78361886,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "8539.394928 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-09-22T09:34:24",
"trx_id": "4511ef2d4195d3e4fc2ef6b8c0f1838ba0fc867c",
"trx_in_block": 3,
"virtual_op": 0
}steemdelegated 5.387 SP to @redbutterfly2022/11/03 17:08:12
steemdelegated 5.387 SP to @redbutterfly
2022/11/03 17:08:12
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 8761.446366 VESTS |
| Transaction Info | Block #69119749/Trx 923f5037354ac2f0dac47af536eae24d10db0bc6 |
View Raw JSON Data
{
"block": 69119749,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "8761.446366 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-11-03T17:08:12",
"trx_id": "923f5037354ac2f0dac47af536eae24d10db0bc6",
"trx_in_block": 5,
"virtual_op": 0
}steemdelegated 5.523 SP to @redbutterfly2022/01/17 22:24:15
steemdelegated 5.523 SP to @redbutterfly
2022/01/17 22:24:15
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 8981.553967 VESTS |
| Transaction Info | Block #60823080/Trx 374383f2832a31b385bcca64686e721a472ce64a |
View Raw JSON Data
{
"block": 60823080,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "8981.553967 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-01-17T22:24:15",
"trx_id": "374383f2832a31b385bcca64686e721a472ce64a",
"trx_in_block": 0,
"virtual_op": 0
}steemdelegated 5.636 SP to @redbutterfly2021/06/14 05:36:54
steemdelegated 5.636 SP to @redbutterfly
2021/06/14 05:36:54
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 9165.748255 VESTS |
| Transaction Info | Block #54613443/Trx cf4e308413a01e0589161fa5c393b6bf91b0d0f6 |
View Raw JSON Data
{
"block": 54613443,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "9165.748255 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2021-06-14T05:36:54",
"trx_id": "cf4e308413a01e0589161fa5c393b6bf91b0d0f6",
"trx_in_block": 19,
"virtual_op": 0
}steemdelegated 5.751 SP to @redbutterfly2020/12/11 15:49:45
steemdelegated 5.751 SP to @redbutterfly
2020/12/11 15:49:45
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 9353.170229 VESTS |
| Transaction Info | Block #49360727/Trx a7c1d0c5e516598a7ab3e7679a6c34db742b4dea |
View Raw JSON Data
{
"block": 49360727,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "9353.170229 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-11T15:49:45",
"trx_id": "a7c1d0c5e516598a7ab3e7679a6c34db742b4dea",
"trx_in_block": 1,
"virtual_op": 0
}steemdelegated 1.176 SP to @redbutterfly2020/12/06 09:25:45
steemdelegated 1.176 SP to @redbutterfly
2020/12/06 09:25:45
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #49212255/Trx 108cbf612b9396345f7cc6b7fd14844fefa46b10 |
View Raw JSON Data
{
"block": 49212255,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "1912.543513 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-06T09:25:45",
"trx_id": "108cbf612b9396345f7cc6b7fd14844fefa46b10",
"trx_in_block": 5,
"virtual_op": 0
}steemdelegated 5.755 SP to @redbutterfly2020/12/05 19:27:45
steemdelegated 5.755 SP to @redbutterfly
2020/12/05 19:27:45
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 9359.378083 VESTS |
| Transaction Info | Block #49195813/Trx 40f2def0732da9d5fc73b8d2c412fa0fa9bfea8f |
View Raw JSON Data
{
"block": 49195813,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "9359.378083 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-05T19:27:45",
"trx_id": "40f2def0732da9d5fc73b8d2c412fa0fa9bfea8f",
"trx_in_block": 11,
"virtual_op": 0
}steemdelegated 1.181 SP to @redbutterfly2020/11/03 01:21:54
steemdelegated 1.181 SP to @redbutterfly
2020/11/03 01:21:54
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 1920.017158 VESTS |
| Transaction Info | Block #48269254/Trx 6880794b0b533f0882a6d0a58fd76ccb4acd2216 |
View Raw JSON Data
{
"block": 48269254,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "1920.017158 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-11-03T01:21:54",
"trx_id": "6880794b0b533f0882a6d0a58fd76ccb4acd2216",
"trx_in_block": 1,
"virtual_op": 0
}steemdelegated 5.880 SP to @redbutterfly2020/05/09 10:28:09
steemdelegated 5.880 SP to @redbutterfly
2020/05/09 10:28:09
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 9562.183442 VESTS |
| Transaction Info | Block #43222574/Trx d4ea7feca9891fed98dff745af880cea41a8d2ce |
View Raw JSON Data
{
"block": 43222574,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "9562.183442 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-09T10:28:09",
"trx_id": "d4ea7feca9891fed98dff745af880cea41a8d2ce",
"trx_in_block": 9,
"virtual_op": 0
}steemdelegated 1.201 SP to @redbutterfly2020/05/08 14:46:45
steemdelegated 1.201 SP to @redbutterfly
2020/05/08 14:46:45
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #43199508/Trx 086532712ef4c29d27e79ec15957a970fc7f6089 |
View Raw JSON Data
{
"block": 43199508,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "1953.311140 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-08T14:46:45",
"trx_id": "086532712ef4c29d27e79ec15957a970fc7f6089",
"trx_in_block": 18,
"virtual_op": 0
}steemdelegated 5.945 SP to @redbutterfly2019/11/01 09:15:24
steemdelegated 5.945 SP to @redbutterfly
2019/11/01 09:15:24
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 9668.582525 VESTS |
| Transaction Info | Block #37789887/Trx 6ea4eb31784fab6eb483316a7286b466cc0bb6ae |
View Raw JSON Data
{
"block": 37789887,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "9668.582525 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2019-11-01T09:15:24",
"trx_id": "6ea4eb31784fab6eb483316a7286b466cc0bb6ae",
"trx_in_block": 6,
"virtual_op": 0
}2019/04/11 03:08:45
2019/04/11 03:08:45
| author | steemitboard |
| body | Congratulations @redbutterfly! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@redbutterfly/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/@redbutterfly) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=redbutterfly)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/steemitboard/@steemitboard/the-steem-blockchain-survived-its-first-virus-plague"><img src="https://steemitimages.com/64x128/https://steemitimages.com/0x0/"></a></td><td><a href="https://steemit.com/steemitboard/@steemitboard/the-steem-blockchain-survived-its-first-virus-plague">The Steem blockchain survived its first virus plague!</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 | redbutterfly |
| parent permlink | eos |
| permlink | steemitboard-notify-redbutterfly-20190411t030844000z |
| title | |
| Transaction Info | Block #31940294/Trx 60084bbd7d9322509f5ee60919ef43041629ec74 |
View Raw JSON Data
{
"block": 31940294,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @redbutterfly! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@redbutterfly/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/@redbutterfly) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=redbutterfly)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/steemitboard/@steemitboard/the-steem-blockchain-survived-its-first-virus-plague\"><img src=\"https://steemitimages.com/64x128/https://steemitimages.com/0x0/\"></a></td><td><a href=\"https://steemit.com/steemitboard/@steemitboard/the-steem-blockchain-survived-its-first-virus-plague\">The Steem blockchain survived its first virus plague!</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": "redbutterfly",
"parent_permlink": "eos",
"permlink": "steemitboard-notify-redbutterfly-20190411t030844000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2019-04-11T03:08:45",
"trx_id": "60084bbd7d9322509f5ee60919ef43041629ec74",
"trx_in_block": 9,
"virtual_op": 0
}steemdelegated 6.067 SP to @redbutterfly2018/11/26 19:11:06
steemdelegated 6.067 SP to @redbutterfly
2018/11/26 19:11:06
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 9866.057902 VESTS |
| Transaction Info | Block #28045963/Trx bc77a9dd60d67aba6ffc3fc56c1085dd1b6a088a |
View Raw JSON Data
{
"block": 28045963,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "9866.057902 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-11-26T19:11:06",
"trx_id": "bc77a9dd60d67aba6ffc3fc56c1085dd1b6a088a",
"trx_in_block": 23,
"virtual_op": 0
}steemdelegated 18.553 SP to @redbutterfly2018/08/16 00:01:27
steemdelegated 18.553 SP to @redbutterfly
2018/08/16 00:01:27
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 30172.858230 VESTS |
| Transaction Info | Block #25102933/Trx 4d4c866b7c549f8b40a531dbd87b77e83205a837 |
View Raw JSON Data
{
"block": 25102933,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "30172.858230 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-08-16T00:01:27",
"trx_id": "4d4c866b7c549f8b40a531dbd87b77e83205a837",
"trx_in_block": 28,
"virtual_op": 0
}redbutterflyfollowed @chaimyu2018/08/14 08:44:30
redbutterflyfollowed @chaimyu
2018/08/14 08:44:30
| id | follow |
| json | ["follow",{"follower":"redbutterfly","following":"chaimyu","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["redbutterfly"] |
| Transaction Info | Block #25055810/Trx bab8ba94911acae7fb3dcaee36b57e1d0ca945e3 |
View Raw JSON Data
{
"block": 25055810,
"op": [
"custom_json",
{
"id": "follow",
"json": "[\"follow\",{\"follower\":\"redbutterfly\",\"following\":\"chaimyu\",\"what\":[\"blog\"]}]",
"required_auths": [],
"required_posting_auths": [
"redbutterfly"
]
}
],
"op_in_trx": 0,
"timestamp": "2018-08-14T08:44:30",
"trx_id": "bab8ba94911acae7fb3dcaee36b57e1d0ca945e3",
"trx_in_block": 1,
"virtual_op": 0
}redbutterflyupvoted (100.00%) @chaimyu / omni-usdt-raw-transaction2018/08/14 08:44:09
redbutterflyupvoted (100.00%) @chaimyu / omni-usdt-raw-transaction
2018/08/14 08:44:09
| author | chaimyu |
| permlink | omni-usdt-raw-transaction |
| voter | redbutterfly |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25055803/Trx b3901fd7d987d651ffc265e249582f7a513c45dc |
View Raw JSON Data
{
"block": 25055803,
"op": [
"vote",
{
"author": "chaimyu",
"permlink": "omni-usdt-raw-transaction",
"voter": "redbutterfly",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-14T08:44:09",
"trx_id": "b3901fd7d987d651ffc265e249582f7a513c45dc",
"trx_in_block": 0,
"virtual_op": 0
}chaimyuupvoted (100.00%) @redbutterfly / eos2018/07/19 02:32:12
chaimyuupvoted (100.00%) @redbutterfly / eos
2018/07/19 02:32:12
| author | redbutterfly |
| permlink | eos |
| voter | chaimyu |
| weight | 10000 (100.00%) |
| Transaction Info | Block #24300394/Trx d5d30a8c64fcc65d1edc987b244864908a882cb8 |
View Raw JSON Data
{
"block": 24300394,
"op": [
"vote",
{
"author": "redbutterfly",
"permlink": "eos",
"voter": "chaimyu",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-07-19T02:32:12",
"trx_id": "d5d30a8c64fcc65d1edc987b244864908a882cb8",
"trx_in_block": 2,
"virtual_op": 0
}2018/06/18 11:14:03
2018/06/18 11:14:03
| author | moyu |
| body | 有一个问题哦 我如果竞拍一个短名字 24小时没有人跟我抢过的话 会成交么?还是因为有别人竞拍的价格别我高而不成交呢? |
| json metadata | {"tags":["eos"],"app":"steemit/0.1"} |
| parent author | redbutterfly |
| parent permlink | re-ifttt-re-redbutterfly-eos-20180610t135929534z |
| permlink | re-redbutterfly-re-ifttt-re-redbutterfly-eos-20180618t111403609z |
| title | |
| Transaction Info | Block #23428229/Trx 352f8ba702869fe65f0107e7ff8e57834c0e0ac9 |
View Raw JSON Data
{
"block": 23428229,
"op": [
"comment",
{
"author": "moyu",
"body": "有一个问题哦 我如果竞拍一个短名字 24小时没有人跟我抢过的话 会成交么?还是因为有别人竞拍的价格别我高而不成交呢?",
"json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
"parent_author": "redbutterfly",
"parent_permlink": "re-ifttt-re-redbutterfly-eos-20180610t135929534z",
"permlink": "re-redbutterfly-re-ifttt-re-redbutterfly-eos-20180618t111403609z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-06-18T11:14:03",
"trx_id": "352f8ba702869fe65f0107e7ff8e57834c0e0ac9",
"trx_in_block": 45,
"virtual_op": 0
}redbutterflyupvoted (100.00%) @sichain / eos-helloworld2018/06/12 07:15:39
redbutterflyupvoted (100.00%) @sichain / eos-helloworld
2018/06/12 07:15:39
| author | sichain |
| permlink | eos-helloworld |
| voter | redbutterfly |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23250692/Trx 4e19bff14ce96dee4afc1df5e2a7d40e915c321d |
View Raw JSON Data
{
"block": 23250692,
"op": [
"vote",
{
"author": "sichain",
"permlink": "eos-helloworld",
"voter": "redbutterfly",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-12T07:15:39",
"trx_id": "4e19bff14ce96dee4afc1df5e2a7d40e915c321d",
"trx_in_block": 26,
"virtual_op": 0
}2018/06/11 04:46:30
2018/06/11 04:46:30
| author | crazybits |
| body | 时效24小时的这部分逻辑在哪里,可以贴一下源码位置吗 |
| json metadata | {"tags":["eos"],"app":"steemit/0.1"} |
| parent author | redbutterfly |
| parent permlink | eos |
| permlink | re-redbutterfly-eos-20180611t044627130z |
| title | |
| Transaction Info | Block #23219183/Trx b39b1fbb3aa0e10b8d4138f09c6f99576ea49f49 |
View Raw JSON Data
{
"block": 23219183,
"op": [
"comment",
{
"author": "crazybits",
"body": "时效24小时的这部分逻辑在哪里,可以贴一下源码位置吗",
"json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
"parent_author": "redbutterfly",
"parent_permlink": "eos",
"permlink": "re-redbutterfly-eos-20180611t044627130z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-06-11T04:46:30",
"trx_id": "b39b1fbb3aa0e10b8d4138f09c6f99576ea49f49",
"trx_in_block": 14,
"virtual_op": 0
}bestmzupvoted (100.00%) @redbutterfly / eos2018/06/10 14:58:36
bestmzupvoted (100.00%) @redbutterfly / eos
2018/06/10 14:58:36
| author | redbutterfly |
| permlink | eos |
| voter | bestmz |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23202908/Trx 7c86856b6603887b0536784604ee78c36a6bb775 |
View Raw JSON Data
{
"block": 23202908,
"op": [
"vote",
{
"author": "redbutterfly",
"permlink": "eos",
"voter": "bestmz",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-10T14:58:36",
"trx_id": "7c86856b6603887b0536784604ee78c36a6bb775",
"trx_in_block": 80,
"virtual_op": 0
}2018/06/10 14:01:45
2018/06/10 14:01:45
| author | redbutterfly |
| body | 最大的问题是,即使不是你需要抢注的名字,比如你抢注 aaa,有人抢注bbb,出价比你的高。系统会优先承认bbb的,然后,你的就要**再**等24小时。他人一直在用高价抢注他们的名称,你的就会一直向后延。 明明你需要的是个没人关注的名字,但是,你要想获得这个账户名,那你就要拿出比任何名字都高的价格才行 |
| json metadata | {"tags":["eos"],"app":"steemit/0.1"} |
| parent author | ifttt |
| parent permlink | re-redbutterfly-eos-20180610t134209803z |
| permlink | re-ifttt-re-redbutterfly-eos-20180610t135929534z |
| title | |
| Transaction Info | Block #23201773/Trx 09ccc6d859d5708982cc536929e404e740b41348 |
View Raw JSON Data
{
"block": 23201773,
"op": [
"comment",
{
"author": "redbutterfly",
"body": "最大的问题是,即使不是你需要抢注的名字,比如你抢注 aaa,有人抢注bbb,出价比你的高。系统会优先承认bbb的,然后,你的就要**再**等24小时。他人一直在用高价抢注他们的名称,你的就会一直向后延。\n明明你需要的是个没人关注的名字,但是,你要想获得这个账户名,那你就要拿出比任何名字都高的价格才行",
"json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
"parent_author": "ifttt",
"parent_permlink": "re-redbutterfly-eos-20180610t134209803z",
"permlink": "re-ifttt-re-redbutterfly-eos-20180610t135929534z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-06-10T14:01:45",
"trx_id": "09ccc6d859d5708982cc536929e404e740b41348",
"trx_in_block": 35,
"virtual_op": 0
}2018/06/10 13:59:33
2018/06/10 13:59:33
| author | redbutterfly |
| body | 最大的问题是,即使不是你需要抢注的名字,比如你抢注 aaa,有人抢注bbb,出价比你的高。系统会优先承认bbb的,然后,你的就要**再**等24小时。他人一直在用高价抢注他们的名称,你的就会一直向后延 |
| json metadata | {"tags":["eos"],"app":"steemit/0.1"} |
| parent author | ifttt |
| parent permlink | re-redbutterfly-eos-20180610t134209803z |
| permlink | re-ifttt-re-redbutterfly-eos-20180610t135929534z |
| title | |
| Transaction Info | Block #23201729/Trx 1f3ab0fda736cc57255958ee734fd0cc48064d41 |
View Raw JSON Data
{
"block": 23201729,
"op": [
"comment",
{
"author": "redbutterfly",
"body": "最大的问题是,即使不是你需要抢注的名字,比如你抢注 aaa,有人抢注bbb,出价比你的高。系统会优先承认bbb的,然后,你的就要**再**等24小时。他人一直在用高价抢注他们的名称,你的就会一直向后延",
"json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
"parent_author": "ifttt",
"parent_permlink": "re-redbutterfly-eos-20180610t134209803z",
"permlink": "re-ifttt-re-redbutterfly-eos-20180610t135929534z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-06-10T13:59:33",
"trx_id": "1f3ab0fda736cc57255958ee734fd0cc48064d41",
"trx_in_block": 4,
"virtual_op": 0
}redbutterflyupvoted (100.00%) @redbutterfly / re-sichain-eth-eos-token-20180610t135634658z2018/06/10 13:56:48
redbutterflyupvoted (100.00%) @redbutterfly / re-sichain-eth-eos-token-20180610t135634658z
2018/06/10 13:56:48
| author | redbutterfly |
| permlink | re-sichain-eth-eos-token-20180610t135634658z |
| voter | redbutterfly |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23201674/Trx 1600195e7d7d26471f13a8e61ff1fc9cb6df02a1 |
View Raw JSON Data
{
"block": 23201674,
"op": [
"vote",
{
"author": "redbutterfly",
"permlink": "re-sichain-eth-eos-token-20180610t135634658z",
"voter": "redbutterfly",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-10T13:56:48",
"trx_id": "1600195e7d7d26471f13a8e61ff1fc9cb6df02a1",
"trx_in_block": 38,
"virtual_op": 0
}2018/06/10 13:56:36
2018/06/10 13:56:36
| author | redbutterfly |
| body | 从普通用户的角度考虑,EOS还是很有竞争力的,毕竟,将最主要的RAM资源由公司承担,用户能够“享用”免费的资源 |
| json metadata | {"tags":["eos"],"app":"steemit/0.1"} |
| parent author | sichain |
| parent permlink | eth-eos-token |
| permlink | re-sichain-eth-eos-token-20180610t135634658z |
| title | |
| Transaction Info | Block #23201670/Trx 803e81ba827b86c938c758e08e76793bd1392cdd |
View Raw JSON Data
{
"block": 23201670,
"op": [
"comment",
{
"author": "redbutterfly",
"body": "从普通用户的角度考虑,EOS还是很有竞争力的,毕竟,将最主要的RAM资源由公司承担,用户能够“享用”免费的资源",
"json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
"parent_author": "sichain",
"parent_permlink": "eth-eos-token",
"permlink": "re-sichain-eth-eos-token-20180610t135634658z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-06-10T13:56:36",
"trx_id": "803e81ba827b86c938c758e08e76793bd1392cdd",
"trx_in_block": 20,
"virtual_op": 0
}redbutterflyupvoted (100.00%) @sichain / eth-eos-token2018/06/10 13:54:00
redbutterflyupvoted (100.00%) @sichain / eth-eos-token
2018/06/10 13:54:00
| author | sichain |
| permlink | eth-eos-token |
| voter | redbutterfly |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23201618/Trx ef93645215c61a18723f56380df2147a8cfb65f5 |
View Raw JSON Data
{
"block": 23201618,
"op": [
"vote",
{
"author": "sichain",
"permlink": "eth-eos-token",
"voter": "redbutterfly",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-10T13:54:00",
"trx_id": "ef93645215c61a18723f56380df2147a8cfb65f5",
"trx_in_block": 80,
"virtual_op": 0
}2018/06/10 13:42:42
2018/06/10 13:42:42
| author | ifttt |
| body | 每回出价高10%,24小时内没有更高的出价则成交,如果有人继续出价则继续等待24小时。这规则很简单、直接、公平,好像没有啥槽点啊。 |
| json metadata | {"tags":["eos"],"app":"steemit/0.1"} |
| parent author | redbutterfly |
| parent permlink | eos |
| permlink | re-redbutterfly-eos-20180610t134209803z |
| title | |
| Transaction Info | Block #23201392/Trx ff223ccf6bc150007b35beb9fe5aa2b1b4a85f2b |
View Raw JSON Data
{
"block": 23201392,
"op": [
"comment",
{
"author": "ifttt",
"body": "每回出价高10%,24小时内没有更高的出价则成交,如果有人继续出价则继续等待24小时。这规则很简单、直接、公平,好像没有啥槽点啊。",
"json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
"parent_author": "redbutterfly",
"parent_permlink": "eos",
"permlink": "re-redbutterfly-eos-20180610t134209803z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-06-10T13:42:42",
"trx_id": "ff223ccf6bc150007b35beb9fe5aa2b1b4a85f2b",
"trx_in_block": 46,
"virtual_op": 0
}2018/06/10 13:42:15
2018/06/10 13:42:15
| author | ifttt |
| body | 每回出价高10%,24小时内没有更高的出价则成交,如果有人继续出价则继续等待24小时。这规则很简单、直接、公平。 |
| json metadata | {"tags":["eos"],"app":"steemit/0.1"} |
| parent author | redbutterfly |
| parent permlink | eos |
| permlink | re-redbutterfly-eos-20180610t134209803z |
| title | |
| Transaction Info | Block #23201383/Trx 849ce1c9fad35b4cefbb97907a2411919afb71ee |
View Raw JSON Data
{
"block": 23201383,
"op": [
"comment",
{
"author": "ifttt",
"body": "每回出价高10%,24小时内没有更高的出价则成交,如果有人继续出价则继续等待24小时。这规则很简单、直接、公平。",
"json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}",
"parent_author": "redbutterfly",
"parent_permlink": "eos",
"permlink": "re-redbutterfly-eos-20180610t134209803z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-06-10T13:42:15",
"trx_id": "849ce1c9fad35b4cefbb97907a2411919afb71ee",
"trx_in_block": 60,
"virtual_op": 0
}redbutterflyupvoted (100.00%) @redbutterfly / eos2018/06/10 13:35:36
redbutterflyupvoted (100.00%) @redbutterfly / eos
2018/06/10 13:35:36
| author | redbutterfly |
| permlink | eos |
| voter | redbutterfly |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23201250/Trx 1bac1c34589625624f5765bd60c7586629602056 |
View Raw JSON Data
{
"block": 23201250,
"op": [
"vote",
{
"author": "redbutterfly",
"permlink": "eos",
"voter": "redbutterfly",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-10T13:35:36",
"trx_id": "1bac1c34589625624f5765bd60c7586629602056",
"trx_in_block": 113,
"virtual_op": 0
}redbutterflypublished a new post: eos2018/06/10 13:35:12
redbutterflypublished a new post: eos
2018/06/10 13:35:12
| author | redbutterfly |
| body | 今天发布了 `EOSIO v1.0.2`,有一个主要更新就是,增加了短账户名竞拍功能; 使用以下两个命令: ``` cleos system bidname bider name SYStoken //对名称进行竞拍 cleos system bidnameinfo name //查看竞拍情况 ``` 但是,通过查看eosio.system合约源码,查看到竞拍有个很严重的问题,首先,说一下规则: 1. 想要创建短于12字符的账户名,首先,要用上面的命令对名称进行竞拍,24小时之后,没有任何竞拍者,则竞拍成功(注意:任何); 2. 假如,对同一名称,有人竞拍价更高,则重新记录竞拍时间,再等24小时; 3. 对同一名字,竞拍必须高出原价格的10%; 4. 无论是哪个名字的竞拍,只要是目前所有竞拍里出价最高的,就优先出价最高的; 就是最后一条,实在是恶心,假如我出10 EOS竞拍red,如果,在23小时的时候,有人出11 EOS竞拍 fly; 则,系统先查看他的,直到他成功之后,成功的24之后,我才会成功; 假如,这期间,又有出价高竞拍其他名字,我的竞拍继续延后。。。。 无语,系统有些恶心。 |
| json metadata | {"tags":["eos","cn","bid","bidname"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | eos |
| permlink | eos |
| title | EOS账户名竞拍有点恶心 |
| Transaction Info | Block #23201242/Trx 471ca4243e0c50a1da7120c464a59d0e3ea4a7ac |
View Raw JSON Data
{
"block": 23201242,
"op": [
"comment",
{
"author": "redbutterfly",
"body": "今天发布了 `EOSIO v1.0.2`,有一个主要更新就是,增加了短账户名竞拍功能;\n使用以下两个命令:\n```\ncleos system bidname bider name SYStoken //对名称进行竞拍\ncleos system bidnameinfo name //查看竞拍情况\n```\n\n但是,通过查看eosio.system合约源码,查看到竞拍有个很严重的问题,首先,说一下规则:\n1. 想要创建短于12字符的账户名,首先,要用上面的命令对名称进行竞拍,24小时之后,没有任何竞拍者,则竞拍成功(注意:任何);\n2. 假如,对同一名称,有人竞拍价更高,则重新记录竞拍时间,再等24小时;\n3. 对同一名字,竞拍必须高出原价格的10%;\n4. 无论是哪个名字的竞拍,只要是目前所有竞拍里出价最高的,就优先出价最高的;\n\n就是最后一条,实在是恶心,假如我出10 EOS竞拍red,如果,在23小时的时候,有人出11 EOS竞拍 fly;\n则,系统先查看他的,直到他成功之后,成功的24之后,我才会成功;\n假如,这期间,又有出价高竞拍其他名字,我的竞拍继续延后。。。。\n无语,系统有些恶心。",
"json_metadata": "{\"tags\":[\"eos\",\"cn\",\"bid\",\"bidname\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "eos",
"permlink": "eos",
"title": "EOS账户名竞拍有点恶心"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-10T13:35:12",
"trx_id": "471ca4243e0c50a1da7120c464a59d0e3ea4a7ac",
"trx_in_block": 58,
"virtual_op": 0
}2018/06/08 23:51:42
2018/06/08 23:51:42
| author | steemitboard |
| body | Congratulations @redbutterfly! You have completed some achievement on Steemit and have been rewarded with new badge(s) : [](http://steemitboard.com/@redbutterfly) You published your First Post [](http://steemitboard.com/@redbutterfly) You got a First Vote <sub>_Click on the badge to view your Board of Honor._</sub> <sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub> > Do you like [SteemitBoard's project](https://steemit.com/@steemitboard)? Then **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| parent author | redbutterfly |
| parent permlink | bec |
| permlink | steemitboard-notify-redbutterfly-20180608t235144000z |
| title | |
| Transaction Info | Block #23156001/Trx fe90e65df1db99d09552c187768351a5e69a3ab3 |
View Raw JSON Data
{
"block": 23156001,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @redbutterfly! You have completed some achievement on Steemit and have been rewarded with new badge(s) :\n\n[](http://steemitboard.com/@redbutterfly) You published your First Post\n[](http://steemitboard.com/@redbutterfly) You got a First Vote\n\n<sub>_Click on the badge to view your Board of Honor._</sub>\n<sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub>\n\n\n\n> Do you like [SteemitBoard's project](https://steemit.com/@steemitboard)? Then **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
"parent_author": "redbutterfly",
"parent_permlink": "bec",
"permlink": "steemitboard-notify-redbutterfly-20180608t235144000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-06-08T23:51:42",
"trx_id": "fe90e65df1db99d09552c187768351a5e69a3ab3",
"trx_in_block": 36,
"virtual_op": 0
}redbutterflyupvoted (100.00%) @redbutterfly / re-sichain-eos-dapp-20180608t085718340z2018/06/08 15:20:48
redbutterflyupvoted (100.00%) @redbutterfly / re-sichain-eos-dapp-20180608t085718340z
2018/06/08 15:20:48
| author | redbutterfly |
| permlink | re-sichain-eos-dapp-20180608t085718340z |
| voter | redbutterfly |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23145783/Trx 6b03f8d79f40d84da60bd8d346360fe0383a393c |
View Raw JSON Data
{
"block": 23145783,
"op": [
"vote",
{
"author": "redbutterfly",
"permlink": "re-sichain-eos-dapp-20180608t085718340z",
"voter": "redbutterfly",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-08T15:20:48",
"trx_id": "6b03f8d79f40d84da60bd8d346360fe0383a393c",
"trx_in_block": 16,
"virtual_op": 0
}redbutterflyupvoted (100.00%) @redbutterfly / bec2018/06/08 15:17:30
redbutterflyupvoted (100.00%) @redbutterfly / bec
2018/06/08 15:17:30
| author | redbutterfly |
| permlink | bec |
| voter | redbutterfly |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23145718/Trx a3d30e302b684c33d19c266118e0f1faba3028b3 |
View Raw JSON Data
{
"block": 23145718,
"op": [
"vote",
{
"author": "redbutterfly",
"permlink": "bec",
"voter": "redbutterfly",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-08T15:17:30",
"trx_id": "a3d30e302b684c33d19c266118e0f1faba3028b3",
"trx_in_block": 56,
"virtual_op": 0
}redbutterflypublished a new post: bec2018/06/08 15:17:09
redbutterflypublished a new post: bec
2018/06/08 15:17:09
| author | redbutterfly |
| body | #### 问题 昨天,即4月22日,BEC合约 *(是美链公司发布的token,于今年2月上线交易)* 出现重大漏洞,现已暂停交易。 #### 合约BUG BEC的合约代码:[Beauty Chain 美蜜](https://link.zhihu.com/?target=https%3A//etherscan.io/address/0xc5d105e63711398af9bbff092d4b6769c82f793d) 中出现严重bug,可以通过合约的批量转账的功能,无限复制token,参考文章[一行代码蒸发了¥6,447,277,680 人民币!](https://zhuanlan.zhihu.com/p/35989258)。 详细问题,在上面的文章中已经讲得很详细,此处进行简单的总结: 1. 合约代码中,有一个批量转账的功能,代码为: ``` function batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool) { uint cnt = _receivers.length; uint256 amount = uint256(cnt) * _value; require(cnt > 0 && cnt <= 20); require(_value > 0 && balances[msg.sender] >= amount); balances[msg.sender] = balances[msg.sender].sub(amount); for (uint i = 0; i < cnt; i++) { balances[_receivers[i]] = balances[_receivers[i]].add(_value); Transfer(msg.sender, _receivers[i], _value); } return true; } ``` 该功能能够接收一个地址列表,然后向每一份地址转账_value个token; 2. 开发过C/C++的程序员,或者其他编译型语言的程序员应该知道,数值变量有溢出问题,所以,比如uint8的取值为0~255,一般的溢出算法下的话,255+1 == 0, 0-1 == 255。所以,在进行算术运算的时候,需要比较注意数值溢出问题; 3. 上面合约中,`uint256 amount = uint256(cnt) * _value;` 这句没有进行溢出判断, 也就是说,假设uint256最大值为MAX的话,如果转账数值 uint256(cnt) * _value == MAX+1,则amount=0, 转账的时候,sender账户-amount,而接受者账户+_value,至此,就能够无限转账BEC了。 #### 问题所在 合约的代码中,其实已经实现了安全的数学算法: ``` library SafeMath { function mul(uint256 a, uint256 b) internal constant returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint256 a, uint256 b) internal constant returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal constant returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal constant returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } ``` 但是,上面的乘法功能,并未使用自己实现的安全算法,从而导致bug出现; #### 反思 * 智能合约的开发,是代码公开的方式,所以,开发时候一定要严格检查、测试;数据溢出、逻辑错误等等问题会导致严重的后果; * EOS的token开发,有官方的结构体asset,源代码在eos/contracts/eosiolib/asset.h,其中各种算数、逻辑运算都进行了安全判断。所以,在开发有关金融、数字货币等功能的时候,尽量使用该结构体; |
| json metadata | {"tags":["bec","bug"],"links":["https://link.zhihu.com/?target=https%3A//etherscan.io/address/0xc5d105e63711398af9bbff092d4b6769c82f793d","https://zhuanlan.zhihu.com/p/35989258"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | bec |
| permlink | bec |
| title | 美链(BEC)漏洞反思 |
| Transaction Info | Block #23145711/Trx 9a417566030104f1708c25bdf77635a9eb3e70d0 |
View Raw JSON Data
{
"block": 23145711,
"op": [
"comment",
{
"author": "redbutterfly",
"body": "#### 问题\n昨天,即4月22日,BEC合约 *(是美链公司发布的token,于今年2月上线交易)* 出现重大漏洞,现已暂停交易。\n\n#### 合约BUG\nBEC的合约代码:[Beauty Chain 美蜜](https://link.zhihu.com/?target=https%3A//etherscan.io/address/0xc5d105e63711398af9bbff092d4b6769c82f793d) 中出现严重bug,可以通过合约的批量转账的功能,无限复制token,参考文章[一行代码蒸发了¥6,447,277,680 人民币!](https://zhuanlan.zhihu.com/p/35989258)。\n\n详细问题,在上面的文章中已经讲得很详细,此处进行简单的总结:\n1. 合约代码中,有一个批量转账的功能,代码为:\n```\n function batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool) {\n uint cnt = _receivers.length;\n uint256 amount = uint256(cnt) * _value;\n require(cnt > 0 && cnt <= 20);\n require(_value > 0 && balances[msg.sender] >= amount);\n\n balances[msg.sender] = balances[msg.sender].sub(amount);\n for (uint i = 0; i < cnt; i++) {\n balances[_receivers[i]] = balances[_receivers[i]].add(_value);\n Transfer(msg.sender, _receivers[i], _value);\n }\n return true;\n }\n```\n该功能能够接收一个地址列表,然后向每一份地址转账_value个token;\n2. 开发过C/C++的程序员,或者其他编译型语言的程序员应该知道,数值变量有溢出问题,所以,比如uint8的取值为0~255,一般的溢出算法下的话,255+1 == 0, 0-1 == 255。所以,在进行算术运算的时候,需要比较注意数值溢出问题;\n3. 上面合约中,`uint256 amount = uint256(cnt) * _value;` 这句没有进行溢出判断,\n也就是说,假设uint256最大值为MAX的话,如果转账数值 uint256(cnt) * _value == MAX+1,则amount=0,\n转账的时候,sender账户-amount,而接受者账户+_value,至此,就能够无限转账BEC了。\n\n#### 问题所在\n合约的代码中,其实已经实现了安全的数学算法:\n```\nlibrary SafeMath {\n function mul(uint256 a, uint256 b) internal constant returns (uint256) {\n uint256 c = a * b;\n assert(a == 0 || c / a == b);\n return c;\n }\n\n function div(uint256 a, uint256 b) internal constant returns (uint256) {\n // assert(b > 0); // Solidity automatically throws when dividing by 0\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n return c;\n }\n\n function sub(uint256 a, uint256 b) internal constant returns (uint256) {\n assert(b <= a);\n return a - b;\n }\n\n function add(uint256 a, uint256 b) internal constant returns (uint256) {\n uint256 c = a + b;\n assert(c >= a);\n return c;\n }\n}\n```\n但是,上面的乘法功能,并未使用自己实现的安全算法,从而导致bug出现;\n#### 反思\n* 智能合约的开发,是代码公开的方式,所以,开发时候一定要严格检查、测试;数据溢出、逻辑错误等等问题会导致严重的后果;\n* EOS的token开发,有官方的结构体asset,源代码在eos/contracts/eosiolib/asset.h,其中各种算数、逻辑运算都进行了安全判断。所以,在开发有关金融、数字货币等功能的时候,尽量使用该结构体;",
"json_metadata": "{\"tags\":[\"bec\",\"bug\"],\"links\":[\"https://link.zhihu.com/?target=https%3A//etherscan.io/address/0xc5d105e63711398af9bbff092d4b6769c82f793d\",\"https://zhuanlan.zhihu.com/p/35989258\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "bec",
"permlink": "bec",
"title": "美链(BEC)漏洞反思"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-08T15:17:09",
"trx_id": "9a417566030104f1708c25bdf77635a9eb3e70d0",
"trx_in_block": 2,
"virtual_op": 0
}ubgupvoted (1.00%) @redbutterfly / eos-blogview2018/06/08 15:12:57
ubgupvoted (1.00%) @redbutterfly / eos-blogview
2018/06/08 15:12:57
| author | redbutterfly |
| permlink | eos-blogview |
| voter | ubg |
| weight | 100 (1.00%) |
| Transaction Info | Block #23145627/Trx c752b30595736f6e3956c057d972997b6e5968c4 |
View Raw JSON Data
{
"block": 23145627,
"op": [
"vote",
{
"author": "redbutterfly",
"permlink": "eos-blogview",
"voter": "ubg",
"weight": 100
}
],
"op_in_trx": 0,
"timestamp": "2018-06-08T15:12:57",
"trx_id": "c752b30595736f6e3956c057d972997b6e5968c4",
"trx_in_block": 15,
"virtual_op": 0
}redbutterflyupvoted (100.00%) @redbutterfly / eos-blogview2018/06/08 15:11:15
redbutterflyupvoted (100.00%) @redbutterfly / eos-blogview
2018/06/08 15:11:15
| author | redbutterfly |
| permlink | eos-blogview |
| voter | redbutterfly |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23145593/Trx 08a2e0de58ba59143ba877de09636edaf401f09e |
View Raw JSON Data
{
"block": 23145593,
"op": [
"vote",
{
"author": "redbutterfly",
"permlink": "eos-blogview",
"voter": "redbutterfly",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-08T15:11:15",
"trx_id": "08a2e0de58ba59143ba877de09636edaf401f09e",
"trx_in_block": 25,
"virtual_op": 0
}redbutterflypublished a new post: eos-blogview2018/06/08 15:10:36
redbutterflypublished a new post: eos-blogview
2018/06/08 15:10:36
| author | redbutterfly |
| body | 1、概要 关于如何编译EOS源码、编译docker镜像,搭建节点等等,官方都有相关文档, 2、本次合约介绍 之前在eos dawn 2.0版本,有个示例合约 simpledb,公司需求的智能合约就是实现了类似合约,所以,之前我实现的版本就是根据这个修改的。而且,该合约主要使用的是2.0版中的 db.h头文件中的函数 store_str,以字符串为索引,保存结构体的功能; 但是,在3.0版本中,该功能暂时删除,只能暂时使用其他功能代替,目前,决定使用multi_index容器; 3、multi_index eos dawn 3.0中的multi_index,使用方法和boost中的multi_index,非常类似,就是多重索引容器,假如清楚其使用方法的话,应该对这个比较熟悉; 声明 typedef eosio::multi_index< tablename, typename> table( code, scope); 其中,需要的几个参数,如其命名含义: tablename:该table的名称; typename: 该容器存储的结构体; code:本合约的名称,例如 N(tests); scope:数据存储的账户名; 多级索引 声明时候,可以使用以下方式声明二级索引,或多级索引: typedef eosio::multi_index< tablename, typename, index_by< scope, const_mem_fun<typename, index_type, typename::method> > > table( code, scope); 但是,目前二级索引,只支持uint64_t、uint128_t、 key256(eosio的内建类型) 具体如使用,会在后续程序里面讲解; 方法 声明完成后,可以使用以下功能: table.emplace(scope, [&]( auto& g ) { ... }) 添加数据; table.find(primary_key) 用关键字查找; table.modify(itr, scope, [&]( auto& g ) { ... }) 修改数据; table.erase(itr) 删除 table.begin() 数据起始 table.end() 数据末尾 ... 4、更符合面向对象的新合约 Dawn3.0的新合约编写方式见:新格式 该合约要实现以下功能: 每个用户能够上传自己的blog文章; 其他用户能够审核该用户的文章是否正确; 作者可以查询文章状态和数量; 结构定义如下,即abi文件: { "____comment": "This file was generated by eosio-abigen. DO NOT EDIT - 2018-04-16T07:24:15", "types": [], "structs": [{ "name": "account", "base": "", "fields": [{ "name": "owner", "type": "account_name" },{ "name": "blognum", "type": "uint32" } ] },{ "name": "blog", "base": "", "fields": [{ "name": "ID", "type": "uint64" },{ "name": "status", "type": "uint8" },{ "name": "approve_status", "type": "string" },{ "name": "producer", "type": "account_name" },{ "name": "reviewer", "type": "account_name" },{ "name": "content", "type": "string" } ] },{ "name": "upload", "base": "", "fields": [{ "name": "producer", "type": "account_name" },{ "name": "content", "type": "string" } ] },{ "name": "reviewing", "base": "", "fields": [{ "name": "ID", "type": "uint64" },{ "name": "reviewer", "type": "account_name" } ] },{ "name": "approved", "base": "", "fields": [{ "name": "ID", "type": "uint64" } ] },{ "name": "disapprove", "base": "", "fields": [{ "name": "ID", "type": "uint64" },{ "name": "reason", "type": "string" } ] },{ "name": "remove", "base": "", "fields": [{ "name": "ID", "type": "uint64" } ] } ], "actions": [{ "name": "upload", "type": "upload", "ricardian_contract": "" },{ "name": "reviewing", "type": "reviewing", "ricardian_contract": "" },{ "name": "approved", "type": "approved", "ricardian_contract": "" },{ "name": "disapprove", "type": "disapprove", "ricardian_contract": "" },{ "name": "remove", "type": "remove", "ricardian_contract": "" } ], "tables": [{ "name": "account", "index_type": "i64", "key_names": [ "owner" ], "key_types": [ "account_name" ], "type": "account" },{ "name": "blog", "index_type": "i64", "key_names": [ "ID" ], "key_types": [ "uint64" ], "type": "blog" } ], "clauses": [] } 总结如下: table: account(存储用户blog数量)、blog(保存用户blog); action: upload 上传blog信息; reviewing 审核员开始审核; approved 通过审核; disapprove 未通过审核; remove 用户删除自己blog; 5、代码 /** * @file * @copyright defined in eos/LICENSE.txt * @auther: redbutterfly * @createtime: 2018-04-16 */ #include <eosiolib/eosio.hpp> #include <eosiolib/multi_index.hpp> #include <eosiolib/contract.hpp> using eosio::indexed_by; using eosio::const_mem_fun; using std::string; class blog_view : public eosio::contract { public: using contract::contract; blog_view(account_name self) :eosio::contract(self), accounts(_self, _self), idlists(_self, _self), init_status(std::string(64,'0')) {} /// @abi action void upload(const account_name producer, const std::string content) { require_auth(producer); blog_index upload_blogs(_self, producer); //获取ID uint32_t nowID = get_ID(); //TODO: add the dedup upload_blogs.emplace(producer, [&]( auto& g ) { g.ID = nowID; g.status = Status::s_uploaded; g.producer = producer; g.content = content; g.approve_status = init_status; }); //在idlist添加,ID--producer关系,用于之后通过ID查询producer idlists.emplace(_self, [&]( auto& g ) { g.ID = nowID; g.producer = producer; }); //blog数量+1 blognum_op(producer, '+'); } /// @abi action void reviewing(const uint64_t ID, const account_name reviewer) { require_auth(reviewer); //先通过idlist查询ID,获取用户名,然后才能用mutil_index查询具体用户的blog,下同 auto itrid = idlists.find(ID); eosio_assert(itrid != idlists.end(), "this blog doesn't exists!\n"); blog_index review_blogs(_self, itrid->producer); auto itr = review_blogs.find( ID ); eosio_assert(itr != review_blogs.end(), "this blog doesn't exists!\n"); eosio_assert(itr->producer != reviewer, "you can't review youself!\n"); eosio_assert(itr->status == Status::s_uploaded, "this blog is reviewing or reviewed!\n"); review_blogs.modify(itr, itrid->producer, [&](auto& g){ g.status = Status::s_reviewing; g.reviewer = reviewer; }); } /// @abi action void approved(const uint64_t ID) { auto itrid = idlists.find(ID); eosio_assert(itrid != idlists.end(), "this blog doesn't exists!\n"); blog_index approve_blogs(_self, itrid->producer); auto itr = approve_blogs.find( ID ); eosio_assert(itr != approve_blogs.end(), "this blog doesn't exists!\n"); eosio_assert(itr->status == Status::s_reviewing, "this blog is reviewed!\n"); require_auth(itr->reviewer); approve_blogs.modify(itr, itrid->producer, [&](auto& g){ g.status = Status::s_approved; g.approve_status = std::string("approved"); }); } /// @abi action void disapprove(const uint64_t ID, std::string reason) { auto itrid = idlists.find(ID); eosio_assert(itrid != idlists.end(), "this blog doesn't exists!\n"); blog_index disappr_policys(_self, itrid->producer); auto itr = disappr_policys.find( ID ); eosio_assert(itr != disappr_policys.end(), "this blog doesn't exists!\n"); eosio_assert(itr->status == Status::s_reviewing, "this blog is reviewed!\n"); require_auth(itr->reviewer); disappr_policys.modify(itr, itrid->producer, [&](auto& g){ g.status = Status::s_disapprove; g.approve_status = reason; }); } /// @abi action void remove(const uint64_t ID) { auto itrid = idlists.find(ID); eosio_assert(itrid != idlists.end(), "this blog doesn't exists!\n"); blog_index remove_policys(_self, itrid->producer); auto itr = remove_policys.find( ID ); eosio_assert(itr != remove_policys.end(), "this blog doesn't exists!\n"); require_auth(itr->producer); //使用erase删除 remove_policys.erase(itr); blognum_op(itr->producer, '-'); } private: enum Status {s_uploaded,s_reviewing,s_approved,s_disapprove}; /** * 用于保存用户信息,保存用户文章数量 * @abi table account i64 */ struct account { account( account_name o = account_name() ):owner(o){} account_name owner; uint32_t blognum = 0; bool is_empty()const { return !blognum; } uint64_t primary_key()const { return owner; } EOSLIB_SERIALIZE( account, (owner)(blognum) ) }; typedef eosio::multi_index< N(account), account> account_index; /** * 保存文章ID和用户关系,假如不保存,则审核员每次都要提交文章作者; */ struct idlist { uint64_t ID; account_name producer; uint64_t primary_key()const { return ID; } EOSLIB_SERIALIZE( idlist, (ID)(producer) ) }; typedef eosio::multi_index< N(idlist), idlist> idlist_index; //@abi table blog i64 struct blog { uint64_t ID; uint8_t status; std::string approve_status; account_name producer; account_name reviewer; std::string content; auto primary_key() const { return ID; } EOSLIB_SERIALIZE( blog, (ID)(status)(approve_status)(producer)(reviewer)(content) ) }; typedef eosio::multi_index< N(blog), blog> blog_index; account_index accounts; idlist_index idlists; std::string init_status; // get the code's policynum uint32_t get_ID() { auto itr = accounts.find( _self ); if ( itr == accounts.end() ) { return 0; } else { return itr->blognum; } } /** * to operate the account's policynum * op : '+','-' */ void blognum_op(account_name name, char op) { auto itr = accounts.find( name ); if ( itr == accounts.end() ) { accounts.emplace(name, [&]( auto& g ) { g.owner = name; g.blognum = 1; }); } else { if( op == '+' ) { accounts.modify(itr, itr->owner, []( auto& g ) {g.blognum += 1;}); } else if( op == '-' ) { accounts.modify(itr, itr->owner, []( auto& g ) {g.blognum -= 1;}); } } itr = accounts.find( _self ); if ( itr == accounts.end() ) { accounts.emplace(_self, [&]( auto& g ) { g.owner = _self; g.blognum = 1; }); } else { if( op == '+' ) { accounts.modify(itr, itr->owner, []( auto& g ) {g.blognum += 1;}); } } } }; EOSIO_ABI( blog_view, (upload)(reviewing)(approved)(disapprove)(remove) ) 要点简单总结: 智能合约的开发,主要是要摒弃之前开发习惯,因为要在一定的限制下开发需要的功能;比如,在审查员审查blog的时候,在blog_index结构中,用scope作为主分类,然后使用ID作为primary_key,这样就要求每次要查询primary_key的时候,首先要知道scope,但是,虽然审查员可以每次都传入producer,但是太过麻烦,这种时候,就要在生成一个结构体idlist,用于存储这种关系,因为idlist的scope是合约本身,这就可以避免不知道scope的情况; 在进行upload时候,blog的approve_status属性是string,我将其初始化为一个64字符的字符串。此处是因为,假如我先设置空值,或短字符串的时候,当审核员要修改此string,并超过原先值的时候,就需要producer的权限,正常来说,审核员要提交了,还需要上传者的权限,这就不对了。所以,此处设置一个长字符串,并要求审核员设置不要超过64; 其他,就没有什么难点或者问题了。 6、执行 使用eosiocpp编译完后,执行上传: image.png 使用tester作为上传者,先上传两个blog: image.png 使用get table查看上传结果: image.png 审核员yanyan先开始审核第二个,发送开始审核action: image.png 审核通过后,发送通过的action: image.png 审核第一个(略过reviewing,同上),但是,发现问题,执行审核不通过: image.png 用户看到审核不通,则删除不通过的合约: image.png 以上,就是该智能合约的执行过程。 7、其他 当然,该合约还有很多可以改进的地方,比如blog增加第二个key,更加方便的排重,或者添加统计未审核blog的table,方便审核员查找等等。 |
| json metadata | {"tags":["eos","smartcontract","include"],"users":["file","copyright","auther","createtime"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | eos |
| permlink | eos-blogview |
| title | EOS 的智能合约 -- blog_view |
| Transaction Info | Block #23145580/Trx 52308cd475890f4e426e5152f0afa9fbaa63e69e |
View Raw JSON Data
{
"block": 23145580,
"op": [
"comment",
{
"author": "redbutterfly",
"body": "1、概要\n关于如何编译EOS源码、编译docker镜像,搭建节点等等,官方都有相关文档,\n\n2、本次合约介绍\n之前在eos dawn 2.0版本,有个示例合约 simpledb,公司需求的智能合约就是实现了类似合约,所以,之前我实现的版本就是根据这个修改的。而且,该合约主要使用的是2.0版中的 db.h头文件中的函数 store_str,以字符串为索引,保存结构体的功能;\n但是,在3.0版本中,该功能暂时删除,只能暂时使用其他功能代替,目前,决定使用multi_index容器;\n\n3、multi_index\neos dawn 3.0中的multi_index,使用方法和boost中的multi_index,非常类似,就是多重索引容器,假如清楚其使用方法的话,应该对这个比较熟悉;\n\n声明\ntypedef eosio::multi_index< tablename, typename> table( code, scope);\n其中,需要的几个参数,如其命名含义:\n\ntablename:该table的名称;\ntypename: 该容器存储的结构体;\ncode:本合约的名称,例如 N(tests);\nscope:数据存储的账户名;\n多级索引\n声明时候,可以使用以下方式声明二级索引,或多级索引:\n\ntypedef eosio::multi_index< tablename, typename,\n index_by< scope, const_mem_fun<typename, index_type, typename::method> >\n> table( code, scope);\n但是,目前二级索引,只支持uint64_t、uint128_t、 key256(eosio的内建类型) 具体如使用,会在后续程序里面讲解;\n\n方法\n声明完成后,可以使用以下功能:\n\ntable.emplace(scope, [&]( auto& g ) { ... }) 添加数据;\ntable.find(primary_key) 用关键字查找;\ntable.modify(itr, scope, [&]( auto& g ) { ... }) 修改数据;\ntable.erase(itr) 删除\ntable.begin() 数据起始\ntable.end() 数据末尾\n...\n4、更符合面向对象的新合约\nDawn3.0的新合约编写方式见:新格式\n该合约要实现以下功能:\n\n每个用户能够上传自己的blog文章;\n其他用户能够审核该用户的文章是否正确;\n作者可以查询文章状态和数量;\n结构定义如下,即abi文件:\n\n{\n \"____comment\": \"This file was generated by eosio-abigen. DO NOT EDIT - 2018-04-16T07:24:15\",\n \"types\": [],\n \"structs\": [{\n \"name\": \"account\",\n \"base\": \"\",\n \"fields\": [{\n \"name\": \"owner\",\n \"type\": \"account_name\"\n },{\n \"name\": \"blognum\",\n \"type\": \"uint32\"\n }\n ]\n },{\n \"name\": \"blog\",\n \"base\": \"\",\n \"fields\": [{\n \"name\": \"ID\",\n \"type\": \"uint64\"\n },{\n \"name\": \"status\",\n \"type\": \"uint8\"\n },{\n \"name\": \"approve_status\",\n \"type\": \"string\"\n },{\n \"name\": \"producer\",\n \"type\": \"account_name\"\n },{\n \"name\": \"reviewer\",\n \"type\": \"account_name\"\n },{\n \"name\": \"content\",\n \"type\": \"string\"\n }\n ]\n },{\n \"name\": \"upload\",\n \"base\": \"\",\n \"fields\": [{\n \"name\": \"producer\",\n \"type\": \"account_name\"\n },{\n \"name\": \"content\",\n \"type\": \"string\"\n }\n ]\n },{\n \"name\": \"reviewing\",\n \"base\": \"\",\n \"fields\": [{\n \"name\": \"ID\",\n \"type\": \"uint64\"\n },{\n \"name\": \"reviewer\",\n \"type\": \"account_name\"\n }\n ]\n },{\n \"name\": \"approved\",\n \"base\": \"\",\n \"fields\": [{\n \"name\": \"ID\",\n \"type\": \"uint64\"\n }\n ]\n },{\n \"name\": \"disapprove\",\n \"base\": \"\",\n \"fields\": [{\n \"name\": \"ID\",\n \"type\": \"uint64\"\n },{\n \"name\": \"reason\",\n \"type\": \"string\"\n }\n ]\n },{\n \"name\": \"remove\",\n \"base\": \"\",\n \"fields\": [{\n \"name\": \"ID\",\n \"type\": \"uint64\"\n }\n ]\n }\n ],\n \"actions\": [{\n \"name\": \"upload\",\n \"type\": \"upload\",\n \"ricardian_contract\": \"\"\n },{\n \"name\": \"reviewing\",\n \"type\": \"reviewing\",\n \"ricardian_contract\": \"\"\n },{\n \"name\": \"approved\",\n \"type\": \"approved\",\n \"ricardian_contract\": \"\"\n },{\n \"name\": \"disapprove\",\n \"type\": \"disapprove\",\n \"ricardian_contract\": \"\"\n },{\n \"name\": \"remove\",\n \"type\": \"remove\",\n \"ricardian_contract\": \"\"\n }\n ],\n \"tables\": [{\n \"name\": \"account\",\n \"index_type\": \"i64\",\n \"key_names\": [\n \"owner\"\n ],\n \"key_types\": [\n \"account_name\"\n ],\n \"type\": \"account\"\n },{\n \"name\": \"blog\",\n \"index_type\": \"i64\",\n \"key_names\": [\n \"ID\"\n ],\n \"key_types\": [\n \"uint64\"\n ],\n \"type\": \"blog\"\n }\n ],\n \"clauses\": []\n}\n总结如下:\n\ntable: account(存储用户blog数量)、blog(保存用户blog);\naction:\nupload 上传blog信息;\nreviewing 审核员开始审核;\napproved 通过审核;\ndisapprove 未通过审核;\nremove 用户删除自己blog;\n5、代码\n/**\n * @file\n * @copyright defined in eos/LICENSE.txt\n * @auther: redbutterfly\n * @createtime: 2018-04-16\n */\n#include <eosiolib/eosio.hpp>\n#include <eosiolib/multi_index.hpp>\n#include <eosiolib/contract.hpp>\n\nusing eosio::indexed_by;\nusing eosio::const_mem_fun;\nusing std::string;\n\n\nclass blog_view : public eosio::contract {\n public:\n using contract::contract;\n blog_view(account_name self)\n :eosio::contract(self),\n accounts(_self, _self),\n idlists(_self, _self),\n init_status(std::string(64,'0'))\n {}\n\n /// @abi action\n void upload(const account_name producer, const std::string content) {\n require_auth(producer);\n \n blog_index upload_blogs(_self, producer);\n //获取ID\n uint32_t nowID = get_ID();\n\n //TODO: add the dedup\n upload_blogs.emplace(producer, [&]( auto& g ) {\n g.ID = nowID;\n g.status = Status::s_uploaded;\n g.producer = producer;\n g.content = content;\n g.approve_status = init_status;\n });\n\n //在idlist添加,ID--producer关系,用于之后通过ID查询producer\n idlists.emplace(_self, [&]( auto& g ) {\n g.ID = nowID;\n g.producer = producer;\n });\n\n //blog数量+1\n blognum_op(producer, '+');\n }\n\n /// @abi action\n void reviewing(const uint64_t ID, const account_name reviewer) {\n require_auth(reviewer);\n\n //先通过idlist查询ID,获取用户名,然后才能用mutil_index查询具体用户的blog,下同\n auto itrid = idlists.find(ID);\n eosio_assert(itrid != idlists.end(), \"this blog doesn't exists!\\n\");\n\n blog_index review_blogs(_self, itrid->producer);\n\n auto itr = review_blogs.find( ID );\n eosio_assert(itr != review_blogs.end(), \"this blog doesn't exists!\\n\");\n eosio_assert(itr->producer != reviewer, \"you can't review youself!\\n\");\n eosio_assert(itr->status == Status::s_uploaded, \"this blog is reviewing or reviewed!\\n\");\n \n review_blogs.modify(itr, itrid->producer, [&](auto& g){\n g.status = Status::s_reviewing;\n g.reviewer = reviewer;\n });\n }\n\n /// @abi action\n void approved(const uint64_t ID) {\n\n auto itrid = idlists.find(ID);\n eosio_assert(itrid != idlists.end(), \"this blog doesn't exists!\\n\");\n blog_index approve_blogs(_self, itrid->producer);\n\n auto itr = approve_blogs.find( ID );\n eosio_assert(itr != approve_blogs.end(), \"this blog doesn't exists!\\n\");\n eosio_assert(itr->status == Status::s_reviewing, \"this blog is reviewed!\\n\");\n require_auth(itr->reviewer);\n \n approve_blogs.modify(itr, itrid->producer, [&](auto& g){\n g.status = Status::s_approved;\n g.approve_status = std::string(\"approved\");\n });\n }\n\n /// @abi action\n void disapprove(const uint64_t ID, std::string reason) {\n\n auto itrid = idlists.find(ID);\n eosio_assert(itrid != idlists.end(), \"this blog doesn't exists!\\n\");\n blog_index disappr_policys(_self, itrid->producer);\n\n auto itr = disappr_policys.find( ID );\n eosio_assert(itr != disappr_policys.end(), \"this blog doesn't exists!\\n\");\n eosio_assert(itr->status == Status::s_reviewing, \"this blog is reviewed!\\n\");\n require_auth(itr->reviewer);\n \n disappr_policys.modify(itr, itrid->producer, [&](auto& g){\n g.status = Status::s_disapprove;\n g.approve_status = reason;\n });\n }\n\n /// @abi action\n void remove(const uint64_t ID) {\n auto itrid = idlists.find(ID);\n eosio_assert(itrid != idlists.end(), \"this blog doesn't exists!\\n\");\n blog_index remove_policys(_self, itrid->producer);\n\n auto itr = remove_policys.find( ID );\n eosio_assert(itr != remove_policys.end(), \"this blog doesn't exists!\\n\");\n require_auth(itr->producer);\n \n //使用erase删除\n remove_policys.erase(itr);\n blognum_op(itr->producer, '-');\n }\n\n\n private:\n enum Status {s_uploaded,s_reviewing,s_approved,s_disapprove};\n\n /**\n * 用于保存用户信息,保存用户文章数量\n * @abi table account i64\n */\n struct account {\n account( account_name o = account_name() ):owner(o){}\n\n account_name owner;\n uint32_t blognum = 0;\n\n bool is_empty()const { return !blognum; }\n\n uint64_t primary_key()const { return owner; }\n\n EOSLIB_SERIALIZE( account, (owner)(blognum) )\n };\n\n typedef eosio::multi_index< N(account), account> account_index;\n\n /**\n * 保存文章ID和用户关系,假如不保存,则审核员每次都要提交文章作者;\n */\n struct idlist {\n uint64_t ID;\n account_name producer;\n\n uint64_t primary_key()const { return ID; }\n\n EOSLIB_SERIALIZE( idlist, (ID)(producer) )\n };\n typedef eosio::multi_index< N(idlist), idlist> idlist_index;\n\n //@abi table blog i64\n struct blog {\n uint64_t ID;\n uint8_t status;\n std::string approve_status;\n account_name producer;\n account_name reviewer;\n std::string content;\n\n auto primary_key() const { return ID; }\n\n EOSLIB_SERIALIZE( blog, (ID)(status)(approve_status)(producer)(reviewer)(content) )\n }; \n\n typedef eosio::multi_index< N(blog), blog> blog_index;\n\n account_index accounts;\n idlist_index idlists;\n std::string init_status;\n\n // get the code's policynum\n uint32_t get_ID() {\n auto itr = accounts.find( _self );\n if ( itr == accounts.end() ) {\n return 0;\n } else {\n return itr->blognum;\n }\n }\n\n /**\n * to operate the account's policynum\n * op : '+','-'\n */\n void blognum_op(account_name name, char op) {\n auto itr = accounts.find( name );\n if ( itr == accounts.end() ) {\n accounts.emplace(name, [&]( auto& g ) {\n g.owner = name;\n g.blognum = 1;\n });\n } else {\n if( op == '+' ) {\n accounts.modify(itr, itr->owner, []( auto& g ) {g.blognum += 1;});\n } else if( op == '-' ) {\n accounts.modify(itr, itr->owner, []( auto& g ) {g.blognum -= 1;});\n }\n }\n\n itr = accounts.find( _self );\n if ( itr == accounts.end() ) {\n accounts.emplace(_self, [&]( auto& g ) {\n g.owner = _self;\n g.blognum = 1;\n });\n } else {\n if( op == '+' ) {\n accounts.modify(itr, itr->owner, []( auto& g ) {g.blognum += 1;});\n }\n }\n }\n};\n\nEOSIO_ABI( blog_view, (upload)(reviewing)(approved)(disapprove)(remove) )\n要点简单总结:\n\n智能合约的开发,主要是要摒弃之前开发习惯,因为要在一定的限制下开发需要的功能;比如,在审查员审查blog的时候,在blog_index结构中,用scope作为主分类,然后使用ID作为primary_key,这样就要求每次要查询primary_key的时候,首先要知道scope,但是,虽然审查员可以每次都传入producer,但是太过麻烦,这种时候,就要在生成一个结构体idlist,用于存储这种关系,因为idlist的scope是合约本身,这就可以避免不知道scope的情况;\n在进行upload时候,blog的approve_status属性是string,我将其初始化为一个64字符的字符串。此处是因为,假如我先设置空值,或短字符串的时候,当审核员要修改此string,并超过原先值的时候,就需要producer的权限,正常来说,审核员要提交了,还需要上传者的权限,这就不对了。所以,此处设置一个长字符串,并要求审核员设置不要超过64;\n其他,就没有什么难点或者问题了。\n\n6、执行\n使用eosiocpp编译完后,执行上传:\nimage.png\n\n使用tester作为上传者,先上传两个blog:\nimage.png\n\n使用get table查看上传结果:\nimage.png\n\n审核员yanyan先开始审核第二个,发送开始审核action:\nimage.png\n\n审核通过后,发送通过的action:\nimage.png\n审核第一个(略过reviewing,同上),但是,发现问题,执行审核不通过:\n\nimage.png\n\n用户看到审核不通,则删除不通过的合约:\nimage.png\n\n以上,就是该智能合约的执行过程。\n7、其他\n当然,该合约还有很多可以改进的地方,比如blog增加第二个key,更加方便的排重,或者添加统计未审核blog的table,方便审核员查找等等。",
"json_metadata": "{\"tags\":[\"eos\",\"smartcontract\",\"include\"],\"users\":[\"file\",\"copyright\",\"auther\",\"createtime\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "eos",
"permlink": "eos-blogview",
"title": "EOS 的智能合约 -- blog_view"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-08T15:10:36",
"trx_id": "52308cd475890f4e426e5152f0afa9fbaa63e69e",
"trx_in_block": 4,
"virtual_op": 0
}redbutterflyupdated their account properties2018/06/08 08:58:36
redbutterflyupdated their account properties
2018/06/08 08:58:36
| account | redbutterfly |
| json metadata | {"profile":{"profile_image":"https://cdn.steemitimages.com/DQmP1rdYGBVJiAeHGspuwSiS2eidVBHcqU34Cqo87x8KrEt/175424rgwmaw4wwd6dmszg.jpg"}} |
| memo key | STM8JkpU157wEHaA9LVcr3EX2KyqJar88vRw1j6sZGwue6NkcHmGp |
| Transaction Info | Block #23138143/Trx c1e9870c2b5982bf3ad492df2b37ccc0c5144837 |
View Raw JSON Data
{
"block": 23138143,
"op": [
"account_update",
{
"account": "redbutterfly",
"json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmP1rdYGBVJiAeHGspuwSiS2eidVBHcqU34Cqo87x8KrEt/175424rgwmaw4wwd6dmszg.jpg\"}}",
"memo_key": "STM8JkpU157wEHaA9LVcr3EX2KyqJar88vRw1j6sZGwue6NkcHmGp"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-08T08:58:36",
"trx_id": "c1e9870c2b5982bf3ad492df2b37ccc0c5144837",
"trx_in_block": 38,
"virtual_op": 0
}redbutterflyupvoted (100.00%) @sichain / eos-dapp2018/06/08 08:57:30
redbutterflyupvoted (100.00%) @sichain / eos-dapp
2018/06/08 08:57:30
| author | sichain |
| permlink | eos-dapp |
| voter | redbutterfly |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23138121/Trx 86e6f5094ffed56f6827d84c54f3c58b12a30af8 |
View Raw JSON Data
{
"block": 23138121,
"op": [
"vote",
{
"author": "sichain",
"permlink": "eos-dapp",
"voter": "redbutterfly",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-08T08:57:30",
"trx_id": "86e6f5094ffed56f6827d84c54f3c58b12a30af8",
"trx_in_block": 18,
"virtual_op": 0
}2018/06/08 08:57:21
2018/06/08 08:57:21
| author | redbutterfly |
| body | 支持,已关注 |
| json metadata | {"tags":["sic"],"app":"steemit/0.1"} |
| parent author | sichain |
| parent permlink | eos-dapp |
| permlink | re-sichain-eos-dapp-20180608t085718340z |
| title | |
| Transaction Info | Block #23138118/Trx 3fb2b17a0ad121e6f29c20ed2b9a78b06ebd75bb |
View Raw JSON Data
{
"block": 23138118,
"op": [
"comment",
{
"author": "redbutterfly",
"body": "支持,已关注",
"json_metadata": "{\"tags\":[\"sic\"],\"app\":\"steemit/0.1\"}",
"parent_author": "sichain",
"parent_permlink": "eos-dapp",
"permlink": "re-sichain-eos-dapp-20180608t085718340z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-06-08T08:57:21",
"trx_id": "3fb2b17a0ad121e6f29c20ed2b9a78b06ebd75bb",
"trx_in_block": 2,
"virtual_op": 0
}redbutterflyfollowed @sichain2018/06/08 08:48:27
redbutterflyfollowed @sichain
2018/06/08 08:48:27
| id | follow |
| json | ["follow",{"follower":"redbutterfly","following":"sichain","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["redbutterfly"] |
| Transaction Info | Block #23137940/Trx 7dafe431f5c1d631114d0add76b30f727bd159c7 |
View Raw JSON Data
{
"block": 23137940,
"op": [
"custom_json",
{
"id": "follow",
"json": "[\"follow\",{\"follower\":\"redbutterfly\",\"following\":\"sichain\",\"what\":[\"blog\"]}]",
"required_auths": [],
"required_posting_auths": [
"redbutterfly"
]
}
],
"op_in_trx": 0,
"timestamp": "2018-06-08T08:48:27",
"trx_id": "7dafe431f5c1d631114d0add76b30f727bd159c7",
"trx_in_block": 54,
"virtual_op": 0
}steemdelegated 18.677 SP to @redbutterfly2018/04/11 02:34:48
steemdelegated 18.677 SP to @redbutterfly
2018/04/11 02:34:48
| delegatee | redbutterfly |
| delegator | steem |
| vesting shares | 30375.489677 VESTS |
| Transaction Info | Block #21461438/Trx e98269b12c357616f54a0301ed26b19f1c8c81d0 |
View Raw JSON Data
{
"block": 21461438,
"op": [
"delegate_vesting_shares",
{
"delegatee": "redbutterfly",
"delegator": "steem",
"vesting_shares": "30375.489677 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-11T02:34:48",
"trx_id": "e98269b12c357616f54a0301ed26b19f1c8c81d0",
"trx_in_block": 17,
"virtual_op": 0
}steemcreated a new account: @redbutterfly2018/04/11 01:22:09
steemcreated a new account: @redbutterfly
2018/04/11 01:22:09
| active | {"account_auths":[],"key_auths":[["STM8L68gdZ31BEizGexpuwD8pKtWGUZULq4bve4Xea2kkxEP7ZadX",1]],"weight_threshold":1} |
| creator | steem |
| delegation | 30690.000000 VESTS |
| extensions | [] |
| fee | 0.100 STEEM |
| json metadata | {} |
| memo key | STM8JkpU157wEHaA9LVcr3EX2KyqJar88vRw1j6sZGwue6NkcHmGp |
| new account name | redbutterfly |
| owner | {"account_auths":[],"key_auths":[["STM86s5bihM9d7arvcX6kM6xbpPYBuAW4Qh2zs1wFk8rxBMCcUHFi",1]],"weight_threshold":1} |
| posting | {"account_auths":[],"key_auths":[["STM8Y4XRsxP46imm7hPF5cUHJLvoYHPnifcHzfE56VVNakWW1MbBH",1]],"weight_threshold":1} |
| Transaction Info | Block #21459985/Trx b296fd6e82c02b22a8e89962f4ab57d027edf361 |
View Raw JSON Data
{
"block": 21459985,
"op": [
"account_create_with_delegation",
{
"active": {
"account_auths": [],
"key_auths": [
[
"STM8L68gdZ31BEizGexpuwD8pKtWGUZULq4bve4Xea2kkxEP7ZadX",
1
]
],
"weight_threshold": 1
},
"creator": "steem",
"delegation": "30690.000000 VESTS",
"extensions": [],
"fee": "0.100 STEEM",
"json_metadata": "{}",
"memo_key": "STM8JkpU157wEHaA9LVcr3EX2KyqJar88vRw1j6sZGwue6NkcHmGp",
"new_account_name": "redbutterfly",
"owner": {
"account_auths": [],
"key_auths": [
[
"STM86s5bihM9d7arvcX6kM6xbpPYBuAW4Qh2zs1wFk8rxBMCcUHFi",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [],
"key_auths": [
[
"STM8Y4XRsxP46imm7hPF5cUHJLvoYHPnifcHzfE56VVNakWW1MbBH",
1
]
],
"weight_threshold": 1
}
}
],
"op_in_trx": 0,
"timestamp": "2018-04-11T01:22:09",
"trx_id": "b296fd6e82c02b22a8e89962f4ab57d027edf361",
"trx_in_block": 0,
"virtual_op": 0
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress0.00%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779082539
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779082539
},
"rc_account": {
"account": "redbutterfly",
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779082539
},
"max_rc_creation_adjustment": {
"amount": "2020748973",
"precision": 6,
"nai": "@@000000037"
},
"max_rc": "10164408779"
}
}Account Metadata
| POSTING JSON METADATA | |
| profile | {"profile_image":"https://cdn.steemitimages.com/DQmP1rdYGBVJiAeHGspuwSiS2eidVBHcqU34Cqo87x8KrEt/175424rgwmaw4wwd6dmszg.jpg"} |
| JSON METADATA | |
| profile | {"profile_image":"https://cdn.steemitimages.com/DQmP1rdYGBVJiAeHGspuwSiS2eidVBHcqU34Cqo87x8KrEt/175424rgwmaw4wwd6dmszg.jpg"} |
{
"posting_json_metadata": {
"profile": {
"profile_image": "https://cdn.steemitimages.com/DQmP1rdYGBVJiAeHGspuwSiS2eidVBHcqU34Cqo87x8KrEt/175424rgwmaw4wwd6dmszg.jpg"
}
},
"json_metadata": {
"profile": {
"profile_image": "https://cdn.steemitimages.com/DQmP1rdYGBVJiAeHGspuwSiS2eidVBHcqU34Cqo87x8KrEt/175424rgwmaw4wwd6dmszg.jpg"
}
}
}Auth Keys
Owner
Single Signature
Public Keys
STM86s5bihM9d7arvcX6kM6xbpPYBuAW4Qh2zs1wFk8rxBMCcUHFi1/1
Active
Single Signature
Public Keys
STM8L68gdZ31BEizGexpuwD8pKtWGUZULq4bve4Xea2kkxEP7ZadX1/1
Posting
Single Signature
Public Keys
STM8Y4XRsxP46imm7hPF5cUHJLvoYHPnifcHzfE56VVNakWW1MbBH1/1
Memo
STM8JkpU157wEHaA9LVcr3EX2KyqJar88vRw1j6sZGwue6NkcHmGp
{
"owner": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM86s5bihM9d7arvcX6kM6xbpPYBuAW4Qh2zs1wFk8rxBMCcUHFi",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM8L68gdZ31BEizGexpuwD8pKtWGUZULq4bve4Xea2kkxEP7ZadX",
1
]
]
},
"posting": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM8Y4XRsxP46imm7hPF5cUHJLvoYHPnifcHzfE56VVNakWW1MbBH",
1
]
]
},
"memo": "STM8JkpU157wEHaA9LVcr3EX2KyqJar88vRw1j6sZGwue6NkcHmGp"
}Witness Votes
0 / 30
No active witness votes.
[]