Skip to content

Commit 47f75ce

Browse files
committed
update benchmark script with new tontester contracts wrappers
1 parent 8f19037 commit 47f75ce

File tree

1 file changed

+59
-40
lines changed

1 file changed

+59
-40
lines changed

mytonctrl/scripts/benchmark.py

Lines changed: 59 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@
99
from pathlib import Path
1010
import os
1111

12-
from pytoniq_core import StateInit, Slice, begin_cell, MessageAny
12+
from pytoniq_core import Address, InternalMsgInfo, MessageAny, Slice, StateInit, WalletMessage, begin_cell
1313

14-
from contract import SMCAddress
15-
from contract.wallet_v1 import WalletV1
16-
from tonlib import TonlibClient
14+
from contract import WalletV1, ton
1715
from tontester.install import Install
1816
from tontester.network import DHTNode, FullNode, Network
1917
from tontester.zerostate import SimplexConsensusConfig
@@ -160,35 +158,37 @@ async def setup_network(
160158
working_dir.mkdir(exist_ok=True, parents=True)
161159

162160
install = Install(build_dir, source_dir)
161+
install.tonlibjson.client_set_verbosity_level(3)
163162
network = Network(install, working_dir)
164163

165-
dht = network.create_dht_node()
164+
dht = network.create_dht_node(threads=1)
166165
network.config.shard_consensus = SimplexConsensusConfig(target_block_rate_ms=block_rate)
167166
network.config.mc_consensus = SimplexConsensusConfig(target_block_rate_ms=master_block_rate)
168167
network.config.shard_validators = nodes_count
169168
network.config.split = int(math.log2(shards))
170169

170+
threads_per_node = max(1, (os.cpu_count() or 4) // nodes_count)
171+
171172
nodes: list[FullNode] = []
172173
for _ in range(nodes_count):
173-
node = network.create_full_node()
174+
node = network.create_full_node(threads=threads_per_node)
174175
node.make_initial_validator()
175176
node.announce_to(dht)
176177
nodes.append(node)
177178

178-
await dht.run(threads=1)
179-
threads_per_node = (os.cpu_count() or 4) // nodes_count
179+
await dht.run()
180180
print(f"Running each node with {threads_per_node} threads")
181181
for node in nodes:
182-
await node.run(threads=threads_per_node)
182+
await node.run()
183183
await asyncio.sleep(3)
184184

185185
return network, nodes, dht
186186

187187

188-
async def send_message(client: TonlibClient, message: MessageAny) -> None:
188+
async def send_with_retry(wallet: WalletV1, message: WalletMessage, seqno: int) -> None:
189189
while True:
190190
try:
191-
await client.send_message(message)
191+
await wallet.send(message, seqno)
192192
return
193193
except Exception as e:
194194
print(f"Sending message failed ({e}), retrying...")
@@ -225,45 +225,64 @@ async def collect_stats(client, stats: Stats) -> None:
225225
stats.print_new_seconds()
226226

227227

228-
def create_deploy_spammer_message(wallet: WalletV1, tps: int, i: int) -> MessageAny:
228+
def create_deploy_spammer_message(wallet: WalletV1, tps: int, i: int) -> WalletMessage:
229229
s_i = StateInit.deserialize(Slice.one_from_boc(SPAMMERS[i]))
230230
body = begin_cell().store_uint(0x5ce7c1d2, 32).store_uint(tps, 32).end_cell()
231-
return wallet.get_transfer_message(
232-
seqno=i,
233-
message=wallet.create_wallet_internal_message(
234-
destination=SMCAddress((0, s_i.serialize().hash)),
235-
send_mode=3,
236-
value=1000 * 10**9,
237-
state_init=s_i,
231+
return WalletMessage(
232+
send_mode=3,
233+
message=MessageAny(
234+
info=InternalMsgInfo(
235+
ihr_disabled=True,
236+
bounce=False,
237+
bounced=False,
238+
src=wallet.address,
239+
dest=Address((0, s_i.serialize().hash)),
240+
value=ton(1000),
241+
ihr_fee=0,
242+
fwd_fee=0,
243+
created_lt=0,
244+
created_at=0,
245+
),
246+
init=s_i,
238247
body=body,
239248
),
240249
)
241250

242251

243-
def get_spammer_address(i: int) -> SMCAddress:
252+
def get_spammer_address(i: int) -> Address:
244253
s_i = StateInit.deserialize(Slice.one_from_boc(SPAMMERS[i]))
245-
return SMCAddress((0, s_i.serialize().hash))
254+
return Address((0, s_i.serialize().hash))
246255

247256

248-
def create_stop_spammer_message(wallet: WalletV1, seqno: int, spammer_addr: SMCAddress) -> MessageAny:
257+
def create_stop_spammer_message(wallet: WalletV1, spammer_addr: Address) -> WalletMessage:
249258
body = begin_cell().store_uint(0x07c32b3f, 32).end_cell()
250-
return wallet.get_transfer_message(
251-
seqno=seqno,
252-
message=wallet.create_wallet_internal_message(
253-
destination=spammer_addr,
254-
send_mode=3,
255-
value=1 * 10**9,
256-
body=body
259+
return WalletMessage(
260+
send_mode=3,
261+
message=MessageAny(
262+
info=InternalMsgInfo(
263+
ihr_disabled=True,
264+
bounce=False,
265+
bounced=False,
266+
src=wallet.address,
267+
dest=spammer_addr,
268+
value=ton(1),
269+
ihr_fee=0,
270+
fwd_fee=0,
271+
created_lt=0,
272+
created_at=0,
273+
),
274+
init=None,
275+
body=body,
257276
),
258277
)
259278

260279

261-
async def stop_spammers(client: TonlibClient, wallet: WalletV1, spammers_count: int) -> None:
280+
async def stop_spammers(wallet: WalletV1, spammers_count: int) -> None:
262281
print("\n===== Stopping spammers =====")
263282
for i in range(spammers_count):
264283
addr = get_spammer_address(i)
265-
msg = create_stop_spammer_message(wallet, spammers_count + i, addr)
266-
await send_message(client, msg)
284+
msg = create_stop_spammer_message(wallet, addr)
285+
await send_with_retry(wallet, msg, seqno=spammers_count + i)
267286
print(f" Sent stop message to spammer {i}")
268287
await asyncio.sleep(2)
269288
print("All stop messages sent.")
@@ -273,10 +292,10 @@ async def run_sync_test(network: Network, dht: DHTNode) -> None:
273292
print("\n===== Sync Test =====")
274293

275294
print("Starting new node from scratch...")
276-
new_node = network.create_full_node()
277-
new_node.announce_to(dht)
278295
sync_threads = max(2, (os.cpu_count() or 4) // 2)
279-
await new_node.run(threads=sync_threads)
296+
new_node = network.create_full_node(threads=sync_threads)
297+
new_node.announce_to(dht)
298+
await new_node.run()
280299

281300
new_client = await new_node.tonlib_client()
282301

@@ -335,13 +354,14 @@ async def main() -> None:
335354
print("Waiting for network to stabilize...")
336355
await asyncio.sleep(20)
337356

338-
client = await network.get_tonlib_client()
357+
client = await nodes[0].tonlib_client()
358+
main_wallet = network.zerostate.main_wallet(client)
339359

340360
assert spammers_count <= len(SPAMMERS), f'too many spammers, max: {len(SPAMMERS)}'
341361

342362
for i in range(spammers_count):
343-
msg = create_deploy_spammer_message(network.zerostate.main_wallet, tps, i)
344-
await send_message(client, msg)
363+
msg = create_deploy_spammer_message(main_wallet, tps, i)
364+
await send_with_retry(main_wallet, msg, seqno=i)
345365
await asyncio.sleep(2)
346366

347367
start = time.monotonic()
@@ -354,8 +374,7 @@ async def main() -> None:
354374
stats.print_summary(expected_bps=(1000 / shard_block_rate) * shards, expected_tps=tps * shards, shards=shards)
355375

356376
if args.sync_test:
357-
client = await network.get_tonlib_client()
358-
await stop_spammers(client, network.zerostate.main_wallet, spammers_count)
377+
await stop_spammers(main_wallet, spammers_count)
359378
print("Waiting for spammers to fully stop...")
360379
await asyncio.sleep(10)
361380
await run_sync_test(network, dht)

0 commit comments

Comments
 (0)