美文网首页
go 实现区块链 没有实现智能合约

go 实现区块链 没有实现智能合约

作者: a十二_4765 | 来源:发表于2018-05-21 18:38 被阅读20次

    package main

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

    /*
    区块链结构
    */
    type Block struct{
    Timestamp int64 // 时间戳
    Data []byte //当前区块 存放的信息 比如 比特币, 或者一些其他账单信息 用户行为
    PrevBlockHash []byte //上一个区块的 加密的Hash
    Hash []byte //当前区块的Hash
    }
    //Blocak 这个结构体 绑定的以恶搞方法
    func(this Block) SetHash(){
    // 将本区块的TimeStamp+Data+prevBlockHash --->Hash 进行加密
    //将时间戳 有整形转换成二进制
    timestamp :=[]byte(strconv.FormatInt(this.Timestamp,10))
    //将三个二进制的属性进行拼接
    headers := bytes.Join([][]byte{this.PrevBlockHash,this.Data,timestamp},[]byte{})
    //将拼接之后的headers 进行 SHA256加密
    hash :=sha256.Sum256(headers)
    this.Hash = hash[:]
    }
    /

    NewBlock 新建一个区块的API
    data 当前区块所保存的数据
    prevBlockHash 当前区块的前驱hash
    reutrns 新的区块结构体
    */
    func NewBlock(data string,prevBlockHash []byte) *Block{
    //生成一个区块
    block:=Block{}
    //给当前的区块 赋值 (创建时间,data,前驱hash)
    block.Timestamp = time.Now().Unix()
    block.Data = []byte(data)
    block.PrevBlockHash = prevBlockHash
    //给当前区块进行hash 加密
    block.SetHash() //能够将本block,进行一个hash加密,将hash加密的结构放在block.Hash 属性中
    //将已经赋值好的区块 返回给外边
    return &block

    }
    /*
    定义一个区块链的结构
    /
    type BlockChain struct{
    Blocks []
    Block // 有序的区块链
    }

    //将区块添加一个区块链中
    func (this *BlockChain) AddBlock(data string){
    //1.得到新添加区块的 前驱区块的 hash
    prevBlock :=this.Blocks[len(this.Blocks)-1]
    //2. 根据data 创建一个新的区块
    newBlock := NewBlock(data,prevBlock.Hash)
    //3 依照前驱区块和新区快 添加到区块链blocks中
    this.Blocks = append(this.Blocks,newBlock)
    }
    //区块链 = 创世块 -->区块-->区块
    //新建一个创世块
    func NewGenesisBlock() *Block {
    genesisBlock :=Block{}
    genesisBlock.Data = []byte("Genesis block")
    genesisBlock.PrevBlockHash = []byte{}
    return &genesisBlock
    }
    //新建一个区块链
    func NewBlockChain() BlockChain{
    return &BlockChain{[]
    Block{NewGenesisBlock()}}
    }
    func main(){
    //创建一个区块链 bc
    bc :=NewBlockChain()
    var cmd string
    for {
    fmt.Println("按 '1' 添加一条信息数据 到区块链中")
    fmt.Println("按 '2' 遍历当前的区块立链都有那些区块里信息")
    fmt.Println("按 其他按键就是退出")
    switch cmd {
    case "1":
    input :=make([]byte,1024)
    //添加一个区块
    fmt.Println("请输入区块里的行为数据(要添加保存的数据)")
    os.Stdin.Read(input)
    bc.AddBlock(string(input))
    case "2":
    //遍历整个区块链
    for i ,block :=range bc.Blocks {
    fmt.Println("======")
    fmt.Println("第", i, "个区块的信息:")
    fmt.Printf("PrevHash:%x\n", block.PrevBlockHash)
    fmt.Printf("Data:%s\n", block.Data)
    fmt.Printf("Hash:%x\n", block.Hash)
    }

        default:
            //退出程序
            fmt.Println("您已经退出")
            return
            }
        }
    }

    相关文章

      网友评论

          本文标题:go 实现区块链 没有实现智能合约

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