Closed tkdlqm2 closed 3 years ago
peer connection 이슈와는 다른 이슈지만, emulation result 관련 함수들을 refacoring 하였음.
def count_block(node_output_file):
block_count = 0
f = open(node_output_file, "r")
while True:
line = f.readline()
if not line: break
result = line.find("UpdateTip")
if result != -1:
block_count += 1
f.close()
return block_count
def get_last_blockHash(node_output_file):
f = open(node_output_file, "r")
for line in f.readlines()[::-1]:
result = line.find("UpdateTip")
if result != -1:
split_data = line.split(" ")[3].split("=")[1]
break
f.close()
return split_data
def get_blockHash_list(node_output_file):
block_hash_list = []
f = open(node_output_file, "r")
while True:
line = f.readline()
if not line: break
result = line.find("UpdateTip")
if result != -1:
block_hash_list.append(line.split(" ")[3].split("=")[1])
f.close()
return block_hash_list
def summary_result(node_list, node_output_file, sim_time):
last_blockHash_list = []
block_count_list = []
for z in range(0,len(node_list)):
path = "./shadow.data/result_"+time.strftime('%H:%M:%S')+"_%d.log"%z
f = open(path, "w")
txs = test_modules.test_transaction_count(node_output_file)
f.write("---------------------------------------------------------------------------------\n")
f.write("1. node 갯수 : %d\n" %len(node_list))
f.write("2. simulation time : %s sec\n" %sim_time)
for i in range(0,len(node_list)):
f.write("3. ")
f.write("\t3-%d IP address : %s\n" %(i+1, node_list[i]))
block_count = count_block(node_output_file[z])
block_count_list.append(block_count)
f.write("4. 생성된 블록 개수 : %d\n" %block_count)
f.write("5. 마지막 블록의 hash 값 : %s\n" %get_last_blockHash(node_output_file[z]))
last_blockHash_list.append(get_last_blockHash(node_output_file[z]))
f.write("6. 생성된 트랜잭션 개수 : %d\n" %txs)
f.write("7. TPS : %s\n" %(txs/int(sim_time)))
f.write("---------------------------------------------------------------------------------\n")
f.write("8. Blockhash list\n")
block_hash_list = get_blockHash_list(node_output_file[z])
for i in range(0,len(block_hash_list)):
f.write("%d blockhash : %s\n" %((i+1), block_hash_list[i]))
f.close()
path = "./shadow.data/total_summary.txt"
f = open(path, "w")
filter_duplicate_value = set(last_blockHash_list)
last_blockHash_list = list(filter_duplicate_value)
filter_duplicate_value = set(block_count_list)
block_count_list = list(filter_duplicate_value)
f.write("------- Total summary --------\n")
if 1 == len(last_blockHash_list):
f.write("Last block hash match rate : %d/%d" %(len(node_list),len(node_list)))
else:
f.write("Last block hash match rate : %d/%d" %(len(last_blockHash_list), len(node_list)))
print(block_count_list)
f.close()
원래는 위의 소스코드가 startemultaion.py 에 구현이 되었는데, 이를 testlibs/test_result.py 파일로 refactoring을 시킴. 또한 기존의 소스코드에서 적용안된 멀티노드 테스팅 환경을 추가를 하였고, peer connection의 결과 로그 저장도 같이 구현을 함.
peer connection status :
node : 1.0.0.1 ---------- match rate : 2/4
- 1.1.0.1
- 1.4.0.1
node : 1.1.0.1 ---------- match rate : 2/4
- 1.0.0.1
- 1.2.0.1
node : 1.2.0.1 ---------- match rate : 2/4
- 1.1.0.1
- 1.3.0.1
node : 1.3.0.1 ---------- match rate : 2/4
- 1.2.0.1
- 1.4.0.1
node : 1.4.0.1 ---------- match rate : 2/4
- 1.0.0.1
- 1.3.0.1
위에 로그는 5개의 노드를 리니어 토폴로지 형식으로 시뮬레이션 했을 시, peer connection의 결과 로그임. 시뮬레이션 시간을 15초로 짧게 잡아서 peer connection 이 "addnode" rpc reqeust로 명시한 peer들 끼리 연결이 이루어짐. 시뮬레이션 시간을 길게 잡고 시뮬레이션할 시, peer connection match rate이 커질 것임.
---------------------------------------------------------------------------------
1. node 갯수 : 5
2. simulation time : 15 sec
3. 3-1 IP address : 1.0.0.1
3. 3-2 IP address : 1.1.0.1
3. 3-3 IP address : 1.2.0.1
3. 3-4 IP address : 1.3.0.1
3. 3-5 IP address : 1.4.0.1
4. 생성된 블록 개수 : 3
5. 마지막 블록의 hash 값 : 000002170f08d114708667da555f60b1c55d4728a17066e1a06ce63941263385
6. 생성된 트랜잭션 개수 : 3
7. TPS : 0.2
8. Last block hash match rate : 5/5
---------------------------------------------------------------------------------
9. Blockhash list
9-1 blockhash : 000002170f08d114708667da555f60b1c55d4728a17066e1a06ce63941263385
9-2 blockhash : 0000025df3971e3453a896b713f82acee96a556ad939a7fdc59a599ee332b1ae
9-3 blockhash : 000006d66f3cd0f0e2bf5ff0f3aa66bf4deec8eff96b7bc13fc7622532b10ad8
위 로그는 시뮬레이션 시 노드 마다 갖게될 최종 결과 로그임. rel 0.1.0에서 추가 보완된 부분은 8.Last block hash match rate으로서, 각 노드들끼리 마지막 블록 해시 값이 일치 여부를 비율로 표현을 해놓음. 또한 9. Blockhash list는 rel0.1.0에서는 오로지 "updatetip"으로만 필터링을 하여서 리스트업을 시켜주었는데, 멀티 노드 환경에서는 블록 전파가 이루어지면서 updatetip이 아닐 경우에도 블록 동기화가 이루어지는 것을 로그를 통해 확인을 하였음. 그렇기에 그 부분에 대한 예외처리를 추가하여 구현을 해주었음.
def test_peer_connection(plugin_output_files, IP_list, xml_file):
addnode_list = utils.get_addnode_list(IP_list, xml_file)
getpeerinfo_list = utils.get_peerinfo(plugin_output_files, IP_list)
result_count = 0
con_count = 0
for i in range(0,len(addnode_list)):
for j in range(0,len(addnode_list[i])):
if addnode_list[i][j] in getpeerinfo_list[i]:
con_count += 1
if len(addnode_list[i]) == con_count:
result_count += 1
con_count = 0
if result_count == len(addnode_list):
print("Success peer connection test ...")
sys.exit(0)
else:
print("fail peer connection test ...")
sys.exit(1)
bitcoin 기준으로 테스트를 한다고 할 경우, xml에 "addnode" 플래그 값으로 connection할 peer를 설정을 해주고, 설정해준 ip주소와 "getpeerinfo"를 통해 시뮬레이션 상에서 connection된 peer ip와 일치하는지 확인하는 테스트 소스코드임.
rel 0.2.0 에서는 bitcoin 10개의 노드를 지원을 목표로 했음. 그렇기에 regtest 또한 10개 노드를 셋팅해주는 작업이 필요함. 현재 브렌치는 coinflip 이슈가 해결되지 않은 브렌치라, 해결된 develop 브렌치와 merge 하고 나서 구현을 해야함.
시뮬레이션을 시작하고 나서 종료될 때, shadow output 파일로 부터 실제로 소비된 런타임과 시뮬레이션 런타임을 user에게 프린트 해주기.
---------------------------------------------------------------------------
total result
---------------------------------------------------------------------------
1. Last block hash match rate : 10/10
2. real runtime : 00:01:47
3. simulation runtime : 50 sec
4. peer connection status :
node : 1.0.0.1 ---------- connection match rate : 3/9
- 1.1.0.1
- 1.7.0.1
- 1.9.0.1
1번은 실행된 n개의 노드들의 마지막 블록 hash값 일치 비율 결과 값을 보여줌. 2번은 시뮬레이션 시간 3번은 리얼 타임 4번은 각 노드들의 peer connection 상태를 나타냄.
peer connection의 결과들은 별도의 "peers" 폴더에 몰아서 저장을 시킴. 그 외에 전체 시뮬레이션 결과를 프린트해줄 파일은 "total_result.txt"파일에 프린트 하도록 하였음. (이 댓글 위에 글이 total_result.txt의 결과값.)
peer connection 적용
Originally posted by @tkdlqm2 in https://github.com/kaistshadow/blockchain-sim/issues/242#issuecomment-800108949