체인의정석

타입스크립트 백엔드와 스마트컨트렉트 연동하기 2) ABI와 CA 활용하여 트랜잭션 보내기 본문

블록체인/Ethers & web3

타입스크립트 백엔드와 스마트컨트렉트 연동하기 2) ABI와 CA 활용하여 트랜잭션 보내기

체인의정석 2022. 2. 23. 10:45
728x90
반응형

일단 트랜잭션을 보내기 위해서는 signer 객체를 생성해야 한다.

이는 hardhat.config.ts에 있는

module.exports = {
  networks: {
    hardhat: {
    },
    ropsten: {
      url: process.env.DEFAULT_ETHEREUM_ROPSTEN_RPC_URL,
      accounts: [process.env.TEST_PK]
    },

위와 같은 형태의 네트워크 설정값의 accounts에 넣어주면 된다. 해당 내용은

https://docs.ethers.io/v5/api/signer/

 

Signers

Documentation for ethers, a complete, tiny and simple Ethereum library.

docs.ethers.io

ethers js의 사이너 부분을 살펴보면 알 수 있다.

 

이 부분은 

https://docs.ethers.io/v5/api/providers/jsonrpc-provider/

 

JsonRpcProvider

Documentation for ethers, a complete, tiny and simple Ethereum library.

docs.ethers.io

위의 문법을 써서 provider를 지정해주고 provider에서 gest.Singer()를 해주면 된다.

const provider = new ethers.providers.JsonRpcProvider(process.env.DEFAULT_ETHEREUM_ROPSTEN_RPC_URL);

const signer = provider.getSigner();

이런식으로 signer를 가져오면 Contract 객체를 만들 수 있다.

일단 컨트렉트 배포시에 바로 상수값이 정의되면서 콘솔이 찍히게 바꾸어 두었다. 이를 활용하도록 하겠다.

export const ETHEREUM_ERC721_CONTRACT_ADDRESS = 주소값;
export const ETHEREUM_WERC721_CONTRACT_ADDRESS = 주소값;

이렇게 바로 로그에 찍히게 한 뒤 해당 내용을 그대로 가져와서 import 시킨다.

import { ETHEREUM_ERC721_CONTRACT_ADDRESS,ETHEREUM_WERC721_CONTRACT_ADDRESS } from "../ca_constant"

이렇게 2개와 signer까지 지정해 주었으니 이제 컨트렉트 객체를 만들 수 있다.

 

https://docs.ethers.io/v4/api-wallet.html

 

Wallets and Signers — ethers.js 4.0.0 documentation

The Wallet implements the Signer API and can be used anywhere a Signer is expected and has all the required properties. Encrypted JSON Wallets Many systems store private keys as encrypted JSON wallets, in various formats. There are several formats and algo

docs.ethers.io

singer의 경우 설정값에 프라이빗키를 넣고 npx hardhat을 하면 될 줄 알았는데 되지 않았다.

따라서 wallet 객체를 만들어서 하는 방법을 채택해야 한다.

 

해당 내용은 ethers 4버전 (위링크)에 나와있는데 5버전은 예제 코드가 불친절하니 example을 보고 익히기 위해서는 4버전 문서도 왔다갔다 해야 하는것 같다.

 

const provider = new ethers.providers.JsonRpcProvider(process.env.MAINNET_RPC_URL);
const pk = process.env.TEST_PK!; //!는 undeifined가 아니라는 확신이있는것
const wallet = new ethers.Wallet(pk, provider);

.
.
.

  const erc721 = new ethers.Contract(
    CONTRACT_ADDRESS, //모듈화 한 후 가져오기
    ExampleERC721ABI, // 모듈화 한 후 가져오기
    wallet,
  );
  let tokenId = 1;

  const tx_mint = await erc721.mint(
    '0x778F7f786cE1070Bfb8d8A4a2A0A8fc4F2A05BEa', //to 주소
    tokenId, 
    {
      gasLimit: '0x0000000', //가스리밋 (이더리움이 아닌 다른 체인에서 지정해야 할 경우)
      gasPrice: '0x0000000' //가스프라이스 (이더리움이 아닌 다른 체인에서 지정해야 할 경우)
    }
  );

  // wait for the transaction to be mined
  const receipt_mint = await tx_mint.wait();
  console.log('receipt >>', receipt_mint);

다음과 같이 지정하면 트랜잭션을 보낼 수 있다.

 

나는 현재 하는 체인이 이더리움 테스트넷이 아니므로 가스리밋이나 프라이스를 지정해 주었는데.

오류를 찾아보니 폴리곤도 이러한 설정을 해주어야 하는 경우가 과거에 있었던것 같다. (지금은 모르겠다.)

아무튼 evm기반 체인의 경우 가스리밋이 다를 수도 있으므로 그럴 땐 위의 설정값을 참고해서 하면 된다.

 

이렇게 하면 트랜잭션을 백엔드에서 보낼 수 있다.

 

이제 메타마스크, 백엔드에서 각각 트랜잭션 보내는것을 해보았는데 프로젝트 상황에 따라 양쪽을 선택하여 구현하면 된다.

728x90
반응형
Comments