美文网首页
打造公链(1)

打造公链(1)

作者: 中小本的葱 | 来源:发表于2018-06-07 10:45 被阅读0次

区块

一个包含最关键信息的简化版本的区块,其数据结构在go语言定义如下:

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

我们先不管复杂的区块头是如何定义的,Hash字段是如何计算的呢?

Hash = SHA256(PrevBlockHash + Timestamp + Data)

区块链

区块链就是将区块有序链起来,然后通过区块的hash能快速检索到一个块。

为了实现链起区块和检索区块的功能,在go语言里,用一个array和map的数据结构就能解决问题。

type Blockchain struct {
    blocks []*Block
}

简单的版本一初现雏形

区块链原型:一个数组存了一些有序的区块,每一个区块都跟前一个区块相关联,这里加入新的区块是很容易的,但真实的区块链要复杂多,
需要工作量证明(PoW),当然本质上是一个共识机制,就是一个节点添加区块,需要获得其他节点的认同,从而形成的一个共识(consensus)。

main.go

package main
    
    import (
        "time"
        "strconv"
        "bytes"
        "crypto/sha256"
        "fmt"
    )
    
    type Block struct {
        Timestamp   int64
        PrevBlockHash   []byte
        Hash    []byte
        Data    []byte
    }
    
    type BlockChain struct {
        blocks []*Block
    }
    
    func NewBlock(data string,prevBlockHash []byte) *Block{
        block := &Block{
            Timestamp:time.Now().Unix(),
            PrevBlockHash:prevBlockHash,
            Hash:[]byte{},
            Data:[]byte(data)}
        block.SetHash()
        return block
    }
    
    // Hash = sha256(PrevBlockHash + Data + Timestamp)
    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[:]
    }
    
    func NewGenesisBlock() *Block{
        return NewBlock("Genesis Block",[]byte{})
    }
    
    // 创建一个有创世块的链
    func NewBlockChain() *BlockChain{
        return &BlockChain{[]*Block{NewGenesisBlock()}}
    }
    
    func (blockchain *BlockChain) AddBlock(data string){
        prevBlock := blockchain.blocks[len(blockchain.blocks)-1]
        newBlock := NewBlock(data,prevBlock.Hash)
        blockchain.blocks = append(blockchain.blocks,newBlock)
    }
    
    func main() {
        blockchain := NewBlockChain()
        blockchain.AddBlock("Send 1 BTC to Silver")
        blockchain.AddBlock("send 2 BTC to Silver again")
        for _,block := range blockchain.blocks{
            fmt.Printf("Prev hash: %x\n",block.PrevBlockHash)
            fmt.Printf("Data: %s\n", block.Data)
            fmt.Printf("Hash: %x\n", block.Hash)
            fmt.Println()
        }
    }

相关文章

  • 打造公链(1)

    区块 一个包含最关键信息的简化版本的区块,其数据结构在go语言定义如下: 我们先不管复杂的区块头是如何定义的,Ha...

  • 打造公链-造轮子(1)

    区块 首先来一个简化版本的区块,仅仅包含最关键的信息,其数据结构在go语言定义如下: 我们先不管复杂的区块头是如何...

  • 国金公链-百问百答

    国金公链是什么? 国金公链是国家打造的第一条公链,为的是给未来企业链改打基础,以后企业上链就是上国金公链。 ...

  • 「GOC我们一直努力从未停下脚步」简述怎样参与GOC公链社区治理

    一、什么是GOC GOC是社群式发布的公链项目,志在探索全新的区块链治理模式,打造公链标杆。 公链这么多,它有什么...

  • 【SKM周报】20180910 项目汇报

    1. Skrumble Eco-Fund (SEF) 正式成立 SEF旨在为其公链生态相关区块链项目赋能,从而打造...

  • 明星项目DMTC 9大优势

    ​1、DMTC背景: 由2017年涨幅高达150倍的明星公链沃尔顿链WTC倾力打造的子链项目,耗时1年时间,沉淀了...

  • 打造公链(3)

    持久化和命令行接口 已经构建出一个PoW机制的区块链,但区块链的数据需要持久化到一个数据库,还需要提供一个简单的命...

  • 打造公链(2)

    工作量证明(Proof-of-Work) 要往区块链中写入一个新的区块,需要获得大部分节点的认同,也就是要取得共识...

  • 跨链实力派PalletOne —— 要做区块链世界的IP协议

    1.项目介绍和愿景 PalletOne致力于打造成为一条高性能公链跨链共载体,实现区块链应用与底层链的解耦,链链互...

  • VNT,云象区块链打造的国产公链

    VNT,云象区块链打造的国产公链 VNT最大亮点,是其身后的云象区块链。 2018年1月22日下午,在清华大学举行...

网友评论

      本文标题:打造公链(1)

      本文链接:https://www.haomeiwen.com/subject/gzpbsftx.html