본문 바로가기
Blockchain/caver-js

[caver-js] PalaSquare NFT 거래 데이터 수집 (2)

by Toritol 2022. 12. 27.
728x90

출처 : https://docs.pala.world/master/pala-assets

 

 지난 글에서는 caver-js의 caver.rpc.klay.getLogs() 함수를 통해, PalaSquare에서 이루어지는 NFT 거래 정보를 출력하는 것까지 살펴봤습니다. 하지만 아래의 결과와 같이 대부분 hash 처리가 되어있어 해당 정보가 무엇을 의미하는지 파악하기는 어렵습니다. 이번 글에서는 아래의 결과에서 caver-js를 활용해 어떠한 정보들을 추출할 수 있는지 살펴보고자 합니다. (이번 글부터는 API 불러오는 부분은 코드에서 생략하도록 하겠습니다. 궁금하신 분들은 첫 번째 글두 번째 글을 참고해주세요.)

 

PS C:\...\project> node test.js
[
  ...
  {
    address: '0x1f2d6282d74ef26eb6c7e28b9e7048c1b42ebda5',
    topics: [
      '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
      '0x000000000000000000000000d82dab73fc27c4207f2d87924506a1aca24dc7fc',
      '0x000000000000000000000000d5341ceb85bf8a0c4f7a811786024dd4d8632743'
    ],
    data: '0x000000000000000000000000000000000000000000000019127a1391ea2a0000',
    blockNumber: '0x68b1efd',
    transactionHash: '0x6f200a3966b1b5a90d98f0ec85228a95d4912723e75c615c3113cd6708cd3fc3',
    transactionIndex: '0x0',
    blockHash: '0xea87168e444f3cc7417c6e43a991f2c65b3759ddcbfb80fa48d79c6ae8914039',
    logIndex: '0x6',
    removed: false
  }
]

 

 위의 결과에서 알아볼 수 있는 결과는 pKLAY의 컨트랙트 주소인 address와 TX HASH인 transactionHash 정도입니다. address는 제가 입력한 정보이기 때문에, transactionHash를 Klaytnscope에 검색해보도록 하겠습니다. 그러면 아래와 같은 정보가 뜨게 됩니다. Klaytnscope에는 트랜잭션에서 발생한 KLAY의 양(Amount), Time, Method 등의 정보를 볼 수 있습니다. 해당 트랜잭션 정보가 이번 글의 예제로 활용되기 때문에, 아래의 Klaytnscope 화면을 잘 참고해주시길 바랍니다.

 

 

 caver-js에서는 해당 transactionHash가 어떠한 결과를 출력하는지 차근차근 확인해 보겠습니다. 우선 이번 글에서는 '109780733' 블록에 발생한 PalaSquare NFT 거래에 집중하겠습니다. 지난 글에서 언급한 것처럼 PalaSquare에서 이루어지는 하나의 NFT 거래에는 위와 같이 여러 개의 Token Transfer가 존재합니다. 저는 500 KLAY라는 거래가 이루어졌다는 정보만 필요하기 때문에, 다음과 같은 for 구문으로 첫 번째 이루어지는 Token Trasnfer만 Set에 저장되도록 하였습니다. Set은 중복되는 정보를 저장할 수 없는 특징이 있어, 결국 하나의 transactionHash만 남게 됩니다. 추후 Array 형태가 활용하기 편하므로, 마지막에 Set을 Array 형태로 변환해 줍니다.

 

async function testFunction() {
  // Set Address
  const tokenAddress = "0x1f2d6282d74ef26eb6c7e28b9e7048c1b42ebda5"; // pKLAY contract

  // Get PalaSquare Transcation Information
  const pklayTxInfo = await caver.rpc.klay.getLogs({
    fromBlock: 109780733,
    toBlock: 109780733, //"latest"
    address: tokenAddress
  });

  // Get non-duplicate Transaction Hash
  const txHash = new Set();

  for (let i = 0; i < pklayTxInfo.length; i++) {
    txHash.add(pklayTxInfo[i].transactionHash);
  }

  const hash = Array.from(txHash);

  console.log(hash);

}

 

[
  '0x6f200a3966b1b5a90d98f0ec85228a95d4912723e75c615c3113cd6708cd3fc3'
]

 

 이제 중복되지 않은 transactionHash를 얻을 수 있게 되었습니다. transactionHash로부터 정보를 추출할 수 있는 함수는 caver.rpc.klay.getTransactionByHash() 입니다. 해당 함수를 통해 결과를 가져와보겠습니다. 위의 Klaytnscope 화면과 비교했을 때, from, to, gas, nonce, type 등 보다 자세한 정보들이 출력되지만, 여전히 hash 처리가 되어 알아보기 어렵습니다.

 

async function testFunction() {
  // Set Address
  const tokenAddress = "0x1f2d6282d74ef26eb6c7e28b9e7048c1b42ebda5"; // pKLAY contract

  // Get PalaSquare Transcation Information
  const pklayTxInfo = await caver.rpc.klay.getLogs({
    fromBlock: 109780733,
    toBlock: 109780733, //"latest"
    address: tokenAddress
  });

  // Get non-duplicate Transaction Hash
  const txHash = new Set();

  for (let i = 0; i < pklayTxInfo.length; i++) {
    txHash.add(pklayTxInfo[i].transactionHash);
  }

  const hash = Array.from(txHash);

  // Get NFT Information from Transaction Hash
  const tx = await caver.rpc.klay.getTransactionByHash(hash[0]);

  console.log(tx);

}

 

{
  blockHash: '0xea87168e444f3cc7417c6e43a991f2c65b3759ddcbfb80fa48d79c6ae8914039',
  blockNumber: '0x68b1efd',
  from: '0xa7daaa42a8183a97acd02bf7096024755e8da516',
  gas: '0xf4240',
  gasPrice: '0xba43b7400',
  hash: '0x6f200a3966b1b5a90d98f0ec85228a95d4912723e75c615c3113cd6708cd3fc3',
  input: '0xa59ac6dd000000000000000000000000d643bb39f81ff9079436f726d2ed27abc547cb38000000000000000000000000000000000000000000000000000000000000119600000000000000000000000000000000000000000000001b1ae4d6e2ef500000',
  nonce: '0x2053',
  senderTxHash: '0x6f200a3966b1b5a90d98f0ec85228a95d4912723e75c615c3113cd6708cd3fc3',
  signatures: [
    {
      V: '0x4056',
      R: '0x16e4026f2bdcb327fb0f017331e7b4be0451101dccad7ac37b14d43ec52205c0',
      S: '0x3cfdbd82a29875e41f29dd40132da91c2001d607abfd705d861d74bc130ba2cb'
    }
  ],
  to: '0xd82dab73fc27c4207f2d87924506a1aca24dc7fc',
  transactionIndex: '0x0',
  type: 'TxTypeSmartContractExecution',
  typeInt: 48,
  value: '0x1b1ae4d6e2ef500000'
}

 

 일부 hash 처리된 값들을 저희가 알아볼 수 있게 바꿔보겠습니다. 바꿔볼 값은 'blocknumber'와 'value' 입니다. blocknumber는 숫자이기 때문에, caver.utils.hexToNumber() 함수를 통해 변환하는 것이 가능합니다. value는 해당 트랜잭션에서 이동한 KLAY의 수를 의미하므로 숫자이기는 하지만, 메인넷 코인이기 때문에 caver.utils.convertFromPeb() 함수를 통해 변환할 수 있습니다. 결과를 코드를 통해 살펴보겠습니다. 위의 Klaytnscope와 비교했을 때, 블록 넘버와 KLAY의 수가 동일한 것을 확인할 수 있습니다.

 

async function testFunction() {
  // Set Address
  const tokenAddress = "0x1f2d6282d74ef26eb6c7e28b9e7048c1b42ebda5"; // pKLAY contract

  // Get PalaSquare Transcation Information
  const pklayTxInfo = await caver.rpc.klay.getLogs({
    fromBlock: 109780733,
    toBlock: 109780733, //"latest"
    address: tokenAddress
  });

  // Get non-duplicate Transaction Hash
  const txHash = new Set();

  for (let i = 0; i < pklayTxInfo.length; i++) {
    txHash.add(pklayTxInfo[i].transactionHash);
  }

  const hash = Array.from(txHash);

  // Get NFT Information from Transaction Hash
  const tx = await caver.rpc.klay.getTransactionByHash(hash[0]);

  const blockNumber = caver.utils.hexToNumber(tx.blockNumber);
  const amount = caver.utils.convertFromPeb(tx.value);

  console.log(`Block Number: ${blockNumber}`);
  console.log(`Amount: ${amount} KLAY`);

}

 

Block Number: 109780733
Amount: 500 KLAY

 

 이번 글에서는 NFT가 거래된 블록 정보로부터 중복되지 않은 transactionHash를 얻고, 해당 transactionHash로부터 다시 블록 넘버와 거래된 KLAY의 양을 도출하였습니다. 다음 글에서는 이 외에 NFT 이름, Token ID 등 추가적인 정보를 얻는 방법에 대해 살펴볼 예정입니다. 모르는 부분은 언제든지 댓글로 남겨주시면, 확인하는 대로 답변 남기겠습니다.

 

[이전 글]

1) [caver-js] caver-js 설치 및 KAS(Klaytn API Service) API 호출

2) [caver-js] PalaSquare NFT 거래 데이터 수집 (1)

 

[다음 글]

1) [caver-js] PalaSquare NFT 거래 데이터 수집 (3)

 

 

728x90

댓글