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

Detailed Balance

STEEM
balance
0.000STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
0.125SP
Delegated Out
0.000SP
Delegation In
4.882SP
Effective Power
5.007SP
Reward SP (pending)
0.000SP
SBD
sbd_balance
0.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.000SBD
{
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "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

nameredbutterfly
id931518
rank1,023,368
reputation146546336
created2018-04-11T01:22:09
recovery_accountsteem
proxyNone
post_count6
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-06-10T13:59:33
last_root_post2018-06-10T13:35:12
last_vote_time2018-06-12T07:15:39
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares203.862807 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7939.796999 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2018-06-08T08:58:36
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-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

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.882 SP to @redbutterfly
2026/05/18 05:35:39
delegateeredbutterfly
delegatorsteem
vesting shares7939.796999 VESTS
Transaction InfoBlock #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 @redbutterfly
2026/05/13 01:32:54
delegateeredbutterfly
delegatorsteem
vesting shares5227.586594 VESTS
Transaction InfoBlock #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 @redbutterfly
2026/04/26 04:48:27
delegateeredbutterfly
delegatorsteem
vesting shares7952.312755 VESTS
Transaction InfoBlock #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 @redbutterfly
2026/01/23 22:10:24
delegateeredbutterfly
delegatorsteem
vesting shares5269.133413 VESTS
Transaction InfoBlock #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 @redbutterfly
2024/12/17 17:21:03
delegateeredbutterfly
delegatorsteem
vesting shares5433.352610 VESTS
Transaction InfoBlock #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 @redbutterfly
2023/11/14 09:02:30
delegateeredbutterfly
delegatorsteem
vesting shares5602.486142 VESTS
Transaction InfoBlock #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 @redbutterfly
2023/09/22 09:34:24
delegateeredbutterfly
delegatorsteem
vesting shares8539.394928 VESTS
Transaction InfoBlock #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 @redbutterfly
2022/11/03 17:08:12
delegateeredbutterfly
delegatorsteem
vesting shares8761.446366 VESTS
Transaction InfoBlock #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 @redbutterfly
2022/01/17 22:24:15
delegateeredbutterfly
delegatorsteem
vesting shares8981.553967 VESTS
Transaction InfoBlock #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 @redbutterfly
2021/06/14 05:36:54
delegateeredbutterfly
delegatorsteem
vesting shares9165.748255 VESTS
Transaction InfoBlock #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 @redbutterfly
2020/12/11 15:49:45
delegateeredbutterfly
delegatorsteem
vesting shares9353.170229 VESTS
Transaction InfoBlock #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 @redbutterfly
2020/12/06 09:25:45
delegateeredbutterfly
delegatorsteem
vesting shares1912.543513 VESTS
Transaction InfoBlock #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 @redbutterfly
2020/12/05 19:27:45
delegateeredbutterfly
delegatorsteem
vesting shares9359.378083 VESTS
Transaction InfoBlock #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 @redbutterfly
2020/11/03 01:21:54
delegateeredbutterfly
delegatorsteem
vesting shares1920.017158 VESTS
Transaction InfoBlock #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 @redbutterfly
2020/05/09 10:28:09
delegateeredbutterfly
delegatorsteem
vesting shares9562.183442 VESTS
Transaction InfoBlock #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 @redbutterfly
2020/05/08 14:46:45
delegateeredbutterfly
delegatorsteem
vesting shares1953.311140 VESTS
Transaction InfoBlock #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 @redbutterfly
2019/11/01 09:15:24
delegateeredbutterfly
delegatorsteem
vesting shares9668.582525 VESTS
Transaction InfoBlock #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
authorsteemitboard
bodyCongratulations @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/![](https://cdn.steemitimages.com/DQmYKnawrtqFCShyVvVs4QS7548eretcMUKQJc3D2f69pb9/image.png)"></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 authorredbutterfly
parent permlinkeos
permlinksteemitboard-notify-redbutterfly-20190411t030844000z
title
Transaction InfoBlock #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/![](https://cdn.steemitimages.com/DQmYKnawrtqFCShyVvVs4QS7548eretcMUKQJc3D2f69pb9/image.png)\"></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 @redbutterfly
2018/11/26 19:11:06
delegateeredbutterfly
delegatorsteem
vesting shares9866.057902 VESTS
Transaction InfoBlock #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 @redbutterfly
2018/08/16 00:01:27
delegateeredbutterfly
delegatorsteem
vesting shares30172.858230 VESTS
Transaction InfoBlock #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
}
2018/08/14 08:44:30
idfollow
json["follow",{"follower":"redbutterfly","following":"chaimyu","what":["blog"]}]
required auths[]
required posting auths["redbutterfly"]
Transaction InfoBlock #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
}
2018/08/14 08:44:09
authorchaimyu
permlinkomni-usdt-raw-transaction
voterredbutterfly
weight10000 (100.00%)
Transaction InfoBlock #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 / eos
2018/07/19 02:32:12
authorredbutterfly
permlinkeos
voterchaimyu
weight10000 (100.00%)
Transaction InfoBlock #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
authormoyu
body有一个问题哦 我如果竞拍一个短名字 24小时没有人跟我抢过的话 会成交么?还是因为有别人竞拍的价格别我高而不成交呢?
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authorredbutterfly
parent permlinkre-ifttt-re-redbutterfly-eos-20180610t135929534z
permlinkre-redbutterfly-re-ifttt-re-redbutterfly-eos-20180618t111403609z
title
Transaction InfoBlock #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
}
2018/06/12 07:15:39
authorsichain
permlinkeos-helloworld
voterredbutterfly
weight10000 (100.00%)
Transaction InfoBlock #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
authorcrazybits
body时效24小时的这部分逻辑在哪里,可以贴一下源码位置吗
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authorredbutterfly
parent permlinkeos
permlinkre-redbutterfly-eos-20180611t044627130z
title
Transaction InfoBlock #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 / eos
2018/06/10 14:58:36
authorredbutterfly
permlinkeos
voterbestmz
weight10000 (100.00%)
Transaction InfoBlock #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
authorredbutterfly
body最大的问题是,即使不是你需要抢注的名字,比如你抢注 aaa,有人抢注bbb,出价比你的高。系统会优先承认bbb的,然后,你的就要**再**等24小时。他人一直在用高价抢注他们的名称,你的就会一直向后延。 明明你需要的是个没人关注的名字,但是,你要想获得这个账户名,那你就要拿出比任何名字都高的价格才行
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authorifttt
parent permlinkre-redbutterfly-eos-20180610t134209803z
permlinkre-ifttt-re-redbutterfly-eos-20180610t135929534z
title
Transaction InfoBlock #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
authorredbutterfly
body最大的问题是,即使不是你需要抢注的名字,比如你抢注 aaa,有人抢注bbb,出价比你的高。系统会优先承认bbb的,然后,你的就要**再**等24小时。他人一直在用高价抢注他们的名称,你的就会一直向后延
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authorifttt
parent permlinkre-redbutterfly-eos-20180610t134209803z
permlinkre-ifttt-re-redbutterfly-eos-20180610t135929534z
title
Transaction InfoBlock #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
}
2018/06/10 13:56:48
authorredbutterfly
permlinkre-sichain-eth-eos-token-20180610t135634658z
voterredbutterfly
weight10000 (100.00%)
Transaction InfoBlock #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
authorredbutterfly
body从普通用户的角度考虑,EOS还是很有竞争力的,毕竟,将最主要的RAM资源由公司承担,用户能够“享用”免费的资源
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authorsichain
parent permlinketh-eos-token
permlinkre-sichain-eth-eos-token-20180610t135634658z
title
Transaction InfoBlock #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
}
2018/06/10 13:54:00
authorsichain
permlinketh-eos-token
voterredbutterfly
weight10000 (100.00%)
Transaction InfoBlock #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
authorifttt
body每回出价高10%,24小时内没有更高的出价则成交,如果有人继续出价则继续等待24小时。这规则很简单、直接、公平,好像没有啥槽点啊。
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authorredbutterfly
parent permlinkeos
permlinkre-redbutterfly-eos-20180610t134209803z
title
Transaction InfoBlock #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
authorifttt
body每回出价高10%,24小时内没有更高的出价则成交,如果有人继续出价则继续等待24小时。这规则很简单、直接、公平。
json metadata{"tags":["eos"],"app":"steemit/0.1"}
parent authorredbutterfly
parent permlinkeos
permlinkre-redbutterfly-eos-20180610t134209803z
title
Transaction InfoBlock #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 / eos
2018/06/10 13:35:36
authorredbutterfly
permlinkeos
voterredbutterfly
weight10000 (100.00%)
Transaction InfoBlock #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: eos
2018/06/10 13:35:12
authorredbutterfly
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 permlinkeos
permlinkeos
titleEOS账户名竞拍有点恶心
Transaction InfoBlock #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
authorsteemitboard
bodyCongratulations @redbutterfly! You have completed some achievement on Steemit and have been rewarded with new badge(s) : [![](https://steemitimages.com/70x70/http://steemitboard.com/notifications/firstpost.png)](http://steemitboard.com/@redbutterfly) You published your First Post [![](https://steemitimages.com/70x70/http://steemitboard.com/notifications/firstvoted.png)](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 authorredbutterfly
parent permlinkbec
permlinksteemitboard-notify-redbutterfly-20180608t235144000z
title
Transaction InfoBlock #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[![](https://steemitimages.com/70x70/http://steemitboard.com/notifications/firstpost.png)](http://steemitboard.com/@redbutterfly) You published your First Post\n[![](https://steemitimages.com/70x70/http://steemitboard.com/notifications/firstvoted.png)](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
}
2018/06/08 15:20:48
authorredbutterfly
permlinkre-sichain-eos-dapp-20180608t085718340z
voterredbutterfly
weight10000 (100.00%)
Transaction InfoBlock #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 / bec
2018/06/08 15:17:30
authorredbutterfly
permlinkbec
voterredbutterfly
weight10000 (100.00%)
Transaction InfoBlock #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: bec
2018/06/08 15:17:09
authorredbutterfly
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 permlinkbec
permlinkbec
title美链(BEC)漏洞反思
Transaction InfoBlock #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-blogview
2018/06/08 15:12:57
authorredbutterfly
permlinkeos-blogview
voterubg
weight100 (1.00%)
Transaction InfoBlock #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
}
2018/06/08 15:11:15
authorredbutterfly
permlinkeos-blogview
voterredbutterfly
weight10000 (100.00%)
Transaction InfoBlock #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-blogview
2018/06/08 15:10:36
authorredbutterfly
body1、概要 关于如何编译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 permlinkeos
permlinkeos-blogview
titleEOS 的智能合约 -- blog_view
Transaction InfoBlock #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 properties
2018/06/08 08:58:36
accountredbutterfly
json metadata{"profile":{"profile_image":"https://cdn.steemitimages.com/DQmP1rdYGBVJiAeHGspuwSiS2eidVBHcqU34Cqo87x8KrEt/175424rgwmaw4wwd6dmszg.jpg"}}
memo keySTM8JkpU157wEHaA9LVcr3EX2KyqJar88vRw1j6sZGwue6NkcHmGp
Transaction InfoBlock #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-dapp
2018/06/08 08:57:30
authorsichain
permlinkeos-dapp
voterredbutterfly
weight10000 (100.00%)
Transaction InfoBlock #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
authorredbutterfly
body支持,已关注
json metadata{"tags":["sic"],"app":"steemit/0.1"}
parent authorsichain
parent permlinkeos-dapp
permlinkre-sichain-eos-dapp-20180608t085718340z
title
Transaction InfoBlock #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
}
2018/06/08 08:48:27
idfollow
json["follow",{"follower":"redbutterfly","following":"sichain","what":["blog"]}]
required auths[]
required posting auths["redbutterfly"]
Transaction InfoBlock #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 @redbutterfly
2018/04/11 02:34:48
delegateeredbutterfly
delegatorsteem
vesting shares30375.489677 VESTS
Transaction InfoBlock #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: @redbutterfly
2018/04/11 01:22:09
active{"account_auths":[],"key_auths":[["STM8L68gdZ31BEizGexpuwD8pKtWGUZULq4bve4Xea2kkxEP7ZadX",1]],"weight_threshold":1}
creatorsteem
delegation30690.000000 VESTS
extensions[]
fee0.100 STEEM
json metadata{}
memo keySTM8JkpU157wEHaA9LVcr3EX2KyqJar88vRw1j6sZGwue6NkcHmGp
new account nameredbutterfly
owner{"account_auths":[],"key_auths":[["STM86s5bihM9d7arvcX6kM6xbpPYBuAW4Qh2zs1wFk8rxBMCcUHFi",1]],"weight_threshold":1}
posting{"account_auths":[],"key_auths":[["STM8Y4XRsxP46imm7hPF5cUHJLvoYHPnifcHzfE56VVNakWW1MbBH",1]],"weight_threshold":1}
Transaction InfoBlock #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
}

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.
[]