Ecoer Logo

@dongshik

25

여전히 개발하고 공부하는게 재미있습니다.!!!

steemit.com/@dongshik
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 Deleg
+4.378SP

Detailed Balance

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

namedongshik
id704837
rank605,010
reputation9385347
created2018-02-01T01:22:27
recovery_accountsteem
proxyNone
post_count2
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-04-25T10:49:30
last_root_post2018-04-25T10:49:30
last_vote_time1970-01-01T00:00:00
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares1023.007213 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7120.652593 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2018-04-26T14:22:39
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-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

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.378 SP to @dongshik
2026/05/17 23:37:36
delegateedongshik
delegatorsteem
vesting shares7120.652593 VESTS
Transaction InfoBlock #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
}
steemdelegated 2.710 SP to @dongshik
2026/05/12 01:19:18
delegateedongshik
delegatorsteem
vesting shares4408.442188 VESTS
Transaction InfoBlock #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
}
steemdelegated 4.386 SP to @dongshik
2026/04/25 22:59:36
delegateedongshik
delegatorsteem
vesting shares7133.168349 VESTS
Transaction InfoBlock #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
}
steemdelegated 2.736 SP to @dongshik
2026/01/23 06:07:21
delegateedongshik
delegatorsteem
vesting shares4449.989007 VESTS
Transaction InfoBlock #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
}
steemdelegated 2.837 SP to @dongshik
2024/12/17 01:27:12
delegateedongshik
delegatorsteem
vesting shares4614.208204 VESTS
Transaction InfoBlock #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
}
steemdelegated 2.941 SP to @dongshik
2023/11/13 17:10:09
delegateedongshik
delegatorsteem
vesting shares4783.341736 VESTS
Transaction InfoBlock #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
}
steemdelegated 4.747 SP to @dongshik
2023/09/21 21:05:36
delegateedongshik
delegatorsteem
vesting shares7720.620522 VESTS
Transaction InfoBlock #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
}
steemdelegated 4.883 SP to @dongshik
2022/11/03 10:59:03
delegateedongshik
delegatorsteem
vesting shares7942.301960 VESTS
Transaction InfoBlock #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
}
steemdelegated 5.019 SP to @dongshik
2022/01/17 10:18:21
delegateedongshik
delegatorsteem
vesting shares8162.835191 VESTS
Transaction InfoBlock #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
}
2021/08/04 02:00:57
authordongshik
permlinkethereum-pet-shop-and-truffle
voterseup
weight10000 (100.00%)
Transaction InfoBlock #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
}
steemdelegated 5.132 SP to @dongshik
2021/06/14 00:15:09
delegateedongshik
delegatorsteem
vesting shares8346.603849 VESTS
Transaction InfoBlock #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
}
steemdelegated 5.247 SP to @dongshik
2020/12/11 10:35:06
delegateedongshik
delegatorsteem
vesting shares8534.025823 VESTS
Transaction InfoBlock #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
}
steemdelegated 1.176 SP to @dongshik
2020/12/06 04:12:27
delegateedongshik
delegatorsteem
vesting shares1912.543513 VESTS
Transaction InfoBlock #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
}
steemdelegated 5.251 SP to @dongshik
2020/12/05 14:13:24
delegateedongshik
delegatorsteem
vesting shares8540.233677 VESTS
Transaction InfoBlock #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
}
steemdelegated 1.180 SP to @dongshik
2020/11/02 14:26:24
delegateedongshik
delegatorsteem
vesting shares1920.017158 VESTS
Transaction InfoBlock #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
}
steemdelegated 5.375 SP to @dongshik
2020/05/09 05:08:57
delegateedongshik
delegatorsteem
vesting shares8743.039036 VESTS
Transaction InfoBlock #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
}
steemdelegated 1.201 SP to @dongshik
2020/05/08 08:39:48
delegateedongshik
delegatorsteem
vesting shares1953.311140 VESTS
Transaction InfoBlock #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
authorsteemitboard
bodyCongratulations @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 authordongshik
parent permlinkethereum-pet-shop-and-truffle
permlinksteemitboard-notify-dongshik-20200201t014738000z
title
Transaction InfoBlock #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
}
steemdelegated 5.479 SP to @dongshik
2019/07/19 17:21:51
delegateedongshik
delegatorsteem
vesting shares8911.896862 VESTS
Transaction InfoBlock #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
}
2019/06/18 11:02:24
authordongshik
permlinkethereum-pet-shop-and-truffle
voterblueflag
weight-10000 (-100.00%)
Transaction InfoBlock #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
}
2019/04/17 04:19:48
authordongshik
permlinkethereum-pet-shop-and-truffle
voterbetterthanbefore
weight10000 (100.00%)
Transaction InfoBlock #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
}
2019/03/23 12:19:06
authordongshik
permlinkethereum-pet-shop-and-truffle
votermilkdice
weight10000 (100.00%)
Transaction InfoBlock #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
authorsteemitboard
bodyCongratulations @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 authordongshik
parent permlinkethereum-pet-shop-and-truffle
permlinksteemitboard-notify-dongshik-20190201t021147000z
title
Transaction InfoBlock #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
}
2018/12/28 02:02:27
authordongshik
permlinkethereum-pet-shop-and-truffle
voterhapsody
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/09/04 07:46:36
authordongshik
permlinkethereum-pet-shop-and-truffle
votervitkoo
weight10000 (100.00%)
Transaction InfoBlock #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
}
steemdelegated 5.601 SP to @dongshik
2018/08/01 03:25:12
delegateedongshik
delegatorsteem
vesting shares9110.612324 VESTS
Transaction InfoBlock #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
}
2018/05/24 08:41:03
authordongshik
permlinkethereum-pet-shop-and-truffle
voterminebuu
weight10000 (100.00%)
Transaction InfoBlock #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
}
steemdelegated 18.135 SP to @dongshik
2018/05/18 19:13:42
delegateedongshik
delegatorsteem
vesting shares29496.512712 VESTS
Transaction InfoBlock #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
}
2018/05/02 03:08:51
authordongshik
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 튜토리얼 아키텍처 ![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg) 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을 설치합니다. ![](https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png) <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 설치 확인 ![](https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png) Ganache 설치 스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인 http://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다. ![](https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png) 설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요) ![](https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png) ## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 Truffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다. ![](https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png) Pet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다. ![](https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png) 생성된 기본 Truffle 디렉토리 구조 및 파일 설명 contracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. Migrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. test / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다. truffle.js : Truffle 설정 파일 ![](https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png) ## 3. Smart Contract 작성하기 백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다. 첫 번째로, contracts > Adoption.sol 파일 추가 합니다. ![](https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png) 심볼 (^)은 필요한 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이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다 ![](https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png) 컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다. ![](https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png) ### 마이그레이션(migration) 성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다. 마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다. migrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다. ![](https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png) 이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용) ![](https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png) 이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다 1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성 2. 2_deploy_contracts.js에 아래 내용 입력 ![](https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png) 3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다. (응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.) ![](https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png) truffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다. ![](https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png) 4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다 ![](https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png) 순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.) 5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다. ![](https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png) 아래는 추가된 블록의 정보 ![](https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png) 트렌젝션의 처리 정보 ![](https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png) 이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with) ## 5. Smart Contract 테스트 Truffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다. 1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다. 2. TestAdoption.sol 파일에 아래의 내용을 추가합니다. ![](https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png) 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)를 추가합니다 ![](https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png) - 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다. - 그런 다음 예상 값인 8을 역시 선언합니다. - 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다. #### 입양한 Pet의 소유자 검색 테스트 앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다. 1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다. ![](https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png) TestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다. #### 모든 Pet의 소유자 검색 테스트 배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다. 1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. ![](https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png)<br> adopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신  메모리에 값을 일시적으로 저장하도록 알립니다.  <br> adopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. 전체 테스트 코드입니다. ![](https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png) #### 테스트 실행하기 이제 터미널로 돌아가서 test를 실행합니다. "truffle test"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다. ![](https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png) ## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다. 이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다. 이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. ![](https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png) #### web3 인스턴스 1.텍스트 편집기로 /src/js/app.js 파일을 엽니다. 2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다. 실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다. ![](https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png) init 함수 ![](https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png) Web3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다. initWeb3 함수 ![](https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png) - 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) - 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다. - 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다. #### 컨트랙트 인스턴스 1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다. ![](https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png) - 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다. - 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다. - 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다. - 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다.  #### 입양된 Pet정보를 얻고 UI를 업데이트 1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다. ![](https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png) - 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다. - 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다. - call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다. - getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다. - 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 "Success"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다. - 모든 오류는 콘솔에 기록(logging)됩니다. #### Adopt() 함수 다루기 1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다. ![](https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png) - web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다. - 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 "보낸 사람"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다. - 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다. ## 7. 브라우저에서 dapp과 상호 작용 이제 Dapp을 사용할 준비가 되었습니다. #### MetaMask 설치 및 설정 브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br> 1.브라우저에 MetaMask를 설치합니다. 2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다. ![](https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png) 3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다. 4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다. ![](https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png) 5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다. ![](https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png) 6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다. ![](https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png) ![](https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png) 아래에 비밀번호를 입력하고 OK를 클릭합니다. ![](https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png) 7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. "Main Network"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오. ![](https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png) 8."New RPC URL"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다. ![](https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png) <br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다. 9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다. Truffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. 첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. ![](https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png) 설정이 이제 완료 되었습니다. #### lite-server 설치 및 설정 이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다. 1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  ![](https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png) lite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. 웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다. 프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다. ![](https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png) ![](https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png) #### App 사용하기 1.로컬 웹 서버를 시작합니다. ![](https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png) ![](https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png) dev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다. ![](https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png) 2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다. 주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어 web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다. 아래글은 Metamask QnA에 올라온 글입니다. ![](https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png) 3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다. ![](https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png) 4.채택 된 애완 동물의 변화 옆에있는 버튼이 "Success"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다. ![](https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png) 그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 : ![](https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png) #### Ganashe 트랜젝션 확인 ![](https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png) ![](https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png) 지금까지 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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[Ethereum] 이더리움 트러플 튜토리얼 (Pet-shop)
Transaction InfoBlock #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![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg)\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![](https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png)\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![](https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png)\n\nGanache 설치\n스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인\nhttp://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.\n![](https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png)\n\n설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)\n![](https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png)\n\n## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\nTruffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.\n![](https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png)\n\nPet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.\n![](https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png)\n\n생성된 기본 Truffle 디렉토리 구조 및 파일 설명\ncontracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. \n\nMigrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. \n\ntest / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다.\n\ntruffle.js : Truffle 설정 파일\n\n![](https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png)\n\n## 3. Smart Contract 작성하기\n백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다.\n첫 번째로, contracts > Adoption.sol 파일 추가 합니다.\n![](https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png)\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![](https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png)\n\n컴파일이 완료되면  .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.\n![](https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png)\n\n### 마이그레이션(migration)\n성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다.\n마이그레인션(Migration)은  응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다.  첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다.\n\nmigrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.\n![](https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png)\n\n이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)\n![](https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png)\n\n이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다\n\n1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성\n2. 2_deploy_contracts.js에 아래 내용 입력\n![](https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png)\n\n3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다.\n(응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)\n![](https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png)\ntruffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에  development 를 추가하면 로컬 Ganache에 연결됩니다.\n![](https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png)\n\n4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다\n![](https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png)\n순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.)\n\n5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.\n![](https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png)\n아래는 추가된 블록의 정보\n![](https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png)\n트렌젝션의 처리 정보\n![](https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png)\n이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with)\n\n\n## 5. Smart Contract 테스트\nTruffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다.\n\n1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다.\n2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.\n![](https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png)\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![](https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png)\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![](https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png)\nTestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다.\n\n####  모든 Pet의 소유자 검색 테스트\n배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다.\n1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. \n![](https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png)<br>\nadopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신  메모리에 값을 일시적으로 저장하도록 알립니다.  <br>\nadopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. \n\n전체 테스트 코드입니다.\n![](https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png)\n\n####  테스트 실행하기\n이제 터미널로 돌아가서 test를 실행합니다.\n\"truffle test\"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.\n![](https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png)\n\n\n## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다.\n이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다.\n\n이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. \n![](https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png)\n\n####  web3 인스턴스 \n1.텍스트 편집기로 /src/js/app.js 파일을 엽니다.\n\n2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다.\n실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.\n![](https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png)\ninit 함수\n![](https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png)\nWeb3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다.\ninitWeb3 함수\n![](https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png)\n- 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) \n- 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다.\n- 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다.\n\n####  컨트랙트 인스턴스 \n1. /src/js/app.js  파일에서. initContract  안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.\n![](https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png)\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![](https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png)\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![](https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png)\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![](https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png)\n3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다.\n4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.\n![](https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png)\n5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.\n![](https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png)\n6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.\n![](https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png)\n![](https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png)\n아래에 비밀번호를 입력하고 OK를 클릭합니다.\n![](https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png)\n7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. \"Main Network\"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.\n![](https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png)\n8.\"New RPC URL\"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.\n![](https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png)\n<br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다.\n9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다.\nTruffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. \n첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. \n![](https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png)\n설정이 이제 완료 되었습니다.\n\n####  lite-server 설치 및 설정\n이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다.\n\n1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  \n![](https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png)\nlite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. \n웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다.\n\n프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.\n![](https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png)\n\n![](https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png)\n\n####  App 사용하기\n1.로컬 웹 서버를 시작합니다.\n![](https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png)\n![](https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png)\n\ndev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.\n![](https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png)\n\n2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다.\n\n주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어  web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다.\n아래글은 Metamask QnA에 올라온 글입니다.\n![](https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png)\n\n3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.\n![](https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png)\n4.채택 된 애완 동물의 변화 옆에있는 버튼이 \"Success\"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.\n![](https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png)\n그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :\n![](https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png)\n\n\n\n####  Ganashe 트랜젝션 확인\n![](https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png)\n![](https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png)\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
}
2018/05/02 03:07:39
authordongshik
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 튜토리얼 아키텍처 ![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg) 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을 설치합니다. ![](https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png) <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 설치 확인 ![](https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png) Ganache 설치 스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인 http://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다. ![](https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png) 설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요) ![](https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png) ## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 Truffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다. ![](https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png) Pet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다. ![](https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png) 생성된 기본 Truffle 디렉토리 구조 및 파일 설명 contracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. Migrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. test / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다. truffle.js : Truffle 설정 파일 ![](https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png) ## 3. Smart Contract 작성하기 백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다. 첫 번째로, contracts > Adoption.sol 파일 추가 합니다. ![](https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png) 심볼 (^)은 필요한 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이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다 ![](https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png) 컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다. ![](https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png) ### 마이그레이션(migration) 성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다. 마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다. migrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다. ![](https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png) 이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용) ![](https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png) 이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다 1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성 2. 2_deploy_contracts.js에 아래 내용 입력 ![](https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png) 3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다. (응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.) ![](https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png) truffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다. ![](https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png) 4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다 ![](https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png) 순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.) 5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다. ![](https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png) 아래는 추가된 블록의 정보 ![](https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png) 트렌젝션의 처리 정보 ![](https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png) 이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with) ## 5. Smart Contract 테스트 Truffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다. 1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다. 2. TestAdoption.sol 파일에 아래의 내용을 추가합니다. ![](https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png) 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)를 추가합니다 ![](https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png) - 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다. - 그런 다음 예상 값인 8을 역시 선언합니다. - 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다. #### 입양한 Pet의 소유자 검색 테스트 앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다. 1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다. ![](https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png) TestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다. #### 모든 Pet의 소유자 검색 테스트 배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다. 1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. ![](https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png)<br> adopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신  메모리에 값을 일시적으로 저장하도록 알립니다.  <br> adopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. 전체 테스트 코드입니다. ![](https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png) #### 테스트 실행하기 이제 터미널로 돌아가서 test를 실행합니다. "truffle test"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다. ![](https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png) ## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다. 이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다. 이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. ![](https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png) #### web3 인스턴스 1.텍스트 편집기로 /src/js/app.js 파일을 엽니다. 2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다. 실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다. ![](https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png) init 함수 ![](https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png) Web3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다. initWeb3 함수 ![](https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png) - 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) - 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다. - 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다. #### 컨트랙트 인스턴스 1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다. ![](https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png) - 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다. - 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다. - 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다. - 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다.  #### 입양된 Pet정보를 얻고 UI를 업데이트 1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다. ![](https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png) - 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다. - 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다. - call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다. - getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다. - 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 "Success"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다. - 모든 오류는 콘솔에 기록(logging)됩니다. #### Adopt() 함수 다루기 1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다. ![](https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png) - web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다. - 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 "보낸 사람"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다. - 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다. ## 7. 브라우저에서 dapp과 상호 작용 이제 Dapp을 사용할 준비가 되었습니다. #### MetaMask 설치 및 설정 브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br> 1.브라우저에 MetaMask를 설치합니다. 2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다. ![](https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png) 3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다. 4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다. ![](https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png) 5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다. ![](https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png) 6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다. ![](https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png) ![](https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png) 아래에 비밀번호를 입력하고 OK를 클릭합니다. ![](https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png) 7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. "Main Network"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오. ![](https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png) 8."New RPC URL"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다. ![](https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png) <br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다. 9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다. Truffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. 첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. ![](https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png) 설정이 이제 완료 되었습니다. #### lite-server 설치 및 설정 이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다. 1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  ![](https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png) lite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. 웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다. 프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다. ![](https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png) ![](https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png) #### App 사용하기 1.로컬 웹 서버를 시작합니다. ![](https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png) ![](https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png) dev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다. ![](https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png) 2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다. 주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어 web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다. 아래글은 Metamask QnA에 올라온 글입니다. ![](https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png) 3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다. ![](https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png) 4.채택 된 애완 동물의 변화 옆에있는 버튼이 "Success"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다. ![](https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png) 그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 : ![](https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png) #### Ganashe 트랜젝션 확인 ![](https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png) ![](https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png) 지금까지 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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[Ethereum] 이더리움 Pet-shop 트러플 튜토리얼
Transaction InfoBlock #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![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg)\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![](https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png)\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![](https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png)\n\nGanache 설치\n스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인\nhttp://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.\n![](https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png)\n\n설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)\n![](https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png)\n\n## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\nTruffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.\n![](https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png)\n\nPet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.\n![](https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png)\n\n생성된 기본 Truffle 디렉토리 구조 및 파일 설명\ncontracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. \n\nMigrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. \n\ntest / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다.\n\ntruffle.js : Truffle 설정 파일\n\n![](https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png)\n\n## 3. Smart Contract 작성하기\n백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다.\n첫 번째로, contracts > Adoption.sol 파일 추가 합니다.\n![](https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png)\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![](https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png)\n\n컴파일이 완료되면  .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.\n![](https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png)\n\n### 마이그레이션(migration)\n성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다.\n마이그레인션(Migration)은  응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다.  첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다.\n\nmigrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.\n![](https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png)\n\n이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)\n![](https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png)\n\n이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다\n\n1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성\n2. 2_deploy_contracts.js에 아래 내용 입력\n![](https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png)\n\n3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다.\n(응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)\n![](https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png)\ntruffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에  development 를 추가하면 로컬 Ganache에 연결됩니다.\n![](https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png)\n\n4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다\n![](https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png)\n순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.)\n\n5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.\n![](https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png)\n아래는 추가된 블록의 정보\n![](https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png)\n트렌젝션의 처리 정보\n![](https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png)\n이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with)\n\n\n## 5. Smart Contract 테스트\nTruffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다.\n\n1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다.\n2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.\n![](https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png)\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![](https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png)\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![](https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png)\nTestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다.\n\n####  모든 Pet의 소유자 검색 테스트\n배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다.\n1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. \n![](https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png)<br>\nadopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신  메모리에 값을 일시적으로 저장하도록 알립니다.  <br>\nadopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. \n\n전체 테스트 코드입니다.\n![](https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png)\n\n####  테스트 실행하기\n이제 터미널로 돌아가서 test를 실행합니다.\n\"truffle test\"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.\n![](https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png)\n\n\n## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다.\n이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다.\n\n이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. \n![](https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png)\n\n####  web3 인스턴스 \n1.텍스트 편집기로 /src/js/app.js 파일을 엽니다.\n\n2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다.\n실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.\n![](https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png)\ninit 함수\n![](https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png)\nWeb3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다.\ninitWeb3 함수\n![](https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png)\n- 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) \n- 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다.\n- 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다.\n\n####  컨트랙트 인스턴스 \n1. /src/js/app.js  파일에서. initContract  안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.\n![](https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png)\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![](https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png)\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![](https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png)\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![](https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png)\n3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다.\n4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.\n![](https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png)\n5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.\n![](https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png)\n6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.\n![](https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png)\n![](https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png)\n아래에 비밀번호를 입력하고 OK를 클릭합니다.\n![](https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png)\n7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. \"Main Network\"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.\n![](https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png)\n8.\"New RPC URL\"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.\n![](https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png)\n<br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다.\n9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다.\nTruffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. \n첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. \n![](https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png)\n설정이 이제 완료 되었습니다.\n\n####  lite-server 설치 및 설정\n이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다.\n\n1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  \n![](https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png)\nlite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. \n웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다.\n\n프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.\n![](https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png)\n\n![](https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png)\n\n####  App 사용하기\n1.로컬 웹 서버를 시작합니다.\n![](https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png)\n![](https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png)\n\ndev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.\n![](https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png)\n\n2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다.\n\n주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어  web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다.\n아래글은 Metamask QnA에 올라온 글입니다.\n![](https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png)\n\n3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.\n![](https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png)\n4.채택 된 애완 동물의 변화 옆에있는 버튼이 \"Success\"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.\n![](https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png)\n그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :\n![](https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png)\n\n\n\n####  Ganashe 트랜젝션 확인\n![](https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png)\n![](https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png)\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
}
2018/05/02 03:02:45
idfollow
json["follow",{"follower":"dongshik","following":"bboyghost","what":["ignore"]}]
required auths[]
required posting auths["dongshik"]
Transaction InfoBlock #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
}
2018/05/01 11:37:36
authordongshik
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 튜토리얼 아키텍처 ![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg) 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을 설치합니다. ![](https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png) <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 설치 확인 ![](https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png) Ganache 설치 스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인 http://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다. ![](https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png) 설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요) ![](https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png) ## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 Truffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다. ![](https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png) Pet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다. ![](https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png) 생성된 기본 Truffle 디렉토리 구조 및 파일 설명 contracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. Migrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. test / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다. truffle.js : Truffle 설정 파일 ![](https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png) ## 3. Smart Contract 작성하기 백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다. 첫 번째로, contracts > Adoption.sol 파일 추가 합니다. ![](https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png) 심볼 (^)은 필요한 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이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다 ![](https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png) 컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다. ![](https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png) ### 마이그레이션(migration) 성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다. 마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다. migrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다. ![](https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png) 이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용) ![](https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png) 이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다 1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성 2. 2_deploy_contracts.js에 아래 내용 입력 ![](https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png) 3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다. (응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.) ![](https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png) truffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다. ![](https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png) 4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다 ![](https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png) 순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.) 5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다. ![](https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png) 아래는 추가된 블록의 정보 ![](https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png) 트렌젝션의 처리 정보 ![](https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png) 이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with) ## 5. Smart Contract 테스트 Truffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다. 1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다. 2. TestAdoption.sol 파일에 아래의 내용을 추가합니다. ![](https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png) 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)를 추가합니다 ![](https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png) - 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다. - 그런 다음 예상 값인 8을 역시 선언합니다. - 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다. #### 입양한 Pet의 소유자 검색 테스트 앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다. 1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다. ![](https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png) TestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다. #### 모든 Pet의 소유자 검색 테스트 배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다. 1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. ![](https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png)<br> adopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신  메모리에 값을 일시적으로 저장하도록 알립니다.  <br> adopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. 전체 테스트 코드입니다. ![](https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png) #### 테스트 실행하기 이제 터미널로 돌아가서 test를 실행합니다. "truffle test"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다. ![](https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png) ## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다. 이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다. 이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. ![](https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png) #### web3 인스턴스 1.텍스트 편집기로 /src/js/app.js 파일을 엽니다. 2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다. 실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다. ![](https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png) init 함수 ![](https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png) Web3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다. initWeb3 함수 ![](https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png) - 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) - 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다. - 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다. #### 컨트랙트 인스턴스 1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다. ![](https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png) - 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다. - 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다. - 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다. - 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다.  #### 입양된 Pet정보를 얻고 UI를 업데이트 1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다. ![](https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png) - 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다. - 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다. - call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다. - getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다. - 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 "Success"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다. - 모든 오류는 콘솔에 기록(logging)됩니다. #### Adopt() 함수 다루기 1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다. ![](https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png) - web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다. - 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 "보낸 사람"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다. - 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다. ## 7. 브라우저에서 dapp과 상호 작용 이제 Dapp을 사용할 준비가 되었습니다. #### MetaMask 설치 및 설정 브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br> 1.브라우저에 MetaMask를 설치합니다. 2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다. ![](https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png) 3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다. 4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다. ![](https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png) 5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다. ![](https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png) 6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다. ![](https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png) ![](https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png) 아래에 비밀번호를 입력하고 OK를 클릭합니다. ![](https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png) 7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. "Main Network"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오. ![](https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png) 8."New RPC URL"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다. ![](https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png) <br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다. 9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다. Truffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. 첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. ![](https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png) 설정이 이제 완료 되었습니다. #### lite-server 설치 및 설정 이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다. 1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  ![](https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png) lite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. 웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다. 프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다. ![](https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png) ![](https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png) #### App 사용하기 1.로컬 웹 서버를 시작합니다. ![](https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png) ![](https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png) dev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다. ![](https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png) 2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다. 주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어 web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다. 아래글은 Metamask QnA에 올라온 글입니다. ![](https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png) 3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다. ![](https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png) 4.채택 된 애완 동물의 변화 옆에있는 버튼이 "Success"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다. ![](https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png) 그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 : ![](https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png) #### Ganashe 트랜젝션 확인 ![](https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png) ![](https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png) 지금까지 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 permlinketherum
permlinkethereum-pet-shop-and-truffle
titleEthereum Pet shop & truffle 샘플
Transaction InfoBlock #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![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg)\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![](https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png)\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![](https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png)\n\nGanache 설치\n스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인\nhttp://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.\n![](https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png)\n\n설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)\n![](https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png)\n\n## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\nTruffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.\n![](https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png)\n\nPet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.\n![](https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png)\n\n생성된 기본 Truffle 디렉토리 구조 및 파일 설명\ncontracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. \n\nMigrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. \n\ntest / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다.\n\ntruffle.js : Truffle 설정 파일\n\n![](https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png)\n\n## 3. Smart Contract 작성하기\n백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다.\n첫 번째로, contracts > Adoption.sol 파일 추가 합니다.\n![](https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png)\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![](https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png)\n\n컴파일이 완료되면  .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.\n![](https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png)\n\n### 마이그레이션(migration)\n성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다.\n마이그레인션(Migration)은  응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다.  첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다.\n\nmigrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.\n![](https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png)\n\n이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)\n![](https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png)\n\n이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다\n\n1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성\n2. 2_deploy_contracts.js에 아래 내용 입력\n![](https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png)\n\n3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다.\n(응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)\n![](https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png)\ntruffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에  development 를 추가하면 로컬 Ganache에 연결됩니다.\n![](https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png)\n\n4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다\n![](https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png)\n순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.)\n\n5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.\n![](https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png)\n아래는 추가된 블록의 정보\n![](https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png)\n트렌젝션의 처리 정보\n![](https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png)\n이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with)\n\n\n## 5. Smart Contract 테스트\nTruffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다.\n\n1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다.\n2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.\n![](https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png)\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![](https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png)\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![](https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png)\nTestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다.\n\n####  모든 Pet의 소유자 검색 테스트\n배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다.\n1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. \n![](https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png)<br>\nadopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신  메모리에 값을 일시적으로 저장하도록 알립니다.  <br>\nadopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. \n\n전체 테스트 코드입니다.\n![](https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png)\n\n####  테스트 실행하기\n이제 터미널로 돌아가서 test를 실행합니다.\n\"truffle test\"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.\n![](https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png)\n\n\n## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다.\n이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다.\n\n이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. \n![](https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png)\n\n####  web3 인스턴스 \n1.텍스트 편집기로 /src/js/app.js 파일을 엽니다.\n\n2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다.\n실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.\n![](https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png)\ninit 함수\n![](https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png)\nWeb3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다.\ninitWeb3 함수\n![](https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png)\n- 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) \n- 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다.\n- 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다.\n\n####  컨트랙트 인스턴스 \n1. /src/js/app.js  파일에서. initContract  안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.\n![](https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png)\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![](https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png)\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![](https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png)\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![](https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png)\n3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다.\n4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.\n![](https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png)\n5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.\n![](https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png)\n6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.\n![](https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png)\n![](https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png)\n아래에 비밀번호를 입력하고 OK를 클릭합니다.\n![](https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png)\n7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. \"Main Network\"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.\n![](https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png)\n8.\"New RPC URL\"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.\n![](https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png)\n<br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다.\n9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다.\nTruffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. \n첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. \n![](https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png)\n설정이 이제 완료 되었습니다.\n\n####  lite-server 설치 및 설정\n이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다.\n\n1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  \n![](https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png)\nlite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. \n웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다.\n\n프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.\n![](https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png)\n\n![](https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png)\n\n####  App 사용하기\n1.로컬 웹 서버를 시작합니다.\n![](https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png)\n![](https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png)\n\ndev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.\n![](https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png)\n\n2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다.\n\n주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어  web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다.\n아래글은 Metamask QnA에 올라온 글입니다.\n![](https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png)\n\n3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.\n![](https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png)\n4.채택 된 애완 동물의 변화 옆에있는 버튼이 \"Success\"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.\n![](https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png)\n그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :\n![](https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png)\n\n\n\n####  Ganashe 트랜젝션 확인\n![](https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png)\n![](https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png)\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
idfollow
json["follow",{"follower":"dongshik","following":"arcange","what":["ignore"]}]
required auths[]
required posting auths["dongshik"]
Transaction InfoBlock #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
}
2018/04/30 04:55:36
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
titleEthereum Pet shop & truffle 샘플
Transaction InfoBlock #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
}
2018/04/30 04:49:42
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
titleEthereum Pet shop & truffle 샘플
Transaction InfoBlock #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
authorarcange
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 authordongshik
parent permlinkethereum-pet-shop-and-truffle
permlinkre-ethereum-pet-shop-and-truffle-20180430t063450000z
title
Transaction InfoBlock #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
}
2018/04/29 21:40:03
authordongshik
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 튜토리얼 아키텍처 ![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg) 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을 설치합니다. ![](https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png) Truffle 설치 확인 ![](https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png) Ganache 설치 스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인 http://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다. ![](https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png) 설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요) ![](https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png) ## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 Truffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다. ![](https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png) Pet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다. ![](https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png) 생성된 기본 Truffle 디렉토리 구조 및 파일 설명 contracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. Migrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. test / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다. truffle.js : Truffle 설정 파일 ![](https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png) ## 3. Smart Contract 작성하기 백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다. 첫 번째로, contracts > Adoption.sol 파일 추가 합니다. ![](https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png) 심볼 (^)은 필요한 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이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다 ![](https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png) 컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다. ![](https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png) ### 마이그레이션(migration) 성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다. 마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다. migrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다. ![](https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png) 이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용) ![](https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png) 이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다 1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성 2. 2_deploy_contracts.js에 아래 내용 입력 ![](https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png) 3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다. (응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.) ![](https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png) truffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다. ![](https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png) 4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다 ![](https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png) 순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.) 5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다. ![](https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png) 아래는 추가된 블록의 정보 ![](https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png) 트렌젝션의 처리 정보 ![](https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png) 이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with) ## 5. Smart Contract 테스트 Truffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다. 1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다. 2. TestAdoption.sol 파일에 아래의 내용을 추가합니다. ![](https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png) 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)를 추가합니다 ![](https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png) - 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다. - 그런 다음 예상 값인 8을 역시 선언합니다. - 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다. #### 입양한 Pet의 소유자 검색 테스트 앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다. 1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다. ![](https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png) TestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다. #### 모든 Pet의 소유자 검색 테스트 배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다. 1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. ![](https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png)<br> adopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신  메모리에 값을 일시적으로 저장하도록 알립니다.  <br> adopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. 전체 테스트 코드입니다. ![](https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png) #### 테스트 실행하기 이제 터미널로 돌아가서 test를 실행합니다. "truffle test"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다. ![](https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png) ## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다. 이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다. 이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. ![](https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png) #### web3 인스턴스 1.텍스트 편집기로 /src/js/app.js 파일을 엽니다. 2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다. 실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다. ![](https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png) init 함수 ![](https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png) Web3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다. initWeb3 함수 ![](https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png) - 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) - 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다. - 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다. #### 컨트랙트 인스턴스 1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다. ![](https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png) - 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다. - 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다. - 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다. - 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다.  #### 입양된 Pet정보를 얻고 UI를 업데이트 1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다. ![](https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png) - 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다. - 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다. - call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다. - getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다. - 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 "Success"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다. - 모든 오류는 콘솔에 기록(logging)됩니다. #### Adopt() 함수 다루기 1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다. ![](https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png) - web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다. - 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 "보낸 사람"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다. - 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다. ## 7. 브라우저에서 dapp과 상호 작용 이제 Dapp을 사용할 준비가 되었습니다. #### MetaMask 설치 및 설정 브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br> 1.브라우저에 MetaMask를 설치합니다. 2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다. ![](https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png) 3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다. 4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다. ![](https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png) 5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다. ![](https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png) 6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다. ![](https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png) ![](https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png) 아래에 비밀번호를 입력하고 OK를 클릭합니다. ![](https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png) 7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. "Main Network"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오. ![](https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png) 8."New RPC URL"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다. ![](https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png) <br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다. 9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다. Truffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. 첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. ![](https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png) 설정이 이제 완료 되었습니다. #### lite-server 설치 및 설정 이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다. 1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  ![](https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png) lite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. 웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다. 프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다. ![](https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png) ![](https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png) #### App 사용하기 1.로컬 웹 서버를 시작합니다. ![](https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png) ![](https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png) dev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다. ![](https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png) 2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다. 주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어 web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다. 아래글은 Metamask QnA에 올라온 글입니다. ![](https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png) 3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다. ![](https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png) 4.채택 된 애완 동물의 변화 옆에있는 버튼이 "Success"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다. ![](https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png) 그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 : ![](https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png) #### Ganashe 트랜젝션 확인 ![](https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png) ![](https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png) 지금까지 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 permlinketherum
permlinkethereum-pet-shop-and-truffle
titleEthereum Pet shop & truffle 샘플
Transaction InfoBlock #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![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg)\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![](https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png)\n\nTruffle 설치 확인\n![](https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png)\n\nGanache 설치\n스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인\nhttp://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.\n![](https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png)\n\n설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)\n![](https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png)\n\n## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\nTruffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.\n![](https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png)\n\nPet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.\n![](https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png)\n\n생성된 기본 Truffle 디렉토리 구조 및 파일 설명\ncontracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. \n\nMigrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. \n\ntest / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다.\n\ntruffle.js : Truffle 설정 파일\n\n![](https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png)\n\n## 3. Smart Contract 작성하기\n백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다.\n첫 번째로, contracts > Adoption.sol 파일 추가 합니다.\n![](https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png)\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![](https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png)\n\n컴파일이 완료되면  .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.\n![](https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png)\n\n### 마이그레이션(migration)\n성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다.\n마이그레인션(Migration)은  응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다.  첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다.\n\nmigrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.\n![](https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png)\n\n이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)\n![](https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png)\n\n이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다\n\n1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성\n2. 2_deploy_contracts.js에 아래 내용 입력\n![](https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png)\n\n3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다.\n(응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)\n![](https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png)\ntruffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에  development 를 추가하면 로컬 Ganache에 연결됩니다.\n![](https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png)\n\n4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다\n![](https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png)\n순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.)\n\n5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.\n![](https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png)\n아래는 추가된 블록의 정보\n![](https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png)\n트렌젝션의 처리 정보\n![](https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png)\n이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with)\n\n\n## 5. Smart Contract 테스트\nTruffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다.\n\n1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다.\n2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.\n![](https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png)\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![](https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png)\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![](https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png)\nTestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다.\n\n####  모든 Pet의 소유자 검색 테스트\n배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다.\n1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. \n![](https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png)<br>\nadopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신  메모리에 값을 일시적으로 저장하도록 알립니다.  <br>\nadopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. \n\n전체 테스트 코드입니다.\n![](https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png)\n\n####  테스트 실행하기\n이제 터미널로 돌아가서 test를 실행합니다.\n\"truffle test\"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.\n![](https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png)\n\n\n## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다.\n이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다.\n\n이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. \n![](https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png)\n\n####  web3 인스턴스 \n1.텍스트 편집기로 /src/js/app.js 파일을 엽니다.\n\n2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다.\n실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.\n![](https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png)\ninit 함수\n![](https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png)\nWeb3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다.\ninitWeb3 함수\n![](https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png)\n- 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) \n- 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다.\n- 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다.\n\n####  컨트랙트 인스턴스 \n1. /src/js/app.js  파일에서. initContract  안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.\n![](https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png)\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![](https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png)\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![](https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png)\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![](https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png)\n3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다.\n4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.\n![](https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png)\n5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.\n![](https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png)\n6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.\n![](https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png)\n![](https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png)\n아래에 비밀번호를 입력하고 OK를 클릭합니다.\n![](https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png)\n7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. \"Main Network\"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.\n![](https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png)\n8.\"New RPC URL\"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.\n![](https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png)\n<br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다.\n9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다.\nTruffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. \n첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. \n![](https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png)\n설정이 이제 완료 되었습니다.\n\n####  lite-server 설치 및 설정\n이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다.\n\n1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  \n![](https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png)\nlite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. \n웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다.\n\n프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.\n![](https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png)\n\n![](https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png)\n\n####  App 사용하기\n1.로컬 웹 서버를 시작합니다.\n![](https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png)\n![](https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png)\n\ndev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.\n![](https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png)\n\n2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다.\n\n주) 크롬 브라우져에서 어떻게 다이렉트로 Metamask를 띄울수 있는지에 대한 질문에 대한 답입니다. Chrome 플러그인 Metamask는 브라우저에 전역 변수 web3을 삽입합니다. MetaMask가 설치되어  web3가 주입 된 브라우져 콘솔에서 web3을 타이핑하여 web3 객체를 볼 수 있습니다. MetaMask는 서버 측과 브라우저 인터페이스 간의 프록시입니다. 프로그램(Metamask)이 브라우저에로드 될 때만이 변수를 볼 수 있습니다.\n아래글은 Metamask QnA에 올라온 글입니다.\n![](https://steemitimages.com/DQmW9hkhTXZTgN81gHg9asYRCoixEnmNTg3hpJL9MNp5K82/image.png)\n\n3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.\n![](https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png)\n4.채택 된 애완 동물의 변화 옆에있는 버튼이 \"Success\"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.\n![](https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png)\n그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :\n![](https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png)\n\n\n\n####  Ganashe 트랜젝션 확인\n![](https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png)\n![](https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png)\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
}
2018/04/29 13:07:36
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet shop & truffle 샘플
Transaction InfoBlock #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
}
2018/04/29 13:03:03
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet shop & truffle 샘플
Transaction InfoBlock #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
}
2018/04/29 12:25:33
authordongshik
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 튜토리얼 아키텍처 ![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg) 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을 설치합니다. ![](https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png) Truffle 설치 확인 ![](https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png) Ganache 설치 스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인 http://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다. ![](https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png) 설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요) ![](https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png) ## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 Truffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다. ![](https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png) Pet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다. ![](https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png) 생성된 기본 Truffle 디렉토리 구조 및 파일 설명 contracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. Migrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. test / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다. truffle.js : Truffle 설정 파일 ![](https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png) ## 3. Smart Contract 작성하기 백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다. 첫 번째로, contracts > Adoption.sol 파일 추가 합니다. ![](https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png) 심볼 (^)은 필요한 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이 이해할수있는 무엇인가로 변환 번역 한다고 생각하면 됩니다 ![](https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png) 컴파일이 완료되면 .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다. ![](https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png) ### 마이그레이션(migration) 성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다. 마이그레인션(Migration)은 응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다. 첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다. migrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다. ![](https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png) 이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용) ![](https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png) 이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다 1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성 2. 2_deploy_contracts.js에 아래 내용 입력 ![](https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png) 3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다. (응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.) ![](https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png) truffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에 development 를 추가하면 로컬 Ganache에 연결됩니다. ![](https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png) 4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다 ![](https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png) 순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.) 5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다. ![](https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png) 아래는 추가된 블록의 정보 ![](https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png) 트렌젝션의 처리 정보 ![](https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png) 이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with) ## 5. Smart Contract 테스트 Truffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다. 1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다. 2. TestAdoption.sol 파일에 아래의 내용을 추가합니다. ![](https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png) 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)를 추가합니다 ![](https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png) - 입력값(ID) 8로 Adoption.sol 스마트 컨트랙트의 adopt() 함수를 호출합니다. - 그런 다음 예상 값인 8을 역시 선언합니다. - 마지막으로 Assert.equal()에 실제값(returnedId), 예상값(expected) 및 실패 메시지(테스트가 통과하지 못하면 콘솔에 출력됨)를 전달합니다. #### 입양한 Pet의 소유자 검색 테스트 앞서 언급한 public 변수가 자동 getter 메소드를 가진다는것을 기억한다면, 위의 입양 테스트에서 저장한 주소를 검색할 수 있습니다. 저장된 데이터는 테스트 기간 동안 지속되기 때문에 앞서 테스트한 Pet의 adopt(8)의 입양 정보는 다른 테스트를 통해 검색 가능 합니다. 1. TestAdoption.sol에 이전에 추가한 함수(testUserCanAdoptPet)아래에 해당 함수(testGetAdopterAddressByPetId)를 추가합니다. ![](https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png) TestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다. #### 모든 Pet의 소유자 검색 테스트 배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다. 1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. ![](https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png)<br> adopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신  메모리에 값을 일시적으로 저장하도록 알립니다.  <br> adopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. 전체 테스트 코드입니다. ![](https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png) #### 테스트 실행하기 이제 터미널로 돌아가서 test를 실행합니다. "truffle test"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다. ![](https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png) ## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기 이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다. 이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다. 이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. ![](https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png) #### web3 인스턴스 1.텍스트 편집기로 /src/js/app.js 파일을 엽니다. 2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다. 실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다. ![](https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png) init 함수 ![](https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png) Web3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다. initWeb3 함수 ![](https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png) - 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) - 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다. - 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다. #### 컨트랙트 인스턴스 1. /src/js/app.js 파일에서. initContract 안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다. ![](https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png) - 먼저 스마트 컨트랙트에 대한 아티팩트 파일을 검색합니다. 아티팩트는 배포 된 주소 및 ABI (Application Binary Interface)와 같은 컨트랙트에 대한 정보입니다. ABI는 변수, 함수 및 매개 변수를 포함하여 컨트랙트와 상호 작용하는 방법을 정의하는 JavaScript 객체입니다. - 일단 콜백에 아티팩트가 생기면 TruffleContract로 전달합니다. 이것은 우리가 상호작용 할 수 있는 컨트랙트의 인스턴스를 생성합니다. - 인스턴스화된 컨트랙트를 통해 web3를 설정할때 이전에 저장한 App.web3Provider 값을 이용해서 web3 provider를 설정합니다. - 그런 다음 이전 방문에서 이미 분양된 pet인 경우 앱의 markAdopted() 함수를 호출합니다. 스마트 컨트랙트의 데이터를 변경할때마다 UI를 업데이트 해야 함으로 분리된 함수로 캡슐화 했습니다.  #### 입양된 Pet정보를 얻고 UI를 업데이트 1. /src/js/app.js 파일에서, markAdopted 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다. ![](https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png) - 배포 된 Adoption 컨트팩트에 액세스 한 다음 해당 인스턴스에서 getAdopters ()를 호출합니다. - 먼저 스마트 컨트랙트 호출의 외부에서 adoptionInstance 변수를 선언하여 처음 인스턴스를 검색 한 후에 인스턴스에 액세스 할 수 있습니다. - call ()을 사용하면 전체 트랜잭션을 보낼 필요없이 블록 체인에서 데이터를 읽을 수 있습니다. 즉, ether를 소비하지 않아도됩니다. - getAdopters ()를 호출 한 후 각 애완동물에 대해 주소(adress)가 저장되어 있는지 확인하기 위해 모든 항목을 반복합니다. 배열에는 주소 유형이 포함되어 있으므로 Ethereum은 16 개의 빈 주소로 배열을 초기화 되어 있습니다. 우리가 null이나 다른 거짓 값이 아닌 빈 주소(address) 문자열을 검사하는 이유입니다. - 해당 주소가 있는 petId가 발견되면 입양(adopt) 버튼을 비활성화하고 버튼 텍스트를 "Success"으로 변경하여 사용자가 몇 가지 피드백을 얻습니다. - 모든 오류는 콘솔에 기록(logging)됩니다. #### Adopt() 함수 다루기 1. /src/js/app.js 파일에서, handleAdopt 에서 멀티 주석을 제거하고 아래 내용으로 대체합니다. ![](https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png) - web3을 사용하여 사용자의 계정을 얻습니다. 오류 검사 후 콜백에서 첫 번째 계정을 선택합니다. - 거기에서 우리는 위에서 설명한대로 deploy 된 컨트랙트를 가져 와서 adoptionInstance에 인스턴스를 저장합니다. 이번에는 호출 대신 트랜잭션을 전송할 것입니다. 거래에는 "보낸 사람"주소가 필요하며 관련 비용이 있습니다. 이 비용은 ether로 지불하며 gas(게스)라고 합니다. 게스 비용은 계산을 수행하거나 스마트 계약서에 데이터를 저장하는 데 드는 수수료입니다. 우리는 애완 동물의 ID와 이전에 계정에 저장 한 계정 주소를 포함하는 객체 양쪽을 사용하여 adopt () 함수를 실행하여 트랜잭션을 보냅니다. - 트랜잭션을 전송 한 결과는 트랜잭션 객체입니다. 오류가 없으면 markAdopted () 함수를 호출하여 새로 저장된 데이터와 UI를 동기화합니다. ## 7. 브라우저에서 dapp과 상호 작용 이제 Dapp을 사용할 준비가 되었습니다. #### MetaMask 설치 및 설정 브라우저에서 dapp과 상호작용하기 가장 쉬운 방법은 Chrome과 Firefox 모두를 위한 브라우저 확장 프로그램 인 MetaMask를 사용하는 것입니다.<br> 1.브라우저에 MetaMask를 설치합니다. 2.한번 설치되면, 주소 표시줄 옆에 MetaMask fox 아이콘을 볼수 있습니다. 아이콘을 클릭하면 다음 화면이 나타납니다. ![](https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png) 3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다. 4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다. ![](https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png) 5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다. ![](https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png) 6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다. ![](https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png) ![](https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png) 아래에 비밀번호를 입력하고 OK를 클릭합니다. ![](https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png) 7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. "Main Network"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오. ![](https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png) 8."New RPC URL"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다. ![](https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png) <br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다. 9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다. Truffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. 첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. ![](https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png) 설정이 이제 완료 되었습니다. #### lite-server 설치 및 설정 이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다. 1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  ![](https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png) lite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. 웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다. 프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다. ![](https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png) ![](https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png) #### App 사용하기 1.로컬 웹 서버를 시작합니다. ![](https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png) ![](https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png) dev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다. ![](https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png) 2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다. 3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다. ![](https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png) 4.채택 된 애완 동물의 변화 옆에있는 버튼이 "Success"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다. ![](https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png) 그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 : ![](https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png) #### Ganashe 트랜젝션 확인 ![](https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png) ![](https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png)
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet shop & truffle 샘플
Transaction InfoBlock #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![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg)\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![](https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png)\n\nTruffle 설치 확인\n![](https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png)\n\nGanache 설치\n스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인\nhttp://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.\n![](https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png)\n\n설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)\n![](https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png)\n\n## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\nTruffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.\n![](https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png)\n\nPet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.\n![](https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png)\n\n생성된 기본 Truffle 디렉토리 구조 및 파일 설명\ncontracts / : 스마트 계약을 위한 Solidity 소스 파일을 포함합니다. 해당 디렉토리에 Migrations.sol이라는 중요한 계약이 있습니다. 이 계약에 대해서는 나중에 설명합니다. \n\nMigrations / : Truffle은 스마트 컨트랙트 배포를 처리 하기 위해서 Migration시스템을 사용합니다. Migration은 변경 사항을 추적하는 추가적인 특별한 스마트 계약입니다. \n\ntest / : 스마트 컨트랙트의 JavaScript 및 Solidity 테스트를 모두 포함합니다.\n\ntruffle.js : Truffle 설정 파일\n\n![](https://steemitimages.com/DQmUkh8snfoYvq1B6qcNnZvzjaEE8LLLK6hzYsdKSJ9NBkC/image.png)\n\n## 3. Smart Contract 작성하기\n백-엔드 로직 및 스토리지 역할을하는 스마트 계약서를 작성하여 dapp을 시작해 봅니다.\n첫 번째로, contracts > Adoption.sol 파일 추가 합니다.\n![](https://steemitimages.com/DQmYiAHnkY7LQf3utovSCLWT6vxJYA35HS4QxPMdH7SyfbT/image.png)\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![](https://steemitimages.com/DQmVjwpyjeLdXFrfv53juPNQKtiZogp8KzDwRk2gGunh2e9/image.png)\n\n컴파일이 완료되면  .build/contracts 폴더아래 compile 정보를 담은 개별 json 파일이 생성됩니다.\n![](https://steemitimages.com/DQmam6yzkkStSvTy1CeiE9V8zkPuVs2LzsEtDWGwJm3W1fj/image.png)\n\n### 마이그레이션(migration)\n성공적으로 Smart Contract가 Compile되면 이제 블록체인으로 migrate 합니다.\n마이그레인션(Migration)은  응용 프로그램의 계약 상태를 변경하여 한 상태에서 다음 상태로 이동시키는 전개 스크립트입니다.  첫 번째 마이그레이션의 경우 새 코드를 배포하는 것이지만 시간이 지남에 따라 다른 마이그레이션은 데이터를 이동하거나 계약을 새로운 것으로 대체 할 수 있습니다.\n\nmigrations/ 폴더에 default로 1_initial_migration.js 파일이 존재합니다.\n![](https://steemitimages.com/DQmcm5LbQ81JT82JecvNnr8sWWRwnT3Pj14zrKyc1dYSxjL/image.png)\n\n이 파일은 이후 스마트 계약의 마이그레이션을 관찰하기 위해 Migrations.sol 컨트랙트의 배포를 관리하며, 나중에 변경되지 않은 컨트랙트를 이중 마이그레이션하지 않도록 보장합니다. (1_initial_migration.js 내용)\n![](https://steemitimages.com/DQmTgHqbL8YeCXRRq3WY3xk5ZzUWWhySuqpmn5DQknfrQK7/image.png)\n\n이제 Adoption 컨트랙트에 대한 마이그레이션을 작성합니다\n\n1. migrations/ 디렉토리에 2_deploy_contracts.js 파일을 생성\n2. 2_deploy_contracts.js에 아래 내용 입력\n![](https://steemitimages.com/DQmSWuMuT7chqUPM1VFFa4GnrF8eSgqn4dQ88PKLdT9Ntrz/image.png)\n\n3. 컨트랙트를 블록체인으로 Migration하기 전에 블록체인을 실행 해야 합니다. 컨트랙트를 Deploy, 어플리케이션 개발, 테스트 실행을 위해 Private 블록체인으로 Ganache를 사용 합니다.\n(응용 프로그래밍에서 Ganache.app을 실행하면 됩니다.)\n![](https://steemitimages.com/DQmRUKynH7eYZ2eDqhD2n6j3esBrupG5RqFWKx3NeAtRFir/image.png)\ntruffle.js파일에서 Ganache를 설정합니다. 이때 설정정보에 networks에  development 를 추가하면 로컬 Ganache에 연결됩니다.\n![](https://steemitimages.com/DQmPxNuw81ixY9XySotyYacG17LTVF2L6zMN9prdS6GJfss/image.png)\n\n4. 이제 터미널에서 컨트랙트를 블록체인으로 migration 합니다\n![](https://steemitimages.com/DQmdjDPqZrMgMnec7CCVYnb5YkDYTufujcd8K41MMFJFWJC/image.png)\n순서대로 실행중인 마이그레이션과 배포 된 각 계약의 블록 체인 주소를 볼 수 있습니다. (이때 주소가 다를 수 있습니다.)\n\n5. Ganache를 통해 블록체인의 상태가 변경된 것을 확인합니다. 현재 블록이 이전에 0이었는데 블록이 4로 변경된것을 보여줍니다. 또한 첫 번째 계정의 원래 Ether는 100 이었지만 마이그레이션하는 데 드는 트랜잭션 비용으로 인해 이제는 더 낮습니다. 나중에 거래 비용(Transaction Costs)에 대해 자세히 이야기하겠습니다.\n![](https://steemitimages.com/DQmbY2WkxLUFPFDDNp1EBHeiYkASZcwBpYoRv1yKzQM3oRT/image.png)\n아래는 추가된 블록의 정보\n![](https://steemitimages.com/DQmWPTF3uQBDHDTnxab6tdfQ9qyaFtzE5SFWeV7fjrHesQn/image.png)\n트렌젝션의 처리 정보\n![](https://steemitimages.com/DQmb8krWJNPTpVEJBY6ewWhjjR3LQyQ2iM4cc4V443Qui76/image.png)\n이제 첫 번째 스마트 계약서를 작성하여 로컬로 실행중인 블록 체인에 배포했습니다. 이제 이 스마트 계약과 상호작용을 해 보겠습니다. (interact with)\n\n\n## 5. Smart Contract 테스트\nTruffle은 스마트 계약 테스트의 경우 매우 유연합니다. 테스트는 JavaScript 또는 Solidity로 작성 될 수 있습니다. 이 튜토리얼에서는 Solidity에서 테스트를 작성합니다.\n\n1. test/ 디렉토리에 TestAdoption.sol 이라는 이름의 파일을 생성합니다.\n2. TestAdoption.sol 파일에 아래의 내용을 추가합니다.\n![](https://steemitimages.com/DQmR9JXz5H2pAzxCfP6wo7NDSYytP9yrUQHgHmKu2KVFaFz/image.png)\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![](https://steemitimages.com/DQmcAwELmictHmw7bvEnSi5eL6jRJ1cu4hLXL8gnV8ckuJy/image.png)\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![](https://steemitimages.com/DQmTeBURZxQX17DTCa2tiffNtCaDsdFiw2um8Jwsiv7vkPT/image.png)\nTestAdoption 컨트랙트는 트랜잭션에 현재 계약의 주소를 가져 오는 계약 변수를 transaction에 전송하기 때문에 예상 주소로 this를 설정합니다.\n\n####  모든 Pet의 소유자 검색 테스트\n배열은 주어진 단일 키에 대한 단일 값만 반환하기 때문에 전체 배열을 위한 자체 getter를 만듭니다.\n1. TestAdopter.sol에 앞서 추가된 함수아래 해당 함수(testGetAdopterAddressByPetIdInArray)를 추가합니다. \n![](https://steemitimages.com/DQmXMpsQAairyFY3n6CKHhTwn9oE4fnE4NFCYyXUSBWq58u/image.png)<br>\nadopters의 memory 속성에 주의하기 바랍니다. 메모리 속성은 Solidity가 컨트랙트의 storage에 저장하는 대신  메모리에 값을 일시적으로 저장하도록 알립니다.  <br>\nadopters 는 배열이고 애완동물 8을 입양한 첫 입양 테스트를 알기 때문에 테스트 컨트랙트 주소와 배열에서의 위치 8을 비교합니다. \n\n전체 테스트 코드입니다.\n![](https://steemitimages.com/DQmVgWN8UcKP6HfV1FkMF2a9EnM9y9BLYXgafPfiDSpPSjJ/image.png)\n\n####  테스트 실행하기\n이제 터미널로 돌아가서 test를 실행합니다.\n\"truffle test\"를 사용하며, 모든 테스트가 통과 되면 아래와 같은 출력을 확인 할수 있습니다.\n![](https://steemitimages.com/DQmWUFAkzhrX2ZQ9c4KvxmPAfLdN9pQWyUJ8NT8xfr4LaRH/image.png)\n\n\n## 6. Smart Contract와 상호 작용하는 사용자 인터페이스 만들기\n이제 스마트 계약서를 작성하여 로컬 테스트 블록체인에 배포하고 콘솔을 통해 상호 작용할 수 있다는 것을 확인 했으므로 Pete가 Pet Shop에서 사용할 수 있는 UI를 만들겠습니다.\n이 Pet shop Truffle Box에는 src/ 디렉토리에 프론트 엔드 용 코드가 포함되어 있습니다.\n\n이미 제공되는 앱의 구조에 Ethereum의 고유한 기능을 채워 넣음으로써 프런트 엔드 개발을 완료합니다. \n![](https://steemitimages.com/DQmVvqkescmiN4YRCkqzHLoDcMGWSmT5PqDB3DFevUtC4tf/image.png)\n\n####  web3 인스턴스 \n1.텍스트 편집기로 /src/js/app.js 파일을 엽니다.\n\n2.파일을 살펴보면, 어플리케이션을 관리하고 init()에서 pet 데이터를 로드한 다음 initWeb3() 함수를 호출하는 전역 App 객체가 있다는 것을 알 수 있습니다.\n실제 js에서는 아래 load 함수가 가장 아래 있지만 흐름 설명을 위해 먼저 기술합니다.\n![](https://steemitimages.com/DQmVFaddMuuDsdHL3RyKy8wwSpdRsAdefN8NjNXydwxoyt3/image.png)\ninit 함수\n![](https://steemitimages.com/DQmYd7imAvsNqYYZqYkU5e1GUwnCB7e3epZPgaXBFjyTeXL/image.png)\nWeb3 JavaScript 라이브러리는 Ethereum 블록체인과 상호작용합니다. 사용자 계정을 검색하고 transaction을 보내고 스마트 컨트랙트와 상호작용하는 등의 작업을 수행할 수 있습니다.\ninitWeb3 함수\n![](https://steemitimages.com/DQmeU3zCMhyj8SSU3VL8gaKr8u5DVMvGqoBf43HGgt67Hq4/image.png)\n- 먼저 이미 활성화된 web3 인스턴스가 있는지 체크합니다. (Mist나 MetaMask 확장된 크롬같은 Ethereum 브라우져는 자체 web3 인스턴스를 주입합니다.) \n- 만일 주입된 web3 인스턴스가 있다면, web3 Provider를 가져와서 web3 객체를 생성하는데 사용합니다.\n- 만일 주입된 web3 인스턴스가 없다면, 로컬 프로바이더를 기반으로 web3 객체를 생성합니다.\n\n####  컨트랙트 인스턴스 \n1. /src/js/app.js  파일에서. initContract  안에서 멀티 라인 주석을 제거하고 아래와 같이 바꾸어 줍니다.\n![](https://steemitimages.com/DQmW1AiWk9xurjmdrHdPfzC3GwPBuk77atVZXY5pFq5JieK/image.png)\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![](https://steemitimages.com/DQmVgNje9XS5a8qLrNox5D8qGnqnjgown9amUujivUhYtF6/image.png)\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![](https://steemitimages.com/DQmb3xC7XyKvugbgofPxYqKJ5nDnqaiJWGe8MSScLvqtPjx/image.png)\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![](https://steemitimages.com/DQmNmhs4vixJNG7KtkR5epTC7GK9WzhsvANogMZCdMvYrXn/image.png)\n3.Privacy Notice를 수락하기위해서 Accept 버튼을 클릭합니다.\n4.그러면 사용조건(Term of Use)가 나타나며, 읽은 다음 밑으로 스크롤링 하고 역시 Accept를 클릭합니다.\n![](https://steemitimages.com/DQmfLGhYb1tB4zXEWr8CZkJhYdaSbJrK8S19dpAUy5Bexe3/image.png)\n5.이제 초기 MetaMask 화면이 나타납니다. Import Existing DEN을 클릭합니다.\n![](https://steemitimages.com/DQmcju6tH1cdHsx81GRBek88ZzFk1pGsSvUQRXagSKRzVkq/image.png)\n6.Wallet Seed 라고 표시된 박스에 Ganache에 표시된 mnemonic을 입력합니다.\n![](https://steemitimages.com/DQmTqCuqAi2FsK9SFQYcytZmXhDhfFevTU9DvJRpH3k7sdt/image.png)\n![](https://steemitimages.com/DQmb11na3T9sDXs6MxtN3Wwf3fWCJGtYyES4aCK8CVrcszT/image.png)\n아래에 비밀번호를 입력하고 OK를 클릭합니다.\n![](https://steemitimages.com/DQmbvEHpLGbTeZcpJHMp7cNCMrDALZ5TxEguJDLQusbYhcX/image.png)\n7.이제 MetaMask를 Ganache가 만든 블록체인에 연결합니다. \"Main Network\"가 표시된 메뉴를 클릭하고 Custom RPC를 선택하십시오.\n![](https://steemitimages.com/DQmQFHJwcTZkBE6oM53F4h81UEPNH2rd8NqVad2zZgxNi5v/image.png)\n8.\"New RPC URL\"상자에 http://127.0.0.1:8545를 입력하고 저장을 클릭합니다.\n![](https://steemitimages.com/DQmeuHRUD2ks7X6pJD1YeCFFBuMK4iFBqfda1aPmb91WPRM/image.png)\n<br>상단의 네트워크 이름이 “Private Network”으로 바뀝니다.\n9.’Setting'옆에 있는 왼쪽 화살표를 클릭하여 페이지를 닫고 계정 페이지로 돌아갑니다.\nTruffle Develp에 의해 생성된 각 계정에는 100 ether가 주어집니다. \n첫 번째 계정에서는 계약 자체가 배포 될 때와 테스트가 실행될 때 일부 가스가 사용 되었기 때문에 약간 더 적습니다. \n![](https://steemitimages.com/DQmTnWxUU7EHPkrLPKEcVEiYZkwqFb9ws9qXx4nH1ExXLFv/image.png)\n설정이 이제 완료 되었습니다.\n\n####  lite-server 설치 및 설정\n이제 로컬 웹 서버를 시작하고 dapp를 사용할 수 있습니다. 정적 파일을 제공하기 위해 lite-server 라이브러리를 사용하고 있습니다. 이것은 pet-shop Truffle Box와 함께 제공되었지만 작동 방식을 살펴 보겠습니다.\n\n1.텍스트 에디터로 bs-config.json 파일을 오픈 (프로젝트의 root 디렉토리에 있는) 하고 내용을 검사합니다.  \n![](https://steemitimages.com/DQmVXeeF3mQsYcv3dE1Refuaq94fcg1r1yfJZ3pjcK5875Y/image.png)\nlite-server에 우리의 기본 디렉토리에 포함시킬 파일을 알려줍니다. \n웹 사이트 파일에는 ./src 디렉토리를, 컨트랙트 아티팩트에는 ./build/contracts 디렉토리를 추가합니다.\n\n프로젝트의 루트 디렉토리에있는 package.json 파일의 scripts 객체에 dev 명령을 추가합니다.\n![](https://steemitimages.com/DQmVUv6uF3R9pPGx8Enpie5Px3sZrKig7j6BokarfaM2m6w/image.png)\n\n![](https://steemitimages.com/DQmbBwK4ijQTSLNet4H6zJGtEkcaMLK21We5ba3baGHpXyr/image.png)\n\n####  App 사용하기\n1.로컬 웹 서버를 시작합니다.\n![](https://steemitimages.com/DQmXnbxz9kscPP3RkD8qz9tSVvQ13dNhyP6MmhzMpWismj4/image.png)\n![](https://steemitimages.com/DQmTJHaMR3mydd7C8eBHD5oucJmTN4PrVxJYwqd5P6iYTkv/image.png)\n\ndev 서버가 실행되고 dapp이 포함 된 새 브라우저 탭이 자동으로 열립니다.\n![](https://steemitimages.com/DQmewFe3SFwa71Ee8jNa6T12ZYQDDkUEVq3qsv53jr1f34c/image.png)\n\n2.dapp을 사용하기 위해 원하는 애완동물의 입양 버튼을 클릭합니다.\n\n3.MetaMask를 통해 트랜잭션을 승인하라는 메시지가 자동으로 표시됩니다. SUBMIT을 클릭하여 트랜잭션을 승인합니다.\n![](https://steemitimages.com/DQmbPeHddtwyzZ3XqS4nY5zd5hg1gykG9CdLDmVtyMZqwSJ/image.png)\n4.채택 된 애완 동물의 변화 옆에있는 버튼이 \"Success\"이라고 표시됩니다. 애완 동물이 입양 되었으므로, 비 활성화됩니다.\n![](https://steemitimages.com/DQmZDWCkzhfWPUXmohssdYUMsaPUHnf42vgaCosHQ5EEGH7/image.png)\n그리고 MetaMask에서 트랜잭션이 나열된 것을 볼 수 있습니다 :\n![](https://steemitimages.com/DQmTDVKbtmV4zkcpzweftr8Ee2hBsQGRQh6eWL38A6MshR5/image.png)\n\n\n\n####  Ganashe 트랜젝션 확인\n![](https://steemitimages.com/DQmTSJnYPJMSb4Kw2fmJjsuTo5WYDoqVjgWPGeJeHapNKa2/image.png)\n![](https://steemitimages.com/DQmVSZ1Ny2KpndG3DZsTVbvfcVpTiNN1QZot5f2kazs3fz5/image.png)",
      "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
}
2018/04/29 01:20:18
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet shop & truffle 샘플
Transaction InfoBlock #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
}
2018/04/28 03:23:27
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet shop & truffle 샘플
Transaction InfoBlock #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
}
2018/04/28 01:21:36
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet shop & truffle 샘플
Transaction InfoBlock #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
}
2018/04/26 15:22:39
authordongshik
permlinkethereum-pet-shop-and-truffle
voterthetroublenotes
weight20 (0.20%)
Transaction InfoBlock #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
}
2018/04/26 15:22:24
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet shop & truffle 샘플
Transaction InfoBlock #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
}
2018/04/26 15:21:24
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet shop & truffle 샘플
Transaction InfoBlock #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 properties
2018/04/26 14:22:39
accountdongshik
json metadata{"profile":{"name":"망각","about":"여전히 개발하고 공부하는게 재미있습니다.!!!","location":"서울"}}
memo keySTM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N
Transaction InfoBlock #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
}
2018/04/25 19:18:21
authordongshik
permlinkethereum-pet-shop-and-truffle
voteruhogoneyalaidan
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/04/25 14:38:27
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet shop & truffle 샘플
Transaction InfoBlock #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
}
2018/04/25 14:30:12
authordongshik
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 튜토리얼 아키텍처 ![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg) 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을 설치합니다. ![](https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png) Truffle 설치 확인 ![](https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png) Ganache 설치 스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인 http://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다. ![](https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png) 설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요) ![](https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png) ## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기 Truffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다. ![](https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png) Pet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다. ![](https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png)
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet shop & truffle 샘플
Transaction InfoBlock #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![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg)\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![](https://steemitimages.com/DQmR56DMYNeq7oJqFYpPmrmoc2QbsityiUAdSGzEm1wXWgG/image.png)\n\nTruffle 설치 확인\n![](https://steemitimages.com/DQmZxx5BMR24TpExUycXnCPXrj8THbtEaVhS3Tb2TQS1gHU/image.png)\n\nGanache 설치\n스마트 계약의 배포, 어플리케이션 개발, 테스트 실행에 사용할 Ethereum 개발을 위한 Personal 블록체인\nhttp://truffleframework.com/ganache 로 이동하여 “Download” 버튼을 클릭하고, Ganache를 다운로드 및 설치합니다.\n![](https://steemitimages.com/DQmeS5UqczfwnF9NYiQXbNi99hrtZB4nvQ3Pt56o5qFyxKz/image.png)\n\n설치 후 Ganache를 실행하면 로컬 RPC 서버가 구동되며 테스트를 위한 10개의 Account가 만들어집니다. 우측 상단의 설정에서 IP 및 포트를 지정 할 수 있습니다. (자세한 사용방법은 사이트를 참조하세요)\n![](https://steemitimages.com/DQmQ4ak1xBDkf5eyn3VaCrK2Znfo824gkg6WR3ZiwaHkyn7/image.png)\n\n## 2. Truffle Box를 사용하여 Truffle 프로젝트 만들기\nTruffle은 현재 디렉토리에서 초기화 되기 때문에 먼저 디렉토리를 하나 만들고 그 디렉토리로 이동합니다.\n![](https://steemitimages.com/DQmaw8dho5eZiFc9aA4tn9UdXZRh58zDww3AfPBmFSsiZjp/image.png)\n\nPet-shop 튜토리얼을 위한 Truffle Box가 만들어져 있으며, 기본 프로젝트 구조와 사용자 인터페이스 코드가 포함되어 있습니다. Truffle Box를 풀려면 Truffle unbox 명령을 사용하면 됩니다.\n![](https://steemitimages.com/DQmQE4GJNTAV29AnSottLE96FKST5huyz2ooniAMXw8jbZY/image.png)",
      "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
}
2018/04/25 13:49:06
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet shop & truffle 샘플
Transaction InfoBlock #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
}
2018/04/25 13:36:18
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet shop & truffle 샘플
Transaction InfoBlock #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
}
2018/04/25 13:29:09
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet-shop & truffle 샘플
Transaction InfoBlock #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 properties
2018/04/25 13:14:45
accountdongshik
json metadata{"profile":{"profile_image":"https://i.imgsafe.org/07/07e8632d04.jpeg","name":"망각","about":"여전히 개발하고 공부하는게 재미있습니다.!!!","location":"서울"}}
memo keySTM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N
Transaction InfoBlock #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 properties
2018/04/25 13:14:03
accountdongshik
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 keySTM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N
Transaction InfoBlock #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 properties
2018/04/25 13:13:09
accountdongshik
json metadata{"profile":{"profile_image":"https://imgsafe.org/image/07e8632d04","cover_image":"https://imgsafe.org/image/07e8632d04","name":"망각","about":"여전히 개발하고 공부하는게 재미있습니다.!!!","location":"서울"}}
memo keySTM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N
Transaction InfoBlock #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
}
2018/04/25 12:03:51
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet-shop & truffle 샘플
Transaction InfoBlock #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
}
2018/04/25 12:01:06
authordongshik
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 permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet-shop & truffle 샘플
Transaction InfoBlock #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
}
2018/04/25 11:56:15
authordongshik
bodyEthereum 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 튜토리얼 아키텍처 ![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg)
json metadata{"tags":["etherum","pet-shop","truffle"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet-shop & truffle 샘플
Transaction InfoBlock #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![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg)",
      "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
authorbboyghost
bodyHey 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 authordongshik
parent permlinkethereum-pet-shop-and-truffle
permlinkre-dongshik-ethereum-pet-shop-and-truffle-20180425t104847439z
title
Transaction InfoBlock #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
}
2018/04/25 10:49:39
authordongshik
permlinkethereum-pet-shop-and-truffle
voterax3
weight100 (1.00%)
Transaction InfoBlock #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
}
2018/04/25 10:49:30
authordongshik
bodyPete’s Pet Shop 튜토리얼 - Pet shop의 입양 추적 시스템 추축 과정 안내를 목표로 함. - Ethereum과 스마트 계약 대한 기본적인 지식과 HTML 및 JavaScript에 대한 지식이 있지만 Dapp에 익숙하지 않은 개발자 대상 Pet Shop 튜토리얼 구현 요건 - 애완동물의 입양처리의 효과적인 방법으로써 Ethereum 사용에 관심을 가지고 있음 - 한번에 16마리의 애완동물을 관리하기 위한 공간 - 각 애완동물에 대한 정보 데이터 베이스를 보유 - Pet Shop에서 입양되는 애완동물과 Ethereum 주소(Address)와 연관시키는 Dapp을 구현 - 기본 웹사이트의 구조와 Style을 제공 - 프론트엔드 로직과 스마트 계약을 작성 Pet Shop 튜토리얼 아키텍처 ![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg)
json metadata{"tags":["etherum","pet-shop","truffle"],"image":["https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinketherum
permlinkethereum-pet-shop-and-truffle
title[작성중] Ethereum Pet-shop & truffle 샘플
Transaction InfoBlock #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![pst001.jpeg](https://steemitimages.com/DQmZPP4b3NV2qfxgXRQFRpGd7cDY83wM5G4H1XaefNudJNe/pst001.jpeg)",
      "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 post
2018/03/16 05:34:18
authordongshik
permlinkre-modolee-eos-smart-contract-1-eos-20180316t041345931z
Transaction InfoBlock #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
authordongshik
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 authormodolee
parent permlinkeos-smart-contract-1-eos
permlinkre-modolee-eos-smart-contract-1-eos-20180316t041345931z
title
Transaction InfoBlock #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
idfollow
json["follow",{"follower":"dongshik","following":"modolee","what":["blog"]}]
required auths[]
required posting auths["dongshik"]
Transaction InfoBlock #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
idfollow
json["follow",{"follower":"dongshik","following":"nida-io","what":["blog"]}]
required auths[]
required posting auths["dongshik"]
Transaction InfoBlock #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
idfollow
json["follow",{"follower":"dongshik","following":"dimens","what":["blog"]}]
required auths[]
required posting auths["dongshik"]
Transaction InfoBlock #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
}
steemcreated a new account: @dongshik
2018/02/01 01:22:27
active{"account_auths":[],"key_auths":[["STM5FS5ca329Nf4YxPijrcB2nPAQM1SsB1ERPvWB8mnJRPbsYkQSm",1]],"weight_threshold":1}
creatorsteem
delegation29700.000000 VESTS
extensions[]
fee0.500 STEEM
json metadata
memo keySTM5FQUuu2pmVMqEdBL1tjQpf4pqRfTXfVgQ5rdQKGvexYXRbkb8N
new account namedongshik
owner{"account_auths":[],"key_auths":[["STM8MFy85L34ezoakpGz5Fek2VW31pLeSDNg3ZME51YcSnkfbeMDJ",1]],"weight_threshold":1}
posting{"account_auths":[],"key_auths":[["STM6rmAfEbe7BUu96DQKmvBnWZq32QaCmnCoVNgeyCFoPvfArTBkw",1]],"weight_threshold":1}
Transaction InfoBlock #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
}

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