A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wuqiong 金牌黑马   /  2018-7-6 09:18  /  1537 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wuqiong 于 2018-7-6 10:01 编辑

最早由李笑来处了解到。
中文翻译文字部分看这里:
https://zhuanlan.zhihu.com/p/29971930

学好Go语言走遍天下都不怕。以下代码建立了一个非常原始的电子账本:

package main


import (

    "bytes"

    "crypto/sha256"

    "fmt"

    "strconv"

    "time"

)


type Block struct {

    Timestamp     int64

    Data          []byte

    PrevBlockHash []byte

    Hash          []byte

}


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 NewBlock(data string, prevBlockHash []byte) *Block {

    block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}}

    block.SetHash()

    return block

}


type Blockchain struct {

    blocks []*Block

}


/*

    添加 区块

*/


func (bc *Blockchain) AddBlock(data string) {

    prevBlock := bc.blocks[len(bc.blocks)-1]

    newBlock := NewBlock(data, prevBlock.Hash)

    bc.blocks = append(bc.blocks, newBlock)

}


func NewGenesisBlock() *Block {

    return NewBlock("Genesis Block创始块", []byte{})

}


/*

    用创始块创建一个区块链的函数

*/

func NewBlockchain() *Blockchain {

    return &Blockchain{[]*Block{NewGenesisBlock()}} /*我不太理解这种语法,层层深入?*/

}


func main() {

    /*

       初始化

    */

    bc := NewBlockchain()


    /*

       添加记录

    */

    bc.AddBlock("Send 1 BTC TO L")

    bc.AddBlock("Send 2 BTC to R")


    /*

      查看我们最终存储结果

    */

    for _, block := range bc.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()

    }

}

4 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马