Latest Threat Research:SANDWORM_MODE: Shai-Hulud-Style npm Worm Hijacks CI Workflows and Poisons AI Toolchains.Details
Socket
Book a DemoInstallSign in
Socket

chainbench

Package Overview
Dependencies
Maintainers
1
Versions
37
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

chainbench - npm Package Compare versions

Comparing version
0.8.2
to
0.8.3
+20
-15
chainbench/main.py

@@ -11,4 +11,6 @@ import os

from click import Context, Parameter
from locust.argument_parser import parse_locustfile_paths
from locust.util.load_locustfile import load_locustfile
from chainbench.user import get_subclass_tasks
from chainbench.user import EvmUser, SolanaUser, get_subclass_tasks
from chainbench.user.common import all_method_classes, all_methods

@@ -152,3 +154,3 @@ from chainbench.util.cli import (

"You may specify this option multiple times for different monitors",
type=click.Choice(["head-lag-monitor"], case_sensitive=False),
type=click.Choice(["sync-lag-monitor"], case_sensitive=False),
multiple=True,

@@ -256,14 +258,12 @@ )

user_classes = {}
for locustfile in parse_locustfile_paths([profile_path.__str__()]):
_, _user_classes, _ = load_locustfile(locustfile)
for key, value in _user_classes.items():
user_classes[key] = value
test_data_types = set()
for user_class in user_classes.values():
test_data_types.add(type(getattr(user_class, "test_data")).__name__)
if test_by_directory:
from locust.argument_parser import parse_locustfile_paths
from locust.util.load_locustfile import load_locustfile
user_classes = {}
test_data_types = set()
for locustfile in parse_locustfile_paths([profile_path.__str__()]):
_, _user_classes, _ = load_locustfile(locustfile)
for key, value in _user_classes.items():
user_classes[key] = value
for user_class in user_classes.values():
test_data_types.add(type(getattr(user_class, "test_data")).__name__)
if len(test_data_types) > 1:

@@ -390,5 +390,10 @@ click.echo(

if list(test_data_types)[0] == "SolanaTestData":
user: type[SolanaUser] | type[EvmUser] = SolanaUser
else:
user = EvmUser
unique_monitors: set[str] = set(monitor)
for m in unique_monitors:
p = Process(target=monitors[m], args=(target, results_path, test_time))
p = Process(target=monitors[m], args=(user, target, results_path, test_time))
click.echo(f"Starting monitor {m}")

@@ -512,3 +517,3 @@ p.start()

for method_class in all_method_classes:
click.echo(f"\nMethods for {method_class.__name__}:")
click.echo(f"\nMethods for {method_class.__name__}: ")
task_list = get_subclass_tasks(method_class)

@@ -515,0 +520,0 @@ for task in task_list:

@@ -156,3 +156,3 @@ import logging

@staticmethod
def get_random_token_address(self, rng: RNG | None = None) -> Account:
def get_random_token_address(rng: RNG | None = None) -> Account:
if rng is None:

@@ -166,3 +166,196 @@ rng = get_rng()

"8BMzMi2XxZn9afRaMx5Z6fauk9foHXqV5cLTCYWRcVje", # Staika
"EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm", # dogwifhat
"JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN", # Jupiter
"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263", # Bonk
"HZ1JovNiVvGrGNiiYvEozEVgZ58xaU3RKwX8eACQBCt3", # Pyth
]
return rng.random.choice(token_addresses)
@staticmethod
def get_random_token_account(rng: RNG | None = None) -> Account:
if rng is None:
rng = get_rng()
token_accounts = [
"CF34PLYZfTMteS2mR3VzxsHjk6VXfCTnAcnwaEGJrknt",
"97DxJzDxY71ofivxpNuNyKYcZy824zJWAXYemM5Md4Dt",
"FE2BNorsuDMFDQ8XNkDfxp5x2H59qviowi39RVBzPf2S",
"2CR6HNJrq8g6auzwpQiVP2TcbE2gAPZxGT16pTU6h13g",
"4ZFd7tmfZzoyinBR1mWSr5FfmjdyvmbZ7DMMhUjrx7jW",
"FTUTbTrWdxctBh4DrYTK8Scrtnj52KMSYbc1RS9ytF6J",
"2eZAfcCyxPwxxqK9gVfzPcJH1jrnfa2xZggy1RFEiDHd",
"6ttf7G7FR9GWqxiyCLFNaBTvwYzTLPdbbrNcRvShaqtS",
"62KEKuC6yPmKy7M1PJjk8EWuouuF1srk4rxwPptsoySh",
"EaDGsTov6CvsZZeo16cbrrtUE8J9gjkSPis5c6SiSHEH",
"FcTsmtRX9wNFhiviJbW5YgG3PKXDNQtemQA5zNL2W1pW",
"HmrKnggYYcNVwF8S7L1nno7LCKzobDBjX5UBuzFZukYj",
"5nox3B41bSNtJV3s7gFPWVK8JtdaZ4QxCVxrhpGgnw4B",
"GoBAZzgSLnoc5mXuUHgMLKsqYX7BFrdgwQYJL2cApgmX",
"3GXyFi89uNvGPngFi65NYsWxxHTWDbJQtM1ntjGfn2gK",
"4T6FHkAmoW21ia1GWDT5KBMd83kjwrPiXx4QYTkxz899",
"FwrCxkDG1vahAHeGi1Wr5mBgLyayUvCy3d1tbnhsAQ99",
"EYVDkQXrjNwwpxw3m2EojnFJgyTVuan77XxMs2hbBk34",
"4BedR6CnQRtHq3aMVcHcFaU9sT1Wns2vEKah7ATFimY7",
"3eApKHDU4GpXD2L1uZ3CQGMj2bAq6grhdZz9zsf9xacr",
"8gesfhmNebstEuFovKzFgaeq5LPtjM2esrq6JA4eQadJ",
"ANjPXGaMSho5dp5A78osdTAYhWrt8o2DVQEjPhd2pZrW",
"EvcsKVtsH92KvvAfA6SbWGA4ShTTTsWZt48KTdCuCd3Y",
"7znyJ3N4K26BmispS6z7TNWfar61KzFiqbx4pYmtG4dN",
"3zQXNfbzwp9L3UbwMe3JsSjB6eT9Wcx8B5RQ2VS1G2fL",
"7mfvcxhqSzqQ9iTHqDqugC3HVBcnvoFsdgWEjLyykx3E",
"GJscPZ2xzayPa8QXW2Xi2WJPHaj2k1TQDShbhYJUHR94",
"3shgyeu9cy8xkkRwDENKnsYXxsCUkc5suq3aYXi912XW",
"3FGoU3eRepLeK5ZD1jA4GhSWw7GUYhsJwPBB5Qfihrmt",
"3voYsgqCZEWvyG8xSkNhgqYb9ciKNjzXX91JwesqdasT",
"G58QLCn2H2TvtoPT5uwT8tjpYAUa1CzWsbKJXUPqMaJ4",
"J5jtM83Eoyn1TQdxu1hRC96dLy4ZgenN9vf6Fk5jLe9V",
"GvZ4emMJfgW9U2nfw145FraS2BMJyGsmoji8eWi11d6j",
"DugPkEmWHgTSXNMGAD9r3SbL7MgDrnuHuSeH695tN8FQ",
"39uZe8NUJJVnNmQ6nA6VxQFwQ3GqypvtVrnhSLbByRBr",
"8zBEBGcPZBVqu6fRmxsiXCEG4ehvh3TEiy8gq6q6E6YL",
"4bEcyAvz5zSzFwAnEAHGSsUG1EASMnbJSDPSipPKStti",
"DTbktzGachmQVW1sH7sNxCYrs3YpcEtyDuBcHAWr6y3t",
"HQvP9mRNpZBXi3CMsp2vP2H8qaGAFeQobArX455Ugoh9",
"4iSr7wAsfe9ohXSS2Z6v2icV94X81hPtPLLvt6ss84yb",
"3d1Vr3n7cdzhk3vrSn2eXm8H3gqSircLVqwqcEKc4AX2",
"4zHS6gTzBRXpJojhJgHQRCVYhMAdDBHW2QSU7SNMtXh9",
"JguSE1vBoUUSN7MxZBHKJHjXxECW7d12xLPLzVV7SYi",
"zGWrqUkuhmtHA8G7JJ3mxbbAxxRYpC2GXWnKyYMFDM2",
"4ehpyuufJtzt49CtJYaN3HLDYYMotvR34WKkFBNe4fDv",
"HsrDHXyWT6gNPnHPSMgoHpQxLSqMcsyJCXLvp4oxhoV7",
"B4kZTkeZCTnHf3J6pWC9deHUx4BWU8cZPewY6PtWYS3s",
"HjVvBA8HX3ZxA9wAziApGXTQsZnLTtDxQa9ymSCkke64",
"8M23uCAp1Wc3jTKhq7nzTxqKK54XVdDwSLspv1x4Yigs",
"DW8awKneKxcep9iouLeNwWRAzC6rz9sLKAgENpXL6BBd",
"HU5CJ61HKmWfBzK6jrD2q6o17iwrkf3T9xqrdBgPBR5F",
"2yobwT8wsq6y4fbEkdnZk5Mj42hiAZW6tyiLU4KjhPVc",
"9vujwMDWRHfXSHs1oTEUXcUUwWmev4gf2mzJ2FzNbmkq",
"2wkdLjUEmaQ88Ut1hi5vRFoFgSpovz8x9xj8nhURTKJB",
"Cdigh3iZD8DvHTnNyC4Sm7uiNhiFmY2EcpfCviLG2AEC",
"7ZHAcG8T12tWeSgvvTNDE3hskFfXRaVe3PRMjvEAzCC4",
"5m1gS9Sphbvt4zDCu6gqFqVcekCX8eAtfwJjPDMUVvxJ",
"9HHMyRMeYSyeR45LSnHHvpofq8cnX2dShUg5zmHsDpiA",
"4WMDNjMpKLEbC4oqAeTchN5WjwjJrnZdTzmpTqdeJoc8",
"r1RNBu4Grexhe9AsK1cakgyzh93uxmXzeKk7jApVhKf",
"CfE7AzLsSsEBSsQgWAvXes9qfQmE7WYJTdApMefu8ZaM",
"HSizfxkFyeUssoVvzgjkgArQ4RFyKZWMmHU554Ya9V6R",
"9okWmESkYFw3Jmk3KxRijp2TMM21YHAGaUFRZNUoDFjP",
"FRojFj9xyuFtePNn4xuqPzZU8CLyLpAaYPwf7aG8gotJ",
"A5zrmTFMPpTWhSxay8gDr3rLr4WguCPYp8um5ywRFeCT",
"8VWPNtQvjSGrot14cgBSgNDKJhLvFaodcpY9dFGZJx1z",
"3PqVf4rm7Yx1GqdND9Q6mMormXfFZRvTJdBFwBEGdobB",
"C3EJkyHWfAn9mZBi6SneEp57VvpYNxVnqE9AtwmvAuo",
"9x2FRfDMAiDBSZPR5HJje6bpAH8XHkeqedBopbwu9g1H",
"gi9vP3V2p5mDYURGNo7CPcEfR1tMp3sxjbQ1AHvpyxZ",
"BbLCUYHyYcRJCfzgoow96MSMb3EKdHWL4ALq3YNJpA2z",
"HfAK56UE6pLwBM1kQxn1vAk5W6sRBrSE8KrndCooR5Kx",
"G6g2193UQA3N8byF9D7cDn5tYhAt6gbNB9zLNHZYJJaH",
"3MXL9RNyHJcg3wYUBsbDLQyNTyJJRftZMzg7bxPsdFGf",
"3bFoTw6XoeuYd1qMCQCQTf7EJoQHXjgJUB8W9FoSESY1",
"BxQSVGUcfWt2k5AZ58rKxwxdCau2NXa9yt9osmDWU9hJ",
"GSHsTFMNMtAyFP6PxDKvTHDDBzzZYUFQnqFumtcLFicc",
"Fm5iBQMZxuH5XMNMd7RcfYxQuxhGNXsLZ5SZ5rLXnCGF",
"6Y7xRKGwL1ok12NnkwNhAtumqb7ugZ9xvCYrnMB8Xviv",
"H4BdrSaFofoeQRUH4g5fY9tgRc1yqCdEryETKnW26tbm",
"CTh1akv2g7hRsBUFdjLrNW6TzAe34AukJBNsYw5sUH5s",
"6fbPJiBdXAoN4qkXuxMwUNZUF77WxfeDPCznWCxVPdL2",
"C4hXRxKmfucqNDndwYASSDm7EbPcoXG3LPFULdXP5MUh",
"8kfrPrNzFv3ouvQBP4JwmA9upRu4uDAXf8WP7gmsRevA",
"8PvETn7pxGE7ZwLUxQbob3zXcx8SFYEaKujWXkVdyzy8",
"86nsBYZV6UyuiRqK5PyMKpbJAMkay7aLyfBieYjFw383",
"7LBGStihbxoBAWtqDiVzTSg8ci6y74Ws2bbd2xiyXk35",
"DGKpmnNkmKzgMsrJQsP9dYzxRChcf5PbhDA8Z24Mm9L9",
"3Xjac1TpCgtW8U5RBenzmWwUfsNXhNAn7jdvvgURDped",
"GLVvAEsrWc5vhknQdkVyDkyzgQ2kFzh4NhfqADYxzLZb",
"9YzDwNLK5C7ZEKhYiNt27gbNejpdEoeTfKyTFwDsjfgy",
"7Xi29v2bqBx4DNbVq1LA8WJPuyLiRPqCxxBBZBnNsumu",
"BKqEQy6E4Pa2yAEssbQS1PfbjQCfKSmrjqNCtemY8dKk",
"TsG1nsBvMxKULXtiAgH3iUatrFzihw9MgHyz6VGHSSJ",
"HthTrkvsRA1sAuWRJmP4UAB37VT2RTgT7QFWvWKMRey",
"5SR9UtKUJpXRFd3W1bnNjS44vJuoFQyAznoESzGA7M1r",
"Eqz4J57GkmPq2P2U8yWGQspUB8FWBLnidoPhMcvWS1Jx",
"A6JCe9BDEby7fsevUbzTqU9jFBbkHwSuDmJGhoPLy44L",
"Grh57JBjPDYeTwSqNsQ8i3ks2HJsq5HxCFHpqhNcWiDi",
"CDeni3XaGkCrbN8Wm2PwmFHnk3ce9cEFbitRC1NNxxrE",
"7XX64f8UKE1nxNCSwncCUj3c2FJYdXHmDV5xd5DRdFky",
"EHDnHqX6PtnSdPfsnnr1oWtmQbenDwqZAKUo5QAq9Ro3",
"1LLLyMZvAdimbcsC4Xp7GVWiJScztEpfXVR9upyxq5G",
"DsxpGaCZ13aUfDDz2CSjuzCA8XJJYLuGsV65KXdyLWdW",
"Fm7yBTcuUDBdzj2PbP6tr8uiFAJwS53kNQbwEERHP65A",
"EdhM4qGK29P2X1GsRYZtF8E5v9rkd52NRXEh1d8BzUc8",
"4kT3EXc5dDVndUU9mV6EH3Jh3CSEvpcCZjuMkwqrtxUy",
"GqzXwoPv8TJtxqDDB1G3Q35MQpor6433fdB18vdNYfqC",
"AaJyLPfJoJFcUHHH7VDWsqyVPb7aMAwcRHB2Z7YXt2La",
"6sJ9tDgWmQxkEZSk8xihYiJUpmFL3fdgLQ6DayCSDR2U",
"7VKFsPJooGLrWvMqyjvfTucUQRKzop6iErPGw4S2r69K",
"DNnGKYfnrQirEr2Z1145WLLtRCwtaZh8PpzijrWUDKMr",
"3MWHzLgLQ98n4htEJXKJWNUNUfbeexWEDnksRFxDsLeS",
"6fafNTqhRyQ4Q3cwD9VVhXZAVCtL1YYW2kSKTD3ytBse",
"AUmMMDCvmghtsrn5T6EzcJBiaSApv5P4d2XVQdZAg1vp",
"BADVD1RWzAXDd62Fj6RPTnmFwXxviRjxpvSaidarHDc9",
"2Dyj8L9kv4wSK4sXyfcduoYoPUouSQWsuv9THm11cvEh",
"GygCQjU9eTr3WivrstviJhJqbDL4tnoAjGXCGo1XzEub",
"CBzCGSmuNKKrGjMQLQ1ihkbVUJRATavcsd6rdiZ2CFv7",
"pC2qrgQNnKZ87JxBrULrZiLhEQim8SpchAxAKnqDnya",
"26ddLrqXDext6caX1gRxARePN4kzajyGiAUz9JmzmTGQ",
"6G4XDSge4txj5tBkA5gZqefXXE3BRxqA37Yb1pmrHv6N",
"7bEL9XkPGNg7a3oSiUERKsZtFoJMqKh6VhGDCmMCPqdg",
"K6U4dQ8jANMEqQQycXYiDcf3172NGefpQBzdDbavQbA",
"GDijXRGfd1jhk5GkRPp1TDnEH2FfHURSRZeB5um3pUWk",
"DWVtxR7oo3uTiuM3o1cCxTJ5wM8Wnjvu1apwMkQhdedY",
"B3NG3yTDwf3sL1oCUvf39HtdzWbtYoinNWqKDoRJTeuH",
"CeLRs4kchQbWEcqZf7ctGrYhXwbU89fVxRs4Q34XeiHq",
"GQrdtzmAsXpb5pPsENC68jXF6YwmME235ZJpRoKh5F5R",
"ASehmX2sjG1Qz7MQyLJu8wBoV2Xx8cCV3uU8VbBDGQJQ",
"649KG5AEPic6MDVdbXjLPWj3vy6Lc466qGjV9d5Y3VyZ",
"FGHwSJMx8yvMMmfiZSd5jmL7KbbbubVpNrhYX7NXPCdu",
"E6FLdjDBtHvzhMGihcbec34KfcAqSYW67kfJV8RAKH1f",
"mGmik7Qf2YdrSZjTsS3ciZn4xyqiVHYUP7cfjQDT5he",
"6QxycVhn6Zak2ky4HAEEanz85ockBaEfHxgtqPP7Mo1a",
"FErFdzAFoA26ASDz9zh4Jan3hV2wRb32Mc1MFMXr7n51",
"Ek7bER9cRJZVHE7Zzmig31PbqT9KkkjAKAgqnyof6JAk",
"EbX6N2wuAAiF6WMnQPG15kq18nx2yApg9ikawxDHBi7j",
"2V9CYburvmC2X2w96HFreUd9iEcW7BdWTFTJCt46tuai",
"AbJpTjriAPp4Vuv5xjoWQHjh68NVSw36Wmky2hQVJJzP",
"F8FqZuUKfoy58aHLW6bfeEhfW9sTtJyqFTqnxVmGZ6dU",
"5hpfC9VBxVcoW9opCnM2PqR6YWRLBzrBpabJTZnwwNiw",
"4XHP9YQeeXPXHAjNXuKio1na1ypcxFSqFYBHtptQticd",
"JDPR4RP95CdtwLcjqe3E4cVthzCmkASfs4yamN9MZyPR",
"CDV3tvd7XwNez9crbEmJpPjdNXceM1Ro5iHqTiaUKt2w",
"6xAckK4UWmaX4CKu27oPzHLxMKzaDMj73WA9xKpqSFQ1",
"9Vfbb8i2Z6WjDJwZEfmhwTk4paCpTYcyJgNFdns2GV2s",
"2UfAKNkmBWjad3qKnFCRfzbHwwhgU5eBs2DDXSJBMVSb",
"9uEDvRyhqygr6SrmvddRDaFbdsazQzuPQCsDewpwfbqh",
"7FdQsXmCW3N5JQbknj3F9Yqq73er9VZJjGhEEMS8Ct2A",
"AoEkWJKHXzrPsgsoawYTLG3aKb9L8oLmVqM9EXFtiPN7",
"7a7iBY13WPKfSpkA1WMpoJB59NE2zr255THWg7GyVb1q",
"7csLUpezHQH7f5uha3s93ruKutcniNQmxjmapRsrfxaR",
"6jFRDDFQDCasLcWVMtixuu1eQCDnMhCttXktVeL7cEYM",
"ATbwzBwGNM8QjLwPGk8PJz8FgCmfWfRud1zB8Zs6tLEb",
"HJbmekvxyMuVjTV2gZKgdBYx94Bumugtt1GrWKBkTv5X",
"AsBeRcytoLArFXwzovGH2gamp9by5B9V1TemMT5LDyQH",
"3pY1zLGNXnQedWwCQeaaHK9dQCsfqMCRPzVD3DnZwSsd",
"29zZdccuHktabvWwJaEokASw6pPBDVpqBDZxTicMhM1R",
"GKD5CK5SqpB66taGqTwGy1FCTyzKrxhyrY7V68aKpoVC",
"Eq9dm4pHewdSVaKdpVJogjLW6upd9hNkiboX2eSncmFV",
"23KfDBTdpaBqfn8aUeoEDgfGJ5368gpnyYGfNkKcECqM",
"5ULtZcyfuWvKuwB555WN4W1vsVW4F3yHU9UW1Gd7kAWy",
"ADBN766ykF4HdkNa7Az8BVrpaQdvSpaMMULufBAs8U1B",
"61YcP8msC5F3ZTLy99VWM2oom6y47UzNmSQQdXMmdCG1",
"984XkyV6X29LUYSi476KC5cTFNMyegrx81EfHj6qWSeV",
"DXu8wVJigvqBLNf18QYQbHn7hcvVWnCpCMoYAPuQGEyr",
"7p1D1WBPr3sK9TYwrRwVcjYwacXhMH3WdJqqyowbvD1f",
"52AXihP4T7dgtfxFMjjLBFVGucNvHmxMW5GkvM1vQyFU",
"HmBHnMwfmsuEFZ4pFpYAXeAkcdnbWzCGEwZ2SXjY8W3N",
"3XSoALqyVbG1ZMgmTwNcuUf294LzjUj7Mvy7MgA7YNVk",
"Gnyw7rZykLq9FjLMzsu6nAryMJijy5FjCEbxxdkymRwk",
"4QJg58aV3UUi2CJ99kiqCMizY81w513qvaQoNgPERHBn",
"FQ2yHp7D3SBYQoe2crFATJdhsazJKJ9Yvq4xFbTzCMYx",
"GSmbMHXC6czx77qXWT3UH1jg2jW6SWdD6D6mFFx3rYmY",
"JDFgtub1sDznJgJRYbHZu1tGQsnhrz17gv8Arq8Zc1SL",
"6BQsUwpVwmPyjGfpE3BAUsNmmbcVy9ygyDYXfpFZ785Z",
"ACthtigKSdBXfCKLUfZNjQzLMmKHzjbSafqpa1NJ3M7J",
"9omg1BYxdA3hhM1rmx3tpMnTf9aqzBRUE9bV6i77b88M",
"HwyjTsHYceVsnhH3Suda9VSqtXftuN9wwjt4aUEx6C3T",
]
return rng.random.choice(token_accounts)

@@ -94,2 +94,5 @@ import base64

def _random_token_account_params_factory(self, rng: RNG) -> list[Account | dict]:
return [self.test_data.get_random_token_account(rng)]
def _get_signature_statuses_params_factory(self, rng: RNG) -> list[list[TxHash] | dict]:

@@ -424,7 +427,6 @@ return [

# TODO: Fix "Invalid param: not a Token account" and "Invalid param: could not find account" errors
def get_token_account_balance(self) -> RpcCall:
return RpcCall(
method="getTokenAccountBalance",
params=self._random_account_params_factory(self.rng.get_rng()),
params=self._random_token_account_params_factory(self.rng.get_rng()),
)

@@ -431,0 +433,0 @@

import csv
import logging
import typing
from datetime import datetime, timedelta

@@ -10,2 +11,3 @@ from pathlib import Path

from ..user import SolanaUser
from .http import HttpClient

@@ -28,13 +30,46 @@

def head_lag_monitor(endpoint: str, result_path: Path, duration: str):
data = {
# EVM
def eth_get_block_by_number(http_client: HttpClient) -> dict:
body = {
"jsonrpc": "2.0",
"id": 1,
"jsonrpc": "2.0",
"method": "eth_getBlockByNumber",
"params": ["latest", False],
}
response = http_client.post(data=body)
return response.json["result"]
# Solana
def get_slot(http_client: HttpClient) -> int:
response = http_client.post(data={"jsonrpc": "2.0", "id": 1, "method": "getSlot", "params": []})
return response.json["result"]
def get_block(http_client: HttpClient, slot: int) -> dict:
body = {
"jsonrpc": "2.0",
"id": 1,
"method": "getBlock",
"params": [
slot,
{
"encoding": "jsonParsed",
"transactionDetails": "none",
"rewards": False,
"maxSupportedTransactionVersion": 0,
},
],
}
response = http_client.post(data=body)
return response.json["result"]
def sync_lag_monitor(user_class: typing.Any, endpoint: str, result_path: Path, duration: str):
end_time = datetime.now() + timedelta(seconds=parse_timespan(duration))
http = HttpClient(endpoint)
with open(
file=f"{result_path}/head_lag.csv",
file=f"{result_path}/sync_lag.csv",
mode="a",

@@ -44,3 +79,3 @@ encoding="utf-8-sig",

) as csv_file:
logger.info("Start monitoring head lag")
logger.info("Start monitoring sync lag")
csv_writer = csv.writer(csv_file)

@@ -50,6 +85,11 @@ csv_writer.writerow(["timestamp", "lag (s)", "block number"])

current_timestamp = datetime.now()
response = http.post(data=data)
try:
block_timestamp = datetime.fromtimestamp(int(response.json["result"]["timestamp"], 0))
block_number = int(response.json["result"]["number"], 0)
if user_class == SolanaUser:
block_number = get_slot(http)
block = get_block(http, block_number)
block_timestamp = datetime.fromtimestamp(block["blockTime"])
else:
block = eth_get_block_by_number(http)
block_timestamp = datetime.fromtimestamp(int(block["timestamp"], 0))
block_number = int(block["number"], 0)
csv_writer.writerow(

@@ -62,3 +102,3 @@ [

)
logger.info("Written 1 row to head_lag.csv")
logger.info("Written 1 row to sync_lag.csv")
sleep(10)

@@ -68,5 +108,5 @@ except (KeyError, JSONDecodeError):

sleep(1)
logger.info("Finished monitoring head lag")
logger.info("Finished monitoring sync lag")
monitors = {"head-lag-monitor": head_lag_monitor}
monitors = {"sync-lag-monitor": sync_lag_monitor}
Metadata-Version: 2.1
Name: chainbench
Version: 0.8.2
Version: 0.8.3
Summary:

@@ -221,3 +221,3 @@ Author: Egor Molodik

Monitors are separate processes that run during the test to collect or process some additional data and metrics relevant to the test.
For example, head-lag-monitor will collect the latest block information from the node under test, check the timestamp and compare it to current time to calculate how much the node lags behind.
For example, sync-lag-monitor will collect the latest block information from the node under test, check the timestamp and compare it to current time to calculate how much the node lags behind.
You may include monitors in your test by using the `-m` or `--monitor` option and specifying the name of the monitor. At the moment, monitors only work in headless mode.

@@ -227,3 +227,3 @@

```shell
chainbench start --profile evm.light --users 50 --workers 2 --test-time 12h --target https://node-url --headless --autoquit -m head-lag-monitor
chainbench start --profile evm.light --users 50 --workers 2 --test-time 12h --target https://node-url --headless --autoquit -m sync-lag-monitor
```

@@ -230,0 +230,0 @@

[tool.poetry]
name = "chainbench"
version = "0.8.2"
version = "0.8.3"
description = ""

@@ -5,0 +5,0 @@ authors = [

@@ -198,3 +198,3 @@ <img width="1200" alt="Labs" src="https://user-images.githubusercontent.com/99700157/213291931-5a822628-5b8a-4768-980d-65f324985d32.png">

Monitors are separate processes that run during the test to collect or process some additional data and metrics relevant to the test.
For example, head-lag-monitor will collect the latest block information from the node under test, check the timestamp and compare it to current time to calculate how much the node lags behind.
For example, sync-lag-monitor will collect the latest block information from the node under test, check the timestamp and compare it to current time to calculate how much the node lags behind.
You may include monitors in your test by using the `-m` or `--monitor` option and specifying the name of the monitor. At the moment, monitors only work in headless mode.

@@ -204,3 +204,3 @@

```shell
chainbench start --profile evm.light --users 50 --workers 2 --test-time 12h --target https://node-url --headless --autoquit -m head-lag-monitor
chainbench start --profile evm.light --users 50 --workers 2 --test-time 12h --target https://node-url --headless --autoquit -m sync-lag-monitor
```

@@ -207,0 +207,0 @@