014_get_dalao_iscontract.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. # https://docs.alchemy.com/reference/eth-getcode
  2. # 如果是在合约外部判断,则可以使用web3.eth.getCode(),或者是对应的JSON-RPC方法eth_getcode。
  3. # getCode()用来获取参数地址所对应合约的代码,如果参数是一个外部账号地址,则返回"0x";如果参数是合约,则返回对应的字节码,如下所示:
  4. # web3.eth.getCode("0xa5Acc472597C1e1651270da9081Cc5a0b38258E3")
  5. # "0x"
  6. # web3.eth.getCode("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8")
  7. # "0x600160008035811a818181146012578301005b601b6001356025565b8060005260206000f25b600060078202905091905056"
  8. # 这样我们就可以通过getCode()的内容判断是哪一种地址了。
  9. from base_class import BaseVariableFunction
  10. from base_class import *
  11. from base_library import BaseLibrary
  12. old_print = print
  13. def timestamped_print(*args, **kwargs):
  14. old_print(datetime.datetime.utcnow().replace(
  15. microsecond=0), *args, **kwargs)
  16. print = timestamped_print
  17. baseclass = BaseVariableFunction(__file__)
  18. print('\n'*5)
  19. print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
  20. url_0 = "https://eth-mainnet.g.alchemy.com/v2/WLI0ohbUlvbsJVmoIvB1wTSwUA8qP5qS"
  21. url_1 = "https://eth-mainnet.g.alchemy.com/v2/ck1dtOx8tHkjAH2PX2FwTGN2T2gDaGtV"
  22. url_2 = "https://eth-mainnet.g.alchemy.com/v2/pxF-cEkEE1JxzxgotGyww5ra5w1IvAkJ"
  23. arr_rpc = [
  24. url_0,
  25. url_1,
  26. url_2,
  27. url_0,
  28. url_1,
  29. url_2,
  30. url_0,
  31. url_1,
  32. url_2,
  33. ]
  34. url = "https://eth-mainnet.g.alchemy.com/v2/WLI0ohbUlvbsJVmoIvB1wTSwUA8qP5qS"
  35. getcode_eth_payload = {
  36. "id": 1,
  37. "jsonrpc": "2.0",
  38. "params": ["", "latest"],
  39. "method": "eth_getCode"
  40. }
  41. headers = {
  42. "accept": "application/json",
  43. "content-type": "application/json"
  44. }
  45. df = pd.read_csv( baseclass.dalao_merge_path / f"ori_merge.csv", dtype=object)
  46. df= df.astype({
  47. "eth":float,
  48. "iscontract":int,
  49. })
  50. df_not_getbalance =df[ (df["iscontract"]==-1) &(df["eth"]>=0.5)]
  51. arr_str_dalaoaddress = df_not_getbalance['dalaoaddress'].tolist()
  52. len_arr_str_dalaoaddress= len(arr_str_dalaoaddress)
  53. arr_payload = [ {
  54. "id": 1,
  55. "jsonrpc": "2.0",
  56. "params": [str_dalaoaddress, "latest"],
  57. "method": "eth_getCode"
  58. } for str_dalaoaddress in arr_str_dalaoaddress
  59. ]
  60. async def get_one_eth_balance(str_dalaoaddress ,payload,url ):
  61. global df
  62. req_response = requests.post(url, json=payload, headers=headers)
  63. if req_response.status_code != 200:
  64. return
  65. response = json.loads(
  66. req_response.text)
  67. code_value = response["result"].strip()
  68. iscontract =-1
  69. if (code_value != "0x"):
  70. iscontract =1
  71. else:
  72. iscontract =0
  73. df.loc[ df["dalaoaddress"] ==str_dalaoaddress , "iscontract"] = iscontract
  74. print(f"str_dalaoaddress= {str_dalaoaddress} iscontract= {iscontract}")
  75. return
  76. async def get_eth_balance():
  77. global arr_payload
  78. global arr_str_dalaoaddress
  79. global asyncio_len
  80. for str_dalaoaddress_idx in range(0, len(arr_str_dalaoaddress) , asyncio_len):
  81. cur_arr_str_dalaoaddress = []
  82. cur_arr_payload = []
  83. for idx_dalao in range(0 ,asyncio_len ):
  84. if str_dalaoaddress_idx + idx_dalao >= len(arr_str_dalaoaddress):
  85. continue
  86. temp_str_dalaoaddress = arr_str_dalaoaddress[str_dalaoaddress_idx + idx_dalao ]
  87. temp_payload = arr_payload[str_dalaoaddress_idx + idx_dalao ]
  88. cur_arr_str_dalaoaddress.append( temp_str_dalaoaddress )
  89. cur_arr_payload.append( temp_payload )
  90. tasks_for_wait = [asyncio.create_task(get_one_eth_balance(
  91. cur_arr_str_dalaoaddress[idx] , cur_arr_payload[idx] ,arr_rpc[idx]) ) for idx in range(0, len(cur_arr_str_dalaoaddress))]
  92. done, pending = await asyncio.wait(tasks_for_wait, timeout=30)
  93. if str_dalaoaddress_idx%10==0 or str_dalaoaddress_idx%10==1 or str_dalaoaddress_idx%10==2 :
  94. df.to_csv( baseclass.dalao_merge_path / f"ori_merge.csv", index=False)
  95. if str_dalaoaddress_idx%50==0 or str_dalaoaddress_idx%50==1 or str_dalaoaddress_idx%50==2 :
  96. print(f" {str_dalaoaddress_idx}/{len_arr_str_dalaoaddress}")
  97. return
  98. async def main():
  99. await get_eth_balance()
  100. asyncio_len =1
  101. asyncio.run(main())