2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Symbol] PythonでCatapult REST Endpointsから送受信履歴の取得

Last updated at Posted at 2021-05-25

概要

  • デスクトップウォレットに表示されるような内容をプログラム(Python)から取得する方法を残しています。
  • 全コードはGithubにて公開中
    • バグや次回の要望あればコメントください
  • 投げXYMは「NDLS6GYOIPHATATNAVVOUNJXBD6X4BXU6IRBHIY」まで
  • あなたの委任お待ちしております。
    • symbol-node.takagi-tech.com
    • ハーベスト報酬は技術検証や記事執筆、ノード維持費に使わせていただきます。

前回記事

事前準備

公式ドキュメントはこちら。v1.0.0で動作確認しています。

トランザクション情報の取得

https://docs.symbolplatform.com/symbol-openapi/v1.0.0/#operation/searchConfirmedTransactions
こちらを叩きます。

確認したいウォレットのアドレスとノードURL、定数としてTransferTransactionのEnum値を設定します。
他の定数はこちら

import urllib.request
import json

# メインネットで安定しているノードURL
NODEURL = "http://00fabf14.xym.stir-hosyu.com:3000"
# 確認対象ウォレットアドレス
ADDRESS = "NDLS6GYOIPHATATNAVVOUNJXBD6X4BXU6IRBHIY"
# TransferTransactionのEnum値(0x4154 [16724 decimal] -> TransferTransaction.)
ENUM_TransferTransaction = 16724

APIの返却値のウォレットアドレスには48桁のものが使用されるので、自分のアドレスの48桁版を前回の記事を参考に取得します。

# 48桁のアドレスを取得
req = urllib.request.Request(NODEURL + '/accounts/' + ADDRESS)
with urllib.request.urlopen(req) as res:
    accountInfo = json.load(res)
ADDRESS48 = accountInfo['account']['address']

自分のウォレットアドレスの場合
ADDRESS = "NDLS6GYOIPHATATNAVVOUNJXBD6X4BXU6IRBHIY"
ADDRESS48 = "68D72F1B0E43CE09826D056AEA353708FD7E06F4F22213A3"
となりました。
わざわざAPIを叩かなくともADRESSか公開鍵から求められる(python SDKでできる?)気がしているので、
ご存じの方はそっとコメントで教えてくださいmm

本題のトランザクション履歴を問い合わせます。

url = NODEURL + '/transactions/confirmed'
params = {
    'address': ADDRESS,
    'order': 'desc',
}

req = urllib.request.Request('{}?{}'.format(url, urllib.parse.urlencode(params)))
with urllib.request.urlopen(req) as res:
    data = json.load(res)
    print(json.dumps(data, indent=2))

結果

{
  "data": [
    {
      "meta": {
        "height": "188954",
        "hash": "853743C7C1014E63261576DA81CFB82CAD15EC823F9B964E7EC1622F5706107C",
        "merkleComponentHash": "853743C7C1014E63261576DA81CFB82CAD15EC823F9B964E7EC1622F5706107C",
        "index": 0
      },
      "transaction": {
        "size": 176,
        "signature": "B1C9FB561C78AE4A93A7B42455D6AAFDA9914FB171B88FA129D13DDF8B134A61AA9C0E6A6D1C66DF479E5DB8837478CFE0F18BC1DE0D71B1A50A33BC1EDF4F0B",
        "signerPublicKey": "5DB471481B3A39AC5CEEE949B64A577C0D5CA67176BE4462145CAD6ABD84CEBC",
        "version": 1,
        "network": 104,
        "type": 16724,
        "maxFee": "50000",
        "deadline": "5764020638",
        "recipientAddress": "68596CE72E15159BDCEA0FE3B7ECDAC89DC148C8B8B7FA49",
        "mosaics": [
          {
            "id": "6BED913FA20223F8",
            "amount": "15400000000"
          }
        ]
      },
      "id": "60A7CE33067648686E54B9B1"
    },
    .........
    .........
  "pagination": {
    "pageNumber": 1,
    "pageSize": 20
  }
}

recipientAddress が先ほど求めた自分のアドレスと一致していれば受信、そうでなければ送信と判断できます。

for d in data['data']:
    mosaic = None
    # モザイクの送受信があるか
    if "mosaics" in d['transaction']:
        for xym in d['transaction']['mosaics']:
            # モザイクがXYM(ID=6BED913FA20223F8)であるか
            if xym['id'] == '6BED913FA20223F8':
                mosaic = xym['amount']
            else:
                continue
            # 受け取り人が自分であるか
            if d['transaction']['recipientAddress'] == ADDRESS48:
                isRecipient = True
            else:
                isRecipient = False
            print("height:{}, {}, {}xym".format(d['meta']['height'], '受信' if isRecipient else "送信", int(mosaic)/1000000))

直近の送受信履歴が表示できました。

height:188954, 送信, 15400.0xym
height:188326, 送信, 10.0xym
height:188317, 送信, 10.0xym
height:188296, 受信, 15000.0xym
height:155725, 受信, 500.0xym
height:143157, 送信, 29420.61xym
height:143146, 送信, 56.0xym

全コードはこちら

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?