モナコイン取引集計+取引ユーザ相関図の集計がおかしいことに気づいて発覚した。
モナコイン取引集計+取引ユーザ相関図の集計がおかしい
残高がMpurseのものと一致しません。
参照元 | 残高MONA |
---|---|
mpurse | 15.93537000 |
集計 | 3.98454800 |
モナコイン取引集計+取引ユーザ相関図の支払一覧をみると、以下のような支払った覚えのないデータがありました。
PA4VfmdnyNx69Ddr86gTLZ8W3znCjdaCgy 11.95006900 11.95006900 MONA 2022-07-02
集計方法がまちがっていると思われる
つい最近の取引でした。この時期とこの金額には覚えがあります。もなフォーセットの残高が11.9
くらいだったような気がします。ということは、これはもなフォーセットで当選したときの取引データでしょう。それは私が受け取った取引のはずですが、まちがって支払ったと判断しているのかもしれません。
正しいのはmpurseのほうでしょう。集計は私がプログラミングしたので、きっと私の集計方法がまちがっているに違いありません。
モナコイン取引集計+取引ユーザ相関図のページで私のアドレスMEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nuMEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu
をもとに集計させます。
次に問題の取引データを探してみます。Chromiumのデベロッパツールを開きコンソールを表示します。
「rest-client.js:35」でデバッグ出力されている箇所を探します。
rest-client.js:35
Object
がconsole.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つのデータが入るが、どちらが先にくるか順不同ということなのでしょう。
では、どうすればこの取引データが支払か受取かを区別できるのでしょうか。順序以外のところで判断しなければなりません。
vin
のtxid
が指す取引データをみれば識別できるのでしょうか? でも、それも今回のように順不同だったら判断できないのでは? かといって、他に判別できそうなプロパティも見当たりません。とりあえずtxid
の内容を見てみます。
私が受け取ったときの取引におけるvin
項目 | mpurse | もなフォーセット |
---|---|---|
vin のtxid (私に支払った相手の取引データを指す) |
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
要素の順序では、支払/受取の区別ができないということ。たとえvin
のtxid
で入力元の取引データを取得しても、順不同である。ウォレット単位では同じだが、異なるウォレットだと順序が違う。
では、ウォレットごとに異なる順序だとして、どのウォレットでも支払/受取を正しく区別する方法はあるのか。もちろんあると思うが、どうすればいいのかわからない。その取引データがどのウォレットにより行われたかを区別することもできない。
なら、世の中にある残高取得APIは、どうやって残高を計算しているの? 絶対に支払/受取を区別する方法はあるはず。でも、私にはわからなかった。
まとめ
- トランザクションデータについて基礎の一部を理解する
- モナコインの取引トランザクションを取得する方法を調べたときの方法で、指定したアドレスの全トランザクション情報を取得できる
- トランザクション情報の中にある
vout
の要素には「支払」と「おつり」の2つがある - では、支払/受取をどのように識別すればいいのか? わからない
- 取引データごとにウォレットを区別することもできない
ウォレット | vout[最初] |
vout[最後] |
---|---|---|
mpurse | 支払 | おつり |
もなフォーセット | おつり | 支払 |
vout
の要素は順不同である。ウォレットによって違うため、vout
要素順で支払/受取の判別ができない。かといって、ほかの何をもって支払/受取の判別をすればいいかもわからない。
つまり、今の私には正しく支払総額、受取総額を算出することができない。なんてこった……orz