-
Notifications
You must be signed in to change notification settings - Fork 1
/
zTypes.go
194 lines (175 loc) · 5.74 KB
/
zTypes.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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
package zTypes
import (
"encoding/json"
"io/ioutil"
)
type BlockMetric struct {
Height int `json:"height"`
NumberofTransactions int `json:"number_of_transactions"`
SaplingValuePool float64 `json:"sapling_value_pool"`
SproutValuePool float64 `json:"sprout_value_pool"`
Size int `json:"size"`
Time int64 `json:"time"`
NumberofTransparent int `json:"number_of_transparent_transactions"`
NumberofShielded int `json:"number_of_shielded_transactions"`
NumberofMixed int `json:"number_of_mixed_transactions"`
}
// GetBlockchainInfo return the zcashd rpc `getblockchaininfo` status
// https://zcash-rpc.github.io/getblockchaininfo.html
type GetBlockchainInfo struct {
Chain string `json:"chain"`
Blocks int `json:"blocks"`
Headers int `json:"headers"`
BestBlockhash string `json:"bestblockhash"`
Difficulty float64 `json:"difficulty"`
VerificationProgress float64 `json:"verificationprogress"`
SizeOnDisk float64 `json:"size_on_disk"`
SoftForks []SoftFork `json:"softforks"`
}
type SoftFork struct {
ID string `json:"id"`
Version int `json:"version"`
}
type Block struct {
Hash string `json:"hash"`
Confirmations int `json:"confirmations"`
Size int `json:"size"`
Height int `json:"height"`
Version int `json:"version"`
//MerkleRoot string `json:"merkleroot"`
//FinalSaplingRoot string `json:"finalsaplingroot"`
TX []Transaction `json:"tx"`
Time int64 `json:"time"`
//Nonce string `json:"nonce"`
Difficulty float64 `json:"difficulty"`
PreviousBlockHash string `json:"previousblockhash"`
NextBlockHash string `json:"nextblockhash"`
ValuePools []ValuePool `json:"valuePools"`
}
func (b Block) TransactionTypes() (tTXs, sTXs int) {
for _, tx := range b.TX {
// If all 3 fields are empty, the transaction is transparent
if len(tx.VJoinSplit) > 0 ||
len(tx.VShieldedOutput) > 0 ||
len(tx.VShieldedSpend) > 0 {
tTXs++
} else {
// Otherwise, it's a shielded transaction
sTXs++
}
}
return tTXs, sTXs
}
func (b Block) WritetoFile(blockFile string) error {
blockJSON, err := json.MarshalIndent(b, "", " ")
if err != nil {
return err
}
return ioutil.WriteFile(blockFile, blockJSON, 0644)
}
func (b Block) SaplingValuePool() float64 {
for _, pool := range b.ValuePools {
if pool.ID == "sapling" {
return pool.ChainValue
}
}
return 0
}
func (b Block) SproutValuePool() float64 {
for _, pool := range b.ValuePools {
if pool.ID == "sprout" {
return pool.ChainValue
}
}
return 0
}
func (b Block) NumberofTransactions() int {
return len(b.TX)
}
type ValuePool struct {
ID string `json:"id"`
Monitored bool `json:"monitored"`
ChainValue float64 `json:"chainValue"`
ChainValueZat float64 `json:"chainValueZat"`
ValueDelta float64 `json:"valueDelta"`
ValueDeltaZat float64 `json:"valueDeltaZat"`
}
type Transaction struct {
Hex string `json:"hex"`
Txid string `json:"txid"`
Version int `json:"version"`
Locktime int `json:"locktime"`
ExpiryHeight int `json:"expirtheight"`
VIn []VInTX `json:"vin"`
VOut []VOutTX `json:"vout"`
VJoinSplit []VJoinSplitTX `json:"vjoinsplit"`
ValueBalance float64 `json:"valueBalance"`
VShieldedSpend []map[string]interface{} `json:"vShieldedSpend"`
VShieldedOutput []map[string]interface{} `json:"vShieldedOutput"`
}
// TransparentInAndOut return if there are transparent
// inputs and outputs
func (t Transaction) TransparentInAndOut() bool {
return len(t.VIn) > 0 && len(t.VOut) > 0
}
// IsTransparent returns if the transaction contains
// no shielded addresses
func (t Transaction) IsTransparent() bool {
return t.TransparentInAndOut() &&
len(t.VJoinSplit) == 0 &&
t.ValueBalance == 0 &&
len(t.VShieldedSpend) == 0 &&
len(t.VShieldedSpend) == 0
}
// ContainsSprout returns if a transaction contains
// sprout transaction data
func (t Transaction) ContainsSprout() bool {
return len(t.VJoinSplit) > 0
}
// ContainsSapling returns if a transaction contains
// sapling transaction data
// Check that there is a valueBalance value (positive or negative)
// Check that there is data for either VShieldedSpend or VShieldedOutput
func (t Transaction) ContainsSapling() bool {
return t.ValueBalance != 0 && (len(t.VShieldedSpend) > 0 ||
len(t.VShieldedOutput) > 0)
}
// IsShielded returns if the transaction contains
// no transparent addresses
func (t Transaction) IsShielded() bool {
return !t.TransparentInAndOut() &&
(t.ContainsSprout() || t.ContainsSapling())
}
// IsMixed returns if the transaction contains
// transparent addresses and shielded transaction data
func (t Transaction) IsMixed() bool {
tInOrOut := len(t.VIn) > 0 || len(t.VOut) > 0
return tInOrOut &&
(t.ContainsSprout() || t.ContainsSapling())
}
type VInTX struct {
TxID string `json:"txid"`
VOut int `json:"vout"`
ScriptSig ScriptSig
Sequence int `json:"sequemce"`
}
type ScriptSig struct {
//Asm string `json:"asm"`
//Hex string `json:"hex"`
}
type VOutTX struct {
Value float64
N int
ScriptPubKey ScriptPubKey
}
type ScriptPubKey struct {
//Asm string `json:"asm"`
//Hex string `json:"hex"`
//ReqSigs int `json:"reqSigs`
Type string `json:"type"`
Addresses []string `json:"addresses"`
}
type VJoinSplitTX struct {
VPubOldld float64 `json:"vpub_old"`
VPubNew float64 `json:"vpub_new"`
}