[Ethereum] Truffle μμ Ropsten μ deploy (migrate) νκΈ°
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