Skip to content

Commit 0120158

Browse files
authored
Merge pull request #92 from 0xcregis/internal-transaction-data
feat: Internal transaction data
2 parents 226baf6 + 4eb1c94 commit 0120158

File tree

17 files changed

+351
-136
lines changed

17 files changed

+351
-136
lines changed

blockchain/blockchain.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ type NFT interface {
2121
}
2222

2323
type ChainNet interface {
24-
SendReq(blockChain int64, reqBody string) (string, error)
24+
SendReq(blockChain int64, reqBody string, trace bool) (string, error)
2525
SendReqByWs(blockChain int64, receiverCh chan string, sendCh chan string) (string, error)
2626
}
2727

2828
type ChainCluster interface {
29-
BalanceCluster() *config.NodeCluster
29+
BalanceCluster(trace bool) *config.NodeCluster
3030
}

blockchain/config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ type NodeCluster struct {
2222
Weight int64 `json:"Weight"`
2323
ErrorCount int64 `json:"ErrorCount"`
2424
Utxo string `json:"Utxo"`
25+
Trace bool `json:"Trace"`
2526
}

blockchain/service.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ type API interface {
4040

4141
type ExApi interface {
4242
GasPrice(chainCode int64) (string, error)
43+
TraceTransaction(chainCode int64, hash string) (string, error)
4344
EstimateGas(chainCode int64, from, to, data string) (string, error)
4445
EstimateGasForTron(chainCode int64, from, to, functionSelector, parameter string) (string, error)
4546
GetAccountResourceForTron(chainCode int64, address string) (string, error)

blockchain/service/bnb/bnb.go

Lines changed: 47 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ type Bnb struct {
2424
}
2525

2626
func (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

4040
func (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

5454
func (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

6868
func (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

8282
func (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

123123
func (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

201201
func (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

215215
func (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

232232
func (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

248248
func (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

265265
func (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

284284
func (e *Bnb) SendJsonRpc(chainCode int64, req string) (string, error) {
285-
return e.SendReq(chainCode, req)
285+
return e.SendReq(chainCode, req, false)
286286
}
287287

288288
func 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+
348362
func (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

370384
func (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

404418
func (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

415429
func (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

475489
func (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
}

blockchain/service/btc/btc.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func (e *Btc) GetBlockByHash(chainCode int64, hash string, flag bool) (string, e
7575
}
7676

7777
req = fmt.Sprintf(req, hash, hasTx)
78-
return e.SendReq(chainCode, req)
78+
return e.SendReq(chainCode, req, false)
7979
}
8080

8181
func (e *Btc) GetBlockByNumber(chainCode int64, number string, flag bool) (string, error) {
@@ -88,7 +88,7 @@ func (e *Btc) GetBlockByNumber(chainCode int64, number string, flag bool) (strin
8888
}
8989
`
9090
req = fmt.Sprintf(req, number)
91-
resp, err := e.SendReq(chainCode, req)
91+
resp, err := e.SendReq(chainCode, req, false)
9292

9393
if err != nil {
9494
return resp, err
@@ -118,11 +118,11 @@ func (e *Btc) GetTxByHash(chainCode int64, hash string) (string, error) {
118118
}
119119
`
120120
req = fmt.Sprintf(req, hash)
121-
return e.SendReq(chainCode, req)
121+
return e.SendReq(chainCode, req, false)
122122
}
123123

124124
func (e *Btc) SendJsonRpc(chainCode int64, req string) (string, error) {
125-
return e.SendReq(chainCode, req)
125+
return e.SendReq(chainCode, req, false)
126126
}
127127

128128
func NewBtc(cluster []*config.NodeCluster, blockchain int64, xlog *xlog.XLog) blockchain.API {
@@ -183,7 +183,7 @@ func (e *Btc) LatestBlock(chainCode int64) (string, error) {
183183
"method": "getblockcount"
184184
}
185185
`
186-
return e.SendReq(chainCode, req)
186+
return e.SendReq(chainCode, req, false)
187187
}
188188

189189
func (e *Btc) SendRawTransaction(chainCode int64, signedTx string) (string, error) {
@@ -194,14 +194,14 @@ func (e *Btc) SendRawTransaction(chainCode int64, signedTx string) (string, erro
194194
]
195195
}`
196196
req = fmt.Sprintf(req, signedTx)
197-
return e.SendReq(chainCode, req)
197+
return e.SendReq(chainCode, req, false)
198198
}
199199

200200
func (e *Btc) SendReqByWs(blockChain int64, receiverCh chan string, sendCh chan string) (string, error) {
201201
return "", nil
202202
}
203203

204-
func (e *Btc) SendReq(blockChain int64, reqBody string) (resp string, err error) {
204+
func (e *Btc) SendReq(blockChain int64, reqBody string, trace bool) (resp string, err error) {
205205
reqBody = strings.Replace(reqBody, "\t", "", -1)
206206
reqBody = strings.Replace(reqBody, "\n", "", -1)
207207
var uri string
@@ -213,7 +213,7 @@ func (e *Btc) SendReq(blockChain int64, reqBody string) (resp string, err error)
213213
}
214214
}()
215215

216-
cluster := e.BalanceCluster()
216+
cluster := e.BalanceCluster(trace)
217217
if cluster == nil {
218218
//不存在节点
219219
return "", errors.New("blockchain node has not found")
@@ -228,7 +228,7 @@ func (e *Btc) SendReq(blockChain int64, reqBody string) (resp string, err error)
228228
return resp, err
229229
}
230230

231-
func (e *Btc) BalanceCluster() *config.NodeCluster {
231+
func (e *Btc) BalanceCluster(trace bool) *config.NodeCluster {
232232
var resultCluster *config.NodeCluster
233233
l := len(e.nodeCluster)
234234

0 commit comments

Comments
 (0)