Skip to content

Commit 1cb0907

Browse files
Merge pull request #23 from everFinance/broadcast-txs
Broadcast txs
2 parents a7a0dea + e852ac8 commit 1cb0907

8 files changed

+73
-69
lines changed

README.md

+7-9
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ fmt.Println(id, err) // {{id}}, nil
9191
- [x] GetBlockByHeight
9292
- [x] BatchSendItemToBundler
9393
- [x] GetBundle
94+
- [x] GetTxDataFromPeers
95+
- [x] BroadcastData
9496

9597
Initialize the instance:
9698

@@ -240,11 +242,10 @@ uploader, err := goar.CreateUploader(w.Client, tx, nil)
240242
if err != nil {
241243
return
242244
}
243-
for !uploader.IsComplete() {
244-
err = uploader.UploadChunk()
245-
if err != nil {
246-
return
247-
}
245+
246+
err = uploader.Once()
247+
if err != nil {
248+
return
248249
}
249250
```
250251

@@ -280,10 +281,7 @@ txId := "myTxId"
280281
// get uploader by txId and post big data by chunks
281282
uploader, err := goar.CreateUploader(wallet.Client, txId, bigData)
282283
assert.NoError(t, err)
283-
for !uploader.IsComplete() {
284-
err := uploader.UploadChunk()
285-
assert.NoError(t, err)
286-
}
284+
assert.NoError(t, uploader.Once())
287285
```
288286

289287
##### NOTE: About all chunk transfer full example can be viewed in path `./example/chunks_tx_test.go`

client.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func (c *Client) GetPeers() ([]string, error) {
7575
fpeers = append(fpeers, p)
7676
}
7777

78-
return peers[:], nil
78+
return fpeers, nil
7979
}
8080

8181
// GetTransactionByID status: Pending/Invalid hash/overspend
@@ -169,10 +169,13 @@ func (c *Client) GetTransactionData(id string, extension ...string) (body []byte
169169
body, statusCode, err := c.httpGet(urlPath)
170170

171171
// When data is bigger than 12MiB statusCode == 400 NOTE: Data bigger than that has to be downloaded chunk by chunk.
172-
if statusCode == 400 || len(body) == 0 {
172+
if statusCode == 400 {
173173
body, err = c.DownloadChunkData(id)
174174
return
175175
} else if statusCode == 200 {
176+
if len(body) == 0 {
177+
return c.DownloadChunkData(id)
178+
}
176179
return body, nil
177180
} else if statusCode == 202 {
178181
return nil, ErrPendingTx
@@ -189,6 +192,9 @@ func (c *Client) GetTransactionDataByGateway(id string) (body []byte, err error)
189192
body, statusCode, err := c.httpGet(urlPath)
190193
switch statusCode {
191194
case 200:
195+
if len(body) == 0 {
196+
return c.DownloadChunkData(id)
197+
}
192198
return body, nil
193199
case 400:
194200
return c.DownloadChunkData(id)

client_broadcast.go

+7-16
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package goar
33
import (
44
"errors"
55
"fmt"
6-
7-
"github.com/everFinance/sandy_log/log"
86
)
97

108
func (c *Client) GetTxDataFromPeers(txId string) ([]byte, error) {
@@ -15,11 +13,12 @@ func (c *Client) GetTxDataFromPeers(txId string) ([]byte, error) {
1513

1614
for _, peer := range peers {
1715
pNode := NewClient("http://" + peer)
18-
data, err := pNode.GetTransactionData(txId)
16+
data, err := pNode.DownloadChunkData(txId)
1917
if err != nil {
20-
log.Error("get tx data failed", "error", err, "peer", peer)
18+
fmt.Printf("get tx data error:%v, peer: %s\n", err, peer)
2119
continue
2220
}
21+
fmt.Printf("success get tx data; peer: %s\n", peer)
2322
return data, nil
2423
}
2524

@@ -34,26 +33,18 @@ func (c *Client) BroadcastData(txId string, data []byte, numOfNodes int64) error
3433

3534
count := int64(0)
3635
for _, peer := range peers {
37-
3836
fmt.Printf("upload peer: %s, count: %d\n", peer, count)
3937
arNode := NewClient("http://" + peer)
4038
uploader, err := CreateUploader(arNode, txId, data)
4139
if err != nil {
4240
continue
4341
}
4442

45-
Loop:
46-
for !uploader.IsComplete() {
47-
if err := uploader.UploadChunk(); err != nil {
48-
break Loop
49-
}
50-
if uploader.LastResponseStatus != 200 {
51-
break Loop
52-
}
53-
}
54-
if uploader.IsComplete() { // upload success
55-
count++
43+
if err = uploader.Once(); err != nil {
44+
continue
5645
}
46+
47+
count++
5748
if count >= numOfNodes {
5849
return nil
5950
}

client_test.go

+26-21
Original file line numberDiff line numberDiff line change
@@ -201,25 +201,30 @@ func TestClient_GetPeers(t *testing.T) {
201201
t.Log(len(peers))
202202
}
203203

204-
// func Test_BroadcastData(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.BroadcastData(txId, data, 1)
216-
// assert.NoError(t, err)
217-
// }
204+
func Test_GetTxDataFromPeers(t *testing.T) {
205+
cli := NewClient("https://arweave.net")
206+
txId := "J5FY1Ovd6JJ49WFHfCf-1wDM1TbaPSdKnGIB_8ePErE"
207+
data, err := cli.GetTxDataFromPeers(txId)
218208

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-
// }
209+
assert.NoError(t, err)
210+
211+
assert.NoError(t, err)
212+
t.Log(len(data))
213+
214+
// verify data root
215+
chunks := utils.GenerateChunks(data)
216+
dataRoot := utils.Base64Encode(chunks.DataRoot)
217+
tx, err := cli.GetTransactionByID(txId)
218+
assert.NoError(t, err)
219+
assert.Equal(t, tx.DataRoot, dataRoot)
220+
}
221+
222+
func TestClient_BroadcastData(t *testing.T) {
223+
cli := NewClient("https://arweave.net")
224+
txId := "J5FY1Ovd6JJ49WFHfCf-1wDM1TbaPSdKnGIB_8ePErE"
225+
data, err := cli.GetTransactionData(txId, "json")
226+
assert.NoError(t, err)
227+
228+
err = cli.BroadcastData(txId, data, 20)
229+
assert.NoError(t, err)
230+
}

example/chunks_tx_test.go

+3-12
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,7 @@ func Test_PostBigDataByChunks(t *testing.T) {
8383
// uploader Transaction
8484
uploader, err := goar.CreateUploader(wallet.Client, tx, nil)
8585
assert.NoError(t, err)
86-
for !uploader.IsComplete() {
87-
err := uploader.UploadChunk()
88-
assert.NoError(t, err)
89-
}
86+
assert.NoError(t, uploader.Once())
9087
}
9188

9289
// test retry upload(断点重传) post big size data by tx id
@@ -127,10 +124,7 @@ func Test_RetryUploadDataByTxId(t *testing.T) {
127124
// get uploader by txId and post big data by chunks
128125
uploader, err := goar.CreateUploader(wallet.Client, tx.ID, bigData)
129126
assert.NoError(t, err)
130-
for !uploader.IsComplete() {
131-
err := uploader.UploadChunk()
132-
assert.NoError(t, err)
133-
}
127+
assert.NoError(t, uploader.Once())
134128
}
135129

136130
// test continue upload(断点续传) big size data by last time uploader
@@ -171,10 +165,7 @@ func Test_ContinueUploadDataByLastUploader(t *testing.T) {
171165
// new uploader object by last time uploader
172166
newUploader, err := goar.CreateUploader(wallet.Client, lastUploader.FormatSerializedUploader(), bigData)
173167
assert.NoError(t, err)
174-
for !newUploader.IsComplete() {
175-
err := newUploader.UploadChunk()
176-
assert.NoError(t, err)
177-
}
168+
assert.NoError(t, newUploader.Once())
178169

179170
// end remove jsonUploaderFile.json file
180171
_ = os.Remove("./jsonUploaderFile.json")

uploader.go

+14
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,20 @@ func CreateUploader(api *Client, upload interface{}, data []byte) (*TransactionU
108108
return uploader, err
109109
}
110110

111+
func (tt *TransactionUploader) Once() (err error) {
112+
for !tt.IsComplete() {
113+
if err = tt.UploadChunk(); err != nil {
114+
return
115+
}
116+
117+
if tt.LastResponseStatus != 200 {
118+
return
119+
}
120+
}
121+
122+
return
123+
}
124+
111125
func (tt *TransactionUploader) IsComplete() bool {
112126
tChunks := tt.Transaction.Chunks
113127
if tChunks == nil {

wallet.go

+1-6
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,6 @@ func (w *Wallet) SendTransaction(tx *types.Transaction) (id string, err error) {
143143
if err != nil {
144144
return
145145
}
146-
for !uploader.IsComplete() {
147-
err = uploader.UploadChunk()
148-
if err != nil {
149-
return
150-
}
151-
}
146+
err = uploader.Once()
152147
return
153148
}

wallet_test.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,18 @@ func TestWallet_SendAR(t *testing.T) {
6464
// test send small size file
6565
func TestWallet_SendDataSpeedUp01(t *testing.T) {
6666
// arNode := "https://arweave.net"
67-
// w, err := NewWalletFromPath("../example/testKey.json", arNode) // your wallet private key
67+
// w, err := NewWalletFromPath("./example/testKey.json", arNode) // your wallet private key
6868
// assert.NoError(t, err)
6969
//
70-
// data := []byte("aaa this is a goar test small size file data") // small file
70+
// // data := []byte("aaa this is a goar test small size file data") // small file
71+
// data := make([]byte, 255*1024)
72+
// for i := 0; i < len(data); i++ {
73+
// data[i] = byte('b' + i)
74+
// }
7175
// tags := []types.Tag{
7276
// {Name: "GOAR", Value: "SMDT"},
7377
// }
74-
// id, err := w.SendDataSpeedUp(data, tags, 0)
78+
// id, err := w.SendDataSpeedUp(data, tags, 50)
7579
// assert.NoError(t, err)
7680
// t.Logf("tx hash: %s", id)
7781
}

0 commit comments

Comments
 (0)