[Blockchain] 언어별 web3 차이로 트랜잭션 해시값 차이

2023. 8. 8. 13:47·개발/BlockChain
728x90
반응형

1. 문제 및 해결

클라이언트(flutter)에서 트랜잭션 사인 -> 백엔드(nodejs)에서 트랜잭션 해시값 send

위 과정에서 evm에 트랜잭션을 보내는 처리가 실패했다.

처음엔 flutter에서 트랜잭션을 잘못 생성했다고 생각하여 abi등 꼼꼼하게 확인했지만 이상이 없었다.

 

문제는 type2 트랜잭션의 문제였다.

 

evm 트랜잭션의 타입

(1) type1

gas price를 설정하여 네트워크가 바쁠때는 높은 gas price부터 빠르게 처리한다.

 

트랜잭션 예시(nodejs)

const tx = {
  to: to,
  value: parsedEthAmount,
  gasPrice: ethers.utils.parseUnits("20", "gwei"),
  gasLimit: ethers.utils.parseUnits("2100000", "wei"),
  chainId: 1337,
  nonce: nonce,
};

(2) type2

base fee가 네트워크의 혼잡도에 따라 자동으로 조정된다.

사용자는 gas price대신 maxPriorityFeePerGas, maxFeePerGas를 설정하여 트랜잭션의 수수료와 우선순위를 결정한다.

 

트랜잭션 예시(nodejs)

const tx = {
  to: to,
  value: parsedEthAmount,
  maxPriorityFeePerGas: ethers.utils.parseUnits("20", "gwei"),
  maxFeePerGas: ethers.utils.parseUnits("50", "gwei"),
  gasLimit: ethers.utils.parseUnits("2100000", "wei"),
  type: 2,
  chainId: 1337,
  nonce: nonce,
};

nodejs 에서 type2일 경우 객체 생성시 명시해주기 때문에 괜찮지만

flutter에서는 type을 명시해주는 파라미터가 없었다.

 

이 부분이 다르다는걸 인지한 후에 ethersjs에서 어떻게 type을 구별하는지 확인했다.

 

먼저 transaction hash값을 arrayfi라는 함수를 이용하여 앞에 '0x' 제거 후 8비트씩 쪼개서 Uint8 Array로 만든다.

그 후 첫번째 배열에 담긴값으로 type을 결정한다.

아래는 ethersjs에서 첫번째 배열의 값으로 type을 분기처리하는 switch문이다.

// Typed Transaction (EIP-2718)
switch (payload[0]) {
    case 1:
        return _parseEip2930(payload);
    case 2:
        return _parseEip1559(payload);
    default:
        break;
}

프로젝트에서는 type2로 트랜잭션을 만들기 때문에 transaction hash의 앞에 8비트가 2가 되어야 한다.

flutter에서 signTransaction api를 사용하면 0x도 붙어있지 않은 tranaction hash값이 나온다.

그렇기 때문에 flutter에서 만든 transaction hash값에 0x02를 앞에 붙여서 type2라는 것을 명시해주면서 해결했다.

 

728x90
반응형

'개발 > BlockChain' 카테고리의 다른 글

[BlockChain] gasPrice 상승 이슈  (1) 2023.12.05
[Blockchain] Klaytn WebSocket 끊김 후 재연결 (spring boot)  (0) 2023.08.15
[Blockchain] web3j 에서 nonce값 동시성 해결  (3) 2023.08.07
[BlockChain] EIP 55란?  (0) 2023.07.18
[BlockChain] 코인과 토큰의 차이  (0) 2023.02.06
'개발/BlockChain' 카테고리의 다른 글
  • [BlockChain] gasPrice 상승 이슈
  • [Blockchain] Klaytn WebSocket 끊김 후 재연결 (spring boot)
  • [Blockchain] web3j 에서 nonce값 동시성 해결
  • [BlockChain] EIP 55란?
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프로그래머스
    js
    React
    html
    go
    컨테이너
    go언어
    블록체인
    node
    erc20
    mysql
    ERC721
    30일 챌린지
    명령어
    nodejs
    node.js
    CSS
    도커
    하이퍼레저
    30일챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[Blockchain] 언어별 web3 차이로 트랜잭션 해시값 차이
상단으로

티스토리툴바