1.区块的创建

2018-07-03  本文已影响0人  J_zhe

前言:写这个教程的目的就是希望解开区块链底层的神秘面纱。本文建立在对区块链有一定了解,并且默认你会Go语言,文中将不会讲解代码的目录结构(最下方有源码地址),笔者会将比较难理解的地方抽丝剥茧出来讲解。


创建一个简单的区块

type Block struct {
    Height    int64  //区块的高度(编号)
    Data      []byte  //交易数据
    Timestamp int64 //时间戳
    PrevHash  []byte //上一个区块的哈希
    Hash      []byte //哈希
}

func NewBlock(height int64, data []byte, prev []byte) *Block {
    block := &Block{
        height,
        data,
        time.Now().Unix(),
        prev,
        nil,
        0,
    }
    block.Hash = block.SetHash() //区块的哈希由一系列属性计算得来
    return block
}

//生成Hash的函数
func (blc *Block) SetHash() []byte {
    heightBytes := Int64ToBytes(blc.Height)
    timeBytes := []byte( strconv.FormatInt(blc.Timestamp, 2) )

    buff := [][]byte{
        heightBytes,
        blc.Data,
        timeBytes,
        blc.PrevHash,
    }

    buffRes := bytes.Join(buff, []byte{})
    hash := sha256.Sum256(buffRes)
    return hash[:]
}

//int64转[]byte
func Int64ToBytes(i int64) []byte {
    var buf = make([]byte, 8)
    binary.BigEndian.PutUint64(buf, uint64(i))
    return buf
}

运行结果

区块的高度:1
交易数据:create block
时间戳:%!d(string=2018-07-05 05:49:40 PM)
上一个区块的哈希:00000000
Hash:71de577f0e69665b95edbbf16a6d8d43bdbe20a7f5edf89f61f1de4fb13b30b4

上面就是一个很简单的区块创建过程,是不是很简单呢?为了让这个教程做的简单。我们到此为止,下一节将讲解如何创建区块链并创建创世区块

源码:https://gitee.com/itgjz/blockchain_learn/tree/master/block_chain_learn1

上一篇下一篇

猜你喜欢

热点阅读