11package collate
22
33import (
4+ "slices"
45 "testing"
56
67 "github.com/NilFoundation/nil/nil/common"
@@ -97,24 +98,24 @@ func (s *ProposerTestSuite) TestCollator() {
9798 p := newTestProposer (params , pool )
9899 shardId := p .params .ShardId
99100
100- generateBlock := func () * execution.Proposal {
101+ generateBlock := func () ( * execution.Proposal , * execution. BlockGenerationResult ) {
101102 proposal := s .generateProposal (p )
102103
103104 tx , err := s .db .CreateRoTx (s .T ().Context ())
104105 s .Require ().NoError (err )
105106 defer tx .Rollback ()
106107
107- block , err := db .ReadBlock (tx , shardId , proposal .PrevBlockHash )
108+ prevBlock , err := db .ReadBlock (tx , shardId , proposal .PrevBlockHash )
108109 s .Require ().NoError (err )
109110
110- blockGenerator , err := execution .NewBlockGenerator (s .T ().Context (), params .BlockGeneratorParams , s .db , block )
111+ gen , err := execution .NewBlockGenerator (s .T ().Context (), params .BlockGeneratorParams , s .db , prevBlock )
111112 s .Require ().NoError (err )
112- defer blockGenerator .Rollback ()
113+ defer gen .Rollback ()
113114
114- _ , err = blockGenerator .GenerateBlock (proposal , & types.ConsensusParams {})
115+ block , err := gen .GenerateBlock (proposal , & types.ConsensusParams {})
115116 s .Require ().NoError (err )
116117
117- return proposal
118+ return proposal , block
118119 }
119120
120121 s .Run ("GenerateZeroState" , func () {
@@ -133,9 +134,9 @@ func (s *ProposerTestSuite) TestCollator() {
133134 pool .Reset ()
134135 pool .Add (m1 , m2 )
135136
136- proposal := generateBlock ()
137- r1 = s .checkReceipt (shardId , m1 )
138- r2 = s .checkReceipt (shardId , m2 )
137+ proposal , res := generateBlock ()
138+ r1 = s .checkReceipt (res , m1 )
139+ r2 = s .checkReceipt (res , m2 )
139140 s .Equal (pool .Txns , proposal .ExternalTxns )
140141
141142 // Each transaction subtracts its value + actual gas used from the balance.
@@ -160,15 +161,13 @@ func (s *ProposerTestSuite) TestCollator() {
160161
161162 balance = balance .Add (r1 .Forwarded ).Add (r2 .Forwarded )
162163 s .Equal (balance , s .getMainBalance ())
163-
164- s .checkSeqno (shardId )
165164 })
166165
167166 s .Run ("DoNotProcessDuplicates" , func () {
168167 pool .Reset ()
169168 pool .Add (m1 , m2 )
170169
171- proposal := generateBlock ()
170+ proposal , _ := generateBlock ()
172171 s .Empty (proposal .ExternalTxns )
173172 s .Empty (proposal .InternalTxns )
174173 s .Empty (proposal .ForwardTxns )
@@ -183,36 +182,17 @@ func (s *ProposerTestSuite) TestCollator() {
183182 pool .Reset ()
184183 pool .Add (m )
185184
186- generateBlock ()
187- s .checkReceipt (shardId , m )
185+ _ , res := generateBlock ()
186+ s .checkReceipt (res , m )
188187 })
189188
190189 s .Run ("Execute" , func () {
191190 m := execution .NewExecutionTransaction (to , to , 1 , contracts .NewCounterAddCallData (s .T (), 3 ))
192191 pool .Reset ()
193192 pool .Add (m )
194193
195- generateBlock ()
196- s .checkReceipt (shardId , m )
197- })
198-
199- s .Run ("CheckRefundsSeqno" , func () {
200- m01 := execution .NewSendMoneyTransaction (s .T (), to , 2 )
201- m02 := execution .NewSendMoneyTransaction (s .T (), to , 3 )
202- pool .Reset ()
203- pool .Add (m01 , m02 )
204-
205- // send tokens
206- generateBlock ()
207-
208- // process internal transactions
209- generateBlock ()
210-
211- // process refunds
212- generateBlock ()
213-
214- // check refunds seqnos
215- s .checkSeqno (shardId )
194+ _ , res := generateBlock ()
195+ s .checkReceipt (res , m )
216196 })
217197}
218198
@@ -245,52 +225,16 @@ func (s *ProposerTestSuite) getBalance(shardId types.ShardId, addr types.Address
245225 return acc .Balance
246226}
247227
248- func (s * ProposerTestSuite ) checkSeqno (shardId types.ShardId ) {
249- s .T ().Helper ()
250-
251- tx , err := s .db .CreateRoTx (s .T ().Context ())
252- s .Require ().NoError (err )
253- defer tx .Rollback ()
254-
255- sa := execution .NewStateAccessor ()
256- blockHash , err := db .ReadLastBlockHash (tx , shardId )
257- s .Require ().NoError (err )
258-
259- block , err := sa .Access (tx , shardId ).GetBlock ().WithInTransactions ().WithOutTransactions ().ByHash (blockHash )
260- s .Require ().NoError (err )
261-
262- check := func (txns []* types.Transaction ) {
263- if len (txns ) == 0 {
264- return
265- }
266- seqno := txns [0 ].Seqno
267- for _ , m := range txns {
268- s .Require ().Equal (seqno , m .Seqno )
269- seqno ++
270- }
271- }
272-
273- check (block .InTransactions ())
274- check (block .OutTransactions ())
275- }
276-
277- func (s * ProposerTestSuite ) checkReceipt (shardId types.ShardId , m * types.Transaction ) * types.Receipt {
228+ func (s * ProposerTestSuite ) checkReceipt (genRes * execution.BlockGenerationResult , m * types.Transaction ) * types.Receipt {
278229 s .T ().Helper ()
279230
280- tx , err := s .db .CreateRoTx (s .T ().Context ())
281- s .Require ().NoError (err )
282- defer tx .Rollback ()
283-
284- sa := execution .NewStateAccessor ()
285- txnData , err := sa .Access (tx , m .From .ShardId ()).GetInTransaction ().ByHash (m .Hash ())
286- s .Require ().NoError (err )
231+ hash := m .Hash ()
232+ idx := slices .IndexFunc (genRes .Receipts , func (r * types.Receipt ) bool {
233+ return r .TxnHash == hash
234+ })
235+ s .Require ().GreaterOrEqual (idx , 0 , "receipt not found for transaction %s" , hash )
287236
288- receiptsTrie := execution .NewDbReceiptTrieReader (tx , shardId )
289- s .Require ().NoError (receiptsTrie .SetRootHash (txnData .Block ().ReceiptsRoot ))
290- receipt , err := receiptsTrie .Fetch (txnData .Index ())
291- s .Require ().NoError (err )
292- s .Equal (m .Hash (), receipt .TxnHash )
293- return receipt
237+ return genRes .Receipts [idx ]
294238}
295239
296240func TestProposer (t * testing.T ) {
0 commit comments