블록체인/Dapp ◾ 이더리움 ◾ solidity

[smart contract] web3 설정

문앵 2022. 2. 28. 03:08

web3란?

front단에서 스마트컨트랙트를 읽어올 수 있도록 만들어주는 라이브러리.

 

설치 및 사용하기

1. 라이브러리 설치

npm install web3 web3-utils // 두가지 패키지를 설치합니다

 

2. front단에서 폴더생성

[src] > (src폴더 내부에 생성)[ contracts ] > (contracts 폴더  내부에 생성)[ index.ts ]

 

3. index.ts

import { AbiItem } from 'web3-utils';

const mintOcnAbi: AbiItem[] // mintOcnAbi의 타입은 배열이라는 뜻
const saleOcnAbi: AbiItem[]

abi란 우리가 만든 스마트컨트랙트의 인터페이스가 정의된 파일. (설명서라고 할 수 있다)

그중에서 type을 가지고 있는 것이 abiitem이다.

 

4. AbiItem 가져오기

리믹스로 간다.

내가 짠 컨트랙트 파일을 컴파일 하면 밑에 contract 칸이 생긴다. 그 밑에 abi를 복사할 수 있는 버튼이 있다.

 

 

-> 컨트랙트는 내가 컴파일 하고자 하는 컨트랙트 각각 해주면 된다.

그럼 각각의 abi가 나오고, 그걸 작성하던 index.ts 파일에 써줄 것이다.

 

 

 

 

 

 

 

5. index.ts

import { AbiItem } from 'web3-utils';

const mintOcnAbi: AbiItem[] = [// 여기에 카피 내용을 복붙해주면 된다]
const saleOcnAbi: AbiItem[] = [// 여기도 마찬가지]

 

 

6. address 가져오기

address는 빌드를 해야 나온다. 

리믹스로 가서 deploy 페이지로 간다 (세번째 아이콘)

environment를 london -> InjectedWeb3로 바꿔준다. InjectedWeb3를 눌러주면 metaMask와 연결하도록 되어있다.

원하는 계정을 누르고 연결해준다.

 

이후에 원하는 스마트컨트랙트를 선택해주고 deploy해준다. 

- 메타마스크에서 서명이 일어나고 confirm을 눌러주면 deploy 성공이다.

이제 이 contract는 실제 테스트 네트워크에 올라가있는 smart contract가 된다.

 

 

 

 

 

 

 

 

 

=> 여기 deployed contracts 밑에

MINT~ 나오는 주소를 복사해주면 된다.

가져와야 하는 주소는 컨트랙트별로 각각 deploy해줘야한다.

 

 

 

 

 

 

7. index.ts 

deploy해서 나온 address를 입력해준다.

 

import { AbiItem } from 'web3-utils';

const mintOcnAbi: AbiItem[] = [];
const saleOcnAbi: AbiItem[] = [];

const mintOcnAddress = "//여기에 복사된 주소를 넣는다.";
const saleOcnAddress = "//마찬가지"

 

 

8. web3 연결하기

index.ts >

import Web3 from "web3";

 

 

❣️❣️ window 객체에 metamask를 설치해주면 ethereum이라는 오브젝트가 생성된다.

그런데 리액트가 이것을 인지하지 못한다.

type-script에서는 react-app-env.d.ts 파일에서 이 ethereum의 타입을 강제 지정 해줌으로써, 리액트가 이를 인지할 수 있도록 해준다

react-app-env.d.ts >

/// <reference types="react-scripts"/>

interface Window {
	ethereum: any;
}

 

9. index.ts > 

 

import Web3 from "web3";

export const web3 = new Web3(window.ethereum);

export const mintOcnContract = new web3.eth.Contract(
	// 두가지 인자 필요 1.abi 2.address
    mintOcnAbi,
    mintOcnAddress
);

export const saleOcnContract = new web3.eth.Contract(
	saleOcnAbi,
    saleOcnAddress
)

 

 

10. 메타마스크랑 연결해주기

app.js (실습에서는 ts 파일로 했음.) >

const APP = ()=> {
	const [account,setAccount] = ""; // 메타마스크 계정 가져와서 담을 상태 생성
    
	// 메타마스크에서 계정 가져오기 함수
    const getAccount = async()=> { 
    	try{// try-catch를 이용
        	if(window.ethereum){ // 메타 마스크 설치 되어 있으면
                const accounts = await window.ethereum.request({ // 계정 가져오기
                    method : "eth_requestAccounts",
                });
            setAccount(accounts[0]); // 가져온 계정을 account 상태에 담아라
            }else{ // 설치 안되어있으면 alert 띄워라
            	alert("Please install MetaMask")
            }
        }
        catch(error){
        	console.error(error);
        }
    };
    
	useEffect(()=>{
    	getAccount();
    },[]);

 

 

 

 

 

 

반응형