- 1๊ต์ -
๐ ๋ฉํ๋ง์คํฌ๋?
- ๊ฐ์ธ์ ๊ณ์ ์ ์ฃผ์๊ฐ์ ์ ์ฅํด์
์ด๋๋ฆฌ์๊ณผ ์ด๋๋ฆฌ์ ํ ํฐ์ ์ฝ๊ณ ์์ ํ๊ฒ ๋ณด๊ดํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋ก๊ทธ๋จ.
- ํซ์๋ ์ด๋ผ๊ณ ๋ ํจ.
- ์๋ํค๋ผ๋๊ฒ์ด ์กด์ฌํจ. (๋น๋ฒ ์์ด๋ฒ๋ ธ์ ๋ 2์ฐจ ๋น๋ฒ๊ฐ์ ๋๋. ๋ฐฑ์ ์ฉ)
- ํฌ๋กฌ์์ ๋ค์ด๋ฐ์ ์ ์๋ ํ์ฅํ๋ก๊ทธ๋จ
โ ์ฉ์ด ์ ๋ฆฌ
์ฃผ์
- ๊ณต๊ฐ(์ฃผ์)ํค : 20 ์๋ฆฌ๋ก ํํ๋๋ ํค๊ฐ
- ์ํธ(๊ฐ์ธ)ํค
๊ณ์
- ๊ณต๊ฐํค์ ์ํธํค ๋๋ค ๊ฐ์ง๊ณ ์๋ ์ํ
- EOA / ์ปจํธ๋ํธ ๊ณ์ ์ผ๋ก ๋๋๋ค.
EOA : ์ด๋ / ์ค๋งํธ ์ปจํธ๋ํธ ํธ๋์ญ์
์ ๋ณด๋ผ ์ ์๋ ๊ณ์
์ปจํธ๋ํธ ๊ณ์ : ์๋ฆฌ๋ํฐ ์ธ์ด๋ฅผ ๋ฐฐํฌํ ๊ณ์ (์ฐ๋ฆฌ๊ฐ ์ปจํธ๋ํธ๋ฅผ ์์ฑํด์ ๋ณด๋๋ ์)
deploy.{
}.send{
from: '1ox398f89423fd95'
} -> ์๋ฐ๊ฑฐ ๋ค์ด์์ผ๋ฉด ๊ทธ๊ฒ ์ปจํธ๋ํธ ๊ณ์
์ง๊ฐ
-๊ณ์ ์ ์ด๊ดํ๋ ๊ณต๊ฐ
์ด๋ฐ ๋๋
- 2๊ต์ -
๋ฉํ๋ง์คํฌ ์ค์น
MetaMask - A crypto wallet & gateway to blockchain apps
A crypto wallet & gateway to blockchain apps
metamask.io
๊ฐ๋์ฌ ์ค์น
https://www.trufflesuite.com/ganache
Ganache | Truffle Suite
Deploy contracts, develop your decentralized applications (dapps), and run tests on smart contracts. Available as a desktop application & command-line tool.
trufflesuite.com
๐น๐น๐น
๋ฉํ๋ง์คํฌ๋ฅผ ์ฒ์์ ์ค์นํ๊ณ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก account1์ด๋ผ๋ ๊ณ์ ์ด ์กด์ฌํจ.
๊ณ์ ์ ๋๋ฌ์ ๋คํธ์ํฌ๋ฅผ ํ ์คํธ๋ท์ผ๋ก ๋ฐ๊พผ ๋ค์,
๊ฐ์์ ์ด๋๋ฆฌ์์ ๋ฐ์๋ณผ ์ ์์.
๊ตฌ๋งค
๐ฝ
ํฌ์ํธ(์๋๊ผญ์ง) ํ ์คํธ
Ropsten์ฉ ํฌ์ํธ์์ Ether ์ป๊ธฐ
"Ether ์ป๊ธฐ"ํด๋ฆญ
๐ฝ
request 1ether from faucet ํด๋ฆญ
๐ฝ
๋ฐ์ transaction์ด ์๊ธฐ๋ฉด ์ฑ๊ณต
๐น ๋ณดํต์ ๊ฐ๋ฐ ๋จ๊ณ๋
1. ๊ฐ๋์ฌ๋ก ์ฝ๋ ์์ฑ (๋ก์ปฌ์์ ๋๋ ค๋ณด๊ณ )
2. ํ ์คํธ๋ท์ผ๋ก ํ ์คํธ
3. ๋ฉ์ธ๋ท์ ์ฌ๋ฆฌ๊ธฐ (์ค์ ์ด๋ ์์)
โ ๊ฐ๋์ฌ ์คํ
๊ฐ๋์ฌ๋ฅผ ์ด๋ฉด 10๊ฐ์ ๊ณ์ ์ด ์์ฑ๋จ.
๊ฐ๊ฐ์ ๊ณ์ ์๋ ๊ณต๊ฐํค (์ฃผ์)๊ฐ ๋ค์ด์์. ์์ ์ด์ ๋๋ฅด๋ฉด ๋น๋ฐํค ๋์ด
* ๋ฉํ๋ง์คํฌ๋ ์ด๋ค๊ฐ์ ์๊ตฌํ ๊น์?
โ ๊ฐ์ธํค๋ฅผ ๋ฃ๊ฒ ๋์ด์์
why ๊ฐ์ธํค๋ง ์๊ตฌ?
- ๊ฐ์ธํค : keccak256()์ ๊ฐ์ง๊ณ ๊ฐ์ธํค๋ฅผ ์์ฑ / ๊ฐ์ธํค๋ฅผ ๊ฐ์ง๊ณ ๊ณต๊ฐํค๋ฅผ ์์ฑ.
์ฆ, ๊ฐ์ธํค๋ง ๊ฐ์ง๋ฉด ๊ณต๊ฐํค๋ฅผ ์ ์ ์์
โ ๊ณ์ ์์ฑํ๊ธฐ
๊ณ์ ๋ง ๋ง๋ค์ด๋๊ณ ์ฃผ์๊ฐ์ ๋ฃ์ง ์์ ์ํ!
์ฌ๊ธฐ๋ค๊ฐ ์ฃผ์๊ฐ์ ๋ฃ์ด์ค์ผ ์ด๋๊ฐ ๋ฐ ๊ฒ์~
1. ์ฃผ์๊ฐ ๋ฃ๊ธฐ
2. ๋ด๊ฐ ๋ฃ์ ์ฃผ์๊ฐ ์ด๋ค ๋คํธ์ํฌ์ ์๋ ์ฃผ์์ธ์ง๋ ๋ช ์๋ฅผ ํด์ค์ผ ํจ (= url ์ฃผ์ ํ์)
์ฐ๋ฆฌ๋ localhost ์์ ์์ ํด์ผ ํ๋ฏ๋ก "๋ง์ถคํ rpc"๋ฅผ ๋๋ฌ์ ๊ฐ๋์ฌ url ์ฃผ์ ๋ฃ์ด์ค์ผ ํจ!
โ ๋คํธ์ํฌ ๋ช ์ํ๊ธฐ
๐ผ ๋ง์ถคํ rpc ํด๋ฆญ ๐ผ๋คํธ์ํฌ ์ด๋ฆ ์๋ฌด๊ฑฐ๋ ์ ๊ณ ,
rpc url์ ์ฐ๋ฆฌ๊ฐ ๊ฐ๋์ฌ๋ก ์์ฑํ url
์ฒด์ธ id๋ ์ ์ด์ฃผ๊ธฐ (๊ทธ๋ฅ ๋ฉํ๋ง์คํฌ์์ ์ ์ผ๋ผ๋๋๋ก ํ๋ฉด๋จ)
โ ์ฃผ์๊ฐ ๋ฃ๊ธฐ
๊ณ์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฅด๋ฉด ๊ฐ์ธํค๋ฅผ ์ ๋ ฅํ๋ ํ๋ฉด์ด ๋์ด! ๊ฑฐ๊ธฐ์ ๊ฐ๋์ฌ์์ ์์ฑ๋ ๊ฐ์ธํค๋ฅผ ๋ณต์ฌํด์ ๋ฃ์ด์ฃผ๋ฉด ๋จ~
๊ทธ๋ฌ๋ฉด 100 ์ด๋๊ฐ ์๊น!!!
โ โ ๊ฐ๋์ฌ๋ ๋ฉํ๋ง์คํฌ๊ฐ ์ฐ๊ฒฐ๋ ๊ฒ! โ โ
- 3๊ต์ -
๐ truffle์ด๋?
- Dapp์ ๋ง๋ค๊ธฐ ์ํ ํ๋ ์์ํฌ์ ๋๋ค.
- ์ฑ์ ๋ง๋ค ๋ ๋ณต์กํ ์ค๊ฐ๊ณผ์ ์ ๋ ๋ ค์ค๋๋ค.
์ด์ ๋ง๋ ํฌํ์ฑ์ ์์๋ก ์๊ฐํด๋ณด๋ฉด,
1. ์๋ฆฌ๋ํฐ๋ก ์ฝ๋ฉํ๋ค.
2. ์ฝ๋ฉํ ๊ฒ์ ์ปดํ์ผ ํ๋ค.
3. ์ปดํ์ผํ ๋ด์ฉ์ ๋ฐฐํฌํ๋ค. (deploy.js ์คํ -> transaction ๋ฐ์๋ address ๊ฐ์ ธ์์)
4. web3 ( ์ฌ๊ธฐ์ transaction address ๋ฃ์ด์ฃผ๋.. )๋ฅผ ํ์ฉํ์ฌ ํ๋ก ํธ์ค๋๋ฅผ ๋ง๋ ๋ค.
์ด๋ฌํ ์์ ์ ๊ฐ์ํํด์ฃผ๋๊ฒ truffle!
๐ ํธ๋ฌํ ์์ ํ๊ฒฝ ๋ง๋ค๊ธฐ
npm install -g truffle
truffle init
โ ํด๋ ์ธ๊ฐ๊ฐ ์์ฑ๋จ! (+ truffle-config.js ํ์ผ)
1. contracts -> ์๋ฆฌ๋ํฐ ์ฝ๋ ์์ฑํ๋ ๊ณต๊ฐ
2. migrations -> deploy ๋งค์๋๊ฐ ์ฌ์ฉ๋๋ ๊ณต๊ฐ. ๋ฐ๋ชฌ์๊ฒ ๋ฐฐํฌํ๋ ํ์๋ฅผ ํ๋ ๊ณต๊ฐ
3. test -> TDD ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ณต๊ฐ
4. truffle-config.js -> truffle ๊ด๋ จ๋ ํ๊ฒฝ์ค์ ํ์ผ.
๊ตฌ๋ํ ๋ ํ์ํ ์ธํ
ํด์ค ์ ์์. ์ฒ์์ ๋๋ถ๋ถ ์ฃผ์ ๋์ด์์
----------------------------์ธํ ์๋ฃ-----------------------------
๐ ๋ฐฐํฌํ๊ธฐ
โ ๊ฐ๋จํ solidity ์ฝ๋๋ฅผ ์์ฑํด๋ณด์
1. ์ปจํธ๋ํธ ํ์ผ ์์ฑํ๊ธฐ
a. ์ง์ ์
๋ ฅ
b.
> truffle create contract HelloToken : HelloToken.sol ํ์ผ ์์ฑ๋จ
- ๋ํ > truffle create [ํด๋๋ช
] [ํ์ผ๋ช
] ํด์ฃผ๋ฉด ํด๋น ํด๋ ์์ ํ์ผ ์์ฑ๋จ!
ex) truffle create test HelloToken ํด์ฃผ๋ฉด test > hello_token.js ์๊น
๐ฝ ํด์ฃผ๋ฉด
์ด ์ํ์์ ํจ์๋ฅผ ์ ๋ ฅํด์ฃผ๋ฉด ๋จ๋ฏธ๋น.
contracts > HelloToken.sol ์ฝ๋ ์์ฑ
// ๊ฐ๋จํ helloworld ๋ฅผ ๋ฆฌํดํด์ฃผ๋ ํจ์๋ฅผ ์์ฑํด๋ด
๋๋ค
pragma solidity >=0.4.22 <0.9.0;
contract HelloToken {
constructor() public {
}
function hello() public view returns(string memory){
return "hello";
}
}
ํ์ฌ ์ํ์์ ๋ฐ๋ชฌ์ ๋ฐฐํฌ๋ฅผ ํด์ผ ํ๋๋ฐ,
์ฐ๋ฆฌ๊ฐ ์ด ์ฝ๋๋ฅผ ์ด๋ ์ฃผ์์ ๋ฐฐํฌํ ๊ฒ์ธ์ง ์ ํด์ฃผ์ง ์์์.
๊ฐ๋์ฌ์ ํ ๊ฑด์ง, ํ ์คํธ๋ท์ ํ ๊ฑด์ง, ๋ฉ์ธ๋ท์ ํ ๊ฑด์ง ์ขํ๋ฅผ ์ ํด์ค์ผ ํจ.
โ ๋คํธ์ํฌ ํ๊ฒฝ์ค์ ํ๊ธฐ - truffle-config.js
// ๋ด๊ฐ ์ด๋ ๋คํธ์ํฌ๋ฅผ ์ธ๊ฒ์ธ๊ฐ๋ development ๋ถ๋ถ์ ์ค์ ๋์ด์์
์ด๋ถ๋ถ ์ฃผ์ ํ์ด์ฃผ๋ฉด ๋จ
โฌ
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 7545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
},
// ์ฐ๋ฆฌ๊ฐ ๊ฐ๋์ฌ ์ฑ์ผ๋ก ์คํํ ํฌํธ๋ฒํธ๋ก ๋ฐ๊ฟ์ค์ผ ํจ = port: 7545
โ ์ปดํ์ผ ํ๊ธฐ
- ์์ฑํ ์ฝ๋๋ฅผ ์ปดํ์ผํด์ค๋ค
> truffle compile
-> build ํด๋๊ฐ ์์ฑ๋จ. ์ด ์์๋ abi ํด๋๊ฐ ๋ค์ด๊ฐ ์์
bin ํด๋๋ ์๊ธฐ์ง๋ง ์๋ค๋ ๋ค๋ฅธ๋ฐ์ ๊ฝ๊ฝ ์จ๊ฒจ์ ธ์์
โ ๋ฐฐํฌ ํ๊ธฐ
- migrations ํด๋์ ์ด๋ค ํ์ผ์ ๋ฐฐํฌํ ๊ฒ์ธ์ง ์ค์ ์ ํด์ค์ผ ํจ.
- ํ์ผ ์์ฑ : ์์ฑ ๊ท์น โถ [์ซ์]_[ํ์ผ๋ช ] ex) 2_helloToken.js
- ์ฝ๋ ์์ฑ
// HelloToken.sole ํ์ผ์ ๊ฐ์ ธ์์ HelloToken ์ด๋ผ๋ ๋ณ์์ ๋ด๊ฒ ๋ค.
const HelloToken = artifacts.require("HelloToken"); // .soleํ์ฅ์ ์๋ต
module.exports = function (deployer) {
deployer.deploy(HelloToken); //๊ฐ์ ธ์จ ํ์ผ์ ๋ฐฐํฌํ๋ค๋ ๋ป
};
// ๊ทธ๋ฅ ๊ธฐ๋ณธ์ผ๋ก ์์ฑ๋์ด์๋ initial_migration.js ํ์ผ ๊ทธ๋๋ก ๋ณต๋ถํด์
// ์ด๋ฆ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋จ
- ๋ฐฐํฌ ๋ช ๋ น์ด ์ ๋ ฅ
> truffle migration
๋ฐฐํฌํ์
๐ TDD ์์ ๋ฐฉ์ ์ค์ตํด๋ณด๊ธฐ
*TDD๋?
๊ธฐํ -> ํ ์คํธ์ฝ๋ ๋ง๋ค๊ธฐ-> ๊ฐ๋ฐ์ฝ๋ ๋ง๋ค๊ธฐ ์ ์์ ๋ฐฉ์์ ๋งํ๋ค
โ test ์ฝ๋ ์ ๋ ฅํด๋ณด๊ธฐ
ํฐ๋ฏธ๋๋ก ํ์ผ ์์ฑ! > truffle create test HelloToken
( ๊ทผ๋ฐ ๋ณด๋๊น test ํด๋์์๋ ํ์ผ๋ช ์ ๋๋ฌธ์๋ฅผ ์ธ ์ ์๋๋ณด๋ค.. ์์ฑ๋ ํ์ผ๋ช ๋ณด๋๊น hello_token.js ๋ผ๊ณ ๋์ด์์)
์ด๋ฐ ํ์ผ์ด ์์ฑ๋จ! ๊ธฐ๋ณธ ๊ตฌ์กฐ๊ฐ ์์ฑ๋์ด์๋ ์ํ~
์ ์ฝ๋๋ฅผ ์ฃผ์ํ๊ณ ์๋ก ์์ฑํด๋ณด์
hello_token.js ์ฝ๋์์ฑ >
const HelloToken = artifacts.require("HelloToken");
contract("HelloToken",()=>{
it("Hello function call",async ()=>{ // it: ์คํํด๋ณผ๊ฒ, " ":์ด๋ฐ ๋ฉ์ธ์ง๋ฅผ ๋์ฐ๊ณ ,()=>: ์ํจ์๋ฅผ
// ๊ทผ๋ฐ ์ปจํธ๋ํธ๋ฅผ ๊ฐ์ ธ์ฌ๋ ๋๋ถ๋ถ ๋ค ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ก ๋ฐํ์ ๋ฐ์์. ์ฆ ๋น๋๊ธฐ๋ก ๋ฐ์๊ฒ์
// ๋ฐ๋ผ์ async await ๊ตฌ๋ฌธ ์ถ๊ฐ
// web3์์ abi , bytecode ์๋ค๋ก ์จ์ค ์ฝ๋๋ฅผ ํ์ค๋ก ํจ์ถํ๊ฒ์
let instance = await HelloToken.deployed() // ๋ฐฐํฌ๋ ์ (HelloToken)๋ฅผ instance ๋ณ์์ ๋ด๊ณ
let result = instance.hello() //์ ์ฝ๋๋ก ์ ๊ทผ ๊ฐ๋ฅํด์ก์ผ๋
//instance์์์ ๋ฐ๋ก ํจ์๋ช
์ ์ถ๋ ฅํด์ ์ฐ๋ฉด ๋จ.
console.log(`์ด ์์ด๋ ์ฝ์๋ก๊ทธ`, result)
return result;
//์๋๋ ๊ทธ๋ฅ result = true; ๋์ ธ์ฃผ๋ฉด ๋๋ค๊ณ ํจ.
})
})
โ ์คํ ๋ช ๋ น์ด
truffle test
- 4๊ต์ -
๐ truffle ์์ react ์ฌ์ฉํ๊ธฐ
โ ์๋ก์ด ํด๋ ๋ง๋ค๊ธฐ ( root ํด๋๋ฅผ ๋นํด๋๋ก ๋ง๋ ๋ค๋ ๋ป )
- ๋ช ๋ น์ด ์คํ
> truffle unbox react
- ํด์ฃผ๋ฉด client ํด๋๊ฐ ์๋ก ์์ฑ๋จ!
client : react ํ๋ ์์ํฌ๊ฐ ์ค์น๋ ๊ณต๊ฐ์. (create-react-app: cra ๊ฐ ์ค์น๋ ๊ฒ๊ณผ ๊ฐ์ ๊ณต๊ฐ์ผ๋ก ๋ณด์)
web3๋ ๊ตฌํ๋์ด์๋ ํํ! ( ๊ทผ๋ฐ ์ด๊ฒ ๋ค class ํ์ผ๋ก ๊ตฌํ๋์ด์์ด์ ํจ์ํ์ผ๋ก ๋ฐ๊ฟ์ ์ฌ์ฉํ ๊ฒ์ )
โ command
# Commands:
Compile: truffle compile
Migrate: truffle migrate
Test contracts: truffle test
Test dapp: cd client && npm test
Run dev server: cd client && npm run start
Build for production: cd client && npm run build
โ ์คํํด๋ณด๊ธฐ
> npm run start
error๊ฐ ๋ฐ์ํ ๊ฒ์!
Module not found: Can't resolve './contracts/SimpleStorage.json'
in 'C:\Users\82102\OneDrive\1013_2\client\src
why?
-> ํ์ฌ ์ด ํ์ผ์์๋ ์๋ฆฌ๋ํฐ ์ฝ๋ ์ปดํ์ผ๊ณผ ๋ฐฐํฌ๊ฐ ์งํ๋์ง ์์ ์ํ์ด๊ธฐ ๋๋ฌธ์.
โ ์ค์ ํด์ฃผ๊ธฐ
1. ์ด๋ค ๋ฐ๋ชฌ์ ๋๋ฆด๊ฒ์ธ๊ฐ?
- ๋ด๊ฐ ์ด๋ ๊ณณ์๋ค๊ฐ ์์ฒญ์ ๋ณด๋ผ๊ฒ์ธ์ง๋ฅผ ์ ํด์ค์ผ ํจ
- truffle-config.json ์ฝ๋ ์์
networks: {
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 7545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
},
develop: {
port: 8545
}
}
2. solidity ํ์ผ ์ปดํ์ผ ํ๊ธฐ
> truffle compile
(ํ์ผ ํ๋๋ ๋๊ฐ๋ ์ธ๊ฐ๋ ํ๋ฒ์ ๋ค ์ปดํ์ผ ํด์ค)
์๋๋ ์ปดํ์ผ ํ๋ฉด build ๋ผ๋ ํด๋๊ฐ ์๊ฒผ์์.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์๋ ์ปดํ์ผํด๋ build ํด๋๊ฐ ์๊ธฐ์ง ์๊ณ
client > src > contracts ํด๋๊ฐ ์๊ฒจ๋จ~
๊ฐ์๊ฑด๋ฐ ๊ทธ๋ฅ ๋๋ ํ ๋ฆฌ๊ฐ ๋ฐ๋๊ฒ์
3. ๋ฐ๋ชฌ์๋ค๊ฐ ๋ฐฐํฌํ๊ธฐ
> truffle migrate
๋ฐฐํฌ๊ฐ ์งํ๋๋ฉด ์ด๋๊ฐ ์กฐ๊ธ ๋น ์ง๊ฒ์ -> ์ด ๋ถ๋ถ ํ์ธํ๊ธฐ
4. ๋ฆฌ์กํธ ์คํ
> cd client && npm run start
---------------------------------
*** ํ๋ฉด์ the stored value is : 5 ๊ฐ ๋ ์ผํจ
** test ์ฝ๋ ์คํ ๋ฐ๋ณต ์ฐ์ต ํด๋ณผ๊ฒ **