본문 바로가기

[BLOCKCHAIN]

Opensea 클론코딩

Opensea란?

Opensea 에서는 수많은 NFT가 거래되고 있습니다. 오픈씨가 지원하는 체인은 이더리움, 폴리곤, 그리고 클레이튼이다.

오픈씨는 결제와 경매를 위해 Wrapped Coin을 사용하며,  ETH는 WETH, KLAY는 WKLAY의 형태로 같은 가치를 지닌 토큰 및 NFT를 생성해 거래를 하며, 개인간의 NFT 거래소이다.

 

 

 

1. react로 기본 뼈대만들기

NFT를 보여주기 위한 dApp 개발을 위한 리액트 뼈대를 설정

 

npx create-react-app web3-practice
code web3-practice

create-react-app 명령어가 적용되지 않는 문제점이 있었다.

다른곳에 리액트 5.0.0이 깔려있어서 그런 것인지, 기존의 다른곳에 설치된 리액트를 삭제. 결국엔 4.0.3 설치 함으로써 해결 할 수 있었다.

 

npm install -g create-react-app
npm add create-react-app
npx create-react-app --scripts-version 4.0.3 ...

 

참고링크:https://github.com/facebook/create-react-app/issues/11756

 

 

 

app.js

import './App.css';

function App() {
  return (
    <div className="App">
      
    </div>
  );
}

export default App;

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

 

 

2. 메타마스크 지갑 연결

이더리움 객체 가져오기

 

EIP-1139를 통해 지갑 소프트웨어는 웹 페이지에 자바스크립트 객체 형태로 window.ethereum 은 공급자 객체이기 때문에 web3.js를 사용할 수 있게 해준다.

 

먼저 web3 설치

npm install web3

공급자 객체 연결은 처음 한번만 하면 되기 때문에 useEffect()를 사용해 컴포넌트가 처음 마운트 되었을 때 web3 객체를 연결하도록 한다.

 

import {useState} from 'react';
import Web3 from 'web3';

function App() {
		const [web3, setWeb3] = useState();
    useEffect(() => {
        if (typeof window.ethereum !== "undefined") {. // window.ethereum이 있다면
            try {
                const web = new Web3(window.ethereum);  // 새로운 web3 객체를 만든다
                setWeb3(web);
            } catch (err) {
                console.log(err);
            }
        }
    }, []);
}

 

지갑 연결하기

"Connect to Metamask" 버튼을 만들어, 해당 버튼을 누르면 어플리케이션에 메타마스크 지갑을 연결하도록 한다

메타마스크 지갑을 연결하여, 메타마스크를 통해 web3를 사용한다

 

버튼을 생성, connectWallet()함수를 실행하는 이벤트를 추가

function App() {
	//...
    return (
        <div className="App">
            <button
                className="metaConnect"
                onClick={() => {
                    connectWallet();
                }}
            >
                connect to MetaMask
            </button>
        </div>
    );
}

connectWallet() 함수는 메타마스크로부터 계정을 연결하고, 계정 주소를 상태로 저장

window.ethereum.request({method: 'eth_requestAccounts'}) 는 메타마스크 지갑과 연결된 계정 정보를 받는 JSON-RPC Call API 입니다

 

function app() {
	const [account, setAccount] = useState('');
	// ...

	const connectWallet = async () => {
        accounts = await window.ethereum.request({
            method: "eth_requestAccounts",
        });

        setAccount(accounts[0]);
    };

	return (
        <div className="App">
            <button
                className="metaConnect"
                onClick={() => {
                    connectWallet();
                }}
            >
                connect to MetaMask
            </button>
            <div className="userInfo">주소: {account}</div>  // 연결된 계정 주소를 화면에 출력합니다
        </div>
    );
}

잔액 조회하기

"getBalance" 버튼을 만들어 메타마스크에 연결한 어카운트에 있는 잔고를 조회한다.
( +오픈씨와 같이 이더리움말고도 클레이튼도 보이게 추가해봐야겠다..)

function app() {
	const [balance, setBalance] = useState('');
	// ...

	const getBalance = async (address) => {
    	web3.eth.getBalance(address)
        .then((result) => {
        	setBalance(result)
            })
        }

	return (
        <div className="App">
           // ...
           <button className="metaConnect" onclick={() => {getBalance(account)}}>
           		getBalance
           </button>
    );
}

 

이렇게 했을경우 wei(이더리움 가장 작은 단위) 단위값 를 반환하게 되어 소수점 표현이 안된다.

 

setBalance(web3.utils.fromWei(result, "ether") + "ETH")

로 적용해주어 소수점까지 표현할 수 있게된다.

 

 

 

 

 

 

'[BLOCKCHAIN]' 카테고리의 다른 글

Solidity 패턴 분석 - State Machine  (0) 2022.06.09
solidity 패턴 분석 - Guard Check  (0) 2022.06.04
Truffle을 이용한 ERC-721 개발  (0) 2022.02.09
Mnemonic Wallet - 개발  (0) 2022.02.09
Mnemonic Wallet - 개발이론  (0) 2022.02.08