[eth.getTransaction]ERC20 토큰 이체 value 알아내기 / input data value 0
이더리움 Explore 구현 중에 이더리움 transfer, 이체를 한 트랜잭션 hash를 사용하여 eth.getTransaction('TxHash')으로 얻은 정보들 중 value에 얼마의 이더리움을 이체했는지 나온다.
마지막 row에 value = 0.1 로 표시되어 있다. 해당 트랜잭션은 from에 해당하는 계정(EOA) 으로부터 to에 해당하는 계정으로 0.1개의 이더리움을 이체한 것이다. (테스트넷에 있는 랜덤 트랜잭션을 가져옴)
그런데 테스트넷에 ERC20 토큰을 배포하여 이를 다른 계정으로 이체했을 때 이상하게 value가 항상 0으로 나온다!
찾다가 이는 getTransaction('txHash') 에 나오는 정보 중, input 값 데이터 안에서 뽑아 내야 한다는 것을 알게 되었다.
ERC20 토큰 이체를 한다. 만든 TTK 토큰의 10.10개를 account1 -> account2로 이체하고
트랜잭션 해시를 이용하여 getTransaction() 정보 얻는다.
const txData = await web3.eth.getTransaction('0xa9fb062e9124e0a9aa3be4f25297353e90c6e045e1d74720c82d037bbdad1f9d');
console.log('txDat a=', txData);
console.log('txData, input ===', txData.input);
** 여기서 그냥 내가 궁금했던 점
A계정에서 B계정으로 ETH 이더리움을 이체하면 getTransaction에서 나오는 정보 중, from, to가 A, B로 항상 나오다가 ERC20 토큰 이체할 경우에는 from 은 보내는 주소 이지만 to는 받는 주소가 아닌 스마트 컨트랙트의 주소가 나와서 의아했다. 찾아보니 우리는 스마트 컨트랙트(해당 이체하는 ERC20토큰 발행 CA) 와 interacting 하기 때문에 to 값은 해당 토큰의 스마트컨트랙트 주소로 나온다고 한다.
다시 돌아와서 getTransaction()으로 얻은 정보의 input 값 👇
0xa9059cbb00000000000000000000000075098deea500cf04d85d4b68060e94b77bffc14d0000000000000000000000000000000000000000000000008c2a687ce7720000
위의 input값을 아래처럼 나눠본다
0xa9059cbb
00000000000000000000000075098deea500cf04d85d4b68060e94b77bffc14d
0000000000000000000000000000000000000000000000008c2a687ce7720000
세개의 16진수 값으로 나뉜다. 무슨 의미인지 정리를 해보면
첫 번째 "0xa9059cbb" 는 모든 ERC20 contracts으로 만들어진 토큰 이체의 경우 항상 같은 값이다.
두 번째 "0 ~ 14d" 값은 받는이의 주소 -> 하지만 EOA 주소는 항상 "0x"으로 시작된다. 여기에 0을 모두 지우고 "0x" + "7509~14d" 를 합치면 받는이의 주소가 나온다.
세 번째 "0~7720000" 는 이체된 금액이다 .
이제 세 번째의 정보를 이용해서 얼마의 토큰을 이체했는지 값을 알 수 있다.
이체된 금액을 hex -> dec로 바꾸기 위해 hex2dec 설치
https://www.npmjs.com/package/hex2dec
const txData = await web3.eth.getTransaction('0xa9fb062e9124e0a9aa3be4f25297353e90c6e045e1d74720c82d037bbdad1f9d');
console.log('txDat a=', txData);
console.log('txData, input ===', txData.input);
console.log('receiver =', `0x${txData.input.slice(34, 74)}`);
console.log('amount =', Converter.hexToDec(txData.input.slice(74)));
잘 나온다. !
GOOOOOD
Reference : https://berndstrehl.medium.com/parsing-an-erc20-transfer-with-javascript-from-the-eth-api-2790da37e55f
댓글