안녕하세요,
엔드포인트 노드를 통해 하나의 서비스를 만드는 경우를 테스트해보고 있습니다.
사용자는 엔드포인트를 통해, 블록체인의 데이터를 조회하고, 이를 기반으로 트랜잭션을 생성하여 Submission 합니다.
때문에, 엔드포인트 노드가 전체 네트워크에 비해 싱크가 느린 경우, 사용자는 옛날 데이터를 보고 트랜잭션을 Submit 하는 문제가 발생합니다.
예를 들어, 오늘은 블록 55728070에 94개의 트랜잭션이 포함 되어 있었는데… 제 노드 사양이 안좋아서 그런지 처리가 오래 걸렸네요.
(SSD IOPS 20000 을 사용하고 있습니다)
INFO[04/03,14:46:23 +09] [5] Inserted a new block number=55728070 hash=.... txs=94 gas=15667635 elapsed=5.141s processTxs=5.100s finalize=15.306ms validateState=260.17 µs totalWrite=22.791183ms trieWrite=21.638027ms
물론 엔드포인트 노드가 뒤쳐지지 않게, 고사양의 머신을 쓰는 것은 맞지만.
최악의 경우 이런 순간이 발생하면 사용자에게 경고해주거나, 사용자의 트랜잭션 Submit을 받지 않도록 해야 할 것 같습니다.
방법 1. 엔드포인트 노드에서, 현재 최신 블록에 비해 몇 블록이나 뒤쳐졌는지를 실시간으로 파악하여, 특정 블록 수 이상 벌어지면, 트랜잭션을 받지 않는다. (하지만 이를 파악할 수 있는 방법이 있을지…)
방법 2. 최신 블록 갱신 후, 평균 블록 생성 시간이 지났음에도 블록이 갱신 되지 않을 경우, 트랜잭션을 받지 않는다.
어떤식의 접근법이 적당할지 조언을 구하고 싶습니다~
그런데, 55728064 블록은 104개 트랜잭션을 처리 했는데. 처리가 빨리 됐네요…
INFO[04/03,14:46:12 +09] [5] Inserted a new block number=55728064 hash=.... txs=104 gas=9118959 elapsed=35.802ms processTxs=28.890ms finalize=1.612ms validateState=242.399µs totalWrite=2.261357ms trieWrite=1.088545ms
Ethan
4월 7, 2021, 12:04오전
2
안녕하세요. Klaytn에 관심을 갖고 문의를 주셔서 감사합니다.
말씀하신 상황과 같이 노드의 DB, Cache의 상태에 따라서 블록 처리시간의 편차가 발생하는 경우가 발생되고 있으며 이를 단기적으로는 완화하는 안을 그리고 중장기적으로는 해결하기 위해 노력중입니다.
말씀하신데로 노드가 현재 다른 peer에 비해서 블록이 뒤쳐져 있는지 그로인해 최신 1블록씩 받는게 아니라 batch로 받기위해 downloder가 동작중인지는 아래 API를 사용하시면 확인이 가능합니다.
해당 API로 나의 블록번호와 peer의 블록번호(highestBlock)이 얼마나 차이나는지 확인가능하며 false
로 리턴되는 경우는 모든 peer의 블록과 해당 노드의 블록이 sync가 완료된 경우로 최신상태입니다.
https://docs.klaytn.com/bapp/json-rpc/api-references/klay/block#klay_syncing
제 생각으로 보통의 서비스는 어느정도의 블록이 뒤처짐에 크게 영향이 없을것이라 생각되지만 만약 최신정보를 보는 것이 정말 중요하다면 말씀하신 것처럼 해당 API로 최신이 아니고 어느정도 차이가 발생한다면 확인하여 대처를 하는것이 좋은 방법으로 보입니다.
감사합니다.
1개의 좋아요
답변 감사드립니다~
혹시 괜찮으시다면, 본문에 있는 INFO 로그에 나타난 숫자들에 대해서 간단히 설명을 부탁드려도 될까요?
INFO[04/03,14:46:23 +09] [5] Inserted a new block …
number=55728070
hash=… (블록의 해쉬)
txs=94 (블록에서 포함되어 처리 된 트랜잭션의 수)
gas=15667635 (블록에서 처리된 트랜잭션들의 처리에 소모된 총 가스의 량)
아래부터는 잘 모르겠네요…
elapsed=5.141s
processTxs=5.100s
finalize=15.306ms
validateState=260.17 µs
totalWrite=22.791183ms
trieWrite=21.638027ms
안녕하세요 @sytech 님. 문의 주신 항목에 대해서는 아래와 같이 설명드릴 수 있습니다.
혹시 이해가 안되는 부분이 있으시다면 질문주세요. 감사합니다.
elapsed=5.141s
= 블록 처리에 걸린 시간
processTxs=5.100s
= 트랜잭션 실행에 걸린 시간
finalize=15.306ms
= 블록 리워드 반영 및 스테이킹 정보 변경 등 트랜잭션 처리 이외의 상태 변경에 대해 걸린 시간
validateState=260.17 µs
= header에 명시된 정보와 실제 블록 처리 후 얻은 정보(=가스 사용량, receipts hash, state root hash)를 비교하는데 걸린 시간
totalWrite=22.791183ms
= 전체 쓰기에 걸린 시간(=header, block body, tx lookup entry, receipts, state trie)
trieWrite=21.638027ms
= state trie 쓰기에 걸린 시간
1개의 좋아요