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라는 것을 명시해주면서 해결했다.
'개발 > BlockChain' 카테고리의 다른 글
[BlockChain] gasPrice 상승 이슈 (0) | 2023.12.05 |
---|---|
[Blockchain] Klaytn WebSocket 끊김 후 재연결 (spring boot) (0) | 2023.08.15 |
[Blockchain] web3j 에서 nonce값 동시성 해결 (0) | 2023.08.07 |
[BlockChain] EIP 55란? (0) | 2023.07.18 |
[BlockChain] 코인과 토큰의 차이 (0) | 2023.02.06 |