VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.036USD
STEEM
0.000STEEM
SBD
0.000SBD
Effective Power
5.007SP
├── Own SP
0.629SP
└── Incoming DelegationsDeleg
+4.378SP
Detailed Balance
| STEEM | ||
| balance | 0.000STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 0.629SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 4.378SP | SP |
| Effective Power | 5.007SP | SP |
| Reward SP (pending) | 0.000SP | SP |
| SBD | ||
| sbd_balance | 0.000SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.000SBD | SBD |
{
"balance": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"reward_steem_balance": "0.000 STEEM",
"vesting_shares": "1023.007213 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "7120.652593 VESTS",
"sbd_balance": "0.000 SBD",
"savings_sbd_balance": "0.000 SBD",
"reward_sbd_balance": "0.000 SBD",
"conversions": []
}Account Info
| name | dongshik |
| id | 704837 |
| rank | 605,010 |
| reputation | 9385347 |
| created | 2018-02-01T01:22:27 |
| recovery_account | steem |
| proxy | None |
| post_count | 2 |
| comment_count | 0 |
| lifetime_vote_count | 0 |
| witnesses_voted_for | 0 |
| last_post | 2018-04-25T10:49:30 |
| last_root_post | 2018-04-25T10:49:30 |
| last_vote_time | 1970-01-01T00:00:00 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.000 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 0.000 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 1023.007213 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 7120.652593 VESTS |
| reward_vesting_balance | 0.000000 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 1970-01-01T00:00:00 |
| last_account_update | 2018-04-26T14:22:39 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 1970-01-01T00:00:00 |
| savings_sbd_last_interest_payment | 1970-01-01T00:00:00 |
{
"active": {
"account_auths": [],
"key_auths": [
[
"STM5FS5ca329Nf4YxPijrcB2nPAQM1SsB1ERPvWB8mnJRPbsYkQSm",
1
]
],
"weight_threshold": 1
},
"balance": "0.000 STEEM",
"can_vote": true,
"comment_count": 0,
"created": "2018-02-01T01:22:27",
"curation_rewards": 0,
"delegated_vesting_shares": "0.000000 VESTS",
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779061056
},
"guest_bloggers": [],
"id": 704837,
"json_metadata": "{\"profile\":{\"name\":\"망각\",\"about\":\"여전히 개발하고 공부하는게 재미있습니다.!!!\",\"location\":\"서울\"}}",
"last_account_recovery": "1970-01-01T00:00:00",
"last_account_update": "2018-04-26T14:22:39",
"last_owner_update": "1970-01-01T00:00:00",
"last_post": "2018-04-25T10:49:30",
"last_root_post": "2018-04-25T10:49:30",
"last_vote_time": "1970-01-01T00:00:00",
"lifetime_vote_count": 0,
"market_history": [],
"memo_key": "STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N",
"mined": false,
"name": "dongshik",
"next_vesting_withdrawal": "1969-12-31T23:59:59",
"other_history": [],
"owner": {
"account_auths": [],
"key_auths": [
[
"STM8MFy85L34ezoakpGz5Fek2VW31pLeSDNg3ZME51YcSnkfbeMDJ",
1
]
],
"weight_threshold": 1
},
"pending_claimed_accounts": 0,
"post_bandwidth": 0,
"post_count": 2,
"post_history": [],
"posting": {
"account_auths": [],
"key_auths": [
[
"STM6rmAfEbe7BUu96DQKmvBnWZq32QaCmnCoVNgeyCFoPvfArTBkw",
1
]
],
"weight_threshold": 1
},
"posting_json_metadata": "{\"profile\":{\"name\":\"망각\",\"about\":\"여전히 개발하고 공부하는게 재미있습니다.!!!\",\"location\":\"서울\"}}",
"posting_rewards": 0,
"proxied_vsf_votes": [
0,
0,
0,
0
],
"proxy": "",
"received_vesting_shares": "7120.652593 VESTS",
"recovery_account": "steem",
"reputation": 9385347,
"reset_account": "null",
"reward_sbd_balance": "0.000 SBD",
"reward_steem_balance": "0.000 STEEM",
"reward_vesting_balance": "0.000000 VESTS",
"reward_vesting_steem": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"savings_sbd_balance": "0.000 SBD",
"savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
"savings_sbd_seconds": "0",
"savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
"savings_withdraw_requests": 0,
"sbd_balance": "0.000 SBD",
"sbd_last_interest_payment": "1970-01-01T00:00:00",
"sbd_seconds": "0",
"sbd_seconds_last_update": "1970-01-01T00:00:00",
"tags_usage": [],
"to_withdraw": 0,
"transfer_history": [],
"vesting_balance": "0.000 STEEM",
"vesting_shares": "1023.007213 VESTS",
"vesting_withdraw_rate": "0.000000 VESTS",
"vote_history": [],
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779061056
},
"voting_power": 0,
"withdraw_routes": 0,
"withdrawn": 0,
"witness_votes": [],
"witnesses_voted_for": 0,
"rank": 605010
}Withdraw Routes
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
2026/05/17 23:37:36
2026/05/17 23:37:36
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 7120.652593 VESTS |
| Transaction Info | Block #106142699/Trx 841a352f4a1b14151a79556435364f502f086a47 |
View Raw JSON Data
{
"block": 106142699,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "7120.652593 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-17T23:37:36",
"trx_id": "841a352f4a1b14151a79556435364f502f086a47",
"trx_in_block": 0,
"virtual_op": 0
}2026/05/12 01:19:18
2026/05/12 01:19:18
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 4408.442188 VESTS |
| Transaction Info | Block #105972694/Trx b44c45bc7493f0b96bf1d9e0c587f7211f90cece |
View Raw JSON Data
{
"block": 105972694,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "4408.442188 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-12T01:19:18",
"trx_id": "b44c45bc7493f0b96bf1d9e0c587f7211f90cece",
"trx_in_block": 0,
"virtual_op": 0
}2026/04/25 22:59:36
2026/04/25 22:59:36
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 7133.168349 VESTS |
| Transaction Info | Block #105510371/Trx cd1c05a2852f5ad138d5815c5bca28ef4c3221ef |
View Raw JSON Data
{
"block": 105510371,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "7133.168349 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-04-25T22:59:36",
"trx_id": "cd1c05a2852f5ad138d5815c5bca28ef4c3221ef",
"trx_in_block": 0,
"virtual_op": 0
}2026/01/23 06:07:21
2026/01/23 06:07:21
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 4449.989007 VESTS |
| Transaction Info | Block #102849797/Trx e1819935331bc45b791da0c4a9020439b957cb22 |
View Raw JSON Data
{
"block": 102849797,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "4449.989007 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-01-23T06:07:21",
"trx_id": "e1819935331bc45b791da0c4a9020439b957cb22",
"trx_in_block": 0,
"virtual_op": 0
}2024/12/17 01:27:12
2024/12/17 01:27:12
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 4614.208204 VESTS |
| Transaction Info | Block #91296222/Trx 6c6ae4094e29226188fc63d9c087a69ec7893093 |
View Raw JSON Data
{
"block": 91296222,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "4614.208204 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2024-12-17T01:27:12",
"trx_id": "6c6ae4094e29226188fc63d9c087a69ec7893093",
"trx_in_block": 2,
"virtual_op": 0
}2023/11/13 17:10:09
2023/11/13 17:10:09
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 4783.341736 VESTS |
| Transaction Info | Block #79850435/Trx 170282aa8bec7da47b8357a0125cd2bacc05fe6e |
View Raw JSON Data
{
"block": 79850435,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "4783.341736 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-11-13T17:10:09",
"trx_id": "170282aa8bec7da47b8357a0125cd2bacc05fe6e",
"trx_in_block": 2,
"virtual_op": 0
}2023/09/21 21:05:36
2023/09/21 21:05:36
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 7720.620522 VESTS |
| Transaction Info | Block #78346946/Trx 7cd20da43a63da30a7531594d2c3a37dea04bca6 |
View Raw JSON Data
{
"block": 78346946,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "7720.620522 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-09-21T21:05:36",
"trx_id": "7cd20da43a63da30a7531594d2c3a37dea04bca6",
"trx_in_block": 0,
"virtual_op": 0
}2022/11/03 10:59:03
2022/11/03 10:59:03
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 7942.301960 VESTS |
| Transaction Info | Block #69112403/Trx 26696cfb1e2e4f3ec57cd5f54220c6b297d26c6d |
View Raw JSON Data
{
"block": 69112403,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "7942.301960 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-11-03T10:59:03",
"trx_id": "26696cfb1e2e4f3ec57cd5f54220c6b297d26c6d",
"trx_in_block": 4,
"virtual_op": 0
}2022/01/17 10:18:21
2022/01/17 10:18:21
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 8162.835191 VESTS |
| Transaction Info | Block #60808637/Trx 503205eee8d4c6afc8ec985427d6db8e52569865 |
View Raw JSON Data
{
"block": 60808637,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "8162.835191 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-01-17T10:18:21",
"trx_id": "503205eee8d4c6afc8ec985427d6db8e52569865",
"trx_in_block": 20,
"virtual_op": 0
}seupupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle2021/08/04 02:00:57
seupupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle
2021/08/04 02:00:57
| author | dongshik |
| permlink | ethereum-pet-shop-and-truffle |
| voter | seup |
| weight | 10000 (100.00%) |
| Transaction Info | Block #56059455/Trx 6acb391a6c2e0a8ee74ecf242fab8d5d9161078d |
View Raw JSON Data
{
"block": 56059455,
"op": [
"vote",
{
"author": "dongshik",
"permlink": "ethereum-pet-shop-and-truffle",
"voter": "seup",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2021-08-04T02:00:57",
"trx_id": "6acb391a6c2e0a8ee74ecf242fab8d5d9161078d",
"trx_in_block": 3,
"virtual_op": 0
}2021/06/14 00:15:09
2021/06/14 00:15:09
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 8346.603849 VESTS |
| Transaction Info | Block #54607055/Trx 8ec31519cd9df4c593c9edf407c2776a37a224c7 |
View Raw JSON Data
{
"block": 54607055,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "8346.603849 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2021-06-14T00:15:09",
"trx_id": "8ec31519cd9df4c593c9edf407c2776a37a224c7",
"trx_in_block": 6,
"virtual_op": 0
}2020/12/11 10:35:06
2020/12/11 10:35:06
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 8534.025823 VESTS |
| Transaction Info | Block #49354544/Trx aba914814f70b43e1049a9d5cef7a612fc53a837 |
View Raw JSON Data
{
"block": 49354544,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "8534.025823 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-11T10:35:06",
"trx_id": "aba914814f70b43e1049a9d5cef7a612fc53a837",
"trx_in_block": 2,
"virtual_op": 0
}2020/12/06 04:12:27
2020/12/06 04:12:27
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #49206110/Trx 121cb188d1842d738b3f5a99f5e4f98376e4b371 |
View Raw JSON Data
{
"block": 49206110,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "1912.543513 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-06T04:12:27",
"trx_id": "121cb188d1842d738b3f5a99f5e4f98376e4b371",
"trx_in_block": 0,
"virtual_op": 0
}2020/12/05 14:13:24
2020/12/05 14:13:24
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 8540.233677 VESTS |
| Transaction Info | Block #49189642/Trx 60351dbb10b66971fa53b8d1287ab1eaccf92aa5 |
View Raw JSON Data
{
"block": 49189642,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "8540.233677 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-05T14:13:24",
"trx_id": "60351dbb10b66971fa53b8d1287ab1eaccf92aa5",
"trx_in_block": 5,
"virtual_op": 0
}2020/11/02 14:26:24
2020/11/02 14:26:24
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 1920.017158 VESTS |
| Transaction Info | Block #48256386/Trx 4a6a5fd364bd4eeb30d57ea456fe6ee7b5a1547e |
View Raw JSON Data
{
"block": 48256386,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "1920.017158 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-11-02T14:26:24",
"trx_id": "4a6a5fd364bd4eeb30d57ea456fe6ee7b5a1547e",
"trx_in_block": 5,
"virtual_op": 0
}2020/05/09 05:08:57
2020/05/09 05:08:57
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 8743.039036 VESTS |
| Transaction Info | Block #43216345/Trx f32c47c465f3f972168611b3a3a658a2a156e2ae |
View Raw JSON Data
{
"block": 43216345,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "8743.039036 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-09T05:08:57",
"trx_id": "f32c47c465f3f972168611b3a3a658a2a156e2ae",
"trx_in_block": 7,
"virtual_op": 0
}2020/05/08 08:39:48
2020/05/08 08:39:48
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #43192339/Trx 205b72a9ff4b4b1ea42bc1994837c2118843ac0b |
View Raw JSON Data
{
"block": 43192339,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "1953.311140 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-08T08:39:48",
"trx_id": "205b72a9ff4b4b1ea42bc1994837c2118843ac0b",
"trx_in_block": 14,
"virtual_op": 0
}2020/02/01 01:47:39
2020/02/01 01:47:39
| author | steemitboard |
| body | Congratulations @dongshik! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@dongshik/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@dongshik) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=dongshik)_</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"]} |
| parent author | dongshik |
| parent permlink | ethereum-pet-shop-and-truffle |
| permlink | steemitboard-notify-dongshik-20200201t014738000z |
| title | |
| Transaction Info | Block #40425535/Trx 2ce55e5d3b1a5b3c722cb3829c0ca99f7ac14442 |
View Raw JSON Data
{
"block": 40425535,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @dongshik! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@dongshik/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@dongshik) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=dongshik)_</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\"]}",
"parent_author": "dongshik",
"parent_permlink": "ethereum-pet-shop-and-truffle",
"permlink": "steemitboard-notify-dongshik-20200201t014738000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2020-02-01T01:47:39",
"trx_id": "2ce55e5d3b1a5b3c722cb3829c0ca99f7ac14442",
"trx_in_block": 1,
"virtual_op": 0
}2019/07/19 17:21:51
2019/07/19 17:21:51
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 8911.896862 VESTS |
| Transaction Info | Block #34804506/Trx eabe02b36872d8d19c404771f571bb5717ed6abd |
View Raw JSON Data
{
"block": 34804506,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "8911.896862 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2019-07-19T17:21:51",
"trx_id": "eabe02b36872d8d19c404771f571bb5717ed6abd",
"trx_in_block": 13,
"virtual_op": 0
}blueflagflagged (-100.00%) @dongshik / ethereum-pet-shop-and-truffle2019/06/18 11:02:24
blueflagflagged (-100.00%) @dongshik / ethereum-pet-shop-and-truffle
2019/06/18 11:02:24
| author | dongshik |
| permlink | ethereum-pet-shop-and-truffle |
| voter | blueflag |
| weight | -10000 (-100.00%) |
| Transaction Info | Block #33905184/Trx 52f030c0473cb3f7762ffa384ea19a18c7524624 |
View Raw JSON Data
{
"block": 33905184,
"op": [
"vote",
{
"author": "dongshik",
"permlink": "ethereum-pet-shop-and-truffle",
"voter": "blueflag",
"weight": -10000
}
],
"op_in_trx": 0,
"timestamp": "2019-06-18T11:02:24",
"trx_id": "52f030c0473cb3f7762ffa384ea19a18c7524624",
"trx_in_block": 29,
"virtual_op": 0
}betterthanbeforeupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle2019/04/17 04:19:48
betterthanbeforeupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle
2019/04/17 04:19:48
| author | dongshik |
| permlink | ethereum-pet-shop-and-truffle |
| voter | betterthanbefore |
| weight | 10000 (100.00%) |
| Transaction Info | Block #32113194/Trx fb82711e16556135e80f189b024c816fc908d8f9 |
View Raw JSON Data
{
"block": 32113194,
"op": [
"vote",
{
"author": "dongshik",
"permlink": "ethereum-pet-shop-and-truffle",
"voter": "betterthanbefore",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2019-04-17T04:19:48",
"trx_id": "fb82711e16556135e80f189b024c816fc908d8f9",
"trx_in_block": 19,
"virtual_op": 0
}milkdiceupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle2019/03/23 12:19:06
milkdiceupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle
2019/03/23 12:19:06
| author | dongshik |
| permlink | ethereum-pet-shop-and-truffle |
| voter | milkdice |
| weight | 10000 (100.00%) |
| Transaction Info | Block #31404792/Trx e07c9c533f53a299d3fdf073abe56b3d163e8b1c |
View Raw JSON Data
{
"block": 31404792,
"op": [
"vote",
{
"author": "dongshik",
"permlink": "ethereum-pet-shop-and-truffle",
"voter": "milkdice",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2019-03-23T12:19:06",
"trx_id": "e07c9c533f53a299d3fdf073abe56b3d163e8b1c",
"trx_in_block": 9,
"virtual_op": 0
}2019/02/01 02:11:48
2019/02/01 02:11:48
| author | steemitboard |
| body | Congratulations @dongshik! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@dongshik/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table> <sub>_[Click here to view your Board](https://steemitboard.com/@dongshik)_</sub> > Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| parent author | dongshik |
| parent permlink | ethereum-pet-shop-and-truffle |
| permlink | steemitboard-notify-dongshik-20190201t021147000z |
| title | |
| Transaction Info | Block #29953744/Trx df943fc347f15a2e48c7119aab747c789ae179ac |
View Raw JSON Data
{
"block": 29953744,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @dongshik! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@dongshik/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table>\n\n<sub>_[Click here to view your Board](https://steemitboard.com/@dongshik)_</sub>\n\n\n> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
"parent_author": "dongshik",
"parent_permlink": "ethereum-pet-shop-and-truffle",
"permlink": "steemitboard-notify-dongshik-20190201t021147000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2019-02-01T02:11:48",
"trx_id": "df943fc347f15a2e48c7119aab747c789ae179ac",
"trx_in_block": 7,
"virtual_op": 0
}hapsodyupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle2018/12/28 02:02:27
hapsodyupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle
2018/12/28 02:02:27
| author | dongshik |
| permlink | ethereum-pet-shop-and-truffle |
| voter | hapsody |
| weight | 10000 (100.00%) |
| Transaction Info | Block #28946498/Trx dae525184bb0f30e0877138e591788b5fb26fc72 |
View Raw JSON Data
{
"block": 28946498,
"op": [
"vote",
{
"author": "dongshik",
"permlink": "ethereum-pet-shop-and-truffle",
"voter": "hapsody",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-12-28T02:02:27",
"trx_id": "dae525184bb0f30e0877138e591788b5fb26fc72",
"trx_in_block": 18,
"virtual_op": 0
}vitkooupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle2018/09/04 07:46:36
vitkooupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle
2018/09/04 07:46:36
| author | dongshik |
| permlink | ethereum-pet-shop-and-truffle |
| voter | vitkoo |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25659162/Trx d5a1597c66cd0ab5af8a61e8160c72673436639c |
View Raw JSON Data
{
"block": 25659162,
"op": [
"vote",
{
"author": "dongshik",
"permlink": "ethereum-pet-shop-and-truffle",
"voter": "vitkoo",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-09-04T07:46:36",
"trx_id": "d5a1597c66cd0ab5af8a61e8160c72673436639c",
"trx_in_block": 8,
"virtual_op": 0
}2018/08/01 03:25:12
2018/08/01 03:25:12
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 9110.612324 VESTS |
| Transaction Info | Block #24675175/Trx 6ba46a61871f537d5eac63d91ea026f6df0a9cbd |
View Raw JSON Data
{
"block": 24675175,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "9110.612324 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-08-01T03:25:12",
"trx_id": "6ba46a61871f537d5eac63d91ea026f6df0a9cbd",
"trx_in_block": 28,
"virtual_op": 0
}minebuuupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle2018/05/24 08:41:03
minebuuupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle
2018/05/24 08:41:03
| author | dongshik |
| permlink | ethereum-pet-shop-and-truffle |
| voter | minebuu |
| weight | 10000 (100.00%) |
| Transaction Info | Block #22706274/Trx 248dc3a85c802fd7e1efc292e7b80feddb355297 |
View Raw JSON Data
{
"block": 22706274,
"op": [
"vote",
{
"author": "dongshik",
"permlink": "ethereum-pet-shop-and-truffle",
"voter": "minebuu",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-05-24T08:41:03",
"trx_id": "248dc3a85c802fd7e1efc292e7b80feddb355297",
"trx_in_block": 57,
"virtual_op": 0
}2018/05/18 19:13:42
2018/05/18 19:13:42
| delegatee | dongshik |
| delegator | steem |
| vesting shares | 29496.512712 VESTS |
| Transaction Info | Block #22546166/Trx bc5a5ca0b1ab60ae31d8240a63676da3adccca06 |
View Raw JSON Data
{
"block": 22546166,
"op": [
"delegate_vesting_shares",
{
"delegatee": "dongshik",
"delegator": "steem",
"vesting_shares": "29496.512712 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-05-18T19:13:42",
"trx_id": "bc5a5ca0b1ab60ae31d8240a63676da3adccca06",
"trx_in_block": 24,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/05/02 03:08:51
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/05/02 03:08:51
| author | dongshik |
| body | 안녕하세요. Ethereum Dapp개발을 위한 truffle 튜토리얼 중 pet-shop 튜토리얼을 통해 로컬 개발환경 구성과 실행 테스트, 명령어 실행은 물론이고 스마트 컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다 또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다 (먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다) Pet Shop 튜토리얼의 대상 - Pet shop의 입양(Adoption) 추적 시스템 추축 과정 안내를 목표로 합니다 - Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자를 대상으로 합니다 Pet Shop 튜토리얼 요건정의 - 고객은 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있습니다 - 한번에 16마리의 애완동물을 관리하기 위한 공간을 보유하고 있으며 - 각 애완동물에 대한 정보 데이터 베이스를 보유하고 있습니다 - Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp 구현을 목표로 하며 - 기본 웹사이트의 구조와 Style을 제공합니다 - 프론트엔드 로직과 스마트 계약을 작성하면 완성되는 형식으로 구성되어 있습니다 Pet Shop 튜토리얼 아키텍처  4가지의 주요 기능으로 구성되며 순차적으로 하나씩 살펴 보겠습니다 튜토리얼 순서 1. 개발 환경 설정 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 3. Smart Contract 작성하기 4. Smart Contract 컴파일 및 마이그레이션 5. Smart Contract 테스트 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 7. 브라우저에서 dapp과 상호 작용 (MacOS를 기준으로 작성합니다) ## 1. 개발 환경 설정 먼저 Truffle 설치 전에 아래 두가지를 설치합니다. - Node.js v6+ LTS and npm (comes with Node) - Git 완료 후 Truffle을 설치합니다.  <table><tr><td> :~ dongsik$ <b>sudo npm install -g truffle</b><br> Password:<br> /Users/dongsik/.nvm/versions/node/v6.9.5/bin/truffle -><br> /Users/dongsik/.nvm/versions/node/v6.9.5/lib/node_modules/truffle/build/cli.bundled.js<br> + [email protected]<br> updated 1 package in 4.603s<br> :~ dongsik$ </td></tr></table> Truffle 설치 확인  Ganache 설치 스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인 http://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.  설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)  ## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 Truffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.  Pet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.  생성된 기본 Truffle 디렉토리 구조 및 파일 설명 contracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. Migrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. test / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다. truffle.js : Truffle 설정 파일  ## 3. Smart Contract 작성하기 백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다. 첫 번째로, contracts > Adoption.sol 파일 추가 합니다.  심볼 (^)은 필요한 Solidity의 최소버전을 지정("표시된 버전 이상")하며, 명령문은 semicolons(;)로 끝납니다. Address라는 고유한 데이터 타입, 즉 Ethereum의 주소이며 20 bytes의 값으로 저장됩니다. ### 단일 변수 adopters 정의 Ethereum address의 배열. 배열은 하나의 유형(type)이 포함되며 고정 또는 가변 길이를 가질 수 있습니다. 이 경우 유형은 address 이며 배열의 크기는 16입니다. 또한 변수 adopters가 public임을 알 수 있습니다. Public 변수는 자동으로 getter 메소드가 가지지만, 이 경우 배열은 키가 필요하며 단일 값만 반환합니다. 나중에 UI에서 사용할 전체 배열을 반환하는 함수를 작성할 것입니다. ### 첫번째 함수 : Adopting a pet 사용자가 입양(Adoption) 요청을 할 수 있도록 허용합니다. Solidity에서는 함수 매개 변수와 출력 유형을 모두 지정 해야 합니다. 이 경우 petId (정수)를 가져 와서 정수를 반환합니다. PetId가 adopters 배열 범위 내에 있는지 확인합니다. Solidity에있는 배열은 0부터 인덱싱되므로 ID 값은 0에서 15 사이 여야합니다. ID가 범위 내에 있는지 확인하기 위해 require () 문을 사용합니다. ID가 범위 내에 있으면 우리는 adopters 배열에 호출 한 주소를 추가합니다. 이 함수를 호출 한 사람 또는 스마트 계약자의 주소는 msg.sender로 표시됩니다. 마지막으로, 제공된 애완 동물을 확인하고 반환합니다. 마지막으로, 확인을 하기 위해 전달했던 petId를 반환합니다. ### 두번째 함수 : Retrieving the adopters 위에서 언급 한 것처럼 배열 getter는 주어진 키에서 하나의 값만 반환합니다. UI에서는 모든 애완 동물의 입양 상태를 업데이트해야하지만, 16 개의 API 호출을 하는 것은 이상적이지 않습니다. 다음 단계는 전체 배열을 반환하는 함수를 작성하는 것입니다. 위에서 추가 한 adopt () 함수 다음, 스마트 계약에 getAdopters () 함수를 추가합니다. adopters 들은 이미 선언 되었으므로 간단하게 반환 할 수 있습니다. 반환 유형 (이 경우, Adopters의 유형)을 Address [16]으로 지정해야합니다. ## 4. Smart Contract 컴파일 및 마이그레이션 앞에서 간단한 Smart contract를 작성했습니다. 다음으로 컴파일 및 마이그레이션을 해보겠습니다 트러플은 내장 개발 콘솔(Truffle Develop) 가지고 있는데 개발용 블럭체인을 생성하고 이를통해 컨트랙트 배포(deploy)테스트를 해볼수 있습니다 또한 콘솔에서 직접 트러플의 명령들을 실행하는 기능도 가지고 있습니다 ### 컴파일(compilation) Solidity는 컴파일 언어 입니다. 즉, Ethereum Virtual Machine(EVM)에서 실행하기 위해 bytecode로 컴파일 해야 합니다 인간이 읽을수있는 Solidity코드를 EVM이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다  컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.  ### 마이그레이션(migration) 성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다. 마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다. migrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.  이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)  이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다 1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성 2. 2_deploy_contracts.js에 아래 내용 입력  3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다. (응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)  truffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다.  4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다  순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.) 5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.  아래는 추가된 블록의 정보  트렌젝션의 처리 정보  이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with) ## 5. Smart Contract 테스트 Truffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다. 1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다. 2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.  Assert.sol : 테스트에 사용할 다양한 assertion 을 제공합니다. 테스트에서 assertion은 같음(equality), 같지 않음(inequality), 테스트를 통과했는지 실패했는지 반환하기 위한 공백과 같은 것들을 확인 합니다. DeployedAddresses.sol : 테스트를 실행할때 Truffle은 테스트중인 컨트랙트의 새로운 인스턴스를 블록체인에 배포합니다. 이 스마트 컨트랙트는 deploy된 컨트랙트의 주소를 가져옵니다. Adoption.sol : 테스트 하고자하는 스마트 컨트랙트 <br> *주의 )처음의 두 import는 truffle 디렉토리가 아닌 전역 Truffle 파일입니다. 그래서 test/ 디렉토리 내부에 truffle 디렉토리를 볼수 없습니다. <br> 그런 다음 테스트될 스마트 컨트랙트를 포함하는 contract-wide 변수를 정의하고 address를 가져오기 위해 DeployedAddresses 스마트 컨트랙트를 호출합니다. #### adopt() 함수 테스트 adopt() 함수를 테스트하기 위해 앞서 작성한 Adoption.sol 컨트랙트의 adopt()함수를 상기해보면 함수는 성공하면 입력된 petId를 리턴하는 것을 떠올려 보기 바랍니다. 테스트 케이스에서는 ID가 반환되었는지와 전달된 ID에 대해 adopt() 함수의 반환 값을 비교하여 올바른지 확인 할 수 있습니다. 1. adoption 선언 이후에 TestAdoption.sol 스마트 컨트랙트 안에 아래의 함수(testUserCanAdoptPet)를 추가합니다  - 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다. - 그런 다음 예상 값인 8을 역시 선언합니다. - 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다. #### 입양한 Pet의 소유자 검색 테스트 앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다. 1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다.  TestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다. #### 모든 Pet의 소유자 검색 테스트 배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다. 1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. <br> adopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신 메모리에 값을 일시적으로 저장하도록 알립니다. <br> adopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. 전체 테스트 코드입니다.  #### 테스트 실행하기 이제 터미널로 돌아가서 test를 실행합니다. "truffle test"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.  ## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다. 이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다. 이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다.  #### web3 인스턴스 1.텍스트 편집기로 /src/js/app.js 파일을 엽니다. 2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다. 실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.  init 함수  Web3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다. initWeb3 함수  - 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) - 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다. - 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다. #### 컨트랙트 인스턴스 1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.  - 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다. - 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다. - 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다. - 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다. #### 입양된 Pet정보를 얻고 UI를 업데이트 1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.  - 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다. - 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다. - call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다. - getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다. - 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 "Success"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다. - 모든 오류는 콘솔에 기록(logging)됩니다. #### Adopt() 함수 다루기 1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.  - web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다. - 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 "보낸 사람"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다. - 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다. ## 7. 브라우저에서 dapp과 상호 작용 이제 Dapp을 사용할 준비가 되었습니다. #### MetaMask 설치 및 설정 브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br> 1.브라우저에 MetaMask를 설치합니다. 2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다.  3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다. 4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.  5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.  6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.   아래에 비밀번호를 입력하고 OK를 클릭합니다.  7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. "Main Network"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.  8."New RPC URL"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.  <br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다. 9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다. Truffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. 첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다.  설정이 이제 완료 되었습니다. #### lite-server 설치 및 설정 이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다. 1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  lite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. 웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다. 프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.   #### App 사용하기 1.로컬 웹 서버를 시작합니다.   dev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.  2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다. 주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어 web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다. 아래글은 Metamask QnA에 올라온 글입니다.  3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.  4.채택 된 애완 동물의 변화 옆에있는 버튼이 "Success"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.  그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :  #### Ganashe 트랜젝션 확인   지금까지 Truffle 프레임워크를 이용해서 App을 만들고 Metamask를 통해서 스마트 컨트랙트와 상호작용(Interacting) 해보는 튜토리얼을 해봤습니다. 간단한 샘플이긴하지만, 많은 Dapp들이 가져야하는 어플리케이션의 구조를 잘 설명하고 있다고 생각됩니다. 이 패턴을 통해 여러가지 목적하는 어플리케이션을 블록체인으로 구현하는 기본이 될수 있을거라고 생각합니다. |
| json metadata | {"tags":["etherum","ethereum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png","https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png","https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png","https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png","https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png","https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png","https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png","https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png","https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png","https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png","https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png","https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png","https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png","https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png","https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png","https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png","https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png","https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png","https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png","https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png","https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png","https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png","https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png","https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png","https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png","https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png","https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png","https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png","https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png","https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png","https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png","https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png","https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png","https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png","https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png","https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png","https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png","https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png","https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png","https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png","https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png","https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png","https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png","https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png","https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png","https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache","http://127.0.0.1:8545"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [Ethereum] 이더리움 트러플 튜토리얼 (Pet-shop) |
| Transaction Info | Block #22066162/Trx 01129ccb85e042e8fe0e252d26b093574efbf771 |
View Raw JSON Data
{
"block": 22066162,
"op": [
"comment",
{
"author": "dongshik",
"body": "안녕하세요.\n\nEthereum Dapp개발을 위한 truffle 튜토리얼 중 pet-shop 튜토리얼을 통해 로컬 개발환경 구성과 실행 테스트, 명령어 실행은 물론이고 스마트 컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다\n\n또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다\n\n(먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다)\n\nPet Shop 튜토리얼의 대상\n- Pet shop의 입양(Adoption) 추적 시스템 추축 과정 안내를 목표로 합니다\n- Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자를 대상으로 합니다\n\nPet Shop 튜토리얼 요건정의\n- 고객은 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있습니다\n- 한번에 16마리의 애완동물을 관리하기 위한 공간을 보유하고 있으며\n- 각 애완동물에 대한 정보 데이터 베이스를 보유하고 있습니다\n- Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp 구현을 목표로 하며\n- 기본 웹사이트의 구조와 Style을 제공합니다\n- 프론트엔드 로직과 스마트 계약을 작성하면 완성되는 형식으로 구성되어 있습니다\n\nPet Shop 튜토리얼 아키텍처\n\n4가지의 주요 기능으로 구성되며 순차적으로 하나씩 살펴 보겠습니다\n\n튜토리얼 순서\n\n1. 개발 환경 설정\n2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\n3. Smart Contract 작성하기\n4. Smart Contract 컴파일 및 마이그레이션\n5. Smart Contract 테스트\n6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n7. 브라우저에서 dapp과 상호 작용\n\n(MacOS를 기준으로 작성합니다)\n\n## 1. 개발 환경 설정\n\n먼저 Truffle 설치 전에 아래 두가지를 설치합니다.\n- Node.js v6+ LTS and npm (comes with Node)\n- Git\n\n완료 후 Truffle을 설치합니다.\n\n<table><tr><td>\n:~ dongsik$ <b>sudo npm install -g truffle</b><br>\nPassword:<br>\n/Users/dongsik/.nvm/versions/node/v6.9.5/bin/truffle -><br> /Users/dongsik/.nvm/versions/node/v6.9.5/lib/node_modules/truffle/build/cli.bundled.js<br>\n+ [email protected]<br>\nupdated 1 package in 4.603s<br>\n:~ dongsik$\n</td></tr></table>\n\nTruffle 설치 확인\n\n\nGanache 설치\n스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인\nhttp://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.\n\n\n설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)\n\n\n## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\nTruffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.\n\n\nPet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.\n\n\n생성된 기본 Truffle 디렉토리 구조 및 파일 설명\ncontracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. \n\nMigrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. \n\ntest / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다.\n\ntruffle.js : Truffle 설정 파일\n\n\n\n## 3. Smart Contract 작성하기\n백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다.\n첫 번째로, contracts > Adoption.sol 파일 추가 합니다.\n\n\n심볼 (^)은 필요한 Solidity의 최소버전을 지정(\"표시된 버전 이상\")하며, 명령문은 semicolons(;)로 끝납니다.\n\nAddress라는 고유한 데이터 타입, 즉 Ethereum의 주소이며 20 bytes의 값으로 저장됩니다.\n\n### 단일 변수 adopters 정의\nEthereum address의 배열. 배열은 하나의 유형(type)이 포함되며 고정 또는 가변 길이를 가질 수 있습니다. 이 경우 유형은 address 이며 배열의 크기는 16입니다.\n\n또한 변수 adopters가 public임을 알 수 있습니다. Public 변수는 자동으로 getter 메소드가 가지지만, 이 경우 배열은 키가 필요하며 단일 값만 반환합니다. 나중에 UI에서 사용할 전체 배열을 반환하는 함수를 작성할 것입니다.\n\n### 첫번째 함수 : Adopting a pet\n사용자가 입양(Adoption) 요청을 할 수 있도록 허용합니다.\nSolidity에서는 함수 매개 변수와 출력 유형을 모두 지정 해야 합니다. 이 경우 petId (정수)를 가져 와서 정수를 반환합니다.\nPetId가 adopters 배열 범위 내에 있는지 확인합니다. Solidity에있는 배열은 0부터 인덱싱되므로 ID 값은 0에서 15 사이 여야합니다. ID가 범위 내에 있는지 확인하기 위해 require () 문을 사용합니다.\n\nID가 범위 내에 있으면 우리는 adopters 배열에 호출 한 주소를 추가합니다. 이 함수를 호출 한 사람 또는 스마트 계약자의 주소는 msg.sender로 표시됩니다. 마지막으로, 제공된 애완 동물을 확인하고 반환합니다.\n\n마지막으로, 확인을 하기 위해 전달했던 petId를 반환합니다.\n\n### 두번째 함수 : Retrieving the adopters\n위에서 언급 한 것처럼 배열 getter는 주어진 키에서 하나의 값만 반환합니다. UI에서는 모든 애완 동물의 입양 상태를 업데이트해야하지만, 16 개의 API 호출을 하는 것은 이상적이지 않습니다. 다음 단계는 전체 배열을 반환하는 함수를 작성하는 것입니다.\n\n위에서 추가 한 adopt () 함수 다음, 스마트 계약에 getAdopters () 함수를 추가합니다.\n\nadopters 들은 이미 선언 되었으므로 간단하게 반환 할 수 있습니다. 반환 유형 (이 경우, Adopters의 유형)을 Address [16]으로 지정해야합니다.\n\n\n## 4. Smart Contract 컴파일 및 마이그레이션\n앞에서 간단한 Smart contract를 작성했습니다. 다음으로 컴파일 및 마이그레이션을 해보겠습니다\n\n트러플은 내장 개발 콘솔(Truffle Develop) 가지고 있는데 개발용 블럭체인을 생성하고 이를통해 컨트랙트 배포(deploy)테스트를 해볼수 있습니다\n\n또한 콘솔에서 직접 트러플의 명령들을 실행하는 기능도 가지고 있습니다\n\n### 컴파일(compilation)\nSolidity는 컴파일 언어 입니다. 즉, Ethereum Virtual Machine(EVM)에서 실행하기 위해 bytecode로 컴파일 해야 합니다\n\n인간이 읽을수있는 Solidity코드를 EVM이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다\n\n\n\n컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.\n\n\n### 마이그레이션(migration)\n성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다.\n마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다.\n\nmigrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.\n\n\n이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)\n\n\n이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다\n\n1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성\n2. 2_deploy_contracts.js에 아래 내용 입력\n\n\n3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다.\n(응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)\n\ntruffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다.\n\n\n4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다\n\n순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.)\n\n5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.\n\n아래는 추가된 블록의 정보\n\n트렌젝션의 처리 정보\n\n이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with)\n\n\n## 5. Smart Contract 테스트\nTruffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다.\n\n1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다.\n2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.\n\nAssert.sol : 테스트에 사용할 다양한 assertion 을 제공합니다. 테스트에서 assertion은 같음(equality), 같지 않음(inequality), 테스트를 통과했는지 실패했는지 반환하기 위한 공백과 같은 것들을 확인 합니다.\nDeployedAddresses.sol : 테스트를 실행할때 Truffle은 테스트중인 컨트랙트의 새로운 인스턴스를 블록체인에 배포합니다. 이 스마트 컨트랙트는 deploy된 컨트랙트의 주소를 가져옵니다.\nAdoption.sol : 테스트 하고자하는 스마트 컨트랙트 <br>\n*주의 )처음의 두 import는 truffle 디렉토리가 아닌 전역 Truffle 파일입니다. 그래서 test/ 디렉토리 내부에 truffle 디렉토리를 볼수 없습니다. <br>\n그런 다음 테스트될 스마트 컨트랙트를 포함하는 contract-wide 변수를 정의하고 address를 가져오기 위해 DeployedAddresses 스마트 컨트랙트를 호출합니다.\n#### adopt() 함수 테스트\nadopt() 함수를 테스트하기 위해 앞서 작성한 Adoption.sol 컨트랙트의 adopt()함수를 상기해보면 함수는 성공하면 입력된 petId를 리턴하는 것을 떠올려 보기 바랍니다. 테스트 케이스에서는 ID가 반환되었는지와 전달된 ID에 대해 adopt() 함수의 반환 값을 비교하여 올바른지 확인 할 수 있습니다.\n\n1. adoption 선언 이후에 TestAdoption.sol 스마트 컨트랙트 안에 아래의 함수(testUserCanAdoptPet)를 추가합니다 \n\n- 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다.\n- 그런 다음 예상 값인 8을 역시 선언합니다.\n- 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다.\n\n#### 입양한 Pet의 소유자 검색 테스트\n앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다.\n\n1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다.\n\nTestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다.\n\n#### 모든 Pet의 소유자 검색 테스트\n배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다.\n1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. \n<br>\nadopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신 메모리에 값을 일시적으로 저장하도록 알립니다. <br>\nadopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. \n\n전체 테스트 코드입니다.\n\n\n#### 테스트 실행하기\n이제 터미널로 돌아가서 test를 실행합니다.\n\"truffle test\"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.\n\n\n\n## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다.\n이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다.\n\n이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. \n\n\n#### web3 인스턴스 \n1.텍스트 편집기로 /src/js/app.js 파일을 엽니다.\n\n2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다.\n실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.\n\ninit 함수\n\nWeb3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다.\ninitWeb3 함수\n\n- 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) \n- 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다.\n- 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다.\n\n#### 컨트랙트 인스턴스 \n1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.\n\n- 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다.\n- 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다.\n- 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다.\n- 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다. \n\n#### 입양된 Pet정보를 얻고 UI를 업데이트 \n1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.\n\n- 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다.\n- 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다.\n- call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다.\n- getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다.\n- 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 \"Success\"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다.\n- 모든 오류는 콘솔에 기록(logging)됩니다.\n\n#### Adopt() 함수 다루기\n1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.\n\n- web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다.\n- 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 \"보낸 사람\"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다.\n- 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다.\n\n## 7. 브라우저에서 dapp과 상호 작용\n이제 Dapp을 사용할 준비가 되었습니다.\n\n#### MetaMask 설치 및 설정\n브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br>\n1.브라우저에 MetaMask를 설치합니다.\n2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다.\n\n3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다.\n4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.\n\n5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.\n\n6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.\n\n\n아래에 비밀번호를 입력하고 OK를 클릭합니다.\n\n7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. \"Main Network\"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.\n\n8.\"New RPC URL\"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.\n\n<br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다.\n9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다.\nTruffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. \n첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. \n\n설정이 이제 완료 되었습니다.\n\n#### lite-server 설치 및 설정\n이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다.\n\n1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다. \n\nlite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. \n웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다.\n\n프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.\n\n\n\n\n#### App 사용하기\n1.로컬 웹 서버를 시작합니다.\n\n\n\ndev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.\n\n\n2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다.\n\n주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어 web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다.\n아래글은 Metamask QnA에 올라온 글입니다.\n\n\n3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.\n\n4.채택 된 애완 동물의 변화 옆에있는 버튼이 \"Success\"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.\n\n그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :\n\n\n\n\n#### Ganashe 트랜젝션 확인\n\n\n\n지금까지 Truffle 프레임워크를 이용해서 App을 만들고 Metamask를 통해서 스마트 컨트랙트와 상호작용(Interacting) 해보는 튜토리얼을 해봤습니다. 간단한 샘플이긴하지만, 많은 Dapp들이 가져야하는 어플리케이션의 구조를 잘 설명하고 있다고 생각됩니다. 이 패턴을 통해 여러가지 목적하는 어플리케이션을 블록체인으로 구현하는 기본이 될수 있을거라고 생각합니다.",
"json_metadata": "{\"tags\":[\"etherum\",\"ethereum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\",\"https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png\",\"https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png\",\"https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png\",\"https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png\",\"https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png\",\"https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png\",\"https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png\",\"https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png\",\"https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png\",\"https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png\",\"https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png\",\"https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png\",\"https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png\",\"https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png\",\"https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png\",\"https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png\",\"https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png\",\"https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png\",\"https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png\",\"https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png\",\"https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png\",\"https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png\",\"https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png\",\"https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png\",\"https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png\",\"https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png\",\"https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png\",\"https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png\",\"https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png\",\"https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png\",\"https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png\",\"https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png\",\"https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png\",\"https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png\",\"https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png\",\"https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png\",\"https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png\",\"https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png\",\"https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png\",\"https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png\",\"https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png\",\"https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png\",\"https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png\",\"https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png\",\"https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\",\"http://127.0.0.1:8545\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[Ethereum] 이더리움 트러플 튜토리얼 (Pet-shop)"
}
],
"op_in_trx": 0,
"timestamp": "2018-05-02T03:08:51",
"trx_id": "01129ccb85e042e8fe0e252d26b093574efbf771",
"trx_in_block": 14,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/05/02 03:07:39
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/05/02 03:07:39
| author | dongshik |
| body | 안녕하세요. Ethereum Dapp개발을 위한 truffle 튜토리얼 중 pet-shop 튜토리얼을 통해 로컬 개발환경 구성과 실행 테스트, 명령어 실행은 물론이고 스마트 컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다 또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다 (먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다) Pet Shop 튜토리얼의 대상 - Pet shop의 입양(Adoption) 추적 시스템 추축 과정 안내를 목표로 합니다 - Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자를 대상으로 합니다 Pet Shop 튜토리얼 요건정의 - 고객은 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있습니다 - 한번에 16마리의 애완동물을 관리하기 위한 공간을 보유하고 있으며 - 각 애완동물에 대한 정보 데이터 베이스를 보유하고 있습니다 - Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp 구현을 목표로 하며 - 기본 웹사이트의 구조와 Style을 제공합니다 - 프론트엔드 로직과 스마트 계약을 작성하면 완성되는 형식으로 구성되어 있습니다 Pet Shop 튜토리얼 아키텍처  4가지의 주요 기능으로 구성되며 순차적으로 하나씩 살펴 보겠습니다 튜토리얼 순서 1. 개발 환경 설정 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 3. Smart Contract 작성하기 4. Smart Contract 컴파일 및 마이그레이션 5. Smart Contract 테스트 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 7. 브라우저에서 dapp과 상호 작용 (MacOS를 기준으로 작성합니다) ## 1. 개발 환경 설정 먼저 Truffle 설치 전에 아래 두가지를 설치합니다. - Node.js v6+ LTS and npm (comes with Node) - Git 완료 후 Truffle을 설치합니다.  <table><tr><td> :~ dongsik$ <b>sudo npm install -g truffle</b><br> Password:<br> /Users/dongsik/.nvm/versions/node/v6.9.5/bin/truffle -><br> /Users/dongsik/.nvm/versions/node/v6.9.5/lib/node_modules/truffle/build/cli.bundled.js<br> + [email protected]<br> updated 1 package in 4.603s<br> :~ dongsik$ </td></tr></table> Truffle 설치 확인  Ganache 설치 스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인 http://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.  설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)  ## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 Truffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.  Pet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.  생성된 기본 Truffle 디렉토리 구조 및 파일 설명 contracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. Migrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. test / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다. truffle.js : Truffle 설정 파일  ## 3. Smart Contract 작성하기 백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다. 첫 번째로, contracts > Adoption.sol 파일 추가 합니다.  심볼 (^)은 필요한 Solidity의 최소버전을 지정("표시된 버전 이상")하며, 명령문은 semicolons(;)로 끝납니다. Address라는 고유한 데이터 타입, 즉 Ethereum의 주소이며 20 bytes의 값으로 저장됩니다. ### 단일 변수 adopters 정의 Ethereum address의 배열. 배열은 하나의 유형(type)이 포함되며 고정 또는 가변 길이를 가질 수 있습니다. 이 경우 유형은 address 이며 배열의 크기는 16입니다. 또한 변수 adopters가 public임을 알 수 있습니다. Public 변수는 자동으로 getter 메소드가 가지지만, 이 경우 배열은 키가 필요하며 단일 값만 반환합니다. 나중에 UI에서 사용할 전체 배열을 반환하는 함수를 작성할 것입니다. ### 첫번째 함수 : Adopting a pet 사용자가 입양(Adoption) 요청을 할 수 있도록 허용합니다. Solidity에서는 함수 매개 변수와 출력 유형을 모두 지정 해야 합니다. 이 경우 petId (정수)를 가져 와서 정수를 반환합니다. PetId가 adopters 배열 범위 내에 있는지 확인합니다. Solidity에있는 배열은 0부터 인덱싱되므로 ID 값은 0에서 15 사이 여야합니다. ID가 범위 내에 있는지 확인하기 위해 require () 문을 사용합니다. ID가 범위 내에 있으면 우리는 adopters 배열에 호출 한 주소를 추가합니다. 이 함수를 호출 한 사람 또는 스마트 계약자의 주소는 msg.sender로 표시됩니다. 마지막으로, 제공된 애완 동물을 확인하고 반환합니다. 마지막으로, 확인을 하기 위해 전달했던 petId를 반환합니다. ### 두번째 함수 : Retrieving the adopters 위에서 언급 한 것처럼 배열 getter는 주어진 키에서 하나의 값만 반환합니다. UI에서는 모든 애완 동물의 입양 상태를 업데이트해야하지만, 16 개의 API 호출을 하는 것은 이상적이지 않습니다. 다음 단계는 전체 배열을 반환하는 함수를 작성하는 것입니다. 위에서 추가 한 adopt () 함수 다음, 스마트 계약에 getAdopters () 함수를 추가합니다. adopters 들은 이미 선언 되었으므로 간단하게 반환 할 수 있습니다. 반환 유형 (이 경우, Adopters의 유형)을 Address [16]으로 지정해야합니다. ## 4. Smart Contract 컴파일 및 마이그레이션 앞에서 간단한 Smart contract를 작성했습니다. 다음으로 컴파일 및 마이그레이션을 해보겠습니다 트러플은 내장 개발 콘솔(Truffle Develop) 가지고 있는데 개발용 블럭체인을 생성하고 이를통해 컨트랙트 배포(deploy)테스트를 해볼수 있습니다 또한 콘솔에서 직접 트러플의 명령들을 실행하는 기능도 가지고 있습니다 ### 컴파일(compilation) Solidity는 컴파일 언어 입니다. 즉, Ethereum Virtual Machine(EVM)에서 실행하기 위해 bytecode로 컴파일 해야 합니다 인간이 읽을수있는 Solidity코드를 EVM이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다  컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.  ### 마이그레이션(migration) 성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다. 마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다. migrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.  이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)  이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다 1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성 2. 2_deploy_contracts.js에 아래 내용 입력  3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다. (응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)  truffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다.  4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다  순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.) 5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.  아래는 추가된 블록의 정보  트렌젝션의 처리 정보  이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with) ## 5. Smart Contract 테스트 Truffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다. 1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다. 2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.  Assert.sol : 테스트에 사용할 다양한 assertion 을 제공합니다. 테스트에서 assertion은 같음(equality), 같지 않음(inequality), 테스트를 통과했는지 실패했는지 반환하기 위한 공백과 같은 것들을 확인 합니다. DeployedAddresses.sol : 테스트를 실행할때 Truffle은 테스트중인 컨트랙트의 새로운 인스턴스를 블록체인에 배포합니다. 이 스마트 컨트랙트는 deploy된 컨트랙트의 주소를 가져옵니다. Adoption.sol : 테스트 하고자하는 스마트 컨트랙트 <br> *주의 )처음의 두 import는 truffle 디렉토리가 아닌 전역 Truffle 파일입니다. 그래서 test/ 디렉토리 내부에 truffle 디렉토리를 볼수 없습니다. <br> 그런 다음 테스트될 스마트 컨트랙트를 포함하는 contract-wide 변수를 정의하고 address를 가져오기 위해 DeployedAddresses 스마트 컨트랙트를 호출합니다. #### adopt() 함수 테스트 adopt() 함수를 테스트하기 위해 앞서 작성한 Adoption.sol 컨트랙트의 adopt()함수를 상기해보면 함수는 성공하면 입력된 petId를 리턴하는 것을 떠올려 보기 바랍니다. 테스트 케이스에서는 ID가 반환되었는지와 전달된 ID에 대해 adopt() 함수의 반환 값을 비교하여 올바른지 확인 할 수 있습니다. 1. adoption 선언 이후에 TestAdoption.sol 스마트 컨트랙트 안에 아래의 함수(testUserCanAdoptPet)를 추가합니다  - 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다. - 그런 다음 예상 값인 8을 역시 선언합니다. - 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다. #### 입양한 Pet의 소유자 검색 테스트 앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다. 1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다.  TestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다. #### 모든 Pet의 소유자 검색 테스트 배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다. 1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. <br> adopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신 메모리에 값을 일시적으로 저장하도록 알립니다. <br> adopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. 전체 테스트 코드입니다.  #### 테스트 실행하기 이제 터미널로 돌아가서 test를 실행합니다. "truffle test"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.  ## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다. 이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다. 이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다.  #### web3 인스턴스 1.텍스트 편집기로 /src/js/app.js 파일을 엽니다. 2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다. 실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.  init 함수  Web3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다. initWeb3 함수  - 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) - 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다. - 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다. #### 컨트랙트 인스턴스 1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.  - 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다. - 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다. - 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다. - 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다. #### 입양된 Pet정보를 얻고 UI를 업데이트 1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.  - 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다. - 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다. - call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다. - getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다. - 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 "Success"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다. - 모든 오류는 콘솔에 기록(logging)됩니다. #### Adopt() 함수 다루기 1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.  - web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다. - 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 "보낸 사람"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다. - 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다. ## 7. 브라우저에서 dapp과 상호 작용 이제 Dapp을 사용할 준비가 되었습니다. #### MetaMask 설치 및 설정 브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br> 1.브라우저에 MetaMask를 설치합니다. 2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다.  3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다. 4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.  5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.  6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.   아래에 비밀번호를 입력하고 OK를 클릭합니다.  7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. "Main Network"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.  8."New RPC URL"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.  <br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다. 9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다. Truffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. 첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다.  설정이 이제 완료 되었습니다. #### lite-server 설치 및 설정 이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다. 1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  lite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. 웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다. 프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.   #### App 사용하기 1.로컬 웹 서버를 시작합니다.   dev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.  2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다. 주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어 web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다. 아래글은 Metamask QnA에 올라온 글입니다.  3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.  4.채택 된 애완 동물의 변화 옆에있는 버튼이 "Success"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.  그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :  #### Ganashe 트랜젝션 확인   지금까지 Truffle 프레임워크를 이용해서 App을 만들고 Metamask를 통해서 스마트 컨트랙트와 상호작용(Interacting) 해보는 튜토리얼을 해봤습니다. 간단한 샘플이긴하지만, 많은 Dapp들이 가져야하는 어플리케이션의 구조를 잘 설명하고 있다고 생각됩니다. 이 패턴을 통해 여러가지 목적하는 어플리케이션을 블록체인으로 구현하는 기본이 될수 있을거라고 생각합니다. |
| json metadata | {"tags":["ethereum","pet-shop","truffle","tutorial","etherum"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png","https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png","https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png","https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png","https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png","https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png","https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png","https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png","https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png","https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png","https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png","https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png","https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png","https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png","https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png","https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png","https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png","https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png","https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png","https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png","https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png","https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png","https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png","https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png","https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png","https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png","https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png","https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png","https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png","https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png","https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png","https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png","https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png","https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png","https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png","https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png","https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png","https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png","https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png","https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png","https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png","https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png","https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png","https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png","https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png","https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache","http://127.0.0.1:8545"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [Ethereum] 이더리움 Pet-shop 트러플 튜토리얼 |
| Transaction Info | Block #22066138/Trx 44d604753754c958d969a84db9b9700b0a7efc85 |
View Raw JSON Data
{
"block": 22066138,
"op": [
"comment",
{
"author": "dongshik",
"body": "안녕하세요.\n\nEthereum Dapp개발을 위한 truffle 튜토리얼 중 pet-shop 튜토리얼을 통해 로컬 개발환경 구성과 실행 테스트, 명령어 실행은 물론이고 스마트 컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다\n\n또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다\n\n(먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다)\n\nPet Shop 튜토리얼의 대상\n- Pet shop의 입양(Adoption) 추적 시스템 추축 과정 안내를 목표로 합니다\n- Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자를 대상으로 합니다\n\nPet Shop 튜토리얼 요건정의\n- 고객은 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있습니다\n- 한번에 16마리의 애완동물을 관리하기 위한 공간을 보유하고 있으며\n- 각 애완동물에 대한 정보 데이터 베이스를 보유하고 있습니다\n- Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp 구현을 목표로 하며\n- 기본 웹사이트의 구조와 Style을 제공합니다\n- 프론트엔드 로직과 스마트 계약을 작성하면 완성되는 형식으로 구성되어 있습니다\n\nPet Shop 튜토리얼 아키텍처\n\n4가지의 주요 기능으로 구성되며 순차적으로 하나씩 살펴 보겠습니다\n\n튜토리얼 순서\n\n1. 개발 환경 설정\n2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\n3. Smart Contract 작성하기\n4. Smart Contract 컴파일 및 마이그레이션\n5. Smart Contract 테스트\n6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n7. 브라우저에서 dapp과 상호 작용\n\n(MacOS를 기준으로 작성합니다)\n\n## 1. 개발 환경 설정\n\n먼저 Truffle 설치 전에 아래 두가지를 설치합니다.\n- Node.js v6+ LTS and npm (comes with Node)\n- Git\n\n완료 후 Truffle을 설치합니다.\n\n<table><tr><td>\n:~ dongsik$ <b>sudo npm install -g truffle</b><br>\nPassword:<br>\n/Users/dongsik/.nvm/versions/node/v6.9.5/bin/truffle -><br> /Users/dongsik/.nvm/versions/node/v6.9.5/lib/node_modules/truffle/build/cli.bundled.js<br>\n+ [email protected]<br>\nupdated 1 package in 4.603s<br>\n:~ dongsik$\n</td></tr></table>\n\nTruffle 설치 확인\n\n\nGanache 설치\n스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인\nhttp://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.\n\n\n설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)\n\n\n## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\nTruffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.\n\n\nPet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.\n\n\n생성된 기본 Truffle 디렉토리 구조 및 파일 설명\ncontracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. \n\nMigrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. \n\ntest / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다.\n\ntruffle.js : Truffle 설정 파일\n\n\n\n## 3. Smart Contract 작성하기\n백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다.\n첫 번째로, contracts > Adoption.sol 파일 추가 합니다.\n\n\n심볼 (^)은 필요한 Solidity의 최소버전을 지정(\"표시된 버전 이상\")하며, 명령문은 semicolons(;)로 끝납니다.\n\nAddress라는 고유한 데이터 타입, 즉 Ethereum의 주소이며 20 bytes의 값으로 저장됩니다.\n\n### 단일 변수 adopters 정의\nEthereum address의 배열. 배열은 하나의 유형(type)이 포함되며 고정 또는 가변 길이를 가질 수 있습니다. 이 경우 유형은 address 이며 배열의 크기는 16입니다.\n\n또한 변수 adopters가 public임을 알 수 있습니다. Public 변수는 자동으로 getter 메소드가 가지지만, 이 경우 배열은 키가 필요하며 단일 값만 반환합니다. 나중에 UI에서 사용할 전체 배열을 반환하는 함수를 작성할 것입니다.\n\n### 첫번째 함수 : Adopting a pet\n사용자가 입양(Adoption) 요청을 할 수 있도록 허용합니다.\nSolidity에서는 함수 매개 변수와 출력 유형을 모두 지정 해야 합니다. 이 경우 petId (정수)를 가져 와서 정수를 반환합니다.\nPetId가 adopters 배열 범위 내에 있는지 확인합니다. Solidity에있는 배열은 0부터 인덱싱되므로 ID 값은 0에서 15 사이 여야합니다. ID가 범위 내에 있는지 확인하기 위해 require () 문을 사용합니다.\n\nID가 범위 내에 있으면 우리는 adopters 배열에 호출 한 주소를 추가합니다. 이 함수를 호출 한 사람 또는 스마트 계약자의 주소는 msg.sender로 표시됩니다. 마지막으로, 제공된 애완 동물을 확인하고 반환합니다.\n\n마지막으로, 확인을 하기 위해 전달했던 petId를 반환합니다.\n\n### 두번째 함수 : Retrieving the adopters\n위에서 언급 한 것처럼 배열 getter는 주어진 키에서 하나의 값만 반환합니다. UI에서는 모든 애완 동물의 입양 상태를 업데이트해야하지만, 16 개의 API 호출을 하는 것은 이상적이지 않습니다. 다음 단계는 전체 배열을 반환하는 함수를 작성하는 것입니다.\n\n위에서 추가 한 adopt () 함수 다음, 스마트 계약에 getAdopters () 함수를 추가합니다.\n\nadopters 들은 이미 선언 되었으므로 간단하게 반환 할 수 있습니다. 반환 유형 (이 경우, Adopters의 유형)을 Address [16]으로 지정해야합니다.\n\n\n## 4. Smart Contract 컴파일 및 마이그레이션\n앞에서 간단한 Smart contract를 작성했습니다. 다음으로 컴파일 및 마이그레이션을 해보겠습니다\n\n트러플은 내장 개발 콘솔(Truffle Develop) 가지고 있는데 개발용 블럭체인을 생성하고 이를통해 컨트랙트 배포(deploy)테스트를 해볼수 있습니다\n\n또한 콘솔에서 직접 트러플의 명령들을 실행하는 기능도 가지고 있습니다\n\n### 컴파일(compilation)\nSolidity는 컴파일 언어 입니다. 즉, Ethereum Virtual Machine(EVM)에서 실행하기 위해 bytecode로 컴파일 해야 합니다\n\n인간이 읽을수있는 Solidity코드를 EVM이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다\n\n\n\n컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.\n\n\n### 마이그레이션(migration)\n성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다.\n마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다.\n\nmigrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.\n\n\n이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)\n\n\n이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다\n\n1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성\n2. 2_deploy_contracts.js에 아래 내용 입력\n\n\n3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다.\n(응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)\n\ntruffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다.\n\n\n4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다\n\n순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.)\n\n5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.\n\n아래는 추가된 블록의 정보\n\n트렌젝션의 처리 정보\n\n이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with)\n\n\n## 5. Smart Contract 테스트\nTruffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다.\n\n1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다.\n2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.\n\nAssert.sol : 테스트에 사용할 다양한 assertion 을 제공합니다. 테스트에서 assertion은 같음(equality), 같지 않음(inequality), 테스트를 통과했는지 실패했는지 반환하기 위한 공백과 같은 것들을 확인 합니다.\nDeployedAddresses.sol : 테스트를 실행할때 Truffle은 테스트중인 컨트랙트의 새로운 인스턴스를 블록체인에 배포합니다. 이 스마트 컨트랙트는 deploy된 컨트랙트의 주소를 가져옵니다.\nAdoption.sol : 테스트 하고자하는 스마트 컨트랙트 <br>\n*주의 )처음의 두 import는 truffle 디렉토리가 아닌 전역 Truffle 파일입니다. 그래서 test/ 디렉토리 내부에 truffle 디렉토리를 볼수 없습니다. <br>\n그런 다음 테스트될 스마트 컨트랙트를 포함하는 contract-wide 변수를 정의하고 address를 가져오기 위해 DeployedAddresses 스마트 컨트랙트를 호출합니다.\n#### adopt() 함수 테스트\nadopt() 함수를 테스트하기 위해 앞서 작성한 Adoption.sol 컨트랙트의 adopt()함수를 상기해보면 함수는 성공하면 입력된 petId를 리턴하는 것을 떠올려 보기 바랍니다. 테스트 케이스에서는 ID가 반환되었는지와 전달된 ID에 대해 adopt() 함수의 반환 값을 비교하여 올바른지 확인 할 수 있습니다.\n\n1. adoption 선언 이후에 TestAdoption.sol 스마트 컨트랙트 안에 아래의 함수(testUserCanAdoptPet)를 추가합니다 \n\n- 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다.\n- 그런 다음 예상 값인 8을 역시 선언합니다.\n- 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다.\n\n#### 입양한 Pet의 소유자 검색 테스트\n앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다.\n\n1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다.\n\nTestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다.\n\n#### 모든 Pet의 소유자 검색 테스트\n배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다.\n1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. \n<br>\nadopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신 메모리에 값을 일시적으로 저장하도록 알립니다. <br>\nadopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. \n\n전체 테스트 코드입니다.\n\n\n#### 테스트 실행하기\n이제 터미널로 돌아가서 test를 실행합니다.\n\"truffle test\"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.\n\n\n\n## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다.\n이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다.\n\n이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. \n\n\n#### web3 인스턴스 \n1.텍스트 편집기로 /src/js/app.js 파일을 엽니다.\n\n2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다.\n실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.\n\ninit 함수\n\nWeb3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다.\ninitWeb3 함수\n\n- 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) \n- 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다.\n- 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다.\n\n#### 컨트랙트 인스턴스 \n1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.\n\n- 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다.\n- 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다.\n- 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다.\n- 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다. \n\n#### 입양된 Pet정보를 얻고 UI를 업데이트 \n1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.\n\n- 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다.\n- 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다.\n- call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다.\n- getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다.\n- 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 \"Success\"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다.\n- 모든 오류는 콘솔에 기록(logging)됩니다.\n\n#### Adopt() 함수 다루기\n1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.\n\n- web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다.\n- 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 \"보낸 사람\"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다.\n- 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다.\n\n## 7. 브라우저에서 dapp과 상호 작용\n이제 Dapp을 사용할 준비가 되었습니다.\n\n#### MetaMask 설치 및 설정\n브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br>\n1.브라우저에 MetaMask를 설치합니다.\n2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다.\n\n3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다.\n4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.\n\n5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.\n\n6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.\n\n\n아래에 비밀번호를 입력하고 OK를 클릭합니다.\n\n7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. \"Main Network\"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.\n\n8.\"New RPC URL\"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.\n\n<br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다.\n9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다.\nTruffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. \n첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. \n\n설정이 이제 완료 되었습니다.\n\n#### lite-server 설치 및 설정\n이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다.\n\n1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다. \n\nlite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. \n웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다.\n\n프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.\n\n\n\n\n#### App 사용하기\n1.로컬 웹 서버를 시작합니다.\n\n\n\ndev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.\n\n\n2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다.\n\n주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어 web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다.\n아래글은 Metamask QnA에 올라온 글입니다.\n\n\n3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.\n\n4.채택 된 애완 동물의 변화 옆에있는 버튼이 \"Success\"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.\n\n그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :\n\n\n\n\n#### Ganashe 트랜젝션 확인\n\n\n\n지금까지 Truffle 프레임워크를 이용해서 App을 만들고 Metamask를 통해서 스마트 컨트랙트와 상호작용(Interacting) 해보는 튜토리얼을 해봤습니다. 간단한 샘플이긴하지만, 많은 Dapp들이 가져야하는 어플리케이션의 구조를 잘 설명하고 있다고 생각됩니다. 이 패턴을 통해 여러가지 목적하는 어플리케이션을 블록체인으로 구현하는 기본이 될수 있을거라고 생각합니다.",
"json_metadata": "{\"tags\":[\"ethereum\",\"pet-shop\",\"truffle\",\"tutorial\",\"etherum\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\",\"https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png\",\"https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png\",\"https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png\",\"https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png\",\"https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png\",\"https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png\",\"https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png\",\"https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png\",\"https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png\",\"https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png\",\"https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png\",\"https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png\",\"https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png\",\"https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png\",\"https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png\",\"https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png\",\"https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png\",\"https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png\",\"https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png\",\"https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png\",\"https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png\",\"https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png\",\"https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png\",\"https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png\",\"https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png\",\"https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png\",\"https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png\",\"https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png\",\"https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png\",\"https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png\",\"https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png\",\"https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png\",\"https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png\",\"https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png\",\"https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png\",\"https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png\",\"https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png\",\"https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png\",\"https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png\",\"https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png\",\"https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png\",\"https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png\",\"https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png\",\"https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png\",\"https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\",\"http://127.0.0.1:8545\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[Ethereum] 이더리움 Pet-shop 트러플 튜토리얼"
}
],
"op_in_trx": 0,
"timestamp": "2018-05-02T03:07:39",
"trx_id": "44d604753754c958d969a84db9b9700b0a7efc85",
"trx_in_block": 15,
"virtual_op": 0
}dongshikmuted @bboyghost2018/05/02 03:02:45
dongshikmuted @bboyghost
2018/05/02 03:02:45
| id | follow |
| json | ["follow",{"follower":"dongshik","following":"bboyghost","what":["ignore"]}] |
| required auths | [] |
| required posting auths | ["dongshik"] |
| Transaction Info | Block #22066040/Trx 07c4bd47d377711e4c953fd7e526e0ef033c4f25 |
View Raw JSON Data
{
"block": 22066040,
"op": [
"custom_json",
{
"id": "follow",
"json": "[\"follow\",{\"follower\":\"dongshik\",\"following\":\"bboyghost\",\"what\":[\"ignore\"]}]",
"required_auths": [],
"required_posting_auths": [
"dongshik"
]
}
],
"op_in_trx": 0,
"timestamp": "2018-05-02T03:02:45",
"trx_id": "07c4bd47d377711e4c953fd7e526e0ef033c4f25",
"trx_in_block": 39,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/05/01 11:37:36
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/05/01 11:37:36
| author | dongshik |
| body | 안녕하세요. Ethereum Dapp개발을 위한 truffle 튜토리얼 중 pet-shop 튜토리얼을 통해 로컬 개발환경 구성과 실행 테스트, 명령어 실행은 물론이고 스마트 컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다 또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다 (먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다) Pet Shop 튜토리얼의 대상 - Pet shop의 입양(Adoption) 추적 시스템 추축 과정 안내를 목표로 합니다 - Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자를 대상으로 합니다 Pet Shop 튜토리얼 요건정의 - 고객은 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있습니다 - 한번에 16마리의 애완동물을 관리하기 위한 공간을 보유하고 있으며 - 각 애완동물에 대한 정보 데이터 베이스를 보유하고 있습니다 - Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp 구현을 목표로 하며 - 기본 웹사이트의 구조와 Style을 제공합니다 - 프론트엔드 로직과 스마트 계약을 작성하면 완성되는 형식으로 구성되어 있습니다 Pet Shop 튜토리얼 아키텍처  4가지의 주요 기능으로 구성되며 순차적으로 하나씩 살펴 보겠습니다 튜토리얼 순서 1. 개발 환경 설정 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 3. Smart Contract 작성하기 4. Smart Contract 컴파일 및 마이그레이션 5. Smart Contract 테스트 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 7. 브라우저에서 dapp과 상호 작용 (MacOS를 기준으로 작성합니다) ## 1. 개발 환경 설정 먼저 Truffle 설치 전에 아래 두가지를 설치합니다. - Node.js v6+ LTS and npm (comes with Node) - Git 완료 후 Truffle을 설치합니다.  <table><tr><td> :~ dongsik$ <b>sudo npm install -g truffle</b><br> Password:<br> /Users/dongsik/.nvm/versions/node/v6.9.5/bin/truffle -><br> /Users/dongsik/.nvm/versions/node/v6.9.5/lib/node_modules/truffle/build/cli.bundled.js<br> + [email protected]<br> updated 1 package in 4.603s<br> :~ dongsik$ </td></tr></table> Truffle 설치 확인  Ganache 설치 스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인 http://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.  설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)  ## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 Truffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.  Pet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.  생성된 기본 Truffle 디렉토리 구조 및 파일 설명 contracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. Migrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. test / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다. truffle.js : Truffle 설정 파일  ## 3. Smart Contract 작성하기 백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다. 첫 번째로, contracts > Adoption.sol 파일 추가 합니다.  심볼 (^)은 필요한 Solidity의 최소버전을 지정("표시된 버전 이상")하며, 명령문은 semicolons(;)로 끝납니다. Address라는 고유한 데이터 타입, 즉 Ethereum의 주소이며 20 bytes의 값으로 저장됩니다. ### 단일 변수 adopters 정의 Ethereum address의 배열. 배열은 하나의 유형(type)이 포함되며 고정 또는 가변 길이를 가질 수 있습니다. 이 경우 유형은 address 이며 배열의 크기는 16입니다. 또한 변수 adopters가 public임을 알 수 있습니다. Public 변수는 자동으로 getter 메소드가 가지지만, 이 경우 배열은 키가 필요하며 단일 값만 반환합니다. 나중에 UI에서 사용할 전체 배열을 반환하는 함수를 작성할 것입니다. ### 첫번째 함수 : Adopting a pet 사용자가 입양(Adoption) 요청을 할 수 있도록 허용합니다. Solidity에서는 함수 매개 변수와 출력 유형을 모두 지정 해야 합니다. 이 경우 petId (정수)를 가져 와서 정수를 반환합니다. PetId가 adopters 배열 범위 내에 있는지 확인합니다. Solidity에있는 배열은 0부터 인덱싱되므로 ID 값은 0에서 15 사이 여야합니다. ID가 범위 내에 있는지 확인하기 위해 require () 문을 사용합니다. ID가 범위 내에 있으면 우리는 adopters 배열에 호출 한 주소를 추가합니다. 이 함수를 호출 한 사람 또는 스마트 계약자의 주소는 msg.sender로 표시됩니다. 마지막으로, 제공된 애완 동물을 확인하고 반환합니다. 마지막으로, 확인을 하기 위해 전달했던 petId를 반환합니다. ### 두번째 함수 : Retrieving the adopters 위에서 언급 한 것처럼 배열 getter는 주어진 키에서 하나의 값만 반환합니다. UI에서는 모든 애완 동물의 입양 상태를 업데이트해야하지만, 16 개의 API 호출을 하는 것은 이상적이지 않습니다. 다음 단계는 전체 배열을 반환하는 함수를 작성하는 것입니다. 위에서 추가 한 adopt () 함수 다음, 스마트 계약에 getAdopters () 함수를 추가합니다. adopters 들은 이미 선언 되었으므로 간단하게 반환 할 수 있습니다. 반환 유형 (이 경우, Adopters의 유형)을 Address [16]으로 지정해야합니다. ## 4. Smart Contract 컴파일 및 마이그레이션 앞에서 간단한 Smart contract를 작성했습니다. 다음으로 컴파일 및 마이그레이션을 해보겠습니다 트러플은 내장 개발 콘솔(Truffle Develop) 가지고 있는데 개발용 블럭체인을 생성하고 이를통해 컨트랙트 배포(deploy)테스트를 해볼수 있습니다 또한 콘솔에서 직접 트러플의 명령들을 실행하는 기능도 가지고 있습니다 ### 컴파일(compilation) Solidity는 컴파일 언어 입니다. 즉, Ethereum Virtual Machine(EVM)에서 실행하기 위해 bytecode로 컴파일 해야 합니다 인간이 읽을수있는 Solidity코드를 EVM이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다  컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.  ### 마이그레이션(migration) 성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다. 마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다. migrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.  이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)  이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다 1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성 2. 2_deploy_contracts.js에 아래 내용 입력  3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다. (응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)  truffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다.  4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다  순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.) 5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.  아래는 추가된 블록의 정보  트렌젝션의 처리 정보  이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with) ## 5. Smart Contract 테스트 Truffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다. 1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다. 2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.  Assert.sol : 테스트에 사용할 다양한 assertion 을 제공합니다. 테스트에서 assertion은 같음(equality), 같지 않음(inequality), 테스트를 통과했는지 실패했는지 반환하기 위한 공백과 같은 것들을 확인 합니다. DeployedAddresses.sol : 테스트를 실행할때 Truffle은 테스트중인 컨트랙트의 새로운 인스턴스를 블록체인에 배포합니다. 이 스마트 컨트랙트는 deploy된 컨트랙트의 주소를 가져옵니다. Adoption.sol : 테스트 하고자하는 스마트 컨트랙트 <br> *주의 )처음의 두 import는 truffle 디렉토리가 아닌 전역 Truffle 파일입니다. 그래서 test/ 디렉토리 내부에 truffle 디렉토리를 볼수 없습니다. <br> 그런 다음 테스트될 스마트 컨트랙트를 포함하는 contract-wide 변수를 정의하고 address를 가져오기 위해 DeployedAddresses 스마트 컨트랙트를 호출합니다. #### adopt() 함수 테스트 adopt() 함수를 테스트하기 위해 앞서 작성한 Adoption.sol 컨트랙트의 adopt()함수를 상기해보면 함수는 성공하면 입력된 petId를 리턴하는 것을 떠올려 보기 바랍니다. 테스트 케이스에서는 ID가 반환되었는지와 전달된 ID에 대해 adopt() 함수의 반환 값을 비교하여 올바른지 확인 할 수 있습니다. 1. adoption 선언 이후에 TestAdoption.sol 스마트 컨트랙트 안에 아래의 함수(testUserCanAdoptPet)를 추가합니다  - 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다. - 그런 다음 예상 값인 8을 역시 선언합니다. - 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다. #### 입양한 Pet의 소유자 검색 테스트 앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다. 1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다.  TestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다. #### 모든 Pet의 소유자 검색 테스트 배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다. 1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. <br> adopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신 메모리에 값을 일시적으로 저장하도록 알립니다. <br> adopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. 전체 테스트 코드입니다.  #### 테스트 실행하기 이제 터미널로 돌아가서 test를 실행합니다. "truffle test"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.  ## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다. 이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다. 이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다.  #### web3 인스턴스 1.텍스트 편집기로 /src/js/app.js 파일을 엽니다. 2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다. 실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.  init 함수  Web3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다. initWeb3 함수  - 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) - 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다. - 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다. #### 컨트랙트 인스턴스 1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.  - 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다. - 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다. - 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다. - 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다. #### 입양된 Pet정보를 얻고 UI를 업데이트 1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.  - 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다. - 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다. - call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다. - getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다. - 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 "Success"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다. - 모든 오류는 콘솔에 기록(logging)됩니다. #### Adopt() 함수 다루기 1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.  - web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다. - 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 "보낸 사람"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다. - 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다. ## 7. 브라우저에서 dapp과 상호 작용 이제 Dapp을 사용할 준비가 되었습니다. #### MetaMask 설치 및 설정 브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br> 1.브라우저에 MetaMask를 설치합니다. 2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다.  3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다. 4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.  5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.  6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.   아래에 비밀번호를 입력하고 OK를 클릭합니다.  7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. "Main Network"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.  8."New RPC URL"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.  <br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다. 9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다. Truffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. 첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다.  설정이 이제 완료 되었습니다. #### lite-server 설치 및 설정 이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다. 1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  lite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. 웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다. 프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.   #### App 사용하기 1.로컬 웹 서버를 시작합니다.   dev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.  2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다. 주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어 web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다. 아래글은 Metamask QnA에 올라온 글입니다.  3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.  4.채택 된 애완 동물의 변화 옆에있는 버튼이 "Success"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.  그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :  #### Ganashe 트랜젝션 확인   지금까지 Truffle 프레임워크를 이용해서 App을 만들고 Metamask를 통해서 스마트 컨트랙트와 상호작용(Interacting) 해보는 튜토리얼을 해봤습니다. 간단한 샘플이긴하지만, 많은 Dapp들이 가져야하는 어플리케이션의 구조를 잘 설명하고 있다고 생각됩니다. 이 패턴을 통해 여러가지 목적하는 어플리케이션을 블록체인으로 구현하는 기본이 될수 있을거라고 생각합니다. |
| json metadata | {"tags":["ethereum","pet-shop","truffle","tutorial","etherum"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png","https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png","https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png","https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png","https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png","https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png","https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png","https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png","https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png","https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png","https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png","https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png","https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png","https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png","https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png","https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png","https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png","https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png","https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png","https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png","https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png","https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png","https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png","https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png","https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png","https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png","https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png","https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png","https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png","https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png","https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png","https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png","https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png","https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png","https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png","https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png","https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png","https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png","https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png","https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png","https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png","https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png","https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png","https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png","https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png","https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache","http://127.0.0.1:8545"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #22047543/Trx 19f6ac0eb4069c896b603639a454be8af4e8c95d |
View Raw JSON Data
{
"block": 22047543,
"op": [
"comment",
{
"author": "dongshik",
"body": "안녕하세요.\n\nEthereum Dapp개발을 위한 truffle 튜토리얼 중 pet-shop 튜토리얼을 통해 로컬 개발환경 구성과 실행 테스트, 명령어 실행은 물론이고 스마트 컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다\n\n또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다\n\n(먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다)\n\nPet Shop 튜토리얼의 대상\n- Pet shop의 입양(Adoption) 추적 시스템 추축 과정 안내를 목표로 합니다\n- Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자를 대상으로 합니다\n\nPet Shop 튜토리얼 요건정의\n- 고객은 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있습니다\n- 한번에 16마리의 애완동물을 관리하기 위한 공간을 보유하고 있으며\n- 각 애완동물에 대한 정보 데이터 베이스를 보유하고 있습니다\n- Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp 구현을 목표로 하며\n- 기본 웹사이트의 구조와 Style을 제공합니다\n- 프론트엔드 로직과 스마트 계약을 작성하면 완성되는 형식으로 구성되어 있습니다\n\nPet Shop 튜토리얼 아키텍처\n\n4가지의 주요 기능으로 구성되며 순차적으로 하나씩 살펴 보겠습니다\n\n튜토리얼 순서\n\n1. 개발 환경 설정\n2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\n3. Smart Contract 작성하기\n4. Smart Contract 컴파일 및 마이그레이션\n5. Smart Contract 테스트\n6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n7. 브라우저에서 dapp과 상호 작용\n\n(MacOS를 기준으로 작성합니다)\n\n## 1. 개발 환경 설정\n\n먼저 Truffle 설치 전에 아래 두가지를 설치합니다.\n- Node.js v6+ LTS and npm (comes with Node)\n- Git\n\n완료 후 Truffle을 설치합니다.\n\n<table><tr><td>\n:~ dongsik$ <b>sudo npm install -g truffle</b><br>\nPassword:<br>\n/Users/dongsik/.nvm/versions/node/v6.9.5/bin/truffle -><br> /Users/dongsik/.nvm/versions/node/v6.9.5/lib/node_modules/truffle/build/cli.bundled.js<br>\n+ [email protected]<br>\nupdated 1 package in 4.603s<br>\n:~ dongsik$\n</td></tr></table>\n\nTruffle 설치 확인\n\n\nGanache 설치\n스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인\nhttp://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.\n\n\n설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)\n\n\n## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\nTruffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.\n\n\nPet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.\n\n\n생성된 기본 Truffle 디렉토리 구조 및 파일 설명\ncontracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. \n\nMigrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. \n\ntest / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다.\n\ntruffle.js : Truffle 설정 파일\n\n\n\n## 3. Smart Contract 작성하기\n백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다.\n첫 번째로, contracts > Adoption.sol 파일 추가 합니다.\n\n\n심볼 (^)은 필요한 Solidity의 최소버전을 지정(\"표시된 버전 이상\")하며, 명령문은 semicolons(;)로 끝납니다.\n\nAddress라는 고유한 데이터 타입, 즉 Ethereum의 주소이며 20 bytes의 값으로 저장됩니다.\n\n### 단일 변수 adopters 정의\nEthereum address의 배열. 배열은 하나의 유형(type)이 포함되며 고정 또는 가변 길이를 가질 수 있습니다. 이 경우 유형은 address 이며 배열의 크기는 16입니다.\n\n또한 변수 adopters가 public임을 알 수 있습니다. Public 변수는 자동으로 getter 메소드가 가지지만, 이 경우 배열은 키가 필요하며 단일 값만 반환합니다. 나중에 UI에서 사용할 전체 배열을 반환하는 함수를 작성할 것입니다.\n\n### 첫번째 함수 : Adopting a pet\n사용자가 입양(Adoption) 요청을 할 수 있도록 허용합니다.\nSolidity에서는 함수 매개 변수와 출력 유형을 모두 지정 해야 합니다. 이 경우 petId (정수)를 가져 와서 정수를 반환합니다.\nPetId가 adopters 배열 범위 내에 있는지 확인합니다. Solidity에있는 배열은 0부터 인덱싱되므로 ID 값은 0에서 15 사이 여야합니다. ID가 범위 내에 있는지 확인하기 위해 require () 문을 사용합니다.\n\nID가 범위 내에 있으면 우리는 adopters 배열에 호출 한 주소를 추가합니다. 이 함수를 호출 한 사람 또는 스마트 계약자의 주소는 msg.sender로 표시됩니다. 마지막으로, 제공된 애완 동물을 확인하고 반환합니다.\n\n마지막으로, 확인을 하기 위해 전달했던 petId를 반환합니다.\n\n### 두번째 함수 : Retrieving the adopters\n위에서 언급 한 것처럼 배열 getter는 주어진 키에서 하나의 값만 반환합니다. UI에서는 모든 애완 동물의 입양 상태를 업데이트해야하지만, 16 개의 API 호출을 하는 것은 이상적이지 않습니다. 다음 단계는 전체 배열을 반환하는 함수를 작성하는 것입니다.\n\n위에서 추가 한 adopt () 함수 다음, 스마트 계약에 getAdopters () 함수를 추가합니다.\n\nadopters 들은 이미 선언 되었으므로 간단하게 반환 할 수 있습니다. 반환 유형 (이 경우, Adopters의 유형)을 Address [16]으로 지정해야합니다.\n\n\n## 4. Smart Contract 컴파일 및 마이그레이션\n앞에서 간단한 Smart contract를 작성했습니다. 다음으로 컴파일 및 마이그레이션을 해보겠습니다\n\n트러플은 내장 개발 콘솔(Truffle Develop) 가지고 있는데 개발용 블럭체인을 생성하고 이를통해 컨트랙트 배포(deploy)테스트를 해볼수 있습니다\n\n또한 콘솔에서 직접 트러플의 명령들을 실행하는 기능도 가지고 있습니다\n\n### 컴파일(compilation)\nSolidity는 컴파일 언어 입니다. 즉, Ethereum Virtual Machine(EVM)에서 실행하기 위해 bytecode로 컴파일 해야 합니다\n\n인간이 읽을수있는 Solidity코드를 EVM이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다\n\n\n\n컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.\n\n\n### 마이그레이션(migration)\n성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다.\n마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다.\n\nmigrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.\n\n\n이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)\n\n\n이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다\n\n1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성\n2. 2_deploy_contracts.js에 아래 내용 입력\n\n\n3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다.\n(응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)\n\ntruffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다.\n\n\n4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다\n\n순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.)\n\n5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.\n\n아래는 추가된 블록의 정보\n\n트렌젝션의 처리 정보\n\n이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with)\n\n\n## 5. Smart Contract 테스트\nTruffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다.\n\n1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다.\n2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.\n\nAssert.sol : 테스트에 사용할 다양한 assertion 을 제공합니다. 테스트에서 assertion은 같음(equality), 같지 않음(inequality), 테스트를 통과했는지 실패했는지 반환하기 위한 공백과 같은 것들을 확인 합니다.\nDeployedAddresses.sol : 테스트를 실행할때 Truffle은 테스트중인 컨트랙트의 새로운 인스턴스를 블록체인에 배포합니다. 이 스마트 컨트랙트는 deploy된 컨트랙트의 주소를 가져옵니다.\nAdoption.sol : 테스트 하고자하는 스마트 컨트랙트 <br>\n*주의 )처음의 두 import는 truffle 디렉토리가 아닌 전역 Truffle 파일입니다. 그래서 test/ 디렉토리 내부에 truffle 디렉토리를 볼수 없습니다. <br>\n그런 다음 테스트될 스마트 컨트랙트를 포함하는 contract-wide 변수를 정의하고 address를 가져오기 위해 DeployedAddresses 스마트 컨트랙트를 호출합니다.\n#### adopt() 함수 테스트\nadopt() 함수를 테스트하기 위해 앞서 작성한 Adoption.sol 컨트랙트의 adopt()함수를 상기해보면 함수는 성공하면 입력된 petId를 리턴하는 것을 떠올려 보기 바랍니다. 테스트 케이스에서는 ID가 반환되었는지와 전달된 ID에 대해 adopt() 함수의 반환 값을 비교하여 올바른지 확인 할 수 있습니다.\n\n1. adoption 선언 이후에 TestAdoption.sol 스마트 컨트랙트 안에 아래의 함수(testUserCanAdoptPet)를 추가합니다 \n\n- 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다.\n- 그런 다음 예상 값인 8을 역시 선언합니다.\n- 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다.\n\n#### 입양한 Pet의 소유자 검색 테스트\n앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다.\n\n1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다.\n\nTestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다.\n\n#### 모든 Pet의 소유자 검색 테스트\n배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다.\n1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. \n<br>\nadopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신 메모리에 값을 일시적으로 저장하도록 알립니다. <br>\nadopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. \n\n전체 테스트 코드입니다.\n\n\n#### 테스트 실행하기\n이제 터미널로 돌아가서 test를 실행합니다.\n\"truffle test\"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.\n\n\n\n## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다.\n이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다.\n\n이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. \n\n\n#### web3 인스턴스 \n1.텍스트 편집기로 /src/js/app.js 파일을 엽니다.\n\n2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다.\n실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.\n\ninit 함수\n\nWeb3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다.\ninitWeb3 함수\n\n- 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) \n- 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다.\n- 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다.\n\n#### 컨트랙트 인스턴스 \n1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.\n\n- 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다.\n- 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다.\n- 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다.\n- 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다. \n\n#### 입양된 Pet정보를 얻고 UI를 업데이트 \n1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.\n\n- 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다.\n- 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다.\n- call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다.\n- getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다.\n- 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 \"Success\"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다.\n- 모든 오류는 콘솔에 기록(logging)됩니다.\n\n#### Adopt() 함수 다루기\n1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.\n\n- web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다.\n- 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 \"보낸 사람\"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다.\n- 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다.\n\n## 7. 브라우저에서 dapp과 상호 작용\n이제 Dapp을 사용할 준비가 되었습니다.\n\n#### MetaMask 설치 및 설정\n브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br>\n1.브라우저에 MetaMask를 설치합니다.\n2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다.\n\n3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다.\n4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.\n\n5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.\n\n6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.\n\n\n아래에 비밀번호를 입력하고 OK를 클릭합니다.\n\n7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. \"Main Network\"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.\n\n8.\"New RPC URL\"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.\n\n<br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다.\n9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다.\nTruffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. \n첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. \n\n설정이 이제 완료 되었습니다.\n\n#### lite-server 설치 및 설정\n이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다.\n\n1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다. \n\nlite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. \n웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다.\n\n프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.\n\n\n\n\n#### App 사용하기\n1.로컬 웹 서버를 시작합니다.\n\n\n\ndev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.\n\n\n2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다.\n\n주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어 web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다.\n아래글은 Metamask QnA에 올라온 글입니다.\n\n\n3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.\n\n4.채택 된 애완 동물의 변화 옆에있는 버튼이 \"Success\"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.\n\n그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :\n\n\n\n\n#### Ganashe 트랜젝션 확인\n\n\n\n지금까지 Truffle 프레임워크를 이용해서 App을 만들고 Metamask를 통해서 스마트 컨트랙트와 상호작용(Interacting) 해보는 튜토리얼을 해봤습니다. 간단한 샘플이긴하지만, 많은 Dapp들이 가져야하는 어플리케이션의 구조를 잘 설명하고 있다고 생각됩니다. 이 패턴을 통해 여러가지 목적하는 어플리케이션을 블록체인으로 구현하는 기본이 될수 있을거라고 생각합니다.",
"json_metadata": "{\"tags\":[\"ethereum\",\"pet-shop\",\"truffle\",\"tutorial\",\"etherum\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\",\"https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png\",\"https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png\",\"https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png\",\"https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png\",\"https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png\",\"https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png\",\"https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png\",\"https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png\",\"https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png\",\"https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png\",\"https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png\",\"https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png\",\"https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png\",\"https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png\",\"https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png\",\"https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png\",\"https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png\",\"https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png\",\"https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png\",\"https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png\",\"https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png\",\"https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png\",\"https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png\",\"https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png\",\"https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png\",\"https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png\",\"https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png\",\"https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png\",\"https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png\",\"https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png\",\"https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png\",\"https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png\",\"https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png\",\"https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png\",\"https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png\",\"https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png\",\"https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png\",\"https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png\",\"https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png\",\"https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png\",\"https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png\",\"https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png\",\"https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png\",\"https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png\",\"https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\",\"http://127.0.0.1:8545\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-05-01T11:37:36",
"trx_id": "19f6ac0eb4069c896b603639a454be8af4e8c95d",
"trx_in_block": 18,
"virtual_op": 0
}2018/04/30 14:01:24
2018/04/30 14:01:24
| id | follow |
| json | ["follow",{"follower":"dongshik","following":"arcange","what":["ignore"]}] |
| required auths | [] |
| required posting auths | ["dongshik"] |
| Transaction Info | Block #22021624/Trx 004abd6ace03f9b6d3b75accaf170f786106af77 |
View Raw JSON Data
{
"block": 22021624,
"op": [
"custom_json",
{
"id": "follow",
"json": "[\"follow\",{\"follower\":\"dongshik\",\"following\":\"arcange\",\"what\":[\"ignore\"]}]",
"required_auths": [],
"required_posting_auths": [
"dongshik"
]
}
],
"op_in_trx": 0,
"timestamp": "2018-04-30T14:01:24",
"trx_id": "004abd6ace03f9b6d3b75accaf170f786106af77",
"trx_in_block": 27,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/30 04:55:36
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/30 04:55:36
| author | dongshik |
| body | @@ -1365,16 +1365,331 @@ age.png) +%0A%3Ctable%3E%3Ctr%3E%3Ctd%3E%0A:~ dongsik$ %3Cb%3Esudo npm install -g truffle%3C/b%3E%3Cbr%3E%0APassword:%3Cbr%3E%0A/Users/dongsik/.nvm/versions/node/v6.9.5/bin/truffle -%3E%3Cbr%3E /Users/dongsik/.nvm/versions/node/v6.9.5/lib/node_modules/truffle/build/cli.bundled.js%3Cbr%3E%0A+ [email protected]%3Cbr%3E%0Aupdated 1 package in 4.603s%3Cbr%3E%0A:~ dongsik$%0A%3C/td%3E%3C/tr%3E%3C/table%3E %0A%0ATruffl |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png","https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png","https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png","https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png","https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png","https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png","https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png","https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png","https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png","https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png","https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png","https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png","https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png","https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png","https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png","https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png","https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png","https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png","https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png","https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png","https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png","https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png","https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png","https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png","https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png","https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png","https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png","https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png","https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png","https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png","https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png","https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png","https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png","https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png","https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png","https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png","https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png","https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png","https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png","https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png","https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png","https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png","https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png","https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png","https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png","https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache","http://127.0.0.1:8545"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #22010711/Trx 998597a79dcc8071143a285a196eca852e27d4a1 |
View Raw JSON Data
{
"block": 22010711,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -1365,16 +1365,331 @@\n age.png)\n+%0A%3Ctable%3E%3Ctr%3E%3Ctd%3E%0A:~ dongsik$ %3Cb%3Esudo npm install -g truffle%3C/b%3E%3Cbr%3E%0APassword:%3Cbr%3E%0A/Users/dongsik/.nvm/versions/node/v6.9.5/bin/truffle -%3E%3Cbr%3E /Users/dongsik/.nvm/versions/node/v6.9.5/lib/node_modules/truffle/build/cli.bundled.js%3Cbr%3E%0A+ [email protected]%3Cbr%3E%0Aupdated 1 package in 4.603s%3Cbr%3E%0A:~ dongsik$%0A%3C/td%3E%3C/tr%3E%3C/table%3E\n %0A%0ATruffl\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\",\"https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png\",\"https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png\",\"https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png\",\"https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png\",\"https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png\",\"https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png\",\"https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png\",\"https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png\",\"https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png\",\"https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png\",\"https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png\",\"https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png\",\"https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png\",\"https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png\",\"https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png\",\"https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png\",\"https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png\",\"https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png\",\"https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png\",\"https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png\",\"https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png\",\"https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png\",\"https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png\",\"https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png\",\"https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png\",\"https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png\",\"https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png\",\"https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png\",\"https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png\",\"https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png\",\"https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png\",\"https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png\",\"https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png\",\"https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png\",\"https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png\",\"https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png\",\"https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png\",\"https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png\",\"https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png\",\"https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png\",\"https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png\",\"https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png\",\"https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png\",\"https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png\",\"https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\",\"http://127.0.0.1:8545\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-30T04:55:36",
"trx_id": "998597a79dcc8071143a285a196eca852e27d4a1",
"trx_in_block": 39,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/30 04:49:42
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/30 04:49:42
| author | dongshik |
| body | @@ -3,15 +3,8 @@ %ED%95%98%EC%84%B8%EC%9A%94. - %EB%B0%98%EA%B0%91%EC%8A%B5%EB%8B%88%EB%8B%A4. %0A%0AEt @@ -16554,12 +16554,4 @@ %ED%95%A9%EB%8B%88%EB%8B%A4. -%0A%0A%EA%B0%90%EC%82%AC%ED%95%A9%EB%8B%88%EB%8B%A4. |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png","https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png","https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png","https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png","https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png","https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png","https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png","https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png","https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png","https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png","https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png","https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png","https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png","https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png","https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png","https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png","https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png","https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png","https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png","https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png","https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png","https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png","https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png","https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png","https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png","https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png","https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png","https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png","https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png","https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png","https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png","https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png","https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png","https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png","https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png","https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png","https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png","https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png","https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png","https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png","https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png","https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png","https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png","https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png","https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png","https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache","http://127.0.0.1:8545"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #22010593/Trx 18b5deaa85128af335890215b4b153da7c83a804 |
View Raw JSON Data
{
"block": 22010593,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -3,15 +3,8 @@\n %ED%95%98%EC%84%B8%EC%9A%94.\n- %EB%B0%98%EA%B0%91%EC%8A%B5%EB%8B%88%EB%8B%A4.\n %0A%0AEt\n@@ -16554,12 +16554,4 @@\n %ED%95%A9%EB%8B%88%EB%8B%A4.\n-%0A%0A%EA%B0%90%EC%82%AC%ED%95%A9%EB%8B%88%EB%8B%A4.\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\",\"https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png\",\"https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png\",\"https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png\",\"https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png\",\"https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png\",\"https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png\",\"https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png\",\"https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png\",\"https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png\",\"https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png\",\"https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png\",\"https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png\",\"https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png\",\"https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png\",\"https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png\",\"https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png\",\"https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png\",\"https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png\",\"https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png\",\"https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png\",\"https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png\",\"https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png\",\"https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png\",\"https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png\",\"https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png\",\"https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png\",\"https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png\",\"https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png\",\"https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png\",\"https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png\",\"https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png\",\"https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png\",\"https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png\",\"https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png\",\"https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png\",\"https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png\",\"https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png\",\"https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png\",\"https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png\",\"https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png\",\"https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png\",\"https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png\",\"https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png\",\"https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png\",\"https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\",\"http://127.0.0.1:8545\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-30T04:49:42",
"trx_id": "18b5deaa85128af335890215b4b153da7c83a804",
"trx_in_block": 27,
"virtual_op": 0
}2018/04/30 04:34:48
2018/04/30 04:34:48
| author | arcange |
| body | **WARNING** - The message you received from @bboyghost is a **CONFIRMED SCAM!** **DO NOT FOLLOW** any instruction and **DO NOT CLICK** on any link in the comment! For more information, read this post: https://steemit.com/steemit/@arcange/anti-phishing-war-the-crooks-continue-their-bashing-campaign If you find my work to protect you and the community valuable, please consider to upvote this warning or to [vote for my witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=arcange&approve=1). |
| json metadata | {"image":["http://i.cubeupload.com/d1Dr28.png"]} |
| parent author | dongshik |
| parent permlink | ethereum-pet-shop-and-truffle |
| permlink | re-ethereum-pet-shop-and-truffle-20180430t063450000z |
| title | |
| Transaction Info | Block #22010295/Trx 7d7bae01182ccb8d7a34aec87b67774696bb4016 |
View Raw JSON Data
{
"block": 22010295,
"op": [
"comment",
{
"author": "arcange",
"body": "**WARNING** - The message you received from @bboyghost is a **CONFIRMED SCAM!**\n**DO NOT FOLLOW** any instruction and **DO NOT CLICK** on any link in the comment!\n\nFor more information, read this post: \nhttps://steemit.com/steemit/@arcange/anti-phishing-war-the-crooks-continue-their-bashing-campaign\n\nIf you find my work to protect you and the community valuable, please consider to upvote this warning or to [vote for my witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=arcange&approve=1).",
"json_metadata": "{\"image\":[\"http://i.cubeupload.com/d1Dr28.png\"]}",
"parent_author": "dongshik",
"parent_permlink": "ethereum-pet-shop-and-truffle",
"permlink": "re-ethereum-pet-shop-and-truffle-20180430t063450000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-04-30T04:34:48",
"trx_id": "7d7bae01182ccb8d7a34aec87b67774696bb4016",
"trx_in_block": 70,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/29 21:40:03
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/29 21:40:03
| author | dongshik |
| body | 안녕하세요. 반갑습니다. Ethereum Dapp개발을 위한 truffle 튜토리얼 중 pet-shop 튜토리얼을 통해 로컬 개발환경 구성과 실행 테스트, 명령어 실행은 물론이고 스마트 컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다 또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다 (먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다) Pet Shop 튜토리얼의 대상 - Pet shop의 입양(Adoption) 추적 시스템 추축 과정 안내를 목표로 합니다 - Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자를 대상으로 합니다 Pet Shop 튜토리얼 요건정의 - 고객은 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있습니다 - 한번에 16마리의 애완동물을 관리하기 위한 공간을 보유하고 있으며 - 각 애완동물에 대한 정보 데이터 베이스를 보유하고 있습니다 - Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp 구현을 목표로 하며 - 기본 웹사이트의 구조와 Style을 제공합니다 - 프론트엔드 로직과 스마트 계약을 작성하면 완성되는 형식으로 구성되어 있습니다 Pet Shop 튜토리얼 아키텍처  4가지의 주요 기능으로 구성되며 순차적으로 하나씩 살펴 보겠습니다 튜토리얼 순서 1. 개발 환경 설정 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 3. Smart Contract 작성하기 4. Smart Contract 컴파일 및 마이그레이션 5. Smart Contract 테스트 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 7. 브라우저에서 dapp과 상호 작용 (MacOS를 기준으로 작성합니다) ## 1. 개발 환경 설정 먼저 Truffle 설치 전에 아래 두가지를 설치합니다. - Node.js v6+ LTS and npm (comes with Node) - Git 완료 후 Truffle을 설치합니다.  Truffle 설치 확인  Ganache 설치 스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인 http://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.  설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)  ## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 Truffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.  Pet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.  생성된 기본 Truffle 디렉토리 구조 및 파일 설명 contracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. Migrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. test / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다. truffle.js : Truffle 설정 파일  ## 3. Smart Contract 작성하기 백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다. 첫 번째로, contracts > Adoption.sol 파일 추가 합니다.  심볼 (^)은 필요한 Solidity의 최소버전을 지정("표시된 버전 이상")하며, 명령문은 semicolons(;)로 끝납니다. Address라는 고유한 데이터 타입, 즉 Ethereum의 주소이며 20 bytes의 값으로 저장됩니다. ### 단일 변수 adopters 정의 Ethereum address의 배열. 배열은 하나의 유형(type)이 포함되며 고정 또는 가변 길이를 가질 수 있습니다. 이 경우 유형은 address 이며 배열의 크기는 16입니다. 또한 변수 adopters가 public임을 알 수 있습니다. Public 변수는 자동으로 getter 메소드가 가지지만, 이 경우 배열은 키가 필요하며 단일 값만 반환합니다. 나중에 UI에서 사용할 전체 배열을 반환하는 함수를 작성할 것입니다. ### 첫번째 함수 : Adopting a pet 사용자가 입양(Adoption) 요청을 할 수 있도록 허용합니다. Solidity에서는 함수 매개 변수와 출력 유형을 모두 지정 해야 합니다. 이 경우 petId (정수)를 가져 와서 정수를 반환합니다. PetId가 adopters 배열 범위 내에 있는지 확인합니다. Solidity에있는 배열은 0부터 인덱싱되므로 ID 값은 0에서 15 사이 여야합니다. ID가 범위 내에 있는지 확인하기 위해 require () 문을 사용합니다. ID가 범위 내에 있으면 우리는 adopters 배열에 호출 한 주소를 추가합니다. 이 함수를 호출 한 사람 또는 스마트 계약자의 주소는 msg.sender로 표시됩니다. 마지막으로, 제공된 애완 동물을 확인하고 반환합니다. 마지막으로, 확인을 하기 위해 전달했던 petId를 반환합니다. ### 두번째 함수 : Retrieving the adopters 위에서 언급 한 것처럼 배열 getter는 주어진 키에서 하나의 값만 반환합니다. UI에서는 모든 애완 동물의 입양 상태를 업데이트해야하지만, 16 개의 API 호출을 하는 것은 이상적이지 않습니다. 다음 단계는 전체 배열을 반환하는 함수를 작성하는 것입니다. 위에서 추가 한 adopt () 함수 다음, 스마트 계약에 getAdopters () 함수를 추가합니다. adopters 들은 이미 선언 되었으므로 간단하게 반환 할 수 있습니다. 반환 유형 (이 경우, Adopters의 유형)을 Address [16]으로 지정해야합니다. ## 4. Smart Contract 컴파일 및 마이그레이션 앞에서 간단한 Smart contract를 작성했습니다. 다음으로 컴파일 및 마이그레이션을 해보겠습니다 트러플은 내장 개발 콘솔(Truffle Develop) 가지고 있는데 개발용 블럭체인을 생성하고 이를통해 컨트랙트 배포(deploy)테스트를 해볼수 있습니다 또한 콘솔에서 직접 트러플의 명령들을 실행하는 기능도 가지고 있습니다 ### 컴파일(compilation) Solidity는 컴파일 언어 입니다. 즉, Ethereum Virtual Machine(EVM)에서 실행하기 위해 bytecode로 컴파일 해야 합니다 인간이 읽을수있는 Solidity코드를 EVM이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다  컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.  ### 마이그레이션(migration) 성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다. 마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다. migrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.  이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)  이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다 1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성 2. 2_deploy_contracts.js에 아래 내용 입력  3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다. (응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)  truffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다.  4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다  순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.) 5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.  아래는 추가된 블록의 정보  트렌젝션의 처리 정보  이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with) ## 5. Smart Contract 테스트 Truffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다. 1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다. 2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.  Assert.sol : 테스트에 사용할 다양한 assertion 을 제공합니다. 테스트에서 assertion은 같음(equality), 같지 않음(inequality), 테스트를 통과했는지 실패했는지 반환하기 위한 공백과 같은 것들을 확인 합니다. DeployedAddresses.sol : 테스트를 실행할때 Truffle은 테스트중인 컨트랙트의 새로운 인스턴스를 블록체인에 배포합니다. 이 스마트 컨트랙트는 deploy된 컨트랙트의 주소를 가져옵니다. Adoption.sol : 테스트 하고자하는 스마트 컨트랙트 <br> *주의 )처음의 두 import는 truffle 디렉토리가 아닌 전역 Truffle 파일입니다. 그래서 test/ 디렉토리 내부에 truffle 디렉토리를 볼수 없습니다. <br> 그런 다음 테스트될 스마트 컨트랙트를 포함하는 contract-wide 변수를 정의하고 address를 가져오기 위해 DeployedAddresses 스마트 컨트랙트를 호출합니다. #### adopt() 함수 테스트 adopt() 함수를 테스트하기 위해 앞서 작성한 Adoption.sol 컨트랙트의 adopt()함수를 상기해보면 함수는 성공하면 입력된 petId를 리턴하는 것을 떠올려 보기 바랍니다. 테스트 케이스에서는 ID가 반환되었는지와 전달된 ID에 대해 adopt() 함수의 반환 값을 비교하여 올바른지 확인 할 수 있습니다. 1. adoption 선언 이후에 TestAdoption.sol 스마트 컨트랙트 안에 아래의 함수(testUserCanAdoptPet)를 추가합니다  - 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다. - 그런 다음 예상 값인 8을 역시 선언합니다. - 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다. #### 입양한 Pet의 소유자 검색 테스트 앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다. 1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다.  TestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다. #### 모든 Pet의 소유자 검색 테스트 배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다. 1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. <br> adopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신 메모리에 값을 일시적으로 저장하도록 알립니다. <br> adopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. 전체 테스트 코드입니다.  #### 테스트 실행하기 이제 터미널로 돌아가서 test를 실행합니다. "truffle test"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.  ## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다. 이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다. 이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다.  #### web3 인스턴스 1.텍스트 편집기로 /src/js/app.js 파일을 엽니다. 2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다. 실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.  init 함수  Web3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다. initWeb3 함수  - 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) - 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다. - 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다. #### 컨트랙트 인스턴스 1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.  - 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다. - 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다. - 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다. - 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다. #### 입양된 Pet정보를 얻고 UI를 업데이트 1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.  - 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다. - 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다. - call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다. - getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다. - 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 "Success"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다. - 모든 오류는 콘솔에 기록(logging)됩니다. #### Adopt() 함수 다루기 1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.  - web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다. - 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 "보낸 사람"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다. - 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다. ## 7. 브라우저에서 dapp과 상호 작용 이제 Dapp을 사용할 준비가 되었습니다. #### MetaMask 설치 및 설정 브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br> 1.브라우저에 MetaMask를 설치합니다. 2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다.  3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다. 4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.  5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.  6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.   아래에 비밀번호를 입력하고 OK를 클릭합니다.  7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. "Main Network"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.  8."New RPC URL"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.  <br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다. 9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다. Truffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. 첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다.  설정이 이제 완료 되었습니다. #### lite-server 설치 및 설정 이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다. 1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  lite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. 웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다. 프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.   #### App 사용하기 1.로컬 웹 서버를 시작합니다.   dev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.  2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다. 주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어 web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다. 아래글은 Metamask QnA에 올라온 글입니다.  3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.  4.채택 된 애완 동물의 변화 옆에있는 버튼이 "Success"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.  그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :  #### Ganashe 트랜젝션 확인   지금까지 Truffle 프레임워크를 이용해서 App을 만들고 Metamask를 통해서 스마트 컨트랙트와 상호작용(Interacting) 해보는 튜토리얼을 해봤습니다. 간단한 샘플이긴하지만, 많은 Dapp들이 가져야하는 어플리케이션의 구조를 잘 설명하고 있다고 생각됩니다. 이 패턴을 통해 여러가지 목적하는 어플리케이션을 블록체인으로 구현하는 기본이 될수 있을거라고 생각합니다. 감사합니다. |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png","https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png","https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png","https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png","https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png","https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png","https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png","https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png","https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png","https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png","https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png","https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png","https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png","https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png","https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png","https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png","https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png","https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png","https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png","https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png","https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png","https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png","https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png","https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png","https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png","https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png","https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png","https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png","https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png","https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png","https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png","https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png","https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png","https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png","https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png","https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png","https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png","https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png","https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png","https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png","https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png","https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png","https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png","https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png","https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png","https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache","http://127.0.0.1:8545"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #22002002/Trx 95de848c85b8e4b9a7c86718c7c4409455e919df |
View Raw JSON Data
{
"block": 22002002,
"op": [
"comment",
{
"author": "dongshik",
"body": "안녕하세요. 반갑습니다.\n\nEthereum Dapp개발을 위한 truffle 튜토리얼 중 pet-shop 튜토리얼을 통해 로컬 개발환경 구성과 실행 테스트, 명령어 실행은 물론이고 스마트 컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다\n\n또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다\n\n(먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다)\n\nPet Shop 튜토리얼의 대상\n- Pet shop의 입양(Adoption) 추적 시스템 추축 과정 안내를 목표로 합니다\n- Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자를 대상으로 합니다\n\nPet Shop 튜토리얼 요건정의\n- 고객은 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있습니다\n- 한번에 16마리의 애완동물을 관리하기 위한 공간을 보유하고 있으며\n- 각 애완동물에 대한 정보 데이터 베이스를 보유하고 있습니다\n- Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp 구현을 목표로 하며\n- 기본 웹사이트의 구조와 Style을 제공합니다\n- 프론트엔드 로직과 스마트 계약을 작성하면 완성되는 형식으로 구성되어 있습니다\n\nPet Shop 튜토리얼 아키텍처\n\n4가지의 주요 기능으로 구성되며 순차적으로 하나씩 살펴 보겠습니다\n\n튜토리얼 순서\n\n1. 개발 환경 설정\n2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\n3. Smart Contract 작성하기\n4. Smart Contract 컴파일 및 마이그레이션\n5. Smart Contract 테스트\n6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n7. 브라우저에서 dapp과 상호 작용\n\n(MacOS를 기준으로 작성합니다)\n\n## 1. 개발 환경 설정\n\n먼저 Truffle 설치 전에 아래 두가지를 설치합니다.\n- Node.js v6+ LTS and npm (comes with Node)\n- Git\n\n완료 후 Truffle을 설치합니다.\n\n\nTruffle 설치 확인\n\n\nGanache 설치\n스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인\nhttp://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.\n\n\n설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)\n\n\n## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\nTruffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.\n\n\nPet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.\n\n\n생성된 기본 Truffle 디렉토리 구조 및 파일 설명\ncontracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. \n\nMigrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. \n\ntest / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다.\n\ntruffle.js : Truffle 설정 파일\n\n\n\n## 3. Smart Contract 작성하기\n백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다.\n첫 번째로, contracts > Adoption.sol 파일 추가 합니다.\n\n\n심볼 (^)은 필요한 Solidity의 최소버전을 지정(\"표시된 버전 이상\")하며, 명령문은 semicolons(;)로 끝납니다.\n\nAddress라는 고유한 데이터 타입, 즉 Ethereum의 주소이며 20 bytes의 값으로 저장됩니다.\n\n### 단일 변수 adopters 정의\nEthereum address의 배열. 배열은 하나의 유형(type)이 포함되며 고정 또는 가변 길이를 가질 수 있습니다. 이 경우 유형은 address 이며 배열의 크기는 16입니다.\n\n또한 변수 adopters가 public임을 알 수 있습니다. Public 변수는 자동으로 getter 메소드가 가지지만, 이 경우 배열은 키가 필요하며 단일 값만 반환합니다. 나중에 UI에서 사용할 전체 배열을 반환하는 함수를 작성할 것입니다.\n\n### 첫번째 함수 : Adopting a pet\n사용자가 입양(Adoption) 요청을 할 수 있도록 허용합니다.\nSolidity에서는 함수 매개 변수와 출력 유형을 모두 지정 해야 합니다. 이 경우 petId (정수)를 가져 와서 정수를 반환합니다.\nPetId가 adopters 배열 범위 내에 있는지 확인합니다. Solidity에있는 배열은 0부터 인덱싱되므로 ID 값은 0에서 15 사이 여야합니다. ID가 범위 내에 있는지 확인하기 위해 require () 문을 사용합니다.\n\nID가 범위 내에 있으면 우리는 adopters 배열에 호출 한 주소를 추가합니다. 이 함수를 호출 한 사람 또는 스마트 계약자의 주소는 msg.sender로 표시됩니다. 마지막으로, 제공된 애완 동물을 확인하고 반환합니다.\n\n마지막으로, 확인을 하기 위해 전달했던 petId를 반환합니다.\n\n### 두번째 함수 : Retrieving the adopters\n위에서 언급 한 것처럼 배열 getter는 주어진 키에서 하나의 값만 반환합니다. UI에서는 모든 애완 동물의 입양 상태를 업데이트해야하지만, 16 개의 API 호출을 하는 것은 이상적이지 않습니다. 다음 단계는 전체 배열을 반환하는 함수를 작성하는 것입니다.\n\n위에서 추가 한 adopt () 함수 다음, 스마트 계약에 getAdopters () 함수를 추가합니다.\n\nadopters 들은 이미 선언 되었으므로 간단하게 반환 할 수 있습니다. 반환 유형 (이 경우, Adopters의 유형)을 Address [16]으로 지정해야합니다.\n\n\n## 4. Smart Contract 컴파일 및 마이그레이션\n앞에서 간단한 Smart contract를 작성했습니다. 다음으로 컴파일 및 마이그레이션을 해보겠습니다\n\n트러플은 내장 개발 콘솔(Truffle Develop) 가지고 있는데 개발용 블럭체인을 생성하고 이를통해 컨트랙트 배포(deploy)테스트를 해볼수 있습니다\n\n또한 콘솔에서 직접 트러플의 명령들을 실행하는 기능도 가지고 있습니다\n\n### 컴파일(compilation)\nSolidity는 컴파일 언어 입니다. 즉, Ethereum Virtual Machine(EVM)에서 실행하기 위해 bytecode로 컴파일 해야 합니다\n\n인간이 읽을수있는 Solidity코드를 EVM이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다\n\n\n\n컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.\n\n\n### 마이그레이션(migration)\n성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다.\n마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다.\n\nmigrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.\n\n\n이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)\n\n\n이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다\n\n1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성\n2. 2_deploy_contracts.js에 아래 내용 입력\n\n\n3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다.\n(응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)\n\ntruffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다.\n\n\n4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다\n\n순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.)\n\n5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.\n\n아래는 추가된 블록의 정보\n\n트렌젝션의 처리 정보\n\n이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with)\n\n\n## 5. Smart Contract 테스트\nTruffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다.\n\n1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다.\n2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.\n\nAssert.sol : 테스트에 사용할 다양한 assertion 을 제공합니다. 테스트에서 assertion은 같음(equality), 같지 않음(inequality), 테스트를 통과했는지 실패했는지 반환하기 위한 공백과 같은 것들을 확인 합니다.\nDeployedAddresses.sol : 테스트를 실행할때 Truffle은 테스트중인 컨트랙트의 새로운 인스턴스를 블록체인에 배포합니다. 이 스마트 컨트랙트는 deploy된 컨트랙트의 주소를 가져옵니다.\nAdoption.sol : 테스트 하고자하는 스마트 컨트랙트 <br>\n*주의 )처음의 두 import는 truffle 디렉토리가 아닌 전역 Truffle 파일입니다. 그래서 test/ 디렉토리 내부에 truffle 디렉토리를 볼수 없습니다. <br>\n그런 다음 테스트될 스마트 컨트랙트를 포함하는 contract-wide 변수를 정의하고 address를 가져오기 위해 DeployedAddresses 스마트 컨트랙트를 호출합니다.\n#### adopt() 함수 테스트\nadopt() 함수를 테스트하기 위해 앞서 작성한 Adoption.sol 컨트랙트의 adopt()함수를 상기해보면 함수는 성공하면 입력된 petId를 리턴하는 것을 떠올려 보기 바랍니다. 테스트 케이스에서는 ID가 반환되었는지와 전달된 ID에 대해 adopt() 함수의 반환 값을 비교하여 올바른지 확인 할 수 있습니다.\n\n1. adoption 선언 이후에 TestAdoption.sol 스마트 컨트랙트 안에 아래의 함수(testUserCanAdoptPet)를 추가합니다 \n\n- 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다.\n- 그런 다음 예상 값인 8을 역시 선언합니다.\n- 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다.\n\n#### 입양한 Pet의 소유자 검색 테스트\n앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다.\n\n1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다.\n\nTestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다.\n\n#### 모든 Pet의 소유자 검색 테스트\n배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다.\n1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. \n<br>\nadopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신 메모리에 값을 일시적으로 저장하도록 알립니다. <br>\nadopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. \n\n전체 테스트 코드입니다.\n\n\n#### 테스트 실행하기\n이제 터미널로 돌아가서 test를 실행합니다.\n\"truffle test\"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.\n\n\n\n## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다.\n이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다.\n\n이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. \n\n\n#### web3 인스턴스 \n1.텍스트 편집기로 /src/js/app.js 파일을 엽니다.\n\n2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다.\n실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.\n\ninit 함수\n\nWeb3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다.\ninitWeb3 함수\n\n- 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) \n- 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다.\n- 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다.\n\n#### 컨트랙트 인스턴스 \n1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.\n\n- 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다.\n- 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다.\n- 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다.\n- 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다. \n\n#### 입양된 Pet정보를 얻고 UI를 업데이트 \n1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.\n\n- 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다.\n- 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다.\n- call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다.\n- getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다.\n- 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 \"Success\"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다.\n- 모든 오류는 콘솔에 기록(logging)됩니다.\n\n#### Adopt() 함수 다루기\n1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.\n\n- web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다.\n- 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 \"보낸 사람\"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다.\n- 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다.\n\n## 7. 브라우저에서 dapp과 상호 작용\n이제 Dapp을 사용할 준비가 되었습니다.\n\n#### MetaMask 설치 및 설정\n브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br>\n1.브라우저에 MetaMask를 설치합니다.\n2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다.\n\n3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다.\n4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.\n\n5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.\n\n6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.\n\n\n아래에 비밀번호를 입력하고 OK를 클릭합니다.\n\n7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. \"Main Network\"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.\n\n8.\"New RPC URL\"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.\n\n<br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다.\n9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다.\nTruffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. \n첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. \n\n설정이 이제 완료 되었습니다.\n\n#### lite-server 설치 및 설정\n이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다.\n\n1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다. \n\nlite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. \n웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다.\n\n프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.\n\n\n\n\n#### App 사용하기\n1.로컬 웹 서버를 시작합니다.\n\n\n\ndev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.\n\n\n2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다.\n\n주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어 web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다.\n아래글은 Metamask QnA에 올라온 글입니다.\n\n\n3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.\n\n4.채택 된 애완 동물의 변화 옆에있는 버튼이 \"Success\"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.\n\n그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :\n\n\n\n\n#### Ganashe 트랜젝션 확인\n\n\n\n지금까지 Truffle 프레임워크를 이용해서 App을 만들고 Metamask를 통해서 스마트 컨트랙트와 상호작용(Interacting) 해보는 튜토리얼을 해봤습니다. 간단한 샘플이긴하지만, 많은 Dapp들이 가져야하는 어플리케이션의 구조를 잘 설명하고 있다고 생각됩니다. 이 패턴을 통해 여러가지 목적하는 어플리케이션을 블록체인으로 구현하는 기본이 될수 있을거라고 생각합니다.\n\n감사합니다.",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\",\"https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png\",\"https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png\",\"https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png\",\"https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png\",\"https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png\",\"https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png\",\"https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png\",\"https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png\",\"https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png\",\"https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png\",\"https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png\",\"https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png\",\"https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png\",\"https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png\",\"https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png\",\"https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png\",\"https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png\",\"https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png\",\"https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png\",\"https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png\",\"https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png\",\"https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png\",\"https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png\",\"https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png\",\"https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png\",\"https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png\",\"https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png\",\"https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png\",\"https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png\",\"https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png\",\"https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png\",\"https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png\",\"https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png\",\"https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png\",\"https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png\",\"https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png\",\"https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png\",\"https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png\",\"https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png\",\"https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png\",\"https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png\",\"https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png\",\"https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png\",\"https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png\",\"https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\",\"http://127.0.0.1:8545\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-29T21:40:03",
"trx_id": "95de848c85b8e4b9a7c86718c7c4409455e919df",
"trx_in_block": 12,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/29 13:07:36
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/29 13:07:36
| author | dongshik |
| body | @@ -16333,20 +16333,240 @@ 2kazs3fz5/image.png) +%0A%0A%EC%A7%80%EA%B8%88%EA%B9%8C%EC%A7%80 Truffle %ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%EB%A5%BC %EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C App%EC%9D%84 %EB%A7%8C%EB%93%A4%EA%B3%A0 Metamask%EB%A5%BC %ED%86%B5%ED%95%B4%EC%84%9C %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%99%80 %EC%83%81%ED%98%B8%EC%9E%91%EC%9A%A9(Interacting) %ED%95%B4%EB%B3%B4%EB%8A%94 %ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC%EC%9D%84 %ED%95%B4%EB%B4%A4%EC%8A%B5%EB%8B%88%EB%8B%A4. %EA%B0%84%EB%8B%A8%ED%95%9C %EC%83%98%ED%94%8C%EC%9D%B4%EA%B8%B4%ED%95%98%EC%A7%80%EB%A7%8C, %EB%A7%8E%EC%9D%80 Dapp%EB%93%A4%EC%9D%B4 %EA%B0%80%EC%A0%B8%EC%95%BC%ED%95%98%EB%8A%94 %EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%98 %EA%B5%AC%EC%A1%B0%EB%A5%BC %EC%9E%98 %EC%84%A4%EB%AA%85%ED%95%98%EA%B3%A0 %EC%9E%88%EB%8B%A4%EA%B3%A0 %EC%83%9D%EA%B0%81%EB%90%A9%EB%8B%88%EB%8B%A4. %EC%9D%B4 %ED%8C%A8%ED%84%B4%EC%9D%84 %ED%86%B5%ED%95%B4 %EC%97%AC%EB%9F%AC%EA%B0%80%EC%A7%80 %EB%AA%A9%EC%A0%81%ED%95%98%EB%8A%94 %EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84 %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9C%BC%EB%A1%9C %EA%B5%AC%ED%98%84%ED%95%98%EB%8A%94 %EA%B8%B0%EB%B3%B8%EC%9D%B4 %EB%90%A0%EC%88%98 %EC%9E%88%EC%9D%84%EA%B1%B0%EB%9D%BC%EA%B3%A0 %EC%83%9D%EA%B0%81%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0A%EA%B0%90%EC%82%AC%ED%95%A9%EB%8B%88%EB%8B%A4. |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png","https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png","https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png","https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png","https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png","https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png","https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png","https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png","https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png","https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png","https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png","https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png","https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png","https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png","https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png","https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png","https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png","https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png","https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png","https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png","https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png","https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png","https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png","https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png","https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png","https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png","https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png","https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png","https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png","https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png","https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png","https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png","https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png","https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png","https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png","https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png","https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png","https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png","https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png","https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png","https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png","https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png","https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png","https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png","https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png","https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache","http://127.0.0.1:8545"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #21991755/Trx 7fbf3d82a2215018d9f5ee167839e5ccf8914aab |
View Raw JSON Data
{
"block": 21991755,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -16333,20 +16333,240 @@\n 2kazs3fz5/image.png)\n+%0A%0A%EC%A7%80%EA%B8%88%EA%B9%8C%EC%A7%80 Truffle %ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%EB%A5%BC %EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C App%EC%9D%84 %EB%A7%8C%EB%93%A4%EA%B3%A0 Metamask%EB%A5%BC %ED%86%B5%ED%95%B4%EC%84%9C %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%99%80 %EC%83%81%ED%98%B8%EC%9E%91%EC%9A%A9(Interacting) %ED%95%B4%EB%B3%B4%EB%8A%94 %ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC%EC%9D%84 %ED%95%B4%EB%B4%A4%EC%8A%B5%EB%8B%88%EB%8B%A4. %EA%B0%84%EB%8B%A8%ED%95%9C %EC%83%98%ED%94%8C%EC%9D%B4%EA%B8%B4%ED%95%98%EC%A7%80%EB%A7%8C, %EB%A7%8E%EC%9D%80 Dapp%EB%93%A4%EC%9D%B4 %EA%B0%80%EC%A0%B8%EC%95%BC%ED%95%98%EB%8A%94 %EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%98 %EA%B5%AC%EC%A1%B0%EB%A5%BC %EC%9E%98 %EC%84%A4%EB%AA%85%ED%95%98%EA%B3%A0 %EC%9E%88%EB%8B%A4%EA%B3%A0 %EC%83%9D%EA%B0%81%EB%90%A9%EB%8B%88%EB%8B%A4. %EC%9D%B4 %ED%8C%A8%ED%84%B4%EC%9D%84 %ED%86%B5%ED%95%B4 %EC%97%AC%EB%9F%AC%EA%B0%80%EC%A7%80 %EB%AA%A9%EC%A0%81%ED%95%98%EB%8A%94 %EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84 %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9C%BC%EB%A1%9C %EA%B5%AC%ED%98%84%ED%95%98%EB%8A%94 %EA%B8%B0%EB%B3%B8%EC%9D%B4 %EB%90%A0%EC%88%98 %EC%9E%88%EC%9D%84%EA%B1%B0%EB%9D%BC%EA%B3%A0 %EC%83%9D%EA%B0%81%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0A%EA%B0%90%EC%82%AC%ED%95%A9%EB%8B%88%EB%8B%A4.\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\",\"https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png\",\"https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png\",\"https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png\",\"https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png\",\"https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png\",\"https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png\",\"https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png\",\"https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png\",\"https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png\",\"https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png\",\"https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png\",\"https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png\",\"https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png\",\"https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png\",\"https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png\",\"https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png\",\"https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png\",\"https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png\",\"https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png\",\"https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png\",\"https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png\",\"https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png\",\"https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png\",\"https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png\",\"https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png\",\"https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png\",\"https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png\",\"https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png\",\"https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png\",\"https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png\",\"https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png\",\"https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png\",\"https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png\",\"https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png\",\"https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png\",\"https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png\",\"https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png\",\"https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png\",\"https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png\",\"https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png\",\"https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png\",\"https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png\",\"https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png\",\"https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png\",\"https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\",\"http://127.0.0.1:8545\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-29T13:07:36",
"trx_id": "7fbf3d82a2215018d9f5ee167839e5ccf8914aab",
"trx_in_block": 34,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/29 13:03:03
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/29 13:03:03
| author | dongshik |
| body | @@ -15320,16 +15320,390 @@ %ED%81%B4%EB%A6%AD%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0A +%EC%A3%BC) %ED%81%AC%EB%A1%AC %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%B8%EC%97%90%EC%84%9C %EC%96%B4%EB%96%BB%EA%B2%8C %EB%8B%A4%EC%9D%B4%EB%A0%89%ED%8A%B8%EB%A1%9C Metamask%EB%A5%BC %EB%9D%84%EC%9A%B8%EC%88%98 %EC%9E%88%EB%8A%94%EC%A7%80%EC%97%90 %EB%8C%80%ED%95%9C %EC%A7%88%EB%AC%B8%EC%97%90 %EB%8C%80%ED%95%9C %EB%8B%B5%EC%9E%85%EB%8B%88%EB%8B%A4. Chrome %ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8 Metamask%EB%8A%94 %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90 %EC%A0%84%EC%97%AD %EB%B3%80%EC%88%98 web3%EC%9D%84 %EC%82%BD%EC%9E%85%ED%95%A9%EB%8B%88%EB%8B%A4. MetaMask%EA%B0%80 %EC%84%A4%EC%B9%98%EB%90%98%EC%96%B4 web3%EA%B0%80 %EC%A3%BC%EC%9E%85 %EB%90%9C %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%B8 %EC%BD%98%EC%86%94%EC%97%90%EC%84%9C web3%EC%9D%84 %ED%83%80%EC%9D%B4%ED%95%91%ED%95%98%EC%97%AC web3 %EA%B0%9D%EC%B2%B4%EB%A5%BC %EB%B3%BC %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. MetaMask%EB%8A%94 %EC%84%9C%EB%B2%84 %EC%B8%A1%EA%B3%BC %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80 %EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 %EA%B0%84%EC%9D%98 %ED%94%84%EB%A1%9D%EC%8B%9C%EC%9E%85%EB%8B%88%EB%8B%A4. %ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8(Metamask)%EC%9D%B4 %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EB%A1%9C%EB%93%9C %EB%90%A0 %EB%95%8C%EB%A7%8C%EC%9D%B4 %EB%B3%80%EC%88%98%EB%A5%BC %EB%B3%BC %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.%0A%EC%95%84%EB%9E%98%EA%B8%80%EC%9D%80 Metamask QnA%EC%97%90 %EC%98%AC%EB%9D%BC%EC%98%A8 %EA%B8%80%EC%9E%85%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png)%0A%0A 3.MetaMa |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png","https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png","https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png","https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png","https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png","https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png","https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png","https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png","https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png","https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png","https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png","https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png","https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png","https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png","https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png","https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png","https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png","https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png","https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png","https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png","https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png","https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png","https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png","https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png","https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png","https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png","https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png","https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png","https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png","https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png","https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png","https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png","https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png","https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png","https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png","https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png","https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png","https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png","https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png","https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png","https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png","https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png","https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png","https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png","https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png","https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache","http://127.0.0.1:8545"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #21991664/Trx 4a26e3d59f142eedba37d06252954f7462f9a1eb |
View Raw JSON Data
{
"block": 21991664,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -15320,16 +15320,390 @@\n %ED%81%B4%EB%A6%AD%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0A\n+%EC%A3%BC) %ED%81%AC%EB%A1%AC %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%B8%EC%97%90%EC%84%9C %EC%96%B4%EB%96%BB%EA%B2%8C %EB%8B%A4%EC%9D%B4%EB%A0%89%ED%8A%B8%EB%A1%9C Metamask%EB%A5%BC %EB%9D%84%EC%9A%B8%EC%88%98 %EC%9E%88%EB%8A%94%EC%A7%80%EC%97%90 %EB%8C%80%ED%95%9C %EC%A7%88%EB%AC%B8%EC%97%90 %EB%8C%80%ED%95%9C %EB%8B%B5%EC%9E%85%EB%8B%88%EB%8B%A4. Chrome %ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8 Metamask%EB%8A%94 %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90 %EC%A0%84%EC%97%AD %EB%B3%80%EC%88%98 web3%EC%9D%84 %EC%82%BD%EC%9E%85%ED%95%A9%EB%8B%88%EB%8B%A4. MetaMask%EA%B0%80 %EC%84%A4%EC%B9%98%EB%90%98%EC%96%B4 web3%EA%B0%80 %EC%A3%BC%EC%9E%85 %EB%90%9C %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%B8 %EC%BD%98%EC%86%94%EC%97%90%EC%84%9C web3%EC%9D%84 %ED%83%80%EC%9D%B4%ED%95%91%ED%95%98%EC%97%AC web3 %EA%B0%9D%EC%B2%B4%EB%A5%BC %EB%B3%BC %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. MetaMask%EB%8A%94 %EC%84%9C%EB%B2%84 %EC%B8%A1%EA%B3%BC %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80 %EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 %EA%B0%84%EC%9D%98 %ED%94%84%EB%A1%9D%EC%8B%9C%EC%9E%85%EB%8B%88%EB%8B%A4. %ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8(Metamask)%EC%9D%B4 %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EB%A1%9C%EB%93%9C %EB%90%A0 %EB%95%8C%EB%A7%8C%EC%9D%B4 %EB%B3%80%EC%88%98%EB%A5%BC %EB%B3%BC %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.%0A%EC%95%84%EB%9E%98%EA%B8%80%EC%9D%80 Metamask QnA%EC%97%90 %EC%98%AC%EB%9D%BC%EC%98%A8 %EA%B8%80%EC%9E%85%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png)%0A%0A\n 3.MetaMa\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\",\"https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png\",\"https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png\",\"https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png\",\"https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png\",\"https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png\",\"https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png\",\"https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png\",\"https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png\",\"https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png\",\"https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png\",\"https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png\",\"https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png\",\"https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png\",\"https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png\",\"https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png\",\"https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png\",\"https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png\",\"https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png\",\"https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png\",\"https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png\",\"https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png\",\"https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png\",\"https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png\",\"https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png\",\"https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png\",\"https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png\",\"https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png\",\"https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png\",\"https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png\",\"https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png\",\"https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png\",\"https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png\",\"https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png\",\"https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png\",\"https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png\",\"https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png\",\"https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png\",\"https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png\",\"https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png\",\"https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png\",\"https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png\",\"https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png\",\"https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png\",\"https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png\",\"https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\",\"http://127.0.0.1:8545\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-29T13:03:03",
"trx_id": "4a26e3d59f142eedba37d06252954f7462f9a1eb",
"trx_in_block": 19,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/29 12:25:33
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/29 12:25:33
| author | dongshik |
| body | 안녕하세요. 반갑습니다. Ethereum Dapp개발을 위한 truffle 튜토리얼 중 pet-shop 튜토리얼을 통해 로컬 개발환경 구성과 실행 테스트, 명령어 실행은 물론이고 스마트 컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다 또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다 (먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다) Pet Shop 튜토리얼의 대상 - Pet shop의 입양(Adoption) 추적 시스템 추축 과정 안내를 목표로 합니다 - Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자를 대상으로 합니다 Pet Shop 튜토리얼 요건정의 - 고객은 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있습니다 - 한번에 16마리의 애완동물을 관리하기 위한 공간을 보유하고 있으며 - 각 애완동물에 대한 정보 데이터 베이스를 보유하고 있습니다 - Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp 구현을 목표로 하며 - 기본 웹사이트의 구조와 Style을 제공합니다 - 프론트엔드 로직과 스마트 계약을 작성하면 완성되는 형식으로 구성되어 있습니다 Pet Shop 튜토리얼 아키텍처  4가지의 주요 기능으로 구성되며 순차적으로 하나씩 살펴 보겠습니다 튜토리얼 순서 1. 개발 환경 설정 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 3. Smart Contract 작성하기 4. Smart Contract 컴파일 및 마이그레이션 5. Smart Contract 테스트 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 7. 브라우저에서 dapp과 상호 작용 (MacOS를 기준으로 작성합니다) ## 1. 개발 환경 설정 먼저 Truffle 설치 전에 아래 두가지를 설치합니다. - Node.js v6+ LTS and npm (comes with Node) - Git 완료 후 Truffle을 설치합니다.  Truffle 설치 확인  Ganache 설치 스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인 http://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.  설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)  ## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 Truffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.  Pet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.  생성된 기본 Truffle 디렉토리 구조 및 파일 설명 contracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. Migrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. test / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다. truffle.js : Truffle 설정 파일  ## 3. Smart Contract 작성하기 백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다. 첫 번째로, contracts > Adoption.sol 파일 추가 합니다.  심볼 (^)은 필요한 Solidity의 최소버전을 지정("표시된 버전 이상")하며, 명령문은 semicolons(;)로 끝납니다. Address라는 고유한 데이터 타입, 즉 Ethereum의 주소이며 20 bytes의 값으로 저장됩니다. ### 단일 변수 adopters 정의 Ethereum address의 배열. 배열은 하나의 유형(type)이 포함되며 고정 또는 가변 길이를 가질 수 있습니다. 이 경우 유형은 address 이며 배열의 크기는 16입니다. 또한 변수 adopters가 public임을 알 수 있습니다. Public 변수는 자동으로 getter 메소드가 가지지만, 이 경우 배열은 키가 필요하며 단일 값만 반환합니다. 나중에 UI에서 사용할 전체 배열을 반환하는 함수를 작성할 것입니다. ### 첫번째 함수 : Adopting a pet 사용자가 입양(Adoption) 요청을 할 수 있도록 허용합니다. Solidity에서는 함수 매개 변수와 출력 유형을 모두 지정 해야 합니다. 이 경우 petId (정수)를 가져 와서 정수를 반환합니다. PetId가 adopters 배열 범위 내에 있는지 확인합니다. Solidity에있는 배열은 0부터 인덱싱되므로 ID 값은 0에서 15 사이 여야합니다. ID가 범위 내에 있는지 확인하기 위해 require () 문을 사용합니다. ID가 범위 내에 있으면 우리는 adopters 배열에 호출 한 주소를 추가합니다. 이 함수를 호출 한 사람 또는 스마트 계약자의 주소는 msg.sender로 표시됩니다. 마지막으로, 제공된 애완 동물을 확인하고 반환합니다. 마지막으로, 확인을 하기 위해 전달했던 petId를 반환합니다. ### 두번째 함수 : Retrieving the adopters 위에서 언급 한 것처럼 배열 getter는 주어진 키에서 하나의 값만 반환합니다. UI에서는 모든 애완 동물의 입양 상태를 업데이트해야하지만, 16 개의 API 호출을 하는 것은 이상적이지 않습니다. 다음 단계는 전체 배열을 반환하는 함수를 작성하는 것입니다. 위에서 추가 한 adopt () 함수 다음, 스마트 계약에 getAdopters () 함수를 추가합니다. adopters 들은 이미 선언 되었으므로 간단하게 반환 할 수 있습니다. 반환 유형 (이 경우, Adopters의 유형)을 Address [16]으로 지정해야합니다. ## 4. Smart Contract 컴파일 및 마이그레이션 앞에서 간단한 Smart contract를 작성했습니다. 다음으로 컴파일 및 마이그레이션을 해보겠습니다 트러플은 내장 개발 콘솔(Truffle Develop) 가지고 있는데 개발용 블럭체인을 생성하고 이를통해 컨트랙트 배포(deploy)테스트를 해볼수 있습니다 또한 콘솔에서 직접 트러플의 명령들을 실행하는 기능도 가지고 있습니다 ### 컴파일(compilation) Solidity는 컴파일 언어 입니다. 즉, Ethereum Virtual Machine(EVM)에서 실행하기 위해 bytecode로 컴파일 해야 합니다 인간이 읽을수있는 Solidity코드를 EVM이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다  컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.  ### 마이그레이션(migration) 성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다. 마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다. migrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.  이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)  이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다 1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성 2. 2_deploy_contracts.js에 아래 내용 입력  3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다. (응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)  truffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다.  4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다  순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.) 5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.  아래는 추가된 블록의 정보  트렌젝션의 처리 정보  이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with) ## 5. Smart Contract 테스트 Truffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다. 1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다. 2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.  Assert.sol : 테스트에 사용할 다양한 assertion 을 제공합니다. 테스트에서 assertion은 같음(equality), 같지 않음(inequality), 테스트를 통과했는지 실패했는지 반환하기 위한 공백과 같은 것들을 확인 합니다. DeployedAddresses.sol : 테스트를 실행할때 Truffle은 테스트중인 컨트랙트의 새로운 인스턴스를 블록체인에 배포합니다. 이 스마트 컨트랙트는 deploy된 컨트랙트의 주소를 가져옵니다. Adoption.sol : 테스트 하고자하는 스마트 컨트랙트 <br> *주의 )처음의 두 import는 truffle 디렉토리가 아닌 전역 Truffle 파일입니다. 그래서 test/ 디렉토리 내부에 truffle 디렉토리를 볼수 없습니다. <br> 그런 다음 테스트될 스마트 컨트랙트를 포함하는 contract-wide 변수를 정의하고 address를 가져오기 위해 DeployedAddresses 스마트 컨트랙트를 호출합니다. #### adopt() 함수 테스트 adopt() 함수를 테스트하기 위해 앞서 작성한 Adoption.sol 컨트랙트의 adopt()함수를 상기해보면 함수는 성공하면 입력된 petId를 리턴하는 것을 떠올려 보기 바랍니다. 테스트 케이스에서는 ID가 반환되었는지와 전달된 ID에 대해 adopt() 함수의 반환 값을 비교하여 올바른지 확인 할 수 있습니다. 1. adoption 선언 이후에 TestAdoption.sol 스마트 컨트랙트 안에 아래의 함수(testUserCanAdoptPet)를 추가합니다  - 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다. - 그런 다음 예상 값인 8을 역시 선언합니다. - 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다. #### 입양한 Pet의 소유자 검색 테스트 앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다. 1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다.  TestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다. #### 모든 Pet의 소유자 검색 테스트 배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다. 1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. <br> adopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신 메모리에 값을 일시적으로 저장하도록 알립니다. <br> adopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. 전체 테스트 코드입니다.  #### 테스트 실행하기 이제 터미널로 돌아가서 test를 실행합니다. "truffle test"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.  ## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다. 이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다. 이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다.  #### web3 인스턴스 1.텍스트 편집기로 /src/js/app.js 파일을 엽니다. 2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다. 실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.  init 함수  Web3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다. initWeb3 함수  - 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) - 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다. - 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다. #### 컨트랙트 인스턴스 1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.  - 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다. - 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다. - 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다. - 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다. #### 입양된 Pet정보를 얻고 UI를 업데이트 1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.  - 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다. - 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다. - call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다. - getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다. - 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 "Success"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다. - 모든 오류는 콘솔에 기록(logging)됩니다. #### Adopt() 함수 다루기 1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.  - web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다. - 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 "보낸 사람"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다. - 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다. ## 7. 브라우저에서 dapp과 상호 작용 이제 Dapp을 사용할 준비가 되었습니다. #### MetaMask 설치 및 설정 브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br> 1.브라우저에 MetaMask를 설치합니다. 2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다.  3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다. 4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.  5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.  6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.   아래에 비밀번호를 입력하고 OK를 클릭합니다.  7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. "Main Network"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.  8."New RPC URL"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.  <br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다. 9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다. Truffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. 첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다.  설정이 이제 완료 되었습니다. #### lite-server 설치 및 설정 이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다. 1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  lite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. 웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다. 프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.   #### App 사용하기 1.로컬 웹 서버를 시작합니다.   dev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.  2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다. 3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.  4.채택 된 애완 동물의 변화 옆에있는 버튼이 "Success"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.  그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :  #### Ganashe 트랜젝션 확인   |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png","https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png","https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png","https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png","https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png","https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png","https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png","https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png","https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png","https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png","https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png","https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png","https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png","https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png","https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png","https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png","https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png","https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png","https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png","https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png","https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png","https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png","https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png","https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png","https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png","https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png","https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png","https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png","https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png","https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png","https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png","https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png","https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png","https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png","https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png","https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png","https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png","https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png","https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png","https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png","https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png","https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png","https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png","https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png","https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache","http://127.0.0.1:8545"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #21990914/Trx 2d326c52bb5133006b5aa7756b3c86d6cb125c59 |
View Raw JSON Data
{
"block": 21990914,
"op": [
"comment",
{
"author": "dongshik",
"body": "안녕하세요. 반갑습니다.\n\nEthereum Dapp개발을 위한 truffle 튜토리얼 중 pet-shop 튜토리얼을 통해 로컬 개발환경 구성과 실행 테스트, 명령어 실행은 물론이고 스마트 컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다\n\n또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다\n\n(먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다)\n\nPet Shop 튜토리얼의 대상\n- Pet shop의 입양(Adoption) 추적 시스템 추축 과정 안내를 목표로 합니다\n- Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자를 대상으로 합니다\n\nPet Shop 튜토리얼 요건정의\n- 고객은 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있습니다\n- 한번에 16마리의 애완동물을 관리하기 위한 공간을 보유하고 있으며\n- 각 애완동물에 대한 정보 데이터 베이스를 보유하고 있습니다\n- Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp 구현을 목표로 하며\n- 기본 웹사이트의 구조와 Style을 제공합니다\n- 프론트엔드 로직과 스마트 계약을 작성하면 완성되는 형식으로 구성되어 있습니다\n\nPet Shop 튜토리얼 아키텍처\n\n4가지의 주요 기능으로 구성되며 순차적으로 하나씩 살펴 보겠습니다\n\n튜토리얼 순서\n\n1. 개발 환경 설정\n2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\n3. Smart Contract 작성하기\n4. Smart Contract 컴파일 및 마이그레이션\n5. Smart Contract 테스트\n6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n7. 브라우저에서 dapp과 상호 작용\n\n(MacOS를 기준으로 작성합니다)\n\n## 1. 개발 환경 설정\n\n먼저 Truffle 설치 전에 아래 두가지를 설치합니다.\n- Node.js v6+ LTS and npm (comes with Node)\n- Git\n\n완료 후 Truffle을 설치합니다.\n\n\nTruffle 설치 확인\n\n\nGanache 설치\n스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인\nhttp://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.\n\n\n설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)\n\n\n## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\nTruffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.\n\n\nPet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.\n\n\n생성된 기본 Truffle 디렉토리 구조 및 파일 설명\ncontracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. \n\nMigrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. \n\ntest / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다.\n\ntruffle.js : Truffle 설정 파일\n\n\n\n## 3. Smart Contract 작성하기\n백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다.\n첫 번째로, contracts > Adoption.sol 파일 추가 합니다.\n\n\n심볼 (^)은 필요한 Solidity의 최소버전을 지정(\"표시된 버전 이상\")하며, 명령문은 semicolons(;)로 끝납니다.\n\nAddress라는 고유한 데이터 타입, 즉 Ethereum의 주소이며 20 bytes의 값으로 저장됩니다.\n\n### 단일 변수 adopters 정의\nEthereum address의 배열. 배열은 하나의 유형(type)이 포함되며 고정 또는 가변 길이를 가질 수 있습니다. 이 경우 유형은 address 이며 배열의 크기는 16입니다.\n\n또한 변수 adopters가 public임을 알 수 있습니다. Public 변수는 자동으로 getter 메소드가 가지지만, 이 경우 배열은 키가 필요하며 단일 값만 반환합니다. 나중에 UI에서 사용할 전체 배열을 반환하는 함수를 작성할 것입니다.\n\n### 첫번째 함수 : Adopting a pet\n사용자가 입양(Adoption) 요청을 할 수 있도록 허용합니다.\nSolidity에서는 함수 매개 변수와 출력 유형을 모두 지정 해야 합니다. 이 경우 petId (정수)를 가져 와서 정수를 반환합니다.\nPetId가 adopters 배열 범위 내에 있는지 확인합니다. Solidity에있는 배열은 0부터 인덱싱되므로 ID 값은 0에서 15 사이 여야합니다. ID가 범위 내에 있는지 확인하기 위해 require () 문을 사용합니다.\n\nID가 범위 내에 있으면 우리는 adopters 배열에 호출 한 주소를 추가합니다. 이 함수를 호출 한 사람 또는 스마트 계약자의 주소는 msg.sender로 표시됩니다. 마지막으로, 제공된 애완 동물을 확인하고 반환합니다.\n\n마지막으로, 확인을 하기 위해 전달했던 petId를 반환합니다.\n\n### 두번째 함수 : Retrieving the adopters\n위에서 언급 한 것처럼 배열 getter는 주어진 키에서 하나의 값만 반환합니다. UI에서는 모든 애완 동물의 입양 상태를 업데이트해야하지만, 16 개의 API 호출을 하는 것은 이상적이지 않습니다. 다음 단계는 전체 배열을 반환하는 함수를 작성하는 것입니다.\n\n위에서 추가 한 adopt () 함수 다음, 스마트 계약에 getAdopters () 함수를 추가합니다.\n\nadopters 들은 이미 선언 되었으므로 간단하게 반환 할 수 있습니다. 반환 유형 (이 경우, Adopters의 유형)을 Address [16]으로 지정해야합니다.\n\n\n## 4. Smart Contract 컴파일 및 마이그레이션\n앞에서 간단한 Smart contract를 작성했습니다. 다음으로 컴파일 및 마이그레이션을 해보겠습니다\n\n트러플은 내장 개발 콘솔(Truffle Develop) 가지고 있는데 개발용 블럭체인을 생성하고 이를통해 컨트랙트 배포(deploy)테스트를 해볼수 있습니다\n\n또한 콘솔에서 직접 트러플의 명령들을 실행하는 기능도 가지고 있습니다\n\n### 컴파일(compilation)\nSolidity는 컴파일 언어 입니다. 즉, Ethereum Virtual Machine(EVM)에서 실행하기 위해 bytecode로 컴파일 해야 합니다\n\n인간이 읽을수있는 Solidity코드를 EVM이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다\n\n\n\n컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.\n\n\n### 마이그레이션(migration)\n성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다.\n마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다.\n\nmigrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.\n\n\n이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)\n\n\n이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다\n\n1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성\n2. 2_deploy_contracts.js에 아래 내용 입력\n\n\n3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다.\n(응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)\n\ntruffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다.\n\n\n4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다\n\n순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.)\n\n5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.\n\n아래는 추가된 블록의 정보\n\n트렌젝션의 처리 정보\n\n이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with)\n\n\n## 5. Smart Contract 테스트\nTruffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다.\n\n1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다.\n2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.\n\nAssert.sol : 테스트에 사용할 다양한 assertion 을 제공합니다. 테스트에서 assertion은 같음(equality), 같지 않음(inequality), 테스트를 통과했는지 실패했는지 반환하기 위한 공백과 같은 것들을 확인 합니다.\nDeployedAddresses.sol : 테스트를 실행할때 Truffle은 테스트중인 컨트랙트의 새로운 인스턴스를 블록체인에 배포합니다. 이 스마트 컨트랙트는 deploy된 컨트랙트의 주소를 가져옵니다.\nAdoption.sol : 테스트 하고자하는 스마트 컨트랙트 <br>\n*주의 )처음의 두 import는 truffle 디렉토리가 아닌 전역 Truffle 파일입니다. 그래서 test/ 디렉토리 내부에 truffle 디렉토리를 볼수 없습니다. <br>\n그런 다음 테스트될 스마트 컨트랙트를 포함하는 contract-wide 변수를 정의하고 address를 가져오기 위해 DeployedAddresses 스마트 컨트랙트를 호출합니다.\n#### adopt() 함수 테스트\nadopt() 함수를 테스트하기 위해 앞서 작성한 Adoption.sol 컨트랙트의 adopt()함수를 상기해보면 함수는 성공하면 입력된 petId를 리턴하는 것을 떠올려 보기 바랍니다. 테스트 케이스에서는 ID가 반환되었는지와 전달된 ID에 대해 adopt() 함수의 반환 값을 비교하여 올바른지 확인 할 수 있습니다.\n\n1. adoption 선언 이후에 TestAdoption.sol 스마트 컨트랙트 안에 아래의 함수(testUserCanAdoptPet)를 추가합니다 \n\n- 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다.\n- 그런 다음 예상 값인 8을 역시 선언합니다.\n- 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다.\n\n#### 입양한 Pet의 소유자 검색 테스트\n앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다.\n\n1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다.\n\nTestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다.\n\n#### 모든 Pet의 소유자 검색 테스트\n배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다.\n1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. \n<br>\nadopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신 메모리에 값을 일시적으로 저장하도록 알립니다. <br>\nadopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. \n\n전체 테스트 코드입니다.\n\n\n#### 테스트 실행하기\n이제 터미널로 돌아가서 test를 실행합니다.\n\"truffle test\"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.\n\n\n\n## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다.\n이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다.\n\n이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. \n\n\n#### web3 인스턴스 \n1.텍스트 편집기로 /src/js/app.js 파일을 엽니다.\n\n2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다.\n실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.\n\ninit 함수\n\nWeb3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다.\ninitWeb3 함수\n\n- 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) \n- 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다.\n- 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다.\n\n#### 컨트랙트 인스턴스 \n1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.\n\n- 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다.\n- 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다.\n- 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다.\n- 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다. \n\n#### 입양된 Pet정보를 얻고 UI를 업데이트 \n1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.\n\n- 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다.\n- 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다.\n- call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다.\n- getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다.\n- 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 \"Success\"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다.\n- 모든 오류는 콘솔에 기록(logging)됩니다.\n\n#### Adopt() 함수 다루기\n1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다.\n\n- web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다.\n- 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 \"보낸 사람\"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다.\n- 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다.\n\n## 7. 브라우저에서 dapp과 상호 작용\n이제 Dapp을 사용할 준비가 되었습니다.\n\n#### MetaMask 설치 및 설정\n브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br>\n1.브라우저에 MetaMask를 설치합니다.\n2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다.\n\n3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다.\n4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.\n\n5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.\n\n6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.\n\n\n아래에 비밀번호를 입력하고 OK를 클릭합니다.\n\n7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. \"Main Network\"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.\n\n8.\"New RPC URL\"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.\n\n<br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다.\n9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다.\nTruffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. \n첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. \n\n설정이 이제 완료 되었습니다.\n\n#### lite-server 설치 및 설정\n이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다.\n\n1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다. \n\nlite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. \n웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다.\n\n프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.\n\n\n\n\n#### App 사용하기\n1.로컬 웹 서버를 시작합니다.\n\n\n\ndev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.\n\n\n2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다.\n\n3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.\n\n4.채택 된 애완 동물의 변화 옆에있는 버튼이 \"Success\"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.\n\n그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :\n\n\n\n\n#### Ganashe 트랜젝션 확인\n\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\",\"https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png\",\"https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png\",\"https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png\",\"https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png\",\"https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png\",\"https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png\",\"https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png\",\"https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png\",\"https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png\",\"https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png\",\"https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png\",\"https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png\",\"https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png\",\"https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png\",\"https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png\",\"https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png\",\"https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png\",\"https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png\",\"https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png\",\"https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png\",\"https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png\",\"https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png\",\"https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png\",\"https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png\",\"https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png\",\"https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png\",\"https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png\",\"https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png\",\"https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png\",\"https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png\",\"https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png\",\"https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png\",\"https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png\",\"https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png\",\"https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png\",\"https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png\",\"https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png\",\"https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png\",\"https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png\",\"https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png\",\"https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png\",\"https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png\",\"https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png\",\"https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\",\"http://127.0.0.1:8545\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-29T12:25:33",
"trx_id": "2d326c52bb5133006b5aa7756b3c86d6cb125c59",
"trx_in_block": 42,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/29 01:20:18
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/29 01:20:18
| author | dongshik |
| body | @@ -341,15 +341,8 @@ %EB%8B%A4)%0A%0A -Pete%E2%80%99s Pet @@ -350,16 +350,20 @@ hop %ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC +%EC%9D%98 %EB%8C%80%EC%83%81 %0A- Pet s @@ -513,10 +513,12 @@ %ED%86%A0%EB%A6%AC%EC%96%BC -%EB%B0%B0%EA%B2%BD +%EC%9A%94%EA%B1%B4%EC%A0%95%EC%9D%98 %0A- %EA%B3%A0 @@ -5746,24 +5746,60 @@ he%EB%A5%BC %EC%82%AC%EC%9A%A9 %ED%95%A9%EB%8B%88%EB%8B%A4.%0A +(%EC%9D%91%EC%9A%A9 %ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%97%90%EC%84%9C Ganache.app%EC%9D%84 %EC%8B%A4%ED%96%89%ED%95%98%EB%A9%B4 %EB%90%A9%EB%8B%88%EB%8B%A4.)%0A !%5B%5D(https:// @@ -5901,24 +5901,82 @@ ache%EB%A5%BC %EC%84%A4%EC%A0%95%ED%95%A9%EB%8B%88%EB%8B%A4. - + %EC%9D%B4%EB%95%8C %EC%84%A4%EC%A0%95%EC%A0%95%EB%B3%B4%EC%97%90 networks%EC%97%90 development %EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%98%EB%A9%B4 %EB%A1%9C%EC%BB%AC Ganache%EC%97%90 %EC%97%B0%EA%B2%B0%EB%90%A9%EB%8B%88%EB%8B%A4. %0A!%5B%5D(https:/ @@ -6058,34 +6058,2334 @@ g)%0A%0A -## 5. Smart Contract %ED%85%8C%EC%8A%A4%ED%8A%B8%0A%0A +4. %EC%9D%B4%EC%A0%9C %ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%A5%BC %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9C%BC%EB%A1%9C migration %ED%95%A9%EB%8B%88%EB%8B%A4%0A!%5B%5D(https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png)%0A%EC%88%9C%EC%84%9C%EB%8C%80%EB%A1%9C %EC%8B%A4%ED%96%89%EC%A4%91%EC%9D%B8 %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EA%B3%BC %EB%B0%B0%ED%8F%AC %EB%90%9C %EA%B0%81 %EA%B3%84%EC%95%BD%EC%9D%98 %EB%B8%94%EB%A1%9D %EC%B2%B4%EC%9D%B8 %EC%A3%BC%EC%86%8C%EB%A5%BC %EB%B3%BC %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. (%EC%9D%B4%EB%95%8C %EC%A3%BC%EC%86%8C%EA%B0%80 %EB%8B%A4%EB%A5%BC %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.)%0A%0A5. Ganache%EB%A5%BC %ED%86%B5%ED%95%B4 %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9D%98 %EC%83%81%ED%83%9C%EA%B0%80 %EB%B3%80%EA%B2%BD%EB%90%9C %EA%B2%83%EC%9D%84 %ED%99%95%EC%9D%B8%ED%95%A9%EB%8B%88%EB%8B%A4. %ED%98%84%EC%9E%AC %EB%B8%94%EB%A1%9D%EC%9D%B4 %EC%9D%B4%EC%A0%84%EC%97%90 0%EC%9D%B4%EC%97%88%EB%8A%94%EB%8D%B0 %EB%B8%94%EB%A1%9D%EC%9D%B4 4%EB%A1%9C %EB%B3%80%EA%B2%BD%EB%90%9C%EA%B2%83%EC%9D%84 %EB%B3%B4%EC%97%AC%EC%A4%8D%EB%8B%88%EB%8B%A4. %EB%98%90%ED%95%9C %EC%B2%AB %EB%B2%88%EC%A7%B8 %EA%B3%84%EC%A0%95%EC%9D%98 %EC%9B%90%EB%9E%98 Ether%EB%8A%94 100 %EC%9D%B4%EC%97%88%EC%A7%80%EB%A7%8C %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%ED%95%98%EB%8A%94 %EB%8D%B0 %EB%93%9C%EB%8A%94 %ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98 %EB%B9%84%EC%9A%A9%EC%9C%BC%EB%A1%9C %EC%9D%B8%ED%95%B4 %EC%9D%B4%EC%A0%9C%EB%8A%94 %EB%8D%94 %EB%82%AE%EC%8A%B5%EB%8B%88%EB%8B%A4. %EB%82%98%EC%A4%91%EC%97%90 %EA%B1%B0%EB%9E%98 %EB%B9%84%EC%9A%A9(Transaction Costs)%EC%97%90 %EB%8C%80%ED%95%B4 %EC%9E%90%EC%84%B8%ED%9E%88 %EC%9D%B4%EC%95%BC%EA%B8%B0%ED%95%98%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png)%0A%EC%95%84%EB%9E%98%EB%8A%94 %EC%B6%94%EA%B0%80%EB%90%9C %EB%B8%94%EB%A1%9D%EC%9D%98 %EC%A0%95%EB%B3%B4%0A!%5B%5D(https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png)%0A%ED%8A%B8%EB%A0%8C%EC%A0%9D%EC%85%98%EC%9D%98 %EC%B2%98%EB%A6%AC %EC%A0%95%EB%B3%B4%0A!%5B%5D(https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png)%0A%EC%9D%B4%EC%A0%9C %EC%B2%AB %EB%B2%88%EC%A7%B8 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%84%9C%EB%A5%BC %EC%9E%91%EC%84%B1%ED%95%98%EC%97%AC %EB%A1%9C%EC%BB%AC%EB%A1%9C %EC%8B%A4%ED%96%89%EC%A4%91%EC%9D%B8 %EB%B8%94%EB%A1%9D %EC%B2%B4%EC%9D%B8%EC%97%90 %EB%B0%B0%ED%8F%AC%ED%96%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EC%9D%B4%EC%A0%9C %EC%9D%B4 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EA%B3%BC %EC%83%81%ED%98%B8%EC%9E%91%EC%9A%A9%EC%9D%84 %ED%95%B4 %EB%B3%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4. (interact with)%0A%0A%0A## 5. Smart Contract %ED%85%8C%EC%8A%A4%ED%8A%B8%0ATruffle%EC%9D%80 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD %ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9D%98 %EA%B2%BD%EC%9A%B0 %EB%A7%A4%EC%9A%B0 %EC%9C%A0%EC%97%B0%ED%95%A9%EB%8B%88%EB%8B%A4. %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%8A%94 JavaScript %EB%98%90%EB%8A%94 Solidity%EB%A1%9C %EC%9E%91%EC%84%B1 %EB%90%A0 %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EC%9D%B4 %ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC%EC%97%90%EC%84%9C%EB%8A%94 Solidity%EC%97%90%EC%84%9C %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC %EC%9E%91%EC%84%B1%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0A1. test/ %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90 TestAdoption.sol %EC%9D%B4%EB%9D%BC%EB%8A%94 %EC%9D%B4%EB%A6%84%EC%9D%98 %ED%8C%8C%EC%9D%BC%EC%9D%84 %EC%83%9D%EC%84%B1%ED%95%A9%EB%8B%88%EB%8B%A4.%0A2. TestAdoption.sol %ED%8C%8C%EC%9D%BC%EC%97%90 %EC%95%84%EB%9E%98%EC%9D%98 %EB%82%B4%EC%9A%A9%EC%9D%84 %EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png)%0AAssert.sol : %ED%85%8C%EC%8A%A4%ED%8A%B8%EC%97%90 %EC%82%AC%EC%9A%A9%ED%95%A0 %EB%8B%A4%EC%96%91%ED%95%9C assertion %EC%9D%84 %EC%A0%9C%EA%B3%B5%ED%95%A9%EB%8B%88%EB%8B%A4. %ED%85%8C%EC%8A%A4%ED%8A%B8%EC%97%90%EC%84%9C assertion%EC%9D%80 %EA%B0%99%EC%9D%8C(equality), %EA%B0%99%EC%A7%80 %EC%95%8A%EC%9D%8C(inequality), %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC %ED%86%B5%EA%B3%BC%ED%96%88%EB%8A%94%EC%A7%80 %EC%8B%A4%ED%8C%A8%ED%96%88%EB%8A%94%EC%A7%80 %EB%B0%98%ED%99%98%ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%9C %EA%B3%B5%EB%B0%B1%EA%B3%BC %EA%B0%99%EC%9D%80 %EA%B2%83%EB%93%A4%EC%9D%84 %ED%99%95%EC%9D%B8 %ED%95%A9%EB%8B%88%EB%8B%A4.%0ADeployedAddresses.sol : %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%A0%EB%95%8C Truffle%EC%9D%80 %ED%85%8C%EC%8A%A4%ED%8A%B8%EC%A4%91%EC%9D%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%9D%98 %EC%83%88%EB%A1%9C%EC%9A%B4 %EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EB%A5%BC %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%97%90 %EB%B0%B0%ED%8F%AC%ED%95%A9%EB%8B%88%EB%8B%A4. %EC%9D%B4 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%8A%94 deploy%EB%90%9C %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%9D%98 %EC%A3%BC%EC%86%8C%EB%A5%BC %EA%B0%80%EC%A0%B8%EC%98%B5%EB%8B%88%EB%8B%A4.%0AAdoption.sol : %ED%85%8C%EC%8A%A4%ED%8A%B8 %ED%95%98%EA%B3%A0%EC%9E%90%ED%95%98%EB%8A%94 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8 %3Cbr%3E%0A*%EC%A3%BC%EC%9D%98 )%EC%B2%98%EC%9D%8C%EC%9D%98 %EB%91%90 import%EB%8A%94 truffle %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EA%B0%80 %EC%95%84%EB%8B%8C %EC%A0%84%EC%97%AD Truffle %ED%8C%8C%EC%9D%BC%EC%9E%85%EB%8B%88%EB%8B%A4. %EA%B7%B8%EB%9E%98%EC%84%9C test/ %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC %EB%82%B4%EB%B6%80%EC%97%90 truffle %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EB%A5%BC %EB%B3%BC%EC%88%98 %EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4. %3Cbr%3E%0A%EA%B7%B8%EB%9F%B0 %EB%8B%A4%EC%9D%8C %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%90%A0 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%A5%BC %ED%8F%AC%ED%95%A8%ED%95%98%EB%8A%94 contract-wide %EB%B3%80%EC%88%98%EB%A5%BC %EC%A0%95%EC%9D%98%ED%95%98%EA%B3%A0 address%EB%A5%BC %EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0 %EC%9C%84%ED%95%B4 DeployedAddresses %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%A5%BC %ED%98%B8%EC%B6%9C%ED%95%A9%EB%8B%88%EB%8B%A4.%0A#### adopt() %ED%95%A8%EC%88%98 %ED%85%8C%EC%8A%A4%ED%8A%B8%0Aadopt() %ED%95%A8%EC%88%98%EB%A5%BC %ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%B4 %EC%95%9E%EC%84%9C %EC%9E%91%EC%84%B1%ED%95%9C Adoption.sol %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%9D%98 adopt()%ED%95%A8%EC%88%98%EB%A5%BC %EC%83%81%EA%B8%B0%ED%95%B4%EB%B3%B4%EB%A9%B4 %ED%95%A8%EC%88%98%EB%8A%94 %EC%84%B1%EA%B3%B5%ED%95%98%EB%A9%B4 %EC%9E%85%EB%A0%A5%EB%90%9C petId%EB%A5%BC %EB%A6%AC%ED%84%B4%ED%95%98%EB%8A%94 %EA%B2%83%EC%9D%84 %EB%96%A0%EC%98%AC%EB%A0%A4 %EB%B3%B4%EA%B8%B0 %EB%B0%94%EB%9E%8D%EB%8B%88%EB%8B%A4. %ED%85%8C%EC%8A%A4%ED%8A%B8 %EC%BC%80%EC%9D%B4%EC%8A%A4%EC%97%90%EC%84%9C%EB%8A%94 ID%EA%B0%80 %EB%B0%98%ED%99%98%EB%90%98%EC%97%88%EB%8A%94%EC%A7%80%EC%99%80 %EC%A0%84%EB%8B%AC%EB%90%9C ID%EC%97%90 %EB%8C%80%ED%95%B4 adopt() %ED%95%A8%EC%88%98%EC%9D%98 %EB%B0%98%ED%99%98 %EA%B0%92%EC%9D%84 %EB%B9%84%EA%B5%90%ED%95%98%EC%97%AC %EC%98%AC%EB%B0%94%EB%A5%B8%EC%A7%80 %ED%99%95%EC%9D%B8 %ED%95%A0 %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.%0A%0A1. adoption %EC%84%A0%EC%96%B8 %EC%9D%B4%ED%9B%84%EC%97%90 TestAdoption.sol %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8 %EC%95%88%EC%97%90 %EC%95%84%EB%9E%98%EC%9D%98 %ED%95%A8%EC%88%98(testUserCanAdoptPet)%EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4 %0A!%5B%5D(https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png)%0A- %EC%9E%85%EB%A0%A5%EA%B0%92(ID) 8%EB%A1%9C Adoption.sol %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%9D%98 adopt() %ED%95%A8%EC%88%98%EB%A5%BC %ED%98%B8%EC%B6%9C%ED%95%A9%EB%8B%88%EB%8B%A4.%0A- %EA%B7%B8%EB%9F%B0 %EB%8B%A4%EC%9D%8C %EC%98%88%EC%83%81 %EA%B0%92%EC%9D%B8 8%EC%9D%84 %EC%97%AD%EC%8B%9C %EC%84%A0%EC%96%B8%ED%95%A9%EB%8B%88%EB%8B%A4.%0A- %EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC%EB%A1%9C Assert.equal()%EC%97%90 %EC%8B%A4%EC%A0%9C%EA%B0%92(returnedId), %EC%98%88%EC%83%81%EA%B0%92(expected) %EB%B0%8F %EC%8B%A4%ED%8C%A8 %EB%A9%94%EC%8B%9C%EC%A7%80(%ED%85%8C%EC%8A%A4%ED%8A%B8%EA%B0%80 %ED%86%B5%EA%B3%BC%ED%95%98%EC%A7%80 %EB%AA%BB%ED%95%98%EB%A9%B4 %EC%BD%98%EC%86%94%EC%97%90 %EC%B6%9C%EB%A0%A5%EB%90%A8)%EB%A5%BC %EC%A0%84%EB%8B%AC%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0A#### %EC%9E%85%EC%96%91%ED%95%9C pet%EC%9D%98 %EC%86%8C%EC%9C%A0%EC%9E%90 %EA%B2%80%EC%83%89 %ED%85%8C%EC%8A%A4%ED%8A%B8%0A%EC%95%9E%EC%84%9C %EC%96%B8%EA%B8%89%ED%95%9C public %EB%B3%80%EC%88%98%EA%B0%80 %EC%9E%90%EB%8F%99 getter %EB%A9%94%EC%86%8C%EB%93%9C%EB%A5%BC %EA%B0%80%EC%A7%84%EB%8B%A4%EB%8A%94%EA%B2%83%EC%9D%84 %EA%B8%B0%EC%96%B5%ED%95%9C%EB%8B%A4%EB%A9%B4, %EC%9C%84%EC%9D%98 %EC%9E%85%EC%96%91 %ED%85%8C%EC%8A%A4%ED%8A%B8%EC%97%90%EC%84%9C %EC%A0%80%EC%9E%A5%ED%95%9C %EC%A3%BC%EC%86%8C%EB%A5%BC %EA%B2%80%EC%83%89%ED%95%A0 %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EC%A0%80%EC%9E%A5%EB%90%9C %EB%8D%B0%EC%9D%B4%ED%84%B0%EB%8A%94 %ED%85%8C%EC%8A%A4%ED%8A%B8 %EA%B8%B0%EA%B0%84 %EB%8F%99%EC%95%88 %EC%A7%80%EC%86%8D%EB%90%98%EA%B8%B0 %EB%95%8C%EB%AC%B8%EC%97%90 %EC%95%9E%EC%84%9C %ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%9C Pet%EC%9D%98 adopt(8)%EC%9D%98 %EC%9E%85%EC%96%91 %EC%A0%95%EB%B3%B4%EB%8A%94 %EB%8B%A4%EB%A5%B8 %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC %ED%86%B5%ED%95%B4 %EA%B2%80%EC%83%89 %EA%B0%80%EB%8A%A5 %ED%95%A9%EB%8B%88%EB%8B%A4. %0A%0A%0A# |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png","https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png","https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png","https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png","https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png","https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png","https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png","https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png","https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png","https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png","https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png","https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png","https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png","https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #21977611/Trx 0b14d7ae59416bf8476f06936e87e3c6eb4e6733 |
View Raw JSON Data
{
"block": 21977611,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -341,15 +341,8 @@\n %EB%8B%A4)%0A%0A\n-Pete%E2%80%99s \n Pet \n@@ -350,16 +350,20 @@\n hop %ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC\n+%EC%9D%98 %EB%8C%80%EC%83%81\n %0A- Pet s\n@@ -513,10 +513,12 @@\n %ED%86%A0%EB%A6%AC%EC%96%BC \n-%EB%B0%B0%EA%B2%BD\n+%EC%9A%94%EA%B1%B4%EC%A0%95%EC%9D%98\n %0A- %EA%B3%A0\n@@ -5746,24 +5746,60 @@\n he%EB%A5%BC %EC%82%AC%EC%9A%A9 %ED%95%A9%EB%8B%88%EB%8B%A4.%0A\n+(%EC%9D%91%EC%9A%A9 %ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%97%90%EC%84%9C Ganache.app%EC%9D%84 %EC%8B%A4%ED%96%89%ED%95%98%EB%A9%B4 %EB%90%A9%EB%8B%88%EB%8B%A4.)%0A\n !%5B%5D(https://\n@@ -5901,24 +5901,82 @@\n ache%EB%A5%BC %EC%84%A4%EC%A0%95%ED%95%A9%EB%8B%88%EB%8B%A4.\n-\n \n+ %EC%9D%B4%EB%95%8C %EC%84%A4%EC%A0%95%EC%A0%95%EB%B3%B4%EC%97%90 networks%EC%97%90 development %EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%98%EB%A9%B4 %EB%A1%9C%EC%BB%AC Ganache%EC%97%90 %EC%97%B0%EA%B2%B0%EB%90%A9%EB%8B%88%EB%8B%A4.\n %0A!%5B%5D(https:/\n@@ -6058,34 +6058,2334 @@\n g)%0A%0A\n-## 5. Smart Contract %ED%85%8C%EC%8A%A4%ED%8A%B8%0A%0A\n+4. %EC%9D%B4%EC%A0%9C %ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%A5%BC %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9C%BC%EB%A1%9C migration %ED%95%A9%EB%8B%88%EB%8B%A4%0A!%5B%5D(https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png)%0A%EC%88%9C%EC%84%9C%EB%8C%80%EB%A1%9C %EC%8B%A4%ED%96%89%EC%A4%91%EC%9D%B8 %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EA%B3%BC %EB%B0%B0%ED%8F%AC %EB%90%9C %EA%B0%81 %EA%B3%84%EC%95%BD%EC%9D%98 %EB%B8%94%EB%A1%9D %EC%B2%B4%EC%9D%B8 %EC%A3%BC%EC%86%8C%EB%A5%BC %EB%B3%BC %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. (%EC%9D%B4%EB%95%8C %EC%A3%BC%EC%86%8C%EA%B0%80 %EB%8B%A4%EB%A5%BC %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.)%0A%0A5. Ganache%EB%A5%BC %ED%86%B5%ED%95%B4 %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9D%98 %EC%83%81%ED%83%9C%EA%B0%80 %EB%B3%80%EA%B2%BD%EB%90%9C %EA%B2%83%EC%9D%84 %ED%99%95%EC%9D%B8%ED%95%A9%EB%8B%88%EB%8B%A4. %ED%98%84%EC%9E%AC %EB%B8%94%EB%A1%9D%EC%9D%B4 %EC%9D%B4%EC%A0%84%EC%97%90 0%EC%9D%B4%EC%97%88%EB%8A%94%EB%8D%B0 %EB%B8%94%EB%A1%9D%EC%9D%B4 4%EB%A1%9C %EB%B3%80%EA%B2%BD%EB%90%9C%EA%B2%83%EC%9D%84 %EB%B3%B4%EC%97%AC%EC%A4%8D%EB%8B%88%EB%8B%A4. %EB%98%90%ED%95%9C %EC%B2%AB %EB%B2%88%EC%A7%B8 %EA%B3%84%EC%A0%95%EC%9D%98 %EC%9B%90%EB%9E%98 Ether%EB%8A%94 100 %EC%9D%B4%EC%97%88%EC%A7%80%EB%A7%8C %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%ED%95%98%EB%8A%94 %EB%8D%B0 %EB%93%9C%EB%8A%94 %ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98 %EB%B9%84%EC%9A%A9%EC%9C%BC%EB%A1%9C %EC%9D%B8%ED%95%B4 %EC%9D%B4%EC%A0%9C%EB%8A%94 %EB%8D%94 %EB%82%AE%EC%8A%B5%EB%8B%88%EB%8B%A4. %EB%82%98%EC%A4%91%EC%97%90 %EA%B1%B0%EB%9E%98 %EB%B9%84%EC%9A%A9(Transaction Costs)%EC%97%90 %EB%8C%80%ED%95%B4 %EC%9E%90%EC%84%B8%ED%9E%88 %EC%9D%B4%EC%95%BC%EA%B8%B0%ED%95%98%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png)%0A%EC%95%84%EB%9E%98%EB%8A%94 %EC%B6%94%EA%B0%80%EB%90%9C %EB%B8%94%EB%A1%9D%EC%9D%98 %EC%A0%95%EB%B3%B4%0A!%5B%5D(https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png)%0A%ED%8A%B8%EB%A0%8C%EC%A0%9D%EC%85%98%EC%9D%98 %EC%B2%98%EB%A6%AC %EC%A0%95%EB%B3%B4%0A!%5B%5D(https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png)%0A%EC%9D%B4%EC%A0%9C %EC%B2%AB %EB%B2%88%EC%A7%B8 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%84%9C%EB%A5%BC %EC%9E%91%EC%84%B1%ED%95%98%EC%97%AC %EB%A1%9C%EC%BB%AC%EB%A1%9C %EC%8B%A4%ED%96%89%EC%A4%91%EC%9D%B8 %EB%B8%94%EB%A1%9D %EC%B2%B4%EC%9D%B8%EC%97%90 %EB%B0%B0%ED%8F%AC%ED%96%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EC%9D%B4%EC%A0%9C %EC%9D%B4 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EA%B3%BC %EC%83%81%ED%98%B8%EC%9E%91%EC%9A%A9%EC%9D%84 %ED%95%B4 %EB%B3%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4. (interact with)%0A%0A%0A## 5. Smart Contract %ED%85%8C%EC%8A%A4%ED%8A%B8%0ATruffle%EC%9D%80 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD %ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9D%98 %EA%B2%BD%EC%9A%B0 %EB%A7%A4%EC%9A%B0 %EC%9C%A0%EC%97%B0%ED%95%A9%EB%8B%88%EB%8B%A4. %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%8A%94 JavaScript %EB%98%90%EB%8A%94 Solidity%EB%A1%9C %EC%9E%91%EC%84%B1 %EB%90%A0 %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EC%9D%B4 %ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC%EC%97%90%EC%84%9C%EB%8A%94 Solidity%EC%97%90%EC%84%9C %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC %EC%9E%91%EC%84%B1%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0A1. test/ %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90 TestAdoption.sol %EC%9D%B4%EB%9D%BC%EB%8A%94 %EC%9D%B4%EB%A6%84%EC%9D%98 %ED%8C%8C%EC%9D%BC%EC%9D%84 %EC%83%9D%EC%84%B1%ED%95%A9%EB%8B%88%EB%8B%A4.%0A2. TestAdoption.sol %ED%8C%8C%EC%9D%BC%EC%97%90 %EC%95%84%EB%9E%98%EC%9D%98 %EB%82%B4%EC%9A%A9%EC%9D%84 %EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png)%0AAssert.sol : %ED%85%8C%EC%8A%A4%ED%8A%B8%EC%97%90 %EC%82%AC%EC%9A%A9%ED%95%A0 %EB%8B%A4%EC%96%91%ED%95%9C assertion %EC%9D%84 %EC%A0%9C%EA%B3%B5%ED%95%A9%EB%8B%88%EB%8B%A4. %ED%85%8C%EC%8A%A4%ED%8A%B8%EC%97%90%EC%84%9C assertion%EC%9D%80 %EA%B0%99%EC%9D%8C(equality), %EA%B0%99%EC%A7%80 %EC%95%8A%EC%9D%8C(inequality), %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC %ED%86%B5%EA%B3%BC%ED%96%88%EB%8A%94%EC%A7%80 %EC%8B%A4%ED%8C%A8%ED%96%88%EB%8A%94%EC%A7%80 %EB%B0%98%ED%99%98%ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%9C %EA%B3%B5%EB%B0%B1%EA%B3%BC %EA%B0%99%EC%9D%80 %EA%B2%83%EB%93%A4%EC%9D%84 %ED%99%95%EC%9D%B8 %ED%95%A9%EB%8B%88%EB%8B%A4.%0ADeployedAddresses.sol : %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%A0%EB%95%8C Truffle%EC%9D%80 %ED%85%8C%EC%8A%A4%ED%8A%B8%EC%A4%91%EC%9D%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%9D%98 %EC%83%88%EB%A1%9C%EC%9A%B4 %EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EB%A5%BC %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%97%90 %EB%B0%B0%ED%8F%AC%ED%95%A9%EB%8B%88%EB%8B%A4. %EC%9D%B4 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%8A%94 deploy%EB%90%9C %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%9D%98 %EC%A3%BC%EC%86%8C%EB%A5%BC %EA%B0%80%EC%A0%B8%EC%98%B5%EB%8B%88%EB%8B%A4.%0AAdoption.sol : %ED%85%8C%EC%8A%A4%ED%8A%B8 %ED%95%98%EA%B3%A0%EC%9E%90%ED%95%98%EB%8A%94 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8 %3Cbr%3E%0A*%EC%A3%BC%EC%9D%98 )%EC%B2%98%EC%9D%8C%EC%9D%98 %EB%91%90 import%EB%8A%94 truffle %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EA%B0%80 %EC%95%84%EB%8B%8C %EC%A0%84%EC%97%AD Truffle %ED%8C%8C%EC%9D%BC%EC%9E%85%EB%8B%88%EB%8B%A4. %EA%B7%B8%EB%9E%98%EC%84%9C test/ %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC %EB%82%B4%EB%B6%80%EC%97%90 truffle %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EB%A5%BC %EB%B3%BC%EC%88%98 %EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4. %3Cbr%3E%0A%EA%B7%B8%EB%9F%B0 %EB%8B%A4%EC%9D%8C %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%90%A0 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%A5%BC %ED%8F%AC%ED%95%A8%ED%95%98%EB%8A%94 contract-wide %EB%B3%80%EC%88%98%EB%A5%BC %EC%A0%95%EC%9D%98%ED%95%98%EA%B3%A0 address%EB%A5%BC %EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0 %EC%9C%84%ED%95%B4 DeployedAddresses %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%A5%BC %ED%98%B8%EC%B6%9C%ED%95%A9%EB%8B%88%EB%8B%A4.%0A#### adopt() %ED%95%A8%EC%88%98 %ED%85%8C%EC%8A%A4%ED%8A%B8%0Aadopt() %ED%95%A8%EC%88%98%EB%A5%BC %ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%B4 %EC%95%9E%EC%84%9C %EC%9E%91%EC%84%B1%ED%95%9C Adoption.sol %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%9D%98 adopt()%ED%95%A8%EC%88%98%EB%A5%BC %EC%83%81%EA%B8%B0%ED%95%B4%EB%B3%B4%EB%A9%B4 %ED%95%A8%EC%88%98%EB%8A%94 %EC%84%B1%EA%B3%B5%ED%95%98%EB%A9%B4 %EC%9E%85%EB%A0%A5%EB%90%9C petId%EB%A5%BC %EB%A6%AC%ED%84%B4%ED%95%98%EB%8A%94 %EA%B2%83%EC%9D%84 %EB%96%A0%EC%98%AC%EB%A0%A4 %EB%B3%B4%EA%B8%B0 %EB%B0%94%EB%9E%8D%EB%8B%88%EB%8B%A4. %ED%85%8C%EC%8A%A4%ED%8A%B8 %EC%BC%80%EC%9D%B4%EC%8A%A4%EC%97%90%EC%84%9C%EB%8A%94 ID%EA%B0%80 %EB%B0%98%ED%99%98%EB%90%98%EC%97%88%EB%8A%94%EC%A7%80%EC%99%80 %EC%A0%84%EB%8B%AC%EB%90%9C ID%EC%97%90 %EB%8C%80%ED%95%B4 adopt() %ED%95%A8%EC%88%98%EC%9D%98 %EB%B0%98%ED%99%98 %EA%B0%92%EC%9D%84 %EB%B9%84%EA%B5%90%ED%95%98%EC%97%AC %EC%98%AC%EB%B0%94%EB%A5%B8%EC%A7%80 %ED%99%95%EC%9D%B8 %ED%95%A0 %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.%0A%0A1. adoption %EC%84%A0%EC%96%B8 %EC%9D%B4%ED%9B%84%EC%97%90 TestAdoption.sol %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8 %EC%95%88%EC%97%90 %EC%95%84%EB%9E%98%EC%9D%98 %ED%95%A8%EC%88%98(testUserCanAdoptPet)%EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4 %0A!%5B%5D(https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png)%0A- %EC%9E%85%EB%A0%A5%EA%B0%92(ID) 8%EB%A1%9C Adoption.sol %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%9D%98 adopt() %ED%95%A8%EC%88%98%EB%A5%BC %ED%98%B8%EC%B6%9C%ED%95%A9%EB%8B%88%EB%8B%A4.%0A- %EA%B7%B8%EB%9F%B0 %EB%8B%A4%EC%9D%8C %EC%98%88%EC%83%81 %EA%B0%92%EC%9D%B8 8%EC%9D%84 %EC%97%AD%EC%8B%9C %EC%84%A0%EC%96%B8%ED%95%A9%EB%8B%88%EB%8B%A4.%0A- %EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC%EB%A1%9C Assert.equal()%EC%97%90 %EC%8B%A4%EC%A0%9C%EA%B0%92(returnedId), %EC%98%88%EC%83%81%EA%B0%92(expected) %EB%B0%8F %EC%8B%A4%ED%8C%A8 %EB%A9%94%EC%8B%9C%EC%A7%80(%ED%85%8C%EC%8A%A4%ED%8A%B8%EA%B0%80 %ED%86%B5%EA%B3%BC%ED%95%98%EC%A7%80 %EB%AA%BB%ED%95%98%EB%A9%B4 %EC%BD%98%EC%86%94%EC%97%90 %EC%B6%9C%EB%A0%A5%EB%90%A8)%EB%A5%BC %EC%A0%84%EB%8B%AC%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0A#### %EC%9E%85%EC%96%91%ED%95%9C pet%EC%9D%98 %EC%86%8C%EC%9C%A0%EC%9E%90 %EA%B2%80%EC%83%89 %ED%85%8C%EC%8A%A4%ED%8A%B8%0A%EC%95%9E%EC%84%9C %EC%96%B8%EA%B8%89%ED%95%9C public %EB%B3%80%EC%88%98%EA%B0%80 %EC%9E%90%EB%8F%99 getter %EB%A9%94%EC%86%8C%EB%93%9C%EB%A5%BC %EA%B0%80%EC%A7%84%EB%8B%A4%EB%8A%94%EA%B2%83%EC%9D%84 %EA%B8%B0%EC%96%B5%ED%95%9C%EB%8B%A4%EB%A9%B4, %EC%9C%84%EC%9D%98 %EC%9E%85%EC%96%91 %ED%85%8C%EC%8A%A4%ED%8A%B8%EC%97%90%EC%84%9C %EC%A0%80%EC%9E%A5%ED%95%9C %EC%A3%BC%EC%86%8C%EB%A5%BC %EA%B2%80%EC%83%89%ED%95%A0 %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EC%A0%80%EC%9E%A5%EB%90%9C %EB%8D%B0%EC%9D%B4%ED%84%B0%EB%8A%94 %ED%85%8C%EC%8A%A4%ED%8A%B8 %EA%B8%B0%EA%B0%84 %EB%8F%99%EC%95%88 %EC%A7%80%EC%86%8D%EB%90%98%EA%B8%B0 %EB%95%8C%EB%AC%B8%EC%97%90 %EC%95%9E%EC%84%9C %ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%9C Pet%EC%9D%98 adopt(8)%EC%9D%98 %EC%9E%85%EC%96%91 %EC%A0%95%EB%B3%B4%EB%8A%94 %EB%8B%A4%EB%A5%B8 %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC %ED%86%B5%ED%95%B4 %EA%B2%80%EC%83%89 %EA%B0%80%EB%8A%A5 %ED%95%A9%EB%8B%88%EB%8B%A4.\n %0A%0A%0A#\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\",\"https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png\",\"https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png\",\"https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png\",\"https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png\",\"https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png\",\"https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png\",\"https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png\",\"https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png\",\"https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png\",\"https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png\",\"https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png\",\"https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png\",\"https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-29T01:20:18",
"trx_id": "0b14d7ae59416bf8476f06936e87e3c6eb4e6733",
"trx_in_block": 8,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/28 03:23:27
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/28 03:23:27
| author | dongshik |
| body | @@ -274,16 +274,17 @@ %EC%9D%80 %EC%98%88%EC%9E%85%EB%8B%88%EB%8B%A4%0A%0A +( %EB%A8%BC%EC%A0%80, %EC%B6%A9%EC%8B%A4%ED%9E%88 @@ -334,16 +334,17 @@ %EB%B3%BC %EA%B3%84%ED%9A%8D%EC%9E%85%EB%8B%88%EB%8B%A4 +) %0A%0APete%E2%80%99s @@ -4563,19 +4563,1412 @@ %ED%95%98%EB%A9%B4 %EB%90%A9%EB%8B%88%EB%8B%A4%0A%0A - %0A%0A +!%5B%5D(https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png)%0A%0A%EC%BB%B4%ED%8C%8C%EC%9D%BC%EC%9D%B4 %EC%99%84%EB%A3%8C%EB%90%98%EB%A9%B4 .build/contracts %ED%8F%B4%EB%8D%94%EC%95%84%EB%9E%98 compile %EC%A0%95%EB%B3%B4%EB%A5%BC %EB%8B%B4%EC%9D%80 %EA%B0%9C%EB%B3%84 json %ED%8C%8C%EC%9D%BC%EC%9D%B4 %EC%83%9D%EC%84%B1%EB%90%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png)%0A%0A### %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98(migration)%0A%EC%84%B1%EA%B3%B5%EC%A0%81%EC%9C%BC%EB%A1%9C Smart Contract%EA%B0%80 Compile%EB%90%98%EB%A9%B4 %EC%9D%B4%EC%A0%9C %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9C%BC%EB%A1%9C migrate %ED%95%A9%EB%8B%88%EB%8B%A4.%0A%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B8%EC%85%98(Migration)%EC%9D%80 %EC%9D%91%EC%9A%A9 %ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%98 %EA%B3%84%EC%95%BD %EC%83%81%ED%83%9C%EB%A5%BC %EB%B3%80%EA%B2%BD%ED%95%98%EC%97%AC %ED%95%9C %EC%83%81%ED%83%9C%EC%97%90%EC%84%9C %EB%8B%A4%EC%9D%8C %EC%83%81%ED%83%9C%EB%A1%9C %EC%9D%B4%EB%8F%99%EC%8B%9C%ED%82%A4%EB%8A%94 %EC%A0%84%EA%B0%9C %EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9E%85%EB%8B%88%EB%8B%A4. %EC%B2%AB %EB%B2%88%EC%A7%B8 %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%98 %EA%B2%BD%EC%9A%B0 %EC%83%88 %EC%BD%94%EB%93%9C%EB%A5%BC %EB%B0%B0%ED%8F%AC%ED%95%98%EB%8A%94 %EA%B2%83%EC%9D%B4%EC%A7%80%EB%A7%8C %EC%8B%9C%EA%B0%84%EC%9D%B4 %EC%A7%80%EB%82%A8%EC%97%90 %EB%94%B0%EB%9D%BC %EB%8B%A4%EB%A5%B8 %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%80 %EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC %EC%9D%B4%EB%8F%99%ED%95%98%EA%B1%B0%EB%82%98 %EA%B3%84%EC%95%BD%EC%9D%84 %EC%83%88%EB%A1%9C%EC%9A%B4 %EA%B2%83%EC%9C%BC%EB%A1%9C %EB%8C%80%EC%B2%B4 %ED%95%A0 %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.%0A%0Amigrations/ %ED%8F%B4%EB%8D%94%EC%97%90 default%EB%A1%9C 1_initial_migration.js %ED%8C%8C%EC%9D%BC%EC%9D%B4 %EC%A1%B4%EC%9E%AC%ED%95%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png)%0A%0A%EC%9D%B4 %ED%8C%8C%EC%9D%BC%EC%9D%80 %EC%9D%B4%ED%9B%84 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9D%98 %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%84 %EA%B4%80%EC%B0%B0%ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%B4 Migrations.sol %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%9D%98 %EB%B0%B0%ED%8F%AC%EB%A5%BC %EA%B4%80%EB%A6%AC%ED%95%98%EB%A9%B0, %EB%82%98%EC%A4%91%EC%97%90 %EB%B3%80%EA%B2%BD%EB%90%98%EC%A7%80 %EC%95%8A%EC%9D%80 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%A5%BC %EC%9D%B4%EC%A4%91 %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%ED%95%98%EC%A7%80 %EC%95%8A%EB%8F%84%EB%A1%9D %EB%B3%B4%EC%9E%A5%ED%95%A9%EB%8B%88%EB%8B%A4. (1_initial_migration.js %EB%82%B4%EC%9A%A9)%0A!%5B%5D(https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png)%0A%0A%EC%9D%B4%EC%A0%9C Adoption %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%97%90 %EB%8C%80%ED%95%9C %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%84 %EC%9E%91%EC%84%B1%ED%95%A9%EB%8B%88%EB%8B%A4%0A%0A1. migrations/ %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90 2_deploy_contracts.js %ED%8C%8C%EC%9D%BC%EC%9D%84 %EC%83%9D%EC%84%B1%0A2. 2_deploy_contracts.js%EC%97%90 %EC%95%84%EB%9E%98 %EB%82%B4%EC%9A%A9 %EC%9E%85%EB%A0%A5%0A!%5B%5D(https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png)%0A%0A3. %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%A5%BC %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9C%BC%EB%A1%9C Migration%ED%95%98%EA%B8%B0 %EC%A0%84%EC%97%90 %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9D%84 %EC%8B%A4%ED%96%89 %ED%95%B4%EC%95%BC %ED%95%A9%EB%8B%88%EB%8B%A4. %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%A5%BC Deploy, %EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98 %EA%B0%9C%EB%B0%9C, %ED%85%8C%EC%8A%A4%ED%8A%B8 %EC%8B%A4%ED%96%89%EC%9D%84 %EC%9C%84%ED%95%B4 Private %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9C%BC%EB%A1%9C Ganache%EB%A5%BC %EC%82%AC%EC%9A%A9 %ED%95%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png)%0Atruffle.js%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C Ganache%EB%A5%BC %EC%84%A4%EC%A0%95%ED%95%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png) %0A%0A## 5. |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png","https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png","https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png","https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png","https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png","https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png","https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png","https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #21951278/Trx 699383a46ce133eb5738711c2082bee045cd000e |
View Raw JSON Data
{
"block": 21951278,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -274,16 +274,17 @@\n %EC%9D%80 %EC%98%88%EC%9E%85%EB%8B%88%EB%8B%A4%0A%0A\n+(\n %EB%A8%BC%EC%A0%80, %EC%B6%A9%EC%8B%A4%ED%9E%88 \n@@ -334,16 +334,17 @@\n %EB%B3%BC %EA%B3%84%ED%9A%8D%EC%9E%85%EB%8B%88%EB%8B%A4\n+)\n %0A%0APete%E2%80%99s\n@@ -4563,19 +4563,1412 @@\n %ED%95%98%EB%A9%B4 %EB%90%A9%EB%8B%88%EB%8B%A4%0A%0A\n- %0A%0A\n+!%5B%5D(https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png)%0A%0A%EC%BB%B4%ED%8C%8C%EC%9D%BC%EC%9D%B4 %EC%99%84%EB%A3%8C%EB%90%98%EB%A9%B4 .build/contracts %ED%8F%B4%EB%8D%94%EC%95%84%EB%9E%98 compile %EC%A0%95%EB%B3%B4%EB%A5%BC %EB%8B%B4%EC%9D%80 %EA%B0%9C%EB%B3%84 json %ED%8C%8C%EC%9D%BC%EC%9D%B4 %EC%83%9D%EC%84%B1%EB%90%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png)%0A%0A### %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98(migration)%0A%EC%84%B1%EA%B3%B5%EC%A0%81%EC%9C%BC%EB%A1%9C Smart Contract%EA%B0%80 Compile%EB%90%98%EB%A9%B4 %EC%9D%B4%EC%A0%9C %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9C%BC%EB%A1%9C migrate %ED%95%A9%EB%8B%88%EB%8B%A4.%0A%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B8%EC%85%98(Migration)%EC%9D%80 %EC%9D%91%EC%9A%A9 %ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%98 %EA%B3%84%EC%95%BD %EC%83%81%ED%83%9C%EB%A5%BC %EB%B3%80%EA%B2%BD%ED%95%98%EC%97%AC %ED%95%9C %EC%83%81%ED%83%9C%EC%97%90%EC%84%9C %EB%8B%A4%EC%9D%8C %EC%83%81%ED%83%9C%EB%A1%9C %EC%9D%B4%EB%8F%99%EC%8B%9C%ED%82%A4%EB%8A%94 %EC%A0%84%EA%B0%9C %EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9E%85%EB%8B%88%EB%8B%A4. %EC%B2%AB %EB%B2%88%EC%A7%B8 %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%98 %EA%B2%BD%EC%9A%B0 %EC%83%88 %EC%BD%94%EB%93%9C%EB%A5%BC %EB%B0%B0%ED%8F%AC%ED%95%98%EB%8A%94 %EA%B2%83%EC%9D%B4%EC%A7%80%EB%A7%8C %EC%8B%9C%EA%B0%84%EC%9D%B4 %EC%A7%80%EB%82%A8%EC%97%90 %EB%94%B0%EB%9D%BC %EB%8B%A4%EB%A5%B8 %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%80 %EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC %EC%9D%B4%EB%8F%99%ED%95%98%EA%B1%B0%EB%82%98 %EA%B3%84%EC%95%BD%EC%9D%84 %EC%83%88%EB%A1%9C%EC%9A%B4 %EA%B2%83%EC%9C%BC%EB%A1%9C %EB%8C%80%EC%B2%B4 %ED%95%A0 %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.%0A%0Amigrations/ %ED%8F%B4%EB%8D%94%EC%97%90 default%EB%A1%9C 1_initial_migration.js %ED%8C%8C%EC%9D%BC%EC%9D%B4 %EC%A1%B4%EC%9E%AC%ED%95%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png)%0A%0A%EC%9D%B4 %ED%8C%8C%EC%9D%BC%EC%9D%80 %EC%9D%B4%ED%9B%84 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9D%98 %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%84 %EA%B4%80%EC%B0%B0%ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%B4 Migrations.sol %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%9D%98 %EB%B0%B0%ED%8F%AC%EB%A5%BC %EA%B4%80%EB%A6%AC%ED%95%98%EB%A9%B0, %EB%82%98%EC%A4%91%EC%97%90 %EB%B3%80%EA%B2%BD%EB%90%98%EC%A7%80 %EC%95%8A%EC%9D%80 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%A5%BC %EC%9D%B4%EC%A4%91 %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%ED%95%98%EC%A7%80 %EC%95%8A%EB%8F%84%EB%A1%9D %EB%B3%B4%EC%9E%A5%ED%95%A9%EB%8B%88%EB%8B%A4. (1_initial_migration.js %EB%82%B4%EC%9A%A9)%0A!%5B%5D(https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png)%0A%0A%EC%9D%B4%EC%A0%9C Adoption %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%97%90 %EB%8C%80%ED%95%9C %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%84 %EC%9E%91%EC%84%B1%ED%95%A9%EB%8B%88%EB%8B%A4%0A%0A1. migrations/ %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90 2_deploy_contracts.js %ED%8C%8C%EC%9D%BC%EC%9D%84 %EC%83%9D%EC%84%B1%0A2. 2_deploy_contracts.js%EC%97%90 %EC%95%84%EB%9E%98 %EB%82%B4%EC%9A%A9 %EC%9E%85%EB%A0%A5%0A!%5B%5D(https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png)%0A%0A3. %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%A5%BC %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9C%BC%EB%A1%9C Migration%ED%95%98%EA%B8%B0 %EC%A0%84%EC%97%90 %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9D%84 %EC%8B%A4%ED%96%89 %ED%95%B4%EC%95%BC %ED%95%A9%EB%8B%88%EB%8B%A4. %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EB%A5%BC Deploy, %EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98 %EA%B0%9C%EB%B0%9C, %ED%85%8C%EC%8A%A4%ED%8A%B8 %EC%8B%A4%ED%96%89%EC%9D%84 %EC%9C%84%ED%95%B4 Private %EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9C%BC%EB%A1%9C Ganache%EB%A5%BC %EC%82%AC%EC%9A%A9 %ED%95%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png)%0Atruffle.js%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C Ganache%EB%A5%BC %EC%84%A4%EC%A0%95%ED%95%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png)\n %0A%0A## 5. \n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\",\"https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png\",\"https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png\",\"https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png\",\"https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png\",\"https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png\",\"https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png\",\"https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-28T03:23:27",
"trx_id": "699383a46ce133eb5738711c2082bee045cd000e",
"trx_in_block": 12,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/28 01:21:36
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/28 01:21:36
| author | dongshik |
| body | @@ -4204,16 +4204,375 @@ %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%0A +%EC%95%9E%EC%97%90%EC%84%9C %EA%B0%84%EB%8B%A8%ED%95%9C Smart contract%EB%A5%BC %EC%9E%91%EC%84%B1%ED%96%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EB%8B%A4%EC%9D%8C%EC%9C%BC%EB%A1%9C %EC%BB%B4%ED%8C%8C%EC%9D%BC %EB%B0%8F %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%84 %ED%95%B4%EB%B3%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4%0A%0A%ED%8A%B8%EB%9F%AC%ED%94%8C%EC%9D%80 %EB%82%B4%EC%9E%A5 %EA%B0%9C%EB%B0%9C %EC%BD%98%EC%86%94(Truffle Develop) %EA%B0%80%EC%A7%80%EA%B3%A0 %EC%9E%88%EB%8A%94%EB%8D%B0 %EA%B0%9C%EB%B0%9C%EC%9A%A9 %EB%B8%94%EB%9F%AD%EC%B2%B4%EC%9D%B8%EC%9D%84 %EC%83%9D%EC%84%B1%ED%95%98%EA%B3%A0 %EC%9D%B4%EB%A5%BC%ED%86%B5%ED%95%B4 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8 %EB%B0%B0%ED%8F%AC(deploy)%ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC %ED%95%B4%EB%B3%BC%EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4%0A%0A%EB%98%90%ED%95%9C %EC%BD%98%EC%86%94%EC%97%90%EC%84%9C %EC%A7%81%EC%A0%91 %ED%8A%B8%EB%9F%AC%ED%94%8C%EC%9D%98 %EB%AA%85%EB%A0%B9%EB%93%A4%EC%9D%84 %EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94 %EA%B8%B0%EB%8A%A5%EB%8F%84 %EA%B0%80%EC%A7%80%EA%B3%A0 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4%0A%0A### %EC%BB%B4%ED%8C%8C%EC%9D%BC(compilation)%0ASolidity%EB%8A%94 %EC%BB%B4%ED%8C%8C%EC%9D%BC %EC%96%B8%EC%96%B4 %EC%9E%85%EB%8B%88%EB%8B%A4. %EC%A6%89, Ethereum Virtual Machine(EVM)%EC%97%90%EC%84%9C %EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%B4 bytecode%EB%A1%9C %EC%BB%B4%ED%8C%8C%EC%9D%BC %ED%95%B4%EC%95%BC %ED%95%A9%EB%8B%88%EB%8B%A4%0A%0A%EC%9D%B8%EA%B0%84%EC%9D%B4 %EC%9D%BD%EC%9D%84%EC%88%98%EC%9E%88%EB%8A%94 Solidity%EC%BD%94%EB%93%9C%EB%A5%BC EVM%EC%9D%B4 %EC%9D%B4%ED%95%B4%ED%95%A0%EC%88%98%EC%9E%88%EB%8A%94 %EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EB%A1%9C %EB%B3%80%ED%99%98 %EB%B2%88%EC%97%AD %ED%95%9C%EB%8B%A4%EA%B3%A0 %EC%83%9D%EA%B0%81%ED%95%98%EB%A9%B4 %EB%90%A9%EB%8B%88%EB%8B%A4%0A%0A %0A %0A%0A%0A## 5. |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #21948842/Trx 3c2a8a8f5ca3368bc665d90cdbb4b08438c5a05e |
View Raw JSON Data
{
"block": 21948842,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -4204,16 +4204,375 @@\n %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%0A\n+%EC%95%9E%EC%97%90%EC%84%9C %EA%B0%84%EB%8B%A8%ED%95%9C Smart contract%EB%A5%BC %EC%9E%91%EC%84%B1%ED%96%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EB%8B%A4%EC%9D%8C%EC%9C%BC%EB%A1%9C %EC%BB%B4%ED%8C%8C%EC%9D%BC %EB%B0%8F %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%84 %ED%95%B4%EB%B3%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4%0A%0A%ED%8A%B8%EB%9F%AC%ED%94%8C%EC%9D%80 %EB%82%B4%EC%9E%A5 %EA%B0%9C%EB%B0%9C %EC%BD%98%EC%86%94(Truffle Develop) %EA%B0%80%EC%A7%80%EA%B3%A0 %EC%9E%88%EB%8A%94%EB%8D%B0 %EA%B0%9C%EB%B0%9C%EC%9A%A9 %EB%B8%94%EB%9F%AD%EC%B2%B4%EC%9D%B8%EC%9D%84 %EC%83%9D%EC%84%B1%ED%95%98%EA%B3%A0 %EC%9D%B4%EB%A5%BC%ED%86%B5%ED%95%B4 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8 %EB%B0%B0%ED%8F%AC(deploy)%ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC %ED%95%B4%EB%B3%BC%EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4%0A%0A%EB%98%90%ED%95%9C %EC%BD%98%EC%86%94%EC%97%90%EC%84%9C %EC%A7%81%EC%A0%91 %ED%8A%B8%EB%9F%AC%ED%94%8C%EC%9D%98 %EB%AA%85%EB%A0%B9%EB%93%A4%EC%9D%84 %EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94 %EA%B8%B0%EB%8A%A5%EB%8F%84 %EA%B0%80%EC%A7%80%EA%B3%A0 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4%0A%0A### %EC%BB%B4%ED%8C%8C%EC%9D%BC(compilation)%0ASolidity%EB%8A%94 %EC%BB%B4%ED%8C%8C%EC%9D%BC %EC%96%B8%EC%96%B4 %EC%9E%85%EB%8B%88%EB%8B%A4. %EC%A6%89, Ethereum Virtual Machine(EVM)%EC%97%90%EC%84%9C %EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%B4 bytecode%EB%A1%9C %EC%BB%B4%ED%8C%8C%EC%9D%BC %ED%95%B4%EC%95%BC %ED%95%A9%EB%8B%88%EB%8B%A4%0A%0A%EC%9D%B8%EA%B0%84%EC%9D%B4 %EC%9D%BD%EC%9D%84%EC%88%98%EC%9E%88%EB%8A%94 Solidity%EC%BD%94%EB%93%9C%EB%A5%BC EVM%EC%9D%B4 %EC%9D%B4%ED%95%B4%ED%95%A0%EC%88%98%EC%9E%88%EB%8A%94 %EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EB%A1%9C %EB%B3%80%ED%99%98 %EB%B2%88%EC%97%AD %ED%95%9C%EB%8B%A4%EA%B3%A0 %EC%83%9D%EA%B0%81%ED%95%98%EB%A9%B4 %EB%90%A9%EB%8B%88%EB%8B%A4%0A%0A %0A\n %0A%0A%0A## 5.\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-28T01:21:36",
"trx_id": "3c2a8a8f5ca3368bc665d90cdbb4b08438c5a05e",
"trx_in_block": 5,
"virtual_op": 0
}thetroublenotesupvoted (0.20%) @dongshik / ethereum-pet-shop-and-truffle2018/04/26 15:22:39
thetroublenotesupvoted (0.20%) @dongshik / ethereum-pet-shop-and-truffle
2018/04/26 15:22:39
| author | dongshik |
| permlink | ethereum-pet-shop-and-truffle |
| voter | thetroublenotes |
| weight | 20 (0.20%) |
| Transaction Info | Block #21908082/Trx e05a8397553cebf7f19bc8e7c9bffd459b33a7f8 |
View Raw JSON Data
{
"block": 21908082,
"op": [
"vote",
{
"author": "dongshik",
"permlink": "ethereum-pet-shop-and-truffle",
"voter": "thetroublenotes",
"weight": 20
}
],
"op_in_trx": 0,
"timestamp": "2018-04-26T15:22:39",
"trx_id": "e05a8397553cebf7f19bc8e7c9bffd459b33a7f8",
"trx_in_block": 42,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/26 15:22:24
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/26 15:22:24
| author | dongshik |
| body | @@ -3796,101 +3796,8 @@ %EB%8B%A4.%0A%0A -ID%EA%B0%80 %EB%B2%94%EC%9C%84 %EB%82%B4%EC%97%90 %EC%9E%88%EC%9C%BC%EB%A9%B4 adopters %EB%B0%B0%EC%97%B4%EC%97%90 %ED%98%B8%EC%B6%9C %ED%95%9C %EC%A3%BC%EC%86%8C%EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4. %EC%9D%B4 %ED%95%A8%EC%88%98%EB%A5%BC %ED%98%B8%EC%B6%9C %ED%95%9C %EC%82%AC%EB%9E%8C %EB%98%90%EB%8A%94 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9E%90%EC%9D%98 %EC%A3%BC%EC%86%8C%EB%8A%94 msg.sender%EB%A1%9C %ED%91%9C%EC%8B%9C%EB%90%A9%EB%8B%88%EB%8B%A4.%0A%0A %EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #21908077/Trx 15ffa41342b2e65e0b52f8da270dbd1841e5ecb9 |
View Raw JSON Data
{
"block": 21908077,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -3796,101 +3796,8 @@\n %EB%8B%A4.%0A%0A\n-ID%EA%B0%80 %EB%B2%94%EC%9C%84 %EB%82%B4%EC%97%90 %EC%9E%88%EC%9C%BC%EB%A9%B4 adopters %EB%B0%B0%EC%97%B4%EC%97%90 %ED%98%B8%EC%B6%9C %ED%95%9C %EC%A3%BC%EC%86%8C%EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4. %EC%9D%B4 %ED%95%A8%EC%88%98%EB%A5%BC %ED%98%B8%EC%B6%9C %ED%95%9C %EC%82%AC%EB%9E%8C %EB%98%90%EB%8A%94 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9E%90%EC%9D%98 %EC%A3%BC%EC%86%8C%EB%8A%94 msg.sender%EB%A1%9C %ED%91%9C%EC%8B%9C%EB%90%A9%EB%8B%88%EB%8B%A4.%0A%0A\n %EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-26T15:22:24",
"trx_id": "15ffa41342b2e65e0b52f8da270dbd1841e5ecb9",
"trx_in_block": 29,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/26 15:21:24
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/26 15:21:24
| author | dongshik |
| body | @@ -2783,12 +2783,1625 @@ g)%0A%0A -(%EA%B3%84%EC%86%8D....) +## 3. Smart Contract %EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0%0A%EB%B0%B1-%EC%97%94%EB%93%9C %EB%A1%9C%EC%A7%81 %EB%B0%8F %EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80 %EC%97%AD%ED%95%A0%EC%9D%84%ED%95%98%EB%8A%94 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%84%9C%EB%A5%BC %EC%9E%91%EC%84%B1%ED%95%98%EC%97%AC dapp%EC%9D%84 %EC%8B%9C%EC%9E%91%ED%95%B4 %EB%B4%85%EB%8B%88%EB%8B%A4.%0A%EC%B2%AB %EB%B2%88%EC%A7%B8%EB%A1%9C, contracts %3E Adoption.sol %ED%8C%8C%EC%9D%BC %EC%B6%94%EA%B0%80 %ED%95%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png)%0A%0A%EC%8B%AC%EB%B3%BC (%5E)%EC%9D%80 %ED%95%84%EC%9A%94%ED%95%9C Solidity%EC%9D%98 %EC%B5%9C%EC%86%8C%EB%B2%84%EC%A0%84%EC%9D%84 %EC%A7%80%EC%A0%95(%22%ED%91%9C%EC%8B%9C%EB%90%9C %EB%B2%84%EC%A0%84 %EC%9D%B4%EC%83%81%22)%ED%95%98%EB%A9%B0, %EB%AA%85%EB%A0%B9%EB%AC%B8%EC%9D%80 semicolons(;)%EB%A1%9C %EB%81%9D%EB%82%A9%EB%8B%88%EB%8B%A4.%0A%0AAddress%EB%9D%BC%EB%8A%94 %EA%B3%A0%EC%9C%A0%ED%95%9C %EB%8D%B0%EC%9D%B4%ED%84%B0 %ED%83%80%EC%9E%85, %EC%A6%89 Ethereum%EC%9D%98 %EC%A3%BC%EC%86%8C%EC%9D%B4%EB%A9%B0 20 bytes%EC%9D%98 %EA%B0%92%EC%9C%BC%EB%A1%9C %EC%A0%80%EC%9E%A5%EB%90%A9%EB%8B%88%EB%8B%A4.%0A%0A### %EB%8B%A8%EC%9D%BC %EB%B3%80%EC%88%98 adopters %EC%A0%95%EC%9D%98%0AEthereum address%EC%9D%98 %EB%B0%B0%EC%97%B4. %EB%B0%B0%EC%97%B4%EC%9D%80 %ED%95%98%EB%82%98%EC%9D%98 %EC%9C%A0%ED%98%95(type)%EC%9D%B4 %ED%8F%AC%ED%95%A8%EB%90%98%EB%A9%B0 %EA%B3%A0%EC%A0%95 %EB%98%90%EB%8A%94 %EA%B0%80%EB%B3%80 %EA%B8%B8%EC%9D%B4%EB%A5%BC %EA%B0%80%EC%A7%88 %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EC%9D%B4 %EA%B2%BD%EC%9A%B0 %EC%9C%A0%ED%98%95%EC%9D%80 address %EC%9D%B4%EB%A9%B0 %EB%B0%B0%EC%97%B4%EC%9D%98 %ED%81%AC%EA%B8%B0%EB%8A%94 16%EC%9E%85%EB%8B%88%EB%8B%A4.%0A%0A%EB%98%90%ED%95%9C %EB%B3%80%EC%88%98 adopters%EA%B0%80 public%EC%9E%84%EC%9D%84 %EC%95%8C %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. Public %EB%B3%80%EC%88%98%EB%8A%94 %EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C getter %EB%A9%94%EC%86%8C%EB%93%9C%EA%B0%80 %EA%B0%80%EC%A7%80%EC%A7%80%EB%A7%8C, %EC%9D%B4 %EA%B2%BD%EC%9A%B0 %EB%B0%B0%EC%97%B4%EC%9D%80 %ED%82%A4%EA%B0%80 %ED%95%84%EC%9A%94%ED%95%98%EB%A9%B0 %EB%8B%A8%EC%9D%BC %EA%B0%92%EB%A7%8C %EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4. %EB%82%98%EC%A4%91%EC%97%90 UI%EC%97%90%EC%84%9C %EC%82%AC%EC%9A%A9%ED%95%A0 %EC%A0%84%EC%B2%B4 %EB%B0%B0%EC%97%B4%EC%9D%84 %EB%B0%98%ED%99%98%ED%95%98%EB%8A%94 %ED%95%A8%EC%88%98%EB%A5%BC %EC%9E%91%EC%84%B1%ED%95%A0 %EA%B2%83%EC%9E%85%EB%8B%88%EB%8B%A4.%0A%0A### %EC%B2%AB%EB%B2%88%EC%A7%B8 %ED%95%A8%EC%88%98 : Adopting a pet%0A%EC%82%AC%EC%9A%A9%EC%9E%90%EA%B0%80 %EC%9E%85%EC%96%91(Adoption) %EC%9A%94%EC%B2%AD%EC%9D%84 %ED%95%A0 %EC%88%98 %EC%9E%88%EB%8F%84%EB%A1%9D %ED%97%88%EC%9A%A9%ED%95%A9%EB%8B%88%EB%8B%A4.%0ASolidity%EC%97%90%EC%84%9C%EB%8A%94 %ED%95%A8%EC%88%98 %EB%A7%A4%EA%B0%9C %EB%B3%80%EC%88%98%EC%99%80 %EC%B6%9C%EB%A0%A5 %EC%9C%A0%ED%98%95%EC%9D%84 %EB%AA%A8%EB%91%90 %EC%A7%80%EC%A0%95 %ED%95%B4%EC%95%BC %ED%95%A9%EB%8B%88%EB%8B%A4. %EC%9D%B4 %EA%B2%BD%EC%9A%B0 petId (%EC%A0%95%EC%88%98)%EB%A5%BC %EA%B0%80%EC%A0%B8 %EC%99%80%EC%84%9C %EC%A0%95%EC%88%98%EB%A5%BC %EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4.%0APetId%EA%B0%80 adopters %EB%B0%B0%EC%97%B4 %EB%B2%94%EC%9C%84 %EB%82%B4%EC%97%90 %EC%9E%88%EB%8A%94%EC%A7%80 %ED%99%95%EC%9D%B8%ED%95%A9%EB%8B%88%EB%8B%A4. Solidity%EC%97%90%EC%9E%88%EB%8A%94 %EB%B0%B0%EC%97%B4%EC%9D%80 0%EB%B6%80%ED%84%B0 %EC%9D%B8%EB%8D%B1%EC%8B%B1%EB%90%98%EB%AF%80%EB%A1%9C ID %EA%B0%92%EC%9D%80 0%EC%97%90%EC%84%9C 15 %EC%82%AC%EC%9D%B4 %EC%97%AC%EC%95%BC%ED%95%A9%EB%8B%88%EB%8B%A4. ID%EA%B0%80 %EB%B2%94%EC%9C%84 %EB%82%B4%EC%97%90 %EC%9E%88%EB%8A%94%EC%A7%80 %ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%B4 require () %EB%AC%B8%EC%9D%84 %EC%82%AC%EC%9A%A9%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0AID%EA%B0%80 %EB%B2%94%EC%9C%84 %EB%82%B4%EC%97%90 %EC%9E%88%EC%9C%BC%EB%A9%B4 %EC%9A%B0%EB%A6%AC%EB%8A%94 adopters %EB%B0%B0%EC%97%B4%EC%97%90 %ED%98%B8%EC%B6%9C %ED%95%9C %EC%A3%BC%EC%86%8C%EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4. %EC%9D%B4 %ED%95%A8%EC%88%98%EB%A5%BC %ED%98%B8%EC%B6%9C %ED%95%9C %EC%82%AC%EB%9E%8C %EB%98%90%EB%8A%94 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9E%90%EC%9D%98 %EC%A3%BC%EC%86%8C%EB%8A%94 msg.sender%EB%A1%9C %ED%91%9C%EC%8B%9C%EB%90%A9%EB%8B%88%EB%8B%A4. %EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC%EB%A1%9C, %EC%A0%9C%EA%B3%B5%EB%90%9C %EC%95%A0%EC%99%84 %EB%8F%99%EB%AC%BC%EC%9D%84 %ED%99%95%EC%9D%B8%ED%95%98%EA%B3%A0 %EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0AID%EA%B0%80 %EB%B2%94%EC%9C%84 %EB%82%B4%EC%97%90 %EC%9E%88%EC%9C%BC%EB%A9%B4 adopters %EB%B0%B0%EC%97%B4%EC%97%90 %ED%98%B8%EC%B6%9C %ED%95%9C %EC%A3%BC%EC%86%8C%EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4. %EC%9D%B4 %ED%95%A8%EC%88%98%EB%A5%BC %ED%98%B8%EC%B6%9C %ED%95%9C %EC%82%AC%EB%9E%8C %EB%98%90%EB%8A%94 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9E%90%EC%9D%98 %EC%A3%BC%EC%86%8C%EB%8A%94 msg.sender%EB%A1%9C %ED%91%9C%EC%8B%9C%EB%90%A9%EB%8B%88%EB%8B%A4.%0A%0A%EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC%EB%A1%9C, %ED%99%95%EC%9D%B8%EC%9D%84 %ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%B4 %EC%A0%84%EB%8B%AC%ED%96%88%EB%8D%98 petId%EB%A5%BC %EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0A### %EB%91%90%EB%B2%88%EC%A7%B8 %ED%95%A8%EC%88%98 : Retrieving the adopters%0A%EC%9C%84%EC%97%90%EC%84%9C %EC%96%B8%EA%B8%89 %ED%95%9C %EA%B2%83%EC%B2%98%EB%9F%BC %EB%B0%B0%EC%97%B4 getter%EB%8A%94 %EC%A3%BC%EC%96%B4%EC%A7%84 %ED%82%A4%EC%97%90%EC%84%9C %ED%95%98%EB%82%98%EC%9D%98 %EA%B0%92%EB%A7%8C %EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4. UI%EC%97%90%EC%84%9C%EB%8A%94 %EB%AA%A8%EB%93%A0 %EC%95%A0%EC%99%84 %EB%8F%99%EB%AC%BC%EC%9D%98 %EC%9E%85%EC%96%91 %EC%83%81%ED%83%9C%EB%A5%BC %EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8%ED%95%B4%EC%95%BC%ED%95%98%EC%A7%80%EB%A7%8C, 16 %EA%B0%9C%EC%9D%98 API %ED%98%B8%EC%B6%9C%EC%9D%84 %ED%95%98%EB%8A%94 %EA%B2%83%EC%9D%80 %EC%9D%B4%EC%83%81%EC%A0%81%EC%9D%B4%EC%A7%80 %EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4. %EB%8B%A4%EC%9D%8C %EB%8B%A8%EA%B3%84%EB%8A%94 %EC%A0%84%EC%B2%B4 %EB%B0%B0%EC%97%B4%EC%9D%84 %EB%B0%98%ED%99%98%ED%95%98%EB%8A%94 %ED%95%A8%EC%88%98%EB%A5%BC %EC%9E%91%EC%84%B1%ED%95%98%EB%8A%94 %EA%B2%83%EC%9E%85%EB%8B%88%EB%8B%A4.%0A%0A%EC%9C%84%EC%97%90%EC%84%9C %EC%B6%94%EA%B0%80 %ED%95%9C adopt () %ED%95%A8%EC%88%98 %EB%8B%A4%EC%9D%8C, %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%97%90 getAdopters () %ED%95%A8%EC%88%98%EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0Aadopters %EB%93%A4%EC%9D%80 %EC%9D%B4%EB%AF%B8 %EC%84%A0%EC%96%B8 %EB%90%98%EC%97%88%EC%9C%BC%EB%AF%80%EB%A1%9C %EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C %EB%B0%98%ED%99%98 %ED%95%A0 %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EB%B0%98%ED%99%98 %EC%9C%A0%ED%98%95 (%EC%9D%B4 %EA%B2%BD%EC%9A%B0, Adopters%EC%9D%98 %EC%9C%A0%ED%98%95)%EC%9D%84 Address %5B16%5D%EC%9C%BC%EB%A1%9C %EC%A7%80%EC%A0%95%ED%95%B4%EC%95%BC%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0A%0A## 4. Smart Contract %EC%BB%B4%ED%8C%8C%EC%9D%BC %EB%B0%8F %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%0A%0A%0A%0A## 5. Smart Contract %ED%85%8C%EC%8A%A4%ED%8A%B8%0A%0A%0A%0A%0A## 6. Smart Contract%EC%99%80 %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9%ED%95%98%EB%8A%94 %EC%82%AC%EC%9A%A9%EC%9E%90 %EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A%0A%0A%0A## 7. %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C dapp%EA%B3%BC %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9 |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png","https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #21908057/Trx b0b2c2d7e6b1f66e4cb0b83041fe0f36881add55 |
View Raw JSON Data
{
"block": 21908057,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -2783,12 +2783,1625 @@\n g)%0A%0A\n-(%EA%B3%84%EC%86%8D....)\n+## 3. Smart Contract %EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0%0A%EB%B0%B1-%EC%97%94%EB%93%9C %EB%A1%9C%EC%A7%81 %EB%B0%8F %EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80 %EC%97%AD%ED%95%A0%EC%9D%84%ED%95%98%EB%8A%94 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%84%9C%EB%A5%BC %EC%9E%91%EC%84%B1%ED%95%98%EC%97%AC dapp%EC%9D%84 %EC%8B%9C%EC%9E%91%ED%95%B4 %EB%B4%85%EB%8B%88%EB%8B%A4.%0A%EC%B2%AB %EB%B2%88%EC%A7%B8%EB%A1%9C, contracts %3E Adoption.sol %ED%8C%8C%EC%9D%BC %EC%B6%94%EA%B0%80 %ED%95%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png)%0A%0A%EC%8B%AC%EB%B3%BC (%5E)%EC%9D%80 %ED%95%84%EC%9A%94%ED%95%9C Solidity%EC%9D%98 %EC%B5%9C%EC%86%8C%EB%B2%84%EC%A0%84%EC%9D%84 %EC%A7%80%EC%A0%95(%22%ED%91%9C%EC%8B%9C%EB%90%9C %EB%B2%84%EC%A0%84 %EC%9D%B4%EC%83%81%22)%ED%95%98%EB%A9%B0, %EB%AA%85%EB%A0%B9%EB%AC%B8%EC%9D%80 semicolons(;)%EB%A1%9C %EB%81%9D%EB%82%A9%EB%8B%88%EB%8B%A4.%0A%0AAddress%EB%9D%BC%EB%8A%94 %EA%B3%A0%EC%9C%A0%ED%95%9C %EB%8D%B0%EC%9D%B4%ED%84%B0 %ED%83%80%EC%9E%85, %EC%A6%89 Ethereum%EC%9D%98 %EC%A3%BC%EC%86%8C%EC%9D%B4%EB%A9%B0 20 bytes%EC%9D%98 %EA%B0%92%EC%9C%BC%EB%A1%9C %EC%A0%80%EC%9E%A5%EB%90%A9%EB%8B%88%EB%8B%A4.%0A%0A### %EB%8B%A8%EC%9D%BC %EB%B3%80%EC%88%98 adopters %EC%A0%95%EC%9D%98%0AEthereum address%EC%9D%98 %EB%B0%B0%EC%97%B4. %EB%B0%B0%EC%97%B4%EC%9D%80 %ED%95%98%EB%82%98%EC%9D%98 %EC%9C%A0%ED%98%95(type)%EC%9D%B4 %ED%8F%AC%ED%95%A8%EB%90%98%EB%A9%B0 %EA%B3%A0%EC%A0%95 %EB%98%90%EB%8A%94 %EA%B0%80%EB%B3%80 %EA%B8%B8%EC%9D%B4%EB%A5%BC %EA%B0%80%EC%A7%88 %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EC%9D%B4 %EA%B2%BD%EC%9A%B0 %EC%9C%A0%ED%98%95%EC%9D%80 address %EC%9D%B4%EB%A9%B0 %EB%B0%B0%EC%97%B4%EC%9D%98 %ED%81%AC%EA%B8%B0%EB%8A%94 16%EC%9E%85%EB%8B%88%EB%8B%A4.%0A%0A%EB%98%90%ED%95%9C %EB%B3%80%EC%88%98 adopters%EA%B0%80 public%EC%9E%84%EC%9D%84 %EC%95%8C %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. Public %EB%B3%80%EC%88%98%EB%8A%94 %EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C getter %EB%A9%94%EC%86%8C%EB%93%9C%EA%B0%80 %EA%B0%80%EC%A7%80%EC%A7%80%EB%A7%8C, %EC%9D%B4 %EA%B2%BD%EC%9A%B0 %EB%B0%B0%EC%97%B4%EC%9D%80 %ED%82%A4%EA%B0%80 %ED%95%84%EC%9A%94%ED%95%98%EB%A9%B0 %EB%8B%A8%EC%9D%BC %EA%B0%92%EB%A7%8C %EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4. %EB%82%98%EC%A4%91%EC%97%90 UI%EC%97%90%EC%84%9C %EC%82%AC%EC%9A%A9%ED%95%A0 %EC%A0%84%EC%B2%B4 %EB%B0%B0%EC%97%B4%EC%9D%84 %EB%B0%98%ED%99%98%ED%95%98%EB%8A%94 %ED%95%A8%EC%88%98%EB%A5%BC %EC%9E%91%EC%84%B1%ED%95%A0 %EA%B2%83%EC%9E%85%EB%8B%88%EB%8B%A4.%0A%0A### %EC%B2%AB%EB%B2%88%EC%A7%B8 %ED%95%A8%EC%88%98 : Adopting a pet%0A%EC%82%AC%EC%9A%A9%EC%9E%90%EA%B0%80 %EC%9E%85%EC%96%91(Adoption) %EC%9A%94%EC%B2%AD%EC%9D%84 %ED%95%A0 %EC%88%98 %EC%9E%88%EB%8F%84%EB%A1%9D %ED%97%88%EC%9A%A9%ED%95%A9%EB%8B%88%EB%8B%A4.%0ASolidity%EC%97%90%EC%84%9C%EB%8A%94 %ED%95%A8%EC%88%98 %EB%A7%A4%EA%B0%9C %EB%B3%80%EC%88%98%EC%99%80 %EC%B6%9C%EB%A0%A5 %EC%9C%A0%ED%98%95%EC%9D%84 %EB%AA%A8%EB%91%90 %EC%A7%80%EC%A0%95 %ED%95%B4%EC%95%BC %ED%95%A9%EB%8B%88%EB%8B%A4. %EC%9D%B4 %EA%B2%BD%EC%9A%B0 petId (%EC%A0%95%EC%88%98)%EB%A5%BC %EA%B0%80%EC%A0%B8 %EC%99%80%EC%84%9C %EC%A0%95%EC%88%98%EB%A5%BC %EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4.%0APetId%EA%B0%80 adopters %EB%B0%B0%EC%97%B4 %EB%B2%94%EC%9C%84 %EB%82%B4%EC%97%90 %EC%9E%88%EB%8A%94%EC%A7%80 %ED%99%95%EC%9D%B8%ED%95%A9%EB%8B%88%EB%8B%A4. Solidity%EC%97%90%EC%9E%88%EB%8A%94 %EB%B0%B0%EC%97%B4%EC%9D%80 0%EB%B6%80%ED%84%B0 %EC%9D%B8%EB%8D%B1%EC%8B%B1%EB%90%98%EB%AF%80%EB%A1%9C ID %EA%B0%92%EC%9D%80 0%EC%97%90%EC%84%9C 15 %EC%82%AC%EC%9D%B4 %EC%97%AC%EC%95%BC%ED%95%A9%EB%8B%88%EB%8B%A4. ID%EA%B0%80 %EB%B2%94%EC%9C%84 %EB%82%B4%EC%97%90 %EC%9E%88%EB%8A%94%EC%A7%80 %ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%B4 require () %EB%AC%B8%EC%9D%84 %EC%82%AC%EC%9A%A9%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0AID%EA%B0%80 %EB%B2%94%EC%9C%84 %EB%82%B4%EC%97%90 %EC%9E%88%EC%9C%BC%EB%A9%B4 %EC%9A%B0%EB%A6%AC%EB%8A%94 adopters %EB%B0%B0%EC%97%B4%EC%97%90 %ED%98%B8%EC%B6%9C %ED%95%9C %EC%A3%BC%EC%86%8C%EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4. %EC%9D%B4 %ED%95%A8%EC%88%98%EB%A5%BC %ED%98%B8%EC%B6%9C %ED%95%9C %EC%82%AC%EB%9E%8C %EB%98%90%EB%8A%94 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9E%90%EC%9D%98 %EC%A3%BC%EC%86%8C%EB%8A%94 msg.sender%EB%A1%9C %ED%91%9C%EC%8B%9C%EB%90%A9%EB%8B%88%EB%8B%A4. %EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC%EB%A1%9C, %EC%A0%9C%EA%B3%B5%EB%90%9C %EC%95%A0%EC%99%84 %EB%8F%99%EB%AC%BC%EC%9D%84 %ED%99%95%EC%9D%B8%ED%95%98%EA%B3%A0 %EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0AID%EA%B0%80 %EB%B2%94%EC%9C%84 %EB%82%B4%EC%97%90 %EC%9E%88%EC%9C%BC%EB%A9%B4 adopters %EB%B0%B0%EC%97%B4%EC%97%90 %ED%98%B8%EC%B6%9C %ED%95%9C %EC%A3%BC%EC%86%8C%EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4. %EC%9D%B4 %ED%95%A8%EC%88%98%EB%A5%BC %ED%98%B8%EC%B6%9C %ED%95%9C %EC%82%AC%EB%9E%8C %EB%98%90%EB%8A%94 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9E%90%EC%9D%98 %EC%A3%BC%EC%86%8C%EB%8A%94 msg.sender%EB%A1%9C %ED%91%9C%EC%8B%9C%EB%90%A9%EB%8B%88%EB%8B%A4.%0A%0A%EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC%EB%A1%9C, %ED%99%95%EC%9D%B8%EC%9D%84 %ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%B4 %EC%A0%84%EB%8B%AC%ED%96%88%EB%8D%98 petId%EB%A5%BC %EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0A### %EB%91%90%EB%B2%88%EC%A7%B8 %ED%95%A8%EC%88%98 : Retrieving the adopters%0A%EC%9C%84%EC%97%90%EC%84%9C %EC%96%B8%EA%B8%89 %ED%95%9C %EA%B2%83%EC%B2%98%EB%9F%BC %EB%B0%B0%EC%97%B4 getter%EB%8A%94 %EC%A3%BC%EC%96%B4%EC%A7%84 %ED%82%A4%EC%97%90%EC%84%9C %ED%95%98%EB%82%98%EC%9D%98 %EA%B0%92%EB%A7%8C %EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4. UI%EC%97%90%EC%84%9C%EB%8A%94 %EB%AA%A8%EB%93%A0 %EC%95%A0%EC%99%84 %EB%8F%99%EB%AC%BC%EC%9D%98 %EC%9E%85%EC%96%91 %EC%83%81%ED%83%9C%EB%A5%BC %EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8%ED%95%B4%EC%95%BC%ED%95%98%EC%A7%80%EB%A7%8C, 16 %EA%B0%9C%EC%9D%98 API %ED%98%B8%EC%B6%9C%EC%9D%84 %ED%95%98%EB%8A%94 %EA%B2%83%EC%9D%80 %EC%9D%B4%EC%83%81%EC%A0%81%EC%9D%B4%EC%A7%80 %EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4. %EB%8B%A4%EC%9D%8C %EB%8B%A8%EA%B3%84%EB%8A%94 %EC%A0%84%EC%B2%B4 %EB%B0%B0%EC%97%B4%EC%9D%84 %EB%B0%98%ED%99%98%ED%95%98%EB%8A%94 %ED%95%A8%EC%88%98%EB%A5%BC %EC%9E%91%EC%84%B1%ED%95%98%EB%8A%94 %EA%B2%83%EC%9E%85%EB%8B%88%EB%8B%A4.%0A%0A%EC%9C%84%EC%97%90%EC%84%9C %EC%B6%94%EA%B0%80 %ED%95%9C adopt () %ED%95%A8%EC%88%98 %EB%8B%A4%EC%9D%8C, %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%97%90 getAdopters () %ED%95%A8%EC%88%98%EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0Aadopters %EB%93%A4%EC%9D%80 %EC%9D%B4%EB%AF%B8 %EC%84%A0%EC%96%B8 %EB%90%98%EC%97%88%EC%9C%BC%EB%AF%80%EB%A1%9C %EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C %EB%B0%98%ED%99%98 %ED%95%A0 %EC%88%98 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EB%B0%98%ED%99%98 %EC%9C%A0%ED%98%95 (%EC%9D%B4 %EA%B2%BD%EC%9A%B0, Adopters%EC%9D%98 %EC%9C%A0%ED%98%95)%EC%9D%84 Address %5B16%5D%EC%9C%BC%EB%A1%9C %EC%A7%80%EC%A0%95%ED%95%B4%EC%95%BC%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0A%0A## 4. Smart Contract %EC%BB%B4%ED%8C%8C%EC%9D%BC %EB%B0%8F %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%0A%0A%0A%0A## 5. Smart Contract %ED%85%8C%EC%8A%A4%ED%8A%B8%0A%0A%0A%0A%0A## 6. Smart Contract%EC%99%80 %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9%ED%95%98%EB%8A%94 %EC%82%AC%EC%9A%A9%EC%9E%90 %EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A%0A%0A%0A## 7. %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C dapp%EA%B3%BC %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\",\"https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-26T15:21:24",
"trx_id": "b0b2c2d7e6b1f66e4cb0b83041fe0f36881add55",
"trx_in_block": 6,
"virtual_op": 0
}dongshikupdated their account properties2018/04/26 14:22:39
dongshikupdated their account properties
2018/04/26 14:22:39
| account | dongshik |
| json metadata | {"profile":{"name":"망각","about":"여전히 개발하고 공부하는게 재미있습니다.!!!","location":"서울"}} |
| memo key | STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N |
| Transaction Info | Block #21906882/Trx 171d445230a24409f6578a335d962aa0c0476e34 |
View Raw JSON Data
{
"block": 21906882,
"op": [
"account_update",
{
"account": "dongshik",
"json_metadata": "{\"profile\":{\"name\":\"망각\",\"about\":\"여전히 개발하고 공부하는게 재미있습니다.!!!\",\"location\":\"서울\"}}",
"memo_key": "STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-26T14:22:39",
"trx_id": "171d445230a24409f6578a335d962aa0c0476e34",
"trx_in_block": 19,
"virtual_op": 0
}uhogoneyalaidanupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle2018/04/25 19:18:21
uhogoneyalaidanupvoted (100.00%) @dongshik / ethereum-pet-shop-and-truffle
2018/04/25 19:18:21
| author | dongshik |
| permlink | ethereum-pet-shop-and-truffle |
| voter | uhogoneyalaidan |
| weight | 10000 (100.00%) |
| Transaction Info | Block #21884008/Trx 8004e0efda357305c68c327a688fdf149db91334 |
View Raw JSON Data
{
"block": 21884008,
"op": [
"vote",
{
"author": "dongshik",
"permlink": "ethereum-pet-shop-and-truffle",
"voter": "uhogoneyalaidan",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T19:18:21",
"trx_id": "8004e0efda357305c68c327a688fdf149db91334",
"trx_in_block": 6,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/25 14:38:27
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/25 14:38:27
| author | dongshik |
| body | @@ -4,14 +4,11 @@ %EC%84%B8%EC%9A%94. -%EB%A7%9D%EA%B0%81%5E%5E %EC%9E%85 +%EB%B0%98%EA%B0%91%EC%8A%B5 %EB%8B%88%EB%8B%A4.%0A @@ -2337,16 +2337,458 @@ 8jbZY/image.png) +%0A%0A%EC%83%9D%EC%84%B1%EB%90%9C %EA%B8%B0%EB%B3%B8 Truffle %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC %EA%B5%AC%EC%A1%B0 %EB%B0%8F %ED%8C%8C%EC%9D%BC %EC%84%A4%EB%AA%85%0Acontracts / : %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9D%84 %EC%9C%84%ED%95%9C Solidity %EC%86%8C%EC%8A%A4 %ED%8C%8C%EC%9D%BC%EC%9D%84 %ED%8F%AC%ED%95%A8%ED%95%A9%EB%8B%88%EB%8B%A4.%C2%A0%ED%95%B4%EB%8B%B9 %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90 Migrations.sol%EC%9D%B4%EB%9D%BC%EB%8A%94 %EC%A4%91%EC%9A%94%ED%95%9C %EA%B3%84%EC%95%BD%EC%9D%B4 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EC%9D%B4 %EA%B3%84%EC%95%BD%EC%97%90 %EB%8C%80%ED%95%B4%EC%84%9C%EB%8A%94 %EB%82%98%EC%A4%91%EC%97%90 %EC%84%A4%EB%AA%85%ED%95%A9%EB%8B%88%EB%8B%A4. %0A%0AMigrations / : Truffle%EC%9D%80 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8 %EB%B0%B0%ED%8F%AC%EB%A5%BC %EC%B2%98%EB%A6%AC %ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%B4%EC%84%9C Migration%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%84 %EC%82%AC%EC%9A%A9%ED%95%A9%EB%8B%88%EB%8B%A4.%C2%A0Migration%EC%9D%80 %EB%B3%80%EA%B2%BD %EC%82%AC%ED%95%AD%EC%9D%84 %EC%B6%94%EC%A0%81%ED%95%98%EB%8A%94 %EC%B6%94%EA%B0%80%EC%A0%81%EC%9D%B8 %ED%8A%B9%EB%B3%84%ED%95%9C %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9E%85%EB%8B%88%EB%8B%A4. %0A%0Atest / : %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%9D%98 JavaScript %EB%B0%8F Solidity %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC %EB%AA%A8%EB%91%90 %ED%8F%AC%ED%95%A8%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0Atruffle.js : Truffle %EC%84%A4%EC%A0%95 %ED%8C%8C%EC%9D%BC%0A%0A!%5B%5D(https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png)%0A%0A(%EA%B3%84%EC%86%8D....) |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png","https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #21878411/Trx a050531d43d4f21e3b7552a0948ae6f86767851f |
View Raw JSON Data
{
"block": 21878411,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -4,14 +4,11 @@\n %EC%84%B8%EC%9A%94. \n-%EB%A7%9D%EA%B0%81%5E%5E %EC%9E%85\n+%EB%B0%98%EA%B0%91%EC%8A%B5\n %EB%8B%88%EB%8B%A4.%0A\n@@ -2337,16 +2337,458 @@\n 8jbZY/image.png)\n+%0A%0A%EC%83%9D%EC%84%B1%EB%90%9C %EA%B8%B0%EB%B3%B8 Truffle %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC %EA%B5%AC%EC%A1%B0 %EB%B0%8F %ED%8C%8C%EC%9D%BC %EC%84%A4%EB%AA%85%0Acontracts / : %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9D%84 %EC%9C%84%ED%95%9C Solidity %EC%86%8C%EC%8A%A4 %ED%8C%8C%EC%9D%BC%EC%9D%84 %ED%8F%AC%ED%95%A8%ED%95%A9%EB%8B%88%EB%8B%A4.%C2%A0%ED%95%B4%EB%8B%B9 %EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90 Migrations.sol%EC%9D%B4%EB%9D%BC%EB%8A%94 %EC%A4%91%EC%9A%94%ED%95%9C %EA%B3%84%EC%95%BD%EC%9D%B4 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4. %EC%9D%B4 %EA%B3%84%EC%95%BD%EC%97%90 %EB%8C%80%ED%95%B4%EC%84%9C%EB%8A%94 %EB%82%98%EC%A4%91%EC%97%90 %EC%84%A4%EB%AA%85%ED%95%A9%EB%8B%88%EB%8B%A4. %0A%0AMigrations / : Truffle%EC%9D%80 %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8 %EB%B0%B0%ED%8F%AC%EB%A5%BC %EC%B2%98%EB%A6%AC %ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%B4%EC%84%9C Migration%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%84 %EC%82%AC%EC%9A%A9%ED%95%A9%EB%8B%88%EB%8B%A4.%C2%A0Migration%EC%9D%80 %EB%B3%80%EA%B2%BD %EC%82%AC%ED%95%AD%EC%9D%84 %EC%B6%94%EC%A0%81%ED%95%98%EB%8A%94 %EC%B6%94%EA%B0%80%EC%A0%81%EC%9D%B8 %ED%8A%B9%EB%B3%84%ED%95%9C %EC%8A%A4%EB%A7%88%ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9E%85%EB%8B%88%EB%8B%A4. %0A%0Atest / : %EC%8A%A4%EB%A7%88%ED%8A%B8 %EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8%EC%9D%98 JavaScript %EB%B0%8F Solidity %ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC %EB%AA%A8%EB%91%90 %ED%8F%AC%ED%95%A8%ED%95%A9%EB%8B%88%EB%8B%A4.%0A%0Atruffle.js : Truffle %EC%84%A4%EC%A0%95 %ED%8C%8C%EC%9D%BC%0A%0A!%5B%5D(https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png)%0A%0A(%EA%B3%84%EC%86%8D....)\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\",\"https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T14:38:27",
"trx_id": "a050531d43d4f21e3b7552a0948ae6f86767851f",
"trx_in_block": 22,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/25 14:30:12
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/25 14:30:12
| author | dongshik |
| body | 안녕하세요. 망각^^ 입니다. Ethereum Dapp개발을 위한 truffle 튜토리얼 중 pet-shop 튜토리얼을 통해 로컬 개발환경 구성과 실행 테스트, 명령어 실행은 물론이고 스마트 컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다 또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다 먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다 Pete’s Pet Shop 튜토리얼 - Pet shop의 입양(Adoption) 추적 시스템 추축 과정 안내를 목표로 합니다 - Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자를 대상으로 합니다 Pet Shop 튜토리얼 배경 - 고객은 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있습니다 - 한번에 16마리의 애완동물을 관리하기 위한 공간을 보유하고 있으며 - 각 애완동물에 대한 정보 데이터 베이스를 보유하고 있습니다 - Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp 구현을 목표로 하며 - 기본 웹사이트의 구조와 Style을 제공합니다 - 프론트엔드 로직과 스마트 계약을 작성하면 완성되는 형식으로 구성되어 있습니다 Pet Shop 튜토리얼 아키텍처  4가지의 주요 기능으로 구성되며 순차적으로 하나씩 살펴 보겠습니다 튜토리얼 순서 1. 개발 환경 설정 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 3. Smart Contract 작성하기 4. Smart Contract 컴파일 및 마이그레이션 5. Smart Contract 테스트 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 7. 브라우저에서 dapp과 상호 작용 (MacOS를 기준으로 작성합니다) ## 1. 개발 환경 설정 먼저 Truffle 설치 전에 아래 두가지를 설치합니다. - Node.js v6+ LTS and npm (comes with Node) - Git 완료 후 Truffle을 설치합니다.  Truffle 설치 확인  Ganache 설치 스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인 http://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.  설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)  ## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 Truffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.  Pet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.  |
| json metadata | {"tags":["etherum","pet-shop","truffle","tutorial"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png","https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png","https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png","https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png","https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png","https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png"],"app":"steemit/0.1","format":"markdown","links":["http://truffleframework.com/ganache"]} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #21878246/Trx b4c1549440909a3ec156cfe78d444ae1d7ed6702 |
View Raw JSON Data
{
"block": 21878246,
"op": [
"comment",
{
"author": "dongshik",
"body": "안녕하세요. 망각^^ 입니다.\n\nEthereum Dapp개발을 위한 truffle 튜토리얼 중 pet-shop 튜토리얼을 통해 로컬 개발환경 구성과 실행 테스트, 명령어 실행은 물론이고 스마트 컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다\n\n또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다\n\n먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다\n\nPete’s Pet Shop 튜토리얼\n- Pet shop의 입양(Adoption) 추적 시스템 추축 과정 안내를 목표로 합니다\n- Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자를 대상으로 합니다\n\nPet Shop 튜토리얼 배경\n- 고객은 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있습니다\n- 한번에 16마리의 애완동물을 관리하기 위한 공간을 보유하고 있으며\n- 각 애완동물에 대한 정보 데이터 베이스를 보유하고 있습니다\n- Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp 구현을 목표로 하며\n- 기본 웹사이트의 구조와 Style을 제공합니다\n- 프론트엔드 로직과 스마트 계약을 작성하면 완성되는 형식으로 구성되어 있습니다\n\nPet Shop 튜토리얼 아키텍처\n\n4가지의 주요 기능으로 구성되며 순차적으로 하나씩 살펴 보겠습니다\n\n튜토리얼 순서\n\n1. 개발 환경 설정\n2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\n3. Smart Contract 작성하기\n4. Smart Contract 컴파일 및 마이그레이션\n5. Smart Contract 테스트\n6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n7. 브라우저에서 dapp과 상호 작용\n\n(MacOS를 기준으로 작성합니다)\n\n## 1. 개발 환경 설정\n\n먼저 Truffle 설치 전에 아래 두가지를 설치합니다.\n- Node.js v6+ LTS and npm (comes with Node)\n- Git\n\n완료 후 Truffle을 설치합니다.\n\n\nTruffle 설치 확인\n\n\nGanache 설치\n스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인\nhttp://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.\n\n\n설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)\n\n\n## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\nTruffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.\n\n\nPet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\",\"tutorial\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png\",\"https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png\",\"https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png\",\"https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png\",\"https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png\",\"https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"links\":[\"http://truffleframework.com/ganache\"]}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T14:30:12",
"trx_id": "b4c1549440909a3ec156cfe78d444ae1d7ed6702",
"trx_in_block": 22,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/25 13:49:06
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/25 13:49:06
| author | dongshik |
| body | @@ -939,13 +939,15 @@ %ED%86%A0%EB%A6%AC%EC%96%BC -%EB%82%B4%EC%9A%A9 +%EC%88%9C%EC%84%9C%0A %0A1. + %EA%B0%9C%EB%B0%9C %ED%99%98 @@ -953,16 +953,17 @@ %ED%99%98%EA%B2%BD %EC%84%A4%EC%A0%95%0A2. + Truffle @@ -991,16 +991,17 @@ %ED%8A%B8 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A3. + Smart Co @@ -1014,16 +1014,17 @@ %EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0%0A4. + Smart Co @@ -1045,16 +1045,17 @@ %EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%0A5. + Smart Co @@ -1067,16 +1067,17 @@ t %ED%85%8C%EC%8A%A4%ED%8A%B8%0A6. + Smart Co @@ -1108,16 +1108,17 @@ %EC%8A%A4 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A7. + %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C d @@ -1123,12 +1123,242 @@ dapp%EA%B3%BC %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9 +%0A%0A(MacOS%EB%A5%BC %EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C %EC%9E%91%EC%84%B1%ED%95%A9%EB%8B%88%EB%8B%A4)%0A%0A# 1. %EA%B0%9C%EB%B0%9C %ED%99%98%EA%B2%BD %EC%84%A4%EC%A0%95%0A%0A%EB%A8%BC%EC%A0%80 Truffle %EC%84%A4%EC%B9%98 %EC%A0%84%EC%97%90 %EC%95%84%EB%9E%98 %EB%91%90%EA%B0%80%EC%A7%80%EB%A5%BC %EC%84%A4%EC%B9%98%ED%95%A9%EB%8B%88%EB%8B%A4.%0A- Node.js v6+ LTS and npm (comes with Node)%0A- Git%0A%0A%EC%99%84%EB%A3%8C %ED%9B%84 Truffle%EC%9D%84 %EC%84%A4%EC%B9%98%ED%95%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmYVkxzn6nD8JZ7NJi9G8MfU51bYVxPP23rMtHCEAQHjpj/image.png) |
| json metadata | {"tags":["etherum","pet-shop","truffle"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg","https://steemitimages.com/DQmYVkxzn6nD8JZ7NJi9G8MfU51bYVxPP23rMtHCEAQHjpj/image.png"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #21877424/Trx dbff5420eb45d243b0920376190f3f7f083dedef |
View Raw JSON Data
{
"block": 21877424,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -939,13 +939,15 @@\n %ED%86%A0%EB%A6%AC%EC%96%BC \n-%EB%82%B4%EC%9A%A9\n+%EC%88%9C%EC%84%9C%0A\n %0A1.\n+ \n %EA%B0%9C%EB%B0%9C %ED%99%98\n@@ -953,16 +953,17 @@\n %ED%99%98%EA%B2%BD %EC%84%A4%EC%A0%95%0A2.\n+ \n Truffle \n@@ -991,16 +991,17 @@\n %ED%8A%B8 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A3.\n+ \n Smart Co\n@@ -1014,16 +1014,17 @@\n %EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0%0A4.\n+ \n Smart Co\n@@ -1045,16 +1045,17 @@\n %EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%0A5.\n+ \n Smart Co\n@@ -1067,16 +1067,17 @@\n t %ED%85%8C%EC%8A%A4%ED%8A%B8%0A6.\n+ \n Smart Co\n@@ -1108,16 +1108,17 @@\n %EC%8A%A4 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A7.\n+ \n %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C d\n@@ -1123,12 +1123,242 @@\n dapp%EA%B3%BC %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9\n+%0A%0A(MacOS%EB%A5%BC %EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C %EC%9E%91%EC%84%B1%ED%95%A9%EB%8B%88%EB%8B%A4)%0A%0A# 1. %EA%B0%9C%EB%B0%9C %ED%99%98%EA%B2%BD %EC%84%A4%EC%A0%95%0A%0A%EB%A8%BC%EC%A0%80 Truffle %EC%84%A4%EC%B9%98 %EC%A0%84%EC%97%90 %EC%95%84%EB%9E%98 %EB%91%90%EA%B0%80%EC%A7%80%EB%A5%BC %EC%84%A4%EC%B9%98%ED%95%A9%EB%8B%88%EB%8B%A4.%0A- Node.js v6+ LTS and npm (comes with Node)%0A- Git%0A%0A%EC%99%84%EB%A3%8C %ED%9B%84 Truffle%EC%9D%84 %EC%84%A4%EC%B9%98%ED%95%A9%EB%8B%88%EB%8B%A4.%0A!%5B%5D(https://steemitimages.com/DQmYVkxzn6nD8JZ7NJi9G8MfU51bYVxPP23rMtHCEAQHjpj/image.png)\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\",\"https://steemitimages.com/DQmYVkxzn6nD8JZ7NJi9G8MfU51bYVxPP23rMtHCEAQHjpj/image.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T13:49:06",
"trx_id": "dbff5420eb45d243b0920376190f3f7f083dedef",
"trx_in_block": 23,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/25 13:36:18
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/25 13:36:18
| author | dongshik |
| body | @@ -326,199 +326,8 @@ %EB%8B%88%EB%8B%A4%0A%0A -%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC %EB%82%B4%EC%9A%A9%0A- %EA%B0%9C%EB%B0%9C %ED%99%98%EA%B2%BD %EC%84%A4%EC%A0%95%0A- Truffle Box%EB%A5%BC %EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC Truffle %ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A- Smart Contract %EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0%0A- Smart Contract %EC%BB%B4%ED%8C%8C%EC%9D%BC %EB%B0%8F %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%0A- Smart Contract %ED%85%8C%EC%8A%A4%ED%8A%B8%0A- Smart Contract%EC%99%80 %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9%ED%95%98%EB%8A%94 %EC%82%AC%EC%9A%A9%EC%9E%90 %EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A- %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C dapp%EA%B3%BC %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9%0A%0A Pete @@ -928,8 +928,199 @@ %EC%82%B4%ED%8E%B4 %EB%B3%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4 +%0A%0A%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC %EB%82%B4%EC%9A%A9%0A1.%EA%B0%9C%EB%B0%9C %ED%99%98%EA%B2%BD %EC%84%A4%EC%A0%95%0A2.Truffle Box%EB%A5%BC %EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC Truffle %ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A3.Smart Contract %EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0%0A4.Smart Contract %EC%BB%B4%ED%8C%8C%EC%9D%BC %EB%B0%8F %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%0A5.Smart Contract %ED%85%8C%EC%8A%A4%ED%8A%B8%0A6.Smart Contract%EC%99%80 %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9%ED%95%98%EB%8A%94 %EC%82%AC%EC%9A%A9%EC%9E%90 %EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A7.%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C dapp%EA%B3%BC %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9 |
| json metadata | {"tags":["etherum","pet-shop","truffle"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet shop & truffle 샘플 |
| Transaction Info | Block #21877168/Trx 6592c1afc1cc4ad5f1aea9a1d41f390997034c5f |
View Raw JSON Data
{
"block": 21877168,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -326,199 +326,8 @@\n %EB%8B%88%EB%8B%A4%0A%0A\n-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC %EB%82%B4%EC%9A%A9%0A- %EA%B0%9C%EB%B0%9C %ED%99%98%EA%B2%BD %EC%84%A4%EC%A0%95%0A- Truffle Box%EB%A5%BC %EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC Truffle %ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A- Smart Contract %EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0%0A- Smart Contract %EC%BB%B4%ED%8C%8C%EC%9D%BC %EB%B0%8F %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%0A- Smart Contract %ED%85%8C%EC%8A%A4%ED%8A%B8%0A- Smart Contract%EC%99%80 %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9%ED%95%98%EB%8A%94 %EC%82%AC%EC%9A%A9%EC%9E%90 %EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A- %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C dapp%EA%B3%BC %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9%0A%0A\n Pete\n@@ -928,8 +928,199 @@\n %EC%82%B4%ED%8E%B4 %EB%B3%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4\n+%0A%0A%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC %EB%82%B4%EC%9A%A9%0A1.%EA%B0%9C%EB%B0%9C %ED%99%98%EA%B2%BD %EC%84%A4%EC%A0%95%0A2.Truffle Box%EB%A5%BC %EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC Truffle %ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A3.Smart Contract %EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0%0A4.Smart Contract %EC%BB%B4%ED%8C%8C%EC%9D%BC %EB%B0%8F %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%0A5.Smart Contract %ED%85%8C%EC%8A%A4%ED%8A%B8%0A6.Smart Contract%EC%99%80 %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9%ED%95%98%EB%8A%94 %EC%82%AC%EC%9A%A9%EC%9E%90 %EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A7.%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C dapp%EA%B3%BC %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T13:36:18",
"trx_id": "6592c1afc1cc4ad5f1aea9a1d41f390997034c5f",
"trx_in_block": 25,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/25 13:29:09
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/25 13:29:09
| author | dongshik |
| body | @@ -322,16 +322,207 @@ %EA%B3%84%ED%9A%8D%EC%9E%85%EB%8B%88%EB%8B%A4%0A%0A +%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC %EB%82%B4%EC%9A%A9%0A- %EA%B0%9C%EB%B0%9C %ED%99%98%EA%B2%BD %EC%84%A4%EC%A0%95%0A- Truffle Box%EB%A5%BC %EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC Truffle %ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A- Smart Contract %EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0%0A- Smart Contract %EC%BB%B4%ED%8C%8C%EC%9D%BC %EB%B0%8F %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%0A- Smart Contract %ED%85%8C%EC%8A%A4%ED%8A%B8%0A- Smart Contract%EC%99%80 %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9%ED%95%98%EB%8A%94 %EC%82%AC%EC%9A%A9%EC%9E%90 %EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A- %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C dapp%EA%B3%BC %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9%0A%0A Pete%E2%80%99s P @@ -548,16 +548,26 @@ shop%EC%9D%98 %EC%9E%85%EC%96%91 +(Adoption) %EC%B6%94%EC%A0%81 %EC%8B%9C%EC%8A%A4%ED%85%9C @@ -626,11 +626,8 @@ L %EB%B0%8F -%0A Java @@ -692,13 +692,10 @@ %ED%86%A0%EB%A6%AC%EC%96%BC -%EA%B5%AC%ED%98%84 %EC%9A%94%EA%B1%B4 +%EB%B0%B0%EA%B2%BD %0A- %EA%B3%A0 |
| json metadata | {"tags":["etherum","pet-shop","truffle"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet-shop & truffle 샘플 |
| Transaction Info | Block #21877025/Trx ddadbec27f4df31d1419afb9aa1c34cc6872f11e |
View Raw JSON Data
{
"block": 21877025,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -322,16 +322,207 @@\n %EA%B3%84%ED%9A%8D%EC%9E%85%EB%8B%88%EB%8B%A4%0A%0A\n+%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC %EB%82%B4%EC%9A%A9%0A- %EA%B0%9C%EB%B0%9C %ED%99%98%EA%B2%BD %EC%84%A4%EC%A0%95%0A- Truffle Box%EB%A5%BC %EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC Truffle %ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A- Smart Contract %EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0%0A- Smart Contract %EC%BB%B4%ED%8C%8C%EC%9D%BC %EB%B0%8F %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%0A- Smart Contract %ED%85%8C%EC%8A%A4%ED%8A%B8%0A- Smart Contract%EC%99%80 %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9%ED%95%98%EB%8A%94 %EC%82%AC%EC%9A%A9%EC%9E%90 %EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 %EB%A7%8C%EB%93%A4%EA%B8%B0%0A- %EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C dapp%EA%B3%BC %EC%83%81%ED%98%B8 %EC%9E%91%EC%9A%A9%0A%0A\n Pete%E2%80%99s P\n@@ -548,16 +548,26 @@\n shop%EC%9D%98 %EC%9E%85%EC%96%91\n+(Adoption)\n %EC%B6%94%EC%A0%81 %EC%8B%9C%EC%8A%A4%ED%85%9C \n@@ -626,11 +626,8 @@\n L %EB%B0%8F \n-%0A \n Java\n@@ -692,13 +692,10 @@\n %ED%86%A0%EB%A6%AC%EC%96%BC \n-%EA%B5%AC%ED%98%84 %EC%9A%94%EA%B1%B4\n+%EB%B0%B0%EA%B2%BD\n %0A- %EA%B3%A0\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet-shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T13:29:09",
"trx_id": "ddadbec27f4df31d1419afb9aa1c34cc6872f11e",
"trx_in_block": 37,
"virtual_op": 0
}dongshikupdated their account properties2018/04/25 13:14:45
dongshikupdated their account properties
2018/04/25 13:14:45
| account | dongshik |
| json metadata | {"profile":{"profile_image":"https://i.imgsafe.org/07/07e8632d04.jpeg","name":"망각","about":"여전히 개발하고 공부하는게 재미있습니다.!!!","location":"서울"}} |
| memo key | STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N |
| Transaction Info | Block #21876737/Trx 5c8d4a4c790d285db8e055268da1053eaeba8f9d |
View Raw JSON Data
{
"block": 21876737,
"op": [
"account_update",
{
"account": "dongshik",
"json_metadata": "{\"profile\":{\"profile_image\":\"https://i.imgsafe.org/07/07e8632d04.jpeg\",\"name\":\"망각\",\"about\":\"여전히 개발하고 공부하는게 재미있습니다.!!!\",\"location\":\"서울\"}}",
"memo_key": "STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T13:14:45",
"trx_id": "5c8d4a4c790d285db8e055268da1053eaeba8f9d",
"trx_in_block": 10,
"virtual_op": 0
}dongshikupdated their account properties2018/04/25 13:14:03
dongshikupdated their account properties
2018/04/25 13:14:03
| account | dongshik |
| json metadata | {"profile":{"profile_image":"https://i.imgsafe.org/07/07e8632d04.jpeg","cover_image":"https://i.imgsafe.org/07/07e8632d04.jpeg","name":"망각","about":"여전히 개발하고 공부하는게 재미있습니다.!!!","location":"서울"}} |
| memo key | STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N |
| Transaction Info | Block #21876723/Trx 803024bbfae4e2b66765cb2879c678a67de0649b |
View Raw JSON Data
{
"block": 21876723,
"op": [
"account_update",
{
"account": "dongshik",
"json_metadata": "{\"profile\":{\"profile_image\":\"https://i.imgsafe.org/07/07e8632d04.jpeg\",\"cover_image\":\"https://i.imgsafe.org/07/07e8632d04.jpeg\",\"name\":\"망각\",\"about\":\"여전히 개발하고 공부하는게 재미있습니다.!!!\",\"location\":\"서울\"}}",
"memo_key": "STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T13:14:03",
"trx_id": "803024bbfae4e2b66765cb2879c678a67de0649b",
"trx_in_block": 29,
"virtual_op": 0
}dongshikupdated their account properties2018/04/25 13:13:09
dongshikupdated their account properties
2018/04/25 13:13:09
| account | dongshik |
| json metadata | {"profile":{"profile_image":"https://imgsafe.org/image/07e8632d04","cover_image":"https://imgsafe.org/image/07e8632d04","name":"망각","about":"여전히 개발하고 공부하는게 재미있습니다.!!!","location":"서울"}} |
| memo key | STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N |
| Transaction Info | Block #21876705/Trx aadc587e32f60523fedfded1b948d7379678fd48 |
View Raw JSON Data
{
"block": 21876705,
"op": [
"account_update",
{
"account": "dongshik",
"json_metadata": "{\"profile\":{\"profile_image\":\"https://imgsafe.org/image/07e8632d04\",\"cover_image\":\"https://imgsafe.org/image/07e8632d04\",\"name\":\"망각\",\"about\":\"여전히 개발하고 공부하는게 재미있습니다.!!!\",\"location\":\"서울\"}}",
"memo_key": "STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T13:13:09",
"trx_id": "aadc587e32f60523fedfded1b948d7379678fd48",
"trx_in_block": 39,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/25 12:03:51
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/25 12:03:51
| author | dongshik |
| body | @@ -887,8 +887,45 @@ 01.jpeg) +%0A4%EA%B0%80%EC%A7%80%EC%9D%98 %EC%A3%BC%EC%9A%94 %EA%B8%B0%EB%8A%A5%EC%9C%BC%EB%A1%9C %EA%B5%AC%EC%84%B1%EB%90%98%EB%A9%B0 %EC%88%9C%EC%B0%A8%EC%A0%81%EC%9C%BC%EB%A1%9C %ED%95%98%EB%82%98%EC%94%A9 %EC%82%B4%ED%8E%B4 %EB%B3%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4 |
| json metadata | {"tags":["etherum","pet-shop","truffle"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet-shop & truffle 샘플 |
| Transaction Info | Block #21875319/Trx 69d403c3ffe25d2a3bc9a74c7a2a93e8cd705d0e |
View Raw JSON Data
{
"block": 21875319,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -887,8 +887,45 @@\n 01.jpeg)\n+%0A4%EA%B0%80%EC%A7%80%EC%9D%98 %EC%A3%BC%EC%9A%94 %EA%B8%B0%EB%8A%A5%EC%9C%BC%EB%A1%9C %EA%B5%AC%EC%84%B1%EB%90%98%EB%A9%B0 %EC%88%9C%EC%B0%A8%EC%A0%81%EC%9C%BC%EB%A1%9C %ED%95%98%EB%82%98%EC%94%A9 %EC%82%B4%ED%8E%B4 %EB%B3%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet-shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T12:03:51",
"trx_id": "69d403c3ffe25d2a3bc9a74c7a2a93e8cd705d0e",
"trx_in_block": 14,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/25 12:01:06
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/25 12:01:06
| author | dongshik |
| body | @@ -383,10 +383,11 @@ %EB%AA%A9%ED%91%9C%EB%A1%9C -%ED%95%A8. +%ED%95%A9%EB%8B%88%EB%8B%A4 %0A- E @@ -468,11 +468,18 @@ %EA%B0%9C%EB%B0%9C%EC%9E%90 +%EB%A5%BC %EB%8C%80%EC%83%81 +%EC%9C%BC%EB%A1%9C %ED%95%A9%EB%8B%88%EB%8B%A4 %0A%0APe @@ -497,16 +497,20 @@ %EA%B5%AC%ED%98%84 %EC%9A%94%EA%B1%B4%0A- + %EA%B3%A0%EA%B0%9D%EC%9D%80 %EC%95%A0%EC%99%84%EB%8F%99%EB%AC%BC%EC%9D%98 %EC%9E%85 @@ -551,9 +551,11 @@ %EC%A7%80%EA%B3%A0 %EC%9E%88 -%EC%9D%8C +%EC%8A%B5%EB%8B%88%EB%8B%A4 %0A- %ED%95%9C @@ -579,16 +579,26 @@ %ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%9C %EA%B3%B5%EA%B0%84 +%EC%9D%84 %EB%B3%B4%EC%9C%A0%ED%95%98%EA%B3%A0 %EC%9E%88%EC%9C%BC%EB%A9%B0 %0A- %EA%B0%81 %EC%95%A0%EC%99%84%EB%8F%99 @@ -617,16 +617,23 @@ %EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%A5%BC %EB%B3%B4%EC%9C%A0 +%ED%95%98%EA%B3%A0 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4 %0A- Pet S @@ -685,12 +685,19 @@ Dapp -%EC%9D%84 %EA%B5%AC%ED%98%84 +%EC%9D%84 %EB%AA%A9%ED%91%9C%EB%A1%9C %ED%95%98%EB%A9%B0 %0A- %EA%B8%B0 @@ -717,16 +717,19 @@ tyle%EC%9D%84 %EC%A0%9C%EA%B3%B5 +%ED%95%A9%EB%8B%88%EB%8B%A4 %0A- %ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C @@ -743,16 +743,38 @@ %ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9D%84 %EC%9E%91%EC%84%B1 +%ED%95%98%EB%A9%B4 %EC%99%84%EC%84%B1%EB%90%98%EB%8A%94 %ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C %EA%B5%AC%EC%84%B1%EB%90%98%EC%96%B4 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4 %0A%0APet Sh |
| json metadata | {"tags":["etherum","pet-shop","truffle"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet-shop & truffle 샘플 |
| Transaction Info | Block #21875264/Trx f4559e36e63ce89838466eb49286b522f54a92bc |
View Raw JSON Data
{
"block": 21875264,
"op": [
"comment",
{
"author": "dongshik",
"body": "@@ -383,10 +383,11 @@\n %EB%AA%A9%ED%91%9C%EB%A1%9C \n-%ED%95%A8.\n+%ED%95%A9%EB%8B%88%EB%8B%A4\n %0A- E\n@@ -468,11 +468,18 @@\n %EA%B0%9C%EB%B0%9C%EC%9E%90\n+%EB%A5%BC\n %EB%8C%80%EC%83%81\n+%EC%9C%BC%EB%A1%9C %ED%95%A9%EB%8B%88%EB%8B%A4\n %0A%0APe\n@@ -497,16 +497,20 @@\n %EA%B5%AC%ED%98%84 %EC%9A%94%EA%B1%B4%0A-\n+ %EA%B3%A0%EA%B0%9D%EC%9D%80\n %EC%95%A0%EC%99%84%EB%8F%99%EB%AC%BC%EC%9D%98 %EC%9E%85\n@@ -551,9 +551,11 @@\n %EC%A7%80%EA%B3%A0 %EC%9E%88\n-%EC%9D%8C\n+%EC%8A%B5%EB%8B%88%EB%8B%A4\n %0A- %ED%95%9C\n@@ -579,16 +579,26 @@\n %ED%95%98%EA%B8%B0 %EC%9C%84%ED%95%9C %EA%B3%B5%EA%B0%84\n+%EC%9D%84 %EB%B3%B4%EC%9C%A0%ED%95%98%EA%B3%A0 %EC%9E%88%EC%9C%BC%EB%A9%B0\n %0A- %EA%B0%81 %EC%95%A0%EC%99%84%EB%8F%99\n@@ -617,16 +617,23 @@\n %EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%A5%BC %EB%B3%B4%EC%9C%A0\n+%ED%95%98%EA%B3%A0 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4\n %0A- Pet S\n@@ -685,12 +685,19 @@\n Dapp\n-%EC%9D%84\n %EA%B5%AC%ED%98%84\n+%EC%9D%84 %EB%AA%A9%ED%91%9C%EB%A1%9C %ED%95%98%EB%A9%B0\n %0A- %EA%B8%B0\n@@ -717,16 +717,19 @@\n tyle%EC%9D%84 %EC%A0%9C%EA%B3%B5\n+%ED%95%A9%EB%8B%88%EB%8B%A4\n %0A- %ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C\n@@ -743,16 +743,38 @@\n %ED%8A%B8 %EA%B3%84%EC%95%BD%EC%9D%84 %EC%9E%91%EC%84%B1\n+%ED%95%98%EB%A9%B4 %EC%99%84%EC%84%B1%EB%90%98%EB%8A%94 %ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C %EA%B5%AC%EC%84%B1%EB%90%98%EC%96%B4 %EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4\n %0A%0APet Sh\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet-shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T12:01:06",
"trx_id": "f4559e36e63ce89838466eb49286b522f54a92bc",
"trx_in_block": 34,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/25 11:56:15
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/25 11:56:15
| author | dongshik |
| body | Ethereum Dapp개발을 위한 truffle튜토리얼 중 pet-shop은 튜토리얼을 해보는 과정에 로컬 개발환경 구성과 실행테스트 명령어 실행은 물론이고 스마트컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다 또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다 먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다 Pete’s Pet Shop 튜토리얼 - Pet shop의 입양 추적 시스템 추축 과정 안내를 목표로 함. - Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자 대상 Pet Shop 튜토리얼 구현 요건 - 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있음 - 한번에 16마리의 애완동물을 관리하기 위한 공간 - 각 애완동물에 대한 정보 데이터 베이스를 보유 - Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp을 구현 - 기본 웹사이트의 구조와 Style을 제공 - 프론트엔드 로직과 스마트 계약을 작성 Pet Shop 튜토리얼 아키텍처  |
| json metadata | {"tags":["etherum","pet-shop","truffle"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet-shop & truffle 샘플 |
| Transaction Info | Block #21875167/Trx fa227fe8ba4d70bfe21e086c0ea04cbfdd9bd0fa |
View Raw JSON Data
{
"block": 21875167,
"op": [
"comment",
{
"author": "dongshik",
"body": "Ethereum Dapp개발을 위한 truffle튜토리얼 중 pet-shop은 튜토리얼을 해보는 과정에 로컬 개발환경 구성과 실행테스트 명령어 실행은 물론이고 스마트컨트랙트 개발, 테스트, 마이그레이션을 경험해 볼수 있습니다\n\n또한 nodejs 를 이용해서 웹으로 web3 클라이언트로 블록체인과 통신하고 트렌젝션 처리를위해 웹 브라우져를 통해 Metamask를 구동하고 거래를 처리해 봄으로서 Dapp서비스 개발의 전체적인 흐름과 개발 방법을 경험해볼수 있는 좋은 예입니다\n\n먼저, 충실히 튜토리얼을 진행해보고 이후 기본 기능에서 점차적으로 확장해가면서 기능을 추가해 볼 계획입니다\n\nPete’s Pet Shop 튜토리얼\n- Pet shop의 입양 추적 시스템 추축 과정 안내를 목표로 함.\n- Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 \n JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자 대상\n\nPet Shop 튜토리얼 구현 요건\n- 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있음\n- 한번에 16마리의 애완동물을 관리하기 위한 공간\n- 각 애완동물에 대한 정보 데이터 베이스를 보유\n- Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp을 구현\n- 기본 웹사이트의 구조와 Style을 제공\n- 프론트엔드 로직과 스마트 계약을 작성\n\nPet Shop 튜토리얼 아키텍처\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet-shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T11:56:15",
"trx_id": "fa227fe8ba4d70bfe21e086c0ea04cbfdd9bd0fa",
"trx_in_block": 11,
"virtual_op": 0
}2018/04/25 10:50:21
2018/04/25 10:50:21
| author | bboyghost |
| body | Hey bro check it out Get your post resteemed over 90000+ followers and get upto $21+ SBD value Upvote. Go to This site: http://autobooststeem.tk/ |
| json metadata | {"tags":["etherum"],"links":["http://autobooststeem.tk/"],"app":"steemit/0.1"} |
| parent author | dongshik |
| parent permlink | ethereum-pet-shop-and-truffle |
| permlink | re-dongshik-ethereum-pet-shop-and-truffle-20180425t104847439z |
| title | |
| Transaction Info | Block #21873850/Trx edfb37d9278ed2e6c09998cb7171aa28fe1a6f8c |
View Raw JSON Data
{
"block": 21873850,
"op": [
"comment",
{
"author": "bboyghost",
"body": "Hey bro check it out Get your post resteemed over 90000+ followers and get upto $21+ SBD value Upvote. Go to This site: http://autobooststeem.tk/",
"json_metadata": "{\"tags\":[\"etherum\"],\"links\":[\"http://autobooststeem.tk/\"],\"app\":\"steemit/0.1\"}",
"parent_author": "dongshik",
"parent_permlink": "ethereum-pet-shop-and-truffle",
"permlink": "re-dongshik-ethereum-pet-shop-and-truffle-20180425t104847439z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T10:50:21",
"trx_id": "edfb37d9278ed2e6c09998cb7171aa28fe1a6f8c",
"trx_in_block": 39,
"virtual_op": 0
}ax3upvoted (1.00%) @dongshik / ethereum-pet-shop-and-truffle2018/04/25 10:49:39
ax3upvoted (1.00%) @dongshik / ethereum-pet-shop-and-truffle
2018/04/25 10:49:39
| author | dongshik |
| permlink | ethereum-pet-shop-and-truffle |
| voter | ax3 |
| weight | 100 (1.00%) |
| Transaction Info | Block #21873836/Trx 377a1a08e37e61b3f3c8a248a8c39f787cb4df96 |
View Raw JSON Data
{
"block": 21873836,
"op": [
"vote",
{
"author": "dongshik",
"permlink": "ethereum-pet-shop-and-truffle",
"voter": "ax3",
"weight": 100
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T10:49:39",
"trx_id": "377a1a08e37e61b3f3c8a248a8c39f787cb4df96",
"trx_in_block": 19,
"virtual_op": 0
}dongshikpublished a new post: ethereum-pet-shop-and-truffle2018/04/25 10:49:30
dongshikpublished a new post: ethereum-pet-shop-and-truffle
2018/04/25 10:49:30
| author | dongshik |
| body | Pete’s Pet Shop 튜토리얼 - Pet shop의 입양 추적 시스템 추축 과정 안내를 목표로 함. - Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자 대상 Pet Shop 튜토리얼 구현 요건 - 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있음 - 한번에 16마리의 애완동물을 관리하기 위한 공간 - 각 애완동물에 대한 정보 데이터 베이스를 보유 - Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp을 구현 - 기본 웹사이트의 구조와 Style을 제공 - 프론트엔드 로직과 스마트 계약을 작성 Pet Shop 튜토리얼 아키텍처  |
| json metadata | {"tags":["etherum","pet-shop","truffle"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | etherum |
| permlink | ethereum-pet-shop-and-truffle |
| title | [작성중] Ethereum Pet-shop & truffle 샘플 |
| Transaction Info | Block #21873833/Trx f25bb9bf2c0b4e11eb155c9c11345e3e2481d0e4 |
View Raw JSON Data
{
"block": 21873833,
"op": [
"comment",
{
"author": "dongshik",
"body": "Pete’s Pet Shop 튜토리얼\n- Pet shop의 입양 추적 시스템 추축 과정 안내를 목표로 함.\n- Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 \n JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자 대상\n\nPet Shop 튜토리얼 구현 요건\n- 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있음\n- 한번에 16마리의 애완동물을 관리하기 위한 공간\n- 각 애완동물에 대한 정보 데이터 베이스를 보유\n- Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp을 구현\n- 기본 웹사이트의 구조와 Style을 제공\n- 프론트엔드 로직과 스마트 계약을 작성\n\nPet Shop 튜토리얼 아키텍처\n",
"json_metadata": "{\"tags\":[\"etherum\",\"pet-shop\",\"truffle\"],\"image\":[\"https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "etherum",
"permlink": "ethereum-pet-shop-and-truffle",
"title": "[작성중] Ethereum Pet-shop & truffle 샘플"
}
],
"op_in_trx": 0,
"timestamp": "2018-04-25T10:49:30",
"trx_id": "f25bb9bf2c0b4e11eb155c9c11345e3e2481d0e4",
"trx_in_block": 9,
"virtual_op": 0
}dongshikdeleted a comment or post2018/03/16 05:34:18
dongshikdeleted a comment or post
2018/03/16 05:34:18
| author | dongshik |
| permlink | re-modolee-eos-smart-contract-1-eos-20180316t041345931z |
| Transaction Info | Block #20717199/Trx 70240dbdd1f27c39e937e2702905535d236162b6 |
View Raw JSON Data
{
"block": 20717199,
"op": [
"delete_comment",
{
"author": "dongshik",
"permlink": "re-modolee-eos-smart-contract-1-eos-20180316t041345931z"
}
],
"op_in_trx": 0,
"timestamp": "2018-03-16T05:34:18",
"trx_id": "70240dbdd1f27c39e937e2702905535d236162b6",
"trx_in_block": 29,
"virtual_op": 0
}2018/03/16 04:13:48
2018/03/16 04:13:48
| author | dongshik |
| body | 안녕하세요 EOS 빌드해서 스마트 컨트랙트를 돌려볼려고 합니다. 좋은글 올려놓으셔서 우분투 virtualbox 만들고 빌드했는데 거의 마지막에서 에러가 발생하는군요.. 몇번을 해봤지만 동일한 에러라서 혹시 원인에 대한걸 찾아보고있지만 봐주실수있을지 해서 댓글올려드립니다. 좋은자료 정말 감사합니다. [100%] Built target c-index-test Install the project... -- Install configuration: "Release" 생략 -- Using custom FindBoost.cmake -- Boost version: 1.64.0 -- Found the following Boost libraries: -- thread -- date_time -- filesystem -- system -- chrono -- unit_test_framework -- locale -- Configuring ChainBase on Linux -- egenesis: /home/ubuntu17/eos/genesis.json -- embed_genesis_args: -t/home/ubuntu17/eos/libraries/egenesis/egenesis_brief.cpp.tmpl---/home/ubuntu17/eos/build/libraries/egenesis/egenesis_brief.cpp-t/home/ubuntu17/eos/libraries/egenesis/egenesis_full.cpp.tmpl---/home/ubuntu17/eos/build/libraries/egenesis/egenesis_full.cpp--genesis-json/home/ubuntu17/eos/genesis.json -- Using custom FindBoost.cmake -- Boost version: 1.64.0 -- Found the following Boost libraries: -- thread -- date_time -- filesystem -- system -- chrono -- program_options -- unit_test_framework -- locale -- Configuring AppBase on Linux CMake Error at libraries/appbase/CMakeLists.txt:59 (install): install TARGETS given no ARCHIVE DESTINATION for static library target "appbase". -- Using custom FindBoost.cmake -- Boost version: 1.64.0 -- Found the following Boost libraries: -- unit_test_framework mongo_db_plugin not selected and will be omitted. -- Found Git: /usr/bin/git (found version "2.14.1") -- Git commit revision: d75c30e1 -- Git commit revision: d75c30e1 -- Found Intl: /usr/include -- Git commit revision: d75c30e1 -- Found Doxygen: /usr/bin/doxygen (found version "1.8.13") found components: doxygen missing components: dot -- Configuring incomplete, errors occurred! See also "/home/ubuntu17/eos/build/CMakeFiles/CMakeOutput.log". make: *** 타겟이 지정되지 않았고 메이크파일이 없습니다. 멈춤. ubuntu17@ubuntu:~/eos$ |
| json metadata | {"tags":["kr"],"app":"steemit/0.1"} |
| parent author | modolee |
| parent permlink | eos-smart-contract-1-eos |
| permlink | re-modolee-eos-smart-contract-1-eos-20180316t041345931z |
| title | |
| Transaction Info | Block #20715589/Trx 8ba3a5116a2bf8b97c66935e712690559d0df53e |
View Raw JSON Data
{
"block": 20715589,
"op": [
"comment",
{
"author": "dongshik",
"body": "안녕하세요 EOS 빌드해서 스마트 컨트랙트를 돌려볼려고 합니다.\n좋은글 올려놓으셔서 우분투 virtualbox 만들고 빌드했는데 거의 마지막에서 에러가 발생하는군요..\n\n몇번을 해봤지만 동일한 에러라서 혹시 원인에 대한걸 찾아보고있지만 봐주실수있을지 해서 댓글올려드립니다.\n\n좋은자료 정말 감사합니다.\n\n[100%] Built target c-index-test\nInstall the project...\n-- Install configuration: \"Release\"\n\n생략\n\n-- Using custom FindBoost.cmake\n-- Boost version: 1.64.0\n-- Found the following Boost libraries:\n-- thread\n-- date_time\n-- filesystem\n-- system\n-- chrono\n-- unit_test_framework\n-- locale\n-- Configuring ChainBase on Linux\n-- egenesis: /home/ubuntu17/eos/genesis.json\n-- embed_genesis_args: -t/home/ubuntu17/eos/libraries/egenesis/egenesis_brief.cpp.tmpl---/home/ubuntu17/eos/build/libraries/egenesis/egenesis_brief.cpp-t/home/ubuntu17/eos/libraries/egenesis/egenesis_full.cpp.tmpl---/home/ubuntu17/eos/build/libraries/egenesis/egenesis_full.cpp--genesis-json/home/ubuntu17/eos/genesis.json\n-- Using custom FindBoost.cmake\n-- Boost version: 1.64.0\n-- Found the following Boost libraries:\n-- thread\n-- date_time\n-- filesystem\n-- system\n-- chrono\n-- program_options\n-- unit_test_framework\n-- locale\n-- Configuring AppBase on Linux\nCMake Error at libraries/appbase/CMakeLists.txt:59 (install):\n install TARGETS given no ARCHIVE DESTINATION for static library target\n \"appbase\".\n\n\n-- Using custom FindBoost.cmake\n-- Boost version: 1.64.0\n-- Found the following Boost libraries:\n-- unit_test_framework\nmongo_db_plugin not selected and will be omitted.\n-- Found Git: /usr/bin/git (found version \"2.14.1\") \n-- Git commit revision: d75c30e1\n-- Git commit revision: d75c30e1\n-- Found Intl: /usr/include \n-- Git commit revision: d75c30e1\n-- Found Doxygen: /usr/bin/doxygen (found version \"1.8.13\") found components: doxygen missing components: dot\n-- Configuring incomplete, errors occurred!\nSee also \"/home/ubuntu17/eos/build/CMakeFiles/CMakeOutput.log\".\nmake: *** 타겟이 지정되지 않았고 메이크파일이 없습니다. 멈춤.\nubuntu17@ubuntu:~/eos$",
"json_metadata": "{\"tags\":[\"kr\"],\"app\":\"steemit/0.1\"}",
"parent_author": "modolee",
"parent_permlink": "eos-smart-contract-1-eos",
"permlink": "re-modolee-eos-smart-contract-1-eos-20180316t041345931z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-03-16T04:13:48",
"trx_id": "8ba3a5116a2bf8b97c66935e712690559d0df53e",
"trx_in_block": 23,
"virtual_op": 0
}2018/03/14 03:09:45
2018/03/14 03:09:45
| id | follow |
| json | ["follow",{"follower":"dongshik","following":"modolee","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["dongshik"] |
| Transaction Info | Block #20656813/Trx f4bd5704bd31e601c2b21ad9f879181eda19cc23 |
View Raw JSON Data
{
"block": 20656813,
"op": [
"custom_json",
{
"id": "follow",
"json": "[\"follow\",{\"follower\":\"dongshik\",\"following\":\"modolee\",\"what\":[\"blog\"]}]",
"required_auths": [],
"required_posting_auths": [
"dongshik"
]
}
],
"op_in_trx": 0,
"timestamp": "2018-03-14T03:09:45",
"trx_id": "f4bd5704bd31e601c2b21ad9f879181eda19cc23",
"trx_in_block": 9,
"virtual_op": 0
}2018/03/13 02:06:21
2018/03/13 02:06:21
| id | follow |
| json | ["follow",{"follower":"dongshik","following":"nida-io","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["dongshik"] |
| Transaction Info | Block #20626761/Trx 46be7527c9f29ff46db187a45e5aac7199f0b4e4 |
View Raw JSON Data
{
"block": 20626761,
"op": [
"custom_json",
{
"id": "follow",
"json": "[\"follow\",{\"follower\":\"dongshik\",\"following\":\"nida-io\",\"what\":[\"blog\"]}]",
"required_auths": [],
"required_posting_auths": [
"dongshik"
]
}
],
"op_in_trx": 0,
"timestamp": "2018-03-13T02:06:21",
"trx_id": "46be7527c9f29ff46db187a45e5aac7199f0b4e4",
"trx_in_block": 1,
"virtual_op": 0
}2018/03/13 02:06:03
2018/03/13 02:06:03
| id | follow |
| json | ["follow",{"follower":"dongshik","following":"dimens","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["dongshik"] |
| Transaction Info | Block #20626755/Trx 6e3e2d2e0444ad7db89435e7d6ee66a8d12a4107 |
View Raw JSON Data
{
"block": 20626755,
"op": [
"custom_json",
{
"id": "follow",
"json": "[\"follow\",{\"follower\":\"dongshik\",\"following\":\"dimens\",\"what\":[\"blog\"]}]",
"required_auths": [],
"required_posting_auths": [
"dongshik"
]
}
],
"op_in_trx": 0,
"timestamp": "2018-03-13T02:06:03",
"trx_id": "6e3e2d2e0444ad7db89435e7d6ee66a8d12a4107",
"trx_in_block": 24,
"virtual_op": 0
}2018/02/01 01:22:27
2018/02/01 01:22:27
| active | {"account_auths":[],"key_auths":[["STM5FS5ca329Nf4YxPijrcB2nPAQM1SsB1ERPvWB8mnJRPbsYkQSm",1]],"weight_threshold":1} |
| creator | steem |
| delegation | 29700.000000 VESTS |
| extensions | [] |
| fee | 0.500 STEEM |
| json metadata | |
| memo key | STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N |
| new account name | dongshik |
| owner | {"account_auths":[],"key_auths":[["STM8MFy85L34ezoakpGz5Fek2VW31pLeSDNg3ZME51YcSnkfbeMDJ",1]],"weight_threshold":1} |
| posting | {"account_auths":[],"key_auths":[["STM6rmAfEbe7BUu96DQKmvBnWZq32QaCmnCoVNgeyCFoPvfArTBkw",1]],"weight_threshold":1} |
| Transaction Info | Block #19475233/Trx 275aab9008f3f4de57ced9aed88b912323944f9f |
View Raw JSON Data
{
"block": 19475233,
"op": [
"account_create_with_delegation",
{
"active": {
"account_auths": [],
"key_auths": [
[
"STM5FS5ca329Nf4YxPijrcB2nPAQM1SsB1ERPvWB8mnJRPbsYkQSm",
1
]
],
"weight_threshold": 1
},
"creator": "steem",
"delegation": "29700.000000 VESTS",
"extensions": [],
"fee": "0.500 STEEM",
"json_metadata": "",
"memo_key": "STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N",
"new_account_name": "dongshik",
"owner": {
"account_auths": [],
"key_auths": [
[
"STM8MFy85L34ezoakpGz5Fek2VW31pLeSDNg3ZME51YcSnkfbeMDJ",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [],
"key_auths": [
[
"STM6rmAfEbe7BUu96DQKmvBnWZq32QaCmnCoVNgeyCFoPvfArTBkw",
1
]
],
"weight_threshold": 1
}
}
],
"op_in_trx": 0,
"timestamp": "2018-02-01T01:22:27",
"trx_id": "275aab9008f3f4de57ced9aed88b912323944f9f",
"trx_in_block": 50,
"virtual_op": 0
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress0.00%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779061056
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779061056
},
"rc_account": {
"account": "dongshik",
"max_rc": "10164408779",
"max_rc_creation_adjustment": {
"amount": "2020748973",
"nai": "@@000000037",
"precision": 6
},
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779061056
}
}
}Account Metadata
| POSTING JSON METADATA | |
| profile | {"name":"망각","about":"여전히 개발하고 공부하는게 재미있습니다.!!!","location":"서울"} |
| JSON METADATA | |
| profile | {"name":"망각","about":"여전히 개발하고 공부하는게 재미있습니다.!!!","location":"서울"} |
{
"posting_json_metadata": {
"profile": {
"name": "망각",
"about": "여전히 개발하고 공부하는게 재미있습니다.!!!",
"location": "서울"
}
},
"json_metadata": {
"profile": {
"name": "망각",
"about": "여전히 개발하고 공부하는게 재미있습니다.!!!",
"location": "서울"
}
}
}Auth Keys
Owner
Single Signature
Public Keys
STM8MFy85L34ezoakpGz5Fek2VW31pLeSDNg3ZME51YcSnkfbeMDJ1/1
Active
Single Signature
Public Keys
STM5FS5ca329Nf4YxPijrcB2nPAQM1SsB1ERPvWB8mnJRPbsYkQSm1/1
Posting
Single Signature
Public Keys
STM6rmAfEbe7BUu96DQKmvBnWZq32QaCmnCoVNgeyCFoPvfArTBkw1/1
Memo
STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N
{
"owner": {
"account_auths": [],
"key_auths": [
[
"STM8MFy85L34ezoakpGz5Fek2VW31pLeSDNg3ZME51YcSnkfbeMDJ",
1
]
],
"weight_threshold": 1
},
"active": {
"account_auths": [],
"key_auths": [
[
"STM5FS5ca329Nf4YxPijrcB2nPAQM1SsB1ERPvWB8mnJRPbsYkQSm",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [],
"key_auths": [
[
"STM6rmAfEbe7BUu96DQKmvBnWZq32QaCmnCoVNgeyCFoPvfArTBkw",
1
]
],
"weight_threshold": 1
},
"memo": "STM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N"
}Witness Votes
0 / 30
No active witness votes.
[]