Skip to content

Commit e8a4a3b

Browse files
authoredSep 22, 2021
Merge pull request #21 from everFinance/broadcast-txs
fix(): add upload and get function from peers
2 parents e7cc855 + 13184e1 commit e8a4a3b

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed
 

‎client.go

+68
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"net/url"
1212
"path"
1313
"strconv"
14+
"strings"
1415

1516
"github.com/everFinance/sandy_log/log"
1617

@@ -53,6 +54,17 @@ func (c *Client) GetInfo() (info *types.NetworkInfo, err error) {
5354
return
5455
}
5556

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+
5668
// GetTransactionByID status: Pending/Invalid hash/overspend
5769
func (c *Client) GetTransactionByID(id string) (tx *types.Transaction, err error) {
5870
body, statusCode, err := c.httpGet(fmt.Sprintf("tx/%s", id))
@@ -422,6 +434,62 @@ func (c *Client) DownloadChunkData(id string) ([]byte, error) {
422434
return data, nil
423435
}
424436

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+
425493
// push to bundler gateway
426494

427495
// SendItemToBundler send bundle bundleItem to bundler gateway

‎client_test.go

+31
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,34 @@ func TestClient_GetTransactionDataByGateway(t *testing.T) {
192192
assert.NoError(t, err)
193193
t.Log(len(data))
194194
}
195+
196+
func TestClient_GetPeers(t *testing.T) {
197+
arNode := "https://arweave.net"
198+
cli := NewClient(arNode)
199+
peers, err := cli.Peers()
200+
assert.NoError(t, err)
201+
t.Log(len(peers))
202+
}
203+
204+
func Test_UploadTxDataToPeers(t *testing.T) {
205+
data := make([]byte, 1103732)
206+
data[0] = byte('z')
207+
data[1] = byte('y')
208+
data[2] = byte('j')
209+
for i := 3; i < len(data); i++ {
210+
data[i] = byte('a')
211+
}
212+
213+
cli := NewClient("https://arweave.net")
214+
txId := "D3GOny9cItUEc8qAl1oLUtnoLOB3OfSB-wKbw8TUIRc"
215+
err = cli.UploadTxDataToPeers(txId, data)
216+
assert.NoError(t, err)
217+
}
218+
219+
func Test_GetTxDataFromPeers(t *testing.T) {
220+
cli := NewClient("https://arweave.net")
221+
txId := "D3GOny9cItUEc8qAl1oLUtnoLOB3OfSB-wKbw8TUIRc"
222+
data, err := cli.GetTxDataFromPeers(txId)
223+
assert.NoError(t, err)
224+
assert.Equal(t, 1471643, len(data))
225+
}

0 commit comments

Comments
 (0)