-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathblock.go
70 lines (59 loc) · 1.73 KB
/
block.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
package ncoin_wallet
import (
"fmt"
"encoding/json"
"encoding/hex"
"github.com/NeironTeam/ncoin/internal"
)
// private Block struct
type block struct {
Timestamp string `json:"timestamp"`
Transactions []Transaction `json:"transactions"`
PrevHash string `json:"prevHash"`
Fee float64 `json:"fee"`
MerkelRoot string `json:"merkleRoot"`
HashTrList []string `json:"HashTrList"`
}
func (b *block) Stringify() (s string) {
for _, transaction := range b.Transactions {
s = fmt.Sprintf("%s%s", s, transaction.Stringify())
}
s = fmt.Sprintf("%s%s%s%f%s", b.Timestamp, s, b.PrevHash, b.Fee, b.MerkelRoot)
return
}
func (b block) ToJson() ([]byte, error) {
return json.Marshal(b)
}
func BlockFromJson(r []byte) (b block, e error) {
e = json.Unmarshal(r, &b)
return
}
func (b *block) CalculateHash() string {
return hex.EncodeToString(internal.CalculateGenericHash(b.Stringify()))
}
func (b *block) CheckHash(inputHash string) bool {
return b.CalculateHash() == inputHash
}
func (b *block) CalculateMerkleTree() {
for _, transaction := range b.Transactions {
b.HashTrList = append(b.HashTrList, transaction.CalculateHash())
}
b.MerkelRoot = CalculateMerkleRoot(b.HashTrList)
return
}
func CalculateMerkleRoot(hashList []string) (root string) {
if len(hashList) == 1 {
return hashList[0]
}
var newLevel []string = make([]string, 0)
var pos int = 0;
for pos < len(hashList) {
if pos+1 == len(hashList){
newLevel = append(newLevel, hex.EncodeToString(internal.CalculateGenericHash(hashList[pos]+hashList[pos+1])))
} else {
newLevel = append(newLevel, hex.EncodeToString(internal.CalculateGenericHash(hashList[pos]+hashList[pos])))
}
}
CalculateMerkleRoot(newLevel)
return
}