Skip to content

Commit 0425679

Browse files
Merge pull request #27 from everFinance/pst
Pst
2 parents bb6c262 + caeb05e commit 0425679

16 files changed

+231
-44
lines changed

README.md

+34-1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ arClient := goar.NewClient("https://arweave.net", proxyUrl)
116116
- [x] CreateAndSignBundleItem
117117
- [x] SendBundleTxSpeedUp
118118
- [x] SendBundleTx
119+
- [x] SendPst
119120

120121
Initialize the instance, use a keyfile.json:
121122

@@ -324,7 +325,7 @@ bundle, err := utils.NewBundle(items...)
324325
#### Send Item to Bundler
325326
Bundler network provides guaranteed data seeding and instant data accessibility
326327
```go
327-
resp, err := w.Client.BatchSendItemToBundler(items)
328+
resp, err := w.Client.BatchSendItemToBundler(items,"") // The second parameter is the bundler gateway url,"" means use default url
328329
```
329330

330331
#### Send Bundle Tx
@@ -343,4 +344,36 @@ for _, item := range bundle.Items {
343344
assert.NoError(t, err)
344345
}
345346
```
347+
348+
### notice
349+
if you call `w.Client.BatchSendItemToBundler(items,"")`
350+
and return `panic: send to bundler request failed; http code: 402`
351+
means that you have to pay ar to the bundler service address
352+
must use item signature address to transfer funds
353+
354+
##### how to get bundler service address?
355+
```go
356+
curl --location --request GET 'https://node1.bundlr.network/info'
357+
358+
response:
359+
{
360+
"uptime": 275690.552536824,
361+
"address": "OXcT1sVRSA5eGwt2k6Yuz8-3e3g9WJi5uSE99CWqsBs",
362+
"gateway": "arweave.net"
363+
}
364+
```
365+
This "address" is the bundler service receive ar address.
366+
You need to transfer a certain amount of ar to this address
367+
and wait for 25 blocks to confirm the transaction before you can use the bundler service.
368+
369+
You can also use the following api to query the balance in the bundler service.
370+
```
371+
curl --location --request GET 'https://node1.bundlr.network/account/balance?address=Ii5wAMlLNz13n26nYY45mcZErwZLjICmYd46GZvn4ck'
372+
373+
response:
374+
{
375+
"balance": 1000000000
376+
}
377+
```
378+
346379
---

client.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"errors"
77
"fmt"
8+
"github.com/inconshreveable/log15"
89
"io/ioutil"
910
"math/big"
1011
"net/http"
@@ -13,12 +14,12 @@ import (
1314
"strconv"
1415
"strings"
1516

16-
"github.com/everFinance/sandy_log/log"
17-
1817
"github.com/everFinance/goar/types"
1918
"github.com/everFinance/goar/utils"
2019
)
2120

21+
var log = log15.New("module", "goar")
22+
2223
// arweave HTTP API: https://docs.arweave.org/developers/server/http-api
2324

2425
type Client struct {
@@ -33,7 +34,7 @@ func NewClient(nodeUrl string, proxyUrl ...string) *Client {
3334
pUrl := proxyUrl[0]
3435
proxyUrl, err := url.Parse(pUrl)
3536
if err != nil {
36-
log.Errorf("url parse error: %v", err)
37+
log.Error("url parse", "error", err)
3738
panic(err)
3839
}
3940
tr := &http.Transport{Proxy: http.ProxyURL(proxyUrl)}

client_broadcast.go

+54-15
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,36 @@ package goar
33
import (
44
"errors"
55
"fmt"
6+
"github.com/everFinance/goar/types"
67
)
78

9+
func (c *Client) BroadcastData(txId string, data []byte, numOfNodes int64) error {
10+
peers, err := c.GetPeers()
11+
if err != nil {
12+
return err
13+
}
14+
15+
count := int64(0)
16+
for _, peer := range peers {
17+
arNode := NewClient("http://" + peer)
18+
uploader, err := CreateUploader(arNode, txId, data)
19+
if err != nil {
20+
continue
21+
}
22+
23+
if err = uploader.Once(); err != nil {
24+
continue
25+
}
26+
27+
count++
28+
if count >= numOfNodes {
29+
return nil
30+
}
31+
}
32+
33+
return fmt.Errorf("upload tx data to peers failed, txId: %s", txId)
34+
}
35+
836
func (c *Client) GetTxDataFromPeers(txId string) ([]byte, error) {
937
peers, err := c.GetPeers()
1038
if err != nil {
@@ -15,40 +43,51 @@ func (c *Client) GetTxDataFromPeers(txId string) ([]byte, error) {
1543
pNode := NewClient("http://" + peer)
1644
data, err := pNode.DownloadChunkData(txId)
1745
if err != nil {
18-
fmt.Printf("get tx data error:%v, peer: %s\n", err, peer)
46+
log.Error("get tx data", "err", err, "peer", peer)
1947
continue
2048
}
21-
fmt.Printf("success get tx data; peer: %s\n", peer)
2249
return data, nil
2350
}
2451

2552
return nil, errors.New("get tx data from peers failed")
2653
}
2754

28-
func (c *Client) BroadcastData(txId string, data []byte, numOfNodes int64) error {
55+
func (c *Client) GetBlockFromPeers(height int64) (*types.Block, error) {
2956
peers, err := c.GetPeers()
3057
if err != nil {
31-
return err
58+
return nil, err
3259
}
3360

34-
count := int64(0)
3561
for _, peer := range peers {
36-
fmt.Printf("upload peer: %s, count: %d\n", peer, count)
37-
arNode := NewClient("http://" + peer)
38-
uploader, err := CreateUploader(arNode, txId, data)
62+
pNode := NewClient("http://" + peer)
63+
block, err := pNode.GetBlockByHeight(height)
3964
if err != nil {
65+
fmt.Printf("get block error:%v, peer: %s\n", err, peer)
4066
continue
4167
}
68+
fmt.Printf("success get block; peer: %s\n", peer)
69+
return block, nil
70+
}
4271

43-
if err = uploader.Once(); err != nil {
44-
continue
45-
}
72+
return nil, errors.New("get block from peers failed")
73+
}
4674

47-
count++
48-
if count >= numOfNodes {
49-
return nil
75+
func (c *Client) GetTxFromPeers(arId string) (*types.Transaction, error) {
76+
peers, err := c.GetPeers()
77+
if err != nil {
78+
return nil, err
79+
}
80+
81+
for _, peer := range peers {
82+
pNode := NewClient("http://" + peer)
83+
tx, err := pNode.GetTransactionByID(arId)
84+
if err != nil {
85+
fmt.Printf("get tx error:%v, peer: %s\n", err, peer)
86+
continue
5087
}
88+
fmt.Printf("success get tx; peer: %s\n", peer)
89+
return tx, nil
5190
}
5291

53-
return fmt.Errorf("upload tx data to peers failed, txId: %s", txId)
92+
return nil, errors.New("get tx from peers failed")
5493
}

client_bundle.go

+7-4
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ func (c *Client) GetBundle(arId string) (*types.Bundle, error) {
2020
}
2121

2222
// SendItemToBundler send bundle bundleItem to bundler gateway
23-
func (c *Client) SendItemToBundler(itemBinary []byte) (*types.BundlerResp, error) {
23+
func (c *Client) SendItemToBundler(itemBinary []byte, gateway string) (*types.BundlerResp, error) {
24+
if gateway == "" {
25+
gateway = types.BUNDLER_HOST
26+
}
2427
// post to bundler
25-
resp, err := http.DefaultClient.Post(types.BUNDLER_HOST+"/tx", "application/octet-stream", bytes.NewReader(itemBinary))
28+
resp, err := http.DefaultClient.Post(gateway+"/tx", "application/octet-stream", bytes.NewReader(itemBinary))
2629
if err != nil {
2730
return nil, err
2831
}
@@ -43,7 +46,7 @@ func (c *Client) SendItemToBundler(itemBinary []byte) (*types.BundlerResp, error
4346
return br, nil
4447
}
4548

46-
func (c *Client) BatchSendItemToBundler(bundleItems []types.BundleItem) ([]*types.BundlerResp, error) {
49+
func (c *Client) BatchSendItemToBundler(bundleItems []types.BundleItem, gateway string) ([]*types.BundlerResp, error) {
4750
respList := make([]*types.BundlerResp, 0, len(bundleItems))
4851
for _, item := range bundleItems {
4952
itemBinary := item.ItemBinary
@@ -53,7 +56,7 @@ func (c *Client) BatchSendItemToBundler(bundleItems []types.BundleItem) ([]*type
5356
}
5457
itemBinary = item.ItemBinary
5558
}
56-
resp, err := c.SendItemToBundler(itemBinary)
59+
resp, err := c.SendItemToBundler(itemBinary, gateway)
5760
if err != nil {
5861
return nil, err
5962
}

client_test.go

+18-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package goar
22

33
import (
4-
"testing"
5-
64
"github.com/everFinance/goar/utils"
75
"github.com/stretchr/testify/assert"
6+
"testing"
87
)
98

109
// import (
@@ -179,9 +178,9 @@ func TestClient_GetTransactionTags(t *testing.T) {
179178
func TestClient_GetBlockByHeight(t *testing.T) {
180179
arNode := "https://arweave.net"
181180
cli := NewClient(arNode)
182-
block, err := cli.GetBlockByHeight(737432)
181+
block, err := cli.GetBlockByHeight(793791)
183182
assert.NoError(t, err)
184-
assert.Equal(t, "7YeJpe53rFsEE03yKjGcBQAAw6efgVfSeGNLmPRGY4c", block.Nonce)
183+
assert.Equal(t, "ci2uJhYmdldgkHbScDClCwAA0eqn7dCduAEpLfRorSA", block.Nonce)
185184
}
186185

187186
func TestClient_GetTransactionDataByGateway(t *testing.T) {
@@ -228,3 +227,18 @@ func TestClient_BroadcastData(t *testing.T) {
228227
err = cli.BroadcastData(txId, data, 20)
229228
assert.NoError(t, err)
230229
}
230+
231+
func TestClient_GetBlockFromPeers(t *testing.T) {
232+
cli := NewClient("https://arweave.net")
233+
block, err := cli.GetBlockFromPeers(793755)
234+
assert.NoError(t, err)
235+
t.Log(block.Txs)
236+
}
237+
238+
func TestClient_GetTxFromPeers(t *testing.T) {
239+
cli := NewClient("https://arweave.net")
240+
arId := "kPKtoTyn-HVvLQ9ml12YLqrYbpbzVpp2wk_bqxUtXQs"
241+
tx, err := cli.GetTxFromPeers(arId)
242+
assert.NoError(t, err)
243+
t.Log(tx)
244+
}

example/bundle_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ func TestBundle_SendBundleTx(t *testing.T) {
4747

4848
// // send item to bundler gateway
4949
// for _, item := range items {
50-
// resp, err := w.Client.SendItemToBundler(item.ItemBinary)
50+
// resp, err := w.Client.SendItemToBundler(item.ItemBinary,"")
5151
// assert.NoError(t, err)
5252
// t.Log(resp.Id)
5353
// }
54-
resp, err := w.Client.BatchSendItemToBundler(items)
54+
resp, err := w.Client.BatchSendItemToBundler(items, "")
5555
assert.NoError(t, err)
5656
t.Log(resp)
5757

go.mod

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ go 1.15
44

55
require (
66
github.com/everFinance/gojwk v1.0.0
7-
github.com/everFinance/sandy_log v1.0.3
87
github.com/everFinance/ttcrsa v1.1.3
8+
github.com/go-stack/stack v1.8.1 // indirect
99
github.com/hamba/avro v1.5.6
10+
github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac
11+
github.com/mattn/go-colorable v0.1.11 // indirect
1012
github.com/shopspring/decimal v1.2.0
1113
github.com/stretchr/testify v1.7.0
1214
)

threshold.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"fmt"
1010
"time"
1111

12-
"github.com/everFinance/sandy_log/log"
1312
tcrsa "github.com/everFinance/ttcrsa"
1413
)
1514

@@ -28,10 +27,10 @@ func CreateTcKeyPair(bitSize, k, l int) (shares tcrsa.KeyShareList, meta *tcrsa.
2827
now := time.Now()
2928
keyShares, keyMeta, err := tcrsa.NewKey(bitSize, uint16(k), uint16(l), nil)
3029
if err != nil {
31-
log.Errorf("tcrsa newKey error; bitSize: %d, k: %d, l: %d; err: %v", bitSize, k, l, err)
30+
log.Error("tcrsa newKey", "err", err, "bitSize", bitSize, "k", k, "l", l)
3231
return nil, nil, err
3332
}
34-
log.Debugf("Create bit size = %d rsa threshold keyPair spend time: %s", bitSize, time.Since(now).String())
33+
log.Debug("Create rsa threshold keyPair success", "bitSize", bitSize, "spendTime", time.Since(now).String())
3534
return keyShares, keyMeta, nil
3635
}
3736

@@ -81,20 +80,20 @@ func (ts *TcSign) AssembleSigShares(signedShares tcrsa.SigShareList) ([]byte, er
8180
// verify each signer share
8281
for _, sd := range signedShares {
8382
if err := sd.Verify(ts.pssData, ts.keyMeta); err != nil {
84-
log.Errorf("verify signer %d sign failed; err: %v", sd.Id, err)
83+
log.Error("verify signer sign failed", "err", err, "signer", sd.Id)
8584
return nil, err
8685
}
8786
}
8887
signature, err := signedShares.Join(ts.pssData, ts.keyMeta)
8988
if err != nil {
90-
log.Errorf("signedShares.Join(signDataByPss, meta) error: %v", err)
89+
log.Error("signedShares.Join(signDataByPss, meta)", "err", err)
9190
return nil, err
9291
}
9392

9493
// verify
9594
signHashed := sha256.Sum256(ts.signData)
9695
if err := rsa.VerifyPSS(ts.keyMeta.PublicKey, crypto.SHA256, signHashed[:], signature, nil); err != nil {
97-
log.Errorf("verify signature error; %v", err)
96+
log.Error("verify signature", "err", err)
9897
return nil, err
9998
}
10099
return signature, nil

types/const.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,6 @@ var FATAL_CHUNK_UPLOAD_ERRORS = map[string]struct{}{
4545

4646
// about bundle
4747
const (
48-
BUNDLER_HOST = "http://bundler.arweave.net:10000"
48+
BUNDLER_HOST = "https://node1.bundlr.network"
4949
MIN_BUNDLE_BINARY_SIZE = 1044
5050
)

types/swc.go

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package types
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
)
7+
8+
type Input map[string]interface{}
9+
10+
func (i Input) ToString() (string, error) {
11+
bb, err := json.Marshal(i)
12+
if err != nil {
13+
fmt.Println(fmt.Errorf("json marshal input err: %v", err))
14+
return "", err
15+
}
16+
return string(bb), nil
17+
}

types/types.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type Block struct {
1717
PreviousBlock string `json:"previous_block"`
1818
Timestamp int64 `json:"timestamp"`
1919
LastRetarget int64 `json:"last_retarget"`
20-
Diff string `json:"diff"`
20+
Diff interface{} `json:"diff"`
2121
Height int64 `json:"height"`
2222
Hash string `json:"hash"`
2323
IndepHash string `json:"indep_hash"`

0 commit comments

Comments
 (0)