-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.go
136 lines (107 loc) · 5.64 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package chain
import (
"context"
"fmt"
"io/ioutil"
"path/filepath"
"strings"
"github.com/SummerCash/go-summercash/common"
chainProto "github.com/SummerCash/go-summercash/intrnl/rpc/proto/chain"
"github.com/SummerCash/go-summercash/types"
)
// Server - RPC server
type Server struct{}
// GetBalance - chain.GetBalance RPC handler
func (server *Server) GetBalance(ctx context.Context, req *chainProto.GeneralRequest) (*chainProto.GeneralResponse, error) {
address, err := common.StringToAddress(req.Address) // Get address primitive value
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
chain, err := types.ReadChainFromMemory(address) // Read chain from persistent memory
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
balance := chain.CalculateBalance() // Get balance
return &chainProto.GeneralResponse{Message: fmt.Sprintf("\nbalance: %f", balance)}, nil // Return response
}
// Bytes - chain.Bytes RPC handler
func (server *Server) Bytes(ctx context.Context, req *chainProto.GeneralRequest) (*chainProto.GeneralResponse, error) {
address, err := common.StringToAddress(req.Address) // Get address primitive value
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
chain, err := types.ReadChainFromMemory(address) // Read chain from persistent memory
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
hex, err := common.EncodeString(chain.Bytes()) // Encode chain byte value
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
return &chainProto.GeneralResponse{Message: fmt.Sprintf("\n%s", hex)}, nil // Return response
}
// String - chain.String RPC handler
func (server *Server) String(ctx context.Context, req *chainProto.GeneralRequest) (*chainProto.GeneralResponse, error) {
address, err := common.StringToAddress(req.Address) // Get address primitive value
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
chain, err := types.ReadChainFromMemory(address) // Read chain from persistent memory
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
return &chainProto.GeneralResponse{Message: fmt.Sprintf("\n%s", chain.String())}, nil // Return response
}
// ReadChainFromMemory - chain.ReadChainFromMemory RPC handler
func (server *Server) ReadChainFromMemory(ctx context.Context, req *chainProto.GeneralRequest) (*chainProto.GeneralResponse, error) {
address, err := common.StringToAddress(req.Address) // Get address primitive value
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
chain, err := types.ReadChainFromMemory(address) // Read chain from persistent memory
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
return &chainProto.GeneralResponse{Message: fmt.Sprintf("\n%s", chain.String())}, nil // Return response
}
// QueryTransaction - chain.QueryTransaction RPC handler
func (server *Server) QueryTransaction(ctx context.Context, req *chainProto.GeneralRequest) (*chainProto.GeneralResponse, error) {
files, err := ioutil.ReadDir(filepath.FromSlash(fmt.Sprintf("%s/db/chain", common.DataDir))) // Walk chain dir
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
hash, err := common.StringToHash(req.Address) // Get hash value
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
for _, file := range files { // Iterate through files
address, err := common.StringToAddress(strings.Split(strings.Split(file.Name(), "chain_")[1], ".json")[0]) // Get address value
if err == nil { // Check for success
chain, err := types.ReadChainFromMemory(address) // Read chain
if err == nil { // Check successfully read
transaction, err := chain.QueryTransaction(hash) // Query for transaction
if err != nil { // Check for errors
continue
}
return &chainProto.GeneralResponse{Message: fmt.Sprintf("\n%s", transaction.String())}, nil // Return response
}
}
}
return &chainProto.GeneralResponse{}, types.ErrNilTransaction // Return error
}
// GetNumTransactions - get total number of transactions in given account chain
func (server *Server) GetNumTransactions(ctx context.Context, req *chainProto.GeneralRequest) (*chainProto.GeneralResponse, error) {
address, err := common.StringToAddress(req.Address) // Get address primitive value
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
chain, err := types.ReadChainFromMemory(address) // Read chain from persistent memory
if err != nil { // Check for errors
return &chainProto.GeneralResponse{}, err // Return found error
}
numTx := 0 // Init counter
for range chain.Transactions { // Iterate through transactions
numTx++ // Increment
}
return &chainProto.GeneralResponse{Message: fmt.Sprintf("\n%d", numTx)}, nil // Return response
}