Skip to content

Commit 869b305

Browse files
Merge pull request #34 from everFinance/add-signer
Add signer
2 parents 230cfa5 + 3fea5e2 commit 869b305

7 files changed

+133
-45
lines changed

README.md

+11-1
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,16 @@ proxyUrl := "http://127.0.0.1:8001"
131131
arWallet := NewWalletFromPath("./keyfile.json", "https://arweave.net", proxyUrl)
132132
```
133133

134+
#### Signer
135+
136+
- [x] SignTx
137+
- [x] SignMsg
138+
- [x] Owner
139+
140+
```golang
141+
signer := goar.NewSignerFromPath("./keyfile.json")
142+
```
143+
134144
#### Utils
135145

136146
Package for Arweave develop toolkit.
@@ -241,7 +251,7 @@ tx := &types.Transaction{
241251
tx.LastTx = anchor
242252
tx.Owner = utils.Base64Encode(w.PubKey.N.Bytes())
243253

244-
if err = utils.SignTransaction(tx, w.PubKey, w.PrvKey); err != nil {
254+
if err = utils.SignTransaction(tx, w.PubKey, w.Signer.PrvKey); err != nil {
245255
return
246256
}
247257

example/chunks_tx_test.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,14 @@ func assemblyDataTx(bigData []byte, wallet *goar.Wallet, tags []types.Tag) (*typ
5151
return nil, err
5252
}
5353
tx.LastTx = anchor
54-
tx.Owner = utils.Base64Encode(wallet.PubKey.N.Bytes())
54+
tx.Owner = wallet.Owner()
5555

5656
signData, err := utils.GetSignatureData(tx)
5757
if err != nil {
5858
return nil, err
5959
}
60-
sign, err := utils.Sign(signData, wallet.PrvKey)
60+
61+
sign, err := wallet.Signer.SignMsg(signData)
6162
if err != nil {
6263
return nil, err
6364
}
@@ -172,9 +173,9 @@ func Test_ContinueUploadDataByLastUploader(t *testing.T) {
172173
}
173174

174175
func Test_aa(t *testing.T) {
175-
t.Log("address: ", wallet.Address)
176+
t.Log("address: ", wallet.Signer.Address)
176177

177-
ownerBy := wallet.PubKey.N.Bytes()
178+
ownerBy := wallet.Signer.PubKey.N.Bytes()
178179
t.Log("length: ", len(ownerBy))
179180
owner := utils.Base64Encode(ownerBy)
180181
t.Log("owner:", owner)

signer.go

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package goar
2+
3+
import (
4+
"crypto/rsa"
5+
"crypto/sha256"
6+
"fmt"
7+
"github.com/everFinance/goar/types"
8+
"github.com/everFinance/goar/utils"
9+
"github.com/everFinance/gojwk"
10+
"io/ioutil"
11+
)
12+
13+
type Signer struct {
14+
Address string
15+
PubKey *rsa.PublicKey
16+
PrvKey *rsa.PrivateKey
17+
}
18+
19+
func NewSignerFromPath(path string) (*Signer, error) {
20+
b, err := ioutil.ReadFile(path)
21+
if err != nil {
22+
return nil, err
23+
}
24+
return NewSigner(b)
25+
}
26+
27+
func NewSigner(b []byte) (*Signer, error) {
28+
key, err := gojwk.Unmarshal(b)
29+
if err != nil {
30+
return nil, err
31+
}
32+
pubKey, err := key.DecodePublicKey()
33+
if err != nil {
34+
return nil, err
35+
}
36+
pub, ok := pubKey.(*rsa.PublicKey)
37+
if !ok {
38+
err = fmt.Errorf("pubKey type error")
39+
return nil, err
40+
}
41+
42+
prvKey, err := key.DecodePrivateKey()
43+
if err != nil {
44+
return nil, err
45+
}
46+
prv, ok := prvKey.(*rsa.PrivateKey)
47+
if !ok {
48+
err = fmt.Errorf("prvKey type error")
49+
return nil, err
50+
}
51+
addr := sha256.Sum256(pub.N.Bytes())
52+
return &Signer{
53+
Address: utils.Base64Encode(addr[:]),
54+
PubKey: pub,
55+
PrvKey: prv,
56+
}, nil
57+
}
58+
59+
func (s *Signer) SignTx(tx *types.Transaction) error {
60+
return utils.SignTransaction(tx, s.PrvKey)
61+
}
62+
63+
func (s *Signer) Owner() string {
64+
return utils.Base64Encode(s.PubKey.N.Bytes())
65+
}
66+
67+
func (s *Signer) SignMsg(msg []byte) ([]byte, error) {
68+
return utils.Sign(msg, s.PrvKey)
69+
}

signer_test.go

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package goar
2+
3+
import (
4+
"github.com/everFinance/goar/types"
5+
"github.com/everFinance/goar/utils"
6+
"github.com/stretchr/testify/assert"
7+
"testing"
8+
)
9+
10+
func TestNewSigner(t *testing.T) {
11+
signer, err := NewSignerFromPath("./example/testKey.json")
12+
assert.NoError(t, err)
13+
tags := []types.Tag{
14+
{Name: "GOAR", Value: "sendAR"},
15+
}
16+
tx := &types.Transaction{
17+
Format: 2,
18+
ID: "EyPNVxI-zv1WGjiMmeb20VimIGjfvnkFQtgVnlSMX1o",
19+
LastTx: "0cJJGyXdeIJ-azX3I-jJ3XJEIYti-_qjHZhaRsXQxi1D3wXQVv6Px5WQhj_j1W8O",
20+
Owner: "zu2HnkLgrxsqqtdOzsSx6qezj8ujqYzJCaz9r6XosF5oHRdyqyxZFmuFeQaWS9_8YP73XFDUn2FJRNMzd6lclbIlgfiorufLfa6ez_4Y3yMVfYC56anQs0f62TwfcMuQCfTnPyPDds3evODLLRyuwVqtfe6jLZZ4LGbcgXySi0Hn184VxOTkDzvYz3zWz0tqpXX2T8qNeELNHH-j6pXMH7LNzU2akZhZUeuxsstxyedaZOP_EUwx-BtooWXWcVNcjM_elMitgZelU60J012AdgUXuj9kULxT78_BSFhiD4vGn5ZN8V1lpB410wGqQNuiGZGjUrorY9zmm3IDIhywxJrzcaTshxPBb8-gw-38mCOTP0yp4URs4lae75fxrD-m4kXzKl27XZ10K21U47W0hdJI1s934MPpuLudyvlXbxkvm19LzZj9wkmqf08RqghMS5X_LVgAT0bs6UMnLoJcQFckBWpOVDVY-spkPqxBhEomhDD3C9xvXz5KqR8Q9kgjX6nSXyn5svAsGGviHBzU27FtR9L01q6QCeCUEehCG_n0eVM4IsHIySh7ZZk1sFjBvgEEXiEpxA-av5ob2nfcR93cWILlhmPs4wdfzi8Q52jM2hShZXTYGvAOEdXdZmBatoVgm9Sca6U-pffmFqYl2BM-Bq_OjBpDnGvvQBV_990",
21+
Tags: utils.TagsEncode(tags),
22+
Target: "cSYOy8-p1QFenktkDBFyRM3cwZSTrQ_J4EsELLho_UE",
23+
Quantity: "1000000000",
24+
Data: "",
25+
DataSize: "0",
26+
DataRoot: "",
27+
Reward: "747288",
28+
Signature: "",
29+
}
30+
err = signer.SignTx(tx)
31+
assert.NoError(t, err)
32+
33+
err = utils.VerifyTransaction(*tx)
34+
assert.NoError(t, err)
35+
}

wallet.go

+8-35
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package goar
22

33
import (
4-
"crypto/rsa"
5-
"crypto/sha256"
64
"errors"
75
"fmt"
86
"io/ioutil"
@@ -12,14 +10,11 @@ import (
1210

1311
"github.com/everFinance/goar/types"
1412
"github.com/everFinance/goar/utils"
15-
"github.com/everFinance/gojwk"
1613
)
1714

1815
type Wallet struct {
19-
Client *Client
20-
PubKey *rsa.PublicKey
21-
PrvKey *rsa.PrivateKey
22-
Address string
16+
Client *Client
17+
Signer *Signer
2318
}
2419

2520
// proxyUrl: option
@@ -33,43 +28,21 @@ func NewWalletFromPath(path string, clientUrl string, proxyUrl ...string) (*Wall
3328
}
3429

3530
func NewWallet(b []byte, clientUrl string, proxyUrl ...string) (w *Wallet, err error) {
36-
key, err := gojwk.Unmarshal(b)
31+
signer, err := NewSigner(b)
3732
if err != nil {
38-
return
39-
}
40-
41-
pubKey, err := key.DecodePublicKey()
42-
if err != nil {
43-
return
44-
}
45-
pub, ok := pubKey.(*rsa.PublicKey)
46-
if !ok {
47-
err = fmt.Errorf("pubKey type error")
48-
return
49-
}
50-
prvKey, err := key.DecodePrivateKey()
51-
if err != nil {
52-
return
53-
}
54-
prv, ok := prvKey.(*rsa.PrivateKey)
55-
if !ok {
56-
err = fmt.Errorf("prvKey type error")
57-
return
33+
return nil, err
5834
}
5935

60-
addr := sha256.Sum256(pub.N.Bytes())
6136
w = &Wallet{
62-
Client: NewClient(clientUrl, proxyUrl...),
63-
PubKey: pub,
64-
PrvKey: prv,
65-
Address: utils.Base64Encode(addr[:]),
37+
Client: NewClient(clientUrl, proxyUrl...),
38+
Signer: signer,
6639
}
6740

6841
return
6942
}
7043

7144
func (w *Wallet) Owner() string {
72-
return utils.Base64Encode(w.PubKey.N.Bytes())
45+
return w.Signer.Owner()
7346
}
7447

7548
func (w *Wallet) SendAR(amount *big.Float, target string, tags []types.Tag) (types.Transaction, error) {
@@ -136,7 +109,7 @@ func (w *Wallet) SendTransaction(tx *types.Transaction) (types.Transaction, erro
136109
}
137110
tx.LastTx = anchor
138111
tx.Owner = w.Owner()
139-
if err = utils.SignTransaction(tx, w.PrvKey); err != nil {
112+
if err = w.Signer.SignTx(tx); err != nil {
140113
return types.Transaction{}, err
141114
}
142115

wallet_bundle.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
func (w *Wallet) CreateAndSignBundleItem(data []byte, signatureType int, target string, anchor string, tags []types.Tag) (di types.BundleItem, err error) {
1212
bundleItem := utils.NewBundleItem(w.Owner(), strconv.Itoa(signatureType), target, anchor, data, tags)
1313
// sign
14-
err = utils.SignBundleItem(bundleItem, w.PrvKey)
14+
err = utils.SignBundleItem(bundleItem, w.Signer.PrvKey)
1515
if err != nil {
1616
return di, err
1717
}

wallet_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,22 @@ func init() {
3636
}
3737

3838
func TestPubKey(t *testing.T) {
39-
pubKey := testWallet.PubKey
39+
pubKey := testWallet.Signer.PubKey
4040
assert.Equal(t, "nQ9iy1fRM2xrgggjHhN1xZUnOkm9B4KFsJzH70v7uLMVyDqfyIJEVXeJ4Jhk_8KpjzYQ1kYfnCMjeXnhTUfY3PbeqY4PsK5nTje0uoOe1XGogeGAyKr6mVtKPhBku-aq1gz7LLRHndO2tvLRbLwX1931vNk94bSfJPYgMfU7OXxFXbTdKU38W6u9ShoaJGgUQI1GObd_sid1UVniCmu7P-99XPkixqyacsrkHzBajGz1S7jGmpQR669KWE9Z0unvH0KSHxAKoDD7Q7QZO7_4ujTBaIFwy_SJUxzVV8G33xvs7edmRdiqMdVK5W0LED9gbS4dv_aee9IxUJQqulSqZphPgShIiGNl9TcL5iUi9gc9cXR7ISyavos6VGiem_A-S-5f-_OKxoeZzvgAQda8sD6jtBTTuM5eLvgAbosbaSi7zFYCN7zeFdB72OfvCh72ZWSpBMH3dkdxsKCDmXUXvPdDLEnnRS87-MP5RV9Z6foq_YSEN5MFTMDdo4CpFGYl6mWTP6wUP8oM3Mpz3-_HotwSZEjASvWtiff2tc1fDHulVMYIutd52Fis_FKj6K1fzpiDYVA1W3cV4P28Q1-uF3CZ8nJEa5FXchB9lFrXB4HvsJVG6LPSt-y2R9parGi1_kEc6vOYIesKspgZ0hLyIKtqpTQFiPgKRlyUc-WEn5E", base64.RawURLEncoding.EncodeToString(pubKey.N.Bytes()))
4141
}
4242

4343
func TestAddress(t *testing.T) {
44-
addr := testWallet.Address
44+
addr := testWallet.Signer.Address
4545
assert.Equal(t, "eIgnDk4vSKPe0lYB6yhCHDV1dOw3JgYHGocfj7WGrjQ", addr)
4646
}
4747

4848
// test sand ar without data
4949
func TestWallet_SendAR(t *testing.T) {
5050
// arNode := "https://arweave.net"
51-
// w, err := NewWalletFromPath("../example/testKey.json", arNode) // your wallet private key
51+
// w, err := NewWalletFromPath("./example/testKey.json", arNode) // your wallet private key
5252
// assert.NoError(t, err)
5353
//
54-
// target := "Goueytjwney8mRqbWBwuxbk485svPUWxFQojteZpTx8"
54+
// target := "cSYOy8-p1QFenktkDBFyRM3cwZSTrQ_J4EsELLho_UE"
5555
// amount := big.NewFloat(0.001)
5656
// tags := []types.Tag{
5757
// {Name: "GOAR", Value: "sendAR"},

0 commit comments

Comments
 (0)