Tạo chuỗi dịch vụ lồng nhau
Chương này giải thích cách xây dựng mạng lưới ServiceChain theo cấu trúc phân cấp bằng cách thêm mạng lưới ServiceChain mới vào mạng lưới ServiceChain đã được xây dựng trong chương trước. Trong ví dụ này, mạng lưới ServiceChain được thêm vào cũng bao gồm 4 SCN. Mạng lưới ServiceChain được xây dựng trong chương trước là L2 còn Mạng lưới ServiceChain mới được xây dựng sẽ là L3. Chúng ta sẽ kết nối một cầu nối giữa L2 và L3 để tạo ra một cấu trúc phân cấp. Cấu trúc tổng thể của mạng lưới ServiceChain được xây dựng trong chương này sẽ như trong hình bên dưới.

Điều kiện tiên quyết
- Giả sử rằng bạn đã chuyển sang cấu hình ServiceChain và EN Baobab được mô tả trong Chuỗi dịch vụ lồng nhau. Vì vậy, chúng ta sẽ giải thích ngắn gọn những gì đã được giải thích trong phần trước.
- Giả định và hạn chế
- Một EN có thể kết nối trực tiếp với một trong các SCN của ServiceChain L2. Tương tự, một SCN trong L2 của ServiceChain có thể kết nối một-một với một trong các SCN trong L3.
- Một nút SCN có thể có một cầu chính và cả một cầu nối con. Tuy nhiên, số cổng của cầu nối chính và cầu nối con phải được đặt khác nhau. (Ví dụ: cầu nối chính: 50505, cầu nối con: 50506)
- Không phải tất cả các SCN trong L2 đều cần có cầu nối đến EN và tương tự như vậy, không phải tất cả các SCN trong L3 đều cần cầu nối đến L2. Tuy nhiên, để đạt được tính sẵn sàng cao, nên có hai hoặc nhiều cặp cầu nối chính và cầu nối con giữa các chuỗi. Trong chương này, chỉ một cặp sẽ được kết nối giữa L2 và L3 và tính sẵn sàng cao giữa L2 và L3 cũng giống như HA giữa Baobab và L2.
Bước 1: Tạo và cập nhật dữ liệu Homi cho L3
Giống như khi định cấu hình ServiceChain L2, hãy thực thi lệnh homi để tạo tập lệnh và tập tin cấu hình cho việc xây dựng L3. Bạn có thể chạy homi trên bất kỳ máy tính để bàn Linux/Mac nào. chainID của Baobab là 1001 và chainID của L2 được đặt thành 1002 trong ví dụ trước, vì vậy, để thuận tiện, chainID của L3 được đặt thành 1003. Khi vận hành chuỗi khối cho một dịch vụ thực tế, bạn phải đăng ký giá trị chainID mới tại https://chainlist.defillama.com/ để tránh xung đột chainID với các ServiceChain và chuỗi EVM khác.
$ ./homi setup --gen-type local --cn-num 4 --test-num 1 --servicechain --chainID 1003 --p2p-port 22323 -o homi-outputCreated : homi-output/keys/passwd1Created : homi-output/keys/passwd2Created : homi-output/keys/passwd3Created : homi-output/keys/passwd4Created : homi-output/scripts/genesis.jsonCreated : homi-output/keys/nodekey1Created : homi-output/keys/validator1Created : homi-output/keys/nodekey2Created : homi-output/keys/validator2Created : homi-output/keys/nodekey3Created : homi-output/keys/validator3Created : homi-output/keys/nodekey4Created : homi-output/keys/validator4Created : homi-output/scripts/static-nodes.jsonCreated : homi-output/keys_test/testkey1Created : homi-output/keys_test/keystore1/0xdC7218621513f71d609653d22C39d79d558d9CDCCreated : homi-output/Klaytn.jsonCreated : homi-output/Klaytn_txpool.json

Cập nhật thông tin địa chỉ IP và cổng của các nút ServiceChain L3 trong homi-output/scripts/static-nodes.json.
[ "kni://358235ccbf97a1f...787f7@192.168.0.21:22323?discport=0&type=cn", "kni://14ac4e3d53de5c7...6c91d@192.168.0.22:22323?discport=0&type=cn", "kni://5f36a456d93da09...8e216@192.168.0.23:22323?discport=0&type=cn", "kni://d62fd0928b9b6e5...6badf@192.168.0.24:22323?discport=0&type=cn"]
Sao chép homi-output vào tất cả các nút SCN (SCN-L3-01, SCN-L3-02, SCN-L3-03, SCN-L3-04) của ServiceChain L3.
$ scp -r path/to/homi-output user@192.168.0.21:~/ $ scp -r path/to/homi-output user@192.168.0.22:~/ $ scp -r path/to/homi-output user@192.168.0.23:~/ $ scp -r path/to/homi-output user@192.168.0.24:~/
Khởi tạo tất cả các nút.
$ kscn --datadir ~/data init ~/homi-output/scripts/genesis.json$ ls ~/datakeystore klay kscn
Kết nối với tất cả các SCN (SCN-L3-01, SCN-L3-02, SCN-L3-03 và SCN-L3-04), sao chép static-nodes.json vào thư mục dữ liệu ~/data và sao chép từng khóa núts một.
$ cp ~/homi-output/scripts/static-nodes.json ~/data/$ cp ~/homi-output/keys/nodekey{1..4} ~/data/klay/nodekey
Bước 2: Định cấu hình SCN trong L3
Chỉnh sửa conf/kscnd.conf trên tất cả các SCN trong ServiceChain L3 như sau: PORT sử dụng 22323, cổng mặc định của ServiceChain. DATA_DIR là ~/data.
...PORT=22323...DATA_DIR=~/data...
Chạy ServiceChain trên tất cả các nút SCN trong L3 và kiểm tra xem nó có hoạt động bình thường không.
$ kscnd startStarting kscnd: OK$ kscn attach --datadir ~/data> klay.blockNumber10
Bước 3: Khởi động lại sau khi cài đặt cầu nối chính L2
Kết nối với bảng điều khiển của nút SCN-L2-03, (Lưu ý: không phải L3 mà là L2) nút này sẽ đóng vai trò là cầu nối chính trong ServiceChain L2.

Chỉnh sửa tập tin cấu hình kscn conf/kscnd.conf của SCN-L2-03 như sau.
SC_MAIN_BRIDGE=1
Khởi động lại kscnd trên SCN-L2-03.
SCN-L2-03$ kscnd stopSCN-L2-03$ kscnd start
Bước 4: Kiểm tra KNI của Nút cầu nối chính
Kiểm tra thông tin KNI của nút SCN-L2-03. Giá trị này sẽ được sử dụng để tạo tập tin main-bridges.json của nút SCN-L2-03, dùng để thiết lập cầu nối con trong ServiceChain L3.

SCN-L2-03$ kscn attach --datadir ~/data> mainbridge.nodeInfo.kni"kni://87989a5a5dcc165...85b16b@[::]:50505?discport=0"
Bước 5: Định cấu hình cầu nối con L3
Kết nối với nút SCN-L3-01 sẽ tạo một cầu con của ServiceChain L3 (Lưu ý: không phải là L2). Tạo main-bridges.json trong thư mục ~/data. Thay thế [::] sau @ bằng địa chỉ IP của nút mà bạn đã kiểm tra ở bước 4.
SCN-L3-01$ echo '["kni://87989a5a5dcc165...85b16b@192.168.0.13:50505?discport=0"]' > ~/data/main-bridges.json
Chỉnh sửa tập tin cấu hình conf/kscnd.conf của nút SCN-L3-01 với cầu nối con như sau. đặt SC_SUB_BRIDGE thành 1 để kích hoạt kết nối cầu nối và SC_PARENT_CHAIN_ID là 1002, chainID của L2, Đặt SC_ANCHORING thành 1 để tự động neo dữ liệu khi khởi động lại. Bạn cũng có thể truy cập tập lệnh shell SCN-L3-01 và bật neo dữ liệu bằng lệnh subbridge.anchoring(true) hoặc tắt tính năng này bằng lệnh subbridge.anchoring(false). SC_ANCHORING_PERIOD là tham số xác định tần suất gửi các giao dịch neo đến chuỗi mẹ. Đặt nút để neo sau mỗi 10 khối bằng cách đặt giá trị là 10. Mặc định là 1.
SC_SUB_BRIDGE=1…SC_PARENT_CHAIN_ID=1002…SC_ANCHORING=1SC_ANCHORING_PERIOD=10
Khởi động lại kscnd trên SCN-L3-01 sau khi hoàn tất thiết lập.
SCN-L3-01$ kscnd stopShutting down kscnd: KilledSCN-L3-01$ kscnd startStarting kscnd: OK
Kiểm tra subbridge.peers.length để xem SCN-L3-01 có được kết nối với SCN-L2-03 hay không, kiểm tra subbridge.latestAnchoredBlockNumber để nắm được số khối được neo mới nhất để xem việc neo có đang được thực hiện hay không.
SCN-L3-01$ kscn attach --datadir ~/data> subbridge.peers.length1> subbridge.latestAnchoredBlockNumber5010