让我们从“ blockchain”中的“block”开始整个旅程。block存储价值信息,例如,比特币中的block存储交易信息。除此之外,block中包含一些其他信息,如版本、时间戳和上一个Block的hash值等

本文中,我们并不会按照比特币规范实现一个完整的blockchain,而是实现一个简化版本,仅仅包含一些重要的信息。block结构如下所示:

type Block struct {
    Timestamp     int64 
    Data          []byte
    PrevBlockHash []byte
    Hash          []byte
}

Timestamp表示Block被创建的时间戳,Data表示block中实际的价值信息,PrevBlockHash表示上一个Block的hash值,Hash表示该block本身的Hash值。比特币规范中,Timestamp、PrevBlockHash、Hash存储在独立的数据结构中,作为block的头信息;Data存储在另一个独立的数据结构种。本文中,我们将它们放在一个数据结构中,从而简化实现。

Hash值用于确保blockchain的安全。Hash计算是计算敏感的操作,即使在高性能电脑也需要花费一段时间来完成计算(这也就是为什么人们购买高性能GPU进行比特币挖矿的原因)。blockchain架构设计有意使Hash计算变得困难,这样做是为了加大新增一个block的难度,进而防止block在增加后被随意修改。

现在,我们首先SetHash方法,将Block中的字段信息组合后,生成该block的SHA-256 Hash值:

func (b *Block) SetHash() {
    timestamp := []byte(strconv.FormatInt(b.Timestamp, 10))
    headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{})
    hash := sha256.Sum256(headers)

    b.Hash = hash[:]
}

接下来,实现NewBlock方法用于创建一个Block:

func NewBlock(data string, prevBlockHash []byte) *Block {
    block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}}
    block.SetHash()
    return block
}

OK,block实现完成啦!

results matching ""

    No results matching ""