黑马程序员技术交流社区

标题: 【上海校区】用Go语言打造区块链[1] [打印本页]

作者: wuqiong    时间: 2018-7-6 09:18
标题: 【上海校区】用Go语言打造区块链[1]
本帖最后由 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()

    }

}


作者: wuqiong    时间: 2018-7-12 15:53

作者: 吴琼老师    时间: 2018-7-12 16:47

作者: 不二晨    时间: 2018-7-12 16:58

作者: 摩西摩西OvO    时间: 2018-7-26 10:40





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2