LoginSignup
8
3

More than 5 years have passed since last update.

JSON形式のNEMトランザクションから送金情報を抽出する。

Last updated at Posted at 2017-06-13

NEM APIでアドレスごとに送金のトランザクションが取得出来ることは以前説明しました。
今回は取得できたトランザクションのどの場所に金額情報などがあるのかを説明したいと思います。

大きく分けて、トランザクションがマルチシグで送信されたか、そしてモザイクとしてXEM送信されたかでアクセスの方法が大きく異なってきます。
Zaifなどの取引所から出金した場合、トランザクションはマルチシグで送信されています。

まずは普通のXEM送金のトランザクションから。

nomal
{
    "meta":{
        "innerHash":{},
        "id":834509,
        "hash":{
            "data":"aaaaaaaaaaaaaaaaaaaaaaaaa"
        },
        "height":1146325
    },
    "transaction":{
        "timeStamp":69421490,
        "amount":1000000,
        "signature":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
        "fee":2000000,
        "recipient":"NXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "type":257,
        "deadline":69507890,
        "message":{
            "payload":"dddddddddddddddddddddddddddddd",
            "type":1
        },
        "version":1744830465,
        "signer":"cccccccccccccccccccccccccccccccccccccccccc"
    }
}

送金は transaction.amount
手数料は transaction.fee です。

次にマルチシグトランザクションの説明です。

multisig
{
    "meta":{
        "innerHash":{
            "data":"aaaaaaaaaaaaaaaa"
        },
        "id":770282,
        "hash":{
            "data":"1cd2a61185368eed7760a77008bf3f00acc13ec279be3029b3aa1b5293f75d7b"
        },
        "height":1115116
    },
    "transaction":{
        "timeStamp":67531887,
        "signature":"xxxxx",
        "fee":6000000,
        "type":4100,
        "deadline":67535487,
        "version":1744830465,
        "signatures":[
            {
                "timeStamp":67531965,
                "otherHash":{
                    "data":"aaaaaaaaaaaaaaaa"
                },
                "otherAccount":"NYYYYYYYYYYYYYYYYYYYYYYYYYYYYY",
                "signature":"bbbbbbbbbbbbbbbbbb",
                "fee":6000000,
                "type":4098,
                "deadline":67618365,
                "version":1744830465,
                "signer":"cccccccccccccccccccc"}
        ],
        "signer":"ddddddddddddddddd",
        "otherTrans":{
            "timeStamp":67531887,
            "amount":1000000,
            "fee":19000000,
            "recipient":"NXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "type":257,
            "deadline":67535487,
            "message":{},
            "version":1744830465,
            "signer":"fbae41931de6a0cc25153781321f3de0806c7ba9a191474bb9a838118c8de4d3"
        }
    }
}

XEMの送信額は transaction.otherTrans.amount を参照します。
手数料は transaction.otherTrans.fee とtransaction.feeを足し合わせたものになります。

モザイク送信した場合のトランザクションはこちらです。

mosaic
{
    "meta":{
        "innerHash":{},
        "id":785916,
        "hash":{
            "data":"aaaaaaaaaaaaaaaaaaaaaa"
        },
        "height":1122171
    },
    "transaction":{
        "timeStamp":67959619,
        "amount":1000000,
        "signature":"bbbbbbbbbbbbbbbbbbbb",
        "fee":8000000,
        "recipient":"NXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "mosaics":[{
            "quantity":1000000,
            "mosaicId":{
                "namespaceId":"nem","name":"xem"
            }
        }],
        "type":257,
        "deadline":68046019,
        "message":{
            "payload":"cccccccccccccccccccccccccccccccccccccccccc",
            "type":1
        },
        "version":1744830466,
        "signer":"ddddddddddddddddddddddddddddddddddddd"
    }
}

XEM送金額はtransaction.mosaics["nem:xem"].quantity の1000000 となります。アクセス方法は別途説明します。
手数料はtransaction.fee です。
ここでamount = 1000000 とありますが、これはmosaicを何セット送るかというパラメータととして使われており、今回は1セット送るので 1000000となります。現在nanowalletではこの値は1000000 固定値となっています。

NEMでのXEM送金は上記のいずれかの方法を取ることになります。つまりXEM送金の処理を扱うシステムを開発する場合はこの違いを柔軟に解決しておく必要があります。

最後に、総金額と手数料を算出するサンプルを載せておきます。

parse_transfers
$.ajax({url: URL ,type: 'GET'}).done(function(res){parse_transfers(res)});
var parse_transfers = function(result){

  var dataArray = result.data;
  dataArray.forEach(function(val){
    var tran = val.transaction;
    var tran_amount = 0;
    var tran_fee = tran.fee;

    if(tran.type == 4100){

      tran_fee    = tran.otherTrans.fee + tran.fee ;
      tran = tran.otherTrans;
    }

    if (tran.type == 257){

      var has_mosaic = false;
      if(tran.mosaics){

        for(key  in tran.mosaics){
          has_mosaic = true;
          var mosaic = tran.mosaics[key];
          if(mosaic.mosaicId.name == "xem" && mosaic.mosaicId.namespaceId == "nem"){
            tran_amount = mosaic.quantity;
          }
        }
      }
      if(!has_mosaic){
        tran_amount = tran.amount;
      }
    }
  });
}



以下のNEMアドレスは、全てNEM上でエンジニアが活動できるための資金に使用します。
これから私が書く記事に共感していただけましたら、ご寄附いただけると助かります。
NEM ADDRESS: NBZNQL-2JDWTG-UAW237-PXV4SS-XSPORY-43GUSW-GSB7

8
3
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
8
3