99from pathlib import Path
1010import 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
1715from tontester .install import Install
1816from tontester .network import DHTNode , FullNode , Network
1917from 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