Ecoer Logo

@morinikiz

26

CTO / Ginco.inc

steemit.com/@morinikiz
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS12.08%
Net Worth
0.823USD
STEEM
0.002STEEM
SBD
1.128SBD
Own SP
6.562SP

Detailed Balance

STEEM
balance
0.000STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.002STEEM
STEEM POWER
Own SP
6.562SP
Delegated Out
0.000SP
Delegation In
0.000SP
Effective Power
6.562SP
Reward SP (pending)
0.054SP
SBD
sbd_balance
1.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.128SBD
{
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.002 STEEM",
  "vesting_shares": "10672.807035 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "0.000000 VESTS",
  "sbd_balance": "1.000 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.128 SBD",
  "conversions": []
}

Account Info

namemorinikiz
id1000418
rank187,307
reputation1332105313
created2018-05-17T05:18:15
recovery_accountblocktrades
proxyNone
post_count2
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-05-22T09:00:03
last_root_post2018-05-22T09:00:03
last_vote_time2018-05-25T12:23:27
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power9,800
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance1.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares10672.807035 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares0.000000 VESTS
reward_vesting_balance109.810540 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-05-22T09:07:15
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 1000418,
  "name": "morinikiz",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7uS8yWjAGgXjg4jmWKjHovHQxsH2TkMuS5FiXhUBAM41552d8D",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8iHnZhndBCZPZipyfAqm7waU3Sy7gYCmgNqK5hPSb7TAjtftyN",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8HENaAV3PC1JaRsDiXuKGmDU42tTrJV95eHLTp9eAq3Jnq5DkR",
        1
      ]
    ]
  },
  "memo_key": "STM7g5AJ35RhXM2bq6hn6f722ycvai9ym1wRndsP7e7DHQCcWjpEf",
  "json_metadata": "{\"profile\":{\"profile_image\":\"https://steemitimages.com/DQmPCZfQwGis6HWqnK8St6dK4jb24NXgyBAyosqNbDJKkdh/dr-mundo-sadism.png\",\"about\":\"CTO / Ginco.inc\",\"website\":\"https://ginco.io/\"}}",
  "posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://steemitimages.com/DQmPCZfQwGis6HWqnK8St6dK4jb24NXgyBAyosqNbDJKkdh/dr-mundo-sadism.png\",\"about\":\"CTO / Ginco.inc\",\"website\":\"https://ginco.io/\"}}",
  "proxy": "",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_account_update": "2018-05-22T09:07:15",
  "created": "2018-05-17T05:18:15",
  "mined": false,
  "recovery_account": "blocktrades",
  "last_account_recovery": "1970-01-01T00:00:00",
  "reset_account": "null",
  "comment_count": 0,
  "lifetime_vote_count": 0,
  "post_count": 2,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": 9800,
    "last_update_time": 1527251007
  },
  "downvote_manabar": {
    "current_mana": 0,
    "last_update_time": 1526534295
  },
  "voting_power": 9800,
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "sbd_balance": "1.000 SBD",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "2018-06-03T06:05:42",
  "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.128 SBD",
  "reward_steem_balance": "0.002 STEEM",
  "reward_vesting_balance": "109.810540 VESTS",
  "reward_vesting_steem": "0.054 STEEM",
  "vesting_shares": "10672.807035 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "0.000000 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": 107,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "witnesses_voted_for": 0,
  "last_post": "2018-05-22T09:00:03",
  "last_root_post": "2018-05-22T09:00:03",
  "last_vote_time": "2018-05-25T12:23:27",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "vesting_balance": "0.000 STEEM",
  "reputation": 1332105313,
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 187307
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
2019/05/17 06:20:18
authorsteemitboard
bodyCongratulations @morinikiz! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@morinikiz/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/@morinikiz) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=morinikiz)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/japanese/@steemitboard/new-japanese-speaking-community-steem-meetup-badge"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmRWbAjbeETEaqSPLcpwYX1JN5pZhdPffv4q6DaBs6xvZm/image.png"></a></td><td><a href="https://steemit.com/japanese/@steemitboard/new-japanese-speaking-community-steem-meetup-badge">New japanese speaking community Steem Meetup badge</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 authormorinikiz
parent permlinkbitcoincash-bch-0
permlinksteemitboard-notify-morinikiz-20190517t062017000z
title
Transaction InfoBlock #32979128/Trx 0476d91889162999b95ee2916517d227d1ba7719
View Raw JSON Data
{
  "block": 32979128,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @morinikiz! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@morinikiz/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/@morinikiz) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=morinikiz)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/japanese/@steemitboard/new-japanese-speaking-community-steem-meetup-badge\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmRWbAjbeETEaqSPLcpwYX1JN5pZhdPffv4q6DaBs6xvZm/image.png\"></a></td><td><a href=\"https://steemit.com/japanese/@steemitboard/new-japanese-speaking-community-steem-meetup-badge\">New  japanese speaking community Steem Meetup badge</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": "morinikiz",
      "parent_permlink": "bitcoincash-bch-0",
      "permlink": "steemitboard-notify-morinikiz-20190517t062017000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-05-17T06:20:18",
  "trx_id": "0476d91889162999b95ee2916517d227d1ba7719",
  "trx_in_block": 2,
  "virtual_op": 0
}
2018/06/03 14:46:48
authormorinikiz
permlinkbitcoincash-bch-0
votercryptostudy
weight-10000 (-100.00%)
Transaction InfoBlock #23001155/Trx 46f8942e72de85d7f510b7451604ba6728e8b44f
View Raw JSON Data
{
  "block": 23001155,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "bitcoincash-bch-0",
      "voter": "cryptostudy",
      "weight": -10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-03T14:46:48",
  "trx_id": "46f8942e72de85d7f510b7451604ba6728e8b44f",
  "trx_in_block": 9,
  "virtual_op": 0
}
sjtsent 1.000 SBD to @morinikiz- "5月MVPに選ばせていただきましたので、SBD贈呈させていただきます!"
2018/06/03 06:05:42
amount1.000 SBD
fromsjt
memo5月MVPに選ばせていただきましたので、SBD贈呈させていただきます!
tomorinikiz
Transaction InfoBlock #22990733/Trx 4b1cfef32af308fc963284b32a93881ca6829921
View Raw JSON Data
{
  "block": 22990733,
  "op": [
    "transfer",
    {
      "amount": "1.000 SBD",
      "from": "sjt",
      "memo": "5月MVPに選ばせていただきましたので、SBD贈呈させていただきます!",
      "to": "morinikiz"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-03T06:05:42",
  "trx_id": "4b1cfef32af308fc963284b32a93881ca6829921",
  "trx_in_block": 27,
  "virtual_op": 0
}
morinikizreceived 0.002 STEEM, 0.128 SBD, 0.068 SP author reward for @morinikiz / bitcoincash-bch-0
2018/05/29 09:00:03
authormorinikiz
permlinkbitcoincash-bch-0
sbd payout0.128 SBD
steem payout0.002 STEEM
vesting payout109.810540 VESTS
Transaction InfoBlock #22850268/Virtual Operation #11
View Raw JSON Data
{
  "block": 22850268,
  "op": [
    "author_reward",
    {
      "author": "morinikiz",
      "permlink": "bitcoincash-bch-0",
      "sbd_payout": "0.128 SBD",
      "steem_payout": "0.002 STEEM",
      "vesting_payout": "109.810540 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-29T09:00:03",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 11
}
2018/05/27 12:39:30
authormorinikiz
permlinkbitcoincash-bch-0
voterkoichimiwa
weight10000 (100.00%)
Transaction InfoBlock #22797064/Trx cbbfede8ca994cad8cc52d2d2e7de294ff7b10d3
View Raw JSON Data
{
  "block": 22797064,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "bitcoincash-bch-0",
      "voter": "koichimiwa",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-27T12:39:30",
  "trx_id": "cbbfede8ca994cad8cc52d2d2e7de294ff7b10d3",
  "trx_in_block": 19,
  "virtual_op": 0
}
2018/05/26 13:01:33
authormorinikiz
permlinkbitcoincash-bch-0
voterzugaaan
weight10000 (100.00%)
Transaction InfoBlock #22768712/Trx e831a305dc752f01729598ee6a1e0adfe9c90841
View Raw JSON Data
{
  "block": 22768712,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "bitcoincash-bch-0",
      "voter": "zugaaan",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-26T13:01:33",
  "trx_id": "e831a305dc752f01729598ee6a1e0adfe9c90841",
  "trx_in_block": 3,
  "virtual_op": 0
}
2018/05/26 09:52:00
authormorinikiz
permlinkbitcoincash-bch-0
voterton960
weight10000 (100.00%)
Transaction InfoBlock #22764921/Trx 437a655a52c91b4d30197358a0545c7e1724ae66
View Raw JSON Data
{
  "block": 22764921,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "bitcoincash-bch-0",
      "voter": "ton960",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-26T09:52:00",
  "trx_id": "437a655a52c91b4d30197358a0545c7e1724ae66",
  "trx_in_block": 4,
  "virtual_op": 0
}
2018/05/26 08:51:27
authormorinikiz
permlinkbitcoincash-bch-0
voterfusan
weight10000 (100.00%)
Transaction InfoBlock #22763710/Trx 9e109cf1040f4e8ed989ecaea9bad609bfbc3b7b
View Raw JSON Data
{
  "block": 22763710,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "bitcoincash-bch-0",
      "voter": "fusan",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-26T08:51:27",
  "trx_id": "9e109cf1040f4e8ed989ecaea9bad609bfbc3b7b",
  "trx_in_block": 28,
  "virtual_op": 0
}
2018/05/26 03:43:42
authormorinikiz
permlinkbitcoincash-bch-0
votermekameka
weight10000 (100.00%)
Transaction InfoBlock #22757555/Trx f760cbc88c5aa6c2c530c191f87d3b9256bcde11
View Raw JSON Data
{
  "block": 22757555,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "bitcoincash-bch-0",
      "voter": "mekameka",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-26T03:43:42",
  "trx_id": "f760cbc88c5aa6c2c530c191f87d3b9256bcde11",
  "trx_in_block": 24,
  "virtual_op": 0
}
2018/05/25 12:23:27
authorwf9877
permlinkdaily-soccer-news-2018-05-25
votermorinikiz
weight10000 (100.00%)
Transaction InfoBlock #22739157/Trx fb60f7e0f443e7c87d591563fb5e11d008cb8ec1
View Raw JSON Data
{
  "block": 22739157,
  "op": [
    "vote",
    {
      "author": "wf9877",
      "permlink": "daily-soccer-news-2018-05-25",
      "voter": "morinikiz",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-25T12:23:27",
  "trx_id": "fb60f7e0f443e7c87d591563fb5e11d008cb8ec1",
  "trx_in_block": 75,
  "virtual_op": 0
}
2018/05/25 11:11:00
authormorinikiz
permlinkbitcoincash-bch-0
votersuminohou
weight10000 (100.00%)
Transaction InfoBlock #22737708/Trx 181634e419028c32037f1e6f5b3e01f798208bed
View Raw JSON Data
{
  "block": 22737708,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "bitcoincash-bch-0",
      "voter": "suminohou",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-25T11:11:00",
  "trx_id": "181634e419028c32037f1e6f5b3e01f798208bed",
  "trx_in_block": 70,
  "virtual_op": 0
}
2018/05/25 10:33:30
authormorinikiz
permlinkbitcoincash-bch-0
votershimaris
weight10000 (100.00%)
Transaction InfoBlock #22736958/Trx 0b71f5b639cb817856ab167f971c4d6a5dd7d021
View Raw JSON Data
{
  "block": 22736958,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "bitcoincash-bch-0",
      "voter": "shimaris",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-25T10:33:30",
  "trx_id": "0b71f5b639cb817856ab167f971c4d6a5dd7d021",
  "trx_in_block": 39,
  "virtual_op": 0
}
morinikizpowered up 2.246 STEEM to @morinikiz
2018/05/24 13:54:48
amount2.246 STEEM
frommorinikiz
tomorinikiz
Transaction InfoBlock #22712190/Trx ed74eccd182322778d4348cafaed2c6893cb6123
View Raw JSON Data
{
  "block": 22712190,
  "op": [
    "transfer_to_vesting",
    {
      "amount": "2.246 STEEM",
      "from": "morinikiz",
      "to": "morinikiz"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-24T13:54:48",
  "trx_id": "ed74eccd182322778d4348cafaed2c6893cb6123",
  "trx_in_block": 29,
  "virtual_op": 0
}
2018/05/22 23:02:51
authormorinikiz
permlinkbitcoincash-bch-0
votertomokazu-kozuma
weight10000 (100.00%)
Transaction InfoBlock #22665928/Trx 1e93f792f7cb9c661d39ff8aa0d9c45964aa754a
View Raw JSON Data
{
  "block": 22665928,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "bitcoincash-bch-0",
      "voter": "tomokazu-kozuma",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-22T23:02:51",
  "trx_id": "1e93f792f7cb9c661d39ff8aa0d9c45964aa754a",
  "trx_in_block": 34,
  "virtual_op": 0
}
2018/05/22 09:19:03
authormorinikiz
permlinkbitcoincash-bch-0
voterswagger
weight2 (0.02%)
Transaction InfoBlock #22649457/Trx 80fc8acc99f153d1a91605e85188167121a68df1
View Raw JSON Data
{
  "block": 22649457,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "bitcoincash-bch-0",
      "voter": "swagger",
      "weight": 2
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-22T09:19:03",
  "trx_id": "80fc8acc99f153d1a91605e85188167121a68df1",
  "trx_in_block": 14,
  "virtual_op": 0
}
2018/05/22 09:11:30
authormorinikiz
permlinkbitcoincash-bch-0
votermorinikiz
weight10000 (100.00%)
Transaction InfoBlock #22649306/Trx 7e9b6e2b2304f6b193f3f141b6e18d1a7d0a81b5
View Raw JSON Data
{
  "block": 22649306,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "bitcoincash-bch-0",
      "voter": "morinikiz",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-22T09:11:30",
  "trx_id": "7e9b6e2b2304f6b193f3f141b6e18d1a7d0a81b5",
  "trx_in_block": 83,
  "virtual_op": 0
}
morinikizupdated their account properties
2018/05/22 09:07:15
accountmorinikiz
json metadata{"profile":{"profile_image":"https://steemitimages.com/DQmPCZfQwGis6HWqnK8St6dK4jb24NXgyBAyosqNbDJKkdh/dr-mundo-sadism.png","about":"CTO / Ginco.inc","website":"https://ginco.io/"}}
memo keySTM7g5AJ35RhXM2bq6hn6f722ycvai9ym1wRndsP7e7DHQCcWjpEf
Transaction InfoBlock #22649221/Trx 7a4bee482c7e1e8493691bd4c9a7faed0a2e6caa
View Raw JSON Data
{
  "block": 22649221,
  "op": [
    "account_update",
    {
      "account": "morinikiz",
      "json_metadata": "{\"profile\":{\"profile_image\":\"https://steemitimages.com/DQmPCZfQwGis6HWqnK8St6dK4jb24NXgyBAyosqNbDJKkdh/dr-mundo-sadism.png\",\"about\":\"CTO / Ginco.inc\",\"website\":\"https://ginco.io/\"}}",
      "memo_key": "STM7g5AJ35RhXM2bq6hn6f722ycvai9ym1wRndsP7e7DHQCcWjpEf"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-22T09:07:15",
  "trx_id": "7a4bee482c7e1e8493691bd4c9a7faed0a2e6caa",
  "trx_in_block": 9,
  "virtual_op": 0
}
morinikizupdated their account properties
2018/05/22 09:06:57
accountmorinikiz
json metadata{"profile":{"profile_image":"https://steemitimages.com/DQmPCZfQwGis6HWqnK8St6dK4jb24NXgyBAyosqNbDJKkdh/dr-mundo-sadism.png","about":"CTO Ginco.inc","website":"https://ginco.io/"}}
memo keySTM7g5AJ35RhXM2bq6hn6f722ycvai9ym1wRndsP7e7DHQCcWjpEf
Transaction InfoBlock #22649215/Trx cb2e1df09c6eb34e7552323535461818bcfe4bf1
View Raw JSON Data
{
  "block": 22649215,
  "op": [
    "account_update",
    {
      "account": "morinikiz",
      "json_metadata": "{\"profile\":{\"profile_image\":\"https://steemitimages.com/DQmPCZfQwGis6HWqnK8St6dK4jb24NXgyBAyosqNbDJKkdh/dr-mundo-sadism.png\",\"about\":\"CTO Ginco.inc\",\"website\":\"https://ginco.io/\"}}",
      "memo_key": "STM7g5AJ35RhXM2bq6hn6f722ycvai9ym1wRndsP7e7DHQCcWjpEf"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-22T09:06:57",
  "trx_id": "cb2e1df09c6eb34e7552323535461818bcfe4bf1",
  "trx_in_block": 5,
  "virtual_op": 0
}
morinikizupdated their account properties
2018/05/22 09:00:48
accountmorinikiz
json metadata{"profile":{"profile_image":"https://steemitimages.com/DQmPCZfQwGis6HWqnK8St6dK4jb24NXgyBAyosqNbDJKkdh/dr-mundo-sadism.png"}}
memo keySTM7g5AJ35RhXM2bq6hn6f722ycvai9ym1wRndsP7e7DHQCcWjpEf
Transaction InfoBlock #22649092/Trx c91d3a1bb21ef1a948fdf70a3761c055059fce9b
View Raw JSON Data
{
  "block": 22649092,
  "op": [
    "account_update",
    {
      "account": "morinikiz",
      "json_metadata": "{\"profile\":{\"profile_image\":\"https://steemitimages.com/DQmPCZfQwGis6HWqnK8St6dK4jb24NXgyBAyosqNbDJKkdh/dr-mundo-sadism.png\"}}",
      "memo_key": "STM7g5AJ35RhXM2bq6hn6f722ycvai9ym1wRndsP7e7DHQCcWjpEf"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-22T09:00:48",
  "trx_id": "c91d3a1bb21ef1a948fdf70a3761c055059fce9b",
  "trx_in_block": 21,
  "virtual_op": 0
}
morinikizpublished a new post: bitcoincash-bch-0
2018/05/22 09:00:03
authormorinikiz
body# 1. 序論  2017年8月1日にBitcoin (以下BTC) からハードフォークした BitcoinCash (以下BCH) は BTC の RBF (replace-by-fee) の機能を削除することにより、0承認を実現しようとしている。支払われた値が承認されるまでユーザが約10分間待たされるようでは、一般への普及は現実的ではないため、0承認は BCH のビジョンの [Peer-to-Peer Electronic Cash](https://www.bitcoincash.org/)[1] になるための非常に重要な機能の一つである。  しかし、現時点において、BCHの0承認のセキュリティについては多くの議論が繰り広げられている途中である。これについて、参加している人のBCHへの理解度がまばらであるために、出処の不明確な仕様を元にした思想の押し付け合いのようなものになっていることをよく見かける。そこで、**我々は0承認についての疑問を検証し、確かなエビデンスを残すことで、議論の生産性を高め、BCHコミュニティの健全な発展の手助けになりたい**と考えた。 ## 1.1 RBFと0承認  上で述べたようにBCH には BTC に存在する RBF (replace-by-fee) の機能がない。RBF を簡単に説明すると、アドレスや値に誤りがあるトランザクションを送ってしまっても、以前のトランザクションより手数料を高く設定し再送することで、トランザクションが上書きされるというものである。これにより、BTC はトランザクションがブロックに取り込まれるまでの間であれば、トランザクションのキャンセルができる。これは、ブロックに取り込まれることをデータのコミットとするブロックチェーンの仕様を利用した良い機能である。しかし、ブロックに取り込まれないことには取引が完了しないので送金の即時性は失われることになる。  一方、BCH ではこの BRF を削除し、トランザクションがブロードキャストされた時点でコミットされたこととする0承認が可能であるとした。もっとも、ブロックチェーンである以上、最終的にブロックに取り込まれなければならないので、ブロックサイズを大幅に拡大することで全てのトランザクションが確実にブロックに取り込まれることを前提とした仕様である。 ## 1.2 0承認の疑問点  本記事では、0承認に関する議論でよく挙げられる以下の5点に関して述べる。 - BCHネットワークにおいて、2重支払いが起きているのかどうかを検証する - 実際に2重支払いが起きていた場合、何が原因でそれが起きたのかを検証する - 0承認とトランザクション手数料の関係性について検証する - 0承認とマイニングの関係性について検証する - 2重支払いの実現可能性について考察する # 2. 検証  以下に今回の検証に使用した環境を示す。 - OS: Ubuntu 16.04 - デーモン: Bitcoin ABC:0.17.1 - ネットワーク: testnet3 ## 2.1 2重支払いの確認  0承認が可能とされるBCHにおいて2重支払いは起きていないのかどうかを検証する。 そのためには、0承認における2重支払いとはどういうことなのか理解する必要がある。図1に2重支払いの概略図を示す。 <center>![double_spend1.png](https://steemitimages.com/DQmaRzD4QsZUPHu7YtZTEXzqCEhzW4afrZKBq3yJqsaTC6J/double_spend1.png)</center> <center>図1 2重支払いの概略図 </center>  図1には3つの登場人物がいる。それぞれユーザ、ショップ、マイナーとする。まず(図1-①)、ユーザはお店に代金としていくらかのBCHを支払うトランザクションAを作成し、それをショップのノードに送信する。ショップはトランザクションAを受取、その取引を承認する。次に(図1-②)、ユーザはトランザクションAの `input` に含まれる `UTXO` と同じ `UTXO` を `input` に含むトランザクションBを作成し、Minerに送信する。マイナーはトランザクションBをブロックに取り込み、ブロックをブロードキャストする。最後に(図1-③)、そのブロックを受け取ったショップは承認したはずのトランザクションAが消滅し、トランザクションBに置き換わったように見える。これが、0承認における2重支払いである。  本検証では、2重支払いを確認するために次に示すBCHの2重支払いのログを表示するWebサービスを用いた。 - [Bitcoin Cash double spends](https://doublespend.cash/) [2] [[2]](https://doublespend.cash/) を見る限り、4月には最低28回の2重支払いがあったことがわかる。[BitInfoCharts](https://bitinfocharts.com/comparison/bitcoin%20cash-transactions.html) から4月のトランザクション数を算出してみると約525kトランザクションであった。したがって、19kトランザクションに1回の確率で2重支払いが起きていることになる。クレジットカードなどの既存の決済システムのトランザクションの失敗率などが不明なため比較できないが、決済プロトコルに要求される最低限の信頼性について一度考える必要がある。  このことから、**BCHは0承認における2重支払いが存在する**ということが分かった。 ## 2.2 2重支払いの原因  2.1 にて、2重支払いが起こることは確認できたが、なぜこのようなことが起きるのか検証をする。まず、2重支払いの原因に関する記事として、以下の2つを参照されたい。 - [Double Spending a 0-Conf Bitcoin Transaction](https://jasonc.me/blog/bitcoin-double-spend) [3] - [Why is this transaction won't be propagated to all nodes?](https://github.com/Bitcoin-ABC/bitcoin-abc/issues/127) [4] これらの記事に共通していえるのは、あるトランザクションを送信したときに他ノードに伝播されるのを確認できなかったが、最終的にブロックに入ったということである。 [[3]](https://jasonc.me/blog/bitcoin-double-spend) では 2.1 で説明した2重支払いがまさに起こっている。原因として考えられるのは [[4]](https://github.com/Bitcoin-ABC/bitcoin-abc/issues/127) のコメントにある、「一定の手数料以下 (デフォルトでは `1satoshi/byte`) のトランザクションは伝播されない」である。以下 `satoshi/byte` は `s/b` とする。  では、なぜこの仕様が2重支払いの原因となってしまうのかを説明する。図2, 3, 4, 5に2重支払いが起きるときのネットワークの状態を示す。このネットワークには伝播させるトランザクションの最低手数料設定 (minimum relay transaction fee) が異なったノードが存在しているおり、ショップ、マイナーAが `1s/b`、ユーザ、ノードB、マイナーBが `0.1s/b` と設定しているとする。また、マイナーAは `1s/b` 以上、マイナーBは `0.1s/b`以上のトランザクションを `mempool` からブロックに取り込むものとする。  まず(図2を参照)、ユーザは手数料が `0.1s/ b` のトランザクションAをブロードキャストする。このトランザクションAが伝播されるのは最低手数料を `0.1s/b` に設定しているノードB、マイナーBだけである。したがって、ノードBとマイナーBのmempoolにはトランザクションAが存在し、ショップ、マイナーAのmempoolにはトランザクションAが存在しない状態となる。 <center>![double_spend2-1.png](https://steemitimages.com/DQmZCoiLrjFyG24Bua6fgTo4tQQhwcNoUExpgvLWJ36ZjAB/double_spend2-1.png)</center> <center>図2 2重支払いが起きるときにネットワークの状況1</center>  次に(図3を参照)、ユーザはトランザクションAと同じ `UTXO` を `input` に含み、手数料を `1s/b`に引き上げたトランザクションBをブロードキャストする。このトランザクションBは全てのノードの最低手数料設定を上回るため、ネットワーク全体に伝播されることが可能である。しかし、ノードBとマイナーBにはすでに同じ `UTXO` をもったトランザクションAが `mempool` に存在するため、これらのノードからは、トランザクションBは棄却されてしまう。したがって、ショップとマイナーAの `mempool` にはトランザクションBが、ノードBとマイナーBの `mempool` にはトランザクションAが存在する状態となる。これは**ネットワークが最低手数料設定によって分断されたような形になっている**といえるだろう。 <center>![double_spend2-2.png](https://steemitimages.com/DQmUqM8KczEqi6SfX9KxHzUp1UBsXpJKHTYpLHedckAnE6p/double_spend2-2.png)</center> <center>図3 2重支払いが起きるときにネットワークの状況2</center> ここで、マイナーBがマイナーAよりも先にブロックのマイニングに成功すると(図4)、そのブロックは最低手数料設定に関係なく全てのノードに伝搬される。 <center>![double_spend2-3.png](https://steemitimages.com/DQmR8xK8AmaHacGrvJtqhgksxk52pbKni45EAkiQbEcrVQ1/double_spend2-3.png)</center> <center>図4 2重支払いが起きるときにネットワークの状況3</center> 最終的に(図5)、ブロックが全てのノードのチェーンに取り込まれ、ショップ、マイナーAのmempoolに存在していたトランザクションBは消滅する。 <center>![double_spend2-4.png](https://steemitimages.com/DQmR69AyfDdKLjDJnVVi7biTFAVppvTKEAAk9EhYjcXCaXj/double_spend2-4.png)</center> <center>図5 2重支払いが起きるときにネットワークの状況4</center> 以上が最低手数料設定の仕様が2重支払いを引き起こす原因となるロジックである。 ## 2.3 0承認とトランザクション手数料の関係性  ここで新たな疑問が生まれた。**それはノードが最低手数料の設定によってどのような挙動を示すのか**ということだ。そこで、実際にノードを用意し検証してみることにした。用意したノードは2つでそれぞれをノードA、ノードBとする。まずは、両ノードとも最低手数料設定である `-minrelaytxfee`オプションをデフォルトの `0.00001` (1s/b) とした。また、ノードAとノードBが確実にP2P接続されるように、`-addnode` オプションでお互いのノードを指定した。さらに送金の前準備として [Bitcoin Cash Testnet Faucet](https://testnet.manu.backend.hamburg/bitcoin-cash-faucet) より、13BCHを引き出した。 - [13BCH引き出しのトランザクション履歴](https://www.blocktrail.com/tBCC/tx/92bca99ef8e20874edc7551c65f79226399e14e56a5faefa84d6362bde42e332?txoutIdx=0) ### 2.3.1 手数料: 0satoshi/byte  まず、手数料を0satoshiとしてノードAに `sendrawtransaction` でトランザクションを送ってみるとリクエストは成功し、トランザクションハッシュとして `65f02468ef35297bfa43f3b341d5f4d83b122d0bc700ac8646c7dab8906336a4` が返ってきた。さらに、ノードAに対して`getrawtransaction` で先のハッシュを取得すると正しいトランザクションデータが得られたので、ノードAの `mempool` には、手数料が0satoshiのトランザクションが存在していることがわかる。以下にそのトランザクションデータを示す。 ``` RawTransaction: 010000000132e342de2b36d684faae5f6ae5149e392692f7651c55c7ed7408e2f89ea9bc92000000006a473044022023f990ddd8a171169f4dff082c09eae867d2697c52a22aeedfff4aceaba2f04c0220550d039f6377fd82081a59b7e04566d38b994e19c38bde76ab7c7afacc3223a34121025b2c1ea20968be0d04d66186a34e6537355652ca6a9c5a5cea1e05adfd517688ffffffff01006d7c4d000000001976a914fcf1b5f4847caf32e3d1471a22bc9500b6ae7cc888ac00000000 ``` 30分後、このトランザクションを各ノードに問い合わせてみると、ノードAではリクエストに成功するが、ノードBでは以下のようなエラーとなった。 ``` "No such mempool or blockchain transaction. Use gettransaction for wallet transactions." ``` <center>![0sb.png](https://steemitimages.com/DQmTPvGJKn5iD2HdZAr2kT5x1Z3dndh6RhBuZ7Ch946viWL/0sb.png)</center> <center>図6 0s/bのトランザクションを送信した場合のノードの状態</center> このことから、手数料が0satoshiのトランザクションはノードAの `mempool` には存在するが、ノードBには伝播されず、ブロックにも取り込まれていないことがわかる。この状態が起こる原因として、以下が考えられる。 - 最低手数料が0satoshiのマイナーがいない - 最低手数料が0satoshiのマイナーのハッシュレートが低い - トランザクションが最低手数料が0satoshiのマイナーに届かなかった - ノードAの接続先が、最低手数料が0satoshiのマイナーに接続されていなかった これらの場合、このトランザクションがブロックに取り込まれることはないのでノードAの `mempool` に残り続けることになる。これでは `input` に含まれる `UTXO` はロックされたと同じことになってしまう。これを解消するには、手数料をマイナーの最低手数料以上に上げて、ノードA以外のノードにトランザクションを送信する必要があるが、ノードを選択できないウォレットではこれを行うのは難しいだろう。ただし、ライブネットで検証した結果では、送信先ノードの最低手数料以下のトランザクションの場合エラーとなったので大きな問題ではなさそうである。ノードのプログラムには、このようなテストネットとライブネットで仕様が違う点がいくつか存在するため、把握せず開発を進めると思わぬバグを生む可能性があるので注意が必要だ。 ### 2.3.2 手数料: 1satoshi/byte  次に、デフォルトの最低手数料である `1s/b` のトランザクションの場合を検証した。`satoshi/byte` の単位から分かる通り、手数料分のsatoshiをトランザクションのバイトサイズで割ったものが基準となるため、トランザクションサイズ `192byte` に対して `192satoshi` を手数料とした。おおよそのトランザクションのサイズは以下の式で求められる。 ``` 148 * input数 + 34 * output数 ± 10 ``` この式についての説明は本記事では割愛するが、トランザクションのデータ構造を知っていれば簡単に理解できるので、気になった方は調べてみてほしい。 この手数料が `1s/b`のトランザクションをノードAに送信してみるとトランザクションハッシュ `375e68bca5ae3803ada0c9dfa2ca962c56f5b234bb479f5c1eff5a3298e0d68f`が得られ、ノードAに対してこのハッシュによる`getrawtransaction` が成功した。その後、同ハッシュでノードBに対しての `getrawtransaction` も成功したので正しくトランザクションが伝播されている。 ``` # getrawtransactionのレスポンス # ノードA {"result":"0100000001712efe66381cec7c46a4539ab52dd9a8ed5cb239fe4d4828e0901abfb984733d000000006b483045022100f19914d637fbf8de663eb29f599de3421973be71f0978c241618f42e056cd92102200567838f42f028f3ea2bbc0df4610172bafd35199537c8fbbfb581dbb140ee30412103e12dda97990ced7f0e0b6966fca82f79fb3fda88e38d50697e916fccf2f40759ffffffff01fc687c4d000000001976a914f8ba5954cde0b3d9e65d2c6561b772ac3b69ecb188ac00000000","error":null,"id":"97588544-72b7-4824-857e-4823247c9375"} # ノードB {"result":"0100000001712efe66381cec7c46a4539ab52dd9a8ed5cb239fe4d4828e0901abfb984733d000000006b483045022100f19914d637fbf8de663eb29f599de3421973be71f0978c241618f42e056cd92102200567838f42f028f3ea2bbc0df4610172bafd35199537c8fbbfb581dbb140ee30412103e12dda97990ced7f0e0b6966fca82f79fb3fda88e38d50697e916fccf2f40759ffffffff01fc687c4d000000001976a914f8ba5954cde0b3d9e65d2c6561b772ac3b69ecb188ac00000000","error":null,"id":"48784a9d-3a18-4882-b12f-13ab91acc3bf"} ``` <center>![1sb (1).png](https://steemitimages.com/DQmW2BiqxFYYrPKCvmDQnZJJHewkAV3HsNv5taVSG4fzD16/1sb%20(1).png)</center> <center>図7 1s/bのトランザクションを送信した場合のノードの状態</center> ### 2.3.3 手数料: 0.99satoshi/byte  `0s/b` と `1s/b` の挙動は確認できたので、次は0以上1未満の場合も検証してみる。サイズ`192byte` に対して `191satoshi`を手数料をとした `0.995s/b`のトランザクションを作成した。これも上記と同様にノードAに送信し、ノードBで確認できるか試したところ `0satoshi/byte` の結果と同じになった。 ``` # ノードAへのsendtransaction { result: '01000000018fd6e098325aff1e5c9f47bb34b2f5562c96caa2dfc9a0ad0338aea5bc685e37000000006b483045022100be1da4b299a7fd9a19c2823f4eb398b63f38271b31e07e9a1a8b6e942a4138b4022031fb218c777cf49cdf53323c2e25fd8a2fd45837a831ff0444ce069dc81758a7412103e12dda97990ced7f0e0b6966fca82f79fb3fda88e38d50697e916fccf2f40759ffffffff013d687c4d000000001976a914f8ba5954cde0b3d9e65d2c6561b772ac3b69ecb188ac00000000', error: null, id: '4ef0d9e1-ed9f-489b-80f1-855442115632' } # ノードBへのgetrawtransaction {"result":null,"error":{"code":-5,"message":"No such mempool or blockchain transaction. Use gettransaction for wallet transactions."},"id":"930f56e1-dcfb-4507-a8bb-269244f951c3"} ```  この状態でノードBに対して手数料を `1s/b` に引き上げて送信すると成功となり、トランザクションハッシュが得られた。このトランザクションをノードAに問い合わせると、エラーとなった。これは、RBFの機能がないために、Bに送信したトランザクションはノードAで棄却されるからである。ノードAには `0.99s/b` トランザクションが、ノードBには `1s/b` のトランザクションが存在しており、図3と類似した状態となっている。ここで、2.3.1 の結果と同様に `0.995s/b` のトランザクションはブロックに取り込まれず、後から送信した `1s/b`のトランザクションがブロックに取り込まれた。その後、`0.995s/b` のトランザクションを両ノードに問い合わせるとどちらもエラーとなったため、ブロックに取り込まれなかった方が正しく `mempool` から削除されたことが確認できた。つまり、**2重支払いを意図的に起こせた**ことになる。 ``` # ノードA {"result":null,"error":{"code":-5,"message":"No such mempool or blockchain transaction. Use gettransaction for wallet transactions."},"id":"239b2753-95c3-4eaf-9cef-95420a6726e3"} # ノードB {"result":null,"error":{"code":-5,"message":"No such mempool or blockchain transaction. Use gettransaction for wallet transactions."},"id":"6b3af65c-72f3-4914-9a68-032ad9849774"} ``` <center>![0995sb (1).png](https://steemitimages.com/DQmPkxbLJ3R2EvQ5cFeUrzuFdVJQd67nyjgSKA3WuiRuieL/0995sb%20(1).png)</center> <center>図8 0.995s/bと1s/bのトランザクションを送信した場合のノードの状態</center> ### 2.3.4 トランザクションレース  ここで気になるのが、図3-2のようにネットワーク上に同じinputを持つ複数のトランザクションが存在していた場合どちらが早く伝播されるのかである。これを検証するためにノードAの最低手数料を `0.1s/b` に設定し、 `0.1s/b` のトランザクションを送信する。続いて、ノードBは最低手数料はデフォルトの `1s/b` に設定し、 `1s/b` のトランザクションを送信する。そして、ブロックが取り込まれる前にノードBの最低手数料を `0.1s/b` に設定し、再起動することでノードBに `0.1/sb` と `1s/b` の両方が送られてくる状態を用意した。結果としては、10回中10回が `1s/b` のトランザクションが先に `mempool` に入り、 `0.1s/b` のトランザクションは観測できなかった。この結果については、 `bootnode` に設定されているノードが `1s/b` であるため、ノードBに接続される前に `1s/b` のトランザクションが到達していると考えられる。特定のノードだけに接続されるようになる `-connect` オプションを使って自前のノードだけで試してみると、先に接続されたノードが持つトランザクションが毎回 `mempool` に入ったのでこの予測は正しかったといえる。以上のことを踏まえると、**ネットワークを構成しているノードの最低手数料設定が伝播の速度に関係していると考えられる。つまり、ネットワーク内にどれだけ低い手数料を許容するノードが存在しているかが重要になってくる**のである。 <center>![race.png](https://steemitimages.com/DQmdNYykdWwYKoShg3Y1Rv7qgG113Y2ehCaq1pw1oJn6Pnr/race.png)</center> <center>図8 トランザクションレース</center> ## 2.4 0承認とマイニングの関係性  0承認の理論的には、マイニングに関係なくトランザクションがそのノードで観測できた時点で承認となる。ただし、これは送信したトランザクションがもれなく全てブロックの入ることを前提としている。そのために、BCHはブロックサイズを大幅に拡大しており、それによって手数料が非常に低くなっている。 しかし、**手数料が低いということはそれだけたくさんのトランザクションを送ることができるということだ。つまり、DOSアタックが低リスクで行えてしまう。そこで、DOSアタックを実際に行ってみて、BCHネットワークがどのような挙動をするのか**検証してみた。検証方法は、あるトランザクションからUTXOを次々とチェインする形でトランザクションを作成し、それを一気にノードAに対して送信した。その結果を以下に示す。 ``` No.1 : 1299988220 -> 1299988028 (fee: 192) 8b00931a95fd880cf2daa007ae355e4028c008279f295f0c7385a26ce5180b64 No.2 : 1299988028 -> 1299987836 (fee: 192) b02dd75db57ea98349aa26da2250ab1a86c13faa522347bdcda6ff71484b43d6 No.3 : 1299987836 -> 1299987644 (fee: 192) 1f0e3269f6fa2c4f0d83f82a57cfdc691aabb1bc651acd322b6b809e6b69926a No.4 : 1299987644 -> 1299987452 (fee: 192) 36277ae693b76ffedc1675273292556441405e5ff648d51548371de6bd259c35 No.5 : 1299987452 -> 1299987260 (fee: 192) d44784bbeba0ce5bb795e362b16f139bfc8e38f48c91805dd40ba779765314e6 No.6 : 1299987260 -> 1299987068 (fee: 192) a25869729031b7375a6ba36c3d2d7161970ab7796cd74c6160845710601b2dac No.7 : 1299987068 -> 1299986876 (fee: 192) 2dbb164454e34c1ffe4805ed4534092e1894c3d4d021a03500b4c36779b01d78 No.8 : 1299986876 -> 1299986684 (fee: 192) 2268c09f54fb0891e3d73eb860d5aef867395a41020188ee6c220e7c7da21b0d No.9 : 1299986684 -> 1299986492 (fee: 192) 40b475df74bec109b61f26ca77fb15b1b5c41c5507f51262c7924ead4dcbd65d No.10 : 1299986492 -> 1299986300 (fee: 192) 5ae830205a71bcb44c0fca2a362281812e57c19c4272fc956ab9de315bcb2fac No.11 : 1299986300 -> 1299986108 (fee: 192) 65071be3b2f596fdb96b4b3e6af9b2043dedc6e838bdc6d720f25caf3335f29e No.12 : 1299986108 -> 1299985916 (fee: 192) 945df80d3473a886d1c1e8068611482f6719afcf33204d31b0ae637fffc8885c No.13 : 1299985916 -> 1299985724 (fee: 192) b99f87197b4c40dd8b13bdc5e501c95c74b60c143883bf85eb157de03e4f585e No.14 : 1299985724 -> 1299985532 (fee: 192) f6c8d067b10700c03d2a661e6f1920e40bace43147a1e30730b1f4611518f273 No.15 : 1299985532 -> 1299985340 (fee: 192) 64e393255ad6d309b0ddc88880d932252a3442589fe76928c66d73e1c4602626 No.16 : 1299985340 -> 1299985148 (fee: 192) 85337c90863ceaaef1cf0eb37bf76090c7622eaf16d986079bf337a5dd4cf2b0 No.17 : 1299985148 -> 1299984956 (fee: 192) 20f855ccf0eb1b5fee04e827a6d73b16216837419aef8bb73fbd93ce69570983 No.18 : 1299984956 -> 1299984764 (fee: 192) 0e12ac930b772f7407732a0aa181d7dcabc268889057246dc04d73f54fbe8b5f No.19 : 1299984764 -> 1299984572 (fee: 192) 33c72b114cf7b845d928f854899a2f61870359cc870c6f970a834d1bad615bbd No.20 : 1299984572 -> 1299984380 (fee: 192) fe40a18a0ad1e607c8de741a26a9e8010d9826d09924f61521b3b24318a87268 No.21 : 1299984380 -> 1299984188 (fee: 192) 9867c2e852c8b4b0d9d725af6ad3acb91be02d2a8354e9b09c3ea07eb5bbd5cc No.22 : 1299984188 -> 1299983996 (fee: 192) 9908c180688f0f34d9d9ac3e9e5c0711edc018b817c633efc274c1b3c6602e08 No.23 : 1299983996 -> 1299983804 (fee: 192) b69fe1eaaec2c093ad6f1a1c6d255baf5bd87979793f3c7dfe1ae29f11401268 No.24 : 1299983804 -> 1299983612 (fee: 192) 62ddcbf9b2107e7cb40d68302ecc1907d4fd623a8e044b981599eaa337c14432 No.25 : 1299983612 -> 1299983420 (fee: 192) 655446acae704b1f6c98540492a41833d1cfccda1d2801e734abcdb421a603dd No.26 : 1299983420 -> 1299983228 (fee: 192) {"result":null,"error":{"code":-26,"message":"64: too-long-mempool-chain"},"id":"86ee6b7c-8284-477d-819a-1cef8e6ab5f6"} ``` この結果を見ると25個目までは順調に送信できたが、26個目で `too-long-mempool-chan` というエラーが出た。調べてみると以下のソースを見つけた。 ``` # bitcoin-abc/src/validation.h:69 /** Default for -limitancestorcount, max number of in-mempool ancestors */ static const unsigned int DEFAULT_ANCESTOR_LIMIT = 25; ``` ``` # bitcoin-abc/src/validation.cpp:981 if (!pool.CalculateMemPoolAncestors( entry, setAncestors, nLimitAncestors, nLimitAncestorSize, nLimitDescendants, nLimitDescendantSize, errString)) { return state.DoS(0, false, REJECT_NONSTANDARD, "too-long-mempool-chain", false, errString); } ```  これを見る限り、トランザクションのバリデーションで `mempool` に存在する**祖先トランザクションが25個以上の場合はDOSと判断され、エラーを返すようになっている**ようだ。` -limitancestorcount` オプションでこれを変更できるようなので指定してみたが、我々の環境では25からは変更されなかった。ヘルプにも存在しないので消えたオプションなのだろうか。自前のノードだけ変更できたとしてもネットワーク全体がこの制限を一斉に上げない限り有効性は低いため、**現状ではトランザクションをチェインした0承認はブロックに取り込まれなければ25回までしかできないということになる。したがって、0承認の理論的にはマイニングが関係ないはずではあるものの、現状のノードはDOS攻撃に備えた実装になっているため、注意が必要である。**  BCHでは、マイナーによって1時間以上ブロックが採掘されないことが発生することもあり、大量のトランザクションを一定時間に集中して送るようなケースでは、この仕様を理解しておく必要があるだろう。 <center>![dos.png](https://steemitimages.com/DQmekeuWzZzYCg96HB7e4uj1WAheCYPs1hBe9VwPB6GgLk6/dos.png)</center> <center>図9 大量にトランザクションを送信した結果</center> ## 2.5 2重支払いの実現可能性  上記の検証で意図的に2重支払いを引き起こすことはできたが、全てテストネットによるものである。ここからは、ライブネットで2重支払いを意図的に行えるのかどうか検証する。まず重要なのはデフォルトである最低手数料の `1s/b` 以下のトランザクションを送信したときに、それがマイニングされるかどうかである。実際にライブネットで手数料を `0.95s/b` に設定して送信すると、約2時間でマイニングされた。以下にトランザクション詳細を示す。 - [c4d514c538323f9aedb361aedecc9feaad63cfb6e8d7698cf1a0f7a09c342aa9](https://www.blocktrail.com/BCC/tx/c4d514c538323f9aedb361aedecc9feaad63cfb6e8d7698cf1a0f7a09c342aa9) これより、デフォルトの `1s/b` 以下の手数料でもブロックに取り込むマイナーがいることが確認できた。つまり、ライブネットでも2重支払いができる可能性があるということだ。また、このトランザクションはブロックに取り込まれるまでは主要なブロックエクスプローラーでは観測できなかったため、これらのノードの最低手数料設定は `1s/b` だということが考えられる。2重支払いの成功率は `1s/b` 以下のトランザクションを受け付けるマイナーが占めるハッシュレートに依存するため、`1s/b` 未満のトランザクションが含まれるブロックのマイナーを調べた。確認できたのは [AntPool](https://www.blocktrail.com/BCC/tx/d12ab42b4ec7e91eaa889ddf3b872e6a493c5f8db11098d2f45e3aa493a25e50) と [Bitcoin.com](https://www.blocktrail.com/BCC/tx/dc2283343baaead431dfaad45e419411ef98b3ff57ad47a0483e41da4cba0acf) の2つである。[Pool Stats](https://bch.btc.com/stats/pool?pool_mode=month) によるとAntPoolが11.17%、Bitcoin.comが8.36%なので約20%の確率で `1s/b` 未満のトランザクションがブロックに取り込まれる。つまり、`1s/b` 未満のトランザクションを先に送信しておいて、決済では `1s/b` 以上のトランザクションを送信すれば、約20%の確率で2重支払いを意図的に引き起こせてしまうことになる。[[2]](https://jasonc.me/blog/bitcoin-double-spend) の記事内では、2重支払いには$60,000 (算出方法は不明) のコストがかかると書かれているが、実際にはもっと低いコストで2重支払いを起こせるのではないだろうか。 # 3. 結論  今回行った検証によってBCHの0承認では2重支払いが実際に起こっており、その原因がノードの最低手数料設定によって伝播されないトランザクションによるものであることが分かった。また、BCHネットワークの状況によっては意図的に2重支払いを起こせる可能性があることが分かった。  0承認は非常に便利なものであるが、マイナーやノードのプロトコルがまだ0承認に対応していないことを考えると、現状では少額 (悪事をはたらくインセンティブが無くなる程度) に留めておくのが良いだろう。そもそも0承認は受け取り手が許容するかどうかの話でもあるため、セキュリティと利便性をトレードオフできる今のファジーな仕様はある意味自立分散的なのかもしれないが、BCHの普及を考えるとしっかりとプロトコルを定めた上で、ハードフォークアップデートする必要があるだろう。 # 4. 最後に  BCHの0承認の使用感は素晴らしいものであり、慣れてしまうと承認時間が短いEthereumですら使うのを躊躇ってしまうほどである。今回のハードフォークによってオペコードが追加されたこともあり、更に使い勝手の良い通貨になると我々は期待しているため、今後も調査と開発を続けていきたいと考えている。 # 5. 参考文献 - [1] [Peer-to-Peer Electronic Cash](https://www.bitcoincash.org/) - [2] [Double Spending a 0-Conf Bitcoin Transaction](https://jasonc.me/blog/bitcoin-double-spend) - [3] [BIP-133 0-Conf Double Spends on BCH](https://jasonc.me/blog/bitcoin-bip-133-double-spends-bch) - [4] [Bitcoin Cash double spends](https://doublespend.cash/)
json metadata{"tags":["blockchain","bitcoin","japan"],"image":["https://steemitimages.com/DQmaRzD4QsZUPHu7YtZTEXzqCEhzW4afrZKBq3yJqsaTC6J/double_spend1.png","https://steemitimages.com/DQmZCoiLrjFyG24Bua6fgTo4tQQhwcNoUExpgvLWJ36ZjAB/double_spend2-1.png","https://steemitimages.com/DQmUqM8KczEqi6SfX9KxHzUp1UBsXpJKHTYpLHedckAnE6p/double_spend2-2.png","https://steemitimages.com/DQmR8xK8AmaHacGrvJtqhgksxk52pbKni45EAkiQbEcrVQ1/double_spend2-3.png","https://steemitimages.com/DQmR69AyfDdKLjDJnVVi7biTFAVppvTKEAAk9EhYjcXCaXj/double_spend2-4.png","https://steemitimages.com/DQmTPvGJKn5iD2HdZAr2kT5x1Z3dndh6RhBuZ7Ch946viWL/0sb.png","https://steemitimages.com/DQmW2BiqxFYYrPKCvmDQnZJJHewkAV3HsNv5taVSG4fzD16/1sb%20(1).png","https://steemitimages.com/DQmPkxbLJ3R2EvQ5cFeUrzuFdVJQd67nyjgSKA3WuiRuieL/0995sb%20(1).png","https://steemitimages.com/DQmdNYykdWwYKoShg3Y1Rv7qgG113Y2ehCaq1pw1oJn6Pnr/race.png","https://steemitimages.com/DQmekeuWzZzYCg96HB7e4uj1WAheCYPs1hBe9VwPB6GgLk6/dos.png"],"links":["https://www.bitcoincash.org/","https://doublespend.cash/","https://bitinfocharts.com/comparison/bitcoin%20cash-transactions.html","https://jasonc.me/blog/bitcoin-double-spend","https://github.com/Bitcoin-ABC/bitcoin-abc/issues/127","https://testnet.manu.backend.hamburg/bitcoin-cash-faucet","https://www.blocktrail.com/tBCC/tx/92bca99ef8e20874edc7551c65f79226399e14e56a5faefa84d6362bde42e332?txoutIdx=0","https://www.blocktrail.com/BCC/tx/c4d514c538323f9aedb361aedecc9feaad63cfb6e8d7698cf1a0f7a09c342aa9","https://www.blocktrail.com/BCC/tx/d12ab42b4ec7e91eaa889ddf3b872e6a493c5f8db11098d2f45e3aa493a25e50","https://www.blocktrail.com/BCC/tx/dc2283343baaead431dfaad45e419411ef98b3ff57ad47a0483e41da4cba0acf","https://bch.btc.com/stats/pool?pool_mode=month","https://jasonc.me/blog/bitcoin-bip-133-double-spends-bch"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkblockchain
permlinkbitcoincash-bch-0
titleBitcoinCash(BCH)の0承認についての検証
Transaction InfoBlock #22649077/Trx d136c3156812c8ccbeacda69a1dae147273908b9
View Raw JSON Data
{
  "block": 22649077,
  "op": [
    "comment",
    {
      "author": "morinikiz",
      "body": "# 1. 序論\n\n 2017年8月1日にBitcoin (以下BTC) からハードフォークした BitcoinCash (以下BCH) は BTC の RBF (replace-by-fee) の機能を削除することにより、0承認を実現しようとしている。支払われた値が承認されるまでユーザが約10分間待たされるようでは、一般への普及は現実的ではないため、0承認は BCH のビジョンの [Peer-to-Peer Electronic Cash](https://www.bitcoincash.org/)[1] になるための非常に重要な機能の一つである。\n しかし、現時点において、BCHの0承認のセキュリティについては多くの議論が繰り広げられている途中である。これについて、参加している人のBCHへの理解度がまばらであるために、出処の不明確な仕様を元にした思想の押し付け合いのようなものになっていることをよく見かける。そこで、**我々は0承認についての疑問を検証し、確かなエビデンスを残すことで、議論の生産性を高め、BCHコミュニティの健全な発展の手助けになりたい**と考えた。\n\n## 1.1 RBFと0承認\n\n 上で述べたようにBCH には BTC に存在する RBF (replace-by-fee) の機能がない。RBF を簡単に説明すると、アドレスや値に誤りがあるトランザクションを送ってしまっても、以前のトランザクションより手数料を高く設定し再送することで、トランザクションが上書きされるというものである。これにより、BTC はトランザクションがブロックに取り込まれるまでの間であれば、トランザクションのキャンセルができる。これは、ブロックに取り込まれることをデータのコミットとするブロックチェーンの仕様を利用した良い機能である。しかし、ブロックに取り込まれないことには取引が完了しないので送金の即時性は失われることになる。\n 一方、BCH ではこの BRF を削除し、トランザクションがブロードキャストされた時点でコミットされたこととする0承認が可能であるとした。もっとも、ブロックチェーンである以上、最終的にブロックに取り込まれなければならないので、ブロックサイズを大幅に拡大することで全てのトランザクションが確実にブロックに取り込まれることを前提とした仕様である。\n\n\n## 1.2 0承認の疑問点\n\n 本記事では、0承認に関する議論でよく挙げられる以下の5点に関して述べる。\n- BCHネットワークにおいて、2重支払いが起きているのかどうかを検証する \n- 実際に2重支払いが起きていた場合、何が原因でそれが起きたのかを検証する\n- 0承認とトランザクション手数料の関係性について検証する\n- 0承認とマイニングの関係性について検証する\n- 2重支払いの実現可能性について考察する\n\n\n# 2. 検証\n\n 以下に今回の検証に使用した環境を示す。\n- OS: Ubuntu 16.04\n- デーモン: Bitcoin ABC:0.17.1\n- ネットワーク: testnet3\n\n## 2.1 2重支払いの確認\n\n 0承認が可能とされるBCHにおいて2重支払いは起きていないのかどうかを検証する。\nそのためには、0承認における2重支払いとはどういうことなのか理解する必要がある。図1に2重支払いの概略図を示す。\n\n<center>![double_spend1.png](https://steemitimages.com/DQmaRzD4QsZUPHu7YtZTEXzqCEhzW4afrZKBq3yJqsaTC6J/double_spend1.png)</center>\n<center>図1 2重支払いの概略図 </center>\n\n 図1には3つの登場人物がいる。それぞれユーザ、ショップ、マイナーとする。まず(図1-①)、ユーザはお店に代金としていくらかのBCHを支払うトランザクションAを作成し、それをショップのノードに送信する。ショップはトランザクションAを受取、その取引を承認する。次に(図1-②)、ユーザはトランザクションAの `input` に含まれる `UTXO` と同じ `UTXO` を `input` に含むトランザクションBを作成し、Minerに送信する。マイナーはトランザクションBをブロックに取り込み、ブロックをブロードキャストする。最後に(図1-③)、そのブロックを受け取ったショップは承認したはずのトランザクションAが消滅し、トランザクションBに置き換わったように見える。これが、0承認における2重支払いである。\n\n 本検証では、2重支払いを確認するために次に示すBCHの2重支払いのログを表示するWebサービスを用いた。\n\n- [Bitcoin Cash double spends](https://doublespend.cash/) [2]\n\n[[2]](https://doublespend.cash/) を見る限り、4月には最低28回の2重支払いがあったことがわかる。[BitInfoCharts](https://bitinfocharts.com/comparison/bitcoin%20cash-transactions.html) から4月のトランザクション数を算出してみると約525kトランザクションであった。したがって、19kトランザクションに1回の確率で2重支払いが起きていることになる。クレジットカードなどの既存の決済システムのトランザクションの失敗率などが不明なため比較できないが、決済プロトコルに要求される最低限の信頼性について一度考える必要がある。\n このことから、**BCHは0承認における2重支払いが存在する**ということが分かった。\n\n## 2.2 2重支払いの原因\n\n 2.1 にて、2重支払いが起こることは確認できたが、なぜこのようなことが起きるのか検証をする。まず、2重支払いの原因に関する記事として、以下の2つを参照されたい。\n\n- [Double Spending a 0-Conf Bitcoin Transaction](https://jasonc.me/blog/bitcoin-double-spend) [3]\n- [Why is this transaction won't be propagated to all nodes?](https://github.com/Bitcoin-ABC/bitcoin-abc/issues/127) [4]\n\nこれらの記事に共通していえるのは、あるトランザクションを送信したときに他ノードに伝播されるのを確認できなかったが、最終的にブロックに入ったということである。 [[3]](https://jasonc.me/blog/bitcoin-double-spend) では 2.1 で説明した2重支払いがまさに起こっている。原因として考えられるのは [[4]](https://github.com/Bitcoin-ABC/bitcoin-abc/issues/127) のコメントにある、「一定の手数料以下 (デフォルトでは `1satoshi/byte`) のトランザクションは伝播されない」である。以下 `satoshi/byte` は `s/b` とする。\n では、なぜこの仕様が2重支払いの原因となってしまうのかを説明する。図2, 3, 4, 5に2重支払いが起きるときのネットワークの状態を示す。このネットワークには伝播させるトランザクションの最低手数料設定 (minimum relay transaction fee) が異なったノードが存在しているおり、ショップ、マイナーAが `1s/b`、ユーザ、ノードB、マイナーBが `0.1s/b` と設定しているとする。また、マイナーAは `1s/b` 以上、マイナーBは `0.1s/b`以上のトランザクションを `mempool` からブロックに取り込むものとする。\n まず(図2を参照)、ユーザは手数料が `0.1s/ b` のトランザクションAをブロードキャストする。このトランザクションAが伝播されるのは最低手数料を `0.1s/b` に設定しているノードB、マイナーBだけである。したがって、ノードBとマイナーBのmempoolにはトランザクションAが存在し、ショップ、マイナーAのmempoolにはトランザクションAが存在しない状態となる。\n\n<center>![double_spend2-1.png](https://steemitimages.com/DQmZCoiLrjFyG24Bua6fgTo4tQQhwcNoUExpgvLWJ36ZjAB/double_spend2-1.png)</center>\n<center>図2 2重支払いが起きるときにネットワークの状況1</center>\n\n 次に(図3を参照)、ユーザはトランザクションAと同じ `UTXO` を `input` に含み、手数料を `1s/b`に引き上げたトランザクションBをブロードキャストする。このトランザクションBは全てのノードの最低手数料設定を上回るため、ネットワーク全体に伝播されることが可能である。しかし、ノードBとマイナーBにはすでに同じ `UTXO` をもったトランザクションAが `mempool` に存在するため、これらのノードからは、トランザクションBは棄却されてしまう。したがって、ショップとマイナーAの `mempool` にはトランザクションBが、ノードBとマイナーBの `mempool` にはトランザクションAが存在する状態となる。これは**ネットワークが最低手数料設定によって分断されたような形になっている**といえるだろう。\n\n<center>![double_spend2-2.png](https://steemitimages.com/DQmUqM8KczEqi6SfX9KxHzUp1UBsXpJKHTYpLHedckAnE6p/double_spend2-2.png)</center>\n<center>図3 2重支払いが起きるときにネットワークの状況2</center>\n\nここで、マイナーBがマイナーAよりも先にブロックのマイニングに成功すると(図4)、そのブロックは最低手数料設定に関係なく全てのノードに伝搬される。\n\n<center>![double_spend2-3.png](https://steemitimages.com/DQmR8xK8AmaHacGrvJtqhgksxk52pbKni45EAkiQbEcrVQ1/double_spend2-3.png)</center>\n<center>図4 2重支払いが起きるときにネットワークの状況3</center>\n\n最終的に(図5)、ブロックが全てのノードのチェーンに取り込まれ、ショップ、マイナーAのmempoolに存在していたトランザクションBは消滅する。\n\n<center>![double_spend2-4.png](https://steemitimages.com/DQmR69AyfDdKLjDJnVVi7biTFAVppvTKEAAk9EhYjcXCaXj/double_spend2-4.png)</center>\n<center>図5 2重支払いが起きるときにネットワークの状況4</center>\n\n以上が最低手数料設定の仕様が2重支払いを引き起こす原因となるロジックである。\n\n## 2.3 0承認とトランザクション手数料の関係性\n ここで新たな疑問が生まれた。**それはノードが最低手数料の設定によってどのような挙動を示すのか**ということだ。そこで、実際にノードを用意し検証してみることにした。用意したノードは2つでそれぞれをノードA、ノードBとする。まずは、両ノードとも最低手数料設定である `-minrelaytxfee`オプションをデフォルトの `0.00001` (1s/b) とした。また、ノードAとノードBが確実にP2P接続されるように、`-addnode` オプションでお互いのノードを指定した。さらに送金の前準備として [Bitcoin Cash Testnet Faucet](https://testnet.manu.backend.hamburg/bitcoin-cash-faucet) より、13BCHを引き出した。\n\n- [13BCH引き出しのトランザクション履歴](https://www.blocktrail.com/tBCC/tx/92bca99ef8e20874edc7551c65f79226399e14e56a5faefa84d6362bde42e332?txoutIdx=0)\n\n\n### 2.3.1 手数料: 0satoshi/byte\n まず、手数料を0satoshiとしてノードAに `sendrawtransaction` でトランザクションを送ってみるとリクエストは成功し、トランザクションハッシュとして `65f02468ef35297bfa43f3b341d5f4d83b122d0bc700ac8646c7dab8906336a4` が返ってきた。さらに、ノードAに対して`getrawtransaction` で先のハッシュを取得すると正しいトランザクションデータが得られたので、ノードAの `mempool` には、手数料が0satoshiのトランザクションが存在していることがわかる。以下にそのトランザクションデータを示す。\n\n```\nRawTransaction: 010000000132e342de2b36d684faae5f6ae5149e392692f7651c55c7ed7408e2f89ea9bc92000000006a473044022023f990ddd8a171169f4dff082c09eae867d2697c52a22aeedfff4aceaba2f04c0220550d039f6377fd82081a59b7e04566d38b994e19c38bde76ab7c7afacc3223a34121025b2c1ea20968be0d04d66186a34e6537355652ca6a9c5a5cea1e05adfd517688ffffffff01006d7c4d000000001976a914fcf1b5f4847caf32e3d1471a22bc9500b6ae7cc888ac00000000\n```\n\n30分後、このトランザクションを各ノードに問い合わせてみると、ノードAではリクエストに成功するが、ノードBでは以下のようなエラーとなった。\n\n```\n\"No such mempool or blockchain transaction. Use gettransaction for wallet transactions.\"\n```\n\n<center>![0sb.png](https://steemitimages.com/DQmTPvGJKn5iD2HdZAr2kT5x1Z3dndh6RhBuZ7Ch946viWL/0sb.png)</center>\n<center>図6 0s/bのトランザクションを送信した場合のノードの状態</center>\n\nこのことから、手数料が0satoshiのトランザクションはノードAの `mempool` には存在するが、ノードBには伝播されず、ブロックにも取り込まれていないことがわかる。この状態が起こる原因として、以下が考えられる。\n\n- 最低手数料が0satoshiのマイナーがいない\n- 最低手数料が0satoshiのマイナーのハッシュレートが低い\n- トランザクションが最低手数料が0satoshiのマイナーに届かなかった\n- ノードAの接続先が、最低手数料が0satoshiのマイナーに接続されていなかった\n\nこれらの場合、このトランザクションがブロックに取り込まれることはないのでノードAの `mempool` に残り続けることになる。これでは `input` に含まれる `UTXO` はロックされたと同じことになってしまう。これを解消するには、手数料をマイナーの最低手数料以上に上げて、ノードA以外のノードにトランザクションを送信する必要があるが、ノードを選択できないウォレットではこれを行うのは難しいだろう。ただし、ライブネットで検証した結果では、送信先ノードの最低手数料以下のトランザクションの場合エラーとなったので大きな問題ではなさそうである。ノードのプログラムには、このようなテストネットとライブネットで仕様が違う点がいくつか存在するため、把握せず開発を進めると思わぬバグを生む可能性があるので注意が必要だ。\n\n### 2.3.2 手数料: 1satoshi/byte\n 次に、デフォルトの最低手数料である `1s/b` のトランザクションの場合を検証した。`satoshi/byte` の単位から分かる通り、手数料分のsatoshiをトランザクションのバイトサイズで割ったものが基準となるため、トランザクションサイズ  `192byte` に対して `192satoshi` を手数料とした。おおよそのトランザクションのサイズは以下の式で求められる。\n\n```\n148 * input数 + 34 * output数 ± 10\n```\n\nこの式についての説明は本記事では割愛するが、トランザクションのデータ構造を知っていれば簡単に理解できるので、気になった方は調べてみてほしい。\n\nこの手数料が `1s/b`のトランザクションをノードAに送信してみるとトランザクションハッシュ  `375e68bca5ae3803ada0c9dfa2ca962c56f5b234bb479f5c1eff5a3298e0d68f`が得られ、ノードAに対してこのハッシュによる`getrawtransaction` が成功した。その後、同ハッシュでノードBに対しての `getrawtransaction` も成功したので正しくトランザクションが伝播されている。\n\n```\n# getrawtransactionのレスポンス\n# ノードA\n{\"result\":\"0100000001712efe66381cec7c46a4539ab52dd9a8ed5cb239fe4d4828e0901abfb984733d000000006b483045022100f19914d637fbf8de663eb29f599de3421973be71f0978c241618f42e056cd92102200567838f42f028f3ea2bbc0df4610172bafd35199537c8fbbfb581dbb140ee30412103e12dda97990ced7f0e0b6966fca82f79fb3fda88e38d50697e916fccf2f40759ffffffff01fc687c4d000000001976a914f8ba5954cde0b3d9e65d2c6561b772ac3b69ecb188ac00000000\",\"error\":null,\"id\":\"97588544-72b7-4824-857e-4823247c9375\"}\n\n# ノードB\n{\"result\":\"0100000001712efe66381cec7c46a4539ab52dd9a8ed5cb239fe4d4828e0901abfb984733d000000006b483045022100f19914d637fbf8de663eb29f599de3421973be71f0978c241618f42e056cd92102200567838f42f028f3ea2bbc0df4610172bafd35199537c8fbbfb581dbb140ee30412103e12dda97990ced7f0e0b6966fca82f79fb3fda88e38d50697e916fccf2f40759ffffffff01fc687c4d000000001976a914f8ba5954cde0b3d9e65d2c6561b772ac3b69ecb188ac00000000\",\"error\":null,\"id\":\"48784a9d-3a18-4882-b12f-13ab91acc3bf\"}\n```\n\n<center>![1sb (1).png](https://steemitimages.com/DQmW2BiqxFYYrPKCvmDQnZJJHewkAV3HsNv5taVSG4fzD16/1sb%20(1).png)</center>\n<center>図7 1s/bのトランザクションを送信した場合のノードの状態</center>\n\n### 2.3.3 手数料: 0.99satoshi/byte\n `0s/b` と `1s/b` の挙動は確認できたので、次は0以上1未満の場合も検証してみる。サイズ`192byte` に対して `191satoshi`を手数料をとした `0.995s/b`のトランザクションを作成した。これも上記と同様にノードAに送信し、ノードBで確認できるか試したところ `0satoshi/byte` の結果と同じになった。\n\n```\n# ノードAへのsendtransaction\n{ result: '01000000018fd6e098325aff1e5c9f47bb34b2f5562c96caa2dfc9a0ad0338aea5bc685e37000000006b483045022100be1da4b299a7fd9a19c2823f4eb398b63f38271b31e07e9a1a8b6e942a4138b4022031fb218c777cf49cdf53323c2e25fd8a2fd45837a831ff0444ce069dc81758a7412103e12dda97990ced7f0e0b6966fca82f79fb3fda88e38d50697e916fccf2f40759ffffffff013d687c4d000000001976a914f8ba5954cde0b3d9e65d2c6561b772ac3b69ecb188ac00000000',\n  error: null,\n  id: '4ef0d9e1-ed9f-489b-80f1-855442115632' }\n\n# ノードBへのgetrawtransaction\n{\"result\":null,\"error\":{\"code\":-5,\"message\":\"No such mempool or blockchain transaction. Use gettransaction for wallet transactions.\"},\"id\":\"930f56e1-dcfb-4507-a8bb-269244f951c3\"}\n```\n\n この状態でノードBに対して手数料を `1s/b` に引き上げて送信すると成功となり、トランザクションハッシュが得られた。このトランザクションをノードAに問い合わせると、エラーとなった。これは、RBFの機能がないために、Bに送信したトランザクションはノードAで棄却されるからである。ノードAには `0.99s/b` トランザクションが、ノードBには `1s/b` のトランザクションが存在しており、図3と類似した状態となっている。ここで、2.3.1 の結果と同様に `0.995s/b` のトランザクションはブロックに取り込まれず、後から送信した `1s/b`のトランザクションがブロックに取り込まれた。その後、`0.995s/b` のトランザクションを両ノードに問い合わせるとどちらもエラーとなったため、ブロックに取り込まれなかった方が正しく `mempool` から削除されたことが確認できた。つまり、**2重支払いを意図的に起こせた**ことになる。\n\n```\n# ノードA\n{\"result\":null,\"error\":{\"code\":-5,\"message\":\"No such mempool or blockchain transaction. Use gettransaction for wallet transactions.\"},\"id\":\"239b2753-95c3-4eaf-9cef-95420a6726e3\"}\n\n# ノードB\n{\"result\":null,\"error\":{\"code\":-5,\"message\":\"No such mempool or blockchain transaction. Use gettransaction for wallet transactions.\"},\"id\":\"6b3af65c-72f3-4914-9a68-032ad9849774\"}\n```\n\n<center>![0995sb (1).png](https://steemitimages.com/DQmPkxbLJ3R2EvQ5cFeUrzuFdVJQd67nyjgSKA3WuiRuieL/0995sb%20(1).png)</center>\n<center>図8 0.995s/bと1s/bのトランザクションを送信した場合のノードの状態</center>\n\n\n### 2.3.4 トランザクションレース\n ここで気になるのが、図3-2のようにネットワーク上に同じinputを持つ複数のトランザクションが存在していた場合どちらが早く伝播されるのかである。これを検証するためにノードAの最低手数料を `0.1s/b` に設定し、 `0.1s/b` のトランザクションを送信する。続いて、ノードBは最低手数料はデフォルトの `1s/b` に設定し、 `1s/b` のトランザクションを送信する。そして、ブロックが取り込まれる前にノードBの最低手数料を `0.1s/b` に設定し、再起動することでノードBに `0.1/sb` と `1s/b` の両方が送られてくる状態を用意した。結果としては、10回中10回が `1s/b` のトランザクションが先に `mempool` に入り、 `0.1s/b` のトランザクションは観測できなかった。この結果については、 `bootnode` に設定されているノードが `1s/b` であるため、ノードBに接続される前に `1s/b` のトランザクションが到達していると考えられる。特定のノードだけに接続されるようになる `-connect` オプションを使って自前のノードだけで試してみると、先に接続されたノードが持つトランザクションが毎回 `mempool` に入ったのでこの予測は正しかったといえる。以上のことを踏まえると、**ネットワークを構成しているノードの最低手数料設定が伝播の速度に関係していると考えられる。つまり、ネットワーク内にどれだけ低い手数料を許容するノードが存在しているかが重要になってくる**のである。\n\n<center>![race.png](https://steemitimages.com/DQmdNYykdWwYKoShg3Y1Rv7qgG113Y2ehCaq1pw1oJn6Pnr/race.png)</center>\n<center>図8 トランザクションレース</center>\n\n## 2.4 0承認とマイニングの関係性\n 0承認の理論的には、マイニングに関係なくトランザクションがそのノードで観測できた時点で承認となる。ただし、これは送信したトランザクションがもれなく全てブロックの入ることを前提としている。そのために、BCHはブロックサイズを大幅に拡大しており、それによって手数料が非常に低くなっている。 しかし、**手数料が低いということはそれだけたくさんのトランザクションを送ることができるということだ。つまり、DOSアタックが低リスクで行えてしまう。そこで、DOSアタックを実際に行ってみて、BCHネットワークがどのような挙動をするのか**検証してみた。検証方法は、あるトランザクションからUTXOを次々とチェインする形でトランザクションを作成し、それを一気にノードAに対して送信した。その結果を以下に示す。\n\n```\nNo.1 : 1299988220 -> 1299988028 (fee: 192)\n8b00931a95fd880cf2daa007ae355e4028c008279f295f0c7385a26ce5180b64\nNo.2 : 1299988028 -> 1299987836 (fee: 192)\nb02dd75db57ea98349aa26da2250ab1a86c13faa522347bdcda6ff71484b43d6\nNo.3 : 1299987836 -> 1299987644 (fee: 192)\n1f0e3269f6fa2c4f0d83f82a57cfdc691aabb1bc651acd322b6b809e6b69926a\nNo.4 : 1299987644 -> 1299987452 (fee: 192)\n36277ae693b76ffedc1675273292556441405e5ff648d51548371de6bd259c35\nNo.5 : 1299987452 -> 1299987260 (fee: 192)\nd44784bbeba0ce5bb795e362b16f139bfc8e38f48c91805dd40ba779765314e6\nNo.6 : 1299987260 -> 1299987068 (fee: 192)\na25869729031b7375a6ba36c3d2d7161970ab7796cd74c6160845710601b2dac\nNo.7 : 1299987068 -> 1299986876 (fee: 192)\n2dbb164454e34c1ffe4805ed4534092e1894c3d4d021a03500b4c36779b01d78\nNo.8 : 1299986876 -> 1299986684 (fee: 192)\n2268c09f54fb0891e3d73eb860d5aef867395a41020188ee6c220e7c7da21b0d\nNo.9 : 1299986684 -> 1299986492 (fee: 192)\n40b475df74bec109b61f26ca77fb15b1b5c41c5507f51262c7924ead4dcbd65d\nNo.10 : 1299986492 -> 1299986300 (fee: 192)\n5ae830205a71bcb44c0fca2a362281812e57c19c4272fc956ab9de315bcb2fac\nNo.11 : 1299986300 -> 1299986108 (fee: 192)\n65071be3b2f596fdb96b4b3e6af9b2043dedc6e838bdc6d720f25caf3335f29e\nNo.12 : 1299986108 -> 1299985916 (fee: 192)\n945df80d3473a886d1c1e8068611482f6719afcf33204d31b0ae637fffc8885c\nNo.13 : 1299985916 -> 1299985724 (fee: 192)\nb99f87197b4c40dd8b13bdc5e501c95c74b60c143883bf85eb157de03e4f585e\nNo.14 : 1299985724 -> 1299985532 (fee: 192)\nf6c8d067b10700c03d2a661e6f1920e40bace43147a1e30730b1f4611518f273\nNo.15 : 1299985532 -> 1299985340 (fee: 192)\n64e393255ad6d309b0ddc88880d932252a3442589fe76928c66d73e1c4602626\nNo.16 : 1299985340 -> 1299985148 (fee: 192)\n85337c90863ceaaef1cf0eb37bf76090c7622eaf16d986079bf337a5dd4cf2b0\nNo.17 : 1299985148 -> 1299984956 (fee: 192)\n20f855ccf0eb1b5fee04e827a6d73b16216837419aef8bb73fbd93ce69570983\nNo.18 : 1299984956 -> 1299984764 (fee: 192)\n0e12ac930b772f7407732a0aa181d7dcabc268889057246dc04d73f54fbe8b5f\nNo.19 : 1299984764 -> 1299984572 (fee: 192)\n33c72b114cf7b845d928f854899a2f61870359cc870c6f970a834d1bad615bbd\nNo.20 : 1299984572 -> 1299984380 (fee: 192)\nfe40a18a0ad1e607c8de741a26a9e8010d9826d09924f61521b3b24318a87268\nNo.21 : 1299984380 -> 1299984188 (fee: 192)\n9867c2e852c8b4b0d9d725af6ad3acb91be02d2a8354e9b09c3ea07eb5bbd5cc\nNo.22 : 1299984188 -> 1299983996 (fee: 192)\n9908c180688f0f34d9d9ac3e9e5c0711edc018b817c633efc274c1b3c6602e08\nNo.23 : 1299983996 -> 1299983804 (fee: 192)\nb69fe1eaaec2c093ad6f1a1c6d255baf5bd87979793f3c7dfe1ae29f11401268\nNo.24 : 1299983804 -> 1299983612 (fee: 192)\n62ddcbf9b2107e7cb40d68302ecc1907d4fd623a8e044b981599eaa337c14432\nNo.25 : 1299983612 -> 1299983420 (fee: 192)\n655446acae704b1f6c98540492a41833d1cfccda1d2801e734abcdb421a603dd\nNo.26 : 1299983420 -> 1299983228 (fee: 192)\n{\"result\":null,\"error\":{\"code\":-26,\"message\":\"64: too-long-mempool-chain\"},\"id\":\"86ee6b7c-8284-477d-819a-1cef8e6ab5f6\"}\n```\n\nこの結果を見ると25個目までは順調に送信できたが、26個目で `too-long-mempool-chan` というエラーが出た。調べてみると以下のソースを見つけた。\n\n```\n# bitcoin-abc/src/validation.h:69\n/** Default for -limitancestorcount, max number of in-mempool ancestors */\nstatic const unsigned int DEFAULT_ANCESTOR_LIMIT = 25;\n```\n\n```\n# bitcoin-abc/src/validation.cpp:981\nif (!pool.CalculateMemPoolAncestors(\n                entry, setAncestors, nLimitAncestors, nLimitAncestorSize,\n                nLimitDescendants, nLimitDescendantSize, errString)) {\n                    return state.DoS(0, false, REJECT_NONSTANDARD,\n                    \"too-long-mempool-chain\", false, errString);\n}\n```\n\n これを見る限り、トランザクションのバリデーションで `mempool` に存在する**祖先トランザクションが25個以上の場合はDOSと判断され、エラーを返すようになっている**ようだ。` -limitancestorcount` オプションでこれを変更できるようなので指定してみたが、我々の環境では25からは変更されなかった。ヘルプにも存在しないので消えたオプションなのだろうか。自前のノードだけ変更できたとしてもネットワーク全体がこの制限を一斉に上げない限り有効性は低いため、**現状ではトランザクションをチェインした0承認はブロックに取り込まれなければ25回までしかできないということになる。したがって、0承認の理論的にはマイニングが関係ないはずではあるものの、現状のノードはDOS攻撃に備えた実装になっているため、注意が必要である。**\n BCHでは、マイナーによって1時間以上ブロックが採掘されないことが発生することもあり、大量のトランザクションを一定時間に集中して送るようなケースでは、この仕様を理解しておく必要があるだろう。\n\n<center>![dos.png](https://steemitimages.com/DQmekeuWzZzYCg96HB7e4uj1WAheCYPs1hBe9VwPB6GgLk6/dos.png)</center>\n<center>図9 大量にトランザクションを送信した結果</center>\n\n## 2.5 2重支払いの実現可能性\n 上記の検証で意図的に2重支払いを引き起こすことはできたが、全てテストネットによるものである。ここからは、ライブネットで2重支払いを意図的に行えるのかどうか検証する。まず重要なのはデフォルトである最低手数料の `1s/b` 以下のトランザクションを送信したときに、それがマイニングされるかどうかである。実際にライブネットで手数料を `0.95s/b` に設定して送信すると、約2時間でマイニングされた。以下にトランザクション詳細を示す。\n\n- [c4d514c538323f9aedb361aedecc9feaad63cfb6e8d7698cf1a0f7a09c342aa9](https://www.blocktrail.com/BCC/tx/c4d514c538323f9aedb361aedecc9feaad63cfb6e8d7698cf1a0f7a09c342aa9)\n\nこれより、デフォルトの `1s/b` 以下の手数料でもブロックに取り込むマイナーがいることが確認できた。つまり、ライブネットでも2重支払いができる可能性があるということだ。また、このトランザクションはブロックに取り込まれるまでは主要なブロックエクスプローラーでは観測できなかったため、これらのノードの最低手数料設定は `1s/b` だということが考えられる。2重支払いの成功率は `1s/b` 以下のトランザクションを受け付けるマイナーが占めるハッシュレートに依存するため、`1s/b` 未満のトランザクションが含まれるブロックのマイナーを調べた。確認できたのは [AntPool](https://www.blocktrail.com/BCC/tx/d12ab42b4ec7e91eaa889ddf3b872e6a493c5f8db11098d2f45e3aa493a25e50) と  [Bitcoin.com](https://www.blocktrail.com/BCC/tx/dc2283343baaead431dfaad45e419411ef98b3ff57ad47a0483e41da4cba0acf) の2つである。[Pool Stats](https://bch.btc.com/stats/pool?pool_mode=month) によるとAntPoolが11.17%、Bitcoin.comが8.36%なので約20%の確率で `1s/b` 未満のトランザクションがブロックに取り込まれる。つまり、`1s/b` 未満のトランザクションを先に送信しておいて、決済では `1s/b` 以上のトランザクションを送信すれば、約20%の確率で2重支払いを意図的に引き起こせてしまうことになる。[[2]](https://jasonc.me/blog/bitcoin-double-spend) の記事内では、2重支払いには$60,000 (算出方法は不明) のコストがかかると書かれているが、実際にはもっと低いコストで2重支払いを起こせるのではないだろうか。\n\n\n# 3. 結論\n 今回行った検証によってBCHの0承認では2重支払いが実際に起こっており、その原因がノードの最低手数料設定によって伝播されないトランザクションによるものであることが分かった。また、BCHネットワークの状況によっては意図的に2重支払いを起こせる可能性があることが分かった。\n 0承認は非常に便利なものであるが、マイナーやノードのプロトコルがまだ0承認に対応していないことを考えると、現状では少額 (悪事をはたらくインセンティブが無くなる程度) に留めておくのが良いだろう。そもそも0承認は受け取り手が許容するかどうかの話でもあるため、セキュリティと利便性をトレードオフできる今のファジーな仕様はある意味自立分散的なのかもしれないが、BCHの普及を考えるとしっかりとプロトコルを定めた上で、ハードフォークアップデートする必要があるだろう。\n\n# 4. 最後に\n BCHの0承認の使用感は素晴らしいものであり、慣れてしまうと承認時間が短いEthereumですら使うのを躊躇ってしまうほどである。今回のハードフォークによってオペコードが追加されたこともあり、更に使い勝手の良い通貨になると我々は期待しているため、今後も調査と開発を続けていきたいと考えている。\n\n# 5. 参考文献\n- [1] [Peer-to-Peer Electronic Cash](https://www.bitcoincash.org/)\n- [2] [Double Spending a 0-Conf Bitcoin Transaction](https://jasonc.me/blog/bitcoin-double-spend)\n- [3] [BIP-133 0-Conf Double Spends on BCH](https://jasonc.me/blog/bitcoin-bip-133-double-spends-bch)\n- [4] [Bitcoin Cash double spends](https://doublespend.cash/)",
      "json_metadata": "{\"tags\":[\"blockchain\",\"bitcoin\",\"japan\"],\"image\":[\"https://steemitimages.com/DQmaRzD4QsZUPHu7YtZTEXzqCEhzW4afrZKBq3yJqsaTC6J/double_spend1.png\",\"https://steemitimages.com/DQmZCoiLrjFyG24Bua6fgTo4tQQhwcNoUExpgvLWJ36ZjAB/double_spend2-1.png\",\"https://steemitimages.com/DQmUqM8KczEqi6SfX9KxHzUp1UBsXpJKHTYpLHedckAnE6p/double_spend2-2.png\",\"https://steemitimages.com/DQmR8xK8AmaHacGrvJtqhgksxk52pbKni45EAkiQbEcrVQ1/double_spend2-3.png\",\"https://steemitimages.com/DQmR69AyfDdKLjDJnVVi7biTFAVppvTKEAAk9EhYjcXCaXj/double_spend2-4.png\",\"https://steemitimages.com/DQmTPvGJKn5iD2HdZAr2kT5x1Z3dndh6RhBuZ7Ch946viWL/0sb.png\",\"https://steemitimages.com/DQmW2BiqxFYYrPKCvmDQnZJJHewkAV3HsNv5taVSG4fzD16/1sb%20(1).png\",\"https://steemitimages.com/DQmPkxbLJ3R2EvQ5cFeUrzuFdVJQd67nyjgSKA3WuiRuieL/0995sb%20(1).png\",\"https://steemitimages.com/DQmdNYykdWwYKoShg3Y1Rv7qgG113Y2ehCaq1pw1oJn6Pnr/race.png\",\"https://steemitimages.com/DQmekeuWzZzYCg96HB7e4uj1WAheCYPs1hBe9VwPB6GgLk6/dos.png\"],\"links\":[\"https://www.bitcoincash.org/\",\"https://doublespend.cash/\",\"https://bitinfocharts.com/comparison/bitcoin%20cash-transactions.html\",\"https://jasonc.me/blog/bitcoin-double-spend\",\"https://github.com/Bitcoin-ABC/bitcoin-abc/issues/127\",\"https://testnet.manu.backend.hamburg/bitcoin-cash-faucet\",\"https://www.blocktrail.com/tBCC/tx/92bca99ef8e20874edc7551c65f79226399e14e56a5faefa84d6362bde42e332?txoutIdx=0\",\"https://www.blocktrail.com/BCC/tx/c4d514c538323f9aedb361aedecc9feaad63cfb6e8d7698cf1a0f7a09c342aa9\",\"https://www.blocktrail.com/BCC/tx/d12ab42b4ec7e91eaa889ddf3b872e6a493c5f8db11098d2f45e3aa493a25e50\",\"https://www.blocktrail.com/BCC/tx/dc2283343baaead431dfaad45e419411ef98b3ff57ad47a0483e41da4cba0acf\",\"https://bch.btc.com/stats/pool?pool_mode=month\",\"https://jasonc.me/blog/bitcoin-bip-133-double-spends-bch\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "blockchain",
      "permlink": "bitcoincash-bch-0",
      "title": "BitcoinCash(BCH)の0承認についての検証"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-22T09:00:03",
  "trx_id": "d136c3156812c8ccbeacda69a1dae147273908b9",
  "trx_in_block": 68,
  "virtual_op": 0
}
morinikizupvoted (100.00%) @morinikiz / test
2018/05/17 05:36:03
authormorinikiz
permlinktest
votermorinikiz
weight10000 (100.00%)
Transaction InfoBlock #22501019/Trx 8305cc4e0aed594193ad7a0ae6e6b0d0116140b9
View Raw JSON Data
{
  "block": 22501019,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "test",
      "voter": "morinikiz",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-17T05:36:03",
  "trx_id": "8305cc4e0aed594193ad7a0ae6e6b0d0116140b9",
  "trx_in_block": 15,
  "virtual_op": 0
}
ax3upvoted (1.00%) @morinikiz / test
2018/05/17 05:35:39
authormorinikiz
permlinktest
voterax3
weight100 (1.00%)
Transaction InfoBlock #22501011/Trx 57356e5f3ca39d0addc84ce8fd7e284ac50120fe
View Raw JSON Data
{
  "block": 22501011,
  "op": [
    "vote",
    {
      "author": "morinikiz",
      "permlink": "test",
      "voter": "ax3",
      "weight": 100
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-17T05:35:39",
  "trx_id": "57356e5f3ca39d0addc84ce8fd7e284ac50120fe",
  "trx_in_block": 27,
  "virtual_op": 0
}
morinikizpublished a new post: test
2018/05/17 05:35:30
authormorinikiz
bodytest
json metadata{"tags":["bitcoin","btc","bitcoincash","bch","blockchain"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkbitcoin
permlinktest
titletest
Transaction InfoBlock #22501008/Trx 17c75884d71ab6a3fa43277565288af215bfcbe7
View Raw JSON Data
{
  "block": 22501008,
  "op": [
    "comment",
    {
      "author": "morinikiz",
      "body": "test",
      "json_metadata": "{\"tags\":[\"bitcoin\",\"btc\",\"bitcoincash\",\"bch\",\"blockchain\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "bitcoin",
      "permlink": "test",
      "title": "test"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-17T05:35:30",
  "trx_id": "17c75884d71ab6a3fa43277565288af215bfcbe7",
  "trx_in_block": 126,
  "virtual_op": 0
}
blocktradessent 2.246 STEEM to @morinikiz
2018/05/17 05:18:15
amount2.246 STEEM
fromblocktrades
memo
tomorinikiz
Transaction InfoBlock #22500663/Trx 483a6e92f4d95b6eade2fc8eb3e662d21cb3ed45
View Raw JSON Data
{
  "block": 22500663,
  "op": [
    "transfer",
    {
      "amount": "2.246 STEEM",
      "from": "blocktrades",
      "memo": "",
      "to": "morinikiz"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-17T05:18:15",
  "trx_id": "483a6e92f4d95b6eade2fc8eb3e662d21cb3ed45",
  "trx_in_block": 21,
  "virtual_op": 0
}
blocktradescreated a new account: @morinikiz
2018/05/17 05:18:15
active{"account_auths":[],"key_auths":[["STM8iHnZhndBCZPZipyfAqm7waU3Sy7gYCmgNqK5hPSb7TAjtftyN",1]],"weight_threshold":1}
creatorblocktrades
fee3.000 STEEM
json metadata{}
memo keySTM7g5AJ35RhXM2bq6hn6f722ycvai9ym1wRndsP7e7DHQCcWjpEf
new account namemorinikiz
owner{"account_auths":[],"key_auths":[["STM7uS8yWjAGgXjg4jmWKjHovHQxsH2TkMuS5FiXhUBAM41552d8D",1]],"weight_threshold":1}
posting{"account_auths":[],"key_auths":[["STM8HENaAV3PC1JaRsDiXuKGmDU42tTrJV95eHLTp9eAq3Jnq5DkR",1]],"weight_threshold":1}
Transaction InfoBlock #22500663/Trx 483a6e92f4d95b6eade2fc8eb3e662d21cb3ed45
View Raw JSON Data
{
  "block": 22500663,
  "op": [
    "account_create",
    {
      "active": {
        "account_auths": [],
        "key_auths": [
          [
            "STM8iHnZhndBCZPZipyfAqm7waU3Sy7gYCmgNqK5hPSb7TAjtftyN",
            1
          ]
        ],
        "weight_threshold": 1
      },
      "creator": "blocktrades",
      "fee": "3.000 STEEM",
      "json_metadata": "{}",
      "memo_key": "STM7g5AJ35RhXM2bq6hn6f722ycvai9ym1wRndsP7e7DHQCcWjpEf",
      "new_account_name": "morinikiz",
      "owner": {
        "account_auths": [],
        "key_auths": [
          [
            "STM7uS8yWjAGgXjg4jmWKjHovHQxsH2TkMuS5FiXhUBAM41552d8D",
            1
          ]
        ],
        "weight_threshold": 1
      },
      "posting": {
        "account_auths": [],
        "key_auths": [
          [
            "STM8HENaAV3PC1JaRsDiXuKGmDU42tTrJV95eHLTp9eAq3Jnq5DkR",
            1
          ]
        ],
        "weight_threshold": 1
      }
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-17T05:18:15",
  "trx_id": "483a6e92f4d95b6eade2fc8eb3e662d21cb3ed45",
  "trx_in_block": 21,
  "virtual_op": 0
}

Account Metadata

POSTING JSON METADATA
profile{"profile_image":"https://steemitimages.com/DQmPCZfQwGis6HWqnK8St6dK4jb24NXgyBAyosqNbDJKkdh/dr-mundo-sadism.png","about":"CTO / Ginco.inc","website":"https://ginco.io/"}
JSON METADATA
profile{"profile_image":"https://steemitimages.com/DQmPCZfQwGis6HWqnK8St6dK4jb24NXgyBAyosqNbDJKkdh/dr-mundo-sadism.png","about":"CTO / Ginco.inc","website":"https://ginco.io/"}
{
  "posting_json_metadata": {
    "profile": {
      "profile_image": "https://steemitimages.com/DQmPCZfQwGis6HWqnK8St6dK4jb24NXgyBAyosqNbDJKkdh/dr-mundo-sadism.png",
      "about": "CTO / Ginco.inc",
      "website": "https://ginco.io/"
    }
  },
  "json_metadata": {
    "profile": {
      "profile_image": "https://steemitimages.com/DQmPCZfQwGis6HWqnK8St6dK4jb24NXgyBAyosqNbDJKkdh/dr-mundo-sadism.png",
      "about": "CTO / Ginco.inc",
      "website": "https://ginco.io/"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM7uS8yWjAGgXjg4jmWKjHovHQxsH2TkMuS5FiXhUBAM41552d8D1/1
Active
Single Signature
Public Keys
STM8iHnZhndBCZPZipyfAqm7waU3Sy7gYCmgNqK5hPSb7TAjtftyN1/1
Posting
Single Signature
Public Keys
STM8HENaAV3PC1JaRsDiXuKGmDU42tTrJV95eHLTp9eAq3Jnq5DkR1/1
Memo
STM7g5AJ35RhXM2bq6hn6f722ycvai9ym1wRndsP7e7DHQCcWjpEf
{
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7uS8yWjAGgXjg4jmWKjHovHQxsH2TkMuS5FiXhUBAM41552d8D",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8iHnZhndBCZPZipyfAqm7waU3Sy7gYCmgNqK5hPSb7TAjtftyN",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8HENaAV3PC1JaRsDiXuKGmDU42tTrJV95eHLTp9eAq3Jnq5DkR",
        1
      ]
    ]
  },
  "memo": "STM7g5AJ35RhXM2bq6hn6f722ycvai9ym1wRndsP7e7DHQCcWjpEf"
}

Witness Votes

0 / 30
No active witness votes.
[]