kaistshadow / blockchain-sim

Scalable blockchain simulator/emulator running on shadow simulator
MIT License
9 stars 1 forks source link

TPS/Latency test supports BLEEPlib(POW) #332

Closed hyojin5658 closed 3 years ago

hyojin5658 commented 3 years ago

BLEEPlibrary를 사용해서 만든 블록체인의 tps와 latency를 측정하는 테스트를 만들고자 한다.

hyojin5658 commented 3 years ago

BLEEPlib지원하는 Latency/ TPS 테스트를 만들기 위하여 다음과 같은 일을 해야한다.

해당 브랜치는 현재

hyojin5658 commented 3 years ago

현재 상태는 Monitoring node만 연결 해 놓은상태( generator 노드는 BLEEPlib들과 연결하지 않은 상태)

  1. monitoring node와 BLEEPlib 연결 하게되면 notifyPeerId 메세지 주고 받으면 연결 된 것으로 간주( 더이상의 메세지 보내지 않음)
  2. BLEEPlib가 블록을 마이닝 한 후에 블록 메세지를 보내게 되면 INV메세지를 보냄 -> 그걸 받은 Monitoring node는 블록의 전체 정보를 알려달라는 POWBLOCK-GETDATA 메세지를 보냄 -> 메세지를 받은 BLEEPlib 노드는 해당 블록에 대한 정보를 POWBLOCK-BLOCK 메세지에 담아서 다시 monitornig 노드에게 보낸다.
  3. 이후에 Monitoring node는 해당 블록을 monitoring 노드가 관리 하고있는 chain에 등록한다.
hyojin5658 commented 3 years ago

현재 커밋에서 예를들어, 1-2-3(tip) 순서로 블록이 생성 되어 있다고 했을때, monitoring node가 POWBLOCK-BLOCK 메세지를 2-1-3의 순서로 받았을 때, monitoring node의 동작이 멈추어 버리느 경우가 있다.

코드 상에서 정확히 에러나는 지점은 blocktreebase 함수의 2번째줄인 blocks에 해당 블록을 append 하는 부분에서 동작이 멈추어 버린다. 해당 블록의 block hash나, tx hash 들은 모두 정상적으로 포함되어 있으나, 에러가 발생한다. image

hyojin5658 commented 3 years ago

이는 genesis block을 모르는 상태에서 tree에서 자신의 parent block 를 찾는 과정에서 해당 prevhash 블록이 없기 때문에 발생하는 문제이다.

이러한 문제를 해결 하기 위하여 3가지 방법이 존재한다.

  1. genesis block을 생성 한후 연결되어 있는 노드들에게 메세지를 전송 한다
  2. monitoring node가 저장되어 있는 genesis block 에 대해서 데이터 파일을 미리 로드 한다.
  3. genesis block에 대한 메세지를 받은 후 부터 block tree update 시작. genesis block 이전에 들어온 블록에 대해서는 powblock-blk 메세지 무시

1번의 방법은 genesis block 생성 한 후에 새로운 노드와의 connection이 이루어 지기 때문에 해당 방법으로 불가능( 메세지를 보내기 위해서는 해당 노드의 fd를 알아야 하기 때문) 2번의 방법은 블록의 해시를 외부의 txt 파일이나, 해당 블록의 해시값을 알아야 하는 BLEEPlib의 블록 해시가 보여지는 string 값이 아니기 때문에 불가능 따라서 genesis block 에 정보를 알고 있게 하기 위하여 genesis block 메세지를 받은 직후 부터 block tree에 저장하도록 해 주었다.

tkdlqm2 commented 3 years ago

BLEEP library regtest

hyojin5658 commented 3 years ago

BLEEPlib 사용하여 블록체인을 사용할 때, TPS를 측정하도록 만들어 놓았다.

개발 하는 와중에 두가지 이슈가 있어서 정리하고, 그에 대한 해결 법을 정리하고자 한다.

  1. virtual 함수의 사용
    • 다른 브랜치나 이전 커밋에서는 Monitoring node가 블록체인 노드로 부터 새로운 블록 메세지를 받으면, Monitoring node가 관리하는 mainchain에 업데이트 시켜줄때 virtual node를 사용한다.
    • 희한하게, virtual node가 멈춰버리는 현상이 발생함(디버깅을 해본 결과 해당 virtual 함수의 주소를 못찾음, virtual 함수의 주소값이 0x000000)
    • 해결한 방법으로는 Monitoring node가 가지고 있던 block forest structure를 tpstest-library/utility/blocks.h로 옮겨주어서 해당 파일의 update 함수를 찾도록 해줌.
    • 이 과정에서 bleeplib의 str() 함수를 string으로 출력하도록 변경함(이전에는 string type의 bytecode로 출력함)