Gift history
Please access after login.


Wait a moment...

NEM APIのトライと、より良い証券サービス開発の野望について(モザイク残高取得、残高をドーナツグラフ状に表示)

1158
4
2019-03-10 15:45:28
0.00 mXYM
(0)

こんにちは。サラリーマン投資家です。前回のNEMもくもく会では、NEMのAPIのトライとして、モザイク残高を取得して表示するhtmlを作成しました。

本当は、モザイク残高をドーナツグラフ状に表示させるところまで終わらせたかったのですが、当日中にはできず、今日、ようやくそこまでたどり着くことができたので、nemlog記事にて公開させて頂きます。

 

やりたいこと

対象アドレス:NBU7T6NGPNHASSDUTLV66OYZJHECHVZY6ABL5SQQ

保有モザイク:cam.etf:vt, cam.etf:vti, cam.etf:bndw, cam.etf:bndの残高を取得して、ドーナツグラフ状に表示する。

 

事前準備

Chart.js

javascriptでのグラフ描画について少し調べたところ、Chart.jsというライブラリが使いやすそうでしたので、これを利用することにします。

2019/3/10時点での最新バージョンのソースコードを以下URLからダウンロードします。zipファイルをダウンロードして展開し、distフォルダ内のChart.jsファイルをコピーして、以下のindex.htmlと同じディレクトリに配置します。

https://github.com/chartjs/Chart.js/releases/tag/v2.7.3

 

index.html

本体のhtmlファイルは以下の通りとします。

<!DOCTYPE html>
<html>
    <head>
        <meta charset = "utf-8">
        <script src="Chart.js"></script>
    </head>
    <body>
        <canvas id="myPieChart"></canvas>
        <div id="vt"></div>
        <div id="vti"></div>
        <div id="bndw"></div>
        <div id="bnd"></div>
        <script>
            //NEMのAPIリクエストに必要な情報の定義
            const node_address = "http://nemlovely1.supernode.me";
            const port_no = ":7890";
            const api_path = "/account/mosaic/owned";
            const address_set = "?address=";
            const address = "NBU7T6NGPNHASSDUTLV66OYZJHECHVZY6ABL5SQQ";
            const url_endpoint = node_address + port_no + api_path + address_set + address;
            //残高を取りたい各モザイクの残高を入れる変数
            var balance_vt = 0;
            var balance_vti = 0;
            var balance_bndw = 0;
            var balance_bnd = 0;
            //NEMのAPIのエンドポイントにアクセスしてJSONを受け取る関数の定義
            const req = new XMLHttpRequest();
            req.onreadystatechange = function() {
                //404エラーの場合の例外処理
                if (req.status == 404) {
                    console.log("404エラー。指定したページは存在しません。");
                    return false;
                }
                //その他エラーの場合の例外処理
                if (!(req.readyState == 4 && req.status == 200)){
                    console.log("リクエストで不明なエラーが発生しました。")
                    return false;
                }
                //エラーなくレスポンスが返ってきたらjsonオブジェクトに
                const json = (function(raw) {
                    try {
                        return JSON.parse(raw);
                    } catch (err) {
                        console.log("レスポンスで不明なエラーが発生しました。")
                        return false;
                    }
                })(req.responseText);
                //jsonが不正な場合の例外処理
                if (!json) {
                    return false;
                }
                
                //cam.etf:vtの残高を総当たり的に取得して表示
                for (var i = 0; i < json.data.length; i++) {
                    if (json.data[i].mosaicId.namespaceId == "cam.etf" && json.data[i].mosaicId.name == "vt"){
                        balance_vt = json.data[i].quantity / 1000000
                    }
                }
                //cam.etf:vtiの残高を総当たり的に取得して表示
                for (var i = 0; i < json.data.length; i++) {
                    if (json.data[i].mosaicId.namespaceId == "cam.etf" && json.data[i].mosaicId.name == "vti"){
                        balance_vti = json.data[i].quantity / 1000000
                    }
                }
                //cam.etf:bndwの残高を総当たり的に取得して表示
                for (var i = 0; i < json.data.length; i++) {
                    if (json.data[i].mosaicId.namespaceId == "cam.etf" && json.data[i].mosaicId.name == "bndw"){
                        balance_bndw = json.data[i].quantity / 1000000
                    }
                }
                //cam.etf:bndの残高を総当たり的に取得して表示
                for (var i = 0; i < json.data.length; i++) {
                    if (json.data[i].mosaicId.namespaceId == "cam.etf" && json.data[i].mosaicId.name == "bnd"){
                        balance_bnd = json.data[i].quantity / 1000000
                    }
                }
                //円グラフのデータセット
                var ctx = document.getElementById("myPieChart");
                var myPieChart = new Chart(ctx, {
                    type: 'doughnut',
                    data: {
                        labels: ["VT", "VTI", "BNDW", "BND"],
                        datasets: [{
                            backgroundColor: [
                                "#E60012",
                                "#F39800",
                                "#FFF100",
                                "#009944"
                            ],
                            data: [balance_vt, balance_vti, balance_bndw, balance_bnd]
                        }]
                    },
                    options: {
                        responsive: true,
                        cutoutPercentage: 50,
                        title: {
                            display: true,
                            text: "ポートフォリオ"
                        },
                        legend: {
                            position: "top"
                        }
                    }
                });
                document.getElementById("vt").innerHTML = "VT:" + balance_vt;
                document.getElementById("vti").innerHTML = "VTI:" + balance_vti;
                document.getElementById("bndw").innerHTML = "BNDW:" + balance_bndw;
                document.getElementById("bnd").innerHTML = "BND:" + balance_bnd;
            }
            //リクエスト作成
            req.open("GET", url_endpoint, true);
            //リクエスト送信(&実行)
            req.send();
        </script>
    </body>
</html>

 

実行結果

本体のindex.htmlをGoogle Chrome等のwebブラウザで開くと以下のようになります。

意図したとおり、ドーナツ状にモザイク残高をグラフ表示させることができました。(とはいえ、正直カッコ悪いコードと感じます。改善案等、ご提案頂けると、大変うれしいです。)

 

最後に…

 

なぜこのようなものを作ろうとしているのか?

投資家の中でも特に「インデックス投資」「ETF」「ロボアドバイザー」等について詳しい方は、上記を見てピンとくるものがあるのではないでしょうか。そう、低コストなETFのみを扱い、それらETFの残高をNEMのモザイクの残高に見立てて管理する、超低コストな証券サービスを作りたい( or 利用したい)という野望が自分にあるからです。類似サービスは既にありますが(WealthNavi, THEO, …等)、それらサービスのコストはそれなりに高く、残高管理のDBは極めて厳格な運用がなされており、高コストの一因となっているのでは…と思っています。そのDBをブロックチェーンが代わりに担うことで、圧倒的な低コストが実現できないか?と思っています。

今回、残高照会の画面は、NEMのモザイクの利用と既存のweb技術(それもすごく基本的なものだけ)で、すごく簡単にそれっぽいものが作れることが示せたと思います。

これは本当に初歩の初歩という感じですが、KYCの仕組みや自動積立やリバランスの仕組み等もNEMの仕組みと既存のweb技術の組み合わせで実現できるのでは?と思っています。

もし、業界関係者の方が見てくれていたら、ぜひNEMの仕組みに興味をもって、より良い金融サービスの開発のきっかけにして頂ければとてもうれしいです。

Writer
Web技術やNEM, Symbol, Cosmos, Ethereumを中心としたブロックチェーンに関する情報発信が多めです。ものづくりの会社→CauchyE(旧: LCNEM)→NEMTUS。NPO法人NEM技術普及推進会の副理事長です。よろしくお願いします。

Comment
Login required to post comment
Loading...
https://symbol-sakura-16.next-web-technology.com:3001,https://symbol.harvest-monitor.com:3001,https://hideyoshi-node.net:3001,https://harvest-01.symbol.farm:3001,https://criptian-xym-node.net:3001,https://35665.xym.stir-hosyu.com:3001,https://yuna.keshet.finance:3001,https://cryptocat-xym-node.com:3001,https://misaki-xym.com:3001,https://ik1-305-12844.vs.sakura.ne.jp:3001,https://17107.xym.stir-hosyu.com:3001,https://23639.xym.stir-hosyu.com:3001,https://sym-main-01.opening-line.jp:3001,https://sym-main-02.opening-line.jp:3001,https://sym-main-03.opening-line.jp:3001,https://sym-main-04.opening-line.jp:3001,https://sym-main-05.opening-line.jp:3001,https://sym-main-06.opening-line.jp:3001,https://sym-main-07.opening-line.jp:3001,https://sym-main-08.opening-line.jp:3001,https://sym-main-09.opening-line.jp:3001,https://sym-main-10.opening-line.jp:3001,https://symbol-node-01.kokichi.tokyo:3001,https://50038.xym.stir-hosyu.com:3001,https://27423.xym.stir-hosyu.com:3001,https://angel.vistiel-arch.jp:3001,https://xym.stakeme.tokyo:3001,https://00-symbol-node.yagiyoshi.com:3001,
6BED913FA20223F8,051FAEC15105C808,73019335A785A3AE,5289A9B0DBB7EB25,6B245EAF1302E444,2C4A4893229DD0A9,63509D495CAD7B80,481D74291A71FD1F,009388A38C91A8B2,4E94920841641B77,027C6AD49DE2C9F9,29FCA5D3092205EC,56085AD9FCE150AC,7D47EE5423795E68,1FCD7C6B47C7AC5C,34F165131675B97B,2277A3D3C939E3BD,1BEE7E51C52B9E4C,7DE0FA227D5C284A,69C715D2F4E80338,5CF9D768B02E51EA,5B96E6496754C18E,35584939456EE19C,430AB6F115D709C5,202FC8C6762F1286,1DA6F5986C56CAB4,77F0C0918BDDCA75,05D935AB3DBBBDA7,3AB05B7B3373067F,383EEBD409479BDD,282E5F730EEF0F3C,108AFF21E54B77EB,0C4AAE8E82E054FD,18964001EF89D687,15BDE2DDF36FE763,01E2769C92FFB187,427C7F0474B2170B,3F2EEE17968715D5,6C0AFBA20EEBF08B,22975F2097F16D15,2A30D04FF35E8641,03ACEC4F51A71804,5235C4249928922B,2BFEB24F70B91041,741320E728843965,7C4E97850A863208,0586FF7E5ED1C680,606432C50BDE4EB5,15A6AD5E5ED6AC0E,59932634EDBF2A21,5E4F05ED77C64434,71C79278A325FF67,616EC15DE7D641A0,25C2DAB4FE687CBE,3D78B91922741293,5DC4B8DCDC4D3098,2693037B1881D5FA,178FE008F5DCE797,174A93DA9B651FBD,128B2CD071838D3E,1F5630200C5A6025,43449FF761B3DD67,4B20F46C289CA548,35DBA0A70A96615F,78CE44A425CD4514,37179FDE046FE7F2,1739E47C99BAF114,0F3B4A0F2E58703B,3C41561BE3DF7461,2AF0FBFEBF29231F,74CD75720BA4F553,1A5229DC90802C6C,0D2888CD0CBB78EE,2558F02FE439C78F,5DDD07C51EC896A7,437B094116B91BF3,6C9E7CFE33220C8F,38E1C92F412FCA96,2FB263845F59AF82,28C3C38B84138804,659821D4511185A7,7C6095DA82D3E981,70ADA95932385F9F,0BE6C51AD316BF2B,78E6ED1B6C05FD98,39534A8DFD9C0F1E,1BAF1FE1AAF90CD0,6782B8D9162D0C12,5EF22919F6EA15F7,04A3F3F5C088626A,7484B044AC8EF734,305B0ECE763A1E81,08738DB598D0BA37,6F4018163AC51F88,46650CE0C72739A8,0208FCB9186781E5,4E685399C9F8C991,77DB7D348B042A18,578ED7B270B43E64,0B34212023AA5139,479CEDAEE6FAC642,4266458B86437B4B,1F7022D092066B94,0CA28E24CB575AA6,4DCC3C025CDC0BB8,1BD05266C7410EE1,45C46BC710C187AF,7CC2C672543CA102,555BA3719D30D3B9,75C4079CCCCF3E82,66C98D947EAC56FB,1C041AB88A8D222B,79C13E9FE7DA49AB,54D872B5DB378F52,5C97B2414157B039,31E7A64CFF778586,1DFD11EEDA4662C4,18506C180280D8AB,02E95DB8811B3F7A,2D289599AF071703,17EA80052AF590B0,5239AE78AA9011CC,6B6511925501765B,2730974F2D11E9FA,08AB4E53E95E417E,1D0DD379C8C4BA49,26EE7E07E1255FAB,015FABE3F602FA91,366D7D6540335156,2D1E8E73B9F09391,043694AD272BCEBA,064335A213099492,3C40AE05D9758591,71C4BCA24A2FA6C1,20170ABD32244B78,74EBE4C9FD9C3BC8,713583F712D574FA,7C05BBBD486CF544,634D5A328A659C41,2DA0EC8CA32B7CE6,4D0ECC9F6F70D67D,7426EE72B3DFD620,3C3E58B64A8CD43C,5007CF79DF192FB2,1531F39F1B0AA8C3,5D1E928E7902404F,74599424DE012A19,52F96AC0043B02D8,0C694031CFC22C84,03D6EE58174D16DD,054B071E97323D54,2B58942A0A9D3908,7FE10DF86F32776F,1A08F9B88AE4CCF9,03CB7A99E6F6F65A,2F0BAAAD886013B2,7D8FF6C570E909C3,237ACBD2073D7C22,29498519D19B27CF,03E85F9F15A92D27,62B4F899B6DADDFF,6649A6F82740775E,1FA7CAD8017C3045,5FFB7126DD87CC5B,07039874D46F8B44,3391DD8105AD0C82,56C97E544EA9C149,6103DBFFA022249B,41E9771D99FF96A5,65CF7BE26FC7BF56,789063B9FDA7D02B,3EE026A17E4D1895,44B13D3F4EEB8AC9,248AAD9D9E2C1984,0CEDE2DEDDB4832F,5DFE51E2C6617CA4,4FAE3B092339A328,03B7E30D264E586B,3B5B8D2389EEB8C9,0058930348E8DA39,43C44AE173D50661,16E0B9B56763A2A6,43B05E6CCD87A765,33276E3A53106C11,24F35BCEA31E9AFB,49320DB27BA10BF5,01B69528B052EFA3,21C3025E1B2B9D3C,613FFCD9027A73D9,79A5BC34AE8B6314,35BFF98EA19690D4,156CDDD2D6791814,6E4E5A6C8F1ECA31,21BCF4CD26C307FF,15F6E07EAC6D5186,71A24162BA611651,0EDC8542160D8DAA,771BAE5451E881A8,1E47CA21337876B5,7688DC299D77C545,1166391DB32354A4,6A0AF7328EBBE113,38E48122C0FC8BCF,484874B2C669D6E1,4EF142A5D00BDA63,0508049897379E24,50B28C0858AE222C,75F2674CEE45E919,2F0DC3D306469BF9,5A86884742F89C7F,78F0F31776134860,1576EB985E541EA9,17D9C6FCB4FAB2A0,6B2E9EAF2632AEC8,007050CE9F59E77C,5D88028B3A9E633A,554191B46C16E4C4,5A0E1268E65E99F2,41A67647778AEA4D,7EADDBC2119EADA0,3D4235EB6FC9247D,5D25658948613563,5629D816678CF8FC,48A147A7F34C0131,46DF1D828736AFE1,748D83A906C897E4,0708BF363BA9595A,58384D5F0D793C09,531A0934DE43FBAC,1C4EEB7AD6B44AF4,383B57EBD5272C12,41F8077951D07ADF,0F52B4D356FDA824,1FE0805A112A03DF,38E8FFDFCD6510FF,0F65746CB1D7AD53,1E9E3010A1412DDB,7401A59C5DBD66A4,5FDC6383C702EC40,3B97B8CA49739205,5A799437D541B2DA,187E2C0B8F401ED9,0ACA1FDDEB9F6A07,4F2DC8BA863044C6,7D2383791D91CD04,54ACEAF1E8632DF1,7B9DC57CC154B2E0,0B7766A119D5E4B5,49D82E72E99EB836,509A58B6FDFFC197,0C1058BB20787615,581B528745FE0F3B,28D1C21EDE70206A,23A72A2876482029,22EB02FCBC661527,5A8F12439B09B33E,5FF7741F1AE008DE,220DE9C58B8E0E71,5D9D5C6BFE968E2C,3F0B0C29CFD04713,11B52399E03C7E5C,14ABF8C934D15151,7290BAEF5C9CF307,6A44EB5C0F8ED639,255AC0628631B47B,7ADA0B238BB2E29D,05E545728E183EFA,73908A9FF9A309BE,7542C49F2737C4DE,6BE5318AED3E68DB,581F8B63FDF26797,6936D8BB20F4668A,410ECE9587841E7F,149C29AC78DA6465,2181451A49AB930A,7930B6BDAED90925,311AD92AC357CFD7,14340B796150DF92,4D4C35DA96550436,1B5CF0365D451EED,7691E0E6C687B9C0,76D453D709EEE2ED,22AE5C6526EBDE2B,21EF55EAB088DE3E,3FAD71C1671AF556,7EBEF5D03311CF41,367C8B5BD73BC538,182E30BC4D588B3B,66DE982975F20E6D,66224C8828E08DD9,5477E77F11971CE0,2F8D4B55DAB027A2,5CF59ED990B042A0,520C69A467DE143D,53AF2CD5F4182C4B,24DA833B682CFF33,18B9A7F824DE39D0,795E7258AE19BDBA,1D03222C163B5644,1228B33FAF1BA5EC,1A13850AE27D3AD8,2879D87D53FD0746,4193B73A91FED91D,5074A9675B1AF1FC,71C8C78201C17DB6,44C0564B7D636F5B,21D0B4A593F6BDC5,2423B10B716C71BC,2410CC81562813B6,1650FEF9F8851DFF,53AE2554AE824670,79E55067BF754193,4A40CD86619B4180,6D14053CD3B145B5,3D9C134BF6D881E0,