Edited at
nemDay 14

プライベートチェーンのカタパルトで秒間4000トランザクションを目指してみる


プライベートチェーン

この記事はプライベートチェーンの話です。

この記事はプライベートチェーンの話です。

この記事はプライベートチェーンの話です。

この記事はプライベートチェーンの話です。

この記事はプライベートチェーンの話です。


秒間4000トランザクション

「カタパルトになると、秒間4000トランザクションになるんですか?」

「パブリックの数値ではなく、プライベートの数値です」が答えなのですが、「プライベートの数値です」というにも、試したことがないので「本当ですか?」と詰められたら不安になります。

そこで、せっかくオープンソースになっているので、自分で検証してみてるのも面白いなと思いました。


イメージ

秒間4000トランザクションっていうと、ブロック生成時間が15秒の設定で、

1ブロックあたり60000トランザクション必要です。

ブロック生成時間が1分だと、1ブロックあたり240000トランザクション必要です。

ちなみに、NEMは1ブロックあたり120トランザクションが最大です。

秒間4000トランザクションのイメージ


手順

それでは、秒間4000トランザクションの性能が出るかどうか、やってみます。

再現性を確保するために、できるだけありのままの設定でいきたいと思います。

yonsen-Page-3 (1).jpg


環境セットアップ

マシンは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


addresses.yaml

nemesis_addresses:

- private: 1947340C6102E18927B98D49FB4A7947AB0C5AFCDB31F34F7EA85209A2252CF2
public: <something>
address: <something>
- private: 1627E64F23841C748DB9B1650ADFEC8868003158D7803A0652FE76FBD2D617B0
<and more>

↑のprivateのところを↓に列挙


nemesiskeys.json

[

"1947340C6102E18927B98D49FB4A7947AB0C5AFCDB31F34F7EA85209A2252CF2",
"1627E64F23841C748DB9B1650ADFEC8868003158D7803A0652FE76FBD2D617B0",
"2D280ADE3C870B2AD6B962DE191743C763823EC07E897846E5398546E9D69EC7",
"354AF480EE43126FDC3DD11FD0F6537647F8413B7676536DFFFC671F850DF8A4",
"<and more>"
]

それでは作成処理を走らせていきます。先ほど作成した秘密鍵の中からランダムに受信者と署名者を選択して、トランザクションを作るようになってます。2時間くらいかかります。ゲームや読書をして時間をつぶしましょう。

npm run create32

これにより、トランザクションが32万個入ったテキストファイルが8個できます。

できあがったファイルは、このように、ひたすらペイロードが並んでいます。


payload_320000_8/payload0001.txt

A50000000363C105F26EC44563137F35A3389E17E15541171118CA45A2253BE379226A0E2142F03DF9F54A14140456B35B1154C6D87BC5C9C771AF66D4883DB7263B970FAAD87BCE49947988710B561FF8F197791E82D15FAE02C1FC661913221B3168C5039054410000000000000000068181361300000090D122B0A1031846C76CBC7D59B298B4CE74307D1562F8CEE60100010029CF5FD941AD25D580841E0000000000

A50000000A201FD031F321F37875266BABAB299B18D3D3B07995C40E1C4F45F838DCD8F776DB75EF24FC6807BB9458FD5B578436DFECE17FEEB7393EE8489B8EB84B9708BDC47DA1770D60BE59458955F6FAFEB1BCCAC724068A08B16E709B49B038AC6303905441000000000000000015818136130000009038E6207AD52AAAA352952E40303B9507A9B548AC96D0176E0100010029CF5FD941AD25D5808D5B0000000000
A5000000C19C58720E65C1FE48586B0697EF251E0C1339596F8631535CE721739330F44A1CBCC66B1B01D0D1E52DBC7A963CB86CEA602A220CCBC9F3336E007AAC4F1906A111E52857B11526FC947E5B35BEB120003CF683D8D58C933C66B9F2479E3ED5039054410000000000000000248181361300000090A3ADA63DEB12930DE99439873D54679EEA3D8D50D293FA3C0100010029CF5FD941AD25D580841E0000000000
A5000000D54EFB265418A258BED1E66D5D2AB00DAC428A402500D117D2CD36CA8920A68F06FC88606D0CEC636D73DB4BD698FCB6632CBE5677D7F10288879F52E85FEA0BEF895B241FE52C943732D66D331810F96859AAF5F01B8ABD11B2AB8B5F4725380390544100000000000000004681813613000000901451D6A14DD5998906CA091C7E5F3D941233717EEE3304E70100010029CF5FD941AD25D5C0CF6A0000000000
A500000006347DABEE0F6037957A1E80232BC2DFF32ACA313C1592D16D222634EFED5E651424FF6FE49B1395BF7BA3BF72402CB35108DEBFBEFB23E26D45814B57A35707A594C49AF8E95AE87450D99957BF7052A00CDE4E2345475415C081CCC53F401103905441000000000000000067818136130000009091064DF93DAE8C16706BEDA010AD0E4475B513E3E1CBF2850100010029CF5FD941AD25D580841E0000000000
A500000074662C063BE55D7D01A9A412791E532B70CDCFF93451DBFE5B011F170193FD5A134030BF4148E35B5FC54E310CA4A36CCF314E9838046A9C476450C7C7D7E101BDC47DA1770D60BE59458955F6FAFEB1BCCAC724068A08B16E709B49B038AC63039054410000000000000000908181361300000090D122B0A1031846C76CBC7D59B298B4CE74307D1562F8CEE60100010029CF5FD941AD25D500127A0000000000
A50000000BF8C02E4DFD5A90DF65A7D5B18C701819C2F234FED93CBD6D6D8B01D78ADADED9B0CC316AFCAAE31FBDBDD4CE83646749FB693CF7B23F8CC96A04289AC4500A3548D5BD43DD840726778609A6E5CCAF7359A80E8EF4117F07010CE7E54BFB800390544100000000000000009F818136130000009016CDA788B3EDF7C3498EF5CCDB24885BBB7977FD661B40860100010029CF5FD941AD25D500127A0000000000
A5000000B32236F28B618D562367A2F52362C1311A93D8291AFFD3937840FB1BCC50F7C4C2E2D09CE9216BCBEBAD8890686B653AB2D5F10C7F02343C3C012B405BFFF30B8364AD86104064C268D166E2522A8D88C36FD3BB6FEA9862C679F2706178FBEB039054410000000000000000C281813613000000901451D6A14DD5998906CA091C7E5F3D941233717EEE3304E70100010029CF5FD941AD25D5C0CF6A0000000000
A500000062E538ED968016ABF8500DAE6A727842FB56CF582D5BAF9357D3E23EA677432C81141D11A12C3BC1A8A586966AA46699D4F7B9BBAE3E41D2677400FA374B6D0408F034041AB4C0CB6692985BE06DDB887289F52D2E0A95AFF9C6D2A3BD42055E039054410000000000000000828181361300000090C8453CA8D5FAB0A7363F448311FD0FA266C646D59C9D312B0100010029CF5FD941AD25D580841E0000000000
A50000002A028616EE26B5EC09BC15A8A2742A8CD5E4A1D8494BDB4E4E0D35870CEB14F2DCB1B72456A36C35BA0A20BFB76519462FA7799FAA0100570A1CC4A82DE6830CDCB11E2550BDBF17C7D89E86B0E2C80A5B63DBA187CC1780D905951DF3135915039054410000000000000000E381813613000000909B9DC59709A46FABF6EBE28A80794D443DDAF91FE9DB1D300100010029CF5FD941AD25D5C0CF6A0000000000
...


作成したトランザクションを送信する

まずはお試しで500トランザクションほど送信します。

npm run send1

npm run send500

send1でトランザクションをひとつ投げます。send500で500個投げます。

この程度でしたら、ブロックエクスプローラーで見れるので、確認しておきます。(VMの8000番ポートにブラウザからhttpアクセスすると見れます)

image.png

そして、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の価格表です。

image.png

今回は、Azure VM F32s_v2を使いました。月間コストは、およそ17万円。

(コスト計算は詳しくないですが、これにデータ転送やディスク使用などのコストが載ってくると思います。)

yonsen-Page-2.jpg

この価格、安いでしょうか、高いでしょうか。

あなたはどう思いますか?


まとめ

この記事はプライベートチェーンの話です。

この記事はプライベートチェーンの話です。

この記事はプライベートチェーンの話です。

この記事はプライベートチェーンの話です。

この記事はプライベートチェーンの話です。

これで、自信をもって「プライベートでは秒間4000トランザクション出せます」と言い切ることができるようになりました。

今回は、チューニングを一切しませんでした。もっと工夫すれば、安いマシンで性能がでるかもしれません。