@@ -11,6 +11,7 @@ import (
11
11
"net/url"
12
12
"path"
13
13
"strconv"
14
+ "strings"
14
15
15
16
"github.com/everFinance/sandy_log/log"
16
17
@@ -53,6 +54,17 @@ func (c *Client) GetInfo() (info *types.NetworkInfo, err error) {
53
54
return
54
55
}
55
56
57
+ func (c * Client ) Peers () ([]string , error ) {
58
+ body , _ , err := c .httpGet ("peers" )
59
+ if err != nil {
60
+ return nil , ErrBadGateway
61
+ }
62
+
63
+ peers := make ([]string , 0 )
64
+ err = json .Unmarshal (body , & peers )
65
+ return peers , err
66
+ }
67
+
56
68
// GetTransactionByID status: Pending/Invalid hash/overspend
57
69
func (c * Client ) GetTransactionByID (id string ) (tx * types.Transaction , err error ) {
58
70
body , statusCode , err := c .httpGet (fmt .Sprintf ("tx/%s" , id ))
@@ -422,6 +434,62 @@ func (c *Client) DownloadChunkData(id string) ([]byte, error) {
422
434
return data , nil
423
435
}
424
436
437
+ func (c * Client ) GetTxDataFromPeers (txId string ) ([]byte , error ) {
438
+ peers , err := c .Peers ()
439
+ if err != nil {
440
+ return nil , err
441
+ }
442
+ for _ , peer := range peers {
443
+ if strings .Contains (peer , "127.0" ) {
444
+ continue
445
+ }
446
+ arNode := NewClient ("http://" + peer )
447
+ data , err := arNode .GetTransactionData (txId )
448
+ if err != nil {
449
+ fmt .Printf ("get tx data error:%v, peer: %s\n " , err , peer )
450
+ continue
451
+ }
452
+ return data , nil
453
+ }
454
+ return nil , errors .New ("get tx data from peers failed" )
455
+ }
456
+
457
+ func (c * Client ) UploadTxDataToPeers (txId string , data []byte ) error {
458
+ peers , err := c .Peers ()
459
+ if err != nil {
460
+ return err
461
+ }
462
+
463
+ count := 0
464
+ for _ , peer := range peers {
465
+ if strings .Contains (peer , "127.0" ) {
466
+ continue
467
+ }
468
+ fmt .Printf ("upload peer: %s, count: %d\n " , peer , count )
469
+ arNode := NewClient ("http://" + peer )
470
+ uploader , err := CreateUploader (arNode , txId , data )
471
+ if err != nil {
472
+ continue
473
+ }
474
+ Loop:
475
+ for ! uploader .IsComplete () {
476
+ if err := uploader .UploadChunk (); err != nil {
477
+ break Loop
478
+ }
479
+ if uploader .LastResponseStatus != 200 {
480
+ break Loop
481
+ }
482
+ }
483
+ if uploader .IsComplete () { // upload success
484
+ count ++
485
+ }
486
+ if count > 20 {
487
+ return nil
488
+ }
489
+ }
490
+ return fmt .Errorf ("upload tx data to peers failed, txId: %s" , txId )
491
+ }
492
+
425
493
// push to bundler gateway
426
494
427
495
// SendItemToBundler send bundle bundleItem to bundler gateway
0 commit comments