[学习笔记]Merkle Tree go语言实现

梅克尔树的结构比较简单,其设计思想比较巧妙,它是SPV实现的关键。
梅克尔树是二叉树,节点存储哈希指针,叶子节点保存数据。

  1. Merkle Tree节点结构体
type MerkleNode struct {
    Left *MerkleNode
    Right *MerkleNode
    Data []byte
}
  1. 创建Merkle Tree节点
func NewMerkleNode(left,right *MerkleNode, data []byte) *MerkleNode {
    mNode := MerkleNode{}

    if left == nil && right == nil {
        hash := sha256.Sum256(data)
        mNode.Data = hash[:]
    }else {
        prevHashes := append(left.Data,right.Data...)
        hash := sha256.Sum256(prevHashes)
        mNode.Data = hash[:]
    }

    mNode.Left = left
    mNode.Right = right

    return &mNode
}
  1. 构建Merkle Tree
func NewMerkleTree(data [][]byte) *MerkleTree  {
    var nodes []MerkleNode

    if len(data) % 2 != 0 {
        data = append(data, data[len(data) - 1])
    }

    for _, dataitem := range data {
        node := NewMerkleNode(nil, nil, dataitem)
        nodes = append(nodes, *node)        
    }

    for i := 0; i<len(data)/2; i++ {
        var newNodes []MerkleNode

        for j := 0; j < len(nodes); j += 2 {
            node := NewMerkleNode(&nodes[j], &nodes[j+1], nil)
            newNodes = append(newNodes , *node)
        }

        nodes = newNodes 
    }

    mTree := MerkleTree{&nodes[0]}

    return &mTree
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的...
    dtdh阅读 1,057评论 2 3
  • 在完全失重的太空里才知道惯性的可怕,一次错手而过,可能就意味着永远的飘流。电影的开头写实的可怕,没有Bepop,没...
    彭小乖阅读 582评论 0 1
  • 我在神和基督耶穌並蒙揀選的天使面前囑咐你:要遵守這些話,不可存成見,行事也不可有偏心。 在判斷事情時,要檢視自己的...
    YNC再寫一篇阅读 445评论 0 0
  • 一天小鸭子去公园散步,忽然掉进了一个坑里。同时小猫咪和小兔子也在公园里散步。他们看到了小鸭子掉进了坑里。他们想了一...
    淇淇小裙子阅读 226评论 0 0