@@ -24,7 +24,7 @@ type Bnb struct {
2424}
2525
2626func (e * Bnb ) TokenURI (chainCode int64 , contractAddress string , tokenId string , eip int64 ) (string , error ) {
27- cluster := e .BalanceCluster ()
27+ cluster := e .BalanceCluster (false )
2828 if cluster == nil {
2929 //不存在节点
3030 return "" , errors .New ("blockchain node has not found" )
@@ -38,7 +38,7 @@ func (e *Bnb) TokenURI(chainCode int64, contractAddress string, tokenId string,
3838}
3939
4040func (e * Bnb ) BalanceOf (chainCode int64 , contractAddress string , address string , tokenId string , eip int64 ) (string , error ) {
41- cluster := e .BalanceCluster ()
41+ cluster := e .BalanceCluster (false )
4242 if cluster == nil {
4343 //不存在节点
4444 return "" , errors .New ("blockchain node has not found" )
@@ -52,7 +52,7 @@ func (e *Bnb) BalanceOf(chainCode int64, contractAddress string, address string,
5252}
5353
5454func (e * Bnb ) OwnerOf (chainCode int64 , contractAddress string , tokenId string , eip int64 ) (string , error ) {
55- cluster := e .BalanceCluster ()
55+ cluster := e .BalanceCluster (false )
5656 if cluster == nil {
5757 //不存在节点
5858 return "" , errors .New ("blockchain node has not found" )
@@ -66,7 +66,7 @@ func (e *Bnb) OwnerOf(chainCode int64, contractAddress string, tokenId string, e
6666}
6767
6868func (e * Bnb ) TotalSupply (chainCode int64 , contractAddress string , eip int64 ) (string , error ) {
69- cluster := e .BalanceCluster ()
69+ cluster := e .BalanceCluster (false )
7070 if cluster == nil {
7171 //不存在节点
7272 return "" , errors .New ("blockchain node has not found" )
@@ -80,7 +80,7 @@ func (e *Bnb) TotalSupply(chainCode int64, contractAddress string, eip int64) (s
8080}
8181
8282func (e * Bnb ) Token (chainCode int64 , contractAddr string , abi string , eip string ) (string , error ) {
83- cluster := e .BalanceCluster ()
83+ cluster := e .BalanceCluster (false )
8484 if cluster == nil {
8585 //不存在节点
8686 return "" , errors .New ("blockchain node has not found" )
@@ -117,7 +117,7 @@ func (e *Bnb) GetCode(chainCode int64, address string) (string, error) {
117117 ]
118118 }`
119119 query = fmt .Sprintf (query , address )
120- return e .SendReq (chainCode , query )
120+ return e .SendReq (chainCode , query , false )
121121}
122122
123123func (e * Bnb ) GetAddressType (chainCode int64 , address string ) (string , error ) {
@@ -135,7 +135,7 @@ func (e *Bnb) GetAddressType(chainCode int64, address string) (string, error) {
135135 ]
136136 }`
137137 query = fmt .Sprintf (query , address )
138- resp , err := e .SendReq (chainCode , query )
138+ resp , err := e .SendReq (chainCode , query , false )
139139 if err != nil {
140140 return "" , err
141141 }
@@ -166,7 +166,7 @@ func (e *Bnb) UnSubscribe(chainCode int64, subId string) (string, error) {
166166 query := `{"id": 1, "method": "eth_unsubscribe", "params": ["%v"]}`
167167
168168 query = fmt .Sprintf (query , subId )
169- resp , err := e .SendReq (chainCode , query )
169+ resp , err := e .SendReq (chainCode , query , false )
170170 if err != nil {
171171 return "" , err
172172 }
@@ -195,7 +195,7 @@ func (e *Bnb) GetBlockReceiptByBlockNumber(chainCode int64, number string) (stri
195195 ]
196196 }`
197197 query = fmt .Sprintf (query , number )
198- return e .SendReq (chainCode , query )
198+ return e .SendReq (chainCode , query , false )
199199}
200200
201201func (e * Bnb ) GetBlockReceiptByBlockHash (chainCode int64 , hash string ) (string , error ) {
@@ -209,7 +209,7 @@ func (e *Bnb) GetBlockReceiptByBlockHash(chainCode int64, hash string) (string,
209209 }`
210210
211211 query = fmt .Sprintf (query , hash )
212- return e .SendReq (chainCode , query )
212+ return e .SendReq (chainCode , query , false )
213213}
214214
215215func (e * Bnb ) GetTransactionReceiptByHash (chainCode int64 , hash string ) (string , error ) {
@@ -226,7 +226,7 @@ func (e *Bnb) GetTransactionReceiptByHash(chainCode int64, hash string) (string,
226226 ]
227227 }`
228228 query = fmt .Sprintf (query , hash )
229- return e .SendReq (chainCode , query )
229+ return e .SendReq (chainCode , query , false )
230230}
231231
232232func (e * Bnb ) GetBlockByHash (chainCode int64 , hash string , flag bool ) (string , error ) {
@@ -242,7 +242,7 @@ func (e *Bnb) GetBlockByHash(chainCode int64, hash string, flag bool) (string, e
242242 }`
243243
244244 req = fmt .Sprintf (req , hash , flag )
245- return e .SendReq (chainCode , req )
245+ return e .SendReq (chainCode , req , false )
246246}
247247
248248func (e * Bnb ) GetBlockByNumber (chainCode int64 , number string , flag bool ) (string , error ) {
@@ -259,7 +259,7 @@ func (e *Bnb) GetBlockByNumber(chainCode int64, number string, flag bool) (strin
259259 `
260260 number , _ = util .Int2Hex (number )
261261 req = fmt .Sprintf (req , number , flag )
262- return e .SendReq (chainCode , req )
262+ return e .SendReq (chainCode , req , false )
263263}
264264
265265func (e * Bnb ) GetTxByHash (chainCode int64 , hash string ) (string , error ) {
@@ -278,11 +278,11 @@ func (e *Bnb) GetTxByHash(chainCode int64, hash string) (string, error) {
278278 }
279279 `
280280 req = fmt .Sprintf (req , hash )
281- return e .SendReq (chainCode , req )
281+ return e .SendReq (chainCode , req , false )
282282}
283283
284284func (e * Bnb ) SendJsonRpc (chainCode int64 , req string ) (string , error ) {
285- return e .SendReq (chainCode , req )
285+ return e .SendReq (chainCode , req , false )
286286}
287287
288288func NewNftBnb (cluster []* config.NodeCluster , blockchain int64 , xlog * xlog.XLog ) blockchain.NftApi {
@@ -345,6 +345,20 @@ func (e *Bnb) MonitorCluster() any {
345345 return e .nodeCluster
346346}
347347
348+ func (e * Bnb ) TraceTransaction (chainCode int64 , address string ) (string , error ) {
349+ req := `{
350+ "id": 1,
351+ "jsonrpc": "2.0",
352+ "params": [
353+ "%v"
354+ ],
355+ "method": "trace_transaction"
356+ }`
357+ req = fmt .Sprintf (req , address )
358+
359+ return e .SendReq (chainCode , req , true )
360+ }
361+
348362func (e * Bnb ) Balance (chainCode int64 , address string , tag string ) (string , error ) {
349363 start := time .Now ()
350364 defer func () {
@@ -364,15 +378,15 @@ func (e *Bnb) Balance(chainCode int64, address string, tag string) (string, erro
364378 }`
365379
366380 req = fmt .Sprintf (req , address , tag )
367- return e .SendReq (chainCode , req )
381+ return e .SendReq (chainCode , req , false )
368382}
369383
370384func (e * Bnb ) TokenBalance (chainCode int64 , address string , contractAddr string , abi string ) (string , error ) {
371385 start := time .Now ()
372386 defer func () {
373387 e .log .Printf ("TokenBalance,Duration=%v" , time .Since (start ))
374388 }()
375- cluster := e .BalanceCluster ()
389+ cluster := e .BalanceCluster (false )
376390 if cluster == nil {
377391 //不存在节点
378392 return "" , errors .New ("blockchain node has not found" )
@@ -398,7 +412,7 @@ func (e *Bnb) Nonce(chainCode int64, address string, tag string) (string, error)
398412 }
399413 `
400414 req = fmt .Sprintf (req , address , tag )
401- return e .SendReq (chainCode , req )
415+ return e .SendReq (chainCode , req , false )
402416}
403417
404418func (e * Bnb ) LatestBlock (chainCode int64 ) (string , error ) {
@@ -409,7 +423,7 @@ func (e *Bnb) LatestBlock(chainCode int64) (string, error) {
409423 "method": "eth_blockNumber"
410424 }
411425 `
412- return e .SendReq (chainCode , req )
426+ return e .SendReq (chainCode , req , false )
413427}
414428
415429func (e * Bnb ) GetAccountResourceForTron (chainCode int64 , address string ) (string , error ) {
@@ -469,14 +483,14 @@ func (e *Bnb) SendRawTransaction(chainCode int64, signedTx string) (string, erro
469483 "method": "eth_sendRawTransaction"
470484 }`
471485 req = fmt .Sprintf (req , signedTx )
472- return e .SendReq (chainCode , req )
486+ return e .SendReq (chainCode , req , false )
473487}
474488
475489func (e * Bnb ) SendReqByWs (blockChain int64 , receiverCh chan string , sendCh chan string ) (string , error ) {
476490 return "" , nil
477491}
478492
479- func (e * Bnb ) SendReq (blockChain int64 , reqBody string ) (resp string , err error ) {
493+ func (e * Bnb ) SendReq (blockChain int64 , reqBody string , trace bool ) (resp string , err error ) {
480494 reqBody = strings .Replace (reqBody , "\t " , "" , - 1 )
481495 reqBody = strings .Replace (reqBody , "\n " , "" , - 1 )
482496 var uri string
@@ -487,7 +501,7 @@ func (e *Bnb) SendReq(blockChain int64, reqBody string) (resp string, err error)
487501 e .log .Printf ("method:%v,blockChain:%v,req:%v,resp:%v" , "SendReq" , blockChain , reqBody , "ok" )
488502 }
489503 }()
490- cluster := e .BalanceCluster ()
504+ cluster := e .BalanceCluster (trace )
491505 if cluster == nil {
492506 //不存在节点
493507 return "" , errors .New ("blockchain node has not found" )
@@ -502,25 +516,27 @@ func (e *Bnb) SendReq(blockChain int64, reqBody string) (resp string, err error)
502516 return resp , err
503517}
504518
505- func (e * Bnb ) BalanceCluster () * config.NodeCluster {
519+ func (e * Bnb ) BalanceCluster (trace bool ) * config.NodeCluster {
506520 var resultCluster * config.NodeCluster
507521 l := len (e .nodeCluster )
508522
509523 if l > 1 {
510524 //如果有多个节点,则根据权重计算
511525 mp := make (map [string ][]int64 , 0 )
512- originCluster := make (map [string ]* config.NodeCluster , 0 )
526+ originCluster := make (map [string ]* config.NodeCluster , 1 )
513527
514528 var sum int64
515529 for _ , v := range e .nodeCluster {
516530 if v .Weight == 0 {
517531 //如果没有设置weight,则默认设定5
518532 v .Weight = 5
519533 }
520- sum += v .Weight
521- key := fmt .Sprintf ("%v/%v" , v .NodeUrl , v .NodeToken )
522- mp [key ] = []int64 {v .Weight , sum }
523- originCluster [key ] = v
534+ if ! trace || trace && v .Trace {
535+ sum += v .Weight
536+ key := fmt .Sprintf ("%v/%v" , v .NodeUrl , v .NodeToken )
537+ mp [key ] = []int64 {v .Weight , sum }
538+ originCluster [key ] = v
539+ }
524540 }
525541
526542 f := math .Mod (float64 (time .Now ().Unix ()), float64 (sum ))
@@ -536,6 +552,9 @@ func (e *Bnb) BalanceCluster() *config.NodeCluster {
536552 } else if l == 1 {
537553 //如果 仅有一个节点,则只能使用该节点
538554 resultCluster = e .nodeCluster [0 ]
555+ if trace && ! resultCluster .Trace {
556+ return nil
557+ }
539558 } else {
540559 return nil
541560 }
0 commit comments