モナコイン取引集計+取引ユーザ相関図の集計がおかしいことに気づいて発覚した。

モナコイン取引集計+取引ユーザ相関図の集計がおかしい

残高がMpurseのものと一致しません。

参照元 残高MONA
mpurse 15.93537000
集計 3.98454800

mpurse残高
集計残高

モナコイン取引集計+取引ユーザ相関図の支払一覧をみると、以下のような支払った覚えのないデータがありました。

PA4VfmdnyNx69Ddr86gTLZ8W3znCjdaCgy	11.95006900	11.95006900 MONA	2022-07-02

集計方法がまちがっていると思われる

つい最近の取引でした。この時期とこの金額には覚えがあります。もなフォーセットの残高が11.9くらいだったような気がします。ということは、これはもなフォーセットで当選したときの取引データでしょう。それは私が受け取った取引のはずですが、まちがって支払ったと判断しているのかもしれません。

正しいのはmpurseのほうでしょう。集計は私がプログラミングしたので、きっと私の集計方法がまちがっているに違いありません。

モナコイン取引集計+取引ユーザ相関図のページで私のアドレスMEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nuMEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nuをもとに集計させます。

次に問題の取引データを探してみます。Chromiumのデベロッパツールを開きコンソールを表示します。

「rest-client.js:35」でデバッグ出力されている箇所を探します。

rest-client.js:35 

Objectconsole.debug()で出力されています。をクリックするとになり、オブジェクトの中身が展開されます。

Object
  id: 0
  jsonrpc: "2.0
  result: Array(121)
    [0 .. 99]
    [100 .. 120]

このうち[119]番目の要素が、問題の取引データでした。

[119]

voutをみるとPA4VfmdnyNx69Ddr86gTLZ8W3znCjdaCgyアドレスがあります。金額も11.950069とあり支払一覧表にあったのと同じです。これが問題の取引データでしょう。

{
    "blockhash": "3d79c26e62c27093a3abf288a6d375564bfdab4956af22378bf54283909d1f50",
    "blocktime": 1656743195,
    "confirmations": 672,
    "hash": "2c9e4b6376b20847c2966702477914e043d1a0aa60526435de1c8916ad0b0234",
    "height": 2706386,
    "hex": "02000000000101e6846c4882aca9e7513a2aff5f13923cc02bea1d6b2806bb591c8084ae94c3240000000017160014e686e3fd74e712e103f632b8676eaaa3e18fbed9feffffff02b45b3a470000000017a9141022cfadfea1bf5844fcbdc1b1175567b13fd30287a0860100000000001976a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac02473044022061608a316fb340582e0407c9e2e36353215b2696fa5d92db5380486ef556f5d40220797316e9b8faea0b97060bb7b8762393eae014041e18b1f0a9de26b549171f33012102eeb0ab5a2c4cd4d37e3145c25ff3869a4a35d3485bcdc7c6ea8d6e13b7bb385abd4b2900",
    "locktime": 2706365,
    "size": 249,
    "time": 1656743195,
    "txid": "3e911a24be7101a4a03bd1bbdb17ef160fd77f9ab766c1cb631367829e1a57f4",
    "version": 2,
    "vin": [
        {
            "scriptSig": {
                "asm": "0014e686e3fd74e712e103f632b8676eaaa3e18fbed9",
                "hex": "160014e686e3fd74e712e103f632b8676eaaa3e18fbed9"
            },
            "sequence": 4294967294,
            "txid": "24c394ae84801c59bb06286b1dea2bc03c92135fff2a3a51e7a9ac82486c84e6",
            "txinwitness": [
                "3044022061608a316fb340582e0407c9e2e36353215b2696fa5d92db5380486ef556f5d40220797316e9b8faea0b97060bb7b8762393eae014041e18b1f0a9de26b549171f3301",
                "02eeb0ab5a2c4cd4d37e3145c25ff3869a4a35d3485bcdc7c6ea8d6e13b7bb385a"
            ],
            "vout": 0
        }
    ],
    "vout": [
        {
            "n": 0,
            "scriptPubKey": {
                "addresses": [
                    "PA4VfmdnyNx69Ddr86gTLZ8W3znCjdaCgy"
                ],
                "asm": "OP_HASH160 1022cfadfea1bf5844fcbdc1b1175567b13fd302 OP_EQUAL",
                "hex": "a9141022cfadfea1bf5844fcbdc1b1175567b13fd30287",
                "reqSigs": 1,
                "type": "scripthash"
            },
            "value": 11.950069
        },
        {
            "n": 1,
            "scriptPubKey": {
                "addresses": [
                    "MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu"
                ],
                "asm": "OP_DUP OP_HASH160 45fc13c9d3a0df34008291492c39e0efcdd220b8 OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 0.001
        }
    ],
    "vsize": 168,
    "weight": 669
}

このデータは私「MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu」が「PA4VfmdnyNx69Ddr86gTLZ8W3znCjdaCgy」から「0.001」MONA受け取ったときの取引データと思われます。

ですが、私のプログラミングでは、支払ったと解釈しているようです。そこが間違っている所でしょう。

支払/受取を判定するコード

では、私が書いた支払と受取を判定するソースコードをみてみます。

isPay(vout) { // この取引情報は支払いであるか(真:支払、偽:受取)
    return (vout[vout.length-1].scriptPubKey.addresses[0] == this.my) // voutの配列が3つある取引データが存在した。このとき[1]にアドレスがなかった。最初と最後の要素にはアドレスがあった。
}

そもそも私はトランザクション情報の構造をよく理解していません。けれど実際に取得されたデータと、実際に取引した内容の記憶を比べて、データの法則を予想しました。それが上記のコードです。

つまり、vout配列要素のうち最後の要素をとり、その中にあるaddressプロパティが自分のアドレスと一致したら、自分が支払ったときの取引データであると判断するようにプログラムを書きました。

これはmpurseで取引しているときは問題なく動作していました。たぶんmpurseではvoutのデータは次のようになっています。最初は支払う用、最後はおつり用。

おつり用は自分に返ってくるため、アドレスは自分のものになっています。だからvout最後の要素が自分のアドレスなら、それはおつり用データであり、自分が支払ったときの取引データだと判断できたのです。

ところが、もなフォーセットだとその法則が成立しないため、今回のバグが起こったと思われます。

おそらく「支払い」と「おつり」のデータの順序がmpurseのときと逆のせいで、支払と受取の判別も逆転してしまったのだと予想します。

実際にそれぞれの取引データをみてみます。

私がmpurseで支払ったときのデータ

[8]
{
    "blockhash": "7e4f939ad14eedef81845e61ab632850d02eaacb74eb9a26af8f571b1ae2e5fe",
    "blocktime": 1652851344,
    "confirmations": 41829,
    "hash": "f48ba7e92f964a0f25bc2cbd0d025be5ecf6c4ed27ead3ffb453c3b0451fa2f3",
    "height": 2665229,
    "hex": "0100000001afa2e63ba045ba67a63ca69462dc4fb2c041c9050fb69a9fd40035562087b3bb010000006a47304402204c24e753f63c57c5d2a944d4f0e66c6190f00ecd57cf2bdb24fe5e69f7e5cd970220591bfffa4e31eb124e43bd9bb2e325bd0e3d741c4c69f9d39acf1c72d2fbf30601210257026e027209836532c2cd7807c06e30a889d3cca51884686af8aa2aacafbc1effffffff0280969800000000001976a914d48f250ba88b937f29b0dca914f2e0099485078f88acf25f0305000000001976a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac00000000",
    "locktime": 0,
    "size": 225,
    "time": 1652851344,
    "txid": "f48ba7e92f964a0f25bc2cbd0d025be5ecf6c4ed27ead3ffb453c3b0451fa2f3",
    "version": 1,
    "vin": [
        {
            "scriptSig": {
                "asm": "304402204c24e753f63c57c5d2a944d4f0e66c6190f00ecd57cf2bdb24fe5e69f7e5cd970220591bfffa4e31eb124e43bd9bb2e325bd0e3d741c4c69f9d39acf1c72d2fbf306[ALL] 0257026e027209836532c2cd7807c06e30a889d3cca51884686af8aa2aacafbc1e",
                "hex": "47304402204c24e753f63c57c5d2a944d4f0e66c6190f00ecd57cf2bdb24fe5e69f7e5cd970220591bfffa4e31eb124e43bd9bb2e325bd0e3d741c4c69f9d39acf1c72d2fbf30601210257026e027209836532c2cd7807c06e30a889d3cca51884686af8aa2aacafbc1e"
            },
            "sequence": 4294967295,
            "txid": "bbb38720563500d49f9ab60f05c941c0b24fdc6294a63ca667ba45a03be6a2af",
            "vout": 1
        }
    ],
    "vout": [
        {
            "n": 0,
            "scriptPubKey": {
                "addresses": [
                    "MTH4xy3DCx18X5JqUpyfPuGFtX4xuVoWXk"
                ],
                "asm": "OP_DUP OP_HASH160 d48f250ba88b937f29b0dca914f2e0099485078f OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a914d48f250ba88b937f29b0dca914f2e0099485078f88ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 0.1
        },
        {
            "n": 1,
            "scriptPubKey": {
                "addresses": [
                    "MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu"
                ],
                "asm": "OP_DUP OP_HASH160 45fc13c9d3a0df34008291492c39e0efcdd220b8 OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 0.8410725
        }
    ],
    "vsize": 225,
    "weight": 900
}
項目
vout最後の要素のaddresses 支払った私自身のアドレス
vout最初の要素のaddresses 私が支払った相手のアドレス
vout最初の要素のvalue 私が支払った金額(MONA)

私がmpurseで受け取ったときのデータ

[0]
{
    "blockhash": "b25e87ea736c39df3a51c032aefc558f0f6851a602cc57d21b3cb38fc3ec465f",
    "blocktime": 1652234061,
    "confirmations": 48347,
    "hash": "483aa8414711bb71246f355240cb4a79a5292d8b7b152caca8c985b0c6e6acd0",
    "height": 2658711,
    "hex": "010000000103804fe9ad11c4485fbdc3b025dd68a6c99ae7ccd19b9d63e641f5b6e24be9e1010000006b483045022100b18c83115da395e12791b717b32aff754865cac478bb4e72ddde0f0e6c28b28d0220716c20fcd5151e4aeb8c2f898b9735713a596ff8daac03d7169e207c2e4e6743012103aedd2422519c7ea14e48116b571903c16d2b4657d4a3ffc0e35646cd7e53be3dffffffff02d03dcd06000000001976a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac6a4d1606000000001976a91413bd7f2032c935652371722ae6d987f2f8135aac88ac00000000",
    "locktime": 0,
    "size": 226,
    "time": 1652234061,
    "txid": "483aa8414711bb71246f355240cb4a79a5292d8b7b152caca8c985b0c6e6acd0",
    "version": 1,
    "vin": [
        {
            "scriptSig": {
                "asm": "3045022100b18c83115da395e12791b717b32aff754865cac478bb4e72ddde0f0e6c28b28d0220716c20fcd5151e4aeb8c2f898b9735713a596ff8daac03d7169e207c2e4e6743[ALL] 03aedd2422519c7ea14e48116b571903c16d2b4657d4a3ffc0e35646cd7e53be3d",
                "hex": "483045022100b18c83115da395e12791b717b32aff754865cac478bb4e72ddde0f0e6c28b28d0220716c20fcd5151e4aeb8c2f898b9735713a596ff8daac03d7169e207c2e4e6743012103aedd2422519c7ea14e48116b571903c16d2b4657d4a3ffc0e35646cd7e53be3d"
            },
            "sequence": 4294967295,
            "txid": "e1e94be2b6f541e6639d9bd1cce79ac9a668dd25b0c3bd5f48c411ade94f8003",
            "vout": 1
        }
    ],
    "vout": [
        {
            "n": 0,
            "scriptPubKey": {
                "addresses": [
                    "MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu"
                ],
                "asm": "OP_DUP OP_HASH160 45fc13c9d3a0df34008291492c39e0efcdd220b8 OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 1.14114
        },
        {
            "n": 1,
            "scriptPubKey": {
                "addresses": [
                    "M9hY5XcC7MSD54DfqcEojiKm9QMgXeQhGK"
                ],
                "asm": "OP_DUP OP_HASH160 13bd7f2032c935652371722ae6d987f2f8135aac OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a91413bd7f2032c935652371722ae6d987f2f8135aac88ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 1.02124906
        }
    ],
    "vsize": 226,
    "weight": 904
}
項目
vout最後の要素のaddresses 私に支払った相手のアドレス
vout最初の要素のaddresses 受け取った私のアドレス
vout最初の要素のvalue 私が受け取った金額(MONA)

私がもなフォーセットで受け取ったときのデータ

[119]
{
    "blockhash": "3d79c26e62c27093a3abf288a6d375564bfdab4956af22378bf54283909d1f50",
    "blocktime": 1656743195,
    "confirmations": 672,
    "hash": "2c9e4b6376b20847c2966702477914e043d1a0aa60526435de1c8916ad0b0234",
    "height": 2706386,
    "hex": "02000000000101e6846c4882aca9e7513a2aff5f13923cc02bea1d6b2806bb591c8084ae94c3240000000017160014e686e3fd74e712e103f632b8676eaaa3e18fbed9feffffff02b45b3a470000000017a9141022cfadfea1bf5844fcbdc1b1175567b13fd30287a0860100000000001976a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac02473044022061608a316fb340582e0407c9e2e36353215b2696fa5d92db5380486ef556f5d40220797316e9b8faea0b97060bb7b8762393eae014041e18b1f0a9de26b549171f33012102eeb0ab5a2c4cd4d37e3145c25ff3869a4a35d3485bcdc7c6ea8d6e13b7bb385abd4b2900",
    "locktime": 2706365,
    "size": 249,
    "time": 1656743195,
    "txid": "3e911a24be7101a4a03bd1bbdb17ef160fd77f9ab766c1cb631367829e1a57f4",
    "version": 2,
    "vin": [
        {
            "scriptSig": {
                "asm": "0014e686e3fd74e712e103f632b8676eaaa3e18fbed9",
                "hex": "160014e686e3fd74e712e103f632b8676eaaa3e18fbed9"
            },
            "sequence": 4294967294,
            "txid": "24c394ae84801c59bb06286b1dea2bc03c92135fff2a3a51e7a9ac82486c84e6",
            "txinwitness": [
                "3044022061608a316fb340582e0407c9e2e36353215b2696fa5d92db5380486ef556f5d40220797316e9b8faea0b97060bb7b8762393eae014041e18b1f0a9de26b549171f3301",
                "02eeb0ab5a2c4cd4d37e3145c25ff3869a4a35d3485bcdc7c6ea8d6e13b7bb385a"
            ],
            "vout": 0
        }
    ],
    "vout": [
        {
            "n": 0,
            "scriptPubKey": {
                "addresses": [
                    "PA4VfmdnyNx69Ddr86gTLZ8W3znCjdaCgy"
                ],
                "asm": "OP_HASH160 1022cfadfea1bf5844fcbdc1b1175567b13fd302 OP_EQUAL",
                "hex": "a9141022cfadfea1bf5844fcbdc1b1175567b13fd30287",
                "reqSigs": 1,
                "type": "scripthash"
            },
            "value": 11.950069
        },
        {
            "n": 1,
            "scriptPubKey": {
                "addresses": [
                    "MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu"
                ],
                "asm": "OP_DUP OP_HASH160 45fc13c9d3a0df34008291492c39e0efcdd220b8 OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 0.001
        }
    ],
    "vsize": 168,
    "weight": 669
}
項目
vout最後の要素のaddresses 受け取った私のアドレス
vout最初の要素のaddresses 私に支払った相手のアドレス
vout最初の要素のvalue 私に支払った相手が受け取るおつり

mpurseもなフォーセットにおけるvoutの違い

私が受け取ったときの取引データの違いをみてみる。

項目 mpurse もなフォーセット
vout最後の要素のaddresses 私に支払った相手のアドレス 受け取った私のアドレス
vout最後の要素のvalue 私に支払った相手が受け取るおつり 私が受け取った金額(MONA)
vout最初の要素のaddresses 受け取った私のアドレス 私に支払った相手のアドレス
vout最初の要素のvalue 私が受け取った金額(MONA) 私に支払った相手が受け取るおつり

なんということでしょう。やはり、支払と受取の順序が逆転しています。valueの値も入れ替わっています。

つまり、vout配列の要素順序に法則性はない。「支払い」と「おつり」の2つのデータが入るが、どちらが先にくるか順不同ということなのでしょう。

では、どうすればこの取引データが支払か受取かを区別できるのでしょうか。順序以外のところで判断しなければなりません。

vintxidが指す取引データをみれば識別できるのでしょうか? でも、それも今回のように順不同だったら判断できないのでは? かといって、他に判別できそうなプロパティも見当たりません。とりあえずtxidの内容を見てみます。

私が受け取ったときの取引におけるvin

項目 mpurse もなフォーセット
vintxid(私に支払った相手の取引データを指す) mpurse受取vin-tx もなフォーセット受取vin-tx

mpurse受取vin-tx

{
   "txid":"e1e94be2b6f541e6639d9bd1cce79ac9a668dd25b0c3bd5f48c411ade94f8003",
   "version":1,
   "vin":[
      {
         "txid":"7b628af7e435d9e0b14116b11c346d6f3bbe2510c0cabd8fb5d01af68359b219",
         "vout":1,
         "sequence":4294967295,
         "n":0,
         "addresses":[
            "M9hY5XcC7MSD54DfqcEojiKm9QMgXeQhGK"
         ],
         "isAddress":true,
         "value":"255284356",
         "hex":"483045022100e7b36a5115a86326b91d0bf89407df78733850c63e041a51a913f3f09f6df13e022048896aaa5b71ababf66323b8bc8ed25e1b3a423ed643b5a7acf484dcf4f3afbf012103aedd2422519c7ea14e48116b571903c16d2b4657d4a3ffc0e35646cd7e53be3d"
      }
   ],
   "vout":[
      {
         "value":"39000000",
         "n":0,
         "hex":"76a9145bef72db1e9a105cf734ead06ef87a54f1d39a3588ac",
         "addresses":[
            "MGHGa55FH7CcaJdNqJZZb3YCPuZAn2iMUF"
         ],
         "isAddress":true
      },
      {
         "value":"216261631",
         "n":1,
         "spent":true,
         "hex":"76a91413bd7f2032c935652371722ae6d987f2f8135aac88ac",
         "addresses":[
            "M9hY5XcC7MSD54DfqcEojiKm9QMgXeQhGK"
         ],
         "isAddress":true
      }
   ],
   "blockHash":"f413585659148cdfc442975bb9bd9de8dddfafe2ccaad1fa3f394280988ae7b1",
   "blockHeight":2633653,
   "confirmations":73463,
   "blockTime":1649863002,
   "value":"255261631",
   "valueIn":"255284356",
   "fees":"22725",
   "hex":"010000000119b25983f61ad0b58fbdcac01025be3b6f6d341cb11641b1e0d935e4f78a627b010000006b483045022100e7b36a5115a86326b91d0bf89407df78733850c63e041a51a913f3f09f6df13e022048896aaa5b71ababf66323b8bc8ed25e1b3a423ed643b5a7acf484dcf4f3afbf012103aedd2422519c7ea14e48116b571903c16d2b4657d4a3ffc0e35646cd7e53be3dffffffff02c0175302000000001976a9145bef72db1e9a105cf734ead06ef87a54f1d39a3588acffe3e30c000000001976a91413bd7f2032c935652371722ae6d987f2f8135aac88ac00000000"
}

取得されたJSONは以下でフォーマットしました。

項目
vout最後の要素のaddresses この取引で支払った人自身
vout最初の要素のvalue この取引で支払った人自身に戻るおつり(次で私への支払いに使った)
vout最初の要素のaddresses この取引で支払った相手
vout最初の要素のvalue この取引で支払った金額

私との取引では以下だった。

項目
vout最後の要素のaddresses 受け取った私のアドレス
vout最初の要素のaddresses 私に支払った相手のアドレス
vout最初の要素のvalue 私に支払った相手が受け取るおつり

つまりmpurseで取引するとvoutの最初には支払った相手のアドレスが入るってことか? でもvalueのほうがわからない。支払った金額だったり、おつりだったりしているみたい。

もなフォーセット受取vin-tx

{
   "txid":"24c394ae84801c59bb06286b1dea2bc03c92135fff2a3a51e7a9ac82486c84e6",
   "version":2,
   "lockTime":2706332,
   "vin":[
      {
         "txid":"16573447d699d12403a98d3d787d5c71f31d1b6deb694f6191889558e1d9a4c7",
         "sequence":4294967294,
         "n":0,
         "addresses":[
            "PDX3WgpRsuzNuTRMZaivZY1BHJjcyqGQ2r"
         ],
         "isAddress":true,
         "value":"1195254500",
         "hex":"160014860a7acd7680aa4b770ca29d7d98b44a2b9adbda"
      }
   ],
   "vout":[
      {
         "value":"1195123700",
         "n":0,
         "spent":true,
         "hex":"a914375cf6b9a2d43b23f44c239ef941341c6b8c754e87",
         "addresses":[
            "PDdugm2A9JgAPgTd1MH559WskwSZ5JkRhy"
         ],
         "isAddress":true
      },
      {
         "value":"114000",
         "n":1,
         "hex":"76a914b473c3ac4d44b897fe511c6ae81934b85c447ab088ac",
         "addresses":[
            "MQMJYQbJNu2TibG4eWCV5z3S2P81e7MWbt"
         ],
         "isAddress":true
      }
   ],
   "blockHash":"d11669811988b49163293138c63a7f41a07468c8bfb6d2411d066a808ee5c6e3",
   "blockHeight":2706349,
   "confirmations":767,
   "blockTime":1656739553,
   "value":"1195237700",
   "valueIn":"1195254500",
   "fees":"16800",
   "hex":"02000000000101c7a4d9e158958891614f69eb6d1b1df3715c7d783d8da90324d199d6473457160000000017160014860a7acd7680aa4b770ca29d7d98b44a2b9adbdafeffffff02f4233c470000000017a914375cf6b9a2d43b23f44c239ef941341c6b8c754e8750bd0100000000001976a914b473c3ac4d44b897fe511c6ae81934b85c447ab088ac0247304402204785b45e711ebcb35c0b31b78eb3b2a36fae8dc1fa41158fe8713076db11da5b022069d6e5bbd91ed459b36f5d0bfbf84c34426a1525894d2d1275a39ee0dc4dfb130121039c0a038e5b152b381aa425e64721202ea7883dcefac242416d2778b8c74fd8359c4b2900"
}

あれ、支払者だったはずのアドレスPA4VfmdnyNx69Ddr86gTLZ8W3znCjdaCgyがどこにもありません。これは一体どういうことか。この取引データには「11.950069+0.0001+手数料」以上の金額が残っているはず。それが「1195237700」かな? たぶんこれはMONA換算で「11.95237700」でしょう。そして、この残金で、私への支払いをしたということだと思います。

私に支払うときの入力としてこの取引データを使うなら、この取引データの所有者は支払者であるPA4VfmdnyNx69Ddr86gTLZ8W3znCjdaCgyのはず。なのにPDdugm2A9JgAPgTd1MH559WskwSZ5JkRhyであるように見えます。誰? どういうことか理解できません。

もうひとつのアドレスMQMJYQbJNu2TibG4eWCV5z3S2P81e7MWbtは、たぶんPDdugm2A9JgAPgTd1MH559WskwSZ5JkRhyが支払った相手なのでしょう。このときの残金で私に支払ったということのはず。

項目
vout最後の要素のaddresses
vout最初の要素のaddresses
vout最初の要素のvalue この取引で支払った人に戻るおつり(私への支払いに使う)

mpurse受取vin-txと比べて、vout要素の順序に入っているものが同じであれば、支払/受取の区別ができると思っていました。が、そもそももなフォーセット受取vin-txでの取引データのアドレスが誰だかわからないという結果に困惑。

mpurse受取vin-txもなフォーセット受取vin-txを比較する

項目 mpurse受取vin-tx もなフォーセット受取vin-tx
vout最後の要素のaddresses この取引で支払った人自身 この取引で支払った相手
vout最初の要素のvalue この取引で支払った人自身に戻るおつり(次で私への支払いに使った) この取引で支払った金額
vout最初の要素のaddresses この取引で支払った相手
vout最初の要素のvalue この取引で支払った金額 この取引で支払った人に戻るおつり(私への支払いに使う)

わからない部分があるものの、やはりウォレットによってvout要素の順序が違うという解釈でいいのでしょう。つまり、どうあってもvout要素の順序では、支払/受取の区別ができないということ。たとえvintxidで入力元の取引データを取得しても、順不同である。ウォレット単位では同じだが、異なるウォレットだと順序が違う。

では、ウォレットごとに異なる順序だとして、どのウォレットでも支払/受取を正しく区別する方法はあるのか。もちろんあると思うが、どうすればいいのかわからない。その取引データがどのウォレットにより行われたかを区別することもできない。

なら、世の中にある残高取得APIは、どうやって残高を計算しているの? 絶対に支払/受取を区別する方法はあるはず。でも、私にはわからなかった。

まとめ

ウォレット vout[最初] vout[最後]
mpurse 支払 おつり
もなフォーセット おつり 支払

voutの要素は順不同である。ウォレットによって違うため、vout要素順で支払/受取の判別ができない。かといって、ほかの何をもって支払/受取の判別をすればいいかもわからない。

つまり、今の私には正しく支払総額、受取総額を算出することができない。なんてこった……orz