2. Smart contract deployment, transaction execution
์ด์ ํํ ๋ฆฌ์ผ์ธ [Development environment setup and smart contract writing / debugging]์์ ๊ฐ๋จํ ๋ฉ์์ง ์ปจํธ๋ํธ๋ฅผ ์์ฑํด๋ณด๊ณ ํ ์คํธํด ๋ณด์์ต๋๋ค. ์ด๋ฒ ํํ ๋ฆฌ์ผ์์๋ ๋ฉ์์ง ์ปจํธ๋ํธ๋ฅผ ์ด๋๋ฆฌ์ ํ๊ฒฝ์ ๋ฐฐํฌํด๋ณด๊ณ Call์ ํตํด ํธ๋์ญ์ ์ ์คํํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์์ฑํ ์ค๋งํธ ์ปจํธ๋ํธ๊ฐ ์๋์?
์๋ ๋งํฌ๋ฅผ ํตํด Development environment setup and smart contract writing / debugging ํํ ๋ฆฌ์ผ์ ์งํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋จํ ๋ฉ์์ง ์ปจํธ๋ํธ๋ฅผ ์์ฑํ ์ ์์ผ๋ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ๋ง๋ค์ด ๋ณด์ธ์!
Development environment setup and smart contract writing / debugging Tutorial
์ค๋งํธ ์ปจํธ๋ํธ ๋ฐฐํฌ
์์ฑํ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ๋ธ๋ก์ฒด์ธ ํ๊ฒฝ์ ๋ฐฐํฌํ๊ธฐ ์ํด์๋ EOA๋ฅผ ์ด์ฉํด ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ์ ์ค๋งํธ ์ปจํธ๋ํธ ๋ฐฐํฌ ํธ๋์ญ์ ์ ์คํํด์ผ ํฉ๋๋ค. ์ฆ, ๋ฐฐํฌ๋ฅผ ์ํด์๋ ์๋ 3๊ฐ์ง๊ฐ ์ค๋น๋์ด์ผ ํฉ๋๋ค.
- ๋ฐฐํฌํ ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ์ ๋
ธ๋ ์ฐ๊ฒฐ
- ์ค๋งํธ ์ปจํธ๋ํธ ๋ฐฐํฌ ํธ๋์ญ์ ์ ๊ฒ์ฆํ๊ณ ์คํํ๊ธฐ ์ํด ์ฌ์ฉํ ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ ๋ ธ๋๋ฅผ ์ค์ ํฉ๋๋ค.
- ๋ฐฐํฌ ํธ๋์ญ์
์ ์คํํ EOA
- ์ค๋งํธ ์ปจํธ๋ํธ ๋ฐฐํฌ ํธ๋์ญ์ ์ ์คํํ ๊ณ์ ์ผ๋ก ๋ฐฐํฌ์ ํ์ํ ABI, ๋ฐ์ดํธ์ฝ๋ ๋ฑ์ ์ด์ฉํด ํธ๋์ญ์ ์ ๋ง๋ค๊ณ ์คํํฉ๋๋ค.
- ๋ฐฐํฌ ํธ๋์ญ์
์์๋ฃ
- ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ์์ ํธ๋์ญ์ ์ ์คํํ๊ธฐ ์ํด ์์๋ฃ์ธ ๊ฐ์ค๋น๋ฅผ ์ง๋ถํด์ผ ํฉ๋๋ค.
๋ณธ ํํ ๋ฆฌ์ผ์์๋ ์ด๋๋ฆฌ์ Holesky ๋คํธ์ํฌ์ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํ๊ณ ํธ์ถํด๋ณด๋ ๊ณผ์ ์ ์งํํด ๋ณด๊ฒ ์ต๋๋ค!
๋
ธ๋ ์ฐ๊ฒฐํ๊ธฐ
๋จผ์ ์ค๋งํธ ์ปจํธ๋ํธ ๋ฐฐํฌ ํธ๋์ญ์ ์ ์ ์กํ๊ธฐ ์ํ ๋ ธ๋๋ฅผ ์ค๋นํด์ผ ํฉ๋๋ค. ์ง์ ๋ ธ๋ ํด๋ผ์ด์ธํธ๋ฅผ ์คํํ์ฌ ๋ ธ๋๋ฅผ ์ด์ํ๊ฑฐ๋, ๋ ธ๋ Provider ์๋น์ค๋ฅผ ์ด์ฉํ์ฌ ๋ ธ๋ Endpoint๋ฅผ ํ๋ํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์์ ์ ์ธ Node Provider Service ์ค ํ๋์ธ Nodit์ ์ด์ฉํด ์ด๋๋ฆฌ์ Holesky์ ๋ ธ๋๋ฅผ ์ฝ๊ณ ๊ฐํธํ๊ฒ ์ฐ๊ฒฐํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์๋ ๋งํฌ๋ฅผ ํด๋ฆญํด Nodit ์ฝ์ ํ์๊ฐ์ ๋ฐ ์จ๋ณด๋ฉ ๋ฐฉ๋ฒ์ ํ์ธํด ๋ณด์ธ์!
ํ์๊ฐ์ ๋ฐ ์จ๋ณด๋ฉ์ ์๋ฃํ๋ค๋ฉด ์ฝ์์์ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์ฐ๊ฒฐํ ์ ์๋ ๋ ธ๋๋ฅผ ํ์ธํ ์ ์๊ณ [HTTPS Endpoint] ๋ฒํผ์ ํด๋ฆญํด ํน์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
๋ง์ฝ ์ฐ๊ฒฐํ๋ ค๋ ๋ ธ๋๊ฐ ์๋ค๋ฉด ์ข์ธก ๋ฉ๋ด์ [Nodes] ํญ์ ํด๋ฆญํด ์ฐ๊ฒฐํ ์ ์๋ ๋ ธ๋๊ฐ ๋ฌด์์ด ์๋์ง ํ์ธํด ๋ณด์ธ์!
ํธ๋์ญ์
์ ์คํํ EOA ์์ฑ
Metamask๋ฅผ ์ด์ฉํ EOA ์์ฑ ๋ฐฉ๋ฒ
Metamask๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ ๋จผ์ Metamask๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค. ์๋ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ์ค์น ๋ฐฉ๋ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- [Metamask ์ค์น ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ(https://developer.nodit.io/docs/web3-development-setup#wallets)
์ค์น๊ฐ ์๋ฃ๋์๋ค๋ฉด Nodit ์ฝ์์ ๋ก๊ทธ์ธํ์ฌ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ํ๋ก์ ํธ์ ์ ๊ทผํฉ๋๋ค.
[ํ๋ก์ ํธ Overview] ํ๋ฉด์์ [Connected Nodes] ์์ญ์์ ์ด๋๋ฆฌ์ Holesky ๋ฐ์ค์ [Metamask] ๋ฒํผ์ ํด๋ฆญํ์ฌ ์์ฝ๊ฒ Metamask์ ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ๋ฅผ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉฐ Wallet ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋๋ผ ์ง์ ์ ์ผ๋ก ๋ ธ๋์ ์ฐ๊ฒฐํ๊ณ ์ถ๋ค๋ฉด [HTTPS Endpoint] ๋ฒํผ์ ํด๋ฆญํ์ฌ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
๋ง์ฝ Nodit ์ฝ์์์ ์ด๋๋ฆฌ์ Holesky ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ์ง ์์ ๊ฒฝ์ฐ, ์ข์ธก ๋ฉ๋ด ์ค [Nodes] ํญ์ ํด๋ฆญํ์ฌ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ EOA ์์ฑ ๋ฐฉ๋ฒ
Metamask์ ๊ฐ์ด Wallet ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ์ง ์๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด EOA๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ์๋ ๋ช ๋ น์ด๋ฅผ ํฐ๋ฏธ๋์ ์ ๋ ฅํ์ฌ ethers.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
$ npm install ethers
ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์์ TS ํ์ผ์ ์์ฑํ ํ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์คํํ๋ฉด Wallet ๊ฐ์ฒด๋ฅผ ๋ฐํ๋ฐ์ ์ ์์ต๋๋ค.
// createEoa.ts
import { ethers } from "ethers";
const myWallet = ethers.Wallet.createRandom();
console.log(myWallet);
$ ts-node createEoa.ts
//response
Wallet {
_isSigner: true,
_signingKey: [Function (anonymous)],
address: '0xc675Dda1d2d545E20AAC8640f2BaA402D8a05887',
_mnemonic: [Function (anonymous)],
provider: null
}
Metamask๋ก ์์ฑํ ๊ณ์ ์์ ๋๋ชจ๋์ ์ถ์ถํด ์ด์ฉํ ์๋ ์์ต๋๋ค! ์๋ ์ฌ์ง์ ๋ฐ๋ผ ๋๋ชจ๋์ ์ถ์ถํ ์ ์์ต๋๋ค.
๋๋ชจ๋๊ณผ Private Key๋ ์ ๋ ์ ์ถ๋์ง ์์์ผ ํฉ๋๋ค!
๋๋ชจ๋์ด๋ Private Key๊ฐ ์ ์ถ๋ ๊ฒฝ์ฐ ํด๋น ๊ณ์ ์ด ๋ณด์ ํ ๋ชจ๋ ์์ฐ์ ๊ถํ์ ํ์ทจ๋นํ ์ ์์ผ๋ฏ๋ก ์ ๋ ์ ์ถ๋์ง ์๋๋ก ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ์์ ํ๊ฒ ํํ ๋ฆฌ์ผ์ ์งํํ๊ธฐ ์ํด ํํ ๋ฆฌ์ผ์ฉ EOA๋ฅผ ์๋ก ์์ฑํด ์งํํ๋ ๊ฒ์ ๊ถ์ฅ ๋๋ฆฝ๋๋ค.
- Metamask๋ฅผ ์ผ๊ณ ์ฐ์ธก ์๋จ์ ๋ฉ๋ด๋ฅผ ํด๋ฆญํฉ๋๋ค.
- ๋ฉ๋ด ์ค Settings์ ํด๋ฆญํฉ๋๋ค.
- Security & privacy ๋ฉ๋ด๋ฅผ ํด๋ฆญํฉ๋๋ค.
- Security ํญ์์ [Reveal Secret Recovery Phrase] ๋ฒํผ์ ํด๋ฆญํด ๋๋ชจ๋์ ์ถ์ถํฉ๋๋ค.
์ดํ ์ถ์ถํ ๋๋ชจ๋์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋์ ์ฒจ๋ถํ์ฌ Metamask ๊ณ์ ์ ์ฝ๋์ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.
const mnemonic = "your_mnemonic_words"
const walletFromMnemonic = ethers.Wallet.fromMnemonic(mnemonic);
ํธ๋์ญ์
์์๋ฃ ๋ฐ๊ธฐ
์ด์ ๋ธ๋ก์ฒด์ธ ๋ ธ๋์ EOA๊ฐ ์ค๋น๋์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ํธ๋์ญ์ ์คํ ์ ํ์ํ ์์๋ฃ์ธ ๊ฐ์ค๋น๋ง ์์ผ๋ฉด ํธ๋์ญ์ ์ ์คํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ Faucet์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ ์ธํฐ๋ท์์ โEthereum Holesky faucetโ์ ๊ฒ์ํด ๋ค์ํ Faucet ์ ๊ณต์์ ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
์ค๋งํธ ์ปจํธ๋ํธ ๋ฐฐํฌ
์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ํ ๋ชจ๋ ์ค๋น๊ฐ ์๋ฃ๋์์ต๋๋ค! ์ด์ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ์ด๋๋ฆฌ์ Holesky์ ๋ฐฐํฌํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Ethers.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด EOA๋ฅผ ์์ฑํ ๋ค ํด๋น EOA๋ฅผ ์ด์ฉํด ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํ๋ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฐ์ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ์ปดํ์ผํ๊ณ ๋ฐํ๋ฐ์ ABI์ bytecode๋ฅผ ๋ณ๋์ ํ์ผ๋ก ์ ์ฅํด ๊ด๋ฆฌํฉ๋๋ค.
// data.ts
export const abi = [
{
inputs: [],
stateMutability: "nonpayable",
type: "constructor",
},
...
];
export const bytecode = "your_bytecode";
Ethers.js๋ฅผ ์ด์ฉํด ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
//deployContract.ts
import { ethers } from "ethers";
import { abi, bytecode } from "./data";
const provider = new ethers.providers.JsonRpcProvider(
"https://ethereum-holesky.nodit.io/your_node_api_key"
);
const mnemonic = "your_memonic_words";
const accountFromMnemonic = ethers.Wallet.fromMnemonic(mnemonic);
const connectWalletToProvider = accountFromMnemonic.connect(provider);
const contractFactory = new ethers.ContractFactory(
abi,
bytecode,
connectWalletToProvider
);
(async () => {
try {
const deployingContract = await contractFactory.deploy();
await deployingContract.deployed();
console.log(deployingContract.address);
} catch (error) {
console.error(error);
}
})();
์ฝ๋์ ์์ธํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Nodit์ด ์ ๊ณตํ๋ ์ด๋๋ฆฌ์ Holesky ๋ ธ๋๋ฅผ HTTP Endpoint๋ฅผ ์ด์ฉํ์ฌ ์ฐ๊ฒฐํ ์ ์๋ provider ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
const provider = new ethers.providers.JsonRpcProvider(
"https://ethereum-holesky.nodit.io/your_node_api_key"
);
๋๋ชจ๋ ๋จ์ด๋ค์ ์ด์ฉํด Wallet ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ provider ์ธ์คํด์ค๋ฅผ ์ด์ฉํด ์ด๋๋ฆฌ์ Holesky ๋ ธ๋์ ์ฐ๊ฒฐํ์ฌ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
const mnemonic = "your_memonic_words";
const accountFromMnemonic = ethers.Wallet.fromMnemonic(mnemonic);
const connectWalletToProvider = accountFromMnemonic.connect(provider);
ABI์ bytecode ๊ทธ๋ฆฌ๊ณ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ์ง๊ฐ์ ์ด์ฉํด ์ปจํธ๋ํธ ๋ฐฐํฌ ํธ๋์ญ์ ์ ํนํ๋ ContractFactory ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
const contractFactory = new ethers.ContractFactory(
abi,
bytecode,
connectWalletToProvider
);
์ฆ์์คํํจ์๋ฅผ ์ด์ฉํ์ฌ ์ปจํธ๋ํธ ๋ฐฐํฌ ํจ์๋ฅผ ์์ฑํฉ๋๋ค. contractFactory์ deploy ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํ ์ ์์ผ๋ฉฐ deployed ๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ ์์์ ๋ฐฐํฌ๊ฐ ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํฉ๋๋ค. console.log๋ฅผ ์ด์ฉํด ๋ฐฐํฌ๊ฐ ์๋ฃ๋ ํ ์ปจํธ๋ํธ์ ์ฃผ์๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
(async () => {
try {
const deployingContract = await contractFactory.deploy();
await deployingContract.deployed();
console.log(deployingContract.address);
} catch (error) {
console.error(error);
}
})();
ํฐ๋ฏธ๋์ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํด ๋ณด์ธ์! ๊ทธ๋ฆฌ๊ณ Etherscan์์ ์ปจํธ๋ํธ ์ฃผ์๋ฅผ ๊ฒ์ํด ๋ณด์ธ์!
$ts-node deployContract.ts
์ค๋งํธ ์ปจํธ๋ํธ ํธ์ถ
๋ฐฐํฌ๋ ์ค๋งํธ ์ปจํธ๋ํธ์ ํจ์๋ฅผ ํธ์ถํด ๊ฒฐ๊ณผ๊ฐ ํ ์คํธ์์ ์งํํ ๋ด์ฉ๊ณผ ๋์ผํ์ง ํ์ธํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ฐฐํฌํ ์ปจํธ๋ํธ์ ์์ฑ๋ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- getMessage
- ํ์ฌ ๋ฉ์์ง๋ฅผ ์กฐํํ๋ค.
- setMessage
- ํ์ฌ ๋ฉ์์ง๋ฅผ ์ ๋ ฅํ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
- initMessage
- ํ์ฌ ๋ฉ์์ง๋ฅผ ๋น string ๋ฌธ์์ด๋ก ์ด๊ธฐํํ๋ค.
- ํ์ฌ ๋ฉ์์ง๋ฅผ ๋น string ๋ฌธ์์ด๋ก ์ด๊ธฐํํ๋ค.
๋ฐฐํฌ ์ constructor ํจ์์์ โHello World! This is Nodit!โ ์ด๋ผ๋ ๋ฌธ์์ด์ ํ์ฌ ๋ฉ์์ง๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์ getMessage ํจ์๋ฅผ ํธ์ถํ์ ๋ ๋์ผํ ๋ฉ์์ง๊ฐ ๋ฐํ๋์ด์ผ ํฉ๋๋ค.
getMessage ํธ์ถ
getMessage๋ฅผ ํธ์ถํ๋ ์ ์ฒด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
//getMessage.ts
import { ethers } from "ethers";
import { abi, bytecode } from "./data";
const provider = new ethers.providers.JsonRpcProvider(
"https://ethereum-holesky.nodit.io/your_nodit_api_key"
);
const contractAddress = "your_contract_address";
(async () => {
try {
const contract = new ethers.Contract(contractAddress, abi, provider);
const getMessage = await contract.getMessage();
console.log(getMessage);
} catch (error) {
console.error(error);
}
})();
์ปจํธ๋ํธ์ ์ฃผ์์ abi ๊ทธ๋ฆฌ๊ณ ๋ ธ๋์์ ์ฐ๊ฒฐ์ ์ํด provider ์ธ์คํด์ค๋ฅผ ์ด์ฉํด ์๋ก์ด Contract ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
const contract = new ethers.Contract(contractAddress, abi, provider);
Contract ์ธ์คํด์ค๋ abi์ ์ปจํธ๋ํธ ์ฃผ์๋ก ํน์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ํด๋น ์ปจํธ๋ํธ์ ์์ฑ๋ ํจ์๋ฅผ ํน์ ํ ์ ์์ต๋๋ค. ์ค๋งํธ ์ปจํธ๋ํธ์ ์์ฑ๋ ํจ์์ ๋์ผํ ์ด๋ฆ์ผ๋ก ์ํ๋ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
const getMessage = await contract.getMessage();
console.log(getMessage);
์ด์ ํด๋น ์ฝ๋๋ฅผ ์คํํด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด ๋ณด์ธ์! constructor ํจ์์ ์ ๋ ฅํ ๋ฉ์์ง์ ๋์ผํ ๋ฉ์์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค!
$ ts-node getMessage.ts
Hello World! This is Nodit!
setMessage ํธ์ถ
setMessage ํจ์๋ฅผ ํธ์ถํ๋ ์ ์ฒด ์ฝ๋ ์ญ์ getMessage ํจ์ ํธ์ถ ์ฝ๋์ ์ ์ฌํ๊ฒ ์์ฑํด ์คํํ ์ ์์ต๋๋ค.
//setMessage.ts
import { ethers } from "ethers";
import { abi, bytecode } from "./data";
const provider = new ethers.providers.JsonRpcProvider(
"https://ethereum-holesky.nodit.io/your_nodit_api_key"
);
const contractAddress = "your_contract_address";
const mnemonic =
"your_mnemonic_words";
const accountFromMnemonic = ethers.Wallet.fromMnemonic(mnemonic);
const connectWalletToProvider = accountFromMnemonic.connect(provider);
(async () => {
try {
const contract = new ethers.Contract(
contractAddress,
abi,
connectWalletToProvider
);
const setMessage = await contract.setMessage(
"Nodit is one of the best Node Provider Service in the world!"
);
await setMessage.wait();
} catch (error) {
console.error(error);
}
})();
์์ ์ค๋ช ํ ๊ฒ๊ณผ ๊ฐ์ด ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ provider ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ์ด์ฉํด Wallet ์ธ์คํด์ค๋ฅผ ๋ ธ๋์ ์ฐ๊ฒฐํด ์ด์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
const provider = new ethers.providers.JsonRpcProvider(
"https://ethereum-holesky.nodit.io/your_nodit_api_key"
);
const contractAddress = "your_contract_address";
const mnemonic =
"your_mnemonic_words";
const accountFromMnemonic = ethers.Wallet.fromMnemonic(mnemonic);
const connectWalletToProvider = accountFromMnemonic.connect(provider);
getMessage์ ๊ฐ์ด Contract ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์ธ์๋ก provider ์ธ์คํด์ค๊ฐ ์๋ provider๊ฐ ์ฐ๊ฒฐ๋ Wallet ์ธ์คํด์ค๋ฅผ ์ ๋ ฅํฉ๋๋ค.
const contract = new ethers.Contract(
contractAddress,
abi,
connectWalletToProvider
);
์ธ์๋ก ๋ณ๊ฒฝํ ๋ฉ์์ง๋ฅผ ์ ๋ ฅํ๊ณ Contract ์ธ์คํด์ค๋ฅผ ์ด์ฉํด setMessage๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํธ๋์ญ์ ์คํ ํ ํธ๋์ญ์ ์ด ์ฒ๋ฆฌ๋ ๋ ๊น์ง ๋๊ธฐํฉ๋๋ค.
const setMessage = await contract.setMessage(
"Nodit is one of the best Node Provider Service in the world!"
);
await setMessage.wait();
์ฝ๋๋ฅผ ์คํํด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด ๋ณด์ธ์! setMessage ํธ๋์ญ์ ์ ๋ํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
ts-node setMessage.ts
๊ทธ๋ฆฌ๊ณ ๋ค์ getMessage๋ฅผ ํธ์ถํด ๋ฉ์์ง๋ฅผ ํ์ธํด ๋ณด์ธ์. ๋ฉ์์ง๊ฐ ๋ณ๊ฒฝ๋๊ฒ ๋ณด์ด์๋์?
Nodit is one of the best Node Provider Service in the world!
initMessage ํธ์ถ
๋ง์ง๋ง์ผ๋ก initMessage ํจ์๋ฅผ ํธ์ถํด ํ์ฌ ์ ์ฅ๋ ๋ฌธ์์ด์ ์ด๊ธฐํ ํฉ๋๋ค. initMessage์ ๊ฒฝ์ฐ, setMessage์ ๋ง์ฐฌ๊ฐ์ง๋ก ํธ๋์ญ์ ์ ์ด์ฉํด ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ๋์ผํ ์ฝ๋๋ก ์คํํ ์ ์์ต๋๋ค.
// initMessage.ts
import { ethers } from "ethers";
import { abi, bytecode } from "./data";
const provider = new ethers.providers.JsonRpcProvider(
"https://ethereum-holesky.nodit.io/your_nodit_api_key"
);
const contractAddress = "your_contract_address";
const mnemonic =
"your_mnemonic_words";
const accountFromMnemonic = ethers.Wallet.fromMnemonic(mnemonic);
const connectWalletToProvider = accountFromMnemonic.connect(provider);
(async () => {
try {
const contract = new ethers.Contract(
contractAddress,
abi,
connectWalletToProvider
);
const initMessage = await contract.initMessage();
await initMessage.wait();
} catch (error) {
console.error(error);
}
})();
์์ ๊ฐ์ด ์์ฑํ ํ ํ์ผ์ ์คํํด ๋ฉ์์ง๋ฅผ ์ด๊ธฐํ ํด ๋ณด์ธ์! ๊ทธ๋ฆฌ๊ณ getMessage๋ฅผ ์ด์ฉํด ๊ฐ์ ํ์ธํด ๋ณด์ธ์!
์ง๊ธ๊น์ง ๊ฐ๋จํ ์ปจํธ๋ํธ๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ์ ๋ฐฐํฌํ๊ณ ์ค์ ํธ์ถํด ๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด์์ต๋๋ค. ๋ธ๋ก์ฒด์ธ์์ ์ค๋งํธ ์ปจํธ๋ํธ๊ฐ ์ด๋ป๊ฒ ๋์ํ๊ณ ์ฌ์ฉํ ์ ์๋์ง ์ดํด๊ฐ ๋์ จ๋์?
๋ค์ ํํ ๋ฆฌ์ผ์์๋ Nodit์์ ์ ๊ณตํ๋ API๋ฅผ ์ด์ฉํด ์ด๋ฒ ํํ ๋ฆฌ์ผ์ ์งํํ๋ฉฐ ๋ฐ์ํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด ํ์ธํด ๋ณด๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
Updated 29 days ago