/
base_node.go
119 lines (97 loc) · 2.34 KB
/
base_node.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
package base
import (
"github.com/pkg/errors"
"github.com/spikeekips/mitum/util"
"github.com/spikeekips/mitum/util/encoder"
"github.com/spikeekips/mitum/util/hint"
)
type BaseNode struct {
util.IsValider
addr Address
pub Publickey
hint.BaseHinter
}
func NewBaseNode(ht hint.Hint, pub Publickey, addr Address) BaseNode {
return BaseNode{
BaseHinter: hint.NewBaseHinter(ht),
addr: addr,
pub: pub,
}
}
func (n BaseNode) IsValid([]byte) error {
if err := util.CheckIsValiders(nil, false, n.addr, n.pub); err != nil {
return errors.Wrap(err, "invalid RemoteNode")
}
return nil
}
func (n BaseNode) Address() Address {
return n.addr
}
func (n BaseNode) Publickey() Publickey {
return n.pub
}
func (n BaseNode) HashBytes() []byte {
return util.ConcatByters(n.addr, n.pub)
}
type BaseNodeJSONMarshaler struct {
Address Address `json:"address"`
Publickey Publickey `json:"publickey"`
}
func (n BaseNode) MarshalJSON() ([]byte, error) {
return util.MarshalJSON(struct {
BaseNodeJSONMarshaler
hint.BaseHinter
}{
BaseHinter: n.BaseHinter,
BaseNodeJSONMarshaler: BaseNodeJSONMarshaler{
Address: n.addr,
Publickey: n.pub,
},
})
}
type BaseNodeJSONUnmarshaler struct {
Address string `json:"address"`
Publickey string `json:"publickey"`
}
func (n *BaseNode) DecodeJSON(b []byte, enc encoder.Encoder) error {
e := util.StringError("decode BaseNode")
var u BaseNodeJSONUnmarshaler
if err := enc.Unmarshal(b, &u); err != nil {
return e.Wrap(err)
}
switch i, err := DecodeAddress(u.Address, enc); {
case err != nil:
return e.WithMessage(err, "decode node address")
default:
n.addr = i
}
switch i, err := DecodePublickeyFromString(u.Publickey, enc); {
case err != nil:
return e.WithMessage(err, "node publickey")
default:
n.pub = i
}
return nil
}
type BaseLocalNode struct {
priv Privatekey
BaseNode
}
func NewBaseLocalNode(ht hint.Hint, priv Privatekey, addr Address) BaseLocalNode {
return BaseLocalNode{
BaseNode: NewBaseNode(ht, priv.Publickey(), addr),
priv: priv,
}
}
func (n BaseLocalNode) IsValid([]byte) error {
if err := util.CheckIsValiders(nil, false, n.BaseNode, n.priv); err != nil {
return errors.Wrap(err, "invalid LocalNode")
}
return nil
}
func (n BaseLocalNode) Privatekey() Privatekey {
return n.priv
}
func (n BaseLocalNode) Base() BaseNode {
return n.BaseNode
}