golang-区块链学习01

embedsky · · 1105 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言

区块链技术现在也是IT界的网红了,做点技术学习,不搞点跟区块链沾边的都好意思出去跟别人打招呼了。现在学习go语言刚好也蹭一波区块链的热度。

概要

golang知识点:
1、golang结构体使用
2、常用api使用,如bytes.Join、sha256.sum256、strconv.FormatInt等等,学习数组、切片的应用
区块链简化说明:
1、简化的区块对象Block包含四个成员,TimeStamp(时间戳)、PreBlockHash(上一个区块的哈希值)、Data(存储的数据内容)、Hash(自己区块的哈希值)
2、简化的区块链对象,包含一个区块想的数组Blocks

编码模拟区块链的构造创建

1、创建一个golang工程项目,目录结构如下:
目录结构

说明:
bin目录存放编译生成的可执行文件
src-coin存放main.go
src-core存放block.go与blockChian.go

2、block.go
package core

import (
    "time"
    "strconv"
    "bytes"
    "crypto/sha256"
)

type Block struct {
    TimeStamp     int64//时间戳
    Data          []byte//存储的数据信息
    PrevBlockHash []byte// 上一个区块的hash
    Hash          []byte//本区块的hash
}

// 创建一个新的区块
func NewBlock(data string, prevBlockHash []byte) *Block {
        // 新建一个区块,自己hash值为空
    block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}}
      // 计算自己区块的hash值
    block.SetHash()
    return block
}


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

// 模拟创世区块
func NewGenesisBlock() *Block {
    return NewBlock("Genesis Block", []byte{})
}
3、blockchain.go
package core

type BlockChain struct {
    Blocks []*Block
}

// 添加区块到链上
func (bc *BlockChain) AddBlock(data string) {
    preBlock := bc.Blocks[len(bc.Blocks)-1]// 获取前一个区块
    newBlock := NewBlock(data, preBlock.Hash)//创建新区块
    bc.Blocks = append(bc.Blocks, newBlock)// 链接新区块到链上
}
// 创建区块链
func NewBlockChain() *BlockChain {
    return &BlockChain{[]*Block{NewGenesisBlock()}}
}
4、main.go测试
package main

import (
    "core"
    "fmt"
)

func main() {

    bc := core.NewBlockChain()//创建区块链
    bc.AddBlock("send 1 btc to Ivan")// 添加一个区块到连上
    bc.AddBlock("send 2 btc to Ivan")

// 测试打印区块链上的信息
    for _, block := range bc.Blocks {
        fmt.Printf("PrevBlockHash:%x\n", block.PrevBlockHash)
        fmt.Printf("Data:%s\n", block.Data)
        fmt.Printf("Hash:%x\n", block.Hash)
        fmt.Printf("TimeStamp:%d\n", block.TimeStamp)
        println()
    }
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:embedsky

查看原文:golang-区块链学习01

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1105 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传