kaistshadow / blockchain-sim

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

TPS/Latency Regtest #329

Closed tkdlqm2 closed 3 years ago

tkdlqm2 commented 3 years ago

TPS/Latency Regtest

Originally posted by @tkdlqm2 in https://github.com/kaistshadow/blockchain-sim/issues/320#issuecomment-836204115

tkdlqm2 commented 3 years ago

How to reproduce -> git checkout issue/_329

tkdlqm2 commented 3 years ago

regtest - TPS test

cd regtest/1_bitcoin/16_TPS; python3 tps.py 실행 시 TPS regtest를 실행할 수 있음. bitcoind의 첫번째 블록의 timestamp와 마지막 블록의 timestamp와 마지막 블록의 txc를 구하고, txgenerator의 첫번째 블록의 timestamp와 마지막 블록의 timestamp와 마지막 블록의 txc를 구하여, 두 개를 비교를 함.

TPS = 마지막 블록의 txc / ((마지막 블록의 timestamp) - (첫번째 블록의 timestamp))

def TPS_test(simulation_output_file):
    bitcoind_firstBlock, bitcoind_lastBlock, bitcoind_txc = "", "", ""
    txgenerator_firstBlock, txgenerator_lastBlock, txgenerator_txc = "", "", ""

    for i in range(0,len(simulation_output_file)):
        # miner node로 부터 log를 가져옴
        result = simulation_output_file[i].find("bcdnode0")
        if result != -1:
            bitcoind_firstBlock, bitcoind_lastBlock, bitcoind_txc = utils.getBlockTime_fromBitcoind(simulation_output_file[i])
            continue

        # Txgenerator로 부터 log를 가져옴
        result = simulation_output_file[i].find("txgenerator")
        if result != -1:
            txgenerator_firstBlock, txgenerator_lastBlock, txgenerator_txc = utils.geBlockTime_fromTxGenerator(simulation_output_file[i])
            break

    check_flag = [False, False, False]
    if bitcoind_firstBlock == txgenerator_firstBlock:
        check_flag[0] = True
    else:
        print("bitcoind_firstBlock : %s" %bitcoind_firstBlock)
        print("txgenerator_firstBlock : %s" %txgenerator_firstBlock)
        sys.exit(1)

    if bitcoind_lastBlock == txgenerator_lastBlock:
        check_flag[1] = True
    else:
        print("bitcoind_lastBlock : %s" %bitcoind_lastBlock)
        print("txgenerator_lastBlock : %s" %txgenerator_lastBlock)
        sys.exit(1)

    if bitcoind_txc == txgenerator_txc:
        check_flag[2] = True
    else:
        print("bitcoind_txc : %s" %bitcoind_txc)
        print("txgenerator_txc : %s" %txgenerator_txc)
        sys.exit(1)

    if all(check_flag):
        print("Success TPS test ...")
        sys.exit(0)
tkdlqm2 commented 3 years ago

merge with feature/322/_warning branch.

tkdlqm2 commented 3 years ago

진행상황

최근까지 regtest Latency 계산 과정에서 txgenerator와 miner node의 계산 값이 차이가 계속 발생하였음. 원인은 txgenerator의 계산과정에서 coinbase tx가 포함되었음. image

그림 처럼 -1을 해야 coinbase tx의 갯수를 제외하는 것임. 이 부분은 해결이됨.

하지만 또 다른 case가 발생하였음.

  1. txgenerator의 결과 값과 miner node의 결과 값이 동일함. (정상)
  2. txgenerator의 결과 값과 miner node의 결과 값이 다름.
    • block 동기화가 안된 경우. (miner node와 txgenerator의 블록의 갯수가 다름)
    • block 동기화는 잘 되었지만, total timestamp 값이 다른 경우.

주말안에 반드시 해결할 예정.

tkdlqm2 commented 3 years ago

latency를 구하기 위해서는 각 블록에 담긴 tx's TimeStamp의 합을 알아야함. latency = (block's timeStamp * txcount) - sum(tx's timeStamp) 여기서 sum(tx's timeStamp)는 해당 블록에 담긴 tx임. 오류의 큰 범주는 각 블록의 tx's TimeStamp 합을 구하는 과정에서 Miner node와 txgenerator 간의 값의 차이임.

위에 사진은 txgenerator 플러그인과 miner node의 각 블록의 blockTimeStamp - txcount's TimeStamp 의 값임. 사진 처럼 정상적으로 종료되는 case에서는 서로의 결과 값이 동일함.

Miner node와 Txgenerator는 블록 동기화는 같음. 하지만 사진을 보면 트랜잭션 갯수는 동일하지만 각 블록의 latency의 합이 차이가 나타남. 이 경우에는 txgenerator가 마지막 블록의 sum(tx's timestamp) 가 누락이 된 것으로 추정됨.

  1. image 위 사진 또한 Miner node와 txgenerator 간의 블록동기화는 잘 이루어졌지만, 첫 번째의 비정상적으로 종료되는 경우보다 tx의 timeStamp 합 차이가 엄청나게 발생함.

또 다른 비정상적으로 종료되는 case: 이는 블록 동기화가 제대로 이루어지지 않아서 발생하는 차이로 동기화 예외처리를 추가를 할 예정.

결론 : 같은 코드에 대해 실행 결과가 non-deterministic하게 발생함. 이에 대한 원인을 분석 중임.

tkdlqm2 commented 3 years ago

How to reproduce

  1. git checkout issue/_329
  2. python setup.py --bitcoin
  3. cd tests/regtest/1_bitcoin/17_Latency; python3 latency.py
---------------------------------------
result_latency : 6.344444
Result   Timestamp / txcount
MinerNode: 5710/900
txgen_result: 5620/900

MinerNode와 txgen_result 의 값을 확인할 수 있음.

현재 결과 값이 non-deterministic하게 발생하는 원인은 txgenerator에서 latency 측정 시기가 1초마다 측정을 하는 반면, miner node는 매 블록마다 lateny를 측정을 하기에 이 부분에서 값의 차이가 발생되는 것으로 추정이 됨. 현재 Miner node쪽에서는 잘못된 로직은 발견되지 않은 상황이고 txgenerator 부분의 로직을 확인 중임.