블록체인 게임 데이터 뽑기 1편 - 알케미 API

알케미API
Cover Image for 블록체인 게임 데이터 뽑기 1편 - 알케미 API

블록체인의 데이터를 활용을 할 때 보통 알케미나 인퓨라를 많이들 사용한다.

예를 들어 알케미의 getNFTs 함수를 사용해서,

curl --request GET \
     --url 'https://eth-mainnet.g.alchemy.com/nft/v2/docs-demo/getNFTs?owner=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&withMetadata=true&pageSize=100' \
     --header 'accept: application/json'

다음과 같은 데이터를 뽑아낼 수 있다.

{
  "ownedNfts": [
    {
      "contract": {
        "address": "0x000386e3f7559d9b6a2f5c46b4ad1a9587d59dc3"
      },
      "id": {
        "tokenId": "0x0000000000000000000000000000000000000000000000000000000000000001",
        "tokenMetadata": {
          "tokenType": "ERC721"
        }
      },
      "balance": "26",
      "title": "",
      "description": "",
      "tokenUri": {
        "gateway": "http://api.nikeapenft.xyz/ipfs/1",
        "raw": "http://api.nikeapenft.xyz/ipfs/1"
      },
      "media": [
        {
          "gateway": "",
          "raw": ""
        }
      ],
      "metadata": {},
      "timeLastUpdated": "2024-01-15T18:08:38.483Z",
      "contractMetadata": {
        "name": "Bored Ape Nike Club",
        "symbol": "BANC",
        "tokenType": "ERC721",
        "contractDeployer": "0x51d7d428041e23ef51422e110dfeff906e821cfe",
        "deployedBlockNumber": 14276343,
        "openSea": {
          "floorPrice": 0,
          "collectionName": "BoredApeNikeClub",
          "collectionSlug": "bored-ape-nike-club-v2",
          "safelistRequestStatus": "not_requested",
          "imageUrl": "https://lh3.googleusercontent.com/yJ9DgXqjRwgdCkrQmHj7krCbixM8fPVAyYJWJ5NHXap1L0c3QL5MPvrNT0QDINIStGOK857lOvab8MpNQS9X4pkHPktmhVmN82qoVw=s120",
          "description": "COUNTDOWN OVER. MINTING LIVE.\n\n[Mint on the website.](https://nikemetaverse.xyz)\n",
          "bannerImageUrl": "https://lh3.googleusercontent.com/i84LsC2dtbF5I3YiuaXzzfvSijlBI-ZJ8UEta04Ukl4V57Uoj0ZGw8tNyuPdwrF7N5pclyzdqSJjxHZ65z4G5jQrVRK_DHUMVrzTYQ=s2500",
          "lastIngestedAt": "2024-01-08T20:49:13.000Z"
        }


...

위의 처럼 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 주소의 NFT정보를 가져올 때 알케미 API를 활용할 수 있다.

좀 더 실용적인 데이터를 살펴보자.

curl --request POST \
     --url https://eth-mainnet.g.alchemy.com/v2/docs-demo \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "alchemy_getAssetTransfers",
  "params": [
    {
      "fromBlock": "0x0",
      "toBlock": "latest",
      "toAddress": "0x5c43B1eD97e52d009611D89b74fA829FE4ac56b1",
      "withMetadata": false,
      "excludeZeroValue": true,
      "maxCount": "0x3e8"
    }
  ]
}
'


위와 같이 알케미 API의 getAssetTransfers 를 사용하면 토큰이 트랜스퍼된 결과값을 전부 가져올 수 있다.

현재 BigTime 블록체인 게임의 경우,

'0x64Bc2cA1Be492bE7185FAA2c8835d9b824c8a194' 토큰 컨트랙트 내에서

'0x46950ba8946d7be4594399bcf203fb53e1fd7d37' 라는 주소에서 토큰이 보내지는 것을 '보상'이라고 가정하자.


이 데이터를 알케미를 사용해서 BigTime 게임의 민팅 정보를 가져올 수 있다.

위에서 한 가정을 API로 옮겨보면 다음과 같다.

curl --request POST \
     --url https://eth-mainnet.g.alchemy.com/v2/docs-demo \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "alchemy_getAssetTransfers",
  "params": [
    {
      "fromBlock": "0x0",
      "toBlock": "latest",
      "withMetadata": false,
      "excludeZeroValue": true,
      "maxCount": "0x3e8",
      "fromAddress": "0x46950ba8946d7be4594399bcf203fb53e1fd7d37",
      "contractAddresses": [
        "0x64Bc2cA1Be492bE7185FAA2c8835d9b824c8a194"
      ],
      "category": [
        "erc20"
      ]
    }
  ]
}
'

결과값은 다음과 같다.

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "transfers": [
      {
        "blockNum": "0x1171ff3",
        "uniqueId": "0x2dcc08e6ea34af507b3403f3c72309ec1431ff4e207214a97c12cf11c38be3c3:log:76",
        "hash": "0x2dcc08e6ea34af507b3403f3c72309ec1431ff4e207214a97c12cf11c38be3c3",
        "from": "0x46950ba8946d7be4594399bcf203fb53e1fd7d37",
        "to": "0xe358f4aff5995197d676819678c40ba9e2c05953",
        "value": 5,
        "erc721TokenId": null,
        "erc1155Metadata": null,
        "tokenId": null,
        "asset": "BIGTIME",
        "category": "erc20",
        "rawContract": {
          "value": "0x4563918244f40000",
          "address": "0x64bc2ca1be492be7185faa2c8835d9b824c8a194",
          "decimal": "0x12"
        }
      },
      {
        "blockNum": "0x11720ae",
        "uniqueId": "0x48aa54206488cffe9bcbdeb42b28005ba05365ad160338d7956ae392656e19c5:log:255",
        "hash": "0x48aa54206488cffe9bcbdeb42b28005ba05365ad160338d7956ae392656e19c5",
        "from": "0x46950ba8946d7be4594399bcf203fb53e1fd7d37",
        "to": "0xe358f4aff5995197d676819678c40ba9e2c05953",
        "value": 5,
        "erc721TokenId": null,
        "erc1155Metadata": null,
        "tokenId": null,
        "asset": "BIGTIME",
        "category": "erc20",
        "rawContract": {
          "value": "0x4563918244f40000",
          "address": "0x64bc2ca1be492be7185faa2c8835d9b824c8a194",
          "decimal": "0x12"
        }
      },
...


위의 curl API를 살펴보면 fromBlock에서 0x0는 맨 처음 상태를 나타낸다. 만약 1시간 전의 블록 타임을 넣으면 1시간 내의 데이터만 뽑아낼 수 있다. toBlock은 역시 언제까지 블록의 데이터를 가져올지를 결정한다. Etherscan에 block에서 가져올 수 있다. maxCount에서 맥스는 1000개이기 때문에 해당 디폴트값인 0x3e8을 넣어준다. fromAddress는 어느 주소에서 트랜스퍼되었는지를 넣는 param이고 0x64Bc2cA1Be492bE7185FAA2c8835d9b824c8a194는 토큰 스마트 컨트랙트 주소를 넣어주었다.

하지만 위의 curl을 돌리면 에러가 나는 것을 볼 수 있다. APIKey를 받아서 돌린 것이 아니기 때문에 알케미 플랫폼에서 직접 API 키를 받아 url에 대체만 해주면 된다. 이렇게 알케미를 사용하면 각 블록체인 게임이 얼마나 민팅을 해주는지의 심플한 데이터를 만들 수가 있다.

알케미는 이외에도 다양한 API를 제공한다. 토큰의 밸런스나 메타데이터를 가져오는 API도 있고 아까처럼 트랜스퍼 데이터를 가져오는 API도 존재한다. 하지만 가장 많이 제공하는 것은 NFT관련이다.

하나의 주소의 NFT 등을 가져오는 API 또는 NFT의 모든 오너를 가져오는 API 등 다양한 API를 제공한다. 보통 알케미를 사용하게 되면 어느 정도 지점까지는 무료로 사용하다가 약 천 2백만 개의 API콜 이상부터는 돈을 지불해야 되는 방식이다. 따라서 개인적으로 사용하거나 취미로 사용하는 경우에는 알케미나 인퓨라를 사용하는 것으로도 충분하다.

알케미의 문제는 점점 많이 사용하게 될수록 돈이 들어간다는 것이며 또한 느리다는 단점이 존재한다. 위의 API콜에서 보였듯이 'https://eth-mainnet.g.alchemy.com/v2/docs-demo' 는 이더리움 메인넷 전용의 API 콜이다. 각 체인마다 다른 콜을 날려야 하고 fromAddress가 다를 경우 또 다른 콜을 날려야 한다. 만약 3개의 체인에서 10개의 다른 주소를 확인하려고 할 때 30번의 API 호출을 날려야 한다. 각 API 호출당 0.5초가 걸린다고 하더라도 15초가 넘게 걸린다.

위의 문제를 해결하기 위해서는 서브그래프를 사용하면 해결할 수 있는데 알케미도 최근 서브 그래프를 지원하기 시작했다. 하지만 알케미의 서브 그래프보다 The Graph를 사용하는 게 훨씬 편리하므로 다음번에는 The Graph를 사용해서 서브 그래프를 만들고 위와 같이 BigTime의 데이터를 뽑아내는 것을 해보려고 한다.

Image source: Generated through OpenAI's DALL·E

More Articles

Cover Image for 아이겐레이어가 만들려는 세상
아이겐레이어

아이겐레이어가 만들려는 세상

아이겐레이어는 Web3의 AWS가 되어 검증 가능하고 탈중앙화된 클라우드 서비스를 제공합니다. Web3 앱은 이 생태계에서 롤업을 통해 안전하게 운영됩니다.

Cover Image for 블라스트가 보여주는 L2의 의미
블라스트

블라스트가 보여주는 L2의 의미

가스 비용을 줄이는 데 중점을 둔 다른 L2와 달리, 블라스트는 이더리움과 스테이블코인에 대한 자동 리벨런싱을 도입하여 최대 4%의 이자를 제공하며, 덜 중앙 집중화된 거버넌스로의 잠재적 전환을 보여줍니다.