プライベートチェーン
この記事はプライベートチェーンの話です。
この記事はプライベートチェーンの話です。
この記事はプライベートチェーンの話です。
この記事はプライベートチェーンの話です。
この記事はプライベートチェーンの話です。
秒間4000トランザクション
「カタパルトになると、秒間4000トランザクションになるんですか?」
「パブリックの数値ではなく、プライベートの数値です」が答えなのですが、「プライベートの数値です」というにも、試したことがないので「本当ですか?」と詰められたら不安になります。
そこで、せっかくオープンソースになっているので、自分で検証してみてるのも面白いなと思いました。
イメージ
秒間4000トランザクションっていうと、ブロック生成時間が15秒の設定で、
1ブロックあたり60000トランザクション必要です。
ブロック生成時間が1分だと、1ブロックあたり240000トランザクション必要です。
ちなみに、NEMは1ブロックあたり120トランザクションが最大です。
手順
それでは、秒間4000トランザクションの性能が出るかどうか、やってみます。
再現性を確保するために、できるだけありのままの設定でいきたいと思います。
環境セットアップ
マシンはAzure VMを使用し、サイズはF32s_v2を使用し、以下の環境で行います。
- ubuntu 18.04 LTS
- git 2.17.1
- docker 18.06.1
- docker-compose 1.22.0
- nodejs v10.11
また、VMでは、以下のポート開放を行っておきます。
- 22
- 3000
- 8000
Catapultを起動する
git clone https://github.com/tech-bureau/catapult-service-bootstrap
cd catapult-service-bootstrap
git checkout 77e6cf38a7845194aa2ce72f4ed4d87e5ab791e3
docker-compose -f docker-compose-with-explorer.yml up -d
※Alpacaバージョンでやります
トランザクションをあらかじめ作成する
トランザクション作成のうち、署名する処理が重そうです。作成して送信を繰り返すと、間に合わない恐れがあるので、あらかじめ署名済みトランザクションを大量に作っておきます。
git clone https://github.com/planethouki/yonsen.git
cd yonsen
npm install
残高のあるアカウントが必要なので、nemesisアドレスの秘密鍵を取得します。addresses.yaml
を開いて、nemesis_addresses:
以下のprivate
の値をとってきて、nemesiskeys.json
ファイルを作ります。
cat ../build/generated-addresses/addresses.yaml
vi nemesiskeys.json
nemesis_addresses:
- private: 1947340C6102E18927B98D49FB4A7947AB0C5AFCDB31F34F7EA85209A2252CF2
public: <something>
address: <something>
- private: 1627E64F23841C748DB9B1650ADFEC8868003158D7803A0652FE76FBD2D617B0
<and more>
↑のprivateのところを↓に列挙
[
"1947340C6102E18927B98D49FB4A7947AB0C5AFCDB31F34F7EA85209A2252CF2",
"1627E64F23841C748DB9B1650ADFEC8868003158D7803A0652FE76FBD2D617B0",
"2D280ADE3C870B2AD6B962DE191743C763823EC07E897846E5398546E9D69EC7",
"354AF480EE43126FDC3DD11FD0F6537647F8413B7676536DFFFC671F850DF8A4",
"<and more>"
]
それでは作成処理を走らせていきます。先ほど作成した秘密鍵の中からランダムに受信者と署名者を選択して、トランザクションを作るようになってます。2時間くらいかかります。ゲームや読書をして時間をつぶしましょう。
npm run create32
これにより、トランザクションが32万個入ったテキストファイルが8個できます。
できあがったファイルは、このように、ひたすらペイロードが並んでいます。
A50000000363C105F26EC44563137F35A3389E17E15541171118CA45A2253BE379226A0E2142F03DF9F54A14140456B35B1154C6D87BC5C9C771AF66D4883DB7263B970FAAD87BCE49947988710B561FF8F197791E82D15FAE02C1FC661913221B3168C5039054410000000000000000068181361300000090D122B0A1031846C76CBC7D59B298B4CE74307D1562F8CEE60100010029CF5FD941AD25D580841E0000000000
A50000000A201FD031F321F37875266BABAB299B18D3D3B07995C40E1C4F45F838DCD8F776DB75EF24FC6807BB9458FD5B578436DFECE17FEEB7393EE8489B8EB84B9708BDC47DA1770D60BE59458955F6FAFEB1BCCAC724068A08B16E709B49B038AC6303905441000000000000000015818136130000009038E6207AD52AAAA352952E40303B9507A9B548AC96D0176E0100010029CF5FD941AD25D5808D5B0000000000
A5000000C19C58720E65C1FE48586B0697EF251E0C1339596F8631535CE721739330F44A1CBCC66B1B01D0D1E52DBC7A963CB86CEA602A220CCBC9F3336E007AAC4F1906A111E52857B11526FC947E5B35BEB120003CF683D8D58C933C66B9F2479E3ED5039054410000000000000000248181361300000090A3ADA63DEB12930DE99439873D54679EEA3D8D50D293FA3C0100010029CF5FD941AD25D580841E0000000000
A5000000D54EFB265418A258BED1E66D5D2AB00DAC428A402500D117D2CD36CA8920A68F06FC88606D0CEC636D73DB4BD698FCB6632CBE5677D7F10288879F52E85FEA0BEF895B241FE52C943732D66D331810F96859AAF5F01B8ABD11B2AB8B5F4725380390544100000000000000004681813613000000901451D6A14DD5998906CA091C7E5F3D941233717EEE3304E70100010029CF5FD941AD25D5C0CF6A0000000000
A500000006347DABEE0F6037957A1E80232BC2DFF32ACA313C1592D16D222634EFED5E651424FF6FE49B1395BF7BA3BF72402CB35108DEBFBEFB23E26D45814B57A35707A594C49AF8E95AE87450D99957BF7052A00CDE4E2345475415C081CCC53F401103905441000000000000000067818136130000009091064DF93DAE8C16706BEDA010AD0E4475B513E3E1CBF2850100010029CF5FD941AD25D580841E0000000000
A500000074662C063BE55D7D01A9A412791E532B70CDCFF93451DBFE5B011F170193FD5A134030BF4148E35B5FC54E310CA4A36CCF314E9838046A9C476450C7C7D7E101BDC47DA1770D60BE59458955F6FAFEB1BCCAC724068A08B16E709B49B038AC63039054410000000000000000908181361300000090D122B0A1031846C76CBC7D59B298B4CE74307D1562F8CEE60100010029CF5FD941AD25D500127A0000000000
A50000000BF8C02E4DFD5A90DF65A7D5B18C701819C2F234FED93CBD6D6D8B01D78ADADED9B0CC316AFCAAE31FBDBDD4CE83646749FB693CF7B23F8CC96A04289AC4500A3548D5BD43DD840726778609A6E5CCAF7359A80E8EF4117F07010CE7E54BFB800390544100000000000000009F818136130000009016CDA788B3EDF7C3498EF5CCDB24885BBB7977FD661B40860100010029CF5FD941AD25D500127A0000000000
A5000000B32236F28B618D562367A2F52362C1311A93D8291AFFD3937840FB1BCC50F7C4C2E2D09CE9216BCBEBAD8890686B653AB2D5F10C7F02343C3C012B405BFFF30B8364AD86104064C268D166E2522A8D88C36FD3BB6FEA9862C679F2706178FBEB039054410000000000000000C281813613000000901451D6A14DD5998906CA091C7E5F3D941233717EEE3304E70100010029CF5FD941AD25D5C0CF6A0000000000
A500000062E538ED968016ABF8500DAE6A727842FB56CF582D5BAF9357D3E23EA677432C81141D11A12C3BC1A8A586966AA46699D4F7B9BBAE3E41D2677400FA374B6D0408F034041AB4C0CB6692985BE06DDB887289F52D2E0A95AFF9C6D2A3BD42055E039054410000000000000000828181361300000090C8453CA8D5FAB0A7363F448311FD0FA266C646D59C9D312B0100010029CF5FD941AD25D580841E0000000000
A50000002A028616EE26B5EC09BC15A8A2742A8CD5E4A1D8494BDB4E4E0D35870CEB14F2DCB1B72456A36C35BA0A20BFB76519462FA7799FAA0100570A1CC4A82DE6830CDCB11E2550BDBF17C7D89E86B0E2C80A5B63DBA187CC1780D905951DF3135915039054410000000000000000E381813613000000909B9DC59709A46FABF6EBE28A80794D443DDAF91FE9DB1D300100010029CF5FD941AD25D5C0CF6A0000000000
...
作成したトランザクションを送信する
まずはお試しで500トランザクションほど送信します。
npm run send1
npm run send500
send1
でトランザクションをひとつ投げます。send500
で500個投げます。
この程度でしたら、ブロックエクスプローラーで見れるので、確認しておきます。(VMの8000番ポートにブラウザからhttpアクセスすると見れます)
そして、send32
で、先ほど作った32万×8個のトランザクションを投げます。
npm run send32
15分くらいかかるでしょうか。終わるまで待ちます。
この量になると、ブロックエクスプローラーではエラーになるので、次の方法で集計します。
トランザクション数の集計
ブロックチェーンエクスプローラーでは、CONTENT_LENGTH_MISMATCH
的なエラーが出て、うまく表示できません。なので、nem2-sdkを使って取得し、Excelを使って集計します。
npm run view
Toggle
{"height":1,"timestamp":"2016-04-01T00:00:00.000Z","harvester":"SAXNID-TNOM6A-2JZOWT-SDW4PB-CY5BU2-VWZL75-BFQG","txes":25,"fees":0}
{"height":2,"timestamp":"2018-12-09T05:14:51.094Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":0,"fees":0}
{"height":3,"timestamp":"2018-12-09T05:15:13.097Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":1,"fees":0}
{"height":4,"timestamp":"2018-12-09T05:15:36.100Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":0,"fees":0}
{"height":5,"timestamp":"2018-12-09T05:16:04.103Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":500,"fees":0}
{"height":6,"timestamp":"2018-12-09T05:16:16.106Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":0,"fees":0}
{"height":7,"timestamp":"2018-12-09T05:16:38.108Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":13146,"fees":0}
{"height":8,"timestamp":"2018-12-09T05:17:06.123Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":113285,"fees":0}
{"height":9,"timestamp":"2018-12-09T05:17:30.251Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":98982,"fees":0}
{"height":10,"timestamp":"2018-12-09T05:17:56.340Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":105007,"fees":0}
{"height":11,"timestamp":"2018-12-09T05:18:19.433Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":28303,"fees":0}
{"height":12,"timestamp":"2018-12-09T05:18:41.470Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":153513,"fees":0}
{"height":13,"timestamp":"2018-12-09T05:18:54.594Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":25990,"fees":0}
{"height":14,"timestamp":"2018-12-09T05:19:19.624Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":127507,"fees":0}
{"height":15,"timestamp":"2018-12-09T05:19:41.733Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":43008,"fees":0}
{"height":16,"timestamp":"2018-12-09T05:20:05.772Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":140779,"fees":0}
{"height":17,"timestamp":"2018-12-09T05:20:35.922Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":125231,"fees":0}
{"height":18,"timestamp":"2018-12-09T05:20:47.040Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":28053,"fees":0}
{"height":19,"timestamp":"2018-12-09T05:21:11.064Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":30522,"fees":0}
{"height":20,"timestamp":"2018-12-09T05:21:35.092Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":179782,"fees":0}
{"height":21,"timestamp":"2018-12-09T05:21:56.232Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":18894,"fees":0}
{"height":22,"timestamp":"2018-12-09T05:22:14.254Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":138686,"fees":0}
{"height":23,"timestamp":"2018-12-09T05:22:37.431Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":30691,"fees":0}
{"height":24,"timestamp":"2018-12-09T05:22:51.469Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":118690,"fees":0}
{"height":25,"timestamp":"2018-12-09T05:23:09.561Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":16144,"fees":0}
{"height":26,"timestamp":"2018-12-09T05:23:17.595Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":89018,"fees":0}
{"height":27,"timestamp":"2018-12-09T05:23:42.667Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":100977,"fees":0}
{"height":28,"timestamp":"2018-12-09T05:24:00.747Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":72699,"fees":0}
{"height":29,"timestamp":"2018-12-09T05:24:18.804Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":72705,"fees":0}
{"height":30,"timestamp":"2018-12-09T05:24:39.881Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":32319,"fees":0}
{"height":31,"timestamp":"2018-12-09T05:24:53.919Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":111107,"fees":0}
{"height":32,"timestamp":"2018-12-09T05:25:16.017Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":88856,"fees":0}
{"height":33,"timestamp":"2018-12-09T05:25:38.100Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":19475,"fees":0}
{"height":34,"timestamp":"2018-12-09T05:25:57.128Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":146135,"fees":0}
{"height":35,"timestamp":"2018-12-09T05:26:15.261Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":24239,"fees":0}
{"height":36,"timestamp":"2018-12-09T05:26:34.284Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":125204,"fees":0}
{"height":37,"timestamp":"2018-12-09T05:26:48.377Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":44516,"fees":0}
{"height":38,"timestamp":"2018-12-09T05:27:04.442Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":78799,"fees":0}
{"height":39,"timestamp":"2018-12-09T05:27:14.504Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":14025,"fees":0}
{"height":40,"timestamp":"2018-12-09T05:27:38.517Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":0,"fees":0}
{"height":41,"timestamp":"2018-12-09T05:27:59.520Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":0,"fees":0}
{"height":42,"timestamp":"2018-12-09T05:28:17.522Z","harvester":"SCT6Y6-BMHHBM-JNA7LA-W6SYZX-ZSAUB5-K2EL7V-XEC2","txes":0,"fees":0}
- [sec]:ブロック生成にかかった時間
- [TXs]:ブロックに含まれるトランザクション数
- [tx/sec]:秒間トランザクション
Height | Timestamp | [sec] | [TXs] | [tx/sec] |
---|---|---|---|---|
1 | 2016-04-01T00:00:00.000Z | 25 | 0000.00 | |
2 | 2018-12-09T05:14:51.094Z | 51 | 0 | 0000.00 |
3 | 2018-12-09T05:15:13.097Z | 22 | 1 | 0000.05 |
4 | 2018-12-09T05:15:36.100Z | 23 | 0 | 0000.00 |
5 | 2018-12-09T05:16:04.103Z | 28 | 500 | 0017.86 |
6 | 2018-12-09T05:16:16.106Z | 12 | 0 | 0000.00 |
7 | 2018-12-09T05:16:38.108Z | 22 | 13146 | 0597.55 |
8 | 2018-12-09T05:17:06.123Z | 28 | 113285 | 4045.89 |
9 | 2018-12-09T05:17:30.251Z | 24 | 98982 | 4124.25 |
10 | 2018-12-09T05:17:56.340Z | 26 | 105007 | 4038.73 |
11 | 2018-12-09T05:18:19.433Z | 23 | 28303 | 1230.57 |
12 | 2018-12-09T05:18:41.470Z | 22 | 153513 | 6977.86 |
13 | 2018-12-09T05:18:54.594Z | 13 | 25990 | 1999.23 |
14 | 2018-12-09T05:19:19.624Z | 25 | 127507 | 5100.28 |
15 | 2018-12-09T05:19:41.733Z | 22 | 43008 | 1954.91 |
16 | 2018-12-09T05:20:05.772Z | 24 | 140779 | 5865.79 |
17 | 2018-12-09T05:20:35.922Z | 30 | 125231 | 4174.37 |
18 | 2018-12-09T05:20:47.040Z | 12 | 28053 | 2337.75 |
19 | 2018-12-09T05:21:11.064Z | 24 | 30522 | 1271.75 |
20 | 2018-12-09T05:21:35.092Z | 24 | 179782 | 7490.92 |
21 | 2018-12-09T05:21:56.232Z | 21 | 18894 | 0899.71 |
22 | 2018-12-09T05:22:14.254Z | 18 | 138686 | 7704.78 |
23 | 2018-12-09T05:22:37.431Z | 23 | 30691 | 1334.39 |
24 | 2018-12-09T05:22:51.469Z | 14 | 118690 | 8477.86 |
25 | 2018-12-09T05:23:09.561Z | 18 | 16144 | 0896.89 |
26 | 2018-12-09T05:23:17.595Z | 8 | 89018 | 11127.25 |
27 | 2018-12-09T05:23:42.667Z | 25 | 100977 | 4039.08 |
28 | 2018-12-09T05:24:00.747Z | 18 | 72699 | 4038.83 |
29 | 2018-12-09T05:24:18.804Z | 18 | 72705 | 4039.17 |
30 | 2018-12-09T05:24:39.881Z | 21 | 32319 | 1539.00 |
31 | 2018-12-09T05:24:53.919Z | 14 | 111107 | 7936.21 |
32 | 2018-12-09T05:25:16.017Z | 23 | 88856 | 3863.30 |
33 | 2018-12-09T05:25:38.100Z | 22 | 19475 | 0885.23 |
34 | 2018-12-09T05:25:57.128Z | 19 | 146135 | 7691.32 |
35 | 2018-12-09T05:26:15.261Z | 18 | 24239 | 1346.61 |
36 | 2018-12-09T05:26:34.284Z | 19 | 125204 | 6589.68 |
37 | 2018-12-09T05:26:48.377Z | 14 | 44516 | 3179.71 |
38 | 2018-12-09T05:27:04.442Z | 16 | 78799 | 4924.94 |
39 | 2018-12-09T05:27:14.504Z | 10 | 14025 | 1402.50 |
40 | 2018-12-09T05:27:38.517Z | 24 | 0 | 0000.00 |
41 | 2018-12-09T05:27:59.520Z | 21 | 0 | 0000.00 |
42 | 2018-12-09T05:28:17.522Z | 18 | 0 | 0000.00 |
結果
平均して秒間 4040 トランザクション
(8~38ブロックを計算に使用)(626秒で2,529,116TX)
見事、秒間4000トランザクションを達成することができました。
おねだん
それでは、そのマシンはおいくらなんでしょうか。
Azure VMの価格表です。
今回は、Azure VM F32s_v2を使いました。月間コストは、およそ17万円。
(コスト計算は詳しくないですが、これにデータ転送やディスク使用などのコストが載ってくると思います。)
この価格、安いでしょうか、高いでしょうか。
あなたはどう思いますか?
まとめ
この記事はプライベートチェーンの話です。
この記事はプライベートチェーンの話です。
この記事はプライベートチェーンの話です。
この記事はプライベートチェーンの話です。
この記事はプライベートチェーンの話です。
これで、自信をもって「プライベートでは秒間4000トランザクション出せます」と言い切ることができるようになりました。
今回は、チューニングを一切しませんでした。もっと工夫すれば、安いマシンで性能がでるかもしれません。