cranberry

Форк
0
48 строк · 1.1 Кб
1
package merkle
2

3
import (
4
	"crypto/sha256"
5
	"encoding/hex"
6

7
	pbapi "gitverse.ru/IvanTimofeev/cranberry/pkg/grpc"
8
	utility "gitverse.ru/IvanTimofeev/cranberry/pkg/utility"
9
)
10

11
type node struct {
12
	Left  *node
13
	Right *node
14
	Hash  []byte
15
}
16

17
func MerkleRoot(txcs []*pbapi.TxContainer) string {
18
	if txcs == nil || len(txcs) == 0 {
19
		return ""
20
	}
21
	return hex.EncodeToString(buildMerkleTree(txcs).Hash)
22
}
23

24
func buildMerkleTree(txcs []*pbapi.TxContainer) *node {
25
	var nodes []*node
26
	for _, txc := range txcs {
27
		hash := sha256.Sum256(utility.TxToBytes(txc.Tx))
28
		nodes = append(nodes, &node{Hash: hash[:]})
29
	}
30

31
	for len(nodes) > 1 {
32
		var newLevel []*node
33
		for i := 0; i < len(nodes); i += 2 {
34
			if len(nodes) > i+1 {
35
				combined := make([]byte, len(nodes[i].Hash)+len(nodes[i+1].Hash))
36
				copy(combined, nodes[i].Hash)
37
				copy(combined[len(nodes[i].Hash):], nodes[i+1].Hash)
38
				newHash := sha256.Sum256(combined)
39
				newnode := &node{Left: nodes[i], Right: nodes[i+1], Hash: newHash[:]}
40
				newLevel = append(newLevel, newnode)
41
			} else {
42
				newLevel = append(newLevel, nodes[i])
43
			}
44
		}
45
		nodes = newLevel
46
	}
47
	return nodes[0]
48
}
49

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.