일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- rust 기초
- 컨트렉트 동일한 함수이름 호출
- 스마트 컨트렉트 함수이름 중복
- vue기초
- 스마트컨트렉트 함수이름 중복 호출
- 러스트기초
- erc4337
- ethers type
- chainlink 설명
- 계정추상화
- 스마트컨트렉트 예약어 함수이름 중복
- 오블완
- ethers websocket
- 머신러닝기초
- 스마트컨트렉트테스트
- 체인의정석
- SBT표준
- 러스트 기초 학습
- 컨트렉트 배포 자동화
- ethers v6
- ethers
- git rebase
- 러스트 기초
- erc4337 contract
- multicall
- ethers typescript
- ambiguous function description
- 티스토리챌린지
- Vue
- Vue.js
- Today
- Total
체인의정석
타입스크립트 백엔드와 스마트컨트렉트 연동하기 2) ABI와 CA 활용하여 트랜잭션 보내기 본문
일단 트랜잭션을 보내기 위해서는 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/
ethers js의 사이너 부분을 살펴보면 알 수 있다.
이 부분은
https://docs.ethers.io/v5/api/providers/jsonrpc-provider/
위의 문법을 써서 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
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기반 체인의 경우 가스리밋이 다를 수도 있으므로 그럴 땐 위의 설정값을 참고해서 하면 된다.
이렇게 하면 트랜잭션을 백엔드에서 보낼 수 있다.
이제 메타마스크, 백엔드에서 각각 트랜잭션 보내는것을 해보았는데 프로젝트 상황에 따라 양쪽을 선택하여 구현하면 된다.
'블록체인 > Ethers & web3' 카테고리의 다른 글
테스트 코드 작성에 문제가 없는데 에러가 날 경우? (예외 처리를 마무리 하지 않고 테스트할 경우 오류 발생가능) (0) | 2022.04.07 |
---|---|
hardhat + ether js 로 스마트컨트렉트 테스트 코드 작성할 때 알아야 할 3가지 대표 유형 (0) | 2022.03.03 |
타입스크립트 백엔드와 스마트컨트렉트 연동하기 1) ABI 가져오기 (타입스크립트로 모듈 만들기) (0) | 2022.02.22 |
hardhat에서 스마트컨트렉트 console 찍기 (0) | 2022.02.22 |
ether.js에서 0으로 들어가는 주소 및 값 테스트 하기 (0) | 2022.02.21 |