-
Notifications
You must be signed in to change notification settings - Fork 6
/
satoshi.go
85 lines (76 loc) · 1.57 KB
/
satoshi.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
package fields
import (
"bytes"
"fmt"
)
// 比特币一亿分之一
type Satoshi = VarUint8
func (elm Satoshi) GetSatoshiVariation() SatoshiVariation {
if elm == 0 {
return NewEmptySatoshiVariation()
}
return SatoshiVariation{
NotEmpty: CreateBool(true),
ValueSAT: elm,
}
}
type SatoshiVariation struct {
NotEmpty Bool
ValueSAT Satoshi
}
func NewEmptySatoshiVariation() SatoshiVariation {
return SatoshiVariation{
NotEmpty: CreateBool(false),
ValueSAT: 0,
}
}
func NewSatoshiVariation(sats uint64) SatoshiVariation {
if sats == 0 {
return NewEmptySatoshiVariation()
}
return SatoshiVariation{
NotEmpty: CreateBool(true),
ValueSAT: Satoshi(sats),
}
}
func (elm SatoshiVariation) Size() uint32 {
if elm.NotEmpty.Check() {
return 1 + 8
} else {
return 1
}
}
func (elm SatoshiVariation) Serialize() ([]byte, error) {
var buf = bytes.NewBuffer(nil)
bt1, _ := elm.NotEmpty.Serialize()
buf.Write(bt1)
if elm.NotEmpty.Check() {
bt2, _ := elm.ValueSAT.Serialize()
buf.Write(bt2)
}
return buf.Bytes(), nil
}
func (elm *SatoshiVariation) Parse(buf []byte, seek uint32) (uint32, error) {
var e error = nil
if seek >= uint32(len(buf)) {
return 0, fmt.Errorf("[SatoshiVariation.Parse] seek out of buf len.")
}
seek, e = elm.NotEmpty.Parse(buf, seek)
if e != nil {
return 0, e
}
if elm.NotEmpty.Check() {
seek, e = elm.ValueSAT.Parse(buf, seek)
if e != nil {
return 0, e
}
}
return seek, nil
}
// Get true value
func (elm *SatoshiVariation) GetRealSatoshi() Satoshi {
if elm.NotEmpty.Check() {
return elm.ValueSAT
}
return Satoshi(0)
}