-
truffle νλ‘μ νΈμμ ganache μλ§ λ°°ν¬ν΄μ ν μ€νΈνμλλ°,
μ΄λ²μλ ropsten μ΄λΌλ ν μ€νΈ λ€νΈμν¬μ λ°°ν¬ν΄λ³΄λλ‘ νκ² μ΅λλ€.
1. infura κ³μ μμ± λ° Ropsten API Key μμ±
ropsten μ μ¬μ©νκΈ° μν΄μλ λ¨Όμ infura κ³μ μ μμ±ν΄μ API Key λ₯Ό μ»μ΄μΌ ν©λλ€.
infura κ³μ μ μμ±ν ν, μ νλ‘μ νΈλ₯Ό λ§λ€λ©΄ Project ID λ₯Ό νμΈν μ μμ΅λλ€.
λ°λΌμ https://ropsten.infura.io/v3/{PROJECT_ID} λ‘ ropsten μ μ¬μ©νκ² λ©λλ€.
2. Truffle νλ‘μ νΈμ Ropsten network μ€μ
ropsten μ infura μμ μ 곡νλ λΈλ‘μ²΄μΈ λ€νΈμν¬λ‘, λ€μμμ λ³Ό μ μλ― HDWallet μΌλ‘ μ κ·Όν΄μΌ ν©λλ€.
HDWallet μ μν΄ μ΄λ₯Ό μ½κ² μ¬μ©ν μ μλλ‘ ν΄μ£Όλ @truffle/hdwallet-provider μ μ¬μ©νλλ‘ νκ² μ΅λλ€.
@truffle/hdwallet-provider μ μ€μΉν ν,
$ npm install @truffle/hdwallet-provider
ropsten μμ wallet μ λ§λ€μ΄μ£Όκ³ truffle-config.js μ λ€μκ³Ό κ°μ΄ μμ±ν©λλ€.
μ μ κ²½μ°, web3 λ₯Ό μ¬μ©νμ¬ ropsten μμ κ³μ μ λ§λ€μ΄μ£Όκ³ mnemonic μ private key λ₯Ό λ£μ΄μ£Όμμ΅λλ€.
const HDWalletProvider = require('@truffle/hdwallet-provider'); const mnemonic = "{PRIVATE_KEY}"; module.exports = { networks: { development: { host: "127.0.0.1", // Localhost (default: none) port: 7545, // Standard Ethereum port (default: none) network_id: "*", // Any network (default: none) }, ropsten: { provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/{PROJECT_ID}`), network_id: 3, // Ropsten's id gas: 5500000, // Ropsten has a lower block limit than mainnet confirmations: 2, // # of confs to wait between deployments. (default: 0) timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) }, }, // Configure your compilers compilers: { solc: { version: "0.8.10", } }, };
- PRIVATE_KEY μ PROJECT_ID μμ±
μ΄λ, constract λ₯Ό λ°°ν¬νλ €λ©΄ ν΄λΉ κ³μ μ μ΄λκ° μμ΄μΌ νλ―λ‘ μ λ λ°°ν¬μ μ¬μ©ν κ³μ μ ν μ€νΈ μ΄λλ₯Ό λ°μμ΅λλ€.
- https://faucet.ropsten.be/
- https://faucet.dimensions.network/
μμ λ μ¬μ΄νΈμμ κ³μ address λ₯Ό λ£μΌλ©΄ μ΄λλ₯Ό 보λ΄μ€λλ€. (μΌλ§λ 걸릴μ§λ λͺ¨λ₯΄μ§λ§ μ λ κΈλ°© μμ΅λλ€)
3. Ropsten μ λ°°ν¬
κ³μ μ€μ μ΄ μ λμμΌλ©΄, λ€μκ³Ό κ°μ΄ λ°°ν¬ν΄μ€ μ μμ΅λλ€.
$ turffle migrate --network ropsten
λ§μΌ κ³μ μ μ΄λκ° μΆ©λΆνμ§ μμΌλ©΄ λ€μκ³Ό κ°μ΄ μ€λ₯κ° λ°μν©λλ€.
μ΄λλ₯Ό νμΈνκ³ μΆμΌλ©΄ truffle console λ‘ νμΈν΄λ³Ό μ μμ΅λλ€.
$ truffle console --network ropsten truffle(ropsten)> web3.eth.getBalance("{ADRRESS}") '999374614924453492'
μ΄λλ₯Ό μ±μμ£Όλ©΄ λ€μκ³Ό κ°μ΄ migrate λ₯Ό μνν μ μμ΅λλ€.
μμ ganache λ‘ λ‘컬μμ μ€νν λλ λ°λ‘ λ°°ν¬κ° λμλλ°, ropsten μ ν¨μ¬ μκ°μ΄ λ§μ΄ κ±Έλ Έμ΅λλ€.
4. web3 λ‘ ropsten μ λ°°ν¬λ contract μ°Έμ‘°νκΈ°
μ°μ , npm μΌλ‘ web3 λ₯Ό μ€μΉν΄μ€λλ€. (truffle console μμλ web3 λ₯Ό μ¬μ©ν΄μ ν μ μμ§λ§, λ 립λ web3 λ₯Ό μ¬μ©ν΄λ³΄κΈ° μν΄μ μ΄λ κ² νμ΅λλ€)
$ npm install web3
κ·Έ ν node λ₯Ό μ€νμν¨ λ€μ infura PROJECT ID λ‘ web3 κ°μ²΄λ₯Ό λ§λ€μ΄μ€λλ€.
$ node > const Web3 = require('web3') > const web3 = new Web3('https://ropsten.infura.io/v3/{PROJECT_ID}') > let contract = new web3.eth.Contract([ { "inputs": [], "name": "count", "outputs": [ { "internalType": "int256", "name": "", "type": "int256" } ], "stateMutability": "view", "type": "function", "constant": true }, ], "0x99AF...")
- μνλ λΈλ‘μ²΄μΈ λ€νΈμν¬λ‘ web3 κ°μ²΄λ₯Ό λ§λ€μ΄μ€λλ€. μ¬κΈ°μλ ropsten μ μ¬μ©ν κ²μ΄λ―λ‘, PROJECT_ID λ‘ endpoint λ₯Ό μ§μ νμ¬ μ€μ ν΄μ£Όμμ΅λλ€.
- new web3.eth.Contract λ‘ contract κ°μ²΄λ₯Ό λ§λ€μ΄μ€λλ€. μΈμλ λ€μκ³Ό μμ ABI, contract address κ° λ€μ΄κ°λ©΄ λ©λλ€. (let contract = new web3.eth.Contract(<ABI>, <Contract Address>))
- truffle μμ ν΄λΉ contract λ₯Ό λ°°ν¬ν λ compile ν build/contracts/ μ json ννλ‘ compile κ²°κ³Όλ₯Ό μ£Όλλ°, κ·Έ νμΌμ ABI κ° μμ΅λλ€.
μ΄μ ν΄λΉ κ°μ²΄λ‘ contract μ μ κ·Όν μ μμ΅λλ€.
λ°°ν¬ν smart constract κ° counter κΈ°λ₯μ κ°λ κ²μ΄λ―λ‘ getCount() λ‘ κ°μ νμΈν΄λ³΄λλ‘ νκ² μ΅λλ€.
λ€μκ³Ό κ°μ΄ contract κ°μ²΄μ methods λ€λ‘ ν¨μλ€μ μ°Έμ‘°νμ¬ νΈμΆ, μ¬μ©ν μ μμ΅λλ€.
μ΄μμΌλ‘ Ropsten λ€νΈμν¬μ λ°°ν¬ λ° νΈμΆμ ν΄λ³΄μμ΅λλ€.
ref. https://medium.com/0xcode/interacting-with-smart-contracts-using-web3-js-part-ii-c1ef7566d1c5
'SECURITY > Blockchain' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ