Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS45.65%
Net Worth
4.266USD
STEEM
13.726STEEM
SBD
7.132SBD
Effective Power
5.001SP
├── Own SP
0.125SP
└── Incoming Deleg
+4.876SP

Detailed Balance

STEEM
balance
0.001STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
13.725STEEM
STEEM POWER
Own SP
0.125SP
Delegated Out
0.000SP
Delegation In
4.876SP
Effective Power
5.001SP
Reward SP (pending)
19.150SP
SBD
sbd_balance
0.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
7.132SBD
{
  "balance": "0.001 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "13.725 STEEM",
  "vesting_shares": "203.752305 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7939.907501 VESTS",
  "sbd_balance": "0.000 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "7.132 SBD",
  "conversions": []
}

Account Info

namedecipher-media
id953824
rank352,822
reputation521656027160
created2018-04-21T10:22:51
recovery_accountsteem
proxyNone
post_count2
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-07-07T08:42:21
last_root_post2018-07-07T08:42:21
last_vote_time1970-01-01T00:00:00
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.001 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares203.752305 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7939.907501 VESTS
reward_vesting_balance38848.625342 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-07-07T08:50:27
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 953824,
  "name": "decipher-media",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6DQmVn2M73CsDgdfo73gBJaDLqQ2DokiLnwUkgz1Pw6vnvA4gi",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7qe9RAaU5B1XJG1wNmBrJLSXeeEMqcMyjqmsoMUBknsyGKzQmT",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5waGCqMJbXvHBbGgZLWdtwwpYuRCsPN9nkzLRSdb8Ug1LyYKLP",
        1
      ]
    ]
  },
  "memo_key": "STM8jHFPsSJx6H4XgRGSdAaV6w3YSxKs9vFWE725gYaaU7Jav1eAL",
  "json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn-images-1.medium.com/fit/c/275/275/1*JNM2iUvadhIjRpkmxanAaA.jpeg\"}}",
  "posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn-images-1.medium.com/fit/c/275/275/1*JNM2iUvadhIjRpkmxanAaA.jpeg\"}}",
  "proxy": "",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_account_update": "2018-07-07T08:50:27",
  "created": "2018-04-21T10:22:51",
  "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": 2,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779060060
  },
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779060060
  },
  "voting_power": 0,
  "balance": "0.001 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": "7.132 SBD",
  "reward_steem_balance": "13.725 STEEM",
  "reward_vesting_balance": "38848.625342 VESTS",
  "reward_vesting_steem": "19.150 STEEM",
  "vesting_shares": "203.752305 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7939.907501 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": 38299,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "witnesses_voted_for": 0,
  "last_post": "2018-07-07T08:42:21",
  "last_root_post": "2018-07-07T08:42:21",
  "last_vote_time": "1970-01-01T00:00:00",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "vesting_balance": "0.000 STEEM",
  "reputation": "521656027160",
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 352822
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.876 SP to @decipher-media
2026/05/17 23:21:00
delegatorsteem
delegateedecipher-media
vesting shares7939.907501 VESTS
Transaction InfoBlock #106142368/Trx d3f320a7a22c0a014ed97177d602801df266f00a
View Raw JSON Data
{
  "trx_id": "d3f320a7a22c0a014ed97177d602801df266f00a",
  "block": 106142368,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-17T23:21:00",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "7939.907501 VESTS"
    }
  ]
}
steemdelegated 3.210 SP to @decipher-media
2026/05/12 00:11:15
delegatorsteem
delegateedecipher-media
vesting shares5227.697096 VESTS
Transaction InfoBlock #105971337/Trx 628946f664be39d820dad9d95025c2bf42c7d233
View Raw JSON Data
{
  "trx_id": "628946f664be39d820dad9d95025c2bf42c7d233",
  "block": 105971337,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-12T00:11:15",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "5227.697096 VESTS"
    }
  ]
}
steemdelegated 4.884 SP to @decipher-media
2026/04/25 22:43:27
delegatorsteem
delegateedecipher-media
vesting shares7952.423257 VESTS
Transaction InfoBlock #105510049/Trx b7e51fe120764812e946f35e9d5aa7a5abacc1de
View Raw JSON Data
{
  "trx_id": "b7e51fe120764812e946f35e9d5aa7a5abacc1de",
  "block": 105510049,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-04-25T22:43:27",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "7952.423257 VESTS"
    }
  ]
}
steemdelegated 3.236 SP to @decipher-media
2026/01/23 05:22:24
delegatorsteem
delegateedecipher-media
vesting shares5269.243915 VESTS
Transaction InfoBlock #102848901/Trx d1b1be7b21cd25b663e4e380d4f5ddbf43106812
View Raw JSON Data
{
  "trx_id": "d1b1be7b21cd25b663e4e380d4f5ddbf43106812",
  "block": 102848901,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-01-23T05:22:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "5269.243915 VESTS"
    }
  ]
}
steemdelegated 3.337 SP to @decipher-media
2024/12/17 00:42:24
delegatorsteem
delegateedecipher-media
vesting shares5433.463112 VESTS
Transaction InfoBlock #91295327/Trx dd4c71af0a9b0e528caa9019a685337496e26f73
View Raw JSON Data
{
  "trx_id": "dd4c71af0a9b0e528caa9019a685337496e26f73",
  "block": 91295327,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-12-17T00:42:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "5433.463112 VESTS"
    }
  ]
}
steemdelegated 3.441 SP to @decipher-media
2023/11/13 16:25:48
delegatorsteem
delegateedecipher-media
vesting shares5602.596644 VESTS
Transaction InfoBlock #79849551/Trx b4cd19f787fcd09f66c09a543e307b0cb8c2f7c9
View Raw JSON Data
{
  "trx_id": "b4cd19f787fcd09f66c09a543e307b0cb8c2f7c9",
  "block": 79849551,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-11-13T16:25:48",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "5602.596644 VESTS"
    }
  ]
}
steemdelegated 5.244 SP to @decipher-media
2023/09/21 20:46:00
delegatorsteem
delegateedecipher-media
vesting shares8539.875430 VESTS
Transaction InfoBlock #78346558/Trx e56397c7a8c90e65e09fbc530ec723040108dddd
View Raw JSON Data
{
  "trx_id": "e56397c7a8c90e65e09fbc530ec723040108dddd",
  "block": 78346558,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-09-21T20:46:00",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "8539.875430 VESTS"
    }
  ]
}
steemdelegated 5.381 SP to @decipher-media
2022/11/03 10:41:57
delegatorsteem
delegateedecipher-media
vesting shares8761.556868 VESTS
Transaction InfoBlock #69112062/Trx 9fc28ac37a5a51099db32c2929b8b77118a1ae3e
View Raw JSON Data
{
  "trx_id": "9fc28ac37a5a51099db32c2929b8b77118a1ae3e",
  "block": 69112062,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-11-03T10:41:57",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "8761.556868 VESTS"
    }
  ]
}
trx-steemsent 0.001 STEEM to @decipher-media- "Hello decipher-media, I automate the swapping between trx back to Steem. Just send 15 or more trx to >>> TUep3qrvP4QwqHtoXJjdQ6Q7JRQdyuaJQH | put your Steem username no @ for the memo <<< You wil..."
2022/08/09 20:28:00
fromtrx-steem
todecipher-media
amount0.001 STEEM
memoHello decipher-media, I automate the swapping between trx back to Steem. Just send 15 or more trx to >>> TUep3qrvP4QwqHtoXJjdQ6Q7JRQdyuaJQH | put your Steem username no @ for the memo <<< You will recieve the market value of tron converted to steem. within seconds. I posted a my results from sending it 100 tron yesterday here -> https://steemit.com/trx/@steemegg/sending-100-trx-to-trx-steem-and-i-got-back-25-203-in-6-seconds
Transaction InfoBlock #66662439/Trx 5e58ae46d8debf89890e183815563942148b8815
View Raw JSON Data
{
  "trx_id": "5e58ae46d8debf89890e183815563942148b8815",
  "block": 66662439,
  "trx_in_block": 9,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-08-09T20:28:00",
  "op": [
    "transfer",
    {
      "from": "trx-steem",
      "to": "decipher-media",
      "amount": "0.001 STEEM",
      "memo": "Hello decipher-media, I automate the swapping between trx back to Steem.  Just send 15 or more trx to >>>   TUep3qrvP4QwqHtoXJjdQ6Q7JRQdyuaJQH   | put your Steem username no @ for the memo <<< You will recieve the market value of tron converted to steem. within seconds.  I posted a my results from sending it 100 tron yesterday here ->  https://steemit.com/trx/@steemegg/sending-100-trx-to-trx-steem-and-i-got-back-25-203-in-6-seconds"
    }
  ]
}
steemdelegated 5.516 SP to @decipher-media
2022/01/17 10:02:51
delegatorsteem
delegateedecipher-media
vesting shares8982.090099 VESTS
Transaction InfoBlock #60808329/Trx f73c607924bef9f66edfd225d400f2d370c204b4
View Raw JSON Data
{
  "trx_id": "f73c607924bef9f66edfd225d400f2d370c204b4",
  "block": 60808329,
  "trx_in_block": 20,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-01-17T10:02:51",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "8982.090099 VESTS"
    }
  ]
}
steemdelegated 5.629 SP to @decipher-media
2021/06/14 00:00:15
delegatorsteem
delegateedecipher-media
vesting shares9165.858757 VESTS
Transaction InfoBlock #54606761/Trx 5929f3d2bf9b5d09f7a555b732cbf922a2e5fdce
View Raw JSON Data
{
  "trx_id": "5929f3d2bf9b5d09f7a555b732cbf922a2e5fdce",
  "block": 54606761,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2021-06-14T00:00:15",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "9165.858757 VESTS"
    }
  ]
}
steemdelegated 5.744 SP to @decipher-media
2020/12/11 10:20:36
delegatorsteem
delegateedecipher-media
vesting shares9353.280731 VESTS
Transaction InfoBlock #49354258/Trx be1701df3900fa37345f2687eb4e0cd421d4ded2
View Raw JSON Data
{
  "trx_id": "be1701df3900fa37345f2687eb4e0cd421d4ded2",
  "block": 49354258,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-11T10:20:36",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "9353.280731 VESTS"
    }
  ]
}
steemdelegated 1.175 SP to @decipher-media
2020/12/06 03:57:39
delegatorsteem
delegateedecipher-media
vesting shares1912.543513 VESTS
Transaction InfoBlock #49205819/Trx 986c124a7d137fe5416c4b386fb713cec9024178
View Raw JSON Data
{
  "trx_id": "986c124a7d137fe5416c4b386fb713cec9024178",
  "block": 49205819,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-06T03:57:39",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "1912.543513 VESTS"
    }
  ]
}
steemdelegated 5.748 SP to @decipher-media
2020/12/05 11:54:57
delegatorsteem
delegateedecipher-media
vesting shares9359.647370 VESTS
Transaction InfoBlock #49186929/Trx 8b3cd5d69d9ef48f5a5188c6cb02fbb71f54f553
View Raw JSON Data
{
  "trx_id": "8b3cd5d69d9ef48f5a5188c6cb02fbb71f54f553",
  "block": 49186929,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-05T11:54:57",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "9359.647370 VESTS"
    }
  ]
}
steemdelegated 1.179 SP to @decipher-media
2020/11/02 13:57:24
delegatorsteem
delegateedecipher-media
vesting shares1920.017158 VESTS
Transaction InfoBlock #48255824/Trx 021630ef95f354cdbafb1bf75ed09eda48615cdb
View Raw JSON Data
{
  "trx_id": "021630ef95f354cdbafb1bf75ed09eda48615cdb",
  "block": 48255824,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-11-02T13:57:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "1920.017158 VESTS"
    }
  ]
}
steemdelegated 5.872 SP to @decipher-media
2020/05/09 04:54:09
delegatorsteem
delegateedecipher-media
vesting shares9562.293944 VESTS
Transaction InfoBlock #43216057/Trx 6990c448e3c4e567537d976ae4369bf57faae179
View Raw JSON Data
{
  "trx_id": "6990c448e3c4e567537d976ae4369bf57faae179",
  "block": 43216057,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-09T04:54:09",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "9562.293944 VESTS"
    }
  ]
}
steemdelegated 1.200 SP to @decipher-media
2020/05/08 08:22:54
delegatorsteem
delegateedecipher-media
vesting shares1953.311140 VESTS
Transaction InfoBlock #43192007/Trx 5d19faa9b8fbf91d07cfe56e54757285788b65ed
View Raw JSON Data
{
  "trx_id": "5d19faa9b8fbf91d07cfe56e54757285788b65ed",
  "block": 43192007,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-08T08:22:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "1953.311140 VESTS"
    }
  ]
}
steemdelegated 5.954 SP to @decipher-media
2019/09/18 04:55:00
delegatorsteem
delegateedecipher-media
vesting shares9694.908374 VESTS
Transaction InfoBlock #36520078/Trx e83a6efa525027cba0ca49f92ea6410b83f9365c
View Raw JSON Data
{
  "trx_id": "e83a6efa525027cba0ca49f92ea6410b83f9365c",
  "block": 36520078,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-09-18T04:55:00",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "9694.908374 VESTS"
    }
  ]
}
2019/04/21 11:22:21
parent authordecipher-media
parent permlink1-2-casper-ffg-q-and-a-code-review
authorsteemitboard
permlinksteemitboard-notify-decipher-media-20190421t112221000z
title
bodyCongratulations @decipher-media! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@decipher-media/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/@decipher-media) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=decipher-media)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #32236773/Trx 5ba54f5bf9e26ef989669c38bb558899294e0c15
View Raw JSON Data
{
  "trx_id": "5ba54f5bf9e26ef989669c38bb558899294e0c15",
  "block": 32236773,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-04-21T11:22:21",
  "op": [
    "comment",
    {
      "parent_author": "decipher-media",
      "parent_permlink": "1-2-casper-ffg-q-and-a-code-review",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-decipher-media-20190421t112221000z",
      "title": "",
      "body": "Congratulations @decipher-media! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@decipher-media/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/@decipher-media) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=decipher-media)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
steemdelegated 6.075 SP to @decipher-media
2018/10/08 16:13:54
delegatorsteem
delegateedecipher-media
vesting shares9892.929286 VESTS
Transaction InfoBlock #26632202/Trx 1bf1e264983c56fb6ec8d14a5cbe8cf12651a4cd
View Raw JSON Data
{
  "trx_id": "1bf1e264983c56fb6ec8d14a5cbe8cf12651a4cd",
  "block": 26632202,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-10-08T16:13:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "9892.929286 VESTS"
    }
  ]
}
steemdelegated 18.519 SP to @decipher-media
2018/08/26 00:19:48
delegatorsteem
delegateedecipher-media
vesting shares30156.527162 VESTS
Transaction InfoBlock #25391177/Trx b4574b6e7d67cc88a30a64fbb97ecb1ccb76c617
View Raw JSON Data
{
  "trx_id": "b4574b6e7d67cc88a30a64fbb97ecb1ccb76c617",
  "block": 25391177,
  "trx_in_block": 40,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-26T00:19:48",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "30156.527162 VESTS"
    }
  ]
}
2018/07/15 15:51:30
parent authordecipher-media
parent permlink1-2-casper-ffg-q-and-a-code-review
authorsteemitboard
permlinksteemitboard-notify-decipher-media-20180715t155130000z
title
bodyCongratulations @decipher-media! You have completed the following achievement on Steemit and have been rewarded with new badge(s) : [![](https://steemitimages.com/70x70/http://steemitboard.com/notifications/firstpayout.png)](http://steemitboard.com/@decipher-media) You got your First payout [![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/payout.png)](http://steemitboard.com/@decipher-media) Award for the total payout received <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 not miss the last post from @steemitboard:** [SteemitBoard World Cup Contest - Play-off for third result](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-play-off-for-third-result) --- **Participate in the [SteemitBoard World Cup Contest](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-collect-badges-and-win-free-sbd)!** Collect World Cup badges and win free SBD Support the Gold Sponsors of the contest: [@good-karma](https://v2.steemconnect.com/sign/account-witness-vote?witness=good-karma&approve=1) and [@lukestokes](https://v2.steemconnect.com/sign/account-witness-vote?witness=lukestokes.mhth&approve=1) --- > 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"]}
Transaction InfoBlock #24201258/Trx 3b5d5aee29fce53611aea5eeeecae3c41115f2da
View Raw JSON Data
{
  "trx_id": "3b5d5aee29fce53611aea5eeeecae3c41115f2da",
  "block": 24201258,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-15T15:51:30",
  "op": [
    "comment",
    {
      "parent_author": "decipher-media",
      "parent_permlink": "1-2-casper-ffg-q-and-a-code-review",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-decipher-media-20180715t155130000z",
      "title": "",
      "body": "Congratulations @decipher-media! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :\n\n[![](https://steemitimages.com/70x70/http://steemitboard.com/notifications/firstpayout.png)](http://steemitboard.com/@decipher-media) You got your First payout\n[![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/payout.png)](http://steemitboard.com/@decipher-media) Award for the total payout received\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 not miss the last post from @steemitboard:**\n[SteemitBoard World Cup Contest - Play-off for third result](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-play-off-for-third-result)\n\n---\n**Participate in the [SteemitBoard World Cup Contest](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-collect-badges-and-win-free-sbd)!**\nCollect World Cup badges and win free SBD\nSupport the Gold Sponsors of the contest: [@good-karma](https://v2.steemconnect.com/sign/account-witness-vote?witness=good-karma&approve=1) and [@lukestokes](https://v2.steemconnect.com/sign/account-witness-vote?witness=lukestokes.mhth&approve=1)\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\"]}"
    }
  ]
}
2018/07/15 14:58:12
voterwasabi90
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
weight10000 (100.00%)
Transaction InfoBlock #24200192/Trx f7429f5e0017a6777b7db2581aae7e647bee174a
View Raw JSON Data
{
  "trx_id": "f7429f5e0017a6777b7db2581aae7e647bee174a",
  "block": 24200192,
  "trx_in_block": 37,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-15T14:58:12",
  "op": [
    "vote",
    {
      "voter": "wasabi90",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "weight": 10000
    }
  ]
}
decipher-mediareceived 6.804 STEEM, 3.536 SBD, 11.828 SP author reward for @decipher-media / 1-2-casper-ffg-q-and-a-code-review
2018/07/14 08:42:21
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
sbd payout3.536 SBD
steem payout6.804 STEEM
vesting payout19259.984801 VESTS
Transaction InfoBlock #24163879/Virtual Operation #9
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 24163879,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 9,
  "timestamp": "2018-07-14T08:42:21",
  "op": [
    "author_reward",
    {
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "sbd_payout": "3.536 SBD",
      "steem_payout": "6.804 STEEM",
      "vesting_payout": "19259.984801 VESTS"
    }
  ]
}
decipher-mediareceived 6.921 STEEM, 3.596 SBD, 12.030 SP author reward for @decipher-media / 1-1-casper-overview
2018/07/14 08:21:57
authordecipher-media
permlink1-1-casper-overview
sbd payout3.596 SBD
steem payout6.921 STEEM
vesting payout19588.640541 VESTS
Transaction InfoBlock #24163471/Virtual Operation #8
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 24163471,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 8,
  "timestamp": "2018-07-14T08:21:57",
  "op": [
    "author_reward",
    {
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "sbd_payout": "3.596 SBD",
      "steem_payout": "6.921 STEEM",
      "vesting_payout": "19588.640541 VESTS"
    }
  ]
}
2018/07/11 11:15:09
voterjaeykim
authordecipher-media
permlink1-1-casper-overview
weight10000 (100.00%)
Transaction InfoBlock #24080570/Trx 8fa6253560d5909525e58e060379f5a9918184a2
View Raw JSON Data
{
  "trx_id": "8fa6253560d5909525e58e060379f5a9918184a2",
  "block": 24080570,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-11T11:15:09",
  "op": [
    "vote",
    {
      "voter": "jaeykim",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "weight": 10000
    }
  ]
}
2018/07/11 11:14:57
voterjaeykim
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
weight10000 (100.00%)
Transaction InfoBlock #24080566/Trx 4f1edc68146aacd37d992e3fa2c75497dea3d944
View Raw JSON Data
{
  "trx_id": "4f1edc68146aacd37d992e3fa2c75497dea3d944",
  "block": 24080566,
  "trx_in_block": 94,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-11T11:14:57",
  "op": [
    "vote",
    {
      "voter": "jaeykim",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "weight": 10000
    }
  ]
}
2018/07/11 09:19:09
voterwhdqkf88
authordecipher-media
permlink1-1-casper-overview
weight10000 (100.00%)
Transaction InfoBlock #24078250/Trx 3b438ba81c3d2edceb86eb53c5acf70e9bba55d9
View Raw JSON Data
{
  "trx_id": "3b438ba81c3d2edceb86eb53c5acf70e9bba55d9",
  "block": 24078250,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-11T09:19:09",
  "op": [
    "vote",
    {
      "voter": "whdqkf88",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "weight": 10000
    }
  ]
}
2018/07/11 09:01:57
votergopaxkr
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
weight10000 (100.00%)
Transaction InfoBlock #24077906/Trx 7ab71743afb87089c19997436bbd5b12b34fa399
View Raw JSON Data
{
  "trx_id": "7ab71743afb87089c19997436bbd5b12b34fa399",
  "block": 24077906,
  "trx_in_block": 28,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-11T09:01:57",
  "op": [
    "vote",
    {
      "voter": "gopaxkr",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "weight": 10000
    }
  ]
}
2018/07/11 09:01:45
votergopaxkr
authordecipher-media
permlink1-1-casper-overview
weight10000 (100.00%)
Transaction InfoBlock #24077902/Trx 203cbd8eaa24fddab24e327276c301e379219f69
View Raw JSON Data
{
  "trx_id": "203cbd8eaa24fddab24e327276c301e379219f69",
  "block": 24077902,
  "trx_in_block": 26,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-11T09:01:45",
  "op": [
    "vote",
    {
      "voter": "gopaxkr",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "weight": 10000
    }
  ]
}
2018/07/09 06:58:30
parent author
parent permlinkethereum
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
title블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review
body@@ -16377,8 +16377,62 @@ %EB%82%B8%EB%8B%A4(493). +%0A%3E%EB%B3%B8 %ED%8F%AC%EC%8A%A4%ED%8C%85%EC%9D%80 %EC%95%94%ED%98%B8%ED%99%94%ED%8F%90 %EA%B1%B0%EB%9E%98%EC%86%8C %EA%B3%A0%ED%8C%8D%EC%8A%A4(@gopaxkr)%EC%9D%98 %ED%9B%84%EC%9B%90%EC%9D%84 %EB%B0%9B%EC%95%84 %EB%94%94%EC%82%AC%EC%9D%B4%ED%8D%BC%EA%B0%80 %EC%9E%91%EC%84%B1%ED%95%98%EC%98%80%EC%8A%B5%EB%8B%88%EB%8B%A4.
json metadata{"tags":["ethereum","kr-newbie","blockchain","decipher","coinkorea"],"image":["https://steemitimages.com/DQmPfnx45kSUMRTsAgimLZncehbvwj65xYchDMhFneqHUiw/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmad7jJKaEa6Y3rhhK8qhg8gbwkcFDAMKYBnpDniQ6Eedg/image.png","https://steemitimages.com/DQmUYSRxsVLxgY3hXFL4wLY3htGNzk6etvcATPLqSQonegP/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmQRbkGs3182wt6N2ARrmEGjdxGpQcs1NfYz9DbdnwJoc4/image.png","https://steemitimages.com/DQmQ5MYsngpm8tPySi4uU6ngrxYv2hruqMTJxU1Ai4Sbdvd/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmQM6Yn2QwUPYy6DBV9hzFScRE1RggsGY4p57wUcCuMfHj/image.png","https://steemitimages.com/DQmW9s2AaPF3U64BVm4GrMH9SpHCaCRtpt1SLNQTufvvX3A/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmeVb1Sj4Yd4Maxd8GFgV7Zc7HtH7hZ45trhT3SbkxWb4M/image.png"],"links":["https://steemit.com/@moongunflag","https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1","https://steemit.com/casper/@decipher-media/1-1-casper-overview","https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review","https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://ethresear.ch/t/casper-ffg-with-one-message-type-and-simpler-fork-choice-rule/","https://ethresear.ch/c/casper","https://github.com/ethereum/research/blob/master/papers/casper-economics/casper_economics_basic.pdf","https://github.com/ethereum/casper/blob/master/IMPLEMENTATION.md#validator-workflow-overview","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2"],"app":"steemit/0.1","format":"markdown","users":["decipher-media","gopaxkr"]}
Transaction InfoBlock #24017855/Trx e031ef93133015fd52caec30875fb1e108cb0a02
View Raw JSON Data
{
  "trx_id": "e031ef93133015fd52caec30875fb1e108cb0a02",
  "block": 24017855,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-09T06:58:30",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "ethereum",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "title": "블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review",
      "body": "@@ -16377,8 +16377,62 @@\n %EB%82%B8%EB%8B%A4(493).\n+%0A%3E%EB%B3%B8 %ED%8F%AC%EC%8A%A4%ED%8C%85%EC%9D%80 %EC%95%94%ED%98%B8%ED%99%94%ED%8F%90 %EA%B1%B0%EB%9E%98%EC%86%8C %EA%B3%A0%ED%8C%8D%EC%8A%A4(@gopaxkr)%EC%9D%98 %ED%9B%84%EC%9B%90%EC%9D%84 %EB%B0%9B%EC%95%84 %EB%94%94%EC%82%AC%EC%9D%B4%ED%8D%BC%EA%B0%80 %EC%9E%91%EC%84%B1%ED%95%98%EC%98%80%EC%8A%B5%EB%8B%88%EB%8B%A4.\n",
      "json_metadata": "{\"tags\":[\"ethereum\",\"kr-newbie\",\"blockchain\",\"decipher\",\"coinkorea\"],\"image\":[\"https://steemitimages.com/DQmPfnx45kSUMRTsAgimLZncehbvwj65xYchDMhFneqHUiw/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmad7jJKaEa6Y3rhhK8qhg8gbwkcFDAMKYBnpDniQ6Eedg/image.png\",\"https://steemitimages.com/DQmUYSRxsVLxgY3hXFL4wLY3htGNzk6etvcATPLqSQonegP/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmQRbkGs3182wt6N2ARrmEGjdxGpQcs1NfYz9DbdnwJoc4/image.png\",\"https://steemitimages.com/DQmQ5MYsngpm8tPySi4uU6ngrxYv2hruqMTJxU1Ai4Sbdvd/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmQM6Yn2QwUPYy6DBV9hzFScRE1RggsGY4p57wUcCuMfHj/image.png\",\"https://steemitimages.com/DQmW9s2AaPF3U64BVm4GrMH9SpHCaCRtpt1SLNQTufvvX3A/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmeVb1Sj4Yd4Maxd8GFgV7Zc7HtH7hZ45trhT3SbkxWb4M/image.png\"],\"links\":[\"https://steemit.com/@moongunflag\",\"https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1\",\"https://steemit.com/casper/@decipher-media/1-1-casper-overview\",\"https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review\",\"https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://ethresear.ch/t/casper-ffg-with-one-message-type-and-simpler-fork-choice-rule/\",\"https://ethresear.ch/c/casper\",\"https://github.com/ethereum/research/blob/master/papers/casper-economics/casper_economics_basic.pdf\",\"https://github.com/ethereum/casper/blob/master/IMPLEMENTATION.md#validator-workflow-overview\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"users\":[\"decipher-media\",\"gopaxkr\"]}"
    }
  ]
}
decipher-mediapublished a new post: 1-1-casper-overview
2018/07/09 06:57:06
parent author
parent permlinkcasper
authordecipher-media
permlink1-1-casper-overview
title블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview
body@@ -12804,16 +12804,69 @@ %EB%A0%A4%EA%B3%A0 %ED%95%9C%EB%8B%A4.%0A%0A +%3E%EB%B3%B8 %ED%8F%AC%EC%8A%A4%ED%8C%85%EC%9D%80 %EC%95%94%ED%98%B8%ED%99%94%ED%8F%90 %EA%B1%B0%EB%9E%98%EC%86%8C %EA%B3%A0%ED%8C%8D%EC%8A%A4(@gopaxkr)%EC%9D%98 %ED%9B%84%EC%9B%90%EC%9D%84 %EB%B0%9B%EC%95%84 %EB%94%94%EC%82%AC%EC%9D%B4%ED%8D%BC%EA%B0%80 %EC%9E%91%EC%84%B1%ED%95%98%EC%98%80%EC%8A%B5%EB%8B%88%EB%8B%A4. %0A%5B%EB%8B%A4%EC%9D%8C%EA%B8%80) %EB%B8%94
json metadata{"tags":["casper","coinkorea","decipher","kr-newbie","kr"],"users":["decipher-media","gopaxkr"],"image":["https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.","https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.","https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.","https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.","https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.","https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.","https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.","https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.","https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.","https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.","https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J."],"links":["https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458","https://steemit.com/casper/@decipher-media/1-1-casper-overview","https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00","https://powercompare.co.uk/bitcoin/","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2","https://tendermint.com/static/docs/tendermint.pdf","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466","https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #24017827/Trx abd6e32b58c4d05a30a395d8382cb8da3168a644
View Raw JSON Data
{
  "trx_id": "abd6e32b58c4d05a30a395d8382cb8da3168a644",
  "block": 24017827,
  "trx_in_block": 29,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-09T06:57:06",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "casper",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "title": "블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview",
      "body": "@@ -12804,16 +12804,69 @@\n %EB%A0%A4%EA%B3%A0 %ED%95%9C%EB%8B%A4.%0A%0A\n+%3E%EB%B3%B8 %ED%8F%AC%EC%8A%A4%ED%8C%85%EC%9D%80 %EC%95%94%ED%98%B8%ED%99%94%ED%8F%90 %EA%B1%B0%EB%9E%98%EC%86%8C %EA%B3%A0%ED%8C%8D%EC%8A%A4(@gopaxkr)%EC%9D%98 %ED%9B%84%EC%9B%90%EC%9D%84 %EB%B0%9B%EC%95%84 %EB%94%94%EC%82%AC%EC%9D%B4%ED%8D%BC%EA%B0%80 %EC%9E%91%EC%84%B1%ED%95%98%EC%98%80%EC%8A%B5%EB%8B%88%EB%8B%A4.\n %0A%5B%EB%8B%A4%EC%9D%8C%EA%B8%80) %EB%B8%94\n",
      "json_metadata": "{\"tags\":[\"casper\",\"coinkorea\",\"decipher\",\"kr-newbie\",\"kr\"],\"users\":[\"decipher-media\",\"gopaxkr\"],\"image\":[\"https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.\",\"https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.\",\"https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.\",\"https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.\",\"https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.\",\"https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.\",\"https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.\",\"https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.\",\"https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.\",\"https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.\",\"https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.\"],\"links\":[\"https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458\",\"https://steemit.com/casper/@decipher-media/1-1-casper-overview\",\"https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00\",\"https://powercompare.co.uk/bitcoin/\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\",\"https://tendermint.com/static/docs/tendermint.pdf\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466\",\"https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/08 07:30:45
voterubg
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
weight100 (1.00%)
Transaction InfoBlock #23989705/Trx 6b5336a78869b67e0b9802caeb4166efac2a90c6
View Raw JSON Data
{
  "trx_id": "6b5336a78869b67e0b9802caeb4166efac2a90c6",
  "block": 23989705,
  "trx_in_block": 36,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-08T07:30:45",
  "op": [
    "vote",
    {
      "voter": "ubg",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "weight": 100
    }
  ]
}
2018/07/08 07:29:54
parent author
parent permlinkethereum
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
title블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review
body@@ -106,17 +106,17 @@ ecipher( -%5B +@ decipher @@ -125,92 +125,8 @@ edia -%5D(https://medium.com/decipher-media %22This link will take you away from steemit.com%22) )_%0A%0A
json metadata{"tags":["ethereum","kr-newbie","blockchain","decipher","coinkorea"],"image":["https://steemitimages.com/DQmPfnx45kSUMRTsAgimLZncehbvwj65xYchDMhFneqHUiw/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmad7jJKaEa6Y3rhhK8qhg8gbwkcFDAMKYBnpDniQ6Eedg/image.png","https://steemitimages.com/DQmUYSRxsVLxgY3hXFL4wLY3htGNzk6etvcATPLqSQonegP/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmQRbkGs3182wt6N2ARrmEGjdxGpQcs1NfYz9DbdnwJoc4/image.png","https://steemitimages.com/DQmQ5MYsngpm8tPySi4uU6ngrxYv2hruqMTJxU1Ai4Sbdvd/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmQM6Yn2QwUPYy6DBV9hzFScRE1RggsGY4p57wUcCuMfHj/image.png","https://steemitimages.com/DQmW9s2AaPF3U64BVm4GrMH9SpHCaCRtpt1SLNQTufvvX3A/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmeVb1Sj4Yd4Maxd8GFgV7Zc7HtH7hZ45trhT3SbkxWb4M/image.png"],"links":["https://steemit.com/@moongunflag","https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1","https://steemit.com/casper/@decipher-media/1-1-casper-overview","https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review","https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://ethresear.ch/t/casper-ffg-with-one-message-type-and-simpler-fork-choice-rule/","https://ethresear.ch/c/casper","https://github.com/ethereum/research/blob/master/papers/casper-economics/casper_economics_basic.pdf","https://github.com/ethereum/casper/blob/master/IMPLEMENTATION.md#validator-workflow-overview","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2"],"app":"steemit/0.1","format":"markdown","users":["decipher-media"]}
Transaction InfoBlock #23989688/Trx 6cf8b5f107d4a6be327639816b19136ff5e1e9ca
View Raw JSON Data
{
  "trx_id": "6cf8b5f107d4a6be327639816b19136ff5e1e9ca",
  "block": 23989688,
  "trx_in_block": 9,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-08T07:29:54",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "ethereum",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "title": "블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review",
      "body": "@@ -106,17 +106,17 @@\n ecipher(\n-%5B\n+@\n decipher\n@@ -125,92 +125,8 @@\n edia\n-%5D(https://medium.com/decipher-media %22This link will take you away from steemit.com%22)\n )_%0A%0A\n",
      "json_metadata": "{\"tags\":[\"ethereum\",\"kr-newbie\",\"blockchain\",\"decipher\",\"coinkorea\"],\"image\":[\"https://steemitimages.com/DQmPfnx45kSUMRTsAgimLZncehbvwj65xYchDMhFneqHUiw/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmad7jJKaEa6Y3rhhK8qhg8gbwkcFDAMKYBnpDniQ6Eedg/image.png\",\"https://steemitimages.com/DQmUYSRxsVLxgY3hXFL4wLY3htGNzk6etvcATPLqSQonegP/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmQRbkGs3182wt6N2ARrmEGjdxGpQcs1NfYz9DbdnwJoc4/image.png\",\"https://steemitimages.com/DQmQ5MYsngpm8tPySi4uU6ngrxYv2hruqMTJxU1Ai4Sbdvd/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmQM6Yn2QwUPYy6DBV9hzFScRE1RggsGY4p57wUcCuMfHj/image.png\",\"https://steemitimages.com/DQmW9s2AaPF3U64BVm4GrMH9SpHCaCRtpt1SLNQTufvvX3A/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmeVb1Sj4Yd4Maxd8GFgV7Zc7HtH7hZ45trhT3SbkxWb4M/image.png\"],\"links\":[\"https://steemit.com/@moongunflag\",\"https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1\",\"https://steemit.com/casper/@decipher-media/1-1-casper-overview\",\"https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review\",\"https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://ethresear.ch/t/casper-ffg-with-one-message-type-and-simpler-fork-choice-rule/\",\"https://ethresear.ch/c/casper\",\"https://github.com/ethereum/research/blob/master/papers/casper-economics/casper_economics_basic.pdf\",\"https://github.com/ethereum/casper/blob/master/IMPLEMENTATION.md#validator-workflow-overview\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"users\":[\"decipher-media\"]}"
    }
  ]
}
2018/07/08 06:15:12
votersm2mr
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
weight10000 (100.00%)
Transaction InfoBlock #23988194/Trx 2afaf8686f31f5d0ba59cd99c9ea042cd7282c1a
View Raw JSON Data
{
  "trx_id": "2afaf8686f31f5d0ba59cd99c9ea042cd7282c1a",
  "block": 23988194,
  "trx_in_block": 27,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-08T06:15:12",
  "op": [
    "vote",
    {
      "voter": "sm2mr",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "weight": 10000
    }
  ]
}
2018/07/07 14:55:45
parent authordecipher-media
parent permlink1-2-casper-ffg-q-and-a-code-review
authorsteemitboard
permlinksteemitboard-notify-decipher-media-20180707t145547000z
title
bodyCongratulations @decipher-media! You have completed the following achievement on Steemit and have been rewarded with new badge(s) : [![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/voted.png)](http://steemitboard.com/@decipher-media) Award for the number of upvotes received <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 not miss the last post from @steemitboard:** [SteemitBoard World Cup Contest - Quarter Finals - Day 1](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-quarter-finals-day-1) --- **Participate in the [SteemitBoard World Cup Contest](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-collect-badges-and-win-free-sbd)!** Collect World Cup badges and win free SBD Support the Gold Sponsors of the contest: [@good-karma](https://v2.steemconnect.com/sign/account-witness-vote?witness=good-karma&approve=1) and [@lukestokes](https://v2.steemconnect.com/sign/account-witness-vote?witness=lukestokes.mhth&approve=1) --- > 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"]}
Transaction InfoBlock #23969811/Trx e9fe96d5eccd6ef18e5089d91f1d86d13647a2f9
View Raw JSON Data
{
  "trx_id": "e9fe96d5eccd6ef18e5089d91f1d86d13647a2f9",
  "block": 23969811,
  "trx_in_block": 36,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T14:55:45",
  "op": [
    "comment",
    {
      "parent_author": "decipher-media",
      "parent_permlink": "1-2-casper-ffg-q-and-a-code-review",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-decipher-media-20180707t145547000z",
      "title": "",
      "body": "Congratulations @decipher-media! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :\n\n[![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/voted.png)](http://steemitboard.com/@decipher-media) Award for the number of upvotes received\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 not miss the last post from @steemitboard:**\n[SteemitBoard World Cup Contest - Quarter Finals - Day 1](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-quarter-finals-day-1)\n\n---\n**Participate in the [SteemitBoard World Cup Contest](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-collect-badges-and-win-free-sbd)!**\nCollect World Cup badges and win free SBD\nSupport the Gold Sponsors of the contest: [@good-karma](https://v2.steemconnect.com/sign/account-witness-vote?witness=good-karma&approve=1) and [@lukestokes](https://v2.steemconnect.com/sign/account-witness-vote?witness=lukestokes.mhth&approve=1)\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\"]}"
    }
  ]
}
2018/07/07 12:50:15
voterbramd
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
weight2000 (20.00%)
Transaction InfoBlock #23967303/Trx 643355d2b4e58dd17874dfb638fd1b5179035ce4
View Raw JSON Data
{
  "trx_id": "643355d2b4e58dd17874dfb638fd1b5179035ce4",
  "block": 23967303,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:50:15",
  "op": [
    "vote",
    {
      "voter": "bramd",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "weight": 2000
    }
  ]
}
2018/07/07 12:50:03
voterbramd
authordecipher-media
permlink1-1-casper-overview
weight2000 (20.00%)
Transaction InfoBlock #23967299/Trx 43849347822cb979964eb38a82e3d84119608d1d
View Raw JSON Data
{
  "trx_id": "43849347822cb979964eb38a82e3d84119608d1d",
  "block": 23967299,
  "trx_in_block": 23,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:50:03",
  "op": [
    "vote",
    {
      "voter": "bramd",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "weight": 2000
    }
  ]
}
2018/07/07 12:46:39
voterjchoy
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
weight10000 (100.00%)
Transaction InfoBlock #23967231/Trx 7a52ce99bc8a83b7e726882d92d6232d7ac86d8e
View Raw JSON Data
{
  "trx_id": "7a52ce99bc8a83b7e726882d92d6232d7ac86d8e",
  "block": 23967231,
  "trx_in_block": 12,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:46:39",
  "op": [
    "vote",
    {
      "voter": "jchoy",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "weight": 10000
    }
  ]
}
2018/07/07 12:46:09
voterjchoy
authordecipher-media
permlink1-1-casper-overview
weight10000 (100.00%)
Transaction InfoBlock #23967221/Trx 08799bd741c5c566a2bfe54f06d367780c44cf75
View Raw JSON Data
{
  "trx_id": "08799bd741c5c566a2bfe54f06d367780c44cf75",
  "block": 23967221,
  "trx_in_block": 26,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:46:09",
  "op": [
    "vote",
    {
      "voter": "jchoy",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "weight": 10000
    }
  ]
}
decipher-mediapublished a new post: 1-1-casper-overview
2018/07/07 12:39:15
parent author
parent permlinkcasper
authordecipher-media
permlink1-1-casper-overview
title블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview
body_Jong-Ho Kim(Jason Kim) Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)_ #### *Note: 이 글은 서울대학교 블록체인 학회 디사이퍼에서 작성한 [미디엄 아티클](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458)을 옮긴 글입니다. 이 글에서 설명하는 모든 내용은 2018년 4월 17일을 기준으로 합니다. <br> >서울대학교 블록체인 학회인 ‘디사이퍼(Decipher)’에서 블록체인의 스케일링 솔루션에 관한 글들을 시리즈로 연재합니다. 시리즈의 첫 번째 주인공은 **Ethereum의 “Casper the Freindly Finality Gadget”**입니다. [1–1. Casper FFG Overview](https://steemit.com/casper/@decipher-media/1-1-casper-overview), [1–2. Casper FFG — Q&A 및 Code Review](https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review)로 나누어 설명합니다. 첫번째 주제로 이더리움이 PoW(Proof of Work) 합의 알고리즘에서 PoS(Proof of Stake) 로 전환하기 위해 고민되고 있는 Casper 에 대해서 알아보고자 한다. Casper는 이더리움 창시자인 비탈릭 부테린(Vitalik Buterin)이 제시하는 “Casper the Friendly Finality Gadget”(FFG)와 이더리움 재단 연구원인 블라드 잠퍼(Vlad Zamfir)가 제시하는 “Casper the Friendly GHOST: Correct-by-Construction”(CBC)가 존재한다. FFG는 PoW와 PoS를 같이 가져가는 하이브리드 캐스퍼라고도 불린다. 이번 글에서는 비탈릭 부테린과 버질 그리피스(Virgil Griffith)가 작성한 “Casper the Friendly Finality Gadget” 논문을 중심으로 Casper FFG 에 대해 알아보도록 하자. ### **Proof of Work 의 문제는 무엇인가?** Casper 의 원리를 설명하기 전, 이더리움에서 이미 잘 동작하고 있는 PoW에서 PoS로 변경하려는 이유에 대해 알아보자. 이더리움 재단 연구원인 [칼 플로리쉬(Karl Floersch)의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00)를 보면 크게 두 가지로 정리된다. 첫번째로 PoW로 인해 소모되는 에너지를 줄일 수 있다는 것이다. PoW에서 블록을 생성하기 위해서는 특정 조건을 만족하는 해시값을 계산하는 일을 반복해야된다. 이러한 해시값 계산은 하드웨어가 전기를 소모하게 하고 이러한 전기 소모는 에너지의 낭비로 이어진다. Powercompare에 따르면 [비트코인 채굴로 인한 전기 소모는 아일랜드나 대부분의 아프리카 나라들의 전기 소모량을 넘는 수준이라고 한다](https://powercompare.co.uk/bitcoin/). Powercompare의 보고서가 2017년에 써졌는데 지금은 더 많은 국가들의 전기 소모량을 넘을 것이다. 이처럼 막대한 양의 에너지를 소모하는 시스템은 장기적으로 봤을 때 환경에 해롭기 때문에 에너지 소모량을 줄이기 위해 PoS가 필요하다고 주장한다. 두번째로는 ASIC(Application Specific Integrated Circuit)와 중앙화된 채굴 집단으로 인해서 메인 체인(블록 넘버가 가장 큰 블록을 포함한 체인)을 변경할 수 있다는 것이다. 즉, 완결성(Finality)의 부재이다. 완결성이란 이미 결정된 블록체인이 바뀌지 않는 것을 의미한다. ASIC 혹은 빠른 채굴 장비가 등장해서 기존에 가장 긴 체인 이외의 다른 가지의 블록을 빠르게 생성해나가 가장 긴 체인을 역전한다면, 메인 체인이 변경될 수 있다. 과거의 가장 긴 체인에 포함되어 있었지만, ASIC에 의해 새롭게 생긴 가장 긴 체인에는 포함되지 않은 트랜잭션이 있다면 갑자기 잔고가 변경될 수 도 있다. 이러한 문제점 때문에 PoS 도입을 통한 완결성이 필요하다. ### **캐스퍼 이전의 Proof of Stake 연구들** PoS 에서는 채굴자(Miner) 대신 검증인(Validator) 용어를 사용한다. 검증인이란 블록을 생성하기 위한 참가하는 사람을 의미한다. 이더리움 캐스퍼에서는 검증인이 되기 위해서 일정량 이상의 이더리움([2018년 3월 기준 1500ETH](https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2))을 예치해야한다. 그리고 검증인들이 모여있는 집단을 검증인 집단이라고 부르도록 하자. PoS는 캐스퍼에서 처음 등장하는 개념이 아니라 이전에도 존재하던 개념이다. 캐스퍼 이전에는 크게 두 가지의 PoS 디자인이 존재했다. 첫째로는 체인 기반의 PoS(chain-based Proof of Stake)이다. 무작위 랜덤 알고리즘이 특정 시간 간격으로 검증인 집단에서 검증인을 뽑고 블록을 만들 권한을 준다. 그리고 선정된 검증인은 블록을 생성한다. PeerCoin이나 BlackCoin이 이러한 방식의 PoS를 취한다. 두번째로는 BFT(Byzantine Fault Tolerant) 방식의 PoS가 존재한다. BFT-방식에서는 검증인 집단에서 무작위로 선출된 검증인에게 블록을 제안 할 수 있는 권리를 준다. 블록을 제안하는 것이 블록을 바로 생성하는 것은 아니다. 블록이 finalize 되려면 여러 차례의 투표 라운드 동안 ⅔ 이상의 검증인들이 특정 블록을 인정하는 투표를 해야한다. 이러한 과정을 통해서 블록이 영구적으로 체인에 포함되면 블록의 길이에 영향을 받지 않게 된다. Tendermint 가 BFT 방식의 PoS 방식을 이용한다. 이 과정도 Casper 만큼 복잡한 과정에 의해 이뤄지는데 Tendermint 의 PoS 방식에 관심이 있다면 “[Tendermint: Consensus without mining](https://tendermint.com/static/docs/tendermint.pdf)” 을 읽어보길 바란다. ### **캐스퍼 프로토콜 이란?** 하이브리드 PoW/PoS 시스템은 이더리움에 적용하는 첫번째 캐스퍼 버전이다. 검증인 집단이 변하지 않는다는 가정 하에 캐스퍼 프로토콜이 어떻게 동작하는지 알아보자. 우선 검증인이 되기 위해서는 캐스퍼 스마트 컨트랙트에 이더리움을 예치금(deposit)으로 맡겨야한다. 인센티브 로직이 스마트 컨트랙트에 있기 때문에 합의 과정을 통해 블록을 올바르게 생성했을 경우 예치금을 맡긴 검증인들에게 보상이 주어진다. 반대로 블록 합의 과정에서 잘못된 행동을 하였을 때 예치금을 몰수해서 처벌을 가한다. PoS의 안정성은 예치금의 크기와 비례한다. 규칙을 어겨 몰수되는 이더리움의 양이 클수록 규칙 위반에 따른 경제적 비용이 크기 때문이다. 캐스퍼 프로토콜에서 ⅔ 검증인은 검증인의 숫자가 아니라 검증인들이 가지고 있는 예치금의 ⅔ 임을 주의해야한다. 이제 이더리움을 예치하여 검증인이 된 사람들이 어떻게 투표를 하는지 알아보자. FFG는 PoW를 병행하기 때문에 매 블록마다 투표를 진행하지는 않는다. 대신 제네시스 블록 혹은 제네시스 블록으로부터 매 50번째 블록마다 체크포인트라 부르고 체크포인트에 대해 투표를 한다. 투표에는 4가지 정보와 서명이 포함이 된다. <center>![](https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.)</center> <center>그림 1. 투표의 구성요소 (출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center> 위의 표에 명시된것 처럼 source(검증의 근거)가 될 체크포인트와 target(검증의 대상)이 될 체크포인트, 그리고 각각의 체크포인트 블록의 높이가 투표의 항목으로 들어가고 <v, s, t, h(s), h(t)> 라고 표기한다 (v는 검증인을 의미한다). 여기서 주의할 것은 source가 target의 조상이 아니면 투표가 무효화되고 검증인이 검증인 집단에 속하지 않았어도 무효화 된다. 여기서 조상이란 source 가 target 보다 블록 높이가 낮고 같은 체인으로 연결되어져 있는 것을 의미한다. 이 투표는 검증인의 키에 의해 서명되서 제출된다. 이렇게 제출된 투표는 두 가지 규칙을 따르게 된다. <center>![](https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.)</center> <center>그림 2. 투표의 두가지 규칙 (출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center> 첫 번째는 target 체크 포인트의 높이가 같은 서로 다른 투표를 할 수 없다는 것이다. <center>![](https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.)</center> <center>그림 3. 투표의 첫번째 규칙 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084))</center> 위의 그림과 같이 체크포인트의 높이가 같은 두 개의 가지로 나뉘어 졌을 때, 검증인은 두 개의 체크포인트중 하나에만 투표할 수 있다. 블록 체인에서 높이가 같은 가지가 발생해서 경쟁하는 상황에서 투표를 해서 하나를 선택해야되는데 두 개 다 투표를 해버리면 어떤 가지를 메인 체인으로 할지 선택할 수 없기 때문이다. 두 번째 규칙은 자신이 투표한 source, target 체크 포인트 높이 안에 포함되는 다른 투표를 할 수 없다는 것이다. <center>![](https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.)</center> <center>그림 4. 투표의 두번째 규칙 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024)) </center> 위의 그림처럼 s2, t2 의 높이 안에 s1, t1 이 포함되는 투표를 할 수 없다. 첫번째 규칙이 높이가 같으면서 충돌하는 블록에 투표하는걸 막아줄 수 있지만, 높이가 다르면서 충돌하는 경우에는 막아줄 수 없다. 이 경우를 위해 두번째 규칙이 필요하다. 이에 대한 구체적인 논의는 “블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review” 에서 자세히 이야기해보겠다. ### **캐스퍼의 동작 과정** 앞에서 살펴본 투표의 형식과 규칙을 가지고 어떻게 블록이 finalize 되는지 알아보도록하자. 그전에 캐스퍼를 설명하기위해 필요한 용어들을 정리하고 넘어가도록하자. **epoch**: 검증인이 투표하는 체크포인트의 블록 간격, FFG에서는 현재는 50블록이다. **supermajority link**: 적어도 ⅔ 검증인이 source A에서 target B로 투표를 한 경우. 체크포인트 A, B의 순서쌍을 supermajority link라 하고” A->B”로 표기한다. **conflict**: 서로 다른 가지에 블록이 존재하는 경우 두 체크포인트는 충돌한다고 한다. 즉, 두 체크포인트가 서로의 부모 자식 관계가 아님을 의미한다. **justified**: 제네시스 블록이거나 justified 된 C 체크포인트에서 C->C’인 supermajority link가 존재할 때 체크 포인트 C’가 justified 되었다고 한다. **finalized**: 체크포인트 C가 justified 되었고 C의 직계 자손(direct child)인 C’에서 supermajority link C->C’가 존재할 때 체크포인트 C가 finalized 되었다고 한다. 직계 자손이라는 것은 체크 포인트의 높이 차이가 1인 경우를 의미한다. 생소한 부분이 많아서 개념만 보고서 이해하는게 쉽지 않을 수 있다. 따라서 이번에는 실제로 어떤 단계들을 거쳐서 투표가 진행되고 블록이 생성되고 체크포인트가 finalize 되는지 그림을 통해 단계적으로 살펴보고자 한다. 아래 그림에서 곡괭이를 들고 있는 사람들은 채굴자이고, 정장을 입은 사람은 검증인이다. 과정을 간단하게 보기 위해서 검증인은 총 4명이 있고 4명의 예치금은 각각 똑같아서 투표의 세기가 똑같다고 가정하자. 체크포인트는 제네시스 블록 다음의 체크포인트라고 하자. 즉 이전 체크포인트는 justified 되어있다. <center>![](https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.)</center> <center>그림 5. 캐스퍼 합의 과정 1 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075))</center> 1. 체크 포인트에 검증인들이 투표를 한다. 투표는 스마트 컨트랙트에 메서드를 호출하는 것이므로 채굴자들에 의해 트랜잭션이 채굴되어야지 블록에 포함된다. 위의 그림에서는 4명의 검증인 중에서 3명이 투표를 제출한 상태이다. <center>![](https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.)</center> <center>그림 6. 캐스퍼 합의 과정 2 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096))</center> 2. 제출된 투표는 채굴 과정을 통해서 블록에 포함된다. 왼쪽의 채굴자가 2명의 검증인이 제출한 투표를 블록에 포함시켰고 현재 체크포인트는 ½ 의 승인을 얻었다. <center>![](https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.)</center> <center>그림 7. 캐스퍼 합의 과정 3 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170))</center> 3. 다음으로 오른쪽 채굴자가 ¼ 에 해당하는 투표를 채굴함으로써 체크 포인트는 총 ¾ 의 투표를 받게되고 ⅔ 이 넘었으므로 새로운 체크포인트(target)에 대해 supermajority link 가 생기고 justified 된다. <center>![](https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.)</center> <center>그림 8. 캐스퍼 합의 과정 4 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293))</center> 4. 다시 체크 포인트가 찾아오면 검증인들은 다시 투표를 제출하게 된다. ¾의 검증인이 source 를 justified 된 체크포인트(노란색)로 하고 target 을 새롭게 생성된 체크포인트로 하는 투표를 제출 하였다. <center>![](https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.)</center> <center>그림 9. 캐스퍼 합의 과정 5 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357))</center> 5. 3명의 검증인이 제출한 투표가 채굴자에 의해 블록에 포함됬고 새롭게 생긴 체크 포인트(노란색)가 ¾의 투표를 받아서 ⅔을 넘겨서 justified 되었다. <center>![](https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.)</center> <center>그림 10. 캐스퍼 합의 과정 6(출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466))</center> 6. ⅔ 이상의 검증인이 초록색 체크 포인트를 source 로 하고 노란색 체크포인트를 target 으로 하는 투표를 했기 때문에 그림과 같이 두 체크포인트는 supermajority link 로 연결된다. 그리고 초록색 체크포인트가 justified 되어있고 직계 자손(direct child)인 체크포인트가 supermajority link로 연결되므로 초록색 체크포인트가 finalize 되었다. ### **캐스퍼의 두 가지 정리** 앞에서 설명한 과정들을 통해서 캐스퍼는 Accountable Safety와 Plausible Liveness 를 얻을 수 있다. Accountable Safety는 검증인이 규칙을 위반해 ⅓ 이상의 예치금 몰수 없이 두 개의 충돌하는 체크포인트가 finalize 될 수 없다는 것이다. Plausible Liveness는 예치금 몰수, 블록 딜레이와 같은 사건과 관계없이 ⅔의 검증인이 프로토콜을 따른다면, 어느 검증인의 예치금 몰수 없이도 새로운 체크포인트를 finalize 할 수 있다는 것이다. 이 두 가지 정리가 성립하는지 알아보기 전에 프로토콜 규칙에 의해 도출되는 속성을 살펴보자. 두 개의 캐스퍼 프로토콜을 이용해서 ⅔ 이상의 검증인이 몰수 조건을 위반하지 않는다면 네 가지 속성을 따른다고 할 수 있다. 1. s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(t1) 과 h(t2) 는 다르다. 2. s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(s1) < h(s2) < h(t2) < h(t1) 을 만족하는 s1, t1, s2, t2 가 존재할 수 없다. 3. h(t) = n 인 s->t supermajority link 는 많아야 1개 존재한다. 4. 높이가 n 인 justified 체크포인트는 많아야 1개 존재한다. 캐스퍼 프로토콜과 이로 인해 나타난 네 가지 속성을 통해서 앞에서 설명한 Accountable Safety 와 Plausible Liveness 를 증명할 수 있다. Accountable Safety 는 충돌하는 체크포인트 A, B 가 있다고 가정한 뒤 귀류법을 통해서 증명할 수 있고, Plausible Liveness 역시 위의 네 가지 속성들을 이용해서 손쉽게 증명할 수 있다. 자세한 증명과정은 [문영훈님의 슬라이드](https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos)를 참고하기 바란다. 이 두 가지 정리가 중요한 이유는 캐스퍼 프로토콜에 따라 증명되는 정리들이 성립하지 않으려면 ⅓ 이상의 예치금이 몰수당해야 된다는 것이다. ⅓ 이라는 수치는 supermajority link 가 생성되기 위해서는 ⅔ 검증인의 동의가 필요하기 때문에 구해지는 수치이다. 충돌하는 체크포인트 A, B가 존재하고 예치금이 같은 3명의 검증인 가, 나, 다가 있다고 가정하자. “가”는 A에 투표하고, “나”는 B에 투표한 상황에서 “다”가 A, B 모두에게 투표하는 경우. A, B 모두 ⅔ 검증인이 투표를 하여서 supermajority link 가 생성되고 justify된다. 그리고 추후 투표를 통해서 finalize 될 수 있다. 하지만 “다”는 첫번째 투표 규칙에 위반하였기 때문에 예치금을 몰수 당하게 된다. 3명중에 1명이 예치금 몰수를 당하게 되므로 ⅓ 이상의 예치금 몰 수 없이 두개의 충돌하는 체크포인트가 finalize 될 수 없게 되는 것이다. 즉 누군가 규칙을 벗어난 블록을 생성해서 포크를 일으키려면 경제적인 처벌을 받게 된다는 것이다. 검증인들은 이러한 경제적인 처벌을 감당하면서 까지 포크를 발생시킬 유인이 거의 존재하지 않을 것이므로 캐스퍼 프로토콜에서 정의된 규칙대로 움직일 확률이 높을 것이다. ### **동적인 검증인 집단** 지금까지는 검증인 집단이 고정되어 있다는 가정하에 간단한 캐스퍼 프로토콜을 살펴보았다. 하지만 실제로 캐스퍼가 동작할 때는 고정된 검증인 집단이 아니라 수시로 변하는 검증인 집단을 가지고 동작한다. 검증인이 되기 위해 스마트 컨트랙트에 이더리움을 예치했는데 필요에 의해서 혹은 검증인을 그만 두고자 이더리움을 출금할 수도 있고, 새롭게 검증인이 되기 위해서 이더리움을 예치할 수 있기 때문이다. 검증인 집단의 변경에 대한 제약이 없을 경우, 한쪽 가지에 대해 투표한 검증인 집단이 모두 나가고 새로운 검증인 집단이 와서 반대쪽 가지에 투표한다면 규칙에 위배되지 않으므로 검증인 중 그 누구도 예치금이 몰수되지 않는다. 이러한 문제점을 해결하기위해서 입금/출금 이후 바로 검증인 집단에 참여/제외되는 것이 아니라 일정시간 뒤에 검증인 집단에 참여/제외 되게 해야한다. 이러한 문제를 해결하는 방법을 설명하기 전에 동적인 검증인 집단에서 추가되는 개념인 dynasty에 대해 알아보자. 블록 B의 dynasty 는 루트부터 블록 B의 바로 이전 블록까지 finalize 된 체크포인트의 수 이다. 그리고 검증인이 dynasty d 인 블록에 예치금을 입금하면 검증인은 dynasty 가 d + 2 일 때 부터 검증인 집단에 속하게 된다. 다시말하자면 이더리움을 예치하고 두번의 finalize가 일어나면 검증인 집단에 속하게 된다. d + 2 를 start dynasty 라고 부른다. 마찬가지로 검증인 집단에서 떠날 때도 dynasty 의 개념을 이용해야 한다. 검증인이 dynasty 가 d 인 블록에서 출금을 할 경우 dynasty 가 d + 2 일 때 검증인 집단을 떠나게 된다. 그리고 이는 end dynasty 라고 부른다. <center>![](https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.)</center> <center>그림 11. 동적인 검증인 공격 (출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center> 동적인 검증인 집단의 문제를 좀 더 구체적으로 살펴보자. 위의 그림과 같이 체크포인트 S 에서 보라색 검증인 집단이 있었다고 하자. 그리고 충돌하는 체인이 발생했다고 하자. 이해를 돕기위해 첨언하자면 위의 그림에서 블록간의 점선으로 이어진 부분에도 수많은 블록이 존재한다. 체크포인트 S 를 finalize 하는 투표가 오른쪽 체인에서는 포함되고 왼쪽 체인에서는 포함이 되지 않았다고 하자. 이럴 경우 오른쪽 체인은 finalize 된 체크포인트가 하나 더 늘어서 dynasty 가 변경되고 검증인 집단이 변경된다. 하지만 왼쪽 집단은 dynasty가 그대로여서 검증인 집단이 바뀌지 않게된다. 이런 상황에서 블록이 계속 생성되고 추가적인 투표가 진행되어서 높이가 같은 체크포인트 C와 C’ 이 finalize 된다면 첫번째 투표 규칙에 위반되지만 검증자 집단이 다르기 때문에 아무도 예치금을 몰수 당하지 않는다. 이럴 경우 이전에 설명한 Accountable Safety를 만족하지 못하게 된다. 따라서 우리는 기존에 고정된 검증자 집단에 대한 정의들을 약간 수정할 필요가 있다. 따라서 새로 들어온 검증자 집단과 이전에 들어온 검증자 집단을 구분하여서 각각의 집단에서 ⅔ 이상의 투표를 받아야지 supermajority link 가 생기도록 정의를 변경하였다. 고정된 검증자 집단이 아닌 동적인 검증자 집단일 경우에 Accountable Safety 와 Plausible Liveness 를 증명하는 것은 캐스퍼 페이퍼에서 아직 미래 과제로 남겨두고 있다. 이처럼 아직도 캐스퍼는 완결된 메커니즘이 아닌 진화중인 메커니즘으로 문제점들이 충분히 존재할 수 있다. 하지만 PoW에서 PoS로 전환하는 첫 프로젝트로 큰 의의를 가지고 있다. 이것으로 Casper FFG 에 대해 알아보았고 다음 글에서는 FFG 를 조사하며 궁금했던 점을 Q&A 형식으로 풀어써본다. 그리고 앞서 설명한 캐스퍼 프로토콜이 코드에서는 어떻게 구현되었는지 살펴보려고 한다. [다음글) 블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review](https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review)
json metadata{"tags":["casper","coinkorea","decipher","kr-newbie","kr"],"users":["decipher-media"],"image":["https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.","https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.","https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.","https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.","https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.","https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.","https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.","https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.","https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.","https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.","https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J."],"links":["https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458","https://steemit.com/casper/@decipher-media/1-1-casper-overview","https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00","https://powercompare.co.uk/bitcoin/","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2","https://tendermint.com/static/docs/tendermint.pdf","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466","https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23967083/Trx fe5a473c92fefa6624bcf786e572276698882093
View Raw JSON Data
{
  "trx_id": "fe5a473c92fefa6624bcf786e572276698882093",
  "block": 23967083,
  "trx_in_block": 55,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:39:15",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "casper",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "title": "블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview",
      "body": "_Jong-Ho Kim(Jason Kim)\nSeoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)_\n\n#### *Note: 이 글은 서울대학교 블록체인 학회 디사이퍼에서 작성한 [미디엄 아티클](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458)을 옮긴 글입니다. 이 글에서 설명하는 모든 내용은 2018년 4월 17일을 기준으로 합니다. \n<br>\n\n>서울대학교 블록체인 학회인 ‘디사이퍼(Decipher)’에서 블록체인의 스케일링 솔루션에 관한 글들을 시리즈로 연재합니다. 시리즈의 첫 번째 주인공은  **Ethereum의 “Casper the Freindly Finality Gadget”**입니다.  [1–1. Casper FFG Overview](https://steemit.com/casper/@decipher-media/1-1-casper-overview),  [1–2. Casper FFG — Q&A 및 Code Review](https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review)로 나누어 설명합니다.\n\n첫번째 주제로 이더리움이 PoW(Proof of Work) 합의 알고리즘에서 PoS(Proof of Stake) 로 전환하기 위해 고민되고 있는 Casper 에 대해서 알아보고자 한다. Casper는 이더리움 창시자인 비탈릭 부테린(Vitalik Buterin)이 제시하는 “Casper the Friendly Finality Gadget”(FFG)와 이더리움 재단 연구원인 블라드 잠퍼(Vlad Zamfir)가 제시하는 “Casper the Friendly GHOST: Correct-by-Construction”(CBC)가 존재한다. FFG는 PoW와 PoS를 같이 가져가는 하이브리드 캐스퍼라고도 불린다. 이번 글에서는 비탈릭 부테린과 버질 그리피스(Virgil Griffith)가 작성한 “Casper the Friendly Finality Gadget” 논문을 중심으로 Casper FFG 에 대해 알아보도록 하자.\n\n### **Proof of Work 의 문제는 무엇인가?**\n\nCasper 의 원리를 설명하기 전, 이더리움에서 이미 잘 동작하고 있는 PoW에서 PoS로 변경하려는 이유에 대해 알아보자. 이더리움 재단 연구원인  [칼 플로리쉬(Karl Floersch)의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00)를 보면 크게 두 가지로 정리된다. 첫번째로 PoW로 인해 소모되는 에너지를 줄일 수 있다는 것이다. PoW에서 블록을 생성하기 위해서는 특정 조건을 만족하는 해시값을 계산하는 일을 반복해야된다. 이러한 해시값 계산은 하드웨어가 전기를 소모하게 하고 이러한 전기 소모는 에너지의 낭비로 이어진다. Powercompare에 따르면  [비트코인 채굴로 인한 전기 소모는 아일랜드나 대부분의 아프리카 나라들의 전기 소모량을 넘는 수준이라고 한다](https://powercompare.co.uk/bitcoin/). Powercompare의 보고서가 2017년에 써졌는데 지금은 더 많은 국가들의 전기 소모량을 넘을 것이다. 이처럼 막대한 양의 에너지를 소모하는 시스템은 장기적으로 봤을 때 환경에 해롭기 때문에 에너지 소모량을 줄이기 위해 PoS가 필요하다고 주장한다. 두번째로는 ASIC(Application Specific Integrated Circuit)와 중앙화된 채굴 집단으로 인해서 메인 체인(블록 넘버가 가장 큰 블록을 포함한 체인)을 변경할 수 있다는 것이다. 즉, 완결성(Finality)의 부재이다. 완결성이란 이미 결정된 블록체인이 바뀌지 않는 것을 의미한다. ASIC 혹은 빠른 채굴 장비가 등장해서 기존에 가장 긴 체인 이외의 다른 가지의 블록을 빠르게 생성해나가 가장 긴 체인을 역전한다면, 메인 체인이 변경될 수 있다. 과거의 가장 긴 체인에 포함되어 있었지만, ASIC에 의해 새롭게 생긴 가장 긴 체인에는 포함되지 않은 트랜잭션이 있다면 갑자기 잔고가 변경될 수 도 있다. 이러한 문제점 때문에 PoS 도입을 통한 완결성이 필요하다.\n\n### **캐스퍼 이전의 Proof of Stake 연구들**\n\nPoS 에서는 채굴자(Miner) 대신 검증인(Validator) 용어를 사용한다. 검증인이란 블록을 생성하기 위한 참가하는 사람을 의미한다. 이더리움 캐스퍼에서는 검증인이 되기 위해서 일정량 이상의 이더리움([2018년 3월 기준 1500ETH](https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2))을 예치해야한다. 그리고 검증인들이 모여있는 집단을 검증인 집단이라고 부르도록 하자. PoS는 캐스퍼에서 처음 등장하는 개념이 아니라 이전에도 존재하던 개념이다. 캐스퍼 이전에는 크게 두 가지의 PoS 디자인이 존재했다. 첫째로는 체인 기반의 PoS(chain-based Proof of Stake)이다. 무작위 랜덤 알고리즘이 특정 시간 간격으로 검증인 집단에서 검증인을 뽑고 블록을 만들 권한을 준다. 그리고 선정된 검증인은 블록을 생성한다. PeerCoin이나 BlackCoin이 이러한 방식의 PoS를 취한다. 두번째로는 BFT(Byzantine Fault Tolerant) 방식의 PoS가 존재한다. BFT-방식에서는 검증인 집단에서 무작위로 선출된 검증인에게 블록을 제안 할 수 있는 권리를 준다. 블록을 제안하는 것이 블록을 바로 생성하는 것은 아니다. 블록이 finalize 되려면 여러 차례의 투표 라운드 동안 ⅔ 이상의 검증인들이 특정 블록을 인정하는 투표를 해야한다. 이러한 과정을 통해서 블록이 영구적으로 체인에 포함되면 블록의 길이에 영향을 받지 않게 된다. Tendermint 가 BFT 방식의 PoS 방식을 이용한다. 이 과정도 Casper 만큼 복잡한 과정에 의해 이뤄지는데 Tendermint 의 PoS 방식에 관심이 있다면 “[Tendermint: Consensus without mining](https://tendermint.com/static/docs/tendermint.pdf)” 을 읽어보길 바란다.\n\n### **캐스퍼 프로토콜 이란?**\n\n하이브리드 PoW/PoS 시스템은 이더리움에 적용하는 첫번째 캐스퍼 버전이다. 검증인 집단이 변하지 않는다는 가정 하에 캐스퍼 프로토콜이 어떻게 동작하는지 알아보자. 우선 검증인이 되기 위해서는 캐스퍼 스마트 컨트랙트에 이더리움을 예치금(deposit)으로 맡겨야한다. 인센티브 로직이 스마트 컨트랙트에 있기 때문에 합의 과정을 통해 블록을 올바르게 생성했을 경우 예치금을 맡긴 검증인들에게 보상이 주어진다. 반대로 블록 합의 과정에서 잘못된 행동을 하였을 때 예치금을 몰수해서 처벌을 가한다. PoS의 안정성은 예치금의 크기와 비례한다. 규칙을 어겨 몰수되는 이더리움의 양이 클수록 규칙 위반에 따른 경제적 비용이 크기 때문이다.  캐스퍼 프로토콜에서 ⅔ 검증인은 검증인의 숫자가 아니라 검증인들이 가지고 있는 예치금의 ⅔ 임을 주의해야한다. 이제 이더리움을 예치하여 검증인이 된 사람들이 어떻게 투표를 하는지 알아보자.\n\nFFG는 PoW를 병행하기 때문에 매 블록마다 투표를 진행하지는 않는다. 대신 제네시스 블록 혹은 제네시스 블록으로부터 매 50번째 블록마다 체크포인트라 부르고 체크포인트에 대해 투표를 한다. 투표에는 4가지 정보와 서명이 포함이 된다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.)</center>\n\n<center>그림 1. 투표의 구성요소 (출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center>\n\n위의 표에 명시된것 처럼 source(검증의 근거)가 될 체크포인트와 target(검증의 대상)이 될 체크포인트, 그리고 각각의 체크포인트 블록의 높이가 투표의 항목으로 들어가고 <v, s, t, h(s), h(t)> 라고 표기한다 (v는 검증인을 의미한다). 여기서 주의할 것은 source가 target의 조상이 아니면 투표가 무효화되고 검증인이 검증인 집단에 속하지 않았어도 무효화 된다. 여기서 조상이란 source 가 target 보다 블록 높이가 낮고 같은 체인으로 연결되어져 있는 것을 의미한다. 이 투표는 검증인의 키에 의해 서명되서 제출된다. 이렇게 제출된 투표는 두 가지 규칙을 따르게 된다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.)</center>\n\n<center>그림 2. 투표의 두가지 규칙 (출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center>\n\n첫 번째는 target 체크 포인트의 높이가 같은 서로 다른 투표를 할 수 없다는 것이다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.)</center>\n\n<center>그림 3. 투표의 첫번째 규칙 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084))</center>\n\n위의 그림과 같이 체크포인트의 높이가 같은 두 개의 가지로 나뉘어 졌을 때, 검증인은 두 개의 체크포인트중 하나에만 투표할 수 있다. 블록 체인에서 높이가 같은 가지가 발생해서 경쟁하는 상황에서 투표를 해서 하나를 선택해야되는데 두 개 다 투표를 해버리면 어떤 가지를 메인 체인으로 할지 선택할 수 없기 때문이다.\n\n두 번째 규칙은 자신이 투표한 source, target 체크 포인트 높이 안에 포함되는 다른 투표를 할 수 없다는 것이다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.)</center>\n\n<center>그림 4. 투표의 두번째 규칙 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024)) </center>\n\n위의 그림처럼 s2, t2 의 높이 안에 s1, t1 이 포함되는 투표를 할 수 없다. 첫번째 규칙이 높이가 같으면서 충돌하는 블록에 투표하는걸 막아줄 수 있지만, 높이가 다르면서 충돌하는 경우에는 막아줄 수 없다. 이 경우를 위해 두번째 규칙이 필요하다. 이에 대한 구체적인 논의는 “블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review” 에서 자세히 이야기해보겠다.\n\n\n### **캐스퍼의 동작 과정**\n\n앞에서 살펴본 투표의 형식과 규칙을 가지고 어떻게 블록이 finalize 되는지 알아보도록하자. 그전에 캐스퍼를 설명하기위해 필요한 용어들을 정리하고 넘어가도록하자.\n\n**epoch**: 검증인이 투표하는 체크포인트의 블록 간격, FFG에서는 현재는 50블록이다.\n\n**supermajority link**: 적어도 ⅔ 검증인이 source A에서 target B로 투표를 한 경우. 체크포인트 A, B의 순서쌍을 supermajority link라 하고” A->B”로 표기한다.\n\n**conflict**: 서로 다른 가지에 블록이 존재하는 경우 두 체크포인트는 충돌한다고 한다. 즉, 두 체크포인트가 서로의 부모 자식 관계가 아님을 의미한다.\n\n**justified**: 제네시스 블록이거나 justified 된 C 체크포인트에서 C->C’인 supermajority link가 존재할 때 체크 포인트 C’가 justified 되었다고 한다.\n\n**finalized**: 체크포인트 C가 justified 되었고 C의 직계 자손(direct child)인 C’에서 supermajority link C->C’가 존재할 때 체크포인트 C가 finalized 되었다고 한다. 직계 자손이라는 것은 체크 포인트의 높이 차이가 1인 경우를 의미한다.\n\n생소한 부분이 많아서 개념만 보고서 이해하는게 쉽지 않을 수 있다. 따라서 이번에는 실제로 어떤 단계들을 거쳐서 투표가 진행되고 블록이 생성되고 체크포인트가 finalize 되는지 그림을 통해 단계적으로 살펴보고자 한다. 아래 그림에서 곡괭이를 들고 있는 사람들은 채굴자이고, 정장을 입은 사람은 검증인이다. 과정을 간단하게 보기 위해서 검증인은 총 4명이 있고 4명의 예치금은 각각 똑같아서 투표의 세기가 똑같다고 가정하자. 체크포인트는 제네시스 블록 다음의 체크포인트라고 하자. 즉 이전 체크포인트는 justified 되어있다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.)</center>\n\n<center>그림 5. 캐스퍼 합의 과정 1 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075))</center>\n\n1. 체크 포인트에 검증인들이 투표를 한다. 투표는 스마트 컨트랙트에 메서드를 호출하는 것이므로 채굴자들에 의해 트랜잭션이 채굴되어야지 블록에 포함된다. 위의 그림에서는 4명의 검증인 중에서 3명이 투표를 제출한 상태이다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.)</center>\n<center>그림 6. 캐스퍼 합의 과정 2 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096))</center>\n\n2. 제출된 투표는 채굴 과정을 통해서 블록에 포함된다. 왼쪽의 채굴자가 2명의 검증인이 제출한 투표를 블록에 포함시켰고 현재 체크포인트는 ½ 의 승인을 얻었다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.)</center>\n<center>그림 7. 캐스퍼 합의 과정 3 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170))</center>\n3. 다음으로 오른쪽 채굴자가 ¼ 에 해당하는 투표를 채굴함으로써 체크 포인트는 총 ¾ 의 투표를 받게되고 ⅔ 이 넘었으므로 새로운 체크포인트(target)에 대해 supermajority link 가 생기고 justified 된다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.)</center>\n<center>그림 8. 캐스퍼 합의 과정 4 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293))</center>\n4. 다시 체크 포인트가 찾아오면 검증인들은 다시 투표를 제출하게 된다. ¾의 검증인이 source 를 justified 된 체크포인트(노란색)로 하고 target 을 새롭게 생성된 체크포인트로 하는 투표를 제출 하였다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.)</center>\n<center>그림 9. 캐스퍼 합의 과정 5 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357))</center>\n5. 3명의 검증인이 제출한 투표가 채굴자에 의해 블록에 포함됬고 새롭게 생긴 체크 포인트(노란색)가 ¾의 투표를 받아서 ⅔을 넘겨서 justified 되었다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.)</center>\n<center>그림 10. 캐스퍼 합의 과정 6(출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466))</center>\n6. ⅔ 이상의 검증인이 초록색 체크 포인트를 source 로 하고 노란색 체크포인트를 target 으로 하는 투표를 했기 때문에 그림과 같이 두 체크포인트는 supermajority link 로 연결된다. 그리고 초록색 체크포인트가 justified 되어있고 직계 자손(direct child)인 체크포인트가 supermajority link로 연결되므로 초록색 체크포인트가 finalize 되었다.\n\n### **캐스퍼의 두 가지 정리**\n\n앞에서 설명한 과정들을 통해서 캐스퍼는 Accountable Safety와 Plausible Liveness 를 얻을 수 있다. Accountable Safety는 검증인이 규칙을 위반해 ⅓ 이상의 예치금 몰수 없이 두 개의 충돌하는 체크포인트가 finalize 될 수 없다는 것이다. Plausible Liveness는 예치금 몰수, 블록 딜레이와 같은 사건과 관계없이 ⅔의 검증인이 프로토콜을 따른다면, 어느 검증인의 예치금 몰수 없이도 새로운 체크포인트를 finalize 할 수 있다는 것이다. 이 두 가지 정리가 성립하는지 알아보기 전에 프로토콜 규칙에 의해 도출되는 속성을 살펴보자.\n\n두 개의 캐스퍼 프로토콜을 이용해서 ⅔ 이상의 검증인이 몰수 조건을 위반하지 않는다면 네 가지 속성을 따른다고 할 수 있다.\n\n1.  s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(t1) 과 h(t2) 는 다르다.\n2.  s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(s1) < h(s2) < h(t2) < h(t1) 을 만족하는 s1, t1, s2, t2 가 존재할 수 없다.\n3.  h(t) = n 인 s->t supermajority link 는 많아야 1개 존재한다.\n4.  높이가 n 인 justified 체크포인트는 많아야 1개 존재한다.\n\n캐스퍼 프로토콜과 이로 인해 나타난 네 가지 속성을 통해서 앞에서 설명한 Accountable Safety 와 Plausible Liveness 를 증명할 수 있다. Accountable Safety 는 충돌하는 체크포인트 A, B 가 있다고 가정한 뒤 귀류법을 통해서 증명할 수 있고, Plausible Liveness 역시 위의 네 가지 속성들을 이용해서 손쉽게 증명할 수 있다. 자세한 증명과정은  [문영훈님의 슬라이드](https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos)를 참고하기 바란다.\n\n이 두 가지 정리가 중요한 이유는 캐스퍼 프로토콜에 따라 증명되는 정리들이 성립하지 않으려면 ⅓ 이상의 예치금이 몰수당해야 된다는 것이다. ⅓ 이라는 수치는 supermajority link 가 생성되기 위해서는 ⅔ 검증인의 동의가 필요하기 때문에 구해지는 수치이다. 충돌하는 체크포인트 A, B가 존재하고 예치금이 같은 3명의 검증인 가, 나, 다가 있다고 가정하자. “가”는 A에 투표하고, “나”는 B에 투표한 상황에서 “다”가 A, B 모두에게 투표하는 경우. A, B 모두 ⅔ 검증인이 투표를 하여서 supermajority link 가 생성되고 justify된다. 그리고 추후 투표를 통해서 finalize 될 수 있다. 하지만 “다”는 첫번째 투표 규칙에 위반하였기 때문에 예치금을 몰수 당하게 된다. 3명중에 1명이 예치금 몰수를 당하게 되므로 ⅓ 이상의 예치금 몰 수 없이 두개의 충돌하는 체크포인트가 finalize 될 수 없게 되는 것이다. 즉 누군가 규칙을 벗어난 블록을 생성해서 포크를 일으키려면 경제적인 처벌을 받게 된다는 것이다. 검증인들은 이러한 경제적인 처벌을 감당하면서 까지 포크를 발생시킬 유인이 거의 존재하지 않을 것이므로 캐스퍼 프로토콜에서 정의된 규칙대로 움직일 확률이 높을 것이다.\n\n### **동적인 검증인 집단**\n\n지금까지는 검증인 집단이 고정되어 있다는 가정하에 간단한 캐스퍼 프로토콜을 살펴보았다. 하지만 실제로 캐스퍼가 동작할 때는 고정된 검증인 집단이 아니라 수시로 변하는 검증인 집단을 가지고 동작한다. 검증인이 되기 위해 스마트 컨트랙트에 이더리움을 예치했는데 필요에 의해서 혹은 검증인을 그만 두고자 이더리움을 출금할 수도 있고, 새롭게 검증인이 되기 위해서 이더리움을 예치할 수 있기 때문이다. 검증인 집단의 변경에 대한 제약이 없을 경우, 한쪽 가지에 대해 투표한 검증인 집단이 모두 나가고 새로운 검증인 집단이 와서 반대쪽 가지에 투표한다면 규칙에 위배되지 않으므로 검증인 중 그 누구도 예치금이 몰수되지 않는다. 이러한 문제점을 해결하기위해서 입금/출금 이후 바로 검증인 집단에 참여/제외되는 것이 아니라 일정시간 뒤에 검증인 집단에 참여/제외 되게 해야한다. 이러한 문제를 해결하는 방법을 설명하기 전에 동적인 검증인 집단에서 추가되는 개념인 dynasty에 대해 알아보자. 블록 B의 dynasty 는 루트부터 블록 B의 바로 이전 블록까지 finalize 된 체크포인트의 수 이다. 그리고 검증인이 dynasty d 인 블록에 예치금을 입금하면 검증인은 dynasty 가 d + 2 일 때 부터 검증인 집단에 속하게 된다. 다시말하자면 이더리움을 예치하고 두번의 finalize가 일어나면 검증인 집단에 속하게 된다. d + 2 를 start dynasty 라고 부른다. 마찬가지로 검증인 집단에서 떠날 때도 dynasty 의 개념을 이용해야 한다. 검증인이 dynasty 가 d 인 블록에서 출금을 할 경우 dynasty 가 d + 2 일 때 검증인 집단을 떠나게 된다. 그리고 이는 end dynasty 라고 부른다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.)</center>\n\n<center>그림 11. 동적인 검증인 공격 (출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center>\n\n동적인 검증인 집단의 문제를 좀 더 구체적으로 살펴보자. 위의 그림과 같이 체크포인트 S 에서 보라색 검증인 집단이 있었다고 하자. 그리고 충돌하는 체인이 발생했다고 하자. 이해를 돕기위해 첨언하자면 위의 그림에서 블록간의 점선으로 이어진 부분에도 수많은 블록이 존재한다. 체크포인트 S 를 finalize 하는 투표가 오른쪽 체인에서는 포함되고 왼쪽 체인에서는 포함이 되지 않았다고 하자. 이럴 경우 오른쪽 체인은 finalize 된 체크포인트가 하나 더 늘어서 dynasty 가 변경되고 검증인 집단이 변경된다. 하지만 왼쪽 집단은 dynasty가 그대로여서 검증인 집단이 바뀌지 않게된다. 이런 상황에서 블록이 계속 생성되고 추가적인 투표가 진행되어서 높이가 같은 체크포인트 C와 C’ 이 finalize 된다면 첫번째 투표 규칙에 위반되지만 검증자 집단이 다르기 때문에 아무도 예치금을 몰수 당하지 않는다. 이럴 경우 이전에 설명한 Accountable Safety를 만족하지 못하게 된다. 따라서 우리는 기존에 고정된 검증자 집단에 대한 정의들을 약간 수정할 필요가 있다. 따라서 새로 들어온 검증자 집단과 이전에 들어온 검증자 집단을 구분하여서 각각의 집단에서 ⅔ 이상의 투표를 받아야지 supermajority link 가 생기도록 정의를 변경하였다. 고정된 검증자 집단이 아닌 동적인 검증자 집단일 경우에 Accountable Safety 와 Plausible Liveness 를 증명하는 것은 캐스퍼 페이퍼에서 아직 미래 과제로 남겨두고 있다. 이처럼 아직도 캐스퍼는 완결된 메커니즘이 아닌 진화중인 메커니즘으로 문제점들이 충분히 존재할 수 있다. 하지만 PoW에서 PoS로 전환하는 첫 프로젝트로 큰 의의를 가지고 있다. 이것으로 Casper FFG 에 대해 알아보았고 다음 글에서는 FFG 를 조사하며 궁금했던 점을 Q&A 형식으로 풀어써본다. 그리고 앞서 설명한 캐스퍼 프로토콜이 코드에서는 어떻게 구현되었는지 살펴보려고 한다.\n\n\n[다음글) 블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review](https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review)",
      "json_metadata": "{\"tags\":[\"casper\",\"coinkorea\",\"decipher\",\"kr-newbie\",\"kr\"],\"users\":[\"decipher-media\"],\"image\":[\"https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.\",\"https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.\",\"https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.\",\"https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.\",\"https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.\",\"https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.\",\"https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.\",\"https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.\",\"https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.\",\"https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.\",\"https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.\"],\"links\":[\"https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458\",\"https://steemit.com/casper/@decipher-media/1-1-casper-overview\",\"https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00\",\"https://powercompare.co.uk/bitcoin/\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\",\"https://tendermint.com/static/docs/tendermint.pdf\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466\",\"https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/07 12:37:09
parent author
parent permlinkethereum
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
title블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review
body@@ -16465,51 +16465,4 @@ 93). -%0A%0A%3E%EC%9D%B4 %EA%B8%80%EC%9D%80 %EA%B3%A0%ED%8C%8D%EC%8A%A4(@gopaxkr)%EB%A1%9C%EB%B6%80%ED%84%B0 %ED%9B%84%EC%9B%90%EC%9D%84 %EB%B0%9B%EC%95%84 %EB%94%94%EC%82%AC%EC%9D%B4%ED%8D%BC%EA%B0%80 %EC%9E%91%EC%84%B1%ED%95%9C %EA%B8%80%EC%9E%85%EB%8B%88%EB%8B%A4.
json metadata{"tags":["ethereum","kr-newbie","blockchain","decipher","coinkorea"],"image":["https://steemitimages.com/DQmPfnx45kSUMRTsAgimLZncehbvwj65xYchDMhFneqHUiw/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmad7jJKaEa6Y3rhhK8qhg8gbwkcFDAMKYBnpDniQ6Eedg/image.png","https://steemitimages.com/DQmUYSRxsVLxgY3hXFL4wLY3htGNzk6etvcATPLqSQonegP/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmQRbkGs3182wt6N2ARrmEGjdxGpQcs1NfYz9DbdnwJoc4/image.png","https://steemitimages.com/DQmQ5MYsngpm8tPySi4uU6ngrxYv2hruqMTJxU1Ai4Sbdvd/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmQM6Yn2QwUPYy6DBV9hzFScRE1RggsGY4p57wUcCuMfHj/image.png","https://steemitimages.com/DQmW9s2AaPF3U64BVm4GrMH9SpHCaCRtpt1SLNQTufvvX3A/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmeVb1Sj4Yd4Maxd8GFgV7Zc7HtH7hZ45trhT3SbkxWb4M/image.png"],"links":["https://steemit.com/@moongunflag","https://medium.com/decipher-media","https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1","https://steemit.com/casper/@decipher-media/1-1-casper-overview","https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review","https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://ethresear.ch/t/casper-ffg-with-one-message-type-and-simpler-fork-choice-rule/","https://ethresear.ch/c/casper","https://github.com/ethereum/research/blob/master/papers/casper-economics/casper_economics_basic.pdf","https://github.com/ethereum/casper/blob/master/IMPLEMENTATION.md#validator-workflow-overview","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23967041/Trx b1b0ac0ec83ad72a7b392928bdd5c998b6c46185
View Raw JSON Data
{
  "trx_id": "b1b0ac0ec83ad72a7b392928bdd5c998b6c46185",
  "block": 23967041,
  "trx_in_block": 47,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:37:09",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "ethereum",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "title": "블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review",
      "body": "@@ -16465,51 +16465,4 @@\n 93).\n-%0A%0A%3E%EC%9D%B4 %EA%B8%80%EC%9D%80 %EA%B3%A0%ED%8C%8D%EC%8A%A4(@gopaxkr)%EB%A1%9C%EB%B6%80%ED%84%B0 %ED%9B%84%EC%9B%90%EC%9D%84 %EB%B0%9B%EC%95%84 %EB%94%94%EC%82%AC%EC%9D%B4%ED%8D%BC%EA%B0%80 %EC%9E%91%EC%84%B1%ED%95%9C %EA%B8%80%EC%9E%85%EB%8B%88%EB%8B%A4.\n",
      "json_metadata": "{\"tags\":[\"ethereum\",\"kr-newbie\",\"blockchain\",\"decipher\",\"coinkorea\"],\"image\":[\"https://steemitimages.com/DQmPfnx45kSUMRTsAgimLZncehbvwj65xYchDMhFneqHUiw/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmad7jJKaEa6Y3rhhK8qhg8gbwkcFDAMKYBnpDniQ6Eedg/image.png\",\"https://steemitimages.com/DQmUYSRxsVLxgY3hXFL4wLY3htGNzk6etvcATPLqSQonegP/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmQRbkGs3182wt6N2ARrmEGjdxGpQcs1NfYz9DbdnwJoc4/image.png\",\"https://steemitimages.com/DQmQ5MYsngpm8tPySi4uU6ngrxYv2hruqMTJxU1Ai4Sbdvd/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmQM6Yn2QwUPYy6DBV9hzFScRE1RggsGY4p57wUcCuMfHj/image.png\",\"https://steemitimages.com/DQmW9s2AaPF3U64BVm4GrMH9SpHCaCRtpt1SLNQTufvvX3A/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmeVb1Sj4Yd4Maxd8GFgV7Zc7HtH7hZ45trhT3SbkxWb4M/image.png\"],\"links\":[\"https://steemit.com/@moongunflag\",\"https://medium.com/decipher-media\",\"https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1\",\"https://steemit.com/casper/@decipher-media/1-1-casper-overview\",\"https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review\",\"https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://ethresear.ch/t/casper-ffg-with-one-message-type-and-simpler-fork-choice-rule/\",\"https://ethresear.ch/c/casper\",\"https://github.com/ethereum/research/blob/master/papers/casper-economics/casper_economics_basic.pdf\",\"https://github.com/ethereum/casper/blob/master/IMPLEMENTATION.md#validator-workflow-overview\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
decipher-mediapublished a new post: 1-1-casper-overview
2018/07/07 12:35:39
parent author
parent permlinkcasper
authordecipher-media
permlink1-1-casper-overview
title블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview
body@@ -12809,55 +12809,8 @@ .%0A%0A%0A -%3E%EC%9D%B4 %EA%B8%80%EC%9D%80 %EA%B3%A0%ED%8C%8D%EC%8A%A4(@gopaxkr)%EB%A1%9C%EB%B6%80%ED%84%B0 %ED%9B%84%EC%9B%90%EC%9D%84 %EB%B0%9B%EC%95%84 %EB%94%94%EC%82%AC%EC%9D%B4%ED%8D%BC%EA%B0%80 %EC%9E%91%EC%84%B1%ED%95%9C %EA%B8%80%EC%9E%85%EB%8B%88%EB%8B%A4.%0A %5B%EB%8B%A4%EC%9D%8C%EA%B8%80
json metadata{"tags":["casper","coinkorea","decipher","scalability","kr"],"users":["decipher-media"],"image":["https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.","https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.","https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.","https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.","https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.","https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.","https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.","https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.","https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.","https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.","https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J."],"links":["https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458","https://steemit.com/casper/@decipher-media/1-1-casper-overview","https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00","https://powercompare.co.uk/bitcoin/","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2","https://tendermint.com/static/docs/tendermint.pdf","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466","https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23967012/Trx 260f3312b9f13387e36104e6f6290ebe1be57048
View Raw JSON Data
{
  "trx_id": "260f3312b9f13387e36104e6f6290ebe1be57048",
  "block": 23967012,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:35:39",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "casper",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "title": "블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview",
      "body": "@@ -12809,55 +12809,8 @@\n .%0A%0A%0A\n-%3E%EC%9D%B4 %EA%B8%80%EC%9D%80 %EA%B3%A0%ED%8C%8D%EC%8A%A4(@gopaxkr)%EB%A1%9C%EB%B6%80%ED%84%B0 %ED%9B%84%EC%9B%90%EC%9D%84 %EB%B0%9B%EC%95%84 %EB%94%94%EC%82%AC%EC%9D%B4%ED%8D%BC%EA%B0%80 %EC%9E%91%EC%84%B1%ED%95%9C %EA%B8%80%EC%9E%85%EB%8B%88%EB%8B%A4.%0A \n %5B%EB%8B%A4%EC%9D%8C%EA%B8%80\n",
      "json_metadata": "{\"tags\":[\"casper\",\"coinkorea\",\"decipher\",\"scalability\",\"kr\"],\"users\":[\"decipher-media\"],\"image\":[\"https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.\",\"https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.\",\"https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.\",\"https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.\",\"https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.\",\"https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.\",\"https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.\",\"https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.\",\"https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.\",\"https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.\",\"https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.\"],\"links\":[\"https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458\",\"https://steemit.com/casper/@decipher-media/1-1-casper-overview\",\"https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00\",\"https://powercompare.co.uk/bitcoin/\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\",\"https://tendermint.com/static/docs/tendermint.pdf\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466\",\"https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/07 09:52:54
votersensation
authordecipher-media
permlink1-1-casper-overview
weight10000 (100.00%)
Transaction InfoBlock #23963757/Trx eba147b3fab0ecfed9e95b27e548c39081b1d3ad
View Raw JSON Data
{
  "trx_id": "eba147b3fab0ecfed9e95b27e548c39081b1d3ad",
  "block": 23963757,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T09:52:54",
  "op": [
    "vote",
    {
      "voter": "sensation",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "weight": 10000
    }
  ]
}
2018/07/07 09:52:36
votersensation
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
weight10000 (100.00%)
Transaction InfoBlock #23963751/Trx ebe5abe704753e84f278c85071a3e9f4d94a09d4
View Raw JSON Data
{
  "trx_id": "ebe5abe704753e84f278c85071a3e9f4d94a09d4",
  "block": 23963751,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T09:52:36",
  "op": [
    "vote",
    {
      "voter": "sensation",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "weight": 10000
    }
  ]
}
decipher-mediaupdated their account properties
2018/07/07 08:50:27
accountdecipher-media
memo keySTM8jHFPsSJx6H4XgRGSdAaV6w3YSxKs9vFWE725gYaaU7Jav1eAL
json metadata{"profile":{"profile_image":"https://cdn-images-1.medium.com/fit/c/275/275/1*JNM2iUvadhIjRpkmxanAaA.jpeg"}}
Transaction InfoBlock #23962509/Trx 4d409533d86c0b01634430210deb2fde2623056c
View Raw JSON Data
{
  "trx_id": "4d409533d86c0b01634430210deb2fde2623056c",
  "block": 23962509,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:50:27",
  "op": [
    "account_update",
    {
      "account": "decipher-media",
      "memo_key": "STM8jHFPsSJx6H4XgRGSdAaV6w3YSxKs9vFWE725gYaaU7Jav1eAL",
      "json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn-images-1.medium.com/fit/c/275/275/1*JNM2iUvadhIjRpkmxanAaA.jpeg\"}}"
    }
  ]
}
decipher-mediapublished a new post: 1-1-casper-overview
2018/07/07 08:46:27
parent author
parent permlinkcasper
authordecipher-media
permlink1-1-casper-overview
title블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview
body@@ -1,47 +1,4 @@ -# %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8 %ED%99%95%EC%9E%A5%EC%84%B1 %EC%86%94%EB%A3%A8%EC%85%98 %EC%8B%9C%EB%A6%AC%EC%A6%88 1%E2%80%931 :: Casper Overview%0A%0A _Jon
json metadata{"tags":["casper","coinkorea","decipher","scalability","kr"],"users":["decipher-media","gopaxkr"],"image":["https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.","https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.","https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.","https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.","https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.","https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.","https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.","https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.","https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.","https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.","https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J."],"links":["https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458","https://steemit.com/casper/@decipher-media/1-1-casper-overview","https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00","https://powercompare.co.uk/bitcoin/","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2","https://tendermint.com/static/docs/tendermint.pdf","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466","https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23962429/Trx 01f90e9f493d2b70c0ecf9022a853741fbff1d91
View Raw JSON Data
{
  "trx_id": "01f90e9f493d2b70c0ecf9022a853741fbff1d91",
  "block": 23962429,
  "trx_in_block": 20,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:46:27",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "casper",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "title": "블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview",
      "body": "@@ -1,47 +1,4 @@\n-# %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8 %ED%99%95%EC%9E%A5%EC%84%B1 %EC%86%94%EB%A3%A8%EC%85%98 %EC%8B%9C%EB%A6%AC%EC%A6%88 1%E2%80%931 :: Casper Overview%0A%0A\n _Jon\n",
      "json_metadata": "{\"tags\":[\"casper\",\"coinkorea\",\"decipher\",\"scalability\",\"kr\"],\"users\":[\"decipher-media\",\"gopaxkr\"],\"image\":[\"https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.\",\"https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.\",\"https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.\",\"https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.\",\"https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.\",\"https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.\",\"https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.\",\"https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.\",\"https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.\",\"https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.\",\"https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.\"],\"links\":[\"https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458\",\"https://steemit.com/casper/@decipher-media/1-1-casper-overview\",\"https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00\",\"https://powercompare.co.uk/bitcoin/\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\",\"https://tendermint.com/static/docs/tendermint.pdf\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466\",\"https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/07 08:45:54
parent author
parent permlinkethereum
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
title블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review
body@@ -696,136 +696,79 @@ s:// -medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1 %22This link will take you away from steemit.com%22 +steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review )%EB%A1%9C %EB%82%98 @@ -14256,16 +14256,17 @@ verview) + %EC%B0%B8%EA%B3%A0)%0A%0A!%5B%5D
json metadata{"tags":["ethereum","casper","blockchain","decipher","coinkorea"],"users":["gopaxkr"],"image":["https://steemitimages.com/DQmPfnx45kSUMRTsAgimLZncehbvwj65xYchDMhFneqHUiw/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmad7jJKaEa6Y3rhhK8qhg8gbwkcFDAMKYBnpDniQ6Eedg/image.png","https://steemitimages.com/DQmUYSRxsVLxgY3hXFL4wLY3htGNzk6etvcATPLqSQonegP/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmQRbkGs3182wt6N2ARrmEGjdxGpQcs1NfYz9DbdnwJoc4/image.png","https://steemitimages.com/DQmQ5MYsngpm8tPySi4uU6ngrxYv2hruqMTJxU1Ai4Sbdvd/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmQM6Yn2QwUPYy6DBV9hzFScRE1RggsGY4p57wUcCuMfHj/image.png","https://steemitimages.com/DQmW9s2AaPF3U64BVm4GrMH9SpHCaCRtpt1SLNQTufvvX3A/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmeVb1Sj4Yd4Maxd8GFgV7Zc7HtH7hZ45trhT3SbkxWb4M/image.png"],"links":["https://steemit.com/@moongunflag","https://medium.com/decipher-media","https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1","https://steemit.com/casper/@decipher-media/1-1-casper-overview","https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review","https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://ethresear.ch/t/casper-ffg-with-one-message-type-and-simpler-fork-choice-rule/","https://ethresear.ch/c/casper","https://github.com/ethereum/research/blob/master/papers/casper-economics/casper_economics_basic.pdf","https://github.com/ethereum/casper/blob/master/IMPLEMENTATION.md#validator-workflow-overview","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23962418/Trx 6662e7d661e9113d91bc54d0c3ad83061b824a85
View Raw JSON Data
{
  "trx_id": "6662e7d661e9113d91bc54d0c3ad83061b824a85",
  "block": 23962418,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:45:54",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "ethereum",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "title": "블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review",
      "body": "@@ -696,136 +696,79 @@\n s://\n-medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1 %22This link will take you away from steemit.com%22\n+steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review\n )%EB%A1%9C %EB%82%98\n@@ -14256,16 +14256,17 @@\n verview)\n+ \n %EC%B0%B8%EA%B3%A0)%0A%0A!%5B%5D\n",
      "json_metadata": "{\"tags\":[\"ethereum\",\"casper\",\"blockchain\",\"decipher\",\"coinkorea\"],\"users\":[\"gopaxkr\"],\"image\":[\"https://steemitimages.com/DQmPfnx45kSUMRTsAgimLZncehbvwj65xYchDMhFneqHUiw/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmad7jJKaEa6Y3rhhK8qhg8gbwkcFDAMKYBnpDniQ6Eedg/image.png\",\"https://steemitimages.com/DQmUYSRxsVLxgY3hXFL4wLY3htGNzk6etvcATPLqSQonegP/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmQRbkGs3182wt6N2ARrmEGjdxGpQcs1NfYz9DbdnwJoc4/image.png\",\"https://steemitimages.com/DQmQ5MYsngpm8tPySi4uU6ngrxYv2hruqMTJxU1Ai4Sbdvd/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmQM6Yn2QwUPYy6DBV9hzFScRE1RggsGY4p57wUcCuMfHj/image.png\",\"https://steemitimages.com/DQmW9s2AaPF3U64BVm4GrMH9SpHCaCRtpt1SLNQTufvvX3A/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmeVb1Sj4Yd4Maxd8GFgV7Zc7HtH7hZ45trhT3SbkxWb4M/image.png\"],\"links\":[\"https://steemit.com/@moongunflag\",\"https://medium.com/decipher-media\",\"https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1\",\"https://steemit.com/casper/@decipher-media/1-1-casper-overview\",\"https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review\",\"https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://ethresear.ch/t/casper-ffg-with-one-message-type-and-simpler-fork-choice-rule/\",\"https://ethresear.ch/c/casper\",\"https://github.com/ethereum/research/blob/master/papers/casper-economics/casper_economics_basic.pdf\",\"https://github.com/ethereum/casper/blob/master/IMPLEMENTATION.md#validator-workflow-overview\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
decipher-mediapublished a new post: 1-1-casper-overview
2018/07/07 08:44:24
parent author
parent permlinkcasper
authordecipher-media
permlink1-1-casper-overview
title블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview
body@@ -607,155 +607,43 @@ s:// -medium.com/decipher-media/%25EB%25B8%2594%25EB%25A1%259D%25EC%25B2%25B4%25EC%259D%25B8-%25ED%2599%2595%25EC%259E%25A5%25EC%2584%25B1-%25EC%2586%2594%25EB%25A3%25A8%25EC%2585%2598-%25EC%258B%259C%25EB%25A6%25AC%25EC%25A6%2588- +steemit.com/casper/@decipher-media/ 1-1- @@ -657,29 +657,16 @@ overview --3e0154487458 ), %5B1%E2%80%932 @@ -711,88 +711,79 @@ s:// -medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1 +steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review )%EB%A1%9C %EB%82%98 @@ -12969,85 +12969,76 @@ s:// -medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1 +steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review )
json metadata{"tags":["casper","coinkorea","decipher","scalability","kr"],"users":["decipher-media","gopaxkr"],"image":["https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.","https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.","https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.","https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.","https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.","https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.","https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.","https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.","https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.","https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.","https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J."],"links":["https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458","https://steemit.com/casper/@decipher-media/1-1-casper-overview","https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00","https://powercompare.co.uk/bitcoin/","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2","https://tendermint.com/static/docs/tendermint.pdf","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466","https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23962388/Trx 6f64c86813b1bb70784e02e44c57814245e6e37b
View Raw JSON Data
{
  "trx_id": "6f64c86813b1bb70784e02e44c57814245e6e37b",
  "block": 23962388,
  "trx_in_block": 23,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:44:24",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "casper",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "title": "블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview",
      "body": "@@ -607,155 +607,43 @@\n s://\n-medium.com/decipher-media/%25EB%25B8%2594%25EB%25A1%259D%25EC%25B2%25B4%25EC%259D%25B8-%25ED%2599%2595%25EC%259E%25A5%25EC%2584%25B1-%25EC%2586%2594%25EB%25A3%25A8%25EC%2585%2598-%25EC%258B%259C%25EB%25A6%25AC%25EC%25A6%2588-\n+steemit.com/casper/@decipher-media/\n 1-1-\n@@ -657,29 +657,16 @@\n overview\n--3e0154487458\n ),  %5B1%E2%80%932\n@@ -711,88 +711,79 @@\n s://\n-medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1\n+steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review\n )%EB%A1%9C %EB%82%98\n@@ -12969,85 +12969,76 @@\n s://\n-medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1\n+steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review\n )\n",
      "json_metadata": "{\"tags\":[\"casper\",\"coinkorea\",\"decipher\",\"scalability\",\"kr\"],\"users\":[\"decipher-media\",\"gopaxkr\"],\"image\":[\"https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.\",\"https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.\",\"https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.\",\"https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.\",\"https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.\",\"https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.\",\"https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.\",\"https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.\",\"https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.\",\"https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.\",\"https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.\"],\"links\":[\"https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458\",\"https://steemit.com/casper/@decipher-media/1-1-casper-overview\",\"https://steemit.com/ethereum/@decipher-media/1-2-casper-ffg-q-and-a-code-review\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00\",\"https://powercompare.co.uk/bitcoin/\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\",\"https://tendermint.com/static/docs/tendermint.pdf\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466\",\"https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/07 08:43:03
parent authordecipher-media
parent permlink1-2-casper-ffg-q-and-a-code-review
authorcheetah
permlinkcheetah-re-decipher-media1-2-casper-ffg-q-and-a-code-review
title
bodyHi! I am a robot. I just upvoted you! I found similar content that readers might be interested in: https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1
json metadata
Transaction InfoBlock #23962361/Trx 0273d43b6f18d9f1c8e9f8d2af17094b425b8ad1
View Raw JSON Data
{
  "trx_id": "0273d43b6f18d9f1c8e9f8d2af17094b425b8ad1",
  "block": 23962361,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:43:03",
  "op": [
    "comment",
    {
      "parent_author": "decipher-media",
      "parent_permlink": "1-2-casper-ffg-q-and-a-code-review",
      "author": "cheetah",
      "permlink": "cheetah-re-decipher-media1-2-casper-ffg-q-and-a-code-review",
      "title": "",
      "body": "Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:\nhttps://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1",
      "json_metadata": ""
    }
  ]
}
2018/07/07 08:42:54
votercheetah
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
weight8 (0.08%)
Transaction InfoBlock #23962358/Trx 8b7868060b2857f36dcfec890582d0d962bb53d3
View Raw JSON Data
{
  "trx_id": "8b7868060b2857f36dcfec890582d0d962bb53d3",
  "block": 23962358,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:42:54",
  "op": [
    "vote",
    {
      "voter": "cheetah",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "weight": 8
    }
  ]
}
2018/07/07 08:42:21
parent author
parent permlinkethereum
authordecipher-media
permlink1-2-casper-ffg-q-and-a-code-review
title블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review
body_Geon-gi Mun([@moongunflag](https://steemit.com/@moongunflag))_ _Seoul Nat’l Univ. Blockchain Academy Decipher([decipher-media](https://medium.com/decipher-media "This link will take you away from steemit.com"))_ #### *Note: 이 글은 서울대학교 블록체인 학회 디사이퍼에서 작성한 [미디엄 아티클](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)을 옮긴 글입니다. 이 글에서 설명하는 모든 내용은 2018년 4월 17일을 기준으로 합니다. <br> > 서울대학교 블록체인 학회인 ‘디사이퍼(Decipher)’에서 블록체인의 스케일링 솔루션에 관한 글들을 시리즈로 연재합니다. 시리즈의 첫 번째 주인공은 **Ethereum의 “Casper the Freindly Finality Gadget”**입니다. [1–1. Casper FFG Overview](https://steemit.com/casper/@decipher-media/1-1-casper-overview), [1-2. Casper FFG — Q&A 및 Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1 "This link will take you away from steemit.com")로 나누어 설명합니다. 지금까지 Casper FFG(이하 캐스퍼) 논문을 바탕으로, 캐스퍼란 무엇인가?에 대해 그 개념을 이해해보았다. 이번 글에서는 논문을 읽고 난 후에 생각을 확장해보며 생겼던 궁금증들을 Q&A 형태로 공유해보고자 한다. 또한, 현재 이더리움 Github에는 이더리움의 새로운 언어인 Vyper로 [캐스퍼 컨트랙트를 구현해둔 코드](https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py "This link will take you away from steemit.com")가 있다. 구현된 코드를 보면 이해하기 어렵던 개념이 명쾌하게 이해되는 경우가 많으니, 이를 한 번 살펴보며 캐스퍼를 좀 더 자세히 이해해보도록 하자. # [Casper FFG에 대한 궁금증 Q&A] ## 1. 캐스퍼 프로토콜의 규칙2(NO_SURROND)는 어떤 의미를 함축하고 있을까? 캐스퍼 프로토콜에는 2가지의 규칙이 존재한다. 이 중 규칙2는 선후관계에 상관없이 내가 2가지의 투표 메시지 — _(v1, s1, t1, h(s1), h(t1))_, _(v2, s2, t2, h(s2), h(t2))_ — 를 제출하였다고 가정했을 때, _h(s1) < h(s2) < h(t2) < h(t1)_ 이어서는 안 된다는 규칙이다. 규칙1에 비해 그 의미를 직관적으로 이해하기 어렵다. 캐스퍼 프로토콜에서 이 규칙이 무슨 역할을 하고 있는지 살펴보자. 먼저, 논문에서 증명된 캐스퍼의 2가지 속성 중에서 ‘충돌(conflict)하는 서로 다른 체크포인트가 동시에 finalize되기 위해서는 검증인 집단의 예치금 ⅓ 이상이 몰수되어야 한다’는 Accountable Safety 증명 과정을 살펴보면, 규칙2를 이해해볼 수 있다. 캐스퍼에서 하나의 체크포인트(_a_m_)가 finalize되기 위해서는 반드시 _a_m_와 그 직계 자손인 _a_(m+1)_이 모두 justify되어야 하는데, 이 때 Safety 속성이 지켜지기 위해서는 _a_m_와 충돌하는 다른 체크포인트(_b_n_)가 finalize되어서는 안 된다. 먼저 프로토콜 규칙1이 존재하기 때문에, _a_m_와 같은 높이인 다른 체크포인트를 향한 투표가 ⅓ 이하일 것이므로, _h(a_m)=h(b_n)_인 경우는 없을 것이다. 하지만 _a_m_와 다른 높이이면서 충돌하는 체크포인트들이 finalize되는 경우는 막을 수 있을까? 규칙1만으로는 막을 수 없다. 여기서 규칙2가 필요하다. 증명의 편의를 위해, _h(a_m)<h(b_n)_이고, 루트(_r_)에서부터 _b_n_을 향한 supermajority link들이 잇고 있는 체크포인트들이 _r→b_1→b_2→…→b_n_와 같이 존재한다고 해보자. 이 때 _h(a_(m+1))<h(b_j)_를 만족하는 가장 작은 _j_번째 체크포인트를 보면, _h(b_(j-1))<h(a_m)_을 만족한다. (그림1 참고) 다시 말해, _a_m_과 다른 높이이면서 충돌하는 체크포인트(_b_n_)가 finalize되려면, _h(b_(j-1))<h(a_m)<h(a_(m+1))<h(b_j)_인 형태의 투표 메시지가 중간에 반드시 필요한 것이다. 따라서 이러한 형태의 투표 메시지를 금지한다면, _a_m_과 다른 높이이면서 충돌하는 체크포인트가 finalize되는 것을 막을 수 있고 이것이 프로토콜 규칙2의 목적이다. ![](https://steemitimages.com/DQmPfnx45kSUMRTsAgimLZncehbvwj65xYchDMhFneqHUiw/image.png) <center>_그림 1. Accountable Safety 증명(출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf "This link will take you away from steemit.com"))_</center> 프로토콜의 Accountable Safety를 위해 규칙1과는 다른 새로운 규칙이 존재해야 한다는 것은 이해하였다. 그런데 이를 일반화하여 _h(s1)<h(s2)<h(t2)<h(t1)_ 형태의 투표 메시지를 모두 금지하였더니 side case가 생겼다. 만약 _s1_, _s2_, _s2_, _t1_이 충돌하지 않는 하나의 branch에 속해 있다고 한다면, _h(s1)<h(s2)<h(t2)<h(t1)_이라고 한들 모두 justify될 수 있는 체크포인트들이 맞지 않는가? 이 경우는 네트워크에 피해를 주지 않는 경우임에도 불구하고, 규칙2는 예외없이 금지하고 있다. 이를 예외적으로 허용할 수 있겠으나, [Vitalik Buterin은 이 규칙이 ‘검증인들이 잊어버리는 것을 금지하는 규칙’이라고 설명했다.](https://ethresear.ch/t/casper-ffg-with-one-message-type-and-simpler-fork-choice-rule/ "This link will take you away from steemit.com")이러한 설명으로 미루어보아, 규칙2가 검증인들의 비효율적인 투표 행위를 막고 있는 역할도 할 수 있으므로 굳이 이 경우를 예외적으로 허용하는 선택을 하지 않은 듯하다. 나아가 이 규칙은 검증인들이 source와 target의 간격이 짧은 투표를 하도록 유도하는 역할도 간접적으로 수행할 수 있다고 생각한다. 왜냐하면 검증인들은 자신이 했던 모든 투표를 기억하지 못할 수 있으므로 규칙2를 어기는 risk를 피해 _h(t)-h(s)<=2_인 투표를 하려고 할 것이기 때문이다. 체크포인트들의 finalize를 위해서는 _h(t)-h(s)=1_인 투표가 필요한 프로토콜에게 도움이 되는 유인이다. ## 2. 캐스퍼를 통해 좋아지는 부분은 무엇이며, 캐스퍼로 갔을 때 발생할 수 있는 문제점은 무엇이 있을까? ### PoW 51% attack의 위협이 낮아진다. 캐스퍼를 도입하게 되면 매 50번째 블록마다 원본 체인이 무엇인가에 대한 단 하나의 비가역적인 답이 정해질 수 있다.(해당 체크포인트가 finalize된다는 가정 하에) 더불어 fork choice rule로 인하여 한 번 finalize된 체크포인트는 이후에 어떤 경우에도 취소되지 않는다. 그렇기 때문에 만약 PoW 마이닝 파워의 51% 이상을 가진 세력이 등장하여 위변조한 체인을 더 길게 만들 수 있다고 하더라도, 이미 finalize된 체크포인트를 무효화하고 원본으로 채택될 수 없다. 따라서 이들의 공격은 새로운 체크포인트가 finalize되기 전까지 가장 최근의 블록들만을 변조하는 데에 그칠 것이므로 그 위협이 줄어든다. ### 하지만 새로운 공격들도 가능해진다. 그렇다면 캐스퍼가 도입되면 아무런 문제가 없을까? 논문 마지막 파트에는 캐스퍼가 도입됐을 때 실현 가능한 2개의 공격을 소개하고 있다. 각각 Long Range Revisions와 Catastrophic Crash로 불리는 이 2가지 공격은 모두 새롭게 가능해진 공격들이다. **Long Range Revisions 공격**은 PoW의 51% 공격과 그 양상이 비슷하다. 말 그대로 아주 오래 전으로 돌아가 모든 체크포인트를 새롭게 finalize하는 공격이다. 이 공격은 오랜 기간동안 총 예치금의 ⅔ 이상을 보유한 집단이 있고 이들이 현재는 모두 검증인 집단에서 탈퇴하여 예치금을 인출하고 난 이후의 상황을 가정한다. 이들은 오래 전의 체크포인트로 돌아가면 당시에는 총 예치금의 ⅔ 이상을 보유하고 있었으므로 계속해서 투표를 성사시켜 나갈 수 있는데, 이미 예치금을 인출했으므로 예치금 몰수에 대해서도 두려워하지 않을 것이다. 이 공격에 대해 캐스퍼는 항상 최초로 finalize된 블록을 선택하며 이후에 finalize된 블록이 생기더라도 모두 무시하는 규칙(fork choice rule)과, 검증인들이 예치금을 인출하고자 할 때 의도적인 인출 지연 시간(withdrawal delay)을 도입하여 해결하고자 한다. 이 때, 인출 지연 시간은 네트워크의 노드들이 finalize된 블록에 대한 정보를 업데이트하는 시간에 대한 기대값과 같다. 다시 말해 한 번 finalize된 체크포인트는 절대 되돌릴 수 없으므로, 이 체크포인트를 다수의 노드들이 알고 있기만 한다면 Long Range Revisions 공격은 막을 수 있다는 것이다. **Catastrophic Crash 공격**은 검증인 집단 중 일부가 동시에 연결이 끊겼을 때 생기는 문제 상황을 말한다. 만약 검증인 집단 중에 총 예치금의 ⅓ 이상을 차지하고 있는 검증인들이 동시에 연결에 실패하게 되면, 그 때부터 어떤 체크포인트도 ⅔ 이상의 투표를 받을 수 없게 될 것이므로 어떤 체크포인트도 justify나 finalize될 수 없기 때문이다. 이를 해결하기 위해 캐스퍼는 ‘inactivity leak’이라는 개념을 도입하였다. 만약 투표를 하지 않는 검증인들이 존재한다면 시간이 지날 때마다 지속적으로 이들의 예치금을 깎는다는 개념이다. 이러한 장치가 존재한다면 투표에 참여한 검증인들의 예치금 합이 처음에는 총 예치금의 ⅔ 이상을 차지하지 못했다고 하더라도, 시간이 흐르면서 총 예치금의 ⅔ 이상을 차지할 수 있을 것이며 비로소 투표가 성사될 수 있기 때문이다. inactivity leak을 통해 회수한 예치금을 소각할 것인지 혹은 일정 시간이 지난 후에 다시 검증인에게 돌려줄 것인지는 아직 정해지지 않았다. ## 3. 캐스퍼를 도입했을 때 이더리움의 TPS가 빨라질 수 있을까? 캐스퍼에 대해 사람들이 가장 궁금해하는 질문은 결국 ‘결국 이더리움의 TPS가 빨라질 것인가?’이다. 우선 Casper FFG 기준으로는, 캐스퍼가 도입되더라도 블록을 생성하는 규칙(block proposal mechanism)은 현행 PoW로 유지되기 때문에 아쉽게도 TPS에는 변화가 없을 것이다. 하지만 Casper FFG 이후에 Casper CBC와 같이 블록 생성마저도 PoS로 전환하는 프로토콜이 적용된다면, TPS가 극적으로 개선될 수 있을 것이다. 현재 PoW 아래에서 블록 생성 주기를 일정 수준 이하로 낮추지 못하는 이유는, 작업 증명 난이도를 낮출수록 블록체인 전체의 비효율성이 증대되기 때문이다. 왜냐하면 작업 증명이 쉬워질수록 동시에 여러 채굴자들이 블록을 만들어낼 확률이 높아질 것이며, 이는 곧 체인에서 잦은 분기와 고아 블록 형성으로 이어져 원본 체인이 무엇인가에 대한 합의 비용을 높이기 때문이다. 블록 생성 규칙이 PoS로 전환되면 이러한 문제가 해결되어 TPS가 빨라질 수 있다. ## 4. 아직 해결되지 않은 Open Problem은 어떤 것들이 있을까? ### Catastrophic crash 공격이 Inactivity leak으로 완전히 해결되지 않는다. Inactivity leak을 적용하면 Catastrophic crash 공격이 어느 정도 해결되지만, 부작용이 있다. 어느 누구의 예치금도 몰수되지 않은 채로 충돌하는 서로 다른 체크포인트가 finalize되는 다음과 같은 상황이 나타날 수 있다.(그림 2 참고) 검증인 집단이 총 예치금의 ⅔ 이상을 차지하는 A라는 그룹과 나머지 예치금을 차지하는 B라는 그룹으로 이루어져 있고, A라는 그룹이 여러 개로 분기된 체인 중 한 쪽에만 투표하여 finalize를 시키고 난 뒤 전부 연결이 끊겼다고 가정해보자. 이 때 inactivity leak으로 인하여 나머지 한 쪽 체인에서는 A의 예치금이 지속적으로 소실될 것이고, 결국 남은 검증인 집단인 B 그룹에 의해 이 체인마저 finalize가 가능해질 것이다. 다시 말해 충돌하는 서로 다른 체크포인트가 모두 finalize되었으나 그 누구도 프로토콜 규칙을 어기지 않았으므로 예치금이 몰수되지 않는다. 이 경우에 대한 해결책은 아직 나오지 않은 상태다(2018.04 기준). 혹시 이 부분에 대해 관심이 있거나 좋은 의견이 있다면 [이더리움 재단 리서치 채널](https://ethresear.ch/c/casper "This link will take you away from steemit.com")을 참고하면 된다. ![](https://steemitimages.com/0x0/https://steemitimages.com/DQmad7jJKaEa6Y3rhhK8qhg8gbwkcFDAMKYBnpDniQ6Eedg/image.png) <center>_그림 2. Inactivity leak(출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf "This link will take you away from steemit.com"))_</center> ### 경제적인 incentive 구조 설계가 필요하다. 또한, 검증인들의 투표 참여를 독려하고 악의적인 행동을 막기 위한 경제 요인에 대한 설계가 아직 미완의 상태로 남아있다. 개념적인 틀은 잡혔으나 penalty와 reward에 대한 정교한 수치 설계가 남아있다. 이에 대해서는 [Casper FFG의 경제 요인에 대한 논문](https://github.com/ethereum/research/blob/master/papers/casper-economics/casper_economics_basic.pdf "This link will take you away from steemit.com")이나 [이더리움 재단 리서치 채널](https://ethresear.ch/c/casper "This link will take you away from steemit.com")을 참고하면 된다. # [Code Review — 실제 구현된 코드 살펴보기] 이더리움 깃헙에 들어가보면, [500줄 정도의 길지 않은 코드](https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py "This link will take you away from steemit.com")로 **캐스퍼 컨트랙트**(Casper Contract)가 구현되어 있다. 코드를 하나하나 살펴보면서 캐스퍼를 좀 더 명확히 이해해보도록 하자. 코드는 크게 deposit, logout, withdraw, vote, slash로 나뉘어져 있다. 각 파트가 구현하고 있는 상황은 다음과 같다. - **deposit** : 검증인이 검증인 집단에 들어가 투표하기 위해 예치금을 캐스퍼 컨트랙트로 보낼 때 - **logout** : 검증인 집단에서 투표하던 검증인이 더이상 투표를 그만두고 검증인 집단에서 탈퇴하고자 할 때 - **withdraw** : 검증인 집단에서 탈퇴한 검증인이 예치해두었던 예치금을 인출하고자 할 때 - **vote** : 검증인 집단에 포함된 검증인이 특정 체크포인트들에 대한 투표 메시지를 캐스퍼 컨트랙트로 보낼 때 - **slash** : 검증인이 캐스퍼 프로토콜의 규칙을 어긴 것이 발각되어 예치금을 몰수당할 때 파트별로 코드를 쪼개서 설명할 것이며, 문맥 이해에 필요한 코드를 제외한 줄들은 생략하였다. 또한 기초적인 코딩 지식만을 지닌 사람이 전체 코드를 쉽게 이해할 수 있도록 돕는 데에 중점을 두었으며, Vyper 문법과 유사한 파이썬 코드를 읽을 줄 아는 사람이라면 직접 깃헙의 코드를 읽는 것이 효율적이라 생각된다. 더불어 현재(2018/04/16) 기준 가장 마지막으로 merge된 코드를 기반으로 분석하였음을 알린다. ## 1. deposit ![](https://steemitimages.com/DQmUYSRxsVLxgY3hXFL4wLY3htGNzk6etvcATPLqSQonegP/image.png) 우선 deposit을 하기 위해서는 캐스퍼 컨트랙트로 자신의 검증 주소(`validation_addr`)와 이후에 예치금을 다시 돌려 받을 주소(`withdrawal_addr`)를 함께 넣어서 보내야 한다. (이보다 앞서 이더리움 주소를 바탕으로 한 검증 코드 컨트랙트(validation code contract)를 만들어야 하는데, 이 검증 코드 컨트랙트의 주소가 `validation_addr`에 해당한다. 캐스퍼 컨트랙트 바깥에서 일어나는 상황이므로 자세히 살펴보지는 않겠다. 이에 대해서는 [여기](https://github.com/ethereum/casper/blob/master/IMPLEMENTATION.md#validator-workflow-overview "This link will take you away from steemit.com")를 참고하는 것이 좋다.) 또한 보낸 메시지(`msg`)에 담긴 예치금(`msg.value`)이 최소 보증 금액(`min_deposit_size`) 이상이어야 한다(281, 285). ([2018.04 현재 최소 보증 금액은 1,500ETH이다.](https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2 "This link will take you away from steemit.com")) 예치금이 최소 보증 금액 이상임이 확인되면 현재 `dynasty`에 2를 더하여 `start_dynasty`를 계산한다.(286) (검증인은 추후에 이 `start_dynasty`부터 검증인 집단에 포함되어 투표권을 행사할 수 있게 된다.) 그리고 나서 메시지에 담긴 예치금(`msg.value`)을 `deposit_scale_factor`로 나누어 `scaled_deposit`에 저장해두는데(287), 이는 캐스퍼 논문에서 언급되지 않았던 부분이다. 현재 구현된 캐스퍼 코드 안에서 예치금은 항상 특정한 변수(`deposit_scale_factor`)로 나눈 상태로 저장되어 있다가, 검증인에게 예치금을 돌려줄 때에 다시 똑같은 변수(`deposit_scale_factor`)를 곱하여 실제 금액으로 환산되는 방식으로 다뤄지고 있다. 이에 대해 Vitalik Buterin이 언급한 부분1, 부분2를 참고하면 그 이유는 이러하다. 투표에 참가하지 않는 검증인들에게 inactivity leak을 적용할 것인데, 투표가 지속적으로 성사가 되지 않으면 이 factor를 이용해 해당 epoch의 모든 검증인의 예치금 규모를 동시에 손쉽게 줄이기 위함이다. `start_dynasty`와 `scaled_deposit` 계산이 끝나고 나면, 검증인 집단을 담고 있는 배열(`validators[]`)의 새로운 검증인 번호(`next_validator_index`)에 이 검증인을 새롭게 추가한다(288). 이 배열(`validators[]`)은 검증인 집단에 속하는 검증인들의 5가지 정보를 담고 있다 — 예치금(`deposit`), 검증인으로서 투표를 시작하는 시기(`start_dynasty`), 검증인 자격이 끝나는 시기(`end_dynasty`), 주소(`addr`), 예치금을 돌려줄 주소(`withdrawal_addr`). 이 때, 새롭게 검증인 집단에 추가될 때에는 아직 검증인 자격이 끝나는 시기를 알 수 없으므로 `end_dynasty`를 무한대로 설정해둔다(291). (`default_end_dynasty`에 무한대 값이 저장되어 있는데, 코드로는 10³⁰으로 구현되어 있다.) 검증인 집단에 새로운 검증인을 추가했다면, 검증인들의 번호가 저장된 배열(`validator_indexes[]`)의 이 검증인의 출금 주소(`withdrawal_addr`)번 째 칸에 이 검증인의 번호(`next_validator_index`)를 저장한다(295). 추후에 해당 검증인의 출금 주소만으로 검증인 번호가 무엇인지 손쉽게 알 수 있도록 하기 위함이다. 다음 검증인 추가를 위해 새로운 검증인 번호(`next_validator_index`)를 1만큼 증가시킨다(296). 마지막으로 각 dynasty별로 직전 dynasty 대비 예치금 변화량을 담고 있는 배열(`dynasty_wei_delta[]`)에서 검증인이 투표를 시작하는 시기(`start_dynasty`)에 예치금(`scaled_deposit`)만큼을 더한다(297). 캐스퍼에서는 매 dynasty가 진행될 때마다 예치금 총량의 ⅔ 이상이 투표했는지를 확인해야 하므로, dynasty마다 검증인 집단이 맡겨둔 예치금의 총량을 계산하는 것이 중요하다. 이 때, 직전 dynasty의 총 예치금에서 이 배열(`dynasty_wei_delta[]`)에 저장된 예치금 변화량만큼만 더하거나 뺌으로써 총 예치금을 손쉽게 계산하기 위해 구현된 배열이다. ## 2. logout ![](https://steemitimages.com/0x0/https://steemitimages.com/DQmQRbkGs3182wt6N2ARrmEGjdxGpQcs1NfYz9DbdnwJoc4/image.png) 먼저 검증인이 보낸 메시지(logout_msg)에 들어있는 정보들을 꺼내어 values에 담는다(308~311). 메시지에는 검증인 번호(`validator_index`), 메시지를 보낸 시기(`epoch`), 검증인의 서명(`sig`)이 들어있다. (RLP는 이더리움에서 쓰는 인코딩 형식이다.) 정보들을 꺼내고 나면, 현재 시기(`current_epoch`)가 검증인이 메시지를 보낸 시기(`epoch`)보다 이후임을 확인한다(312). 만약 메시지를 보낸 시기보다 현재 시기가 앞선다면 잘못된 메시지일 수 있기 때문이다. 그리고 나면 검증인이 검증인 집단에서 탈퇴하는 시기(`end_dynasty`)를 계산한다(316). 검증인이 탈퇴하는 시기는 현재 시기(`dynasty`)에 탈퇴 처리 지연 시기(`dynasty_logout_delay`)만큼을 더해서 계산한다. (검증인은 이 시기까지 검증을 하고 그 이후에 검증인 집단에서 탈퇴된다. 또한 논문에서는 `logout_delay`가 검증인으로서의 자격이 주어지는 delay와 마찬가지로 2로 가정하고 있지만, 코드에서는 상수가 아닌 변수로 처리되고 있다.) 계산된 `end_dynasty`와 검증자 배열에서 해당 검증자에게 저장되어 있는 `end_dynasty`를 비교하여 이전에 logout 처리된 검증인은 아닌지 확인한다(317). 이전에 한 번도 logout 처리하지 않았다면 `end_dynasty`가 default값인 무한대일 것이며, 이전에 logout 처리되었다면 당시에 `end_dynasty`가 계산되어 저장되어 있을 것이고 그 값은 현재 계산한 `end_dynasty`보다 작거나 같을 것이므로 이 비교를 통해 확인할 수 있다. (더불어 현재(2018.04)까지 구현된 바로는 한 번 logout한 검증인은 다시 검증인 집단에 들어올 수 없다.) 모든 확인이 완료되었다면, 검증인의 `end_dynasty`를 계산된 `end_dynasty`로 덮어씌워 저장한다(319). 마지막으로, `end_dynasty` 직후에 검증인이 탈퇴할 것이므로 그 때의 예치금 변화량에서 검증인의 예치금만큼을 뺀다(320). ## 3. withdraw ![](https://steemitimages.com/DQmQ5MYsngpm8tPySi4uU6ngrxYv2hruqMTJxU1Ai4Sbdvd/image.png) 현재 `dynasty`가 검증인의 `end_dynasty` 이후인지 확인한다(340). 아직 `end_dynasty`가 지나지 않았다면 검증인이 검증인 집단에 포함되어 있다는 뜻이므로 출금을 처리해주면 안되기 때문이다. `dynasty_start_epoch[]`이란 매 dynasty가 시작된 epoch을 저장해두는 배열인데, 이 배열에서 `end_dynasty+1`의 값을 꺼내와 `end_epoch`에 넣는다(341). 다시 말해 end_dynasty 직후의 dynasty가 시작되는 epoch을 구한다. 이 epoch에 출금 지연 시간(`withdrawal_delay`)만큼을 더한 값보다 현재 epoch이 크거나 같은지 확인한다(341~342). 캐스퍼에서는 long range revision attack을 막기 위해 출금에 지연을 두는데, 출금을 신청하고 이만큼의 시간이 흘렀는지 확인하는 것이다. 자격이 모두 확인되면 출금을 진행한다. 검증인에게 저장되어 있는 예치금에다가 deposit할 때 나눴던 `deposit_scale_factor`로 다시 곱해서 인출 금액(`withdraw_amout`)를 계산한다(344). 계산한 인출 금액만큼을 검증인이 입력했던 돌려받을 주소로 송금한다(345). 마지막으로 검증인 집단 목록에서 해당 검증인을 삭제한다(348). ## 4. vote ![](https://steemitimages.com/0x0/https://steemitimages.com/DQmQM6Yn2QwUPYy6DBV9hzFScRE1RggsGY4p57wUcCuMfHj/image.png) 투표 파트를 들어가기에 앞서, 구현된 코드에 캐스퍼 논문에는 없던 부분이 추가되어 있다. 논문에서는 체크포인트의 투표 마감 기한에 대한 언급이 없지만, 코드에서는 현재 epoch에 해당하는 체크포인트를 target으로 하는 투표 메시지만을 허용하는 조건이 추가되어 있다. 다시 말해 매 체크포인트에 대한 투표의 마감 기한을 해당 epoch으로 한정하고 있다는 것이다. 캐스퍼 논문 발표(_2017.10_)보다 구현된 코드(_2018.04 현재 지속 수정중_)가 최근 정보인 점을 감안했을 때, 새로이 추가된 조건인 것으로 추측된다. 투표 메시지(`vote_msg`)에는 검증자 자신에게 부여된 번호(`validator_index`), target 체크포인트의 블록 해쉬값(`target_hash`), target 체크포인트가 포함된 epoch(`target_epoch`), source 체크포인트가 포함된 epoch(`source_epoch`), 검증자의 서명(`sig`)이 담겨있다. 이 정보들을 꺼내어 저장하고(375~380), 해당 검증인이 이미 같은 `target_epoch`에 투표를 하지는 않았는지 확인한다(384). 하나의 epoch당 검증인이 하나의 투표만을 할 수 있기 때문에 이를 확인한다. 이후에 `target_hash`가 캐스퍼 컨트랙트가 계산한 체크포인트의 해쉬값과 같은지 확인하고(387), 현재 epoch(`current_epoch`)을 target으로 하는 투표가 맞는지 확인한다(388). 이 조건을 통해 앞서 언급하였던 투표의 마감기한이 해당 epoch으로 설정되는 것이다. 또한 투표의 source가 justify된 epoch에 포함되어 있는 체크포인트인지 확인한다(390). 이어서 검증인의 자격을 확인하는데, 검증인의 자격이 활성화되는 기간 안에 현재 dynasty(`current_dynasty`) 혹은 직전 dynasty(`past_dynasty`)가 포함되는지 확인한다(392~400). 하나의 체크포인트에 대한 투표는 현재 dynasty의 검증인 집합과 직전 dynasty의 검증인 집합이 모두 참여하는데, 두 집합의 ⅔ 이상이 모두 투표해야만 justify된다. 그 이유는 동적 검증인 집합에서 생길 수 있는 문제를 해결하기 위함이다. ([1–1. Capser Overview](https://steemit.com/casper/@decipher-media/1-1-casper-overview)참고) ![](https://steemitimages.com/DQmW9s2AaPF3U64BVm4GrMH9SpHCaCRtpt1SLNQTufvvX3A/image.png) 투표의 source와 target, 검증인 자격이 모두 확인되면 투표가 정상적인 것으로 판단하고 이를 처리한다. 먼저 검증인이 `target_epoch`에 대한 투표를 진행했음을 기록한다(402). 또한 하나의 체크포인트는 현재 dynasty 검증인 집단과 직전 dynasty 검증인 집단이 각각 모두 ⅔ 이상 투표해야 justify될 수 있으므로, 이를 각각 기록해야 한다. 따라서 현재 투표 메시지를 게시한 검증인이 현재 dynasty에 포함된 검증인인지, 직전 dynasty에 포함된 검증인인지에 따라, 투표한 검증인들의 예치금 합을 저장한 배열(`votes[target_epoch].###_dyn_votes[source_epoch]`)에 검증인의 예치금만큼을 더한다(406~413). 그 다음, 투표를 제때 제출한 검증인에게는 보상을 한다. 캐스퍼 컨트랙트는 마지막 finalize된 epoch 직후의 epoch을 `expected_source_epoch`라는 값으로 저장하고 있는데, 이것과 똑같은 source_epoch으로부터의 투표라면 보상을 지급하는 것이다(416~418). 이러한 설계를 통해 프로토콜이 원하는 투표로 유도할 수 있다. 마지막으로, target 체크포인트가 justify 혹은 finalize될 수 있는 상태인지 확인하여 이를 처리한다. 만약 아직 `target_epoch`이 justify되어 있지 않고, 두 검증인 집단이 각각 ⅔ 이상 투표했다면, `target_epoch`을 justify한다(421~426). 또한, `target_epoch`이 justify되었고 `source_epoch`과 `1`만큼 차이 난다면 연속적인 epoch이라는 뜻이므로 finalize시킨다(433~435). ## 5. slash ![](https://steemitimages.com/0x0/https://steemitimages.com/DQmeVb1Sj4Yd4Maxd8GFgV7Zc7HtH7hZ45trhT3SbkxWb4M/image.png) 마지막 파트는 검증인이 캐스퍼 프로토콜의 규칙을 어겼을 때 이 검증인의 예치금을 몰수하는 slash이다. 우선 이 코드가 call되는 상황을 이해하는 것이 중요하다. 캐스퍼에서 slash는 신고와 포상 제도로 운영되는데, 특정 검증인이 제출한 2개의 투표 메시지가 캐스퍼 프로토콜 규칙을 어긴 것을 발견한 노드가 이를 캐스퍼 컨트랙트에 신고하고, 컨트랙트가 이를 바탕으로 처벌 및 포상하는 방식이다. 따라서 slash를 call할 때에는 이 2개의 투표 메시지(`vote_msg_1`, `vote_msg_2`)를 함께 보내야 한다. 두 개의 투표 메시지로부터 정보들을 꺼낸 후에(446~459), 이 두 메시지가 동일한 검증인이 제출한 투표인지(463), 서로 다른 투표 메시지인지 확인한다(465). 그 다음, 프로토콜 규칙 1을 어겼는지 확인하고(468~470), 규칙 2를 어겼는지 확인한다(471~474). 만약 어느 하나의 규칙도 어기지 않았다면 return한다(475). 만약 검증인이 규칙을 어긴 것이 맞다면, 이 검증인의 예치금을 몰수하고 검증인 집단으로부터 삭제하며 이를 발견한 신고자에게 포상금을 제공한다. 이 예치금의 포상금에서 4%만큼을 신고자의 포상금(`slashing_bounty`)으로 제외하고, 나머지 96%를 destroy하여 `total_destroyed`에 합한다(477~480). 해당 검증인은 바로 다음 dynasty부터 검증인 집단에서 제외되므로, 직후 dynasty의 deposit 변화량에서 이 예치금만큼을 뺀다(485). 이 때, 만약 이 검증인이 이미 로그아웃을 신청하였다면, logout을 처리하면서 이미 이 검증인의 `end_dynasty`부터 예치금만큼을 빼는 작업을 수행하였으므로 이를 다시 더해줘야 한다(489~490). 로그아웃을 신청했다는 사실은 검증인의 `end_dynasty`가 default(무한대)보다 작은 값인지를 확인함으로써 알 수 있다. 모든 과정이 처리되면, 별도의 function(`delete_validator()`)을 call하여 해당 검증인을 검증인 집단으로부터 삭제한다(492). 마지막으로 이를 신고한 사람(`msg.sender`)에게 포상금(`slashing_bounty`)을 보낸다(493). >이 글은 고팍스(@gopaxkr)로부터 후원을 받아 디사이퍼가 작성한 글입니다.
json metadata{"tags":["ethereum","casper","blockchain","decipher","coinkorea"],"users":["gopaxkr"],"image":["https://steemitimages.com/DQmPfnx45kSUMRTsAgimLZncehbvwj65xYchDMhFneqHUiw/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmad7jJKaEa6Y3rhhK8qhg8gbwkcFDAMKYBnpDniQ6Eedg/image.png","https://steemitimages.com/DQmUYSRxsVLxgY3hXFL4wLY3htGNzk6etvcATPLqSQonegP/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmQRbkGs3182wt6N2ARrmEGjdxGpQcs1NfYz9DbdnwJoc4/image.png","https://steemitimages.com/DQmQ5MYsngpm8tPySi4uU6ngrxYv2hruqMTJxU1Ai4Sbdvd/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmQM6Yn2QwUPYy6DBV9hzFScRE1RggsGY4p57wUcCuMfHj/image.png","https://steemitimages.com/DQmW9s2AaPF3U64BVm4GrMH9SpHCaCRtpt1SLNQTufvvX3A/image.png","https://steemitimages.com/0x0/https://steemitimages.com/DQmeVb1Sj4Yd4Maxd8GFgV7Zc7HtH7hZ45trhT3SbkxWb4M/image.png"],"links":["https://steemit.com/@moongunflag","https://medium.com/decipher-media","https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1","https://steemit.com/casper/@decipher-media/1-1-casper-overview","https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://ethresear.ch/t/casper-ffg-with-one-message-type-and-simpler-fork-choice-rule/","https://ethresear.ch/c/casper","https://github.com/ethereum/research/blob/master/papers/casper-economics/casper_economics_basic.pdf","https://github.com/ethereum/casper/blob/master/IMPLEMENTATION.md#validator-workflow-overview","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23962347/Trx 52fc5819724d45ba71b9ccea6ec6f883d796e0c5
View Raw JSON Data
{
  "trx_id": "52fc5819724d45ba71b9ccea6ec6f883d796e0c5",
  "block": 23962347,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:42:21",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "ethereum",
      "author": "decipher-media",
      "permlink": "1-2-casper-ffg-q-and-a-code-review",
      "title": "블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review",
      "body": "_Geon-gi Mun([@moongunflag](https://steemit.com/@moongunflag))_  \n_Seoul Nat’l Univ. Blockchain Academy Decipher([decipher-media](https://medium.com/decipher-media \"This link will take you away from steemit.com\"))_\n\n#### *Note: 이 글은 서울대학교 블록체인 학회 디사이퍼에서 작성한 [미디엄 아티클](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)을 옮긴 글입니다. 이 글에서 설명하는 모든 내용은 2018년 4월 17일을 기준으로 합니다.\n<br>\n\n> 서울대학교 블록체인 학회인 ‘디사이퍼(Decipher)’에서 블록체인의 스케일링 솔루션에 관한 글들을 시리즈로 연재합니다. 시리즈의 첫 번째 주인공은  **Ethereum의 “Casper the Freindly Finality Gadget”**입니다.  [1–1. Casper FFG Overview](https://steemit.com/casper/@decipher-media/1-1-casper-overview),  [1-2. Casper FFG — Q&A 및 Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1 \"This link will take you away from steemit.com\")로 나누어 설명합니다.\n\n지금까지 Casper FFG(이하 캐스퍼) 논문을 바탕으로, 캐스퍼란 무엇인가?에 대해 그 개념을 이해해보았다. 이번 글에서는 논문을 읽고 난 후에 생각을 확장해보며 생겼던 궁금증들을 Q&A 형태로 공유해보고자 한다. 또한, 현재 이더리움 Github에는 이더리움의 새로운 언어인 Vyper로  [캐스퍼 컨트랙트를 구현해둔 코드](https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py \"This link will take you away from steemit.com\")가 있다. 구현된 코드를 보면 이해하기 어렵던 개념이 명쾌하게 이해되는 경우가 많으니, 이를 한 번 살펴보며 캐스퍼를 좀 더 자세히 이해해보도록 하자.\n\n# [Casper FFG에 대한 궁금증 Q&A]\n\n## 1. 캐스퍼 프로토콜의 규칙2(NO_SURROND)는 어떤 의미를 함축하고 있을까?\n\n캐스퍼 프로토콜에는 2가지의 규칙이 존재한다. 이 중 규칙2는 선후관계에 상관없이 내가 2가지의 투표 메시지 — _(v1, s1, t1, h(s1), h(t1))_,  _(v2, s2, t2, h(s2), h(t2))_ — 를 제출하였다고 가정했을 때,  _h(s1) < h(s2) < h(t2) < h(t1)_  이어서는 안 된다는 규칙이다. 규칙1에 비해 그 의미를 직관적으로 이해하기 어렵다. 캐스퍼 프로토콜에서 이 규칙이 무슨 역할을 하고 있는지 살펴보자.\n\n먼저, 논문에서 증명된 캐스퍼의 2가지 속성 중에서 ‘충돌(conflict)하는 서로 다른 체크포인트가 동시에 finalize되기 위해서는 검증인 집단의 예치금 ⅓ 이상이 몰수되어야 한다’는 Accountable Safety 증명 과정을 살펴보면, 규칙2를 이해해볼 수 있다. 캐스퍼에서 하나의 체크포인트(_a_m_)가 finalize되기 위해서는 반드시  _a_m_와 그 직계 자손인  _a_(m+1)_이 모두 justify되어야 하는데, 이 때 Safety 속성이 지켜지기 위해서는  _a_m_와 충돌하는 다른 체크포인트(_b_n_)가 finalize되어서는 안 된다. 먼저 프로토콜 규칙1이 존재하기 때문에,  _a_m_와 같은 높이인 다른 체크포인트를 향한 투표가 ⅓ 이하일 것이므로,  _h(a_m)=h(b_n)_인 경우는 없을 것이다. 하지만  _a_m_와 다른 높이이면서 충돌하는 체크포인트들이 finalize되는 경우는 막을 수 있을까? 규칙1만으로는 막을 수 없다. 여기서 규칙2가 필요하다. 증명의 편의를 위해,  _h(a_m)<h(b_n)_이고, 루트(_r_)에서부터  _b_n_을 향한 supermajority link들이 잇고 있는 체크포인트들이  _r→b_1→b_2→…→b_n_와 같이 존재한다고 해보자. 이 때  _h(a_(m+1))<h(b_j)_를 만족하는 가장 작은  _j_번째 체크포인트를 보면,  _h(b_(j-1))<h(a_m)_을 만족한다. (그림1 참고) 다시 말해,  _a_m_과 다른 높이이면서 충돌하는 체크포인트(_b_n_)가 finalize되려면,  _h(b_(j-1))<h(a_m)<h(a_(m+1))<h(b_j)_인 형태의 투표 메시지가 중간에 반드시 필요한 것이다. 따라서 이러한 형태의 투표 메시지를 금지한다면,  _a_m_과 다른 높이이면서 충돌하는 체크포인트가 finalize되는 것을 막을 수 있고 이것이 프로토콜 규칙2의 목적이다.\n\n![](https://steemitimages.com/DQmPfnx45kSUMRTsAgimLZncehbvwj65xYchDMhFneqHUiw/image.png)\n\n<center>_그림 1. Accountable Safety 증명(출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf \"This link will take you away from steemit.com\"))_</center>\n\n프로토콜의 Accountable Safety를 위해 규칙1과는 다른 새로운 규칙이 존재해야 한다는 것은 이해하였다. 그런데 이를 일반화하여  _h(s1)<h(s2)<h(t2)<h(t1)_  형태의 투표 메시지를 모두 금지하였더니 side case가 생겼다. 만약  _s1_,  _s2_,  _s2_,  _t1_이 충돌하지 않는 하나의 branch에 속해 있다고 한다면,  _h(s1)<h(s2)<h(t2)<h(t1)_이라고 한들 모두 justify될 수 있는 체크포인트들이 맞지 않는가? 이 경우는 네트워크에 피해를 주지 않는 경우임에도 불구하고, 규칙2는 예외없이 금지하고 있다. 이를 예외적으로 허용할 수 있겠으나,  [Vitalik Buterin은 이 규칙이 ‘검증인들이 잊어버리는 것을 금지하는 규칙’이라고 설명했다.](https://ethresear.ch/t/casper-ffg-with-one-message-type-and-simpler-fork-choice-rule/ \"This link will take you away from steemit.com\")이러한 설명으로 미루어보아, 규칙2가 검증인들의 비효율적인 투표 행위를 막고 있는 역할도 할 수 있으므로 굳이 이 경우를 예외적으로 허용하는 선택을 하지 않은 듯하다.\n\n나아가 이 규칙은 검증인들이 source와 target의 간격이 짧은 투표를 하도록 유도하는 역할도 간접적으로 수행할 수 있다고 생각한다. 왜냐하면 검증인들은 자신이 했던 모든 투표를 기억하지 못할 수 있으므로 규칙2를 어기는 risk를 피해  _h(t)-h(s)<=2_인 투표를 하려고 할 것이기 때문이다. 체크포인트들의 finalize를 위해서는  _h(t)-h(s)=1_인 투표가 필요한 프로토콜에게 도움이 되는 유인이다.\n\n## 2. 캐스퍼를 통해 좋아지는 부분은 무엇이며, 캐스퍼로 갔을 때 발생할 수 있는 문제점은 무엇이 있을까?\n\n### PoW 51% attack의 위협이 낮아진다.\n\n캐스퍼를 도입하게 되면 매 50번째 블록마다 원본 체인이 무엇인가에 대한 단 하나의 비가역적인 답이 정해질 수 있다.(해당 체크포인트가 finalize된다는 가정 하에) 더불어 fork choice rule로 인하여 한 번 finalize된 체크포인트는 이후에 어떤 경우에도 취소되지 않는다. 그렇기 때문에 만약 PoW 마이닝 파워의 51% 이상을 가진 세력이 등장하여 위변조한 체인을 더 길게 만들 수 있다고 하더라도, 이미 finalize된 체크포인트를 무효화하고 원본으로 채택될 수 없다. 따라서 이들의 공격은 새로운 체크포인트가 finalize되기 전까지 가장 최근의 블록들만을 변조하는 데에 그칠 것이므로 그 위협이 줄어든다.\n\n### 하지만 새로운 공격들도 가능해진다.\n\n그렇다면 캐스퍼가 도입되면 아무런 문제가 없을까? 논문 마지막 파트에는 캐스퍼가 도입됐을 때 실현 가능한 2개의 공격을 소개하고 있다. 각각 Long Range Revisions와 Catastrophic Crash로 불리는 이 2가지 공격은 모두 새롭게 가능해진 공격들이다.\n\n**Long Range Revisions 공격**은 PoW의 51% 공격과 그 양상이 비슷하다. 말 그대로 아주 오래 전으로 돌아가 모든 체크포인트를 새롭게 finalize하는 공격이다. 이 공격은 오랜 기간동안 총 예치금의 ⅔ 이상을 보유한 집단이 있고 이들이 현재는 모두 검증인 집단에서 탈퇴하여 예치금을 인출하고 난 이후의 상황을 가정한다. 이들은 오래 전의 체크포인트로 돌아가면 당시에는 총 예치금의 ⅔ 이상을 보유하고 있었으므로 계속해서 투표를 성사시켜 나갈 수 있는데, 이미 예치금을 인출했으므로 예치금 몰수에 대해서도 두려워하지 않을 것이다. 이 공격에 대해 캐스퍼는 항상 최초로 finalize된 블록을 선택하며 이후에 finalize된 블록이 생기더라도 모두 무시하는 규칙(fork choice rule)과, 검증인들이 예치금을 인출하고자 할 때 의도적인 인출 지연 시간(withdrawal delay)을 도입하여 해결하고자 한다. 이 때, 인출 지연 시간은 네트워크의 노드들이 finalize된 블록에 대한 정보를 업데이트하는 시간에 대한 기대값과 같다. 다시 말해 한 번 finalize된 체크포인트는 절대 되돌릴 수 없으므로, 이 체크포인트를 다수의 노드들이 알고 있기만 한다면 Long Range Revisions 공격은 막을 수 있다는 것이다.\n\n**Catastrophic Crash 공격**은 검증인 집단 중 일부가 동시에 연결이 끊겼을 때 생기는 문제 상황을 말한다. 만약 검증인 집단 중에 총 예치금의 ⅓ 이상을 차지하고 있는 검증인들이 동시에 연결에 실패하게 되면, 그 때부터 어떤 체크포인트도 ⅔ 이상의 투표를 받을 수 없게 될 것이므로 어떤 체크포인트도 justify나 finalize될 수 없기 때문이다. 이를 해결하기 위해 캐스퍼는 ‘inactivity leak’이라는 개념을 도입하였다. 만약 투표를 하지 않는 검증인들이 존재한다면 시간이 지날 때마다 지속적으로 이들의 예치금을 깎는다는 개념이다. 이러한 장치가 존재한다면 투표에 참여한 검증인들의 예치금 합이 처음에는 총 예치금의 ⅔ 이상을 차지하지 못했다고 하더라도, 시간이 흐르면서 총 예치금의 ⅔ 이상을 차지할 수 있을 것이며 비로소 투표가 성사될 수 있기 때문이다. inactivity leak을 통해 회수한 예치금을 소각할 것인지 혹은 일정 시간이 지난 후에 다시 검증인에게 돌려줄 것인지는 아직 정해지지 않았다.\n\n## 3. 캐스퍼를 도입했을 때 이더리움의 TPS가 빨라질 수 있을까?\n\n캐스퍼에 대해 사람들이 가장 궁금해하는 질문은 결국 ‘결국 이더리움의 TPS가 빨라질 것인가?’이다. 우선 Casper FFG 기준으로는, 캐스퍼가 도입되더라도 블록을 생성하는 규칙(block proposal mechanism)은 현행 PoW로 유지되기 때문에 아쉽게도 TPS에는 변화가 없을 것이다. 하지만 Casper FFG 이후에 Casper CBC와 같이 블록 생성마저도 PoS로 전환하는 프로토콜이 적용된다면, TPS가 극적으로 개선될 수 있을 것이다. 현재 PoW 아래에서 블록 생성 주기를 일정 수준 이하로 낮추지 못하는 이유는, 작업 증명 난이도를 낮출수록 블록체인 전체의 비효율성이 증대되기 때문이다. 왜냐하면 작업 증명이 쉬워질수록 동시에 여러 채굴자들이 블록을 만들어낼 확률이 높아질 것이며, 이는 곧 체인에서 잦은 분기와 고아 블록 형성으로 이어져 원본 체인이 무엇인가에 대한 합의 비용을 높이기 때문이다. 블록 생성 규칙이 PoS로 전환되면 이러한 문제가 해결되어 TPS가 빨라질 수 있다.\n\n## 4. 아직 해결되지 않은 Open Problem은 어떤 것들이 있을까?\n\n### Catastrophic crash 공격이 Inactivity leak으로 완전히 해결되지 않는다.\n\nInactivity leak을 적용하면 Catastrophic crash 공격이 어느 정도 해결되지만, 부작용이 있다. 어느 누구의 예치금도 몰수되지 않은 채로 충돌하는 서로 다른 체크포인트가 finalize되는 다음과 같은 상황이 나타날 수 있다.(그림 2 참고) 검증인 집단이 총 예치금의 ⅔ 이상을 차지하는 A라는 그룹과 나머지 예치금을 차지하는 B라는 그룹으로 이루어져 있고, A라는 그룹이 여러 개로 분기된 체인 중 한 쪽에만 투표하여 finalize를 시키고 난 뒤 전부 연결이 끊겼다고 가정해보자. 이 때 inactivity leak으로 인하여 나머지 한 쪽 체인에서는 A의 예치금이 지속적으로 소실될 것이고, 결국 남은 검증인 집단인 B 그룹에 의해 이 체인마저 finalize가 가능해질 것이다. 다시 말해 충돌하는 서로 다른 체크포인트가 모두 finalize되었으나 그 누구도 프로토콜 규칙을 어기지 않았으므로 예치금이 몰수되지 않는다. 이 경우에 대한 해결책은 아직 나오지 않은 상태다(2018.04 기준). 혹시 이 부분에 대해 관심이 있거나 좋은 의견이 있다면  [이더리움 재단 리서치 채널](https://ethresear.ch/c/casper \"This link will take you away from steemit.com\")을 참고하면 된다.\n\n![](https://steemitimages.com/0x0/https://steemitimages.com/DQmad7jJKaEa6Y3rhhK8qhg8gbwkcFDAMKYBnpDniQ6Eedg/image.png)\n\n<center>_그림 2. Inactivity leak(출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf \"This link will take you away from steemit.com\"))_</center>\n\n### 경제적인 incentive 구조 설계가 필요하다.\n\n또한, 검증인들의 투표 참여를 독려하고 악의적인 행동을 막기 위한 경제 요인에 대한 설계가 아직 미완의 상태로 남아있다. 개념적인 틀은 잡혔으나 penalty와 reward에 대한 정교한 수치 설계가 남아있다. 이에 대해서는  [Casper FFG의 경제 요인에 대한 논문](https://github.com/ethereum/research/blob/master/papers/casper-economics/casper_economics_basic.pdf \"This link will take you away from steemit.com\")이나  [이더리움 재단 리서치 채널](https://ethresear.ch/c/casper \"This link will take you away from steemit.com\")을 참고하면 된다.\n\n# [Code Review — 실제 구현된 코드 살펴보기]\n\n이더리움 깃헙에 들어가보면,  [500줄 정도의 길지 않은 코드](https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py \"This link will take you away from steemit.com\")로  **캐스퍼 컨트랙트**(Casper Contract)가 구현되어 있다. 코드를 하나하나 살펴보면서 캐스퍼를 좀 더 명확히 이해해보도록 하자. 코드는 크게 deposit, logout, withdraw, vote, slash로 나뉘어져 있다. 각 파트가 구현하고 있는 상황은 다음과 같다.\n\n-   **deposit**  : 검증인이 검증인 집단에 들어가 투표하기 위해 예치금을 캐스퍼 컨트랙트로 보낼 때\n-   **logout**  : 검증인 집단에서 투표하던 검증인이 더이상 투표를 그만두고 검증인 집단에서 탈퇴하고자 할 때\n-   **withdraw**  : 검증인 집단에서 탈퇴한 검증인이 예치해두었던 예치금을 인출하고자 할 때\n-   **vote**  : 검증인 집단에 포함된 검증인이 특정 체크포인트들에 대한 투표 메시지를 캐스퍼 컨트랙트로 보낼 때\n-   **slash**  : 검증인이 캐스퍼 프로토콜의 규칙을 어긴 것이 발각되어 예치금을 몰수당할 때\n\n파트별로 코드를 쪼개서 설명할 것이며, 문맥 이해에 필요한 코드를 제외한 줄들은 생략하였다. 또한 기초적인 코딩 지식만을 지닌 사람이 전체 코드를 쉽게 이해할 수 있도록 돕는 데에 중점을 두었으며, Vyper 문법과 유사한 파이썬 코드를 읽을 줄 아는 사람이라면 직접 깃헙의 코드를 읽는 것이 효율적이라 생각된다. 더불어 현재(2018/04/16) 기준 가장 마지막으로 merge된 코드를 기반으로 분석하였음을 알린다.\n\n## 1. deposit\n\n![](https://steemitimages.com/DQmUYSRxsVLxgY3hXFL4wLY3htGNzk6etvcATPLqSQonegP/image.png)\n\n우선 deposit을 하기 위해서는 캐스퍼 컨트랙트로 자신의 검증 주소(`validation_addr`)와 이후에 예치금을 다시 돌려 받을 주소(`withdrawal_addr`)를 함께 넣어서 보내야 한다. (이보다 앞서 이더리움 주소를 바탕으로 한 검증 코드 컨트랙트(validation code contract)를 만들어야 하는데, 이 검증 코드 컨트랙트의 주소가  `validation_addr`에 해당한다. 캐스퍼 컨트랙트 바깥에서 일어나는 상황이므로 자세히 살펴보지는 않겠다. 이에 대해서는  [여기](https://github.com/ethereum/casper/blob/master/IMPLEMENTATION.md#validator-workflow-overview \"This link will take you away from steemit.com\")를 참고하는 것이 좋다.) 또한 보낸 메시지(`msg`)에 담긴 예치금(`msg.value`)이 최소 보증 금액(`min_deposit_size`) 이상이어야 한다(281, 285). ([2018.04 현재 최소 보증 금액은 1,500ETH이다.](https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2 \"This link will take you away from steemit.com\")) 예치금이 최소 보증 금액 이상임이 확인되면 현재  `dynasty`에 2를 더하여  `start_dynasty`를 계산한다.(286) (검증인은 추후에 이  `start_dynasty`부터 검증인 집단에 포함되어 투표권을 행사할 수 있게 된다.) 그리고 나서 메시지에 담긴 예치금(`msg.value`)을  `deposit_scale_factor`로 나누어  `scaled_deposit`에 저장해두는데(287), 이는 캐스퍼 논문에서 언급되지 않았던 부분이다. 현재 구현된 캐스퍼 코드 안에서 예치금은 항상 특정한 변수(`deposit_scale_factor`)로 나눈 상태로 저장되어 있다가, 검증인에게 예치금을 돌려줄 때에 다시 똑같은 변수(`deposit_scale_factor`)를 곱하여 실제 금액으로 환산되는 방식으로 다뤄지고 있다. 이에 대해 Vitalik Buterin이 언급한 부분1, 부분2를 참고하면 그 이유는 이러하다. 투표에 참가하지 않는 검증인들에게 inactivity leak을 적용할 것인데, 투표가 지속적으로 성사가 되지 않으면 이 factor를 이용해 해당 epoch의 모든 검증인의 예치금 규모를 동시에 손쉽게 줄이기 위함이다.  `start_dynasty`와  `scaled_deposit`  계산이 끝나고 나면, 검증인 집단을 담고 있는 배열(`validators[]`)의 새로운 검증인 번호(`next_validator_index`)에 이 검증인을 새롭게 추가한다(288). 이 배열(`validators[]`)은 검증인 집단에 속하는 검증인들의 5가지 정보를 담고 있다 — 예치금(`deposit`), 검증인으로서 투표를 시작하는 시기(`start_dynasty`), 검증인 자격이 끝나는 시기(`end_dynasty`), 주소(`addr`), 예치금을 돌려줄 주소(`withdrawal_addr`). 이 때, 새롭게 검증인 집단에 추가될 때에는 아직 검증인 자격이 끝나는 시기를 알 수 없으므로  `end_dynasty`를 무한대로 설정해둔다(291). (`default_end_dynasty`에 무한대 값이 저장되어 있는데, 코드로는 10³⁰으로 구현되어 있다.) 검증인 집단에 새로운 검증인을 추가했다면, 검증인들의 번호가 저장된 배열(`validator_indexes[]`)의 이 검증인의 출금 주소(`withdrawal_addr`)번 째 칸에 이 검증인의 번호(`next_validator_index`)를 저장한다(295). 추후에 해당 검증인의 출금 주소만으로 검증인 번호가 무엇인지 손쉽게 알 수 있도록 하기 위함이다. 다음 검증인 추가를 위해 새로운 검증인 번호(`next_validator_index`)를 1만큼 증가시킨다(296). 마지막으로 각 dynasty별로 직전 dynasty 대비 예치금 변화량을 담고 있는 배열(`dynasty_wei_delta[]`)에서 검증인이 투표를 시작하는 시기(`start_dynasty`)에 예치금(`scaled_deposit`)만큼을 더한다(297). 캐스퍼에서는 매 dynasty가 진행될 때마다 예치금 총량의 ⅔ 이상이 투표했는지를 확인해야 하므로, dynasty마다 검증인 집단이 맡겨둔 예치금의 총량을 계산하는 것이 중요하다. 이 때, 직전 dynasty의 총 예치금에서 이 배열(`dynasty_wei_delta[]`)에 저장된 예치금 변화량만큼만 더하거나 뺌으로써 총 예치금을 손쉽게 계산하기 위해 구현된 배열이다.\n\n## 2. logout\n\n![](https://steemitimages.com/0x0/https://steemitimages.com/DQmQRbkGs3182wt6N2ARrmEGjdxGpQcs1NfYz9DbdnwJoc4/image.png)\n\n먼저 검증인이 보낸 메시지(logout_msg)에 들어있는 정보들을 꺼내어 values에 담는다(308~311). 메시지에는 검증인 번호(`validator_index`), 메시지를 보낸 시기(`epoch`), 검증인의 서명(`sig`)이 들어있다. (RLP는 이더리움에서 쓰는 인코딩 형식이다.) 정보들을 꺼내고 나면, 현재 시기(`current_epoch`)가 검증인이 메시지를 보낸 시기(`epoch`)보다 이후임을 확인한다(312). 만약 메시지를 보낸 시기보다 현재 시기가 앞선다면 잘못된 메시지일 수 있기 때문이다. 그리고 나면 검증인이 검증인 집단에서 탈퇴하는 시기(`end_dynasty`)를 계산한다(316). 검증인이 탈퇴하는 시기는 현재 시기(`dynasty`)에 탈퇴 처리 지연 시기(`dynasty_logout_delay`)만큼을 더해서 계산한다. (검증인은 이 시기까지 검증을 하고 그 이후에 검증인 집단에서 탈퇴된다. 또한 논문에서는  `logout_delay`가 검증인으로서의 자격이 주어지는 delay와 마찬가지로 2로 가정하고 있지만, 코드에서는 상수가 아닌 변수로 처리되고 있다.) 계산된  `end_dynasty`와 검증자 배열에서 해당 검증자에게 저장되어 있는  `end_dynasty`를 비교하여 이전에 logout 처리된 검증인은 아닌지 확인한다(317). 이전에 한 번도 logout 처리하지 않았다면  `end_dynasty`가 default값인 무한대일 것이며, 이전에 logout 처리되었다면 당시에  `end_dynasty`가 계산되어 저장되어 있을 것이고 그 값은 현재 계산한  `end_dynasty`보다 작거나 같을 것이므로 이 비교를 통해 확인할 수 있다. (더불어 현재(2018.04)까지 구현된 바로는 한 번 logout한 검증인은 다시 검증인 집단에 들어올 수 없다.) 모든 확인이 완료되었다면, 검증인의  `end_dynasty`를 계산된  `end_dynasty`로 덮어씌워 저장한다(319). 마지막으로,  `end_dynasty`  직후에 검증인이 탈퇴할 것이므로 그 때의 예치금 변화량에서 검증인의 예치금만큼을 뺀다(320).\n\n## 3. withdraw\n\n![](https://steemitimages.com/DQmQ5MYsngpm8tPySi4uU6ngrxYv2hruqMTJxU1Ai4Sbdvd/image.png)\n\n현재  `dynasty`가 검증인의  `end_dynasty`  이후인지 확인한다(340). 아직  `end_dynasty`가 지나지 않았다면 검증인이 검증인 집단에 포함되어 있다는 뜻이므로 출금을 처리해주면 안되기 때문이다.  `dynasty_start_epoch[]`이란 매 dynasty가 시작된 epoch을 저장해두는 배열인데, 이 배열에서  `end_dynasty+1`의 값을 꺼내와  `end_epoch`에 넣는다(341). 다시 말해 end_dynasty 직후의 dynasty가 시작되는 epoch을 구한다. 이 epoch에 출금 지연 시간(`withdrawal_delay`)만큼을 더한 값보다 현재 epoch이 크거나 같은지 확인한다(341~342). 캐스퍼에서는 long range revision attack을 막기 위해 출금에 지연을 두는데, 출금을 신청하고 이만큼의 시간이 흘렀는지 확인하는 것이다. 자격이 모두 확인되면 출금을 진행한다. 검증인에게 저장되어 있는 예치금에다가 deposit할 때 나눴던  `deposit_scale_factor`로 다시 곱해서 인출 금액(`withdraw_amout`)를 계산한다(344). 계산한 인출 금액만큼을 검증인이 입력했던 돌려받을 주소로 송금한다(345). 마지막으로 검증인 집단 목록에서 해당 검증인을 삭제한다(348).\n\n## 4. vote\n\n![](https://steemitimages.com/0x0/https://steemitimages.com/DQmQM6Yn2QwUPYy6DBV9hzFScRE1RggsGY4p57wUcCuMfHj/image.png)\n\n투표 파트를 들어가기에 앞서, 구현된 코드에 캐스퍼 논문에는 없던 부분이 추가되어 있다. 논문에서는 체크포인트의 투표 마감 기한에 대한 언급이 없지만, 코드에서는 현재 epoch에 해당하는 체크포인트를 target으로 하는 투표 메시지만을 허용하는 조건이 추가되어 있다. 다시 말해 매 체크포인트에 대한 투표의 마감 기한을 해당 epoch으로 한정하고 있다는 것이다. 캐스퍼 논문 발표(_2017.10_)보다 구현된 코드(_2018.04 현재 지속 수정중_)가 최근 정보인 점을 감안했을 때, 새로이 추가된 조건인 것으로 추측된다.\n\n투표 메시지(`vote_msg`)에는 검증자 자신에게 부여된 번호(`validator_index`), target 체크포인트의 블록 해쉬값(`target_hash`), target 체크포인트가 포함된 epoch(`target_epoch`), source 체크포인트가 포함된 epoch(`source_epoch`), 검증자의 서명(`sig`)이 담겨있다. 이 정보들을 꺼내어 저장하고(375~380), 해당 검증인이 이미 같은  `target_epoch`에 투표를 하지는 않았는지 확인한다(384). 하나의 epoch당 검증인이 하나의 투표만을 할 수 있기 때문에 이를 확인한다. 이후에  `target_hash`가 캐스퍼 컨트랙트가 계산한 체크포인트의 해쉬값과 같은지 확인하고(387), 현재 epoch(`current_epoch`)을 target으로 하는 투표가 맞는지 확인한다(388). 이 조건을 통해 앞서 언급하였던 투표의 마감기한이 해당 epoch으로 설정되는 것이다. 또한 투표의 source가 justify된 epoch에 포함되어 있는 체크포인트인지 확인한다(390). 이어서 검증인의 자격을 확인하는데, 검증인의 자격이 활성화되는 기간 안에 현재 dynasty(`current_dynasty`) 혹은 직전 dynasty(`past_dynasty`)가 포함되는지 확인한다(392~400). 하나의 체크포인트에 대한 투표는 현재 dynasty의 검증인 집합과 직전 dynasty의 검증인 집합이 모두 참여하는데, 두 집합의 ⅔ 이상이 모두 투표해야만 justify된다. 그 이유는 동적 검증인 집합에서 생길 수 있는 문제를 해결하기 위함이다. ([1–1. Capser Overview](https://steemit.com/casper/@decipher-media/1-1-casper-overview)참고)\n\n![](https://steemitimages.com/DQmW9s2AaPF3U64BVm4GrMH9SpHCaCRtpt1SLNQTufvvX3A/image.png)\n\n투표의 source와 target, 검증인 자격이 모두 확인되면 투표가 정상적인 것으로 판단하고 이를 처리한다. 먼저 검증인이  `target_epoch`에 대한 투표를 진행했음을 기록한다(402). 또한 하나의 체크포인트는 현재 dynasty 검증인 집단과 직전 dynasty 검증인 집단이 각각 모두 ⅔ 이상 투표해야 justify될 수 있으므로, 이를 각각 기록해야 한다. 따라서 현재 투표 메시지를 게시한 검증인이 현재 dynasty에 포함된 검증인인지, 직전 dynasty에 포함된 검증인인지에 따라, 투표한 검증인들의 예치금 합을 저장한 배열(`votes[target_epoch].###_dyn_votes[source_epoch]`)에 검증인의 예치금만큼을 더한다(406~413). 그 다음, 투표를 제때 제출한 검증인에게는 보상을 한다. 캐스퍼 컨트랙트는 마지막 finalize된 epoch 직후의 epoch을  `expected_source_epoch`라는 값으로 저장하고 있는데, 이것과 똑같은 source_epoch으로부터의 투표라면 보상을 지급하는 것이다(416~418). 이러한 설계를 통해 프로토콜이 원하는 투표로 유도할 수 있다. 마지막으로, target 체크포인트가 justify 혹은 finalize될 수 있는 상태인지 확인하여 이를 처리한다. 만약 아직  `target_epoch`이 justify되어 있지 않고, 두 검증인 집단이 각각 ⅔ 이상 투표했다면,  `target_epoch`을 justify한다(421~426). 또한,  `target_epoch`이 justify되었고  `source_epoch`과  `1`만큼 차이 난다면 연속적인 epoch이라는 뜻이므로 finalize시킨다(433~435).\n\n## 5. slash\n\n![](https://steemitimages.com/0x0/https://steemitimages.com/DQmeVb1Sj4Yd4Maxd8GFgV7Zc7HtH7hZ45trhT3SbkxWb4M/image.png)\n\n마지막 파트는 검증인이 캐스퍼 프로토콜의 규칙을 어겼을 때 이 검증인의 예치금을 몰수하는 slash이다. 우선 이 코드가 call되는 상황을 이해하는 것이 중요하다. 캐스퍼에서 slash는 신고와 포상 제도로 운영되는데, 특정 검증인이 제출한 2개의 투표 메시지가 캐스퍼 프로토콜 규칙을 어긴 것을 발견한 노드가 이를 캐스퍼 컨트랙트에 신고하고, 컨트랙트가 이를 바탕으로 처벌 및 포상하는 방식이다. 따라서 slash를 call할 때에는 이 2개의 투표 메시지(`vote_msg_1`,  `vote_msg_2`)를 함께 보내야 한다. 두 개의 투표 메시지로부터 정보들을 꺼낸 후에(446~459), 이 두 메시지가 동일한 검증인이 제출한 투표인지(463), 서로 다른 투표 메시지인지 확인한다(465). 그 다음, 프로토콜 규칙 1을 어겼는지 확인하고(468~470), 규칙 2를 어겼는지 확인한다(471~474). 만약 어느 하나의 규칙도 어기지 않았다면 return한다(475). 만약 검증인이 규칙을 어긴 것이 맞다면, 이 검증인의 예치금을 몰수하고 검증인 집단으로부터 삭제하며 이를 발견한 신고자에게 포상금을 제공한다. 이 예치금의 포상금에서 4%만큼을 신고자의 포상금(`slashing_bounty`)으로 제외하고, 나머지 96%를 destroy하여  `total_destroyed`에 합한다(477~480). 해당 검증인은 바로 다음 dynasty부터 검증인 집단에서 제외되므로, 직후 dynasty의 deposit 변화량에서 이 예치금만큼을 뺀다(485). 이 때, 만약 이 검증인이 이미 로그아웃을 신청하였다면, logout을 처리하면서 이미 이 검증인의  `end_dynasty`부터 예치금만큼을 빼는 작업을 수행하였으므로 이를 다시 더해줘야 한다(489~490). 로그아웃을 신청했다는 사실은 검증인의  `end_dynasty`가 default(무한대)보다 작은 값인지를 확인함으로써 알 수 있다. 모든 과정이 처리되면, 별도의 function(`delete_validator()`)을 call하여 해당 검증인을 검증인 집단으로부터 삭제한다(492). 마지막으로 이를 신고한 사람(`msg.sender`)에게 포상금(`slashing_bounty`)을 보낸다(493).\n\n>이 글은 고팍스(@gopaxkr)로부터 후원을 받아 디사이퍼가 작성한 글입니다.",
      "json_metadata": "{\"tags\":[\"ethereum\",\"casper\",\"blockchain\",\"decipher\",\"coinkorea\"],\"users\":[\"gopaxkr\"],\"image\":[\"https://steemitimages.com/DQmPfnx45kSUMRTsAgimLZncehbvwj65xYchDMhFneqHUiw/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmad7jJKaEa6Y3rhhK8qhg8gbwkcFDAMKYBnpDniQ6Eedg/image.png\",\"https://steemitimages.com/DQmUYSRxsVLxgY3hXFL4wLY3htGNzk6etvcATPLqSQonegP/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmQRbkGs3182wt6N2ARrmEGjdxGpQcs1NfYz9DbdnwJoc4/image.png\",\"https://steemitimages.com/DQmQ5MYsngpm8tPySi4uU6ngrxYv2hruqMTJxU1Ai4Sbdvd/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmQM6Yn2QwUPYy6DBV9hzFScRE1RggsGY4p57wUcCuMfHj/image.png\",\"https://steemitimages.com/DQmW9s2AaPF3U64BVm4GrMH9SpHCaCRtpt1SLNQTufvvX3A/image.png\",\"https://steemitimages.com/0x0/https://steemitimages.com/DQmeVb1Sj4Yd4Maxd8GFgV7Zc7HtH7hZ45trhT3SbkxWb4M/image.png\"],\"links\":[\"https://steemit.com/@moongunflag\",\"https://medium.com/decipher-media\",\"https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1\",\"https://steemit.com/casper/@decipher-media/1-1-casper-overview\",\"https://github.com/ethereum/casper/blob/master/casper/contracts/simple_casper.v.py\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://ethresear.ch/t/casper-ffg-with-one-message-type-and-simpler-fork-choice-rule/\",\"https://ethresear.ch/c/casper\",\"https://github.com/ethereum/research/blob/master/papers/casper-economics/casper_economics_basic.pdf\",\"https://github.com/ethereum/casper/blob/master/IMPLEMENTATION.md#validator-workflow-overview\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/07 08:25:00
voteralphabot
authordecipher-media
permlink1-1-casper-overview
weight100 (1.00%)
Transaction InfoBlock #23962000/Trx e11a59d176b5de8ce971f9f73cd618c1ae45e5e9
View Raw JSON Data
{
  "trx_id": "e11a59d176b5de8ce971f9f73cd618c1ae45e5e9",
  "block": 23962000,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:25:00",
  "op": [
    "vote",
    {
      "voter": "alphabot",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "weight": 100
    }
  ]
}
decipher-mediapublished a new post: 1-1-casper-overview
2018/07/07 08:24:48
parent author
parent permlinkcasper
authordecipher-media
permlink1-1-casper-overview
title블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview
body# 블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview _Jong-Ho Kim(Jason Kim) Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)_ #### *Note: 이 글은 서울대학교 블록체인 학회 디사이퍼에서 작성한 [미디엄 아티클](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458)을 옮긴 글입니다. 이 글에서 설명하는 모든 내용은 2018년 4월 17일을 기준으로 합니다. <br> >서울대학교 블록체인 학회인 ‘디사이퍼(Decipher)’에서 블록체인의 스케일링 솔루션에 관한 글들을 시리즈로 연재합니다. 시리즈의 첫 번째 주인공은 **Ethereum의 “Casper the Freindly Finality Gadget”**입니다. [1–1. Casper FFG Overview](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458), [1–2. Casper FFG — Q&A 및 Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)로 나누어 설명합니다. 첫번째 주제로 이더리움이 PoW(Proof of Work) 합의 알고리즘에서 PoS(Proof of Stake) 로 전환하기 위해 고민되고 있는 Casper 에 대해서 알아보고자 한다. Casper는 이더리움 창시자인 비탈릭 부테린(Vitalik Buterin)이 제시하는 “Casper the Friendly Finality Gadget”(FFG)와 이더리움 재단 연구원인 블라드 잠퍼(Vlad Zamfir)가 제시하는 “Casper the Friendly GHOST: Correct-by-Construction”(CBC)가 존재한다. FFG는 PoW와 PoS를 같이 가져가는 하이브리드 캐스퍼라고도 불린다. 이번 글에서는 비탈릭 부테린과 버질 그리피스(Virgil Griffith)가 작성한 “Casper the Friendly Finality Gadget” 논문을 중심으로 Casper FFG 에 대해 알아보도록 하자. ### **Proof of Work 의 문제는 무엇인가?** Casper 의 원리를 설명하기 전, 이더리움에서 이미 잘 동작하고 있는 PoW에서 PoS로 변경하려는 이유에 대해 알아보자. 이더리움 재단 연구원인 [칼 플로리쉬(Karl Floersch)의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00)를 보면 크게 두 가지로 정리된다. 첫번째로 PoW로 인해 소모되는 에너지를 줄일 수 있다는 것이다. PoW에서 블록을 생성하기 위해서는 특정 조건을 만족하는 해시값을 계산하는 일을 반복해야된다. 이러한 해시값 계산은 하드웨어가 전기를 소모하게 하고 이러한 전기 소모는 에너지의 낭비로 이어진다. Powercompare에 따르면 [비트코인 채굴로 인한 전기 소모는 아일랜드나 대부분의 아프리카 나라들의 전기 소모량을 넘는 수준이라고 한다](https://powercompare.co.uk/bitcoin/). Powercompare의 보고서가 2017년에 써졌는데 지금은 더 많은 국가들의 전기 소모량을 넘을 것이다. 이처럼 막대한 양의 에너지를 소모하는 시스템은 장기적으로 봤을 때 환경에 해롭기 때문에 에너지 소모량을 줄이기 위해 PoS가 필요하다고 주장한다. 두번째로는 ASIC(Application Specific Integrated Circuit)와 중앙화된 채굴 집단으로 인해서 메인 체인(블록 넘버가 가장 큰 블록을 포함한 체인)을 변경할 수 있다는 것이다. 즉, 완결성(Finality)의 부재이다. 완결성이란 이미 결정된 블록체인이 바뀌지 않는 것을 의미한다. ASIC 혹은 빠른 채굴 장비가 등장해서 기존에 가장 긴 체인 이외의 다른 가지의 블록을 빠르게 생성해나가 가장 긴 체인을 역전한다면, 메인 체인이 변경될 수 있다. 과거의 가장 긴 체인에 포함되어 있었지만, ASIC에 의해 새롭게 생긴 가장 긴 체인에는 포함되지 않은 트랜잭션이 있다면 갑자기 잔고가 변경될 수 도 있다. 이러한 문제점 때문에 PoS 도입을 통한 완결성이 필요하다. ### **캐스퍼 이전의 Proof of Stake 연구들** PoS 에서는 채굴자(Miner) 대신 검증인(Validator) 용어를 사용한다. 검증인이란 블록을 생성하기 위한 참가하는 사람을 의미한다. 이더리움 캐스퍼에서는 검증인이 되기 위해서 일정량 이상의 이더리움([2018년 3월 기준 1500ETH](https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2))을 예치해야한다. 그리고 검증인들이 모여있는 집단을 검증인 집단이라고 부르도록 하자. PoS는 캐스퍼에서 처음 등장하는 개념이 아니라 이전에도 존재하던 개념이다. 캐스퍼 이전에는 크게 두 가지의 PoS 디자인이 존재했다. 첫째로는 체인 기반의 PoS(chain-based Proof of Stake)이다. 무작위 랜덤 알고리즘이 특정 시간 간격으로 검증인 집단에서 검증인을 뽑고 블록을 만들 권한을 준다. 그리고 선정된 검증인은 블록을 생성한다. PeerCoin이나 BlackCoin이 이러한 방식의 PoS를 취한다. 두번째로는 BFT(Byzantine Fault Tolerant) 방식의 PoS가 존재한다. BFT-방식에서는 검증인 집단에서 무작위로 선출된 검증인에게 블록을 제안 할 수 있는 권리를 준다. 블록을 제안하는 것이 블록을 바로 생성하는 것은 아니다. 블록이 finalize 되려면 여러 차례의 투표 라운드 동안 ⅔ 이상의 검증인들이 특정 블록을 인정하는 투표를 해야한다. 이러한 과정을 통해서 블록이 영구적으로 체인에 포함되면 블록의 길이에 영향을 받지 않게 된다. Tendermint 가 BFT 방식의 PoS 방식을 이용한다. 이 과정도 Casper 만큼 복잡한 과정에 의해 이뤄지는데 Tendermint 의 PoS 방식에 관심이 있다면 “[Tendermint: Consensus without mining](https://tendermint.com/static/docs/tendermint.pdf)” 을 읽어보길 바란다. ### **캐스퍼 프로토콜 이란?** 하이브리드 PoW/PoS 시스템은 이더리움에 적용하는 첫번째 캐스퍼 버전이다. 검증인 집단이 변하지 않는다는 가정 하에 캐스퍼 프로토콜이 어떻게 동작하는지 알아보자. 우선 검증인이 되기 위해서는 캐스퍼 스마트 컨트랙트에 이더리움을 예치금(deposit)으로 맡겨야한다. 인센티브 로직이 스마트 컨트랙트에 있기 때문에 합의 과정을 통해 블록을 올바르게 생성했을 경우 예치금을 맡긴 검증인들에게 보상이 주어진다. 반대로 블록 합의 과정에서 잘못된 행동을 하였을 때 예치금을 몰수해서 처벌을 가한다. PoS의 안정성은 예치금의 크기와 비례한다. 규칙을 어겨 몰수되는 이더리움의 양이 클수록 규칙 위반에 따른 경제적 비용이 크기 때문이다. 캐스퍼 프로토콜에서 ⅔ 검증인은 검증인의 숫자가 아니라 검증인들이 가지고 있는 예치금의 ⅔ 임을 주의해야한다. 이제 이더리움을 예치하여 검증인이 된 사람들이 어떻게 투표를 하는지 알아보자. FFG는 PoW를 병행하기 때문에 매 블록마다 투표를 진행하지는 않는다. 대신 제네시스 블록 혹은 제네시스 블록으로부터 매 50번째 블록마다 체크포인트라 부르고 체크포인트에 대해 투표를 한다. 투표에는 4가지 정보와 서명이 포함이 된다. <center>![](https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.)</center> <center>그림 1. 투표의 구성요소 (출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center> 위의 표에 명시된것 처럼 source(검증의 근거)가 될 체크포인트와 target(검증의 대상)이 될 체크포인트, 그리고 각각의 체크포인트 블록의 높이가 투표의 항목으로 들어가고 <v, s, t, h(s), h(t)> 라고 표기한다 (v는 검증인을 의미한다). 여기서 주의할 것은 source가 target의 조상이 아니면 투표가 무효화되고 검증인이 검증인 집단에 속하지 않았어도 무효화 된다. 여기서 조상이란 source 가 target 보다 블록 높이가 낮고 같은 체인으로 연결되어져 있는 것을 의미한다. 이 투표는 검증인의 키에 의해 서명되서 제출된다. 이렇게 제출된 투표는 두 가지 규칙을 따르게 된다. <center>![](https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.)</center> <center>그림 2. 투표의 두가지 규칙 (출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center> 첫 번째는 target 체크 포인트의 높이가 같은 서로 다른 투표를 할 수 없다는 것이다. <center>![](https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.)</center> <center>그림 3. 투표의 첫번째 규칙 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084))</center> 위의 그림과 같이 체크포인트의 높이가 같은 두 개의 가지로 나뉘어 졌을 때, 검증인은 두 개의 체크포인트중 하나에만 투표할 수 있다. 블록 체인에서 높이가 같은 가지가 발생해서 경쟁하는 상황에서 투표를 해서 하나를 선택해야되는데 두 개 다 투표를 해버리면 어떤 가지를 메인 체인으로 할지 선택할 수 없기 때문이다. 두 번째 규칙은 자신이 투표한 source, target 체크 포인트 높이 안에 포함되는 다른 투표를 할 수 없다는 것이다. <center>![](https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.)</center> <center>그림 4. 투표의 두번째 규칙 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024)) </center> 위의 그림처럼 s2, t2 의 높이 안에 s1, t1 이 포함되는 투표를 할 수 없다. 첫번째 규칙이 높이가 같으면서 충돌하는 블록에 투표하는걸 막아줄 수 있지만, 높이가 다르면서 충돌하는 경우에는 막아줄 수 없다. 이 경우를 위해 두번째 규칙이 필요하다. 이에 대한 구체적인 논의는 “블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review” 에서 자세히 이야기해보겠다. ### **캐스퍼의 동작 과정** 앞에서 살펴본 투표의 형식과 규칙을 가지고 어떻게 블록이 finalize 되는지 알아보도록하자. 그전에 캐스퍼를 설명하기위해 필요한 용어들을 정리하고 넘어가도록하자. **epoch**: 검증인이 투표하는 체크포인트의 블록 간격, FFG에서는 현재는 50블록이다. **supermajority link**: 적어도 ⅔ 검증인이 source A에서 target B로 투표를 한 경우. 체크포인트 A, B의 순서쌍을 supermajority link라 하고” A->B”로 표기한다. **conflict**: 서로 다른 가지에 블록이 존재하는 경우 두 체크포인트는 충돌한다고 한다. 즉, 두 체크포인트가 서로의 부모 자식 관계가 아님을 의미한다. **justified**: 제네시스 블록이거나 justified 된 C 체크포인트에서 C->C’인 supermajority link가 존재할 때 체크 포인트 C’가 justified 되었다고 한다. **finalized**: 체크포인트 C가 justified 되었고 C의 직계 자손(direct child)인 C’에서 supermajority link C->C’가 존재할 때 체크포인트 C가 finalized 되었다고 한다. 직계 자손이라는 것은 체크 포인트의 높이 차이가 1인 경우를 의미한다. 생소한 부분이 많아서 개념만 보고서 이해하는게 쉽지 않을 수 있다. 따라서 이번에는 실제로 어떤 단계들을 거쳐서 투표가 진행되고 블록이 생성되고 체크포인트가 finalize 되는지 그림을 통해 단계적으로 살펴보고자 한다. 아래 그림에서 곡괭이를 들고 있는 사람들은 채굴자이고, 정장을 입은 사람은 검증인이다. 과정을 간단하게 보기 위해서 검증인은 총 4명이 있고 4명의 예치금은 각각 똑같아서 투표의 세기가 똑같다고 가정하자. 체크포인트는 제네시스 블록 다음의 체크포인트라고 하자. 즉 이전 체크포인트는 justified 되어있다. <center>![](https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.)</center> <center>그림 5. 캐스퍼 합의 과정 1 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075))</center> 1. 체크 포인트에 검증인들이 투표를 한다. 투표는 스마트 컨트랙트에 메서드를 호출하는 것이므로 채굴자들에 의해 트랜잭션이 채굴되어야지 블록에 포함된다. 위의 그림에서는 4명의 검증인 중에서 3명이 투표를 제출한 상태이다. <center>![](https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.)</center> <center>그림 6. 캐스퍼 합의 과정 2 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096))</center> 2. 제출된 투표는 채굴 과정을 통해서 블록에 포함된다. 왼쪽의 채굴자가 2명의 검증인이 제출한 투표를 블록에 포함시켰고 현재 체크포인트는 ½ 의 승인을 얻었다. <center>![](https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.)</center> <center>그림 7. 캐스퍼 합의 과정 3 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170))</center> 3. 다음으로 오른쪽 채굴자가 ¼ 에 해당하는 투표를 채굴함으로써 체크 포인트는 총 ¾ 의 투표를 받게되고 ⅔ 이 넘었으므로 새로운 체크포인트(target)에 대해 supermajority link 가 생기고 justified 된다. <center>![](https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.)</center> <center>그림 8. 캐스퍼 합의 과정 4 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293))</center> 4. 다시 체크 포인트가 찾아오면 검증인들은 다시 투표를 제출하게 된다. ¾의 검증인이 source 를 justified 된 체크포인트(노란색)로 하고 target 을 새롭게 생성된 체크포인트로 하는 투표를 제출 하였다. <center>![](https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.)</center> <center>그림 9. 캐스퍼 합의 과정 5 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357))</center> 5. 3명의 검증인이 제출한 투표가 채굴자에 의해 블록에 포함됬고 새롭게 생긴 체크 포인트(노란색)가 ¾의 투표를 받아서 ⅔을 넘겨서 justified 되었다. <center>![](https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.)</center> <center>그림 10. 캐스퍼 합의 과정 6(출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466))</center> 6. ⅔ 이상의 검증인이 초록색 체크 포인트를 source 로 하고 노란색 체크포인트를 target 으로 하는 투표를 했기 때문에 그림과 같이 두 체크포인트는 supermajority link 로 연결된다. 그리고 초록색 체크포인트가 justified 되어있고 직계 자손(direct child)인 체크포인트가 supermajority link로 연결되므로 초록색 체크포인트가 finalize 되었다. ### **캐스퍼의 두 가지 정리** 앞에서 설명한 과정들을 통해서 캐스퍼는 Accountable Safety와 Plausible Liveness 를 얻을 수 있다. Accountable Safety는 검증인이 규칙을 위반해 ⅓ 이상의 예치금 몰수 없이 두 개의 충돌하는 체크포인트가 finalize 될 수 없다는 것이다. Plausible Liveness는 예치금 몰수, 블록 딜레이와 같은 사건과 관계없이 ⅔의 검증인이 프로토콜을 따른다면, 어느 검증인의 예치금 몰수 없이도 새로운 체크포인트를 finalize 할 수 있다는 것이다. 이 두 가지 정리가 성립하는지 알아보기 전에 프로토콜 규칙에 의해 도출되는 속성을 살펴보자. 두 개의 캐스퍼 프로토콜을 이용해서 ⅔ 이상의 검증인이 몰수 조건을 위반하지 않는다면 네 가지 속성을 따른다고 할 수 있다. 1. s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(t1) 과 h(t2) 는 다르다. 2. s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(s1) < h(s2) < h(t2) < h(t1) 을 만족하는 s1, t1, s2, t2 가 존재할 수 없다. 3. h(t) = n 인 s->t supermajority link 는 많아야 1개 존재한다. 4. 높이가 n 인 justified 체크포인트는 많아야 1개 존재한다. 캐스퍼 프로토콜과 이로 인해 나타난 네 가지 속성을 통해서 앞에서 설명한 Accountable Safety 와 Plausible Liveness 를 증명할 수 있다. Accountable Safety 는 충돌하는 체크포인트 A, B 가 있다고 가정한 뒤 귀류법을 통해서 증명할 수 있고, Plausible Liveness 역시 위의 네 가지 속성들을 이용해서 손쉽게 증명할 수 있다. 자세한 증명과정은 [문영훈님의 슬라이드](https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos)를 참고하기 바란다. 이 두 가지 정리가 중요한 이유는 캐스퍼 프로토콜에 따라 증명되는 정리들이 성립하지 않으려면 ⅓ 이상의 예치금이 몰수당해야 된다는 것이다. ⅓ 이라는 수치는 supermajority link 가 생성되기 위해서는 ⅔ 검증인의 동의가 필요하기 때문에 구해지는 수치이다. 충돌하는 체크포인트 A, B가 존재하고 예치금이 같은 3명의 검증인 가, 나, 다가 있다고 가정하자. “가”는 A에 투표하고, “나”는 B에 투표한 상황에서 “다”가 A, B 모두에게 투표하는 경우. A, B 모두 ⅔ 검증인이 투표를 하여서 supermajority link 가 생성되고 justify된다. 그리고 추후 투표를 통해서 finalize 될 수 있다. 하지만 “다”는 첫번째 투표 규칙에 위반하였기 때문에 예치금을 몰수 당하게 된다. 3명중에 1명이 예치금 몰수를 당하게 되므로 ⅓ 이상의 예치금 몰 수 없이 두개의 충돌하는 체크포인트가 finalize 될 수 없게 되는 것이다. 즉 누군가 규칙을 벗어난 블록을 생성해서 포크를 일으키려면 경제적인 처벌을 받게 된다는 것이다. 검증인들은 이러한 경제적인 처벌을 감당하면서 까지 포크를 발생시킬 유인이 거의 존재하지 않을 것이므로 캐스퍼 프로토콜에서 정의된 규칙대로 움직일 확률이 높을 것이다. ### **동적인 검증인 집단** 지금까지는 검증인 집단이 고정되어 있다는 가정하에 간단한 캐스퍼 프로토콜을 살펴보았다. 하지만 실제로 캐스퍼가 동작할 때는 고정된 검증인 집단이 아니라 수시로 변하는 검증인 집단을 가지고 동작한다. 검증인이 되기 위해 스마트 컨트랙트에 이더리움을 예치했는데 필요에 의해서 혹은 검증인을 그만 두고자 이더리움을 출금할 수도 있고, 새롭게 검증인이 되기 위해서 이더리움을 예치할 수 있기 때문이다. 검증인 집단의 변경에 대한 제약이 없을 경우, 한쪽 가지에 대해 투표한 검증인 집단이 모두 나가고 새로운 검증인 집단이 와서 반대쪽 가지에 투표한다면 규칙에 위배되지 않으므로 검증인 중 그 누구도 예치금이 몰수되지 않는다. 이러한 문제점을 해결하기위해서 입금/출금 이후 바로 검증인 집단에 참여/제외되는 것이 아니라 일정시간 뒤에 검증인 집단에 참여/제외 되게 해야한다. 이러한 문제를 해결하는 방법을 설명하기 전에 동적인 검증인 집단에서 추가되는 개념인 dynasty에 대해 알아보자. 블록 B의 dynasty 는 루트부터 블록 B의 바로 이전 블록까지 finalize 된 체크포인트의 수 이다. 그리고 검증인이 dynasty d 인 블록에 예치금을 입금하면 검증인은 dynasty 가 d + 2 일 때 부터 검증인 집단에 속하게 된다. 다시말하자면 이더리움을 예치하고 두번의 finalize가 일어나면 검증인 집단에 속하게 된다. d + 2 를 start dynasty 라고 부른다. 마찬가지로 검증인 집단에서 떠날 때도 dynasty 의 개념을 이용해야 한다. 검증인이 dynasty 가 d 인 블록에서 출금을 할 경우 dynasty 가 d + 2 일 때 검증인 집단을 떠나게 된다. 그리고 이는 end dynasty 라고 부른다. <center>![](https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.)</center> <center>그림 11. 동적인 검증인 공격 (출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center> 동적인 검증인 집단의 문제를 좀 더 구체적으로 살펴보자. 위의 그림과 같이 체크포인트 S 에서 보라색 검증인 집단이 있었다고 하자. 그리고 충돌하는 체인이 발생했다고 하자. 이해를 돕기위해 첨언하자면 위의 그림에서 블록간의 점선으로 이어진 부분에도 수많은 블록이 존재한다. 체크포인트 S 를 finalize 하는 투표가 오른쪽 체인에서는 포함되고 왼쪽 체인에서는 포함이 되지 않았다고 하자. 이럴 경우 오른쪽 체인은 finalize 된 체크포인트가 하나 더 늘어서 dynasty 가 변경되고 검증인 집단이 변경된다. 하지만 왼쪽 집단은 dynasty가 그대로여서 검증인 집단이 바뀌지 않게된다. 이런 상황에서 블록이 계속 생성되고 추가적인 투표가 진행되어서 높이가 같은 체크포인트 C와 C’ 이 finalize 된다면 첫번째 투표 규칙에 위반되지만 검증자 집단이 다르기 때문에 아무도 예치금을 몰수 당하지 않는다. 이럴 경우 이전에 설명한 Accountable Safety를 만족하지 못하게 된다. 따라서 우리는 기존에 고정된 검증자 집단에 대한 정의들을 약간 수정할 필요가 있다. 따라서 새로 들어온 검증자 집단과 이전에 들어온 검증자 집단을 구분하여서 각각의 집단에서 ⅔ 이상의 투표를 받아야지 supermajority link 가 생기도록 정의를 변경하였다. 고정된 검증자 집단이 아닌 동적인 검증자 집단일 경우에 Accountable Safety 와 Plausible Liveness 를 증명하는 것은 캐스퍼 페이퍼에서 아직 미래 과제로 남겨두고 있다. 이처럼 아직도 캐스퍼는 완결된 메커니즘이 아닌 진화중인 메커니즘으로 문제점들이 충분히 존재할 수 있다. 하지만 PoW에서 PoS로 전환하는 첫 프로젝트로 큰 의의를 가지고 있다. 이것으로 Casper FFG 에 대해 알아보았고 다음 글에서는 FFG 를 조사하며 궁금했던 점을 Q&A 형식으로 풀어써본다. 그리고 앞서 설명한 캐스퍼 프로토콜이 코드에서는 어떻게 구현되었는지 살펴보려고 한다. >이 글은 고팍스(@gopaxkr)로부터 후원을 받아 디사이퍼가 작성한 글입니다. [다음글) 블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)
json metadata{"tags":["coinkorea","casper","decipher","scalability","kr"],"users":["decipher-media","gopaxkr"],"image":["https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.","https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.","https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.","https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.","https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.","https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.","https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.","https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.","https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.","https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.","https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J."],"links":["https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458","https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00","https://powercompare.co.uk/bitcoin/","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2","https://tendermint.com/static/docs/tendermint.pdf","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466","https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23961996/Trx 0804a3b85f8b7fd8fb7a829177f16aa187fac913
View Raw JSON Data
{
  "trx_id": "0804a3b85f8b7fd8fb7a829177f16aa187fac913",
  "block": 23961996,
  "trx_in_block": 22,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:24:48",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "casper",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "title": "블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview",
      "body": "# 블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview\n\n_Jong-Ho Kim(Jason Kim)\nSeoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)_\n\n#### *Note: 이 글은 서울대학교 블록체인 학회 디사이퍼에서 작성한 [미디엄 아티클](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458)을 옮긴 글입니다. 이 글에서 설명하는 모든 내용은 2018년 4월 17일을 기준으로 합니다. \n<br>\n\n>서울대학교 블록체인 학회인 ‘디사이퍼(Decipher)’에서 블록체인의 스케일링 솔루션에 관한 글들을 시리즈로 연재합니다. 시리즈의 첫 번째 주인공은  **Ethereum의 “Casper the Freindly Finality Gadget”**입니다.  [1–1. Casper FFG Overview](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458),  [1–2. Casper FFG — Q&A 및 Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)로 나누어 설명합니다.\n\n첫번째 주제로 이더리움이 PoW(Proof of Work) 합의 알고리즘에서 PoS(Proof of Stake) 로 전환하기 위해 고민되고 있는 Casper 에 대해서 알아보고자 한다. Casper는 이더리움 창시자인 비탈릭 부테린(Vitalik Buterin)이 제시하는 “Casper the Friendly Finality Gadget”(FFG)와 이더리움 재단 연구원인 블라드 잠퍼(Vlad Zamfir)가 제시하는 “Casper the Friendly GHOST: Correct-by-Construction”(CBC)가 존재한다. FFG는 PoW와 PoS를 같이 가져가는 하이브리드 캐스퍼라고도 불린다. 이번 글에서는 비탈릭 부테린과 버질 그리피스(Virgil Griffith)가 작성한 “Casper the Friendly Finality Gadget” 논문을 중심으로 Casper FFG 에 대해 알아보도록 하자.\n\n### **Proof of Work 의 문제는 무엇인가?**\n\nCasper 의 원리를 설명하기 전, 이더리움에서 이미 잘 동작하고 있는 PoW에서 PoS로 변경하려는 이유에 대해 알아보자. 이더리움 재단 연구원인  [칼 플로리쉬(Karl Floersch)의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00)를 보면 크게 두 가지로 정리된다. 첫번째로 PoW로 인해 소모되는 에너지를 줄일 수 있다는 것이다. PoW에서 블록을 생성하기 위해서는 특정 조건을 만족하는 해시값을 계산하는 일을 반복해야된다. 이러한 해시값 계산은 하드웨어가 전기를 소모하게 하고 이러한 전기 소모는 에너지의 낭비로 이어진다. Powercompare에 따르면  [비트코인 채굴로 인한 전기 소모는 아일랜드나 대부분의 아프리카 나라들의 전기 소모량을 넘는 수준이라고 한다](https://powercompare.co.uk/bitcoin/). Powercompare의 보고서가 2017년에 써졌는데 지금은 더 많은 국가들의 전기 소모량을 넘을 것이다. 이처럼 막대한 양의 에너지를 소모하는 시스템은 장기적으로 봤을 때 환경에 해롭기 때문에 에너지 소모량을 줄이기 위해 PoS가 필요하다고 주장한다. 두번째로는 ASIC(Application Specific Integrated Circuit)와 중앙화된 채굴 집단으로 인해서 메인 체인(블록 넘버가 가장 큰 블록을 포함한 체인)을 변경할 수 있다는 것이다. 즉, 완결성(Finality)의 부재이다. 완결성이란 이미 결정된 블록체인이 바뀌지 않는 것을 의미한다. ASIC 혹은 빠른 채굴 장비가 등장해서 기존에 가장 긴 체인 이외의 다른 가지의 블록을 빠르게 생성해나가 가장 긴 체인을 역전한다면, 메인 체인이 변경될 수 있다. 과거의 가장 긴 체인에 포함되어 있었지만, ASIC에 의해 새롭게 생긴 가장 긴 체인에는 포함되지 않은 트랜잭션이 있다면 갑자기 잔고가 변경될 수 도 있다. 이러한 문제점 때문에 PoS 도입을 통한 완결성이 필요하다.\n\n### **캐스퍼 이전의 Proof of Stake 연구들**\n\nPoS 에서는 채굴자(Miner) 대신 검증인(Validator) 용어를 사용한다. 검증인이란 블록을 생성하기 위한 참가하는 사람을 의미한다. 이더리움 캐스퍼에서는 검증인이 되기 위해서 일정량 이상의 이더리움([2018년 3월 기준 1500ETH](https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2))을 예치해야한다. 그리고 검증인들이 모여있는 집단을 검증인 집단이라고 부르도록 하자. PoS는 캐스퍼에서 처음 등장하는 개념이 아니라 이전에도 존재하던 개념이다. 캐스퍼 이전에는 크게 두 가지의 PoS 디자인이 존재했다. 첫째로는 체인 기반의 PoS(chain-based Proof of Stake)이다. 무작위 랜덤 알고리즘이 특정 시간 간격으로 검증인 집단에서 검증인을 뽑고 블록을 만들 권한을 준다. 그리고 선정된 검증인은 블록을 생성한다. PeerCoin이나 BlackCoin이 이러한 방식의 PoS를 취한다. 두번째로는 BFT(Byzantine Fault Tolerant) 방식의 PoS가 존재한다. BFT-방식에서는 검증인 집단에서 무작위로 선출된 검증인에게 블록을 제안 할 수 있는 권리를 준다. 블록을 제안하는 것이 블록을 바로 생성하는 것은 아니다. 블록이 finalize 되려면 여러 차례의 투표 라운드 동안 ⅔ 이상의 검증인들이 특정 블록을 인정하는 투표를 해야한다. 이러한 과정을 통해서 블록이 영구적으로 체인에 포함되면 블록의 길이에 영향을 받지 않게 된다. Tendermint 가 BFT 방식의 PoS 방식을 이용한다. 이 과정도 Casper 만큼 복잡한 과정에 의해 이뤄지는데 Tendermint 의 PoS 방식에 관심이 있다면 “[Tendermint: Consensus without mining](https://tendermint.com/static/docs/tendermint.pdf)” 을 읽어보길 바란다.\n\n### **캐스퍼 프로토콜 이란?**\n\n하이브리드 PoW/PoS 시스템은 이더리움에 적용하는 첫번째 캐스퍼 버전이다. 검증인 집단이 변하지 않는다는 가정 하에 캐스퍼 프로토콜이 어떻게 동작하는지 알아보자. 우선 검증인이 되기 위해서는 캐스퍼 스마트 컨트랙트에 이더리움을 예치금(deposit)으로 맡겨야한다. 인센티브 로직이 스마트 컨트랙트에 있기 때문에 합의 과정을 통해 블록을 올바르게 생성했을 경우 예치금을 맡긴 검증인들에게 보상이 주어진다. 반대로 블록 합의 과정에서 잘못된 행동을 하였을 때 예치금을 몰수해서 처벌을 가한다. PoS의 안정성은 예치금의 크기와 비례한다. 규칙을 어겨 몰수되는 이더리움의 양이 클수록 규칙 위반에 따른 경제적 비용이 크기 때문이다.  캐스퍼 프로토콜에서 ⅔ 검증인은 검증인의 숫자가 아니라 검증인들이 가지고 있는 예치금의 ⅔ 임을 주의해야한다. 이제 이더리움을 예치하여 검증인이 된 사람들이 어떻게 투표를 하는지 알아보자.\n\nFFG는 PoW를 병행하기 때문에 매 블록마다 투표를 진행하지는 않는다. 대신 제네시스 블록 혹은 제네시스 블록으로부터 매 50번째 블록마다 체크포인트라 부르고 체크포인트에 대해 투표를 한다. 투표에는 4가지 정보와 서명이 포함이 된다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.)</center>\n\n<center>그림 1. 투표의 구성요소 (출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center>\n\n위의 표에 명시된것 처럼 source(검증의 근거)가 될 체크포인트와 target(검증의 대상)이 될 체크포인트, 그리고 각각의 체크포인트 블록의 높이가 투표의 항목으로 들어가고 <v, s, t, h(s), h(t)> 라고 표기한다 (v는 검증인을 의미한다). 여기서 주의할 것은 source가 target의 조상이 아니면 투표가 무효화되고 검증인이 검증인 집단에 속하지 않았어도 무효화 된다. 여기서 조상이란 source 가 target 보다 블록 높이가 낮고 같은 체인으로 연결되어져 있는 것을 의미한다. 이 투표는 검증인의 키에 의해 서명되서 제출된다. 이렇게 제출된 투표는 두 가지 규칙을 따르게 된다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.)</center>\n\n<center>그림 2. 투표의 두가지 규칙 (출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center>\n\n첫 번째는 target 체크 포인트의 높이가 같은 서로 다른 투표를 할 수 없다는 것이다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.)</center>\n\n<center>그림 3. 투표의 첫번째 규칙 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084))</center>\n\n위의 그림과 같이 체크포인트의 높이가 같은 두 개의 가지로 나뉘어 졌을 때, 검증인은 두 개의 체크포인트중 하나에만 투표할 수 있다. 블록 체인에서 높이가 같은 가지가 발생해서 경쟁하는 상황에서 투표를 해서 하나를 선택해야되는데 두 개 다 투표를 해버리면 어떤 가지를 메인 체인으로 할지 선택할 수 없기 때문이다.\n\n두 번째 규칙은 자신이 투표한 source, target 체크 포인트 높이 안에 포함되는 다른 투표를 할 수 없다는 것이다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.)</center>\n\n<center>그림 4. 투표의 두번째 규칙 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024)) </center>\n\n위의 그림처럼 s2, t2 의 높이 안에 s1, t1 이 포함되는 투표를 할 수 없다. 첫번째 규칙이 높이가 같으면서 충돌하는 블록에 투표하는걸 막아줄 수 있지만, 높이가 다르면서 충돌하는 경우에는 막아줄 수 없다. 이 경우를 위해 두번째 규칙이 필요하다. 이에 대한 구체적인 논의는 “블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review” 에서 자세히 이야기해보겠다.\n\n\n### **캐스퍼의 동작 과정**\n\n앞에서 살펴본 투표의 형식과 규칙을 가지고 어떻게 블록이 finalize 되는지 알아보도록하자. 그전에 캐스퍼를 설명하기위해 필요한 용어들을 정리하고 넘어가도록하자.\n\n**epoch**: 검증인이 투표하는 체크포인트의 블록 간격, FFG에서는 현재는 50블록이다.\n\n**supermajority link**: 적어도 ⅔ 검증인이 source A에서 target B로 투표를 한 경우. 체크포인트 A, B의 순서쌍을 supermajority link라 하고” A->B”로 표기한다.\n\n**conflict**: 서로 다른 가지에 블록이 존재하는 경우 두 체크포인트는 충돌한다고 한다. 즉, 두 체크포인트가 서로의 부모 자식 관계가 아님을 의미한다.\n\n**justified**: 제네시스 블록이거나 justified 된 C 체크포인트에서 C->C’인 supermajority link가 존재할 때 체크 포인트 C’가 justified 되었다고 한다.\n\n**finalized**: 체크포인트 C가 justified 되었고 C의 직계 자손(direct child)인 C’에서 supermajority link C->C’가 존재할 때 체크포인트 C가 finalized 되었다고 한다. 직계 자손이라는 것은 체크 포인트의 높이 차이가 1인 경우를 의미한다.\n\n생소한 부분이 많아서 개념만 보고서 이해하는게 쉽지 않을 수 있다. 따라서 이번에는 실제로 어떤 단계들을 거쳐서 투표가 진행되고 블록이 생성되고 체크포인트가 finalize 되는지 그림을 통해 단계적으로 살펴보고자 한다. 아래 그림에서 곡괭이를 들고 있는 사람들은 채굴자이고, 정장을 입은 사람은 검증인이다. 과정을 간단하게 보기 위해서 검증인은 총 4명이 있고 4명의 예치금은 각각 똑같아서 투표의 세기가 똑같다고 가정하자. 체크포인트는 제네시스 블록 다음의 체크포인트라고 하자. 즉 이전 체크포인트는 justified 되어있다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.)</center>\n\n<center>그림 5. 캐스퍼 합의 과정 1 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075))</center>\n\n1. 체크 포인트에 검증인들이 투표를 한다. 투표는 스마트 컨트랙트에 메서드를 호출하는 것이므로 채굴자들에 의해 트랜잭션이 채굴되어야지 블록에 포함된다. 위의 그림에서는 4명의 검증인 중에서 3명이 투표를 제출한 상태이다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.)</center>\n<center>그림 6. 캐스퍼 합의 과정 2 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096))</center>\n\n2. 제출된 투표는 채굴 과정을 통해서 블록에 포함된다. 왼쪽의 채굴자가 2명의 검증인이 제출한 투표를 블록에 포함시켰고 현재 체크포인트는 ½ 의 승인을 얻었다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.)</center>\n<center>그림 7. 캐스퍼 합의 과정 3 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170))</center>\n3. 다음으로 오른쪽 채굴자가 ¼ 에 해당하는 투표를 채굴함으로써 체크 포인트는 총 ¾ 의 투표를 받게되고 ⅔ 이 넘었으므로 새로운 체크포인트(target)에 대해 supermajority link 가 생기고 justified 된다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.)</center>\n<center>그림 8. 캐스퍼 합의 과정 4 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293))</center>\n4. 다시 체크 포인트가 찾아오면 검증인들은 다시 투표를 제출하게 된다. ¾의 검증인이 source 를 justified 된 체크포인트(노란색)로 하고 target 을 새롭게 생성된 체크포인트로 하는 투표를 제출 하였다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.)</center>\n<center>그림 9. 캐스퍼 합의 과정 5 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357))</center>\n5. 3명의 검증인이 제출한 투표가 채굴자에 의해 블록에 포함됬고 새롭게 생긴 체크 포인트(노란색)가 ¾의 투표를 받아서 ⅔을 넘겨서 justified 되었다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.)</center>\n<center>그림 10. 캐스퍼 합의 과정 6(출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466))</center>\n6. ⅔ 이상의 검증인이 초록색 체크 포인트를 source 로 하고 노란색 체크포인트를 target 으로 하는 투표를 했기 때문에 그림과 같이 두 체크포인트는 supermajority link 로 연결된다. 그리고 초록색 체크포인트가 justified 되어있고 직계 자손(direct child)인 체크포인트가 supermajority link로 연결되므로 초록색 체크포인트가 finalize 되었다.\n\n### **캐스퍼의 두 가지 정리**\n\n앞에서 설명한 과정들을 통해서 캐스퍼는 Accountable Safety와 Plausible Liveness 를 얻을 수 있다. Accountable Safety는 검증인이 규칙을 위반해 ⅓ 이상의 예치금 몰수 없이 두 개의 충돌하는 체크포인트가 finalize 될 수 없다는 것이다. Plausible Liveness는 예치금 몰수, 블록 딜레이와 같은 사건과 관계없이 ⅔의 검증인이 프로토콜을 따른다면, 어느 검증인의 예치금 몰수 없이도 새로운 체크포인트를 finalize 할 수 있다는 것이다. 이 두 가지 정리가 성립하는지 알아보기 전에 프로토콜 규칙에 의해 도출되는 속성을 살펴보자.\n\n두 개의 캐스퍼 프로토콜을 이용해서 ⅔ 이상의 검증인이 몰수 조건을 위반하지 않는다면 네 가지 속성을 따른다고 할 수 있다.\n\n1.  s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(t1) 과 h(t2) 는 다르다.\n2.  s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(s1) < h(s2) < h(t2) < h(t1) 을 만족하는 s1, t1, s2, t2 가 존재할 수 없다.\n3.  h(t) = n 인 s->t supermajority link 는 많아야 1개 존재한다.\n4.  높이가 n 인 justified 체크포인트는 많아야 1개 존재한다.\n\n캐스퍼 프로토콜과 이로 인해 나타난 네 가지 속성을 통해서 앞에서 설명한 Accountable Safety 와 Plausible Liveness 를 증명할 수 있다. Accountable Safety 는 충돌하는 체크포인트 A, B 가 있다고 가정한 뒤 귀류법을 통해서 증명할 수 있고, Plausible Liveness 역시 위의 네 가지 속성들을 이용해서 손쉽게 증명할 수 있다. 자세한 증명과정은  [문영훈님의 슬라이드](https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos)를 참고하기 바란다.\n\n이 두 가지 정리가 중요한 이유는 캐스퍼 프로토콜에 따라 증명되는 정리들이 성립하지 않으려면 ⅓ 이상의 예치금이 몰수당해야 된다는 것이다. ⅓ 이라는 수치는 supermajority link 가 생성되기 위해서는 ⅔ 검증인의 동의가 필요하기 때문에 구해지는 수치이다. 충돌하는 체크포인트 A, B가 존재하고 예치금이 같은 3명의 검증인 가, 나, 다가 있다고 가정하자. “가”는 A에 투표하고, “나”는 B에 투표한 상황에서 “다”가 A, B 모두에게 투표하는 경우. A, B 모두 ⅔ 검증인이 투표를 하여서 supermajority link 가 생성되고 justify된다. 그리고 추후 투표를 통해서 finalize 될 수 있다. 하지만 “다”는 첫번째 투표 규칙에 위반하였기 때문에 예치금을 몰수 당하게 된다. 3명중에 1명이 예치금 몰수를 당하게 되므로 ⅓ 이상의 예치금 몰 수 없이 두개의 충돌하는 체크포인트가 finalize 될 수 없게 되는 것이다. 즉 누군가 규칙을 벗어난 블록을 생성해서 포크를 일으키려면 경제적인 처벌을 받게 된다는 것이다. 검증인들은 이러한 경제적인 처벌을 감당하면서 까지 포크를 발생시킬 유인이 거의 존재하지 않을 것이므로 캐스퍼 프로토콜에서 정의된 규칙대로 움직일 확률이 높을 것이다.\n\n### **동적인 검증인 집단**\n\n지금까지는 검증인 집단이 고정되어 있다는 가정하에 간단한 캐스퍼 프로토콜을 살펴보았다. 하지만 실제로 캐스퍼가 동작할 때는 고정된 검증인 집단이 아니라 수시로 변하는 검증인 집단을 가지고 동작한다. 검증인이 되기 위해 스마트 컨트랙트에 이더리움을 예치했는데 필요에 의해서 혹은 검증인을 그만 두고자 이더리움을 출금할 수도 있고, 새롭게 검증인이 되기 위해서 이더리움을 예치할 수 있기 때문이다. 검증인 집단의 변경에 대한 제약이 없을 경우, 한쪽 가지에 대해 투표한 검증인 집단이 모두 나가고 새로운 검증인 집단이 와서 반대쪽 가지에 투표한다면 규칙에 위배되지 않으므로 검증인 중 그 누구도 예치금이 몰수되지 않는다. 이러한 문제점을 해결하기위해서 입금/출금 이후 바로 검증인 집단에 참여/제외되는 것이 아니라 일정시간 뒤에 검증인 집단에 참여/제외 되게 해야한다. 이러한 문제를 해결하는 방법을 설명하기 전에 동적인 검증인 집단에서 추가되는 개념인 dynasty에 대해 알아보자. 블록 B의 dynasty 는 루트부터 블록 B의 바로 이전 블록까지 finalize 된 체크포인트의 수 이다. 그리고 검증인이 dynasty d 인 블록에 예치금을 입금하면 검증인은 dynasty 가 d + 2 일 때 부터 검증인 집단에 속하게 된다. 다시말하자면 이더리움을 예치하고 두번의 finalize가 일어나면 검증인 집단에 속하게 된다. d + 2 를 start dynasty 라고 부른다. 마찬가지로 검증인 집단에서 떠날 때도 dynasty 의 개념을 이용해야 한다. 검증인이 dynasty 가 d 인 블록에서 출금을 할 경우 dynasty 가 d + 2 일 때 검증인 집단을 떠나게 된다. 그리고 이는 end dynasty 라고 부른다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.)</center>\n\n<center>그림 11. 동적인 검증인 공격 (출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center>\n\n동적인 검증인 집단의 문제를 좀 더 구체적으로 살펴보자. 위의 그림과 같이 체크포인트 S 에서 보라색 검증인 집단이 있었다고 하자. 그리고 충돌하는 체인이 발생했다고 하자. 이해를 돕기위해 첨언하자면 위의 그림에서 블록간의 점선으로 이어진 부분에도 수많은 블록이 존재한다. 체크포인트 S 를 finalize 하는 투표가 오른쪽 체인에서는 포함되고 왼쪽 체인에서는 포함이 되지 않았다고 하자. 이럴 경우 오른쪽 체인은 finalize 된 체크포인트가 하나 더 늘어서 dynasty 가 변경되고 검증인 집단이 변경된다. 하지만 왼쪽 집단은 dynasty가 그대로여서 검증인 집단이 바뀌지 않게된다. 이런 상황에서 블록이 계속 생성되고 추가적인 투표가 진행되어서 높이가 같은 체크포인트 C와 C’ 이 finalize 된다면 첫번째 투표 규칙에 위반되지만 검증자 집단이 다르기 때문에 아무도 예치금을 몰수 당하지 않는다. 이럴 경우 이전에 설명한 Accountable Safety를 만족하지 못하게 된다. 따라서 우리는 기존에 고정된 검증자 집단에 대한 정의들을 약간 수정할 필요가 있다. 따라서 새로 들어온 검증자 집단과 이전에 들어온 검증자 집단을 구분하여서 각각의 집단에서 ⅔ 이상의 투표를 받아야지 supermajority link 가 생기도록 정의를 변경하였다. 고정된 검증자 집단이 아닌 동적인 검증자 집단일 경우에 Accountable Safety 와 Plausible Liveness 를 증명하는 것은 캐스퍼 페이퍼에서 아직 미래 과제로 남겨두고 있다. 이처럼 아직도 캐스퍼는 완결된 메커니즘이 아닌 진화중인 메커니즘으로 문제점들이 충분히 존재할 수 있다. 하지만 PoW에서 PoS로 전환하는 첫 프로젝트로 큰 의의를 가지고 있다. 이것으로 Casper FFG 에 대해 알아보았고 다음 글에서는 FFG 를 조사하며 궁금했던 점을 Q&A 형식으로 풀어써본다. 그리고 앞서 설명한 캐스퍼 프로토콜이 코드에서는 어떻게 구현되었는지 살펴보려고 한다.\n\n\n>이 글은 고팍스(@gopaxkr)로부터 후원을 받아 디사이퍼가 작성한 글입니다.\n [다음글) 블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)",
      "json_metadata": "{\"tags\":[\"coinkorea\",\"casper\",\"decipher\",\"scalability\",\"kr\"],\"users\":[\"decipher-media\",\"gopaxkr\"],\"image\":[\"https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.\",\"https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.\",\"https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.\",\"https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.\",\"https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.\",\"https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.\",\"https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.\",\"https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.\",\"https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.\",\"https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.\",\"https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.\"],\"links\":[\"https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458\",\"https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00\",\"https://powercompare.co.uk/bitcoin/\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\",\"https://tendermint.com/static/docs/tendermint.pdf\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466\",\"https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
decipher-mediapublished a new post: 1-1-casper-overview
2018/07/07 08:23:54
parent author
parent permlinkcasper
authordecipher-media
permlink1-1-casper-overview
title블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview
body# 블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview _Jong-Ho Kim(Jason Kim) Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)_ #### *Note: 이 글은 서울대학교 블록체인 학회 디사이퍼에서 작성한 [미디엄 아티클](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458)을 옮긴 글입니다. 이 글에서 설명하는 모든 내용은 2018년 4월 17일을 기준으로 합니다. <br> >서울대학교 블록체인 학회인 ‘디사이퍼(Decipher)’에서 블록체인의 스케일링 솔루션에 관한 글들을 시리즈로 연재합니다. 시리즈의 첫 번째 주인공은 **Ethereum의 “Casper the Freindly Finality Gadget”**입니다. [1–1. Casper FFG Overview](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458), [1–2. Casper FFG — Q&A 및 Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)로 나누어 설명합니다. 첫번째 주제로 이더리움이 PoW(Proof of Work) 합의 알고리즘에서 PoS(Proof of Stake) 로 전환하기 위해 고민되고 있는 Casper 에 대해서 알아보고자 한다. Casper는 이더리움 창시자인 비탈릭 부테린(Vitalik Buterin)이 제시하는 “Casper the Friendly Finality Gadget”(FFG)와 이더리움 재단 연구원인 블라드 잠퍼(Vlad Zamfir)가 제시하는 “Casper the Friendly GHOST: Correct-by-Construction”(CBC)가 존재한다. FFG는 PoW와 PoS를 같이 가져가는 하이브리드 캐스퍼라고도 불린다. 이번 글에서는 비탈릭 부테린과 버질 그리피스(Virgil Griffith)가 작성한 “Casper the Friendly Finality Gadget” 논문을 중심으로 Casper FFG 에 대해 알아보도록 하자. ### **Proof of Work 의 문제는 무엇인가?** Casper 의 원리를 설명하기 전, 이더리움에서 이미 잘 동작하고 있는 PoW에서 PoS로 변경하려는 이유에 대해 알아보자. 이더리움 재단 연구원인 [칼 플로리쉬(Karl Floersch)의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00)를 보면 크게 두 가지로 정리된다. 첫번째로 PoW로 인해 소모되는 에너지를 줄일 수 있다는 것이다. PoW에서 블록을 생성하기 위해서는 특정 조건을 만족하는 해시값을 계산하는 일을 반복해야된다. 이러한 해시값 계산은 하드웨어가 전기를 소모하게 하고 이러한 전기 소모는 에너지의 낭비로 이어진다. Powercompare에 따르면 [비트코인 채굴로 인한 전기 소모는 아일랜드나 대부분의 아프리카 나라들의 전기 소모량을 넘는 수준이라고 한다](https://powercompare.co.uk/bitcoin/). Powercompare의 보고서가 2017년에 써졌는데 지금은 더 많은 국가들의 전기 소모량을 넘을 것이다. 이처럼 막대한 양의 에너지를 소모하는 시스템은 장기적으로 봤을 때 환경에 해롭기 때문에 에너지 소모량을 줄이기 위해 PoS가 필요하다고 주장한다. 두번째로는 ASIC(Application Specific Integrated Circuit)와 중앙화된 채굴 집단으로 인해서 메인 체인(블록 넘버가 가장 큰 블록을 포함한 체인)을 변경할 수 있다는 것이다. 즉, 완결성(Finality)의 부재이다. 완결성이란 이미 결정된 블록체인이 바뀌지 않는 것을 의미한다. ASIC 혹은 빠른 채굴 장비가 등장해서 기존에 가장 긴 체인 이외의 다른 가지의 블록을 빠르게 생성해나가 가장 긴 체인을 역전한다면, 메인 체인이 변경될 수 있다. 과거의 가장 긴 체인에 포함되어 있었지만, ASIC에 의해 새롭게 생긴 가장 긴 체인에는 포함되지 않은 트랜잭션이 있다면 갑자기 잔고가 변경될 수 도 있다. 이러한 문제점 때문에 PoS 도입을 통한 완결성이 필요하다. ### **캐스퍼 이전의 Proof of Stake 연구들** PoS 에서는 채굴자(Miner) 대신 검증인(Validator) 용어를 사용한다. 검증인이란 블록을 생성하기 위한 참가하는 사람을 의미한다. 이더리움 캐스퍼에서는 검증인이 되기 위해서 일정량 이상의 이더리움([2018년 3월 기준 1500ETH](https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2))을 예치해야한다. 그리고 검증인들이 모여있는 집단을 검증인 집단이라고 부르도록 하자. PoS는 캐스퍼에서 처음 등장하는 개념이 아니라 이전에도 존재하던 개념이다. 캐스퍼 이전에는 크게 두 가지의 PoS 디자인이 존재했다. 첫째로는 체인 기반의 PoS(chain-based Proof of Stake)이다. 무작위 랜덤 알고리즘이 특정 시간 간격으로 검증인 집단에서 검증인을 뽑고 블록을 만들 권한을 준다. 그리고 선정된 검증인은 블록을 생성한다. PeerCoin이나 BlackCoin이 이러한 방식의 PoS를 취한다. 두번째로는 BFT(Byzantine Fault Tolerant) 방식의 PoS가 존재한다. BFT-방식에서는 검증인 집단에서 무작위로 선출된 검증인에게 블록을 제안 할 수 있는 권리를 준다. 블록을 제안하는 것이 블록을 바로 생성하는 것은 아니다. 블록이 finalize 되려면 여러 차례의 투표 라운드 동안 ⅔ 이상의 검증인들이 특정 블록을 인정하는 투표를 해야한다. 이러한 과정을 통해서 블록이 영구적으로 체인에 포함되면 블록의 길이에 영향을 받지 않게 된다. Tendermint 가 BFT 방식의 PoS 방식을 이용한다. 이 과정도 Casper 만큼 복잡한 과정에 의해 이뤄지는데 Tendermint 의 PoS 방식에 관심이 있다면 “[Tendermint: Consensus without mining](https://tendermint.com/static/docs/tendermint.pdf)” 을 읽어보길 바란다. ### **캐스퍼 프로토콜 이란?** 하이브리드 PoW/PoS 시스템은 이더리움에 적용하는 첫번째 캐스퍼 버전이다. 검증인 집단이 변하지 않는다는 가정 하에 캐스퍼 프로토콜이 어떻게 동작하는지 알아보자. 우선 검증인이 되기 위해서는 캐스퍼 스마트 컨트랙트에 이더리움을 예치금(deposit)으로 맡겨야한다. 인센티브 로직이 스마트 컨트랙트에 있기 때문에 합의 과정을 통해 블록을 올바르게 생성했을 경우 예치금을 맡긴 검증인들에게 보상이 주어진다. 반대로 블록 합의 과정에서 잘못된 행동을 하였을 때 예치금을 몰수해서 처벌을 가한다. PoS의 안정성은 예치금의 크기와 비례한다. 규칙을 어겨 몰수되는 이더리움의 양이 클수록 규칙 위반에 따른 경제적 비용이 크기 때문이다. 캐스퍼 프로토콜에서 ⅔ 검증인은 검증인의 숫자가 아니라 검증인들이 가지고 있는 예치금의 ⅔ 임을 주의해야한다. 이제 이더리움을 예치하여 검증인이 된 사람들이 어떻게 투표를 하는지 알아보자. FFG는 PoW를 병행하기 때문에 매 블록마다 투표를 진행하지는 않는다. 대신 제네시스 블록 혹은 제네시스 블록으로부터 매 50번째 블록마다 체크포인트라 부르고 체크포인트에 대해 투표를 한다. 투표에는 4가지 정보와 서명이 포함이 된다. <center>![](https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.)</center> <center>그림 1. 투표의 구성요소 (출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center> 위의 표에 명시된것 처럼 source(검증의 근거)가 될 체크포인트와 target(검증의 대상)이 될 체크포인트, 그리고 각각의 체크포인트 블록의 높이가 투표의 항목으로 들어가고 <v, s, t, h(s), h(t)> 라고 표기한다 (v는 검증인을 의미한다). 여기서 주의할 것은 source가 target의 조상이 아니면 투표가 무효화되고 검증인이 검증인 집단에 속하지 않았어도 무효화 된다. 여기서 조상이란 source 가 target 보다 블록 높이가 낮고 같은 체인으로 연결되어져 있는 것을 의미한다. 이 투표는 검증인의 키에 의해 서명되서 제출된다. 이렇게 제출된 투표는 두 가지 규칙을 따르게 된다. <center>![](https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.)</center> <center>그림 2. 투표의 두가지 규칙 (출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center> 첫 번째는 target 체크 포인트의 높이가 같은 서로 다른 투표를 할 수 없다는 것이다. <center>![](https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.)</center> <center>그림 3. 투표의 첫번째 규칙 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084))</center> 위의 그림과 같이 체크포인트의 높이가 같은 두 개의 가지로 나뉘어 졌을 때, 검증인은 두 개의 체크포인트중 하나에만 투표할 수 있다. 블록 체인에서 높이가 같은 가지가 발생해서 경쟁하는 상황에서 투표를 해서 하나를 선택해야되는데 두 개 다 투표를 해버리면 어떤 가지를 메인 체인으로 할지 선택할 수 없기 때문이다. 두 번째 규칙은 자신이 투표한 source, target 체크 포인트 높이 안에 포함되는 다른 투표를 할 수 없다는 것이다. <center>![](https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.)</center> <center>그림 4. 투표의 두번째 규칙 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024)) </center> 위의 그림처럼 s2, t2 의 높이 안에 s1, t1 이 포함되는 투표를 할 수 없다. 첫번째 규칙이 높이가 같으면서 충돌하는 블록에 투표하는걸 막아줄 수 있지만, 높이가 다르면서 충돌하는 경우에는 막아줄 수 없다. 이 경우를 위해 두번째 규칙이 필요하다. 이에 대한 구체적인 논의는 “블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review” 에서 자세히 이야기해보겠다. ### **캐스퍼의 동작 과정** 앞에서 살펴본 투표의 형식과 규칙을 가지고 어떻게 블록이 finalize 되는지 알아보도록하자. 그전에 캐스퍼를 설명하기위해 필요한 용어들을 정리하고 넘어가도록하자. **epoch**: 검증인이 투표하는 체크포인트의 블록 간격, FFG에서는 현재는 50블록이다. **supermajority link**: 적어도 ⅔ 검증인이 source A에서 target B로 투표를 한 경우. 체크포인트 A, B의 순서쌍을 supermajority link라 하고” A->B”로 표기한다. **conflict**: 서로 다른 가지에 블록이 존재하는 경우 두 체크포인트는 충돌한다고 한다. 즉, 두 체크포인트가 서로의 부모 자식 관계가 아님을 의미한다. **justified**: 제네시스 블록이거나 justified 된 C 체크포인트에서 C->C’인 supermajority link가 존재할 때 체크 포인트 C’가 justified 되었다고 한다. **finalized**: 체크포인트 C가 justified 되었고 C의 직계 자손(direct child)인 C’에서 supermajority link C->C’가 존재할 때 체크포인트 C가 finalized 되었다고 한다. 직계 자손이라는 것은 체크 포인트의 높이 차이가 1인 경우를 의미한다. 생소한 부분이 많아서 개념만 보고서 이해하는게 쉽지 않을 수 있다. 따라서 이번에는 실제로 어떤 단계들을 거쳐서 투표가 진행되고 블록이 생성되고 체크포인트가 finalize 되는지 그림을 통해 단계적으로 살펴보고자 한다. 아래 그림에서 곡괭이를 들고 있는 사람들은 채굴자이고, 정장을 입은 사람은 검증인이다. 과정을 간단하게 보기 위해서 검증인은 총 4명이 있고 4명의 예치금은 각각 똑같아서 투표의 세기가 똑같다고 가정하자. 체크포인트는 제네시스 블록 다음의 체크포인트라고 하자. 즉 이전 체크포인트는 justified 되어있다. <center>![](https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.)</center> <center>그림 5. 캐스퍼 합의 과정 1 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075))</center> 1. 체크 포인트에 검증인들이 투표를 한다. 투표는 스마트 컨트랙트에 메서드를 호출하는 것이므로 채굴자들에 의해 트랜잭션이 채굴되어야지 블록에 포함된다. 위의 그림에서는 4명의 검증인 중에서 3명이 투표를 제출한 상태이다. <center>![](https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.)</center> <center>그림 6. 캐스퍼 합의 과정 2 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096))</center> 2. 제출된 투표는 채굴 과정을 통해서 블록에 포함된다. 왼쪽의 채굴자가 2명의 검증인이 제출한 투표를 블록에 포함시켰고 현재 체크포인트는 ½ 의 승인을 얻었다. <center>![](https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.)</center> <center>그림 7. 캐스퍼 합의 과정 3 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170))</center> 3. 다음으로 오른쪽 채굴자가 ¼ 에 해당하는 투표를 채굴함으로써 체크 포인트는 총 ¾ 의 투표를 받게되고 ⅔ 이 넘었으므로 새로운 체크포인트(target)에 대해 supermajority link 가 생기고 justified 된다. <center>![](https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.)</center> <center>그림 8. 캐스퍼 합의 과정 4 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293))</center> 4. 다시 체크 포인트가 찾아오면 검증인들은 다시 투표를 제출하게 된다. ¾의 검증인이 source 를 justified 된 체크포인트(노란색)로 하고 target 을 새롭게 생성된 체크포인트로 하는 투표를 제출 하였다. <center>![](https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.)</center> <center>그림 9. 캐스퍼 합의 과정 5 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357))</center> 5. 3명의 검증인이 제출한 투표가 채굴자에 의해 블록에 포함됬고 새롭게 생긴 체크 포인트(노란색)가 ¾의 투표를 받아서 ⅔을 넘겨서 justified 되었다. <center>![](https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.)</center> <center>그림 10. 캐스퍼 합의 과정 6(출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466))</center> 6. ⅔ 이상의 검증인이 초록색 체크 포인트를 source 로 하고 노란색 체크포인트를 target 으로 하는 투표를 했기 때문에 그림과 같이 두 체크포인트는 supermajority link 로 연결된다. 그리고 초록색 체크포인트가 justified 되어있고 직계 자손(direct child)인 체크포인트가 supermajority link로 연결되므로 초록색 체크포인트가 finalize 되었다. ### **캐스퍼의 두 가지 정리** 앞에서 설명한 과정들을 통해서 캐스퍼는 Accountable Safety와 Plausible Liveness 를 얻을 수 있다. Accountable Safety는 검증인이 규칙을 위반해 ⅓ 이상의 예치금 몰수 없이 두 개의 충돌하는 체크포인트가 finalize 될 수 없다는 것이다. Plausible Liveness는 예치금 몰수, 블록 딜레이와 같은 사건과 관계없이 ⅔의 검증인이 프로토콜을 따른다면, 어느 검증인의 예치금 몰수 없이도 새로운 체크포인트를 finalize 할 수 있다는 것이다. 이 두 가지 정리가 성립하는지 알아보기 전에 프로토콜 규칙에 의해 도출되는 속성을 살펴보자. 두 개의 캐스퍼 프로토콜을 이용해서 ⅔ 이상의 검증인이 몰수 조건을 위반하지 않는다면 네 가지 속성을 따른다고 할 수 있다. 1. s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(t1) 과 h(t2) 는 다르다. 2. s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(s1) < h(s2) < h(t2) < h(t1) 을 만족하는 s1, t1, s2, t2 가 존재할 수 없다. 3. h(t) = n 인 s->t supermajority link 는 많아야 1개 존재한다. 4. 높이가 n 인 justified 체크포인트는 많아야 1개 존재한다. 캐스퍼 프로토콜과 이로 인해 나타난 네 가지 속성을 통해서 앞에서 설명한 Accountable Safety 와 Plausible Liveness 를 증명할 수 있다. Accountable Safety 는 충돌하는 체크포인트 A, B 가 있다고 가정한 뒤 귀류법을 통해서 증명할 수 있고, Plausible Liveness 역시 위의 네 가지 속성들을 이용해서 손쉽게 증명할 수 있다. 자세한 증명과정은 [문영훈님의 슬라이드](https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos)를 참고하기 바란다. 이 두 가지 정리가 중요한 이유는 캐스퍼 프로토콜에 따라 증명되는 정리들이 성립하지 않으려면 ⅓ 이상의 예치금이 몰수당해야 된다는 것이다. ⅓ 이라는 수치는 supermajority link 가 생성되기 위해서는 ⅔ 검증인의 동의가 필요하기 때문에 구해지는 수치이다. 충돌하는 체크포인트 A, B가 존재하고 예치금이 같은 3명의 검증인 가, 나, 다가 있다고 가정하자. “가”는 A에 투표하고, “나”는 B에 투표한 상황에서 “다”가 A, B 모두에게 투표하는 경우. A, B 모두 ⅔ 검증인이 투표를 하여서 supermajority link 가 생성되고 justify된다. 그리고 추후 투표를 통해서 finalize 될 수 있다. 하지만 “다”는 첫번째 투표 규칙에 위반하였기 때문에 예치금을 몰수 당하게 된다. 3명중에 1명이 예치금 몰수를 당하게 되므로 ⅓ 이상의 예치금 몰 수 없이 두개의 충돌하는 체크포인트가 finalize 될 수 없게 되는 것이다. 즉 누군가 규칙을 벗어난 블록을 생성해서 포크를 일으키려면 경제적인 처벌을 받게 된다는 것이다. 검증인들은 이러한 경제적인 처벌을 감당하면서 까지 포크를 발생시킬 유인이 거의 존재하지 않을 것이므로 캐스퍼 프로토콜에서 정의된 규칙대로 움직일 확률이 높을 것이다. ### **동적인 검증인 집단** 지금까지는 검증인 집단이 고정되어 있다는 가정하에 간단한 캐스퍼 프로토콜을 살펴보았다. 하지만 실제로 캐스퍼가 동작할 때는 고정된 검증인 집단이 아니라 수시로 변하는 검증인 집단을 가지고 동작한다. 검증인이 되기 위해 스마트 컨트랙트에 이더리움을 예치했는데 필요에 의해서 혹은 검증인을 그만 두고자 이더리움을 출금할 수도 있고, 새롭게 검증인이 되기 위해서 이더리움을 예치할 수 있기 때문이다. 검증인 집단의 변경에 대한 제약이 없을 경우, 한쪽 가지에 대해 투표한 검증인 집단이 모두 나가고 새로운 검증인 집단이 와서 반대쪽 가지에 투표한다면 규칙에 위배되지 않으므로 검증인 중 그 누구도 예치금이 몰수되지 않는다. 이러한 문제점을 해결하기위해서 입금/출금 이후 바로 검증인 집단에 참여/제외되는 것이 아니라 일정시간 뒤에 검증인 집단에 참여/제외 되게 해야한다. 이러한 문제를 해결하는 방법을 설명하기 전에 동적인 검증인 집단에서 추가되는 개념인 dynasty에 대해 알아보자. 블록 B의 dynasty 는 루트부터 블록 B의 바로 이전 블록까지 finalize 된 체크포인트의 수 이다. 그리고 검증인이 dynasty d 인 블록에 예치금을 입금하면 검증인은 dynasty 가 d + 2 일 때 부터 검증인 집단에 속하게 된다. 다시말하자면 이더리움을 예치하고 두번의 finalize가 일어나면 검증인 집단에 속하게 된다. d + 2 를 start dynasty 라고 부른다. 마찬가지로 검증인 집단에서 떠날 때도 dynasty 의 개념을 이용해야 한다. 검증인이 dynasty 가 d 인 블록에서 출금을 할 경우 dynasty 가 d + 2 일 때 검증인 집단을 떠나게 된다. 그리고 이는 end dynasty 라고 부른다. <center>![](https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.)</center> <center>그림 11. 동적인 검증인 공격 (출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center> 동적인 검증인 집단의 문제를 좀 더 구체적으로 살펴보자. 위의 그림과 같이 체크포인트 S 에서 보라색 검증인 집단이 있었다고 하자. 그리고 충돌하는 체인이 발생했다고 하자. 이해를 돕기위해 첨언하자면 위의 그림에서 블록간의 점선으로 이어진 부분에도 수많은 블록이 존재한다. 체크포인트 S 를 finalize 하는 투표가 오른쪽 체인에서는 포함되고 왼쪽 체인에서는 포함이 되지 않았다고 하자. 이럴 경우 오른쪽 체인은 finalize 된 체크포인트가 하나 더 늘어서 dynasty 가 변경되고 검증인 집단이 변경된다. 하지만 왼쪽 집단은 dynasty가 그대로여서 검증인 집단이 바뀌지 않게된다. 이런 상황에서 블록이 계속 생성되고 추가적인 투표가 진행되어서 높이가 같은 체크포인트 C와 C’ 이 finalize 된다면 첫번째 투표 규칙에 위반되지만 검증자 집단이 다르기 때문에 아무도 예치금을 몰수 당하지 않는다. 이럴 경우 이전에 설명한 Accountable Safety를 만족하지 못하게 된다. 따라서 우리는 기존에 고정된 검증자 집단에 대한 정의들을 약간 수정할 필요가 있다. 따라서 새로 들어온 검증자 집단과 이전에 들어온 검증자 집단을 구분하여서 각각의 집단에서 ⅔ 이상의 투표를 받아야지 supermajority link 가 생기도록 정의를 변경하였다. 고정된 검증자 집단이 아닌 동적인 검증자 집단일 경우에 Accountable Safety 와 Plausible Liveness 를 증명하는 것은 캐스퍼 페이퍼에서 아직 미래 과제로 남겨두고 있다. 이처럼 아직도 캐스퍼는 완결된 메커니즘이 아닌 진화중인 메커니즘으로 문제점들이 충분히 존재할 수 있다. 하지만 PoW에서 PoS로 전환하는 첫 프로젝트로 큰 의의를 가지고 있다. 이것으로 Casper FFG 에 대해 알아보았고 다음 글에서는 FFG 를 조사하며 궁금했던 점을 Q&A 형식으로 풀어써본다. 그리고 앞서 설명한 캐스퍼 프로토콜이 코드에서는 어떻게 구현되었는지 살펴보려고 한다. >이 글은 고팍스(@gopaxkr)로부터 후원을 받아 디사이퍼가 작성한 글입니다. [다음글) 블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)
json metadata{"tags":["coinkorea","casper","decipher","scalability","kr"],"users":["decipher-media","gopaxkr"],"image":["https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.","https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.","https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.","https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.","https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.","https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.","https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.","https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.","https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.","https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.","https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J."],"links":["https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458","https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00","https://powercompare.co.uk/bitcoin/","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2","https://tendermint.com/static/docs/tendermint.pdf","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466","https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23961978/Trx 0355c818f0a607ca3a6b0a38c0135a561df4ca2e
View Raw JSON Data
{
  "trx_id": "0355c818f0a607ca3a6b0a38c0135a561df4ca2e",
  "block": 23961978,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:23:54",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "casper",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "title": "블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview",
      "body": "# 블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview\n\n_Jong-Ho Kim(Jason Kim)\nSeoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)_\n\n#### *Note: 이 글은 서울대학교 블록체인 학회 디사이퍼에서 작성한 [미디엄 아티클](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458)을 옮긴 글입니다. 이 글에서 설명하는 모든 내용은 2018년 4월 17일을 기준으로 합니다. \n<br>\n\n>서울대학교 블록체인 학회인 ‘디사이퍼(Decipher)’에서 블록체인의 스케일링 솔루션에 관한 글들을 시리즈로 연재합니다. 시리즈의 첫 번째 주인공은  **Ethereum의 “Casper the Freindly Finality Gadget”**입니다.  [1–1. Casper FFG Overview](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458),  [1–2. Casper FFG — Q&A 및 Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)로 나누어 설명합니다.\n\n첫번째 주제로 이더리움이 PoW(Proof of Work) 합의 알고리즘에서 PoS(Proof of Stake) 로 전환하기 위해 고민되고 있는 Casper 에 대해서 알아보고자 한다. Casper는 이더리움 창시자인 비탈릭 부테린(Vitalik Buterin)이 제시하는 “Casper the Friendly Finality Gadget”(FFG)와 이더리움 재단 연구원인 블라드 잠퍼(Vlad Zamfir)가 제시하는 “Casper the Friendly GHOST: Correct-by-Construction”(CBC)가 존재한다. FFG는 PoW와 PoS를 같이 가져가는 하이브리드 캐스퍼라고도 불린다. 이번 글에서는 비탈릭 부테린과 버질 그리피스(Virgil Griffith)가 작성한 “Casper the Friendly Finality Gadget” 논문을 중심으로 Casper FFG 에 대해 알아보도록 하자.\n\n### **Proof of Work 의 문제는 무엇인가?**\n\nCasper 의 원리를 설명하기 전, 이더리움에서 이미 잘 동작하고 있는 PoW에서 PoS로 변경하려는 이유에 대해 알아보자. 이더리움 재단 연구원인  [칼 플로리쉬(Karl Floersch)의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00)를 보면 크게 두 가지로 정리된다. 첫번째로 PoW로 인해 소모되는 에너지를 줄일 수 있다는 것이다. PoW에서 블록을 생성하기 위해서는 특정 조건을 만족하는 해시값을 계산하는 일을 반복해야된다. 이러한 해시값 계산은 하드웨어가 전기를 소모하게 하고 이러한 전기 소모는 에너지의 낭비로 이어진다. Powercompare에 따르면  [비트코인 채굴로 인한 전기 소모는 아일랜드나 대부분의 아프리카 나라들의 전기 소모량을 넘는 수준이라고 한다](https://powercompare.co.uk/bitcoin/). Powercompare의 보고서가 2017년에 써졌는데 지금은 더 많은 국가들의 전기 소모량을 넘을 것이다. 이처럼 막대한 양의 에너지를 소모하는 시스템은 장기적으로 봤을 때 환경에 해롭기 때문에 에너지 소모량을 줄이기 위해 PoS가 필요하다고 주장한다. 두번째로는 ASIC(Application Specific Integrated Circuit)와 중앙화된 채굴 집단으로 인해서 메인 체인(블록 넘버가 가장 큰 블록을 포함한 체인)을 변경할 수 있다는 것이다. 즉, 완결성(Finality)의 부재이다. 완결성이란 이미 결정된 블록체인이 바뀌지 않는 것을 의미한다. ASIC 혹은 빠른 채굴 장비가 등장해서 기존에 가장 긴 체인 이외의 다른 가지의 블록을 빠르게 생성해나가 가장 긴 체인을 역전한다면, 메인 체인이 변경될 수 있다. 과거의 가장 긴 체인에 포함되어 있었지만, ASIC에 의해 새롭게 생긴 가장 긴 체인에는 포함되지 않은 트랜잭션이 있다면 갑자기 잔고가 변경될 수 도 있다. 이러한 문제점 때문에 PoS 도입을 통한 완결성이 필요하다.\n\n### **캐스퍼 이전의 Proof of Stake 연구들**\n\nPoS 에서는 채굴자(Miner) 대신 검증인(Validator) 용어를 사용한다. 검증인이란 블록을 생성하기 위한 참가하는 사람을 의미한다. 이더리움 캐스퍼에서는 검증인이 되기 위해서 일정량 이상의 이더리움([2018년 3월 기준 1500ETH](https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2))을 예치해야한다. 그리고 검증인들이 모여있는 집단을 검증인 집단이라고 부르도록 하자. PoS는 캐스퍼에서 처음 등장하는 개념이 아니라 이전에도 존재하던 개념이다. 캐스퍼 이전에는 크게 두 가지의 PoS 디자인이 존재했다. 첫째로는 체인 기반의 PoS(chain-based Proof of Stake)이다. 무작위 랜덤 알고리즘이 특정 시간 간격으로 검증인 집단에서 검증인을 뽑고 블록을 만들 권한을 준다. 그리고 선정된 검증인은 블록을 생성한다. PeerCoin이나 BlackCoin이 이러한 방식의 PoS를 취한다. 두번째로는 BFT(Byzantine Fault Tolerant) 방식의 PoS가 존재한다. BFT-방식에서는 검증인 집단에서 무작위로 선출된 검증인에게 블록을 제안 할 수 있는 권리를 준다. 블록을 제안하는 것이 블록을 바로 생성하는 것은 아니다. 블록이 finalize 되려면 여러 차례의 투표 라운드 동안 ⅔ 이상의 검증인들이 특정 블록을 인정하는 투표를 해야한다. 이러한 과정을 통해서 블록이 영구적으로 체인에 포함되면 블록의 길이에 영향을 받지 않게 된다. Tendermint 가 BFT 방식의 PoS 방식을 이용한다. 이 과정도 Casper 만큼 복잡한 과정에 의해 이뤄지는데 Tendermint 의 PoS 방식에 관심이 있다면 “[Tendermint: Consensus without mining](https://tendermint.com/static/docs/tendermint.pdf)” 을 읽어보길 바란다.\n\n### **캐스퍼 프로토콜 이란?**\n\n하이브리드 PoW/PoS 시스템은 이더리움에 적용하는 첫번째 캐스퍼 버전이다. 검증인 집단이 변하지 않는다는 가정 하에 캐스퍼 프로토콜이 어떻게 동작하는지 알아보자. 우선 검증인이 되기 위해서는 캐스퍼 스마트 컨트랙트에 이더리움을 예치금(deposit)으로 맡겨야한다. 인센티브 로직이 스마트 컨트랙트에 있기 때문에 합의 과정을 통해 블록을 올바르게 생성했을 경우 예치금을 맡긴 검증인들에게 보상이 주어진다. 반대로 블록 합의 과정에서 잘못된 행동을 하였을 때 예치금을 몰수해서 처벌을 가한다. PoS의 안정성은 예치금의 크기와 비례한다. 규칙을 어겨 몰수되는 이더리움의 양이 클수록 규칙 위반에 따른 경제적 비용이 크기 때문이다.  캐스퍼 프로토콜에서 ⅔ 검증인은 검증인의 숫자가 아니라 검증인들이 가지고 있는 예치금의 ⅔ 임을 주의해야한다. 이제 이더리움을 예치하여 검증인이 된 사람들이 어떻게 투표를 하는지 알아보자.\n\nFFG는 PoW를 병행하기 때문에 매 블록마다 투표를 진행하지는 않는다. 대신 제네시스 블록 혹은 제네시스 블록으로부터 매 50번째 블록마다 체크포인트라 부르고 체크포인트에 대해 투표를 한다. 투표에는 4가지 정보와 서명이 포함이 된다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.)</center>\n\n<center>그림 1. 투표의 구성요소 (출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center>\n\n위의 표에 명시된것 처럼 source(검증의 근거)가 될 체크포인트와 target(검증의 대상)이 될 체크포인트, 그리고 각각의 체크포인트 블록의 높이가 투표의 항목으로 들어가고 <v, s, t, h(s), h(t)> 라고 표기한다 (v는 검증인을 의미한다). 여기서 주의할 것은 source가 target의 조상이 아니면 투표가 무효화되고 검증인이 검증인 집단에 속하지 않았어도 무효화 된다. 여기서 조상이란 source 가 target 보다 블록 높이가 낮고 같은 체인으로 연결되어져 있는 것을 의미한다. 이 투표는 검증인의 키에 의해 서명되서 제출된다. 이렇게 제출된 투표는 두 가지 규칙을 따르게 된다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.)</center>\n\n<center>그림 2. 투표의 두가지 규칙 (출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center>\n\n첫 번째는 target 체크 포인트의 높이가 같은 서로 다른 투표를 할 수 없다는 것이다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.)</center>\n\n<center>그림 3. 투표의 첫번째 규칙 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084))</center>\n\n위의 그림과 같이 체크포인트의 높이가 같은 두 개의 가지로 나뉘어 졌을 때, 검증인은 두 개의 체크포인트중 하나에만 투표할 수 있다. 블록 체인에서 높이가 같은 가지가 발생해서 경쟁하는 상황에서 투표를 해서 하나를 선택해야되는데 두 개 다 투표를 해버리면 어떤 가지를 메인 체인으로 할지 선택할 수 없기 때문이다.\n\n두 번째 규칙은 자신이 투표한 source, target 체크 포인트 높이 안에 포함되는 다른 투표를 할 수 없다는 것이다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.)</center>\n\n<center>그림 4. 투표의 두번째 규칙 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024)) </center>\n\n위의 그림처럼 s2, t2 의 높이 안에 s1, t1 이 포함되는 투표를 할 수 없다. 첫번째 규칙이 높이가 같으면서 충돌하는 블록에 투표하는걸 막아줄 수 있지만, 높이가 다르면서 충돌하는 경우에는 막아줄 수 없다. 이 경우를 위해 두번째 규칙이 필요하다. 이에 대한 구체적인 논의는 “블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review” 에서 자세히 이야기해보겠다.\n\n\n### **캐스퍼의 동작 과정**\n\n앞에서 살펴본 투표의 형식과 규칙을 가지고 어떻게 블록이 finalize 되는지 알아보도록하자. 그전에 캐스퍼를 설명하기위해 필요한 용어들을 정리하고 넘어가도록하자.\n\n**epoch**: 검증인이 투표하는 체크포인트의 블록 간격, FFG에서는 현재는 50블록이다.\n\n**supermajority link**: 적어도 ⅔ 검증인이 source A에서 target B로 투표를 한 경우. 체크포인트 A, B의 순서쌍을 supermajority link라 하고” A->B”로 표기한다.\n\n**conflict**: 서로 다른 가지에 블록이 존재하는 경우 두 체크포인트는 충돌한다고 한다. 즉, 두 체크포인트가 서로의 부모 자식 관계가 아님을 의미한다.\n\n**justified**: 제네시스 블록이거나 justified 된 C 체크포인트에서 C->C’인 supermajority link가 존재할 때 체크 포인트 C’가 justified 되었다고 한다.\n\n**finalized**: 체크포인트 C가 justified 되었고 C의 직계 자손(direct child)인 C’에서 supermajority link C->C’가 존재할 때 체크포인트 C가 finalized 되었다고 한다. 직계 자손이라는 것은 체크 포인트의 높이 차이가 1인 경우를 의미한다.\n\n생소한 부분이 많아서 개념만 보고서 이해하는게 쉽지 않을 수 있다. 따라서 이번에는 실제로 어떤 단계들을 거쳐서 투표가 진행되고 블록이 생성되고 체크포인트가 finalize 되는지 그림을 통해 단계적으로 살펴보고자 한다. 아래 그림에서 곡괭이를 들고 있는 사람들은 채굴자이고, 정장을 입은 사람은 검증인이다. 과정을 간단하게 보기 위해서 검증인은 총 4명이 있고 4명의 예치금은 각각 똑같아서 투표의 세기가 똑같다고 가정하자. 체크포인트는 제네시스 블록 다음의 체크포인트라고 하자. 즉 이전 체크포인트는 justified 되어있다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.)</center>\n\n<center>그림 5. 캐스퍼 합의 과정 1 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075))</center>\n\n1. 체크 포인트에 검증인들이 투표를 한다. 투표는 스마트 컨트랙트에 메서드를 호출하는 것이므로 채굴자들에 의해 트랜잭션이 채굴되어야지 블록에 포함된다. 위의 그림에서는 4명의 검증인 중에서 3명이 투표를 제출한 상태이다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.)</center>\n<center>그림 6. 캐스퍼 합의 과정 2 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096))</center>\n\n2. 제출된 투표는 채굴 과정을 통해서 블록에 포함된다. 왼쪽의 채굴자가 2명의 검증인이 제출한 투표를 블록에 포함시켰고 현재 체크포인트는 ½ 의 승인을 얻었다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.)</center>\n<center>그림 7. 캐스퍼 합의 과정 3 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170))</center>\n3. 다음으로 오른쪽 채굴자가 ¼ 에 해당하는 투표를 채굴함으로써 체크 포인트는 총 ¾ 의 투표를 받게되고 ⅔ 이 넘었으므로 새로운 체크포인트(target)에 대해 supermajority link 가 생기고 justified 된다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.)</center>\n<center>그림 8. 캐스퍼 합의 과정 4 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293))</center>\n4. 다시 체크 포인트가 찾아오면 검증인들은 다시 투표를 제출하게 된다. ¾의 검증인이 source 를 justified 된 체크포인트(노란색)로 하고 target 을 새롭게 생성된 체크포인트로 하는 투표를 제출 하였다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.)</center>\n<center>그림 9. 캐스퍼 합의 과정 5 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357))</center>\n5. 3명의 검증인이 제출한 투표가 채굴자에 의해 블록에 포함됬고 새롭게 생긴 체크 포인트(노란색)가 ¾의 투표를 받아서 ⅔을 넘겨서 justified 되었다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.)</center>\n<center>그림 10. 캐스퍼 합의 과정 6(출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466))</center>\n6. ⅔ 이상의 검증인이 초록색 체크 포인트를 source 로 하고 노란색 체크포인트를 target 으로 하는 투표를 했기 때문에 그림과 같이 두 체크포인트는 supermajority link 로 연결된다. 그리고 초록색 체크포인트가 justified 되어있고 직계 자손(direct child)인 체크포인트가 supermajority link로 연결되므로 초록색 체크포인트가 finalize 되었다.\n\n### **캐스퍼의 두 가지 정리**\n\n앞에서 설명한 과정들을 통해서 캐스퍼는 Accountable Safety와 Plausible Liveness 를 얻을 수 있다. Accountable Safety는 검증인이 규칙을 위반해 ⅓ 이상의 예치금 몰수 없이 두 개의 충돌하는 체크포인트가 finalize 될 수 없다는 것이다. Plausible Liveness는 예치금 몰수, 블록 딜레이와 같은 사건과 관계없이 ⅔의 검증인이 프로토콜을 따른다면, 어느 검증인의 예치금 몰수 없이도 새로운 체크포인트를 finalize 할 수 있다는 것이다. 이 두 가지 정리가 성립하는지 알아보기 전에 프로토콜 규칙에 의해 도출되는 속성을 살펴보자.\n\n두 개의 캐스퍼 프로토콜을 이용해서 ⅔ 이상의 검증인이 몰수 조건을 위반하지 않는다면 네 가지 속성을 따른다고 할 수 있다.\n\n1.  s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(t1) 과 h(t2) 는 다르다.\n2.  s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(s1) < h(s2) < h(t2) < h(t1) 을 만족하는 s1, t1, s2, t2 가 존재할 수 없다.\n3.  h(t) = n 인 s->t supermajority link 는 많아야 1개 존재한다.\n4.  높이가 n 인 justified 체크포인트는 많아야 1개 존재한다.\n\n캐스퍼 프로토콜과 이로 인해 나타난 네 가지 속성을 통해서 앞에서 설명한 Accountable Safety 와 Plausible Liveness 를 증명할 수 있다. Accountable Safety 는 충돌하는 체크포인트 A, B 가 있다고 가정한 뒤 귀류법을 통해서 증명할 수 있고, Plausible Liveness 역시 위의 네 가지 속성들을 이용해서 손쉽게 증명할 수 있다. 자세한 증명과정은  [문영훈님의 슬라이드](https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos)를 참고하기 바란다.\n\n이 두 가지 정리가 중요한 이유는 캐스퍼 프로토콜에 따라 증명되는 정리들이 성립하지 않으려면 ⅓ 이상의 예치금이 몰수당해야 된다는 것이다. ⅓ 이라는 수치는 supermajority link 가 생성되기 위해서는 ⅔ 검증인의 동의가 필요하기 때문에 구해지는 수치이다. 충돌하는 체크포인트 A, B가 존재하고 예치금이 같은 3명의 검증인 가, 나, 다가 있다고 가정하자. “가”는 A에 투표하고, “나”는 B에 투표한 상황에서 “다”가 A, B 모두에게 투표하는 경우. A, B 모두 ⅔ 검증인이 투표를 하여서 supermajority link 가 생성되고 justify된다. 그리고 추후 투표를 통해서 finalize 될 수 있다. 하지만 “다”는 첫번째 투표 규칙에 위반하였기 때문에 예치금을 몰수 당하게 된다. 3명중에 1명이 예치금 몰수를 당하게 되므로 ⅓ 이상의 예치금 몰 수 없이 두개의 충돌하는 체크포인트가 finalize 될 수 없게 되는 것이다. 즉 누군가 규칙을 벗어난 블록을 생성해서 포크를 일으키려면 경제적인 처벌을 받게 된다는 것이다. 검증인들은 이러한 경제적인 처벌을 감당하면서 까지 포크를 발생시킬 유인이 거의 존재하지 않을 것이므로 캐스퍼 프로토콜에서 정의된 규칙대로 움직일 확률이 높을 것이다.\n\n### **동적인 검증인 집단**\n\n지금까지는 검증인 집단이 고정되어 있다는 가정하에 간단한 캐스퍼 프로토콜을 살펴보았다. 하지만 실제로 캐스퍼가 동작할 때는 고정된 검증인 집단이 아니라 수시로 변하는 검증인 집단을 가지고 동작한다. 검증인이 되기 위해 스마트 컨트랙트에 이더리움을 예치했는데 필요에 의해서 혹은 검증인을 그만 두고자 이더리움을 출금할 수도 있고, 새롭게 검증인이 되기 위해서 이더리움을 예치할 수 있기 때문이다. 검증인 집단의 변경에 대한 제약이 없을 경우, 한쪽 가지에 대해 투표한 검증인 집단이 모두 나가고 새로운 검증인 집단이 와서 반대쪽 가지에 투표한다면 규칙에 위배되지 않으므로 검증인 중 그 누구도 예치금이 몰수되지 않는다. 이러한 문제점을 해결하기위해서 입금/출금 이후 바로 검증인 집단에 참여/제외되는 것이 아니라 일정시간 뒤에 검증인 집단에 참여/제외 되게 해야한다. 이러한 문제를 해결하는 방법을 설명하기 전에 동적인 검증인 집단에서 추가되는 개념인 dynasty에 대해 알아보자. 블록 B의 dynasty 는 루트부터 블록 B의 바로 이전 블록까지 finalize 된 체크포인트의 수 이다. 그리고 검증인이 dynasty d 인 블록에 예치금을 입금하면 검증인은 dynasty 가 d + 2 일 때 부터 검증인 집단에 속하게 된다. 다시말하자면 이더리움을 예치하고 두번의 finalize가 일어나면 검증인 집단에 속하게 된다. d + 2 를 start dynasty 라고 부른다. 마찬가지로 검증인 집단에서 떠날 때도 dynasty 의 개념을 이용해야 한다. 검증인이 dynasty 가 d 인 블록에서 출금을 할 경우 dynasty 가 d + 2 일 때 검증인 집단을 떠나게 된다. 그리고 이는 end dynasty 라고 부른다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.)</center>\n\n<center>그림 11. 동적인 검증인 공격 (출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center>\n\n동적인 검증인 집단의 문제를 좀 더 구체적으로 살펴보자. 위의 그림과 같이 체크포인트 S 에서 보라색 검증인 집단이 있었다고 하자. 그리고 충돌하는 체인이 발생했다고 하자. 이해를 돕기위해 첨언하자면 위의 그림에서 블록간의 점선으로 이어진 부분에도 수많은 블록이 존재한다. 체크포인트 S 를 finalize 하는 투표가 오른쪽 체인에서는 포함되고 왼쪽 체인에서는 포함이 되지 않았다고 하자. 이럴 경우 오른쪽 체인은 finalize 된 체크포인트가 하나 더 늘어서 dynasty 가 변경되고 검증인 집단이 변경된다. 하지만 왼쪽 집단은 dynasty가 그대로여서 검증인 집단이 바뀌지 않게된다. 이런 상황에서 블록이 계속 생성되고 추가적인 투표가 진행되어서 높이가 같은 체크포인트 C와 C’ 이 finalize 된다면 첫번째 투표 규칙에 위반되지만 검증자 집단이 다르기 때문에 아무도 예치금을 몰수 당하지 않는다. 이럴 경우 이전에 설명한 Accountable Safety를 만족하지 못하게 된다. 따라서 우리는 기존에 고정된 검증자 집단에 대한 정의들을 약간 수정할 필요가 있다. 따라서 새로 들어온 검증자 집단과 이전에 들어온 검증자 집단을 구분하여서 각각의 집단에서 ⅔ 이상의 투표를 받아야지 supermajority link 가 생기도록 정의를 변경하였다. 고정된 검증자 집단이 아닌 동적인 검증자 집단일 경우에 Accountable Safety 와 Plausible Liveness 를 증명하는 것은 캐스퍼 페이퍼에서 아직 미래 과제로 남겨두고 있다. 이처럼 아직도 캐스퍼는 완결된 메커니즘이 아닌 진화중인 메커니즘으로 문제점들이 충분히 존재할 수 있다. 하지만 PoW에서 PoS로 전환하는 첫 프로젝트로 큰 의의를 가지고 있다. 이것으로 Casper FFG 에 대해 알아보았고 다음 글에서는 FFG 를 조사하며 궁금했던 점을 Q&A 형식으로 풀어써본다. 그리고 앞서 설명한 캐스퍼 프로토콜이 코드에서는 어떻게 구현되었는지 살펴보려고 한다.\n\n\n>이 글은 고팍스(@gopaxkr)로부터 후원을 받아 디사이퍼가 작성한 글입니다.\n [다음글) 블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)",
      "json_metadata": "{\"tags\":[\"coinkorea\",\"casper\",\"decipher\",\"scalability\",\"kr\"],\"users\":[\"decipher-media\",\"gopaxkr\"],\"image\":[\"https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.\",\"https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.\",\"https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.\",\"https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.\",\"https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.\",\"https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.\",\"https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.\",\"https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.\",\"https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.\",\"https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.\",\"https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.\"],\"links\":[\"https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458\",\"https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00\",\"https://powercompare.co.uk/bitcoin/\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\",\"https://tendermint.com/static/docs/tendermint.pdf\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466\",\"https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/07 08:22:48
parent authordecipher-media
parent permlink1-1-casper-overview
authorcheetah
permlinkcheetah-re-decipher-media1-1-casper-overview
title
bodyHi! I am a robot. I just upvoted you! I found similar content that readers might be interested in: https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458
json metadata
Transaction InfoBlock #23961956/Trx 6431c8f8aeec1a65f9ee896ca83c2f1b423c9125
View Raw JSON Data
{
  "trx_id": "6431c8f8aeec1a65f9ee896ca83c2f1b423c9125",
  "block": 23961956,
  "trx_in_block": 30,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:22:48",
  "op": [
    "comment",
    {
      "parent_author": "decipher-media",
      "parent_permlink": "1-1-casper-overview",
      "author": "cheetah",
      "permlink": "cheetah-re-decipher-media1-1-casper-overview",
      "title": "",
      "body": "Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:\nhttps://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458",
      "json_metadata": ""
    }
  ]
}
2018/07/07 08:22:36
votercheetah
authordecipher-media
permlink1-1-casper-overview
weight8 (0.08%)
Transaction InfoBlock #23961952/Trx b803a97733d2405a59781cc5deaa5a9edd4cecbc
View Raw JSON Data
{
  "trx_id": "b803a97733d2405a59781cc5deaa5a9edd4cecbc",
  "block": 23961952,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:22:36",
  "op": [
    "vote",
    {
      "voter": "cheetah",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "weight": 8
    }
  ]
}
2018/07/07 08:22:09
voterfastresteem
authordecipher-media
permlink1-1-casper-overview
weight100 (1.00%)
Transaction InfoBlock #23961943/Trx 2bfe6d4c5a76a3a49a9cdc0b15da0dcb143e30c5
View Raw JSON Data
{
  "trx_id": "2bfe6d4c5a76a3a49a9cdc0b15da0dcb143e30c5",
  "block": 23961943,
  "trx_in_block": 21,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:22:09",
  "op": [
    "vote",
    {
      "voter": "fastresteem",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "weight": 100
    }
  ]
}
decipher-mediapublished a new post: 1-1-casper-overview
2018/07/07 08:21:57
parent author
parent permlinkcasper
authordecipher-media
permlink1-1-casper-overview
title블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview
body# 블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview _Jong-Ho Kim(Jason Kim) Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)_ #### *Note: 이 글은 서울대학교 블록체인 학회 디사이퍼에서 작성한 [미디엄 아티클](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458)을 옮긴 글입니다. 이 글에서 설명하는 모든 내용은 2018년 4월 17일을 기준으로 합니다. <br> >서울대학교 블록체인 학회인 ‘디사이퍼(Decipher)’에서 블록체인의 스케일링 솔루션에 관한 글들을 시리즈로 연재합니다. 시리즈의 첫 번째 주인공은 **Ethereum의 “Casper the Freindly Finality Gadget”**입니다. [1–1. Casper FFG Overview](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458), [1–2. Casper FFG — Q&A 및 Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)로 나누어 설명합니다. 첫번째 주제로 이더리움이 PoW(Proof of Work) 합의 알고리즘에서 PoS(Proof of Stake) 로 전환하기 위해 고민되고 있는 Casper 에 대해서 알아보고자 한다. Casper는 이더리움 창시자인 비탈릭 부테린(Vitalik Buterin)이 제시하는 “Casper the Friendly Finality Gadget”(FFG)와 이더리움 재단 연구원인 블라드 잠퍼(Vlad Zamfir)가 제시하는 “Casper the Friendly GHOST: Correct-by-Construction”(CBC)가 존재한다. FFG는 PoW와 PoS를 같이 가져가는 하이브리드 캐스퍼라고도 불린다. 이번 글에서는 비탈릭 부테린과 버질 그리피스(Virgil Griffith)가 작성한 “Casper the Friendly Finality Gadget” 논문을 중심으로 Casper FFG 에 대해 알아보도록 하자. ### **Proof of Work 의 문제는 무엇인가?** Casper 의 원리를 설명하기 전, 이더리움에서 이미 잘 동작하고 있는 PoW에서 PoS로 변경하려는 이유에 대해 알아보자. 이더리움 재단 연구원인 [칼 플로리쉬(Karl Floersch)의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00)를 보면 크게 두 가지로 정리된다. 첫번째로 PoW로 인해 소모되는 에너지를 줄일 수 있다는 것이다. PoW에서 블록을 생성하기 위해서는 특정 조건을 만족하는 해시값을 계산하는 일을 반복해야된다. 이러한 해시값 계산은 하드웨어가 전기를 소모하게 하고 이러한 전기 소모는 에너지의 낭비로 이어진다. Powercompare에 따르면 [비트코인 채굴로 인한 전기 소모는 아일랜드나 대부분의 아프리카 나라들의 전기 소모량을 넘는 수준이라고 한다](https://powercompare.co.uk/bitcoin/). Powercompare의 보고서가 2017년에 써졌는데 지금은 더 많은 국가들의 전기 소모량을 넘을 것이다. 이처럼 막대한 양의 에너지를 소모하는 시스템은 장기적으로 봤을 때 환경에 해롭기 때문에 에너지 소모량을 줄이기 위해 PoS가 필요하다고 주장한다. 두번째로는 ASIC(Application Specific Integrated Circuit)와 중앙화된 채굴 집단으로 인해서 메인 체인(블록 넘버가 가장 큰 블록을 포함한 체인)을 변경할 수 있다는 것이다. 즉, 완결성(Finality)의 부재이다. 완결성이란 이미 결정된 블록체인이 바뀌지 않는 것을 의미한다. ASIC 혹은 빠른 채굴 장비가 등장해서 기존에 가장 긴 체인 이외의 다른 가지의 블록을 빠르게 생성해나가 가장 긴 체인을 역전한다면, 메인 체인이 변경될 수 있다. 과거의 가장 긴 체인에 포함되어 있었지만, ASIC에 의해 새롭게 생긴 가장 긴 체인에는 포함되지 않은 트랜잭션이 있다면 갑자기 잔고가 변경될 수 도 있다. 이러한 문제점 때문에 PoS 도입을 통한 완결성이 필요하다. ### **캐스퍼 이전의 Proof of Stake 연구들** PoS 에서는 채굴자(Miner) 대신 검증인(Validator) 용어를 사용한다. 검증인이란 블록을 생성하기 위한 참가하는 사람을 의미한다. 이더리움 캐스퍼에서는 검증인이 되기 위해서 일정량 이상의 이더리움([2018년 3월 기준 1500ETH](https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2))을 예치해야한다. 그리고 검증인들이 모여있는 집단을 검증인 집단이라고 부르도록 하자. PoS는 캐스퍼에서 처음 등장하는 개념이 아니라 이전에도 존재하던 개념이다. 캐스퍼 이전에는 크게 두 가지의 PoS 디자인이 존재했다. 첫째로는 체인 기반의 PoS(chain-based Proof of Stake)이다. 무작위 랜덤 알고리즘이 특정 시간 간격으로 검증인 집단에서 검증인을 뽑고 블록을 만들 권한을 준다. 그리고 선정된 검증인은 블록을 생성한다. PeerCoin이나 BlackCoin이 이러한 방식의 PoS를 취한다. 두번째로는 BFT(Byzantine Fault Tolerant) 방식의 PoS가 존재한다. BFT-방식에서는 검증인 집단에서 무작위로 선출된 검증인에게 블록을 제안 할 수 있는 권리를 준다. 블록을 제안하는 것이 블록을 바로 생성하는 것은 아니다. 블록이 finalize 되려면 여러 차례의 투표 라운드 동안 ⅔ 이상의 검증인들이 특정 블록을 인정하는 투표를 해야한다. 이러한 과정을 통해서 블록이 영구적으로 체인에 포함되면 블록의 길이에 영향을 받지 않게 된다. Tendermint 가 BFT 방식의 PoS 방식을 이용한다. 이 과정도 Casper 만큼 복잡한 과정에 의해 이뤄지는데 Tendermint 의 PoS 방식에 관심이 있다면 “[Tendermint: Consensus without mining](https://tendermint.com/static/docs/tendermint.pdf)” 을 읽어보길 바란다. ### **캐스퍼 프로토콜 이란?** 하이브리드 PoW/PoS 시스템은 이더리움에 적용하는 첫번째 캐스퍼 버전이다. 검증인 집단이 변하지 않는다는 가정 하에 캐스퍼 프로토콜이 어떻게 동작하는지 알아보자. 우선 검증인이 되기 위해서는 캐스퍼 스마트 컨트랙트에 이더리움을 예치금(deposit)으로 맡겨야한다. 인센티브 로직이 스마트 컨트랙트에 있기 때문에 합의 과정을 통해 블록을 올바르게 생성했을 경우 예치금을 맡긴 검증인들에게 보상이 주어진다. 반대로 블록 합의 과정에서 잘못된 행동을 하였을 때 예치금을 몰수해서 처벌을 가한다. PoS의 안정성은 예치금의 크기와 비례한다. 규칙을 어겨 몰수되는 이더리움의 양이 클수록 규칙 위반에 따른 경제적 비용이 크기 때문이다. 캐스퍼 프로토콜에서 ⅔ 검증인은 검증인의 숫자가 아니라 검증인들이 가지고 있는 예치금의 ⅔ 임을 주의해야한다. 이제 이더리움을 예치하여 검증인이 된 사람들이 어떻게 투표를 하는지 알아보자. FFG는 PoW를 병행하기 때문에 매 블록마다 투표를 진행하지는 않는다. 대신 제네시스 블록 혹은 제네시스 블록으로부터 매 50번째 블록마다 체크포인트라 부르고 체크포인트에 대해 투표를 한다. 투표에는 4가지 정보와 서명이 포함이 된다. <center>![](https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.)</center> <center>그림 1. 투표의 구성요소 (출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center> 위의 표에 명시된것 처럼 source(검증의 근거)가 될 체크포인트와 target(검증의 대상)이 될 체크포인트, 그리고 각각의 체크포인트 블록의 높이가 투표의 항목으로 들어가고 <v, s, t, h(s), h(t)> 라고 표기한다 (v는 검증인을 의미한다). 여기서 주의할 것은 source가 target의 조상이 아니면 투표가 무효화되고 검증인이 검증인 집단에 속하지 않았어도 무효화 된다. 여기서 조상이란 source 가 target 보다 블록 높이가 낮고 같은 체인으로 연결되어져 있는 것을 의미한다. 이 투표는 검증인의 키에 의해 서명되서 제출된다. 이렇게 제출된 투표는 두 가지 규칙을 따르게 된다. <center>![](https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.)</center> <center>그림 2. 투표의 두가지 규칙 (출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center> 첫 번째는 target 체크 포인트의 높이가 같은 서로 다른 투표를 할 수 없다는 것이다. <center>![](https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.)</center> <center>그림 3. 투표의 첫번째 규칙 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084))</center> 위의 그림과 같이 체크포인트의 높이가 같은 두 개의 가지로 나뉘어 졌을 때, 검증인은 두 개의 체크포인트중 하나에만 투표할 수 있다. 블록 체인에서 높이가 같은 가지가 발생해서 경쟁하는 상황에서 투표를 해서 하나를 선택해야되는데 두 개 다 투표를 해버리면 어떤 가지를 메인 체인으로 할지 선택할 수 없기 때문이다. 두 번째 규칙은 자신이 투표한 source, target 체크 포인트 높이 안에 포함되는 다른 투표를 할 수 없다는 것이다. <center>![](https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.)</center> <center>그림 4. 투표의 두번째 규칙 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024)) </center> 위의 그림처럼 s2, t2 의 높이 안에 s1, t1 이 포함되는 투표를 할 수 없다. 첫번째 규칙이 높이가 같으면서 충돌하는 블록에 투표하는걸 막아줄 수 있지만, 높이가 다르면서 충돌하는 경우에는 막아줄 수 없다. 이 경우를 위해 두번째 규칙이 필요하다. 이에 대한 구체적인 논의는 “블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review” 에서 자세히 이야기해보겠다. ### **캐스퍼의 동작 과정** 앞에서 살펴본 투표의 형식과 규칙을 가지고 어떻게 블록이 finalize 되는지 알아보도록하자. 그전에 캐스퍼를 설명하기위해 필요한 용어들을 정리하고 넘어가도록하자. **epoch**: 검증인이 투표하는 체크포인트의 블록 간격, FFG에서는 현재는 50블록이다. **supermajority link**: 적어도 ⅔ 검증인이 source A에서 target B로 투표를 한 경우. 체크포인트 A, B의 순서쌍을 supermajority link라 하고” A->B”로 표기한다. **conflict**: 서로 다른 가지에 블록이 존재하는 경우 두 체크포인트는 충돌한다고 한다. 즉, 두 체크포인트가 서로의 부모 자식 관계가 아님을 의미한다. **justified**: 제네시스 블록이거나 justified 된 C 체크포인트에서 C->C’인 supermajority link가 존재할 때 체크 포인트 C’가 justified 되었다고 한다. **finalized**: 체크포인트 C가 justified 되었고 C의 직계 자손(direct child)인 C’에서 supermajority link C->C’가 존재할 때 체크포인트 C가 finalized 되었다고 한다. 직계 자손이라는 것은 체크 포인트의 높이 차이가 1인 경우를 의미한다. 생소한 부분이 많아서 개념만 보고서 이해하는게 쉽지 않을 수 있다. 따라서 이번에는 실제로 어떤 단계들을 거쳐서 투표가 진행되고 블록이 생성되고 체크포인트가 finalize 되는지 그림을 통해 단계적으로 살펴보고자 한다. 아래 그림에서 곡괭이를 들고 있는 사람들은 채굴자이고, 정장을 입은 사람은 검증인이다. 과정을 간단하게 보기 위해서 검증인은 총 4명이 있고 4명의 예치금은 각각 똑같아서 투표의 세기가 똑같다고 가정하자. 체크포인트는 제네시스 블록 다음의 체크포인트라고 하자. 즉 이전 체크포인트는 justified 되어있다. <center>![](https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.)</center> <center>그림 5. 캐스퍼 합의 과정 1 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075))</center> 1. 체크 포인트에 검증인들이 투표를 한다. 투표는 스마트 컨트랙트에 메서드를 호출하는 것이므로 채굴자들에 의해 트랜잭션이 채굴되어야지 블록에 포함된다. 위의 그림에서는 4명의 검증인 중에서 3명이 투표를 제출한 상태이다. <center>![](https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.)</center> <center>그림 6. 캐스퍼 합의 과정 2 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096))</center> 2. 제출된 투표는 채굴 과정을 통해서 블록에 포함된다. 왼쪽의 채굴자가 2명의 검증인이 제출한 투표를 블록에 포함시켰고 현재 체크포인트는 ½ 의 승인을 얻었다. <center>![](https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.)</center> <center>그림 7. 캐스퍼 합의 과정 3 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170))</center> 3. 다음으로 오른쪽 채굴자가 ¼ 에 해당하는 투표를 채굴함으로써 체크 포인트는 총 ¾ 의 투표를 받게되고 ⅔ 이 넘었으므로 새로운 체크포인트(target)에 대해 supermajority link 가 생기고 justified 된다. <center>![](https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.)</center> <center>그림 8. 캐스퍼 합의 과정 4 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293))</center> 4. 다시 체크 포인트가 찾아오면 검증인들은 다시 투표를 제출하게 된다. ¾의 검증인이 source 를 justified 된 체크포인트(노란색)로 하고 target 을 새롭게 생성된 체크포인트로 하는 투표를 제출 하였다. <center>![](https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.)</center> <center>그림 9. 캐스퍼 합의 과정 5 (출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357))</center> 5. 3명의 검증인이 제출한 투표가 채굴자에 의해 블록에 포함됬고 새롭게 생긴 체크 포인트(노란색)가 ¾의 투표를 받아서 ⅔을 넘겨서 justified 되었다. <center>![](https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.)</center> <center>그림 10. 캐스퍼 합의 과정 6(출처: [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466))</center> 6. ⅔ 이상의 검증인이 초록색 체크 포인트를 source 로 하고 노란색 체크포인트를 target 으로 하는 투표를 했기 때문에 그림과 같이 두 체크포인트는 supermajority link 로 연결된다. 그리고 초록색 체크포인트가 justified 되어있고 직계 자손(direct child)인 체크포인트가 supermajority link로 연결되므로 초록색 체크포인트가 finalize 되었다. ### **캐스퍼의 두 가지 정리** 앞에서 설명한 과정들을 통해서 캐스퍼는 Accountable Safety와 Plausible Liveness 를 얻을 수 있다. Accountable Safety는 검증인이 규칙을 위반해 ⅓ 이상의 예치금 몰수 없이 두 개의 충돌하는 체크포인트가 finalize 될 수 없다는 것이다. Plausible Liveness는 예치금 몰수, 블록 딜레이와 같은 사건과 관계없이 ⅔의 검증인이 프로토콜을 따른다면, 어느 검증인의 예치금 몰수 없이도 새로운 체크포인트를 finalize 할 수 있다는 것이다. 이 두 가지 정리가 성립하는지 알아보기 전에 프로토콜 규칙에 의해 도출되는 속성을 살펴보자. 두 개의 캐스퍼 프로토콜을 이용해서 ⅔ 이상의 검증인이 몰수 조건을 위반하지 않는다면 네 가지 속성을 따른다고 할 수 있다. 1. s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(t1) 과 h(t2) 는 다르다. 2. s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(s1) < h(s2) < h(t2) < h(t1) 을 만족하는 s1, t1, s2, t2 가 존재할 수 없다. 3. h(t) = n 인 s->t supermajority link 는 많아야 1개 존재한다. 4. 높이가 n 인 justified 체크포인트는 많아야 1개 존재한다. 캐스퍼 프로토콜과 이로 인해 나타난 네 가지 속성을 통해서 앞에서 설명한 Accountable Safety 와 Plausible Liveness 를 증명할 수 있다. Accountable Safety 는 충돌하는 체크포인트 A, B 가 있다고 가정한 뒤 귀류법을 통해서 증명할 수 있고, Plausible Liveness 역시 위의 네 가지 속성들을 이용해서 손쉽게 증명할 수 있다. 자세한 증명과정은 [문영훈님의 슬라이드](https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos)를 참고하기 바란다. 이 두 가지 정리가 중요한 이유는 캐스퍼 프로토콜에 따라 증명되는 정리들이 성립하지 않으려면 ⅓ 이상의 예치금이 몰수당해야 된다는 것이다. ⅓ 이라는 수치는 supermajority link 가 생성되기 위해서는 ⅔ 검증인의 동의가 필요하기 때문에 구해지는 수치이다. 충돌하는 체크포인트 A, B가 존재하고 예치금이 같은 3명의 검증인 가, 나, 다가 있다고 가정하자. “가”는 A에 투표하고, “나”는 B에 투표한 상황에서 “다”가 A, B 모두에게 투표하는 경우. A, B 모두 ⅔ 검증인이 투표를 하여서 supermajority link 가 생성되고 justify된다. 그리고 추후 투표를 통해서 finalize 될 수 있다. 하지만 “다”는 첫번째 투표 규칙에 위반하였기 때문에 예치금을 몰수 당하게 된다. 3명중에 1명이 예치금 몰수를 당하게 되므로 ⅓ 이상의 예치금 몰 수 없이 두개의 충돌하는 체크포인트가 finalize 될 수 없게 되는 것이다. 즉 누군가 규칙을 벗어난 블록을 생성해서 포크를 일으키려면 경제적인 처벌을 받게 된다는 것이다. 검증인들은 이러한 경제적인 처벌을 감당하면서 까지 포크를 발생시킬 유인이 거의 존재하지 않을 것이므로 캐스퍼 프로토콜에서 정의된 규칙대로 움직일 확률이 높을 것이다. ### **동적인 검증인 집단** 지금까지는 검증인 집단이 고정되어 있다는 가정하에 간단한 캐스퍼 프로토콜을 살펴보았다. 하지만 실제로 캐스퍼가 동작할 때는 고정된 검증인 집단이 아니라 수시로 변하는 검증인 집단을 가지고 동작한다. 검증인이 되기 위해 스마트 컨트랙트에 이더리움을 예치했는데 필요에 의해서 혹은 검증인을 그만 두고자 이더리움을 출금할 수도 있고, 새롭게 검증인이 되기 위해서 이더리움을 예치할 수 있기 때문이다. 검증인 집단의 변경에 대한 제약이 없을 경우, 한쪽 가지에 대해 투표한 검증인 집단이 모두 나가고 새로운 검증인 집단이 와서 반대쪽 가지에 투표한다면 규칙에 위배되지 않으므로 검증인 중 그 누구도 예치금이 몰수되지 않는다. 이러한 문제점을 해결하기위해서 입금/출금 이후 바로 검증인 집단에 참여/제외되는 것이 아니라 일정시간 뒤에 검증인 집단에 참여/제외 되게 해야한다. 이러한 문제를 해결하는 방법을 설명하기 전에 동적인 검증인 집단에서 추가되는 개념인 dynasty에 대해 알아보자. 블록 B의 dynasty 는 루트부터 블록 B의 바로 이전 블록까지 finalize 된 체크포인트의 수 이다. 그리고 검증인이 dynasty d 인 블록에 예치금을 입금하면 검증인은 dynasty 가 d + 2 일 때 부터 검증인 집단에 속하게 된다. 다시말하자면 이더리움을 예치하고 두번의 finalize가 일어나면 검증인 집단에 속하게 된다. d + 2 를 start dynasty 라고 부른다. 마찬가지로 검증인 집단에서 떠날 때도 dynasty 의 개념을 이용해야 한다. 검증인이 dynasty 가 d 인 블록에서 출금을 할 경우 dynasty 가 d + 2 일 때 검증인 집단을 떠나게 된다. 그리고 이는 end dynasty 라고 부른다. <center>![](https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.)</center> <center>그림 11. 동적인 검증인 공격 (출처: [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center> 동적인 검증인 집단의 문제를 좀 더 구체적으로 살펴보자. 위의 그림과 같이 체크포인트 S 에서 보라색 검증인 집단이 있었다고 하자. 그리고 충돌하는 체인이 발생했다고 하자. 이해를 돕기위해 첨언하자면 위의 그림에서 블록간의 점선으로 이어진 부분에도 수많은 블록이 존재한다. 체크포인트 S 를 finalize 하는 투표가 오른쪽 체인에서는 포함되고 왼쪽 체인에서는 포함이 되지 않았다고 하자. 이럴 경우 오른쪽 체인은 finalize 된 체크포인트가 하나 더 늘어서 dynasty 가 변경되고 검증인 집단이 변경된다. 하지만 왼쪽 집단은 dynasty가 그대로여서 검증인 집단이 바뀌지 않게된다. 이런 상황에서 블록이 계속 생성되고 추가적인 투표가 진행되어서 높이가 같은 체크포인트 C와 C’ 이 finalize 된다면 첫번째 투표 규칙에 위반되지만 검증자 집단이 다르기 때문에 아무도 예치금을 몰수 당하지 않는다. 이럴 경우 이전에 설명한 Accountable Safety를 만족하지 못하게 된다. 따라서 우리는 기존에 고정된 검증자 집단에 대한 정의들을 약간 수정할 필요가 있다. 따라서 새로 들어온 검증자 집단과 이전에 들어온 검증자 집단을 구분하여서 각각의 집단에서 ⅔ 이상의 투표를 받아야지 supermajority link 가 생기도록 정의를 변경하였다. 고정된 검증자 집단이 아닌 동적인 검증자 집단일 경우에 Accountable Safety 와 Plausible Liveness 를 증명하는 것은 캐스퍼 페이퍼에서 아직 미래 과제로 남겨두고 있다. 이처럼 아직도 캐스퍼는 완결된 메커니즘이 아닌 진화중인 메커니즘으로 문제점들이 충분히 존재할 수 있다. 하지만 PoW에서 PoS로 전환하는 첫 프로젝트로 큰 의의를 가지고 있다. 이것으로 Casper FFG 에 대해 알아보았고 다음 글에서는 FFG 를 조사하며 궁금했던 점을 Q&A 형식으로 풀어써본다. 그리고 앞서 설명한 캐스퍼 프로토콜이 코드에서는 어떻게 구현되었는지 살펴보려고 한다. >이 글은 고팍스(@gopaxkr)로부터 후원을 받아 디사이퍼가 작성한 글입니다. [다음글) 블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)
json metadata{"tags":["casper","decipher","scalability","coinkorea","kr"],"users":["decipher-media","gopaxkr"],"image":["https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.","https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.","https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.","https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.","https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.","https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.","https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.","https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.","https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.","https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.","https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J."],"links":["https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458","https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00","https://powercompare.co.uk/bitcoin/","https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2","https://tendermint.com/static/docs/tendermint.pdf","https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357","https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466","https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23961939/Trx 9df2aed93c5f7046d015360e928b67e7bc8d0d8f
View Raw JSON Data
{
  "trx_id": "9df2aed93c5f7046d015360e928b67e7bc8d0d8f",
  "block": 23961939,
  "trx_in_block": 91,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T08:21:57",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "casper",
      "author": "decipher-media",
      "permlink": "1-1-casper-overview",
      "title": "블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview",
      "body": "# 블록체인 확장성 솔루션 시리즈 1–1 :: Casper Overview\n\n_Jong-Ho Kim(Jason Kim)\nSeoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)_\n\n#### *Note: 이 글은 서울대학교 블록체인 학회 디사이퍼에서 작성한 [미디엄 아티클](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458)을 옮긴 글입니다. 이 글에서 설명하는 모든 내용은 2018년 4월 17일을 기준으로 합니다. \n<br>\n\n>서울대학교 블록체인 학회인 ‘디사이퍼(Decipher)’에서 블록체인의 스케일링 솔루션에 관한 글들을 시리즈로 연재합니다. 시리즈의 첫 번째 주인공은  **Ethereum의 “Casper the Freindly Finality Gadget”**입니다.  [1–1. Casper FFG Overview](https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458),  [1–2. Casper FFG — Q&A 및 Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)로 나누어 설명합니다.\n\n첫번째 주제로 이더리움이 PoW(Proof of Work) 합의 알고리즘에서 PoS(Proof of Stake) 로 전환하기 위해 고민되고 있는 Casper 에 대해서 알아보고자 한다. Casper는 이더리움 창시자인 비탈릭 부테린(Vitalik Buterin)이 제시하는 “Casper the Friendly Finality Gadget”(FFG)와 이더리움 재단 연구원인 블라드 잠퍼(Vlad Zamfir)가 제시하는 “Casper the Friendly GHOST: Correct-by-Construction”(CBC)가 존재한다. FFG는 PoW와 PoS를 같이 가져가는 하이브리드 캐스퍼라고도 불린다. 이번 글에서는 비탈릭 부테린과 버질 그리피스(Virgil Griffith)가 작성한 “Casper the Friendly Finality Gadget” 논문을 중심으로 Casper FFG 에 대해 알아보도록 하자.\n\n### **Proof of Work 의 문제는 무엇인가?**\n\nCasper 의 원리를 설명하기 전, 이더리움에서 이미 잘 동작하고 있는 PoW에서 PoS로 변경하려는 이유에 대해 알아보자. 이더리움 재단 연구원인  [칼 플로리쉬(Karl Floersch)의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00)를 보면 크게 두 가지로 정리된다. 첫번째로 PoW로 인해 소모되는 에너지를 줄일 수 있다는 것이다. PoW에서 블록을 생성하기 위해서는 특정 조건을 만족하는 해시값을 계산하는 일을 반복해야된다. 이러한 해시값 계산은 하드웨어가 전기를 소모하게 하고 이러한 전기 소모는 에너지의 낭비로 이어진다. Powercompare에 따르면  [비트코인 채굴로 인한 전기 소모는 아일랜드나 대부분의 아프리카 나라들의 전기 소모량을 넘는 수준이라고 한다](https://powercompare.co.uk/bitcoin/). Powercompare의 보고서가 2017년에 써졌는데 지금은 더 많은 국가들의 전기 소모량을 넘을 것이다. 이처럼 막대한 양의 에너지를 소모하는 시스템은 장기적으로 봤을 때 환경에 해롭기 때문에 에너지 소모량을 줄이기 위해 PoS가 필요하다고 주장한다. 두번째로는 ASIC(Application Specific Integrated Circuit)와 중앙화된 채굴 집단으로 인해서 메인 체인(블록 넘버가 가장 큰 블록을 포함한 체인)을 변경할 수 있다는 것이다. 즉, 완결성(Finality)의 부재이다. 완결성이란 이미 결정된 블록체인이 바뀌지 않는 것을 의미한다. ASIC 혹은 빠른 채굴 장비가 등장해서 기존에 가장 긴 체인 이외의 다른 가지의 블록을 빠르게 생성해나가 가장 긴 체인을 역전한다면, 메인 체인이 변경될 수 있다. 과거의 가장 긴 체인에 포함되어 있었지만, ASIC에 의해 새롭게 생긴 가장 긴 체인에는 포함되지 않은 트랜잭션이 있다면 갑자기 잔고가 변경될 수 도 있다. 이러한 문제점 때문에 PoS 도입을 통한 완결성이 필요하다.\n\n### **캐스퍼 이전의 Proof of Stake 연구들**\n\nPoS 에서는 채굴자(Miner) 대신 검증인(Validator) 용어를 사용한다. 검증인이란 블록을 생성하기 위한 참가하는 사람을 의미한다. 이더리움 캐스퍼에서는 검증인이 되기 위해서 일정량 이상의 이더리움([2018년 3월 기준 1500ETH](https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2))을 예치해야한다. 그리고 검증인들이 모여있는 집단을 검증인 집단이라고 부르도록 하자. PoS는 캐스퍼에서 처음 등장하는 개념이 아니라 이전에도 존재하던 개념이다. 캐스퍼 이전에는 크게 두 가지의 PoS 디자인이 존재했다. 첫째로는 체인 기반의 PoS(chain-based Proof of Stake)이다. 무작위 랜덤 알고리즘이 특정 시간 간격으로 검증인 집단에서 검증인을 뽑고 블록을 만들 권한을 준다. 그리고 선정된 검증인은 블록을 생성한다. PeerCoin이나 BlackCoin이 이러한 방식의 PoS를 취한다. 두번째로는 BFT(Byzantine Fault Tolerant) 방식의 PoS가 존재한다. BFT-방식에서는 검증인 집단에서 무작위로 선출된 검증인에게 블록을 제안 할 수 있는 권리를 준다. 블록을 제안하는 것이 블록을 바로 생성하는 것은 아니다. 블록이 finalize 되려면 여러 차례의 투표 라운드 동안 ⅔ 이상의 검증인들이 특정 블록을 인정하는 투표를 해야한다. 이러한 과정을 통해서 블록이 영구적으로 체인에 포함되면 블록의 길이에 영향을 받지 않게 된다. Tendermint 가 BFT 방식의 PoS 방식을 이용한다. 이 과정도 Casper 만큼 복잡한 과정에 의해 이뤄지는데 Tendermint 의 PoS 방식에 관심이 있다면 “[Tendermint: Consensus without mining](https://tendermint.com/static/docs/tendermint.pdf)” 을 읽어보길 바란다.\n\n### **캐스퍼 프로토콜 이란?**\n\n하이브리드 PoW/PoS 시스템은 이더리움에 적용하는 첫번째 캐스퍼 버전이다. 검증인 집단이 변하지 않는다는 가정 하에 캐스퍼 프로토콜이 어떻게 동작하는지 알아보자. 우선 검증인이 되기 위해서는 캐스퍼 스마트 컨트랙트에 이더리움을 예치금(deposit)으로 맡겨야한다. 인센티브 로직이 스마트 컨트랙트에 있기 때문에 합의 과정을 통해 블록을 올바르게 생성했을 경우 예치금을 맡긴 검증인들에게 보상이 주어진다. 반대로 블록 합의 과정에서 잘못된 행동을 하였을 때 예치금을 몰수해서 처벌을 가한다. PoS의 안정성은 예치금의 크기와 비례한다. 규칙을 어겨 몰수되는 이더리움의 양이 클수록 규칙 위반에 따른 경제적 비용이 크기 때문이다.  캐스퍼 프로토콜에서 ⅔ 검증인은 검증인의 숫자가 아니라 검증인들이 가지고 있는 예치금의 ⅔ 임을 주의해야한다. 이제 이더리움을 예치하여 검증인이 된 사람들이 어떻게 투표를 하는지 알아보자.\n\nFFG는 PoW를 병행하기 때문에 매 블록마다 투표를 진행하지는 않는다. 대신 제네시스 블록 혹은 제네시스 블록으로부터 매 50번째 블록마다 체크포인트라 부르고 체크포인트에 대해 투표를 한다. 투표에는 4가지 정보와 서명이 포함이 된다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.)</center>\n\n<center>그림 1. 투표의 구성요소 (출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center>\n\n위의 표에 명시된것 처럼 source(검증의 근거)가 될 체크포인트와 target(검증의 대상)이 될 체크포인트, 그리고 각각의 체크포인트 블록의 높이가 투표의 항목으로 들어가고 <v, s, t, h(s), h(t)> 라고 표기한다 (v는 검증인을 의미한다). 여기서 주의할 것은 source가 target의 조상이 아니면 투표가 무효화되고 검증인이 검증인 집단에 속하지 않았어도 무효화 된다. 여기서 조상이란 source 가 target 보다 블록 높이가 낮고 같은 체인으로 연결되어져 있는 것을 의미한다. 이 투표는 검증인의 키에 의해 서명되서 제출된다. 이렇게 제출된 투표는 두 가지 규칙을 따르게 된다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.)</center>\n\n<center>그림 2. 투표의 두가지 규칙 (출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center>\n\n첫 번째는 target 체크 포인트의 높이가 같은 서로 다른 투표를 할 수 없다는 것이다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.)</center>\n\n<center>그림 3. 투표의 첫번째 규칙 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084))</center>\n\n위의 그림과 같이 체크포인트의 높이가 같은 두 개의 가지로 나뉘어 졌을 때, 검증인은 두 개의 체크포인트중 하나에만 투표할 수 있다. 블록 체인에서 높이가 같은 가지가 발생해서 경쟁하는 상황에서 투표를 해서 하나를 선택해야되는데 두 개 다 투표를 해버리면 어떤 가지를 메인 체인으로 할지 선택할 수 없기 때문이다.\n\n두 번째 규칙은 자신이 투표한 source, target 체크 포인트 높이 안에 포함되는 다른 투표를 할 수 없다는 것이다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.)</center>\n\n<center>그림 4. 투표의 두번째 규칙 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024)) </center>\n\n위의 그림처럼 s2, t2 의 높이 안에 s1, t1 이 포함되는 투표를 할 수 없다. 첫번째 규칙이 높이가 같으면서 충돌하는 블록에 투표하는걸 막아줄 수 있지만, 높이가 다르면서 충돌하는 경우에는 막아줄 수 없다. 이 경우를 위해 두번째 규칙이 필요하다. 이에 대한 구체적인 논의는 “블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review” 에서 자세히 이야기해보겠다.\n\n\n### **캐스퍼의 동작 과정**\n\n앞에서 살펴본 투표의 형식과 규칙을 가지고 어떻게 블록이 finalize 되는지 알아보도록하자. 그전에 캐스퍼를 설명하기위해 필요한 용어들을 정리하고 넘어가도록하자.\n\n**epoch**: 검증인이 투표하는 체크포인트의 블록 간격, FFG에서는 현재는 50블록이다.\n\n**supermajority link**: 적어도 ⅔ 검증인이 source A에서 target B로 투표를 한 경우. 체크포인트 A, B의 순서쌍을 supermajority link라 하고” A->B”로 표기한다.\n\n**conflict**: 서로 다른 가지에 블록이 존재하는 경우 두 체크포인트는 충돌한다고 한다. 즉, 두 체크포인트가 서로의 부모 자식 관계가 아님을 의미한다.\n\n**justified**: 제네시스 블록이거나 justified 된 C 체크포인트에서 C->C’인 supermajority link가 존재할 때 체크 포인트 C’가 justified 되었다고 한다.\n\n**finalized**: 체크포인트 C가 justified 되었고 C의 직계 자손(direct child)인 C’에서 supermajority link C->C’가 존재할 때 체크포인트 C가 finalized 되었다고 한다. 직계 자손이라는 것은 체크 포인트의 높이 차이가 1인 경우를 의미한다.\n\n생소한 부분이 많아서 개념만 보고서 이해하는게 쉽지 않을 수 있다. 따라서 이번에는 실제로 어떤 단계들을 거쳐서 투표가 진행되고 블록이 생성되고 체크포인트가 finalize 되는지 그림을 통해 단계적으로 살펴보고자 한다. 아래 그림에서 곡괭이를 들고 있는 사람들은 채굴자이고, 정장을 입은 사람은 검증인이다. 과정을 간단하게 보기 위해서 검증인은 총 4명이 있고 4명의 예치금은 각각 똑같아서 투표의 세기가 똑같다고 가정하자. 체크포인트는 제네시스 블록 다음의 체크포인트라고 하자. 즉 이전 체크포인트는 justified 되어있다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.)</center>\n\n<center>그림 5. 캐스퍼 합의 과정 1 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075))</center>\n\n1. 체크 포인트에 검증인들이 투표를 한다. 투표는 스마트 컨트랙트에 메서드를 호출하는 것이므로 채굴자들에 의해 트랜잭션이 채굴되어야지 블록에 포함된다. 위의 그림에서는 4명의 검증인 중에서 3명이 투표를 제출한 상태이다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.)</center>\n<center>그림 6. 캐스퍼 합의 과정 2 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096))</center>\n\n2. 제출된 투표는 채굴 과정을 통해서 블록에 포함된다. 왼쪽의 채굴자가 2명의 검증인이 제출한 투표를 블록에 포함시켰고 현재 체크포인트는 ½ 의 승인을 얻었다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.)</center>\n<center>그림 7. 캐스퍼 합의 과정 3 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170))</center>\n3. 다음으로 오른쪽 채굴자가 ¼ 에 해당하는 투표를 채굴함으로써 체크 포인트는 총 ¾ 의 투표를 받게되고 ⅔ 이 넘었으므로 새로운 체크포인트(target)에 대해 supermajority link 가 생기고 justified 된다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.)</center>\n<center>그림 8. 캐스퍼 합의 과정 4 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293))</center>\n4. 다시 체크 포인트가 찾아오면 검증인들은 다시 투표를 제출하게 된다. ¾의 검증인이 source 를 justified 된 체크포인트(노란색)로 하고 target 을 새롭게 생성된 체크포인트로 하는 투표를 제출 하였다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.)</center>\n<center>그림 9. 캐스퍼 합의 과정 5 (출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357))</center>\n5. 3명의 검증인이 제출한 투표가 채굴자에 의해 블록에 포함됬고 새롭게 생긴 체크 포인트(노란색)가 ¾의 투표를 받아서 ⅔을 넘겨서 justified 되었다.\n<center>![](https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.)</center>\n<center>그림 10. 캐스퍼 합의 과정 6(출처:  [칼의 캐스퍼 발표자료](https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466))</center>\n6. ⅔ 이상의 검증인이 초록색 체크 포인트를 source 로 하고 노란색 체크포인트를 target 으로 하는 투표를 했기 때문에 그림과 같이 두 체크포인트는 supermajority link 로 연결된다. 그리고 초록색 체크포인트가 justified 되어있고 직계 자손(direct child)인 체크포인트가 supermajority link로 연결되므로 초록색 체크포인트가 finalize 되었다.\n\n### **캐스퍼의 두 가지 정리**\n\n앞에서 설명한 과정들을 통해서 캐스퍼는 Accountable Safety와 Plausible Liveness 를 얻을 수 있다. Accountable Safety는 검증인이 규칙을 위반해 ⅓ 이상의 예치금 몰수 없이 두 개의 충돌하는 체크포인트가 finalize 될 수 없다는 것이다. Plausible Liveness는 예치금 몰수, 블록 딜레이와 같은 사건과 관계없이 ⅔의 검증인이 프로토콜을 따른다면, 어느 검증인의 예치금 몰수 없이도 새로운 체크포인트를 finalize 할 수 있다는 것이다. 이 두 가지 정리가 성립하는지 알아보기 전에 프로토콜 규칙에 의해 도출되는 속성을 살펴보자.\n\n두 개의 캐스퍼 프로토콜을 이용해서 ⅔ 이상의 검증인이 몰수 조건을 위반하지 않는다면 네 가지 속성을 따른다고 할 수 있다.\n\n1.  s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(t1) 과 h(t2) 는 다르다.\n2.  s1->t1, s2->t2 의 서로 다른 supermajority link 가 존재한다면, h(s1) < h(s2) < h(t2) < h(t1) 을 만족하는 s1, t1, s2, t2 가 존재할 수 없다.\n3.  h(t) = n 인 s->t supermajority link 는 많아야 1개 존재한다.\n4.  높이가 n 인 justified 체크포인트는 많아야 1개 존재한다.\n\n캐스퍼 프로토콜과 이로 인해 나타난 네 가지 속성을 통해서 앞에서 설명한 Accountable Safety 와 Plausible Liveness 를 증명할 수 있다. Accountable Safety 는 충돌하는 체크포인트 A, B 가 있다고 가정한 뒤 귀류법을 통해서 증명할 수 있고, Plausible Liveness 역시 위의 네 가지 속성들을 이용해서 손쉽게 증명할 수 있다. 자세한 증명과정은  [문영훈님의 슬라이드](https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos)를 참고하기 바란다.\n\n이 두 가지 정리가 중요한 이유는 캐스퍼 프로토콜에 따라 증명되는 정리들이 성립하지 않으려면 ⅓ 이상의 예치금이 몰수당해야 된다는 것이다. ⅓ 이라는 수치는 supermajority link 가 생성되기 위해서는 ⅔ 검증인의 동의가 필요하기 때문에 구해지는 수치이다. 충돌하는 체크포인트 A, B가 존재하고 예치금이 같은 3명의 검증인 가, 나, 다가 있다고 가정하자. “가”는 A에 투표하고, “나”는 B에 투표한 상황에서 “다”가 A, B 모두에게 투표하는 경우. A, B 모두 ⅔ 검증인이 투표를 하여서 supermajority link 가 생성되고 justify된다. 그리고 추후 투표를 통해서 finalize 될 수 있다. 하지만 “다”는 첫번째 투표 규칙에 위반하였기 때문에 예치금을 몰수 당하게 된다. 3명중에 1명이 예치금 몰수를 당하게 되므로 ⅓ 이상의 예치금 몰 수 없이 두개의 충돌하는 체크포인트가 finalize 될 수 없게 되는 것이다. 즉 누군가 규칙을 벗어난 블록을 생성해서 포크를 일으키려면 경제적인 처벌을 받게 된다는 것이다. 검증인들은 이러한 경제적인 처벌을 감당하면서 까지 포크를 발생시킬 유인이 거의 존재하지 않을 것이므로 캐스퍼 프로토콜에서 정의된 규칙대로 움직일 확률이 높을 것이다.\n\n### **동적인 검증인 집단**\n\n지금까지는 검증인 집단이 고정되어 있다는 가정하에 간단한 캐스퍼 프로토콜을 살펴보았다. 하지만 실제로 캐스퍼가 동작할 때는 고정된 검증인 집단이 아니라 수시로 변하는 검증인 집단을 가지고 동작한다. 검증인이 되기 위해 스마트 컨트랙트에 이더리움을 예치했는데 필요에 의해서 혹은 검증인을 그만 두고자 이더리움을 출금할 수도 있고, 새롭게 검증인이 되기 위해서 이더리움을 예치할 수 있기 때문이다. 검증인 집단의 변경에 대한 제약이 없을 경우, 한쪽 가지에 대해 투표한 검증인 집단이 모두 나가고 새로운 검증인 집단이 와서 반대쪽 가지에 투표한다면 규칙에 위배되지 않으므로 검증인 중 그 누구도 예치금이 몰수되지 않는다. 이러한 문제점을 해결하기위해서 입금/출금 이후 바로 검증인 집단에 참여/제외되는 것이 아니라 일정시간 뒤에 검증인 집단에 참여/제외 되게 해야한다. 이러한 문제를 해결하는 방법을 설명하기 전에 동적인 검증인 집단에서 추가되는 개념인 dynasty에 대해 알아보자. 블록 B의 dynasty 는 루트부터 블록 B의 바로 이전 블록까지 finalize 된 체크포인트의 수 이다. 그리고 검증인이 dynasty d 인 블록에 예치금을 입금하면 검증인은 dynasty 가 d + 2 일 때 부터 검증인 집단에 속하게 된다. 다시말하자면 이더리움을 예치하고 두번의 finalize가 일어나면 검증인 집단에 속하게 된다. d + 2 를 start dynasty 라고 부른다. 마찬가지로 검증인 집단에서 떠날 때도 dynasty 의 개념을 이용해야 한다. 검증인이 dynasty 가 d 인 블록에서 출금을 할 경우 dynasty 가 d + 2 일 때 검증인 집단을 떠나게 된다. 그리고 이는 end dynasty 라고 부른다.\n\n<center>![](https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.)</center>\n\n<center>그림 11. 동적인 검증인 공격 (출처:  [캐스퍼 논문](https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf))</center>\n\n동적인 검증인 집단의 문제를 좀 더 구체적으로 살펴보자. 위의 그림과 같이 체크포인트 S 에서 보라색 검증인 집단이 있었다고 하자. 그리고 충돌하는 체인이 발생했다고 하자. 이해를 돕기위해 첨언하자면 위의 그림에서 블록간의 점선으로 이어진 부분에도 수많은 블록이 존재한다. 체크포인트 S 를 finalize 하는 투표가 오른쪽 체인에서는 포함되고 왼쪽 체인에서는 포함이 되지 않았다고 하자. 이럴 경우 오른쪽 체인은 finalize 된 체크포인트가 하나 더 늘어서 dynasty 가 변경되고 검증인 집단이 변경된다. 하지만 왼쪽 집단은 dynasty가 그대로여서 검증인 집단이 바뀌지 않게된다. 이런 상황에서 블록이 계속 생성되고 추가적인 투표가 진행되어서 높이가 같은 체크포인트 C와 C’ 이 finalize 된다면 첫번째 투표 규칙에 위반되지만 검증자 집단이 다르기 때문에 아무도 예치금을 몰수 당하지 않는다. 이럴 경우 이전에 설명한 Accountable Safety를 만족하지 못하게 된다. 따라서 우리는 기존에 고정된 검증자 집단에 대한 정의들을 약간 수정할 필요가 있다. 따라서 새로 들어온 검증자 집단과 이전에 들어온 검증자 집단을 구분하여서 각각의 집단에서 ⅔ 이상의 투표를 받아야지 supermajority link 가 생기도록 정의를 변경하였다. 고정된 검증자 집단이 아닌 동적인 검증자 집단일 경우에 Accountable Safety 와 Plausible Liveness 를 증명하는 것은 캐스퍼 페이퍼에서 아직 미래 과제로 남겨두고 있다. 이처럼 아직도 캐스퍼는 완결된 메커니즘이 아닌 진화중인 메커니즘으로 문제점들이 충분히 존재할 수 있다. 하지만 PoW에서 PoS로 전환하는 첫 프로젝트로 큰 의의를 가지고 있다. 이것으로 Casper FFG 에 대해 알아보았고 다음 글에서는 FFG 를 조사하며 궁금했던 점을 Q&A 형식으로 풀어써본다. 그리고 앞서 설명한 캐스퍼 프로토콜이 코드에서는 어떻게 구현되었는지 살펴보려고 한다.\n\n\n>이 글은 고팍스(@gopaxkr)로부터 후원을 받아 디사이퍼가 작성한 글입니다.\n [다음글) 블록체인 확장성 솔루션 시리즈 1–2 :: Casper FFG — Q&A / Code Review](https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1)",
      "json_metadata": "{\"tags\":[\"casper\",\"decipher\",\"scalability\",\"coinkorea\",\"kr\"],\"users\":[\"decipher-media\",\"gopaxkr\"],\"image\":[\"https://cdn-images-1.medium.com/max/1100/0*K5dU_JDgxyDtlStP.\",\"https://cdn-images-1.medium.com/max/1100/0*AoxkETyrRoJrsezb.\",\"https://cdn-images-1.medium.com/max/1100/0*z_o0Kvpg0cQzu2TH.\",\"https://cdn-images-1.medium.com/max/1100/0*bvNft0i780IXCt4z.\",\"https://cdn-images-1.medium.com/max/1100/0*z0R0D_EUa2xpjfgL.\",\"https://cdn-images-1.medium.com/max/1100/0*doS2pkCUsrm7bfLm.\",\"https://cdn-images-1.medium.com/max/1100/0*afeIP7syl3FPyqKG.\",\"https://cdn-images-1.medium.com/max/1100/0*PgF1Iep15yvdT9c_.\",\"https://cdn-images-1.medium.com/max/1100/0*FjaXfQf1X8hIbcR5.\",\"https://cdn-images-1.medium.com/max/1100/0*bBxhkVkful4asiAw.\",\"https://cdn-images-1.medium.com/max/1100/0*VzthMEqcWF6IeY6J.\"],\"links\":[\"https://medium.com/decipher-media/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%99%95%EC%9E%A5%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98-%EC%8B%9C%EB%A6%AC%EC%A6%88-1-1-casper-overview-3e0154487458\",\"https://medium.com/decipher-media/scailabilty-series-1-2-casper-code-review-8a84103990d1\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g35f391192_00\",\"https://powercompare.co.uk/bitcoin/\",\"https://ethresear.ch/t/casper-incentive-manipulation-perverse-incentives/1306/2\",\"https://tendermint.com/static/docs/tendermint.pdf\",\"https://github.com/ethereum/research/blob/master/papers/casper-basics/casper_basics.pdf\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_3084\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_4024\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2075\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2096\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2170\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2293\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2357\",\"https://docs.google.com/presentation/d/1fqnjL-2TqXjhHx8k7HRX7eUYnDK83adnlCLLH8Bk054/edit#slide=id.g29703948a2_0_2466\",\"https://www.slideshare.net/YounghoonMoon1/casper-ethereum-pos\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
steemdelegated 18.644 SP to @decipher-media
2018/04/21 11:36:39
delegatorsteem
delegateedecipher-media
vesting shares30359.016324 VESTS
Transaction InfoBlock #21760224/Trx 9c8dc786c1cbdda17c4e27bdf11d8b9371b9fc14
View Raw JSON Data
{
  "trx_id": "9c8dc786c1cbdda17c4e27bdf11d8b9371b9fc14",
  "block": 21760224,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-21T11:36:39",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "decipher-media",
      "vesting_shares": "30359.016324 VESTS"
    }
  ]
}
steemcreated a new account: @decipher-media
2018/04/21 10:22:51
fee0.100 STEEM
delegation30690.000000 VESTS
creatorsteem
new account namedecipher-media
owner{"weight_threshold":1,"account_auths":[],"key_auths":[["STM6DQmVn2M73CsDgdfo73gBJaDLqQ2DokiLnwUkgz1Pw6vnvA4gi",1]]}
active{"weight_threshold":1,"account_auths":[],"key_auths":[["STM7qe9RAaU5B1XJG1wNmBrJLSXeeEMqcMyjqmsoMUBknsyGKzQmT",1]]}
posting{"weight_threshold":1,"account_auths":[],"key_auths":[["STM5waGCqMJbXvHBbGgZLWdtwwpYuRCsPN9nkzLRSdb8Ug1LyYKLP",1]]}
memo keySTM8jHFPsSJx6H4XgRGSdAaV6w3YSxKs9vFWE725gYaaU7Jav1eAL
json metadata{}
extensions[]
Transaction InfoBlock #21758752/Trx 7aeefe2b71c1677528797c3b4b2bd44e3512de5d
View Raw JSON Data
{
  "trx_id": "7aeefe2b71c1677528797c3b4b2bd44e3512de5d",
  "block": 21758752,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-21T10:22:51",
  "op": [
    "account_create_with_delegation",
    {
      "fee": "0.100 STEEM",
      "delegation": "30690.000000 VESTS",
      "creator": "steem",
      "new_account_name": "decipher-media",
      "owner": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM6DQmVn2M73CsDgdfo73gBJaDLqQ2DokiLnwUkgz1Pw6vnvA4gi",
            1
          ]
        ]
      },
      "active": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM7qe9RAaU5B1XJG1wNmBrJLSXeeEMqcMyjqmsoMUBknsyGKzQmT",
            1
          ]
        ]
      },
      "posting": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM5waGCqMJbXvHBbGgZLWdtwwpYuRCsPN9nkzLRSdb8Ug1LyYKLP",
            1
          ]
        ]
      },
      "memo_key": "STM8jHFPsSJx6H4XgRGSdAaV6w3YSxKs9vFWE725gYaaU7Jav1eAL",
      "json_metadata": "{}",
      "extensions": []
    }
  ]
}

Account Metadata

POSTING JSON METADATA
profile{"profile_image":"https://cdn-images-1.medium.com/fit/c/275/275/1*JNM2iUvadhIjRpkmxanAaA.jpeg"}
JSON METADATA
profile{"profile_image":"https://cdn-images-1.medium.com/fit/c/275/275/1*JNM2iUvadhIjRpkmxanAaA.jpeg"}
{
  "posting_json_metadata": {
    "profile": {
      "profile_image": "https://cdn-images-1.medium.com/fit/c/275/275/1*JNM2iUvadhIjRpkmxanAaA.jpeg"
    }
  },
  "json_metadata": {
    "profile": {
      "profile_image": "https://cdn-images-1.medium.com/fit/c/275/275/1*JNM2iUvadhIjRpkmxanAaA.jpeg"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM6DQmVn2M73CsDgdfo73gBJaDLqQ2DokiLnwUkgz1Pw6vnvA4gi1/1
Active
Single Signature
Public Keys
STM7qe9RAaU5B1XJG1wNmBrJLSXeeEMqcMyjqmsoMUBknsyGKzQmT1/1
Posting
Single Signature
Public Keys
STM5waGCqMJbXvHBbGgZLWdtwwpYuRCsPN9nkzLRSdb8Ug1LyYKLP1/1
Memo
STM8jHFPsSJx6H4XgRGSdAaV6w3YSxKs9vFWE725gYaaU7Jav1eAL
{
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6DQmVn2M73CsDgdfo73gBJaDLqQ2DokiLnwUkgz1Pw6vnvA4gi",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7qe9RAaU5B1XJG1wNmBrJLSXeeEMqcMyjqmsoMUBknsyGKzQmT",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5waGCqMJbXvHBbGgZLWdtwwpYuRCsPN9nkzLRSdb8Ug1LyYKLP",
        1
      ]
    ]
  },
  "memo": "STM8jHFPsSJx6H4XgRGSdAaV6w3YSxKs9vFWE725gYaaU7Jav1eAL"
}

Witness Votes

0 / 30
No active witness votes.
[]