[eth.getTransaction]ERC20 토큰 이체 value 알아내기 / input data value 0
본문 바로가기
Block Chain

[eth.getTransaction]ERC20 토큰 이체 value 알아내기 / input data value 0

by 쏠수있어ㅤ 2022. 4. 3.
반응형

[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으로 나온다! 

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

 

반응형

댓글