p2pHistory.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import zmq
  2. import logging
  3. from eth_utils import keccak
  4. import rlp
  5. import time
  6. import datetime
  7. import traceback
  8. def printTime(*args):
  9. print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3],
  10. *("%.6f" % a if isinstance(a, float) else a
  11. for a in args))
  12. def pushText(str1, name):
  13. name= str(name)
  14. str1 = str(str1)
  15. file = open('./data/' + name + '.txt' , 'w')
  16. file.write(str1)
  17. file.close()
  18. def decodeRlpList(data):
  19. result = []
  20. for i in range(0, len(data)):
  21. dataI = data[i]
  22. if type(dataI) == list:
  23. result.append(decodeRlpList(dataI))
  24. elif dataI == b'':
  25. result.append('')
  26. elif dataI == []:
  27. result.append([])
  28. else:
  29. value = dataI.hex()
  30. if value[:2] == '02' and len(value)>=64:
  31. raw = bytes.fromhex(value[2:])
  32. try:
  33. rlpList = (rlp.decode(raw))
  34. result.append(decodeRlpList(rlpList))
  35. except:
  36. result.append([])
  37. else:
  38. if len(value) < 39:
  39. value = int(value, 16)
  40. else:
  41. value = '0x' + value
  42. result.append(value)
  43. return result
  44. context = zmq.Context()
  45. socket = context.socket(zmq.SUB)
  46. socket.subscribe('ethereum')
  47. socket.connect("tcp://127.0.0.1:5502")
  48. initBlock = 0
  49. payloadLIst = []
  50. hsList = {}
  51. while True:
  52. # 阻塞式调用
  53. # 目前看有断线重连
  54. # 分三段接收所有消息
  55. message_head = socket.recv() # 这个没什么用,主要是订阅消息
  56. code = socket.recv() # 这个是message code
  57. payload = socket.recv()
  58. # 消息主体
  59. if payload in payloadLIst:
  60. continue
  61. payloadLIst.append(payload)
  62. try:
  63. if code == b'1':
  64. block = int(payload[-6:].decode(),16)
  65. if initBlock != block:
  66. initBlock = block
  67. printTime('1: ' +str(initBlock))
  68. elif code == b'8':
  69. hs = '0x'+payload.decode()[4:]
  70. # if hs not in hsList:
  71. # hsList[hs] = {}
  72. # hsList[hs]['8'] = time.time()
  73. # printTime('8: ' + hs)
  74. # else:
  75. # hsList[hs]['8'] = time.time() - list(hsList[hs].items())[0][1]
  76. # if len(hsList[hs]) >=3:
  77. # printTime(hs, hsList[hs])
  78. elif code == b'2':
  79. raw = payload.decode()
  80. # raw = bytes.fromhex(raw)
  81. # rlpList = (rlp.decode(raw))
  82. # if len(rlpList[0]) > 20 :
  83. # hs = keccak(rlpList[0]).hex()
  84. # else:
  85. # newRlp = rlp.encode(rlpList[0])
  86. # hs = keccak(newRlp).hex()
  87. # hs = '0x' + hs
  88. # if hs not in hsList:
  89. # hsList[hs] = {}
  90. # hsList[hs]['2'] = time.time()
  91. # printTime('2: ' + hs)
  92. # else:
  93. # hsList[hs]['2'] = time.time() - list(hsList[hs].items())[0][1]
  94. # if len(hsList[hs]) >=3:
  95. # printTime(hs, hsList[hs])
  96. elif code == b'10':
  97. raw = payload.decode()
  98. # raw = bytes.fromhex(raw)
  99. # rlpList = (rlp.decode(raw))
  100. # if len(rlpList[1][0]) > 20 :
  101. # hs = keccak(rlpList[1][0]).hex()
  102. # else:
  103. # newRlp = rlp.encode(rlpList[1][0])
  104. # hs = keccak(newRlp).hex()
  105. # hs = '0x' + hs
  106. # if hs not in hsList:
  107. # hsList[hs] = {}
  108. # hsList[hs]['10'] = time.time()
  109. # printTime('10: ' + hs)
  110. # else:
  111. # hsList[hs]['10'] = time.time() - list(hsList[hs].items())[0][1]
  112. # if len(hsList[hs]) >=3:
  113. # printTime(hs, hsList[hs])
  114. elif code == b'7':
  115. raw = payload.decode()
  116. raw = bytes.fromhex(raw)
  117. rlpList = (rlp.decode(raw))
  118. blockData = decodeRlpList(rlpList)
  119. blcokNumber = (blockData[0][0][-8])
  120. transactionAmount = len(blockData[0][1])
  121. printTime('7: ', (blcokNumber), 'amount', transactionAmount)
  122. elif code == b'16':
  123. raw = payload.decode()
  124. raw = bytes.fromhex(raw)
  125. rlpList = (rlp.decode(raw))
  126. blockData = decodeRlpList(rlpList)
  127. printTime(code, 'amount', len(blockData[1][0]))
  128. pushText(blockData, 7)
  129. except BaseException as err:
  130. print(traceback.format_exc())
  131. print(err)
  132. printTime('ERR', code, payload)