Spn 설치 관련 문의 드립니다

안녕하세요, 서비스체인 SCN 4대 구성 및 블록 생성되는 부분 확인한 뒤에
서비스체인 내 SPN, SEN 설치를 진행 중인데, SPN 설정 후에 서비스 구동 시 genesis block is not provided 라는 메시지가 노출되어 문의 드립니다.
scn내 static-nodes.json에 pn 설정을 해 두었고, spn 내 static-nodes.json에도 cn 및 pn설정을 동일하게 해 둔 상태입니다.
(cn의 kscn 포트 설정은 30000, pn의 kspn 포트 설정은 32323으로 하고 각 static-nodes.json에도 반영되어 있음,
pn의 node key의 경우 kgen --ip “10.175.184.160” --port 32323 --file 를 통해 생성하여 data 폴더에 nodekey 및 static-nodes.json 반영,
network ID의 경우 cn pn 모두 3333으로 동일)

추가로 SPN/SEN 설치 가이드는 현재 항목 내 내용이 공란이라, 관련 가이드를 받을 수 있을지도 문의 드립니다.

감사합니다.

INFO[11/24,20:12:09 +09] [31] Enabling metrics collection
INFO[11/24,20:12:09 +09] [31] Enabling Prometheus Exporter
INFO[11/24,20:12:09 +09] [18] Setting connection type                   nodetype=spn conntype=2
INFO[11/24,20:12:09 +09] [18] Setting MaxPhysicalConnections            MaxPhysicalConnections=200
INFO[11/24,20:12:09 +09] [18] A private network ID is set               networkid=3333
INFO[11/24,20:12:09 +09] [18] Raised fd limit to process's maximum value  fd=4096
INFO[11/24,20:12:09 +09] [18] A private network ID is set               networkid=3333
INFO[11/24,20:12:09 +09] [18] Archiving mode of this node               isArchiveMode=false
INFO[11/24,20:12:09 +09] [40] Starting peer-to-peer node                instance=Klaytn/v1.7.1/linux-amd64/go1.15.7
INFO[11/24,20:12:09 +09] [46] Non-single database is used for persistent storage  DBType=LevelDB
INFO[11/24,20:12:09 +09] [46] LevelDB configurations                    path=/home/klaytn_admin/data/klay/chaindata/misc levelDBCacheSize=16 openFilesLimit=40 useBufferPool=true usePerfCheck=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000
INFO[11/24,20:12:09 +09] [46] LevelDB configurations                    path=/home/klaytn_admin/data/klay/chaindata/header levelDBCacheSize=38 openFilesLimit=102 useBufferPool=true usePerfCheck=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000
INFO[11/24,20:12:09 +09] [46] LevelDB configurations                    path=/home/klaytn_admin/data/klay/chaindata/body   levelDBCacheSize=38 openFilesLimit=102 useBufferPool=true usePerfCheck=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000
INFO[11/24,20:12:09 +09] [46] LevelDB configurations                    path=/home/klaytn_admin/data/klay/chaindata/receipts levelDBCacheSize=38 openFilesLimit=102 useBufferPool=true usePerfCheck=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000
INFO[11/24,20:12:09 +09] [46] LevelDB configurations                    path=/home/klaytn_admin/data/klay/chaindata/statetrie/0 levelDBCacheSize=76 openFilesLimit=204 useBufferPool=true usePerfCheck=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000
INFO[11/24,20:12:09 +09] [46] LevelDB configurations                    path=/home/klaytn_admin/data/klay/chaindata/statetrie/1 levelDBCacheSize=76 openFilesLimit=204 useBufferPool=true usePerfCheck=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000
INFO[11/24,20:12:09 +09] [46] LevelDB configurations                    path=/home/klaytn_admin/data/klay/chaindata/statetrie/2 levelDBCacheSize=76 openFilesLimit=204 useBufferPool=true usePerfCheck=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000
INFO[11/24,20:12:09 +09] [46] LevelDB configurations                    path=/home/klaytn_admin/data/klay/chaindata/statetrie/3 levelDBCacheSize=76 openFilesLimit=204 useBufferPool=true usePerfCheck=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000
INFO[11/24,20:12:09 +09] [46] Created a sharded database                dbType=statetrie numShards=4
INFO[11/24,20:12:09 +09] [46] LevelDB configurations                    path=/home/klaytn_admin/data/klay/chaindata/txlookup    levelDBCacheSize=16 openFilesLimit=40  useBufferPool=true usePerfCheck=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000
INFO[11/24,20:12:09 +09] [46] LevelDB configurations                    path=/home/klaytn_admin/data/klay/chaindata/bridgeservice levelDBCacheSize=16 openFilesLimit=20  useBufferPool=true usePerfCheck=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000
ERROR[11/24,20:12:09 +09] [5] No genesis is provided. --networkid should be omitted if you want to use preconfigured network 
Fatal: Error starting protocol stack: genesis block is not provided
[PN]
[        "kni://56e598fa75aab5923bb666e921c752ca258f331db27e1390bebb74aac84f002895f67376ce6c48934e5d534e0eff8b4fb4fc6dfb53890eb2037fcfa2395783a1@10.175.184.62:30000?discport=0\u0026ntype=cn",
        "kni://1709f109d1ea80a3abb1f52e3def2cea0605953e52ca2217195e372e6408230894c6a6c6a8c4b2d6f0f73bb8f2443726d8800a5e8e085cbb6c914b136a0436af@10.175.184.160:32323?discport=0\u0026ntype=pn"
]

[CN 4대중 1대]
[        "kni://2b3cb0850426baaca5ccdef7196a99ad2c8cdd9fe240ca7e764e02cfdcc22fead46452de4fe960052e89ce6e2069e335c9e042053373c4c1ddaba6224c7470c4@10.175.184.141:30000?discport=0\u0026ntype=cn",
        "kni://0d8a73b23c13bb98bc3e368ab69e92df3955c791ae382515dd63fafb7880eb2bf2bf2cded1ccfba7bb8f7f1d4e2798fbf594295ae26c07819c77fec300349c6f@10.175.184.127:30000?discport=0\u0026ntype=cn",
        "kni://56e598fa75aab5923bb666e921c752ca258f331db27e1390bebb74aac84f002895f67376ce6c48934e5d534e0eff8b4fb4fc6dfb53890eb2037fcfa2395783a1@10.175.184.62:30000?discport=0\u0026ntype=cn",
        "kni://3d4cc7f4bf991e6fe74199b0d1e708788a2a542be45f5deb410a2e82025871e7cb936bdbdb4ca043474f8e7cad3e39d49faf0dae16c408e2d69f6b022007cd95@10.175.184.22:30000?discport=0\u0026ntype=cn",
        "kni://1709f109d1ea80a3abb1f52e3def2cea0605953e52ca2217195e372e6408230894c6a6c6a8c4b2d6f0f73bb8f2443726d8800a5e8e085cbb6c914b136a0436af@10.175.184.160:32323?discport=0\u0026ntype=pn"
]


[PN]
...
NETWORK_ID=3333

PORT=32323

SERVER_TYPE=fasthttp
SYNCMODE=full
VERBOSITY=3
...

[CN]
...
NETWORK_ID=3333

PORT=30000 # if EN(main-bridge) and SCN(sub-bridge) on same instance, use different port with EN.(EN: 32323, SCN:22323)

SERVER_TYPE="fasthttp"
SYNCMODE="full"
VERBOSITY=3
...

추가로 sdk 혹은 http호출시 rpc를 통해 sendTransaction을 하는것으로 인지하고 있는데, 이 때 rpc 성능에 대한 튜닝을 conf 설정에 있는 MAX_CONNECTION 이외에 추가로 세팅 할 수 있는 방법이 있을지 문의 드립니다.
(서비스체인 구성 후 scn에 직접 한번 sendTransaction을 호출해 보고 있는데, 부하 유입 시 커넥션은 쌓이는데 타임아웃이 나고 트랜잭션 풀에는 트랜잭션이 한 두건정도만 유지되며 들어오는 부분이 있어 해당 문의 드립니다. txpool 설정은 약 16000정도로 되어 있습니다.)

"genesis block is not provided" 에러에 관하여

노드를 실행하기 전에 init 명령어를 이용해서 genesis block을 먼저 지정해줘야합니다. Docs에 있는 가이드 중 Node initialization을 수행하지 않은것을 판단됩니다. Setting up a 4-node Service Chain - Klaytn Docs 참조하시면 될것 같습니다.

RPC 기능에 관하여

언급 주신 MAX_CONNECTION 는 P2P 연결 개수이므로 HTTP 설정과 무관합니다. HTTP 서버 설정 옵션도 존재하지만 말씀주신 문제는 HTTP 서버 설정과는 다른 이유인 것 같습니다.

기본 설정 사용 시, 노드의 HTTP (fastHttp) 서버의 concurrency limit은 3000으로 설정되어 있습니다. 이 설정으로 테스트 시, 응답이 빠른 API의 경우, 초당 수만건의 API 호출도 가능했습니다. 따라서, HTTP 서버 설정이 아닌 다른 곳에서 원인과 해결방안을 찾는게 맞을 것 같습니다.

제 생각에는 아래 2가지 부분을 먼저 확인하시는게 좋을 것 같습니다.

  1. sendTransaction API 사용의 필요성
    sendTransaction은 노드에 import 되어 있는 private key를 이용하여 서명하는 과정을 포함합니다. 따라서, 이 API 사용 시에는 적절한 private key가 노드에 import되어 있어야하며, 서명을 API 호출 받은 이후에 하기에 시간도 많이 걸립니다. 즉, API를 올바르게 사용하고 계시는 확인이 필요하며, 올바르게 사용하더라도 부하에 적합한 API가 아닙니다. 부하 테스트를 위해서는 이미 서명된 transaction을 배포만하는 sendRawTransaction API 사용을 권장드립니다.

  2. sendRawTransaction을 이용해서도 동일한 문제가 발생 시, client-side 코드에 문제가 없는지 확인해주시면 좋을것 같습니다. 혹은 다른 노드 (예, baobab public EN) 등을 endpoint로 테스트하여 client-side 코드에 connection문제가 없는지 확인이 필요할 것 같습니다.

감사합니다.

*덧하여, 문의 내용에 코드가 있다보니 spam filter에 걸려서 게시문 게시에 시간이 좀 걸렸습니다. 그동안 동일한 내용으로 추가 게시글 요청하신 내용은 제가 close 하였습니다.

답변 감사드립니다.
답변주신 부분을 통해 서비스체인 구동을 모두 완료하였습니다.
구동 간 node연결 관련 추가 문의사항이 있어 확인 요청 드립니다.

현재 서비스체인을 SCN 4대, SPN 8대, SEN 4대로 구성하여 테스트를 진행하고 있습니다.
(최신 블록 번호 갱신은 모두 잘 되고 있습니다.)

현재 static-nodes.json 설정의 경우
SCN - 모든 SCN 4대의 kni 입력 및 연결될 SPN의 kni 2개, 총 6개 입력 (net.peerCount 4)
SPN - 연결할 SCN의 kni 및 인접 SPN의 kni 총 2개 입력 (net.peerCount 3)
SEN - 연결할 SPN의 kni 총 2개 입력 (net.peerCount 2)

위와 같이 설정을 해 둔 상태입니다.

  1. 관련해서 노드 설정은 위와 같이 진행하면 될지와, 각 peerCount가 위와 같이 노출되는것이 맞을지 문의 드립니다.
  2. SPN static-nodes.json 에도 연결될 SEN의 kni를 입력해 두어야 할지 문의 드립니다.
  3. 인접한 SEN끼리도 연결하는게 맞을까요?

감사합니다.

ServiceChain으로 Private Network를 구축할 때는 꼭 Cypress의 network topology를 따르지 않으셔도 됩니다. 각 노드의 역할과 필요에 따라 수나 topology를 구상하시면 됩니다.

SPN의 경우, SCN과 SEN 사이에서 블록/Tx를 전달하거나 SEN으로부터 SCN을 보호하는 역할을 합니다. SCN/SEN이 4개인 상황에서 SPN을 8개 필요한지 다시 고려해보시는 것도 좋을것 같습니다.
SEN의 경우, SPN과의 연결이 끊어지는 등의 문제를 대비하여 다른 SEN과 연결되어도 좋습니다. 물론, 하나의 SEN에서 발생한 Tx가 다른 SEN의 txpool를 가득 채울 수도 있기에 적절히 판단하시면 좋을것 같습니다.

node를 연결하는 방법에는 bootnode (SBN 바이너리)를 사용하는 방법도 있습니다. 현재 공식 문서가 부족하지만 Ethereum bootnode와 동작과 사용이 거의 동일하니 참고하셔도 좋을 것 같습니다.

아래는 추가 질문에 대한 답변입니다.

  1. 위에 제가 남긴 글을 참조하셔서 판단하시면 될 것 같습니다. 위 그림과 같이 세팅하면 말씀 주신것과 같은 peerCount가 출력될 것 같습니다,
  2. static-nodes.json은 반드시 연결해야할 노드의 kni 값을 입력하는 것이 좋습니다. SEN이 신뢰할 수 없는 다른 주체에 의해 운영되거나 자주 변경될 수 있다면, SPN의 static-nodes.json에는 SEN을 입력 안하시는 것이 좋습니다.물론, bootnode와 같은 동적인 방법을 택하시는 것도 좋습니다.
  3. Block/Tx의 전파를 얼마나 안정적으로 할 것인가에 따라 판단하시면 됩니다. 특정 SPN이 장애나거나 Network이 불안정할 때, SEN 끼리의 연결이 도움을 줄 수 있습니다. 물론, SEN 끼리 Tx를 과도하게 전파하는 문제가 발생할 수 있으니 운영하시려는 시스템에 맞게 설정하시면 됩니다.

감사합니다.

안녕하세요~ 관련해서 노드 설정에서 fasthttp 옵션 관련 설정 가이드가 있을지 문의 드립니다.

별도의 문서는 없으나 ken -h 명령어로 확인 가능한 Help 페이지에서 사용 가능한 옵션들과 설명을 확인하실 수 있습니다. API AND CONSOLE OPTIONS: 섹션의 설정들을 확인하시면 됩니다.