LoginSignup
12
10

More than 5 years have passed since last update.

Ethereumベース(ERC20標準)のトークン残高を取得する

Last updated at Posted at 2017-08-20

Ethereumのトークン残高についてノード上から取得できたので記録しておく。

前提と環境:

トークンはERC20標準に準拠するトークンを対象にする。
 下記のライブネット接続環境で確認する。
 http://qiita.com/umidachi/items/44a50ce86e94ff0df8f2

1. トークンのコントラクトアドレスを取得する。

 Ethereumブロックチェーン上のトークンごとのコントラクトアドレスが必要になる。

取得したいトークンのコントラクトアドレスについては、下記URLからでもアドレスを確認できる。
https://ethplorer.io/

これまでにICOなどでブロックチェーン上に排出されたトークンは多いので、ここではターゲットを次の3つに限定する。
 
例:

SYMBOL トークン名称 コントラクトアドレス URL
SNT StatusNetwork 0x744d70FDBE2Ba4CF95131626614a1763DF805B9E https://status.im
MCO Monaco 0xB63B606Ac810a52cCa15e44bB630fd42D8d1d83d https://www.mona.co/
VSL vSlice 0x5c543e7AE0A1104f78406C340E9C64FD9fCE5170 http://www.vslice.io

2.トークンコントラクト上のメソッドの確認

特定のコントラクトアドレスのトークン残高を取得するには、呼び出されたトークンコントラクト上でのメソッドbalanceOf(address)関数を使用する必要がある。(実際のトランザクションとしてEthereumブロックチェーンに送信する必要はない)

ここではjson-apiからeth_callメソッドを用いる。
そのためSHA3 256アルゴリズムでエンコードされたトークンコントラクト上のメソッド、balanceOf(address)'の値を取得する。

gethコンソール
> web3.sha3('balanceOf(address)').substring(0,10)

結果:
"0x70a08231"

結果として"0x70a08231"が得られる。
上記結果を16進数32byteデータとするため、残り0埋めする。

eth_callメソッド上では、次のパラメータを指定する
-to: コントラクトアドレス
-data: "0x70a08231000000000000000000000000"+"保管しているトークンのアドレス"

3.APIリクエストの作成

以上から、pythonでjson-rpc api用にリクエストを作成してみる。

get_token.py
import requests
import json

def eth_call(url,to,data):
    headers = {'content-type': 'application/json'}
    payload = {
        "jsonrpc": "2.0",
        "method": "eth_call",
        "params":[{"to":to,
                   "data":data},
                   "latest"],
        "id": 0
    }

    response = requests.post(url, data=json.dumps(payload), headers=headers).json()
    i=int(response["result"],16)

    return i;

if __name__ == "__main__":
    url = "http://localhost:8545"

    a="0x○○○○○○○○○○○○○○○○○○○○○○○○○○○○~" #トークンを保管しているアドレス
    b="0x70a08231" #コントラクトメソッド(balanceOf(addres)のハッシュ値)
    c='000000000000000000000000'
    d=a[2:42]      #先頭0xの表記を省略

    data= b + c + d

    contract_address={"SNT":"0x744d70FDBE2Ba4CF95131626614a1763DF805B9E",
                      "MCO":"0xB63B606Ac810a52cCa15e44bB630fd42D8d1d83d",
                      "VSL":"0x5c543e7AE0A1104f78406C340E9C64FD9fCE5170"}

    SNT_token=eth_call(url,contract_address['SNT'],data)
    MCO_token=eth_call(url,contract_address['MCO'],data)
    VSL_token=eth_call(url,contract_address['VSL'],data)

    print("SNT TokenBalance:",SNT_token/ pow(10,18) )   #下位18桁 少数
    print("MCO TokenBalance:",MCO_token/ pow(10,8) )    #下位8桁 少数
    print("VSL TokenBalance:",VSL_token/ pow(10,18) )   #下位18桁 少数

出力結果(例)
SNT TokenBalance: 3232.58036728
MCO TokenBalance: 22.80000912
VSL TokenBalance: 276.44170415

上記結果から、Statu Network ,Monaco ,Vsliceのトークンの保有残高が確認できた。

参考:

12
10
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
12
10