美文网首页
区块链初探

区块链初探

作者: 拾丨玖 | 来源:发表于2018-12-21 11:13 被阅读27次

最近懒到不想写字

package block

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

// 区块结构
type Block struct {
    Timestamp     int64  // 时间戳
    Data          []byte // 当前区块 存放的信息
    PrevBlockHash []byte // 上一个区块的 加密hash
    Hash          []byte // 当前区块的Hash
}

// 计算hash值
func (self *Block) SetHash() {
    // 将本区块的timestamp, data, preBlockHash -----> hash
    timestamp := []byte(strconv.FormatInt(self.Timestamp, 10))
    // 拼接
    headers := bytes.Join([][]byte{self.PrevBlockHash, self.Data, timestamp}, []byte{})
    // SHA256加密
    hash := sha256.Sum256(headers)
    self.Hash = hash[:]
}

// 新建区块API
func NewBlock(data string, prevBlockHash []byte) *Block {
    // 生成一个区块
    block := Block{}
    block.Timestamp = time.Now().Unix()
    block.Data = []byte(data)
    block.PrevBlockHash = prevBlockHash
    block.SetHash()
    return &block
}

// 创建区块链结构体
type BlockChain struct {
    Blocks []*Block // 有序的区块链
}

// 将区块添加到区块链中
func (self *BlockChain) AddBlock(data string) {
    // 获得当前 前驱区块
    prevBlock := self.Blocks[len(self.Blocks)-1]
    // 创建新区块
    newBlock := NewBlock(data, prevBlock.Hash)
    // 添加到blocks
    self.Blocks = append(self.Blocks, newBlock)
}

// 区块链=创世块+区块。。。。。+区块

// 创建创世块
func NewGenesisBlock() *Block {
    genesisBlock := Block{}
    genesisBlock.Data = []byte("GenesisBlock")
    genesisBlock.PrevBlockHash = []byte{}
    return &genesisBlock
}

// 新建区块链
func NewBlockChain() *BlockChain {
    blockChain := BlockChain{}
    blockChain.Blocks = append(blockChain.Blocks, NewGenesisBlock())
    return &blockChain
}

package main

import (
    "block"
    "fmt"
    "os"
)

func main() {
    // 创建区块链
    bc := block.NewBlockChain()
    var cmd string
    for {
        fmt.Println("1: 添加")
        fmt.Println("2: 遍历")
        fmt.Println("3: 退出")
        fmt.Scanf("%s", &cmd)

        switch cmd {
        case "1":
            // 添加
            fmt.Println("输入数据")
            input := make([]byte, 1024)
            os.Stdin.Read(input)

            bc.AddBlock(string(input))

        case "2":
            // 遍历
            for i, value := range bc.Blocks {
                fmt.Println("+++++++++++++++++++")
                fmt.Println("第 ", i, "个 区块信息:")
                fmt.Printf("prevBlockHash: %x\n", value.PrevBlockHash)
                fmt.Printf("Data: %s\n", value.Data)
                fmt.Printf("Hash %x\n", value.Hash)
                fmt.Println("+++++++++++++++++++")
            }

        default:
            // 退出
            return
        }
    }
}

相关文章

  • 区块链现状

    我在之前的文章《区块链初探-综述》中有有过对区块链的一些探究。 区块链核心技术 区块链是指一种按照时间顺序将数据区...

  • 【译】区块链测试最佳实践

    作为一名QA,初探区块链,眼前全是未知,更何谈区块链质量保证,于是在google上找到了一篇关于区块链测试最佳实践...

  • 区块链初探

    区块链,一个最近很时髦的名词,也是最近非常热门的投资话题。很多人很容易把它混淆成比特币或者是其他的币种,其实不然。...

  • 区块链初探

    区块链 区块链分类 公有链:完全开放的区块链,是指任何人都可读取的、任何人都能发送交易且交易能获得有效确认的、全世...

  • 区块链初探

    最近懒到不想写字

  • 初探区块链

    在谈区块链之前,先谈谈比特币。 比特币的四重含义 1. 区块链技术的应用 比特币是世界上第一个区块链技术的应用,也...

  • 区块链的未来发展形势与对行业的影响(4)

    区块链技术对金融行业的影响初探 区块链技术是一种具备去中心化、高安全性、信用成本低、无法篡改和公开透明等特点的基于...

  • 【#4-宫泽俊】我的投资判断

    记得在去年的5、6 月份,因周围有朋友在推荐,所以初知区块链,但并不明白它的运行原理。而如今,作为一名刚初探区块链...

  • 区块链世界初探密

    区块链世界初探秘,今年是我的区块链投资元年,之前虽然也有经历过一些投资,但是都是些股票和基金之类的。而且根本就是瞎...

  • 区块链技术初探

    最近学习了几本区块链的书,总结记录一下自己的理解。 一、基本概念 1,区块链:一种分布式的数据链表结构,包含区块之...

网友评论

      本文标题:区块链初探

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