创建区块链之v1

下面简单的描述区块链的实现:

block.go

package main

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

//定义块结构
type Block struct{
    Version int64
    PrevBlockHash []byte
    Hash []byte
    TimeStamp int64
    TargetBits  int64
    Nonce int64
    MerKelRoot []byte

    Data []byte
}

//设定创建块的方法
func NewBlock(data string, prevBlockHash []byte) *Block{
    block := &Block{
        Version:1,
        PrevBlockHash:prevBlockHash,
        //Hash:
        TimeStamp:time.Now().Unix(),
        TargetBits:10,
        Nonce:5,
        MerKelRoot:[]byte{},
        Data:[]byte(data),
    }
    block.SetHash() //设置区块的哈希值
    return block
}

// 添加哈希值
func (block *Block)SetHash(){
    tmp := [][]byte{
        //实现int类型转换为byte类型的工具函数
        IntToByte(block.Version),
        block.PrevBlockHash,
        IntToByte(block.TimeStamp),
        block.MerKelRoot,
        IntToByte(block.Nonce),
        block.Data,
    }
    //将区块的各个字段链接成一个切片,使用【】byte{}进行链接,目的是避免污染源区块的信息
    data := bytes.Join(tmp,[]byte{})

    //对区块进行sha256哈希算法,返回值为[32]byte数组,不是切片
    hash := sha256.Sum256(data)
    block.Hash = hash[:]//由数组转换为切片
}

// 创世块的创建,它的钱一个去魁岸的哈希值为空
func NewGenesisBlock() *Block{
    return NewBlock("Genesis Block!",[]byte{})
}

blockchain.go

package main

import "os"

//定义区块链条
type  BlockChain struct{
    blocks []*Block
}

// 创建区块链,并且添加创世块
func NewBlockChain() *BlockChain{
    return &BlockChain{[]*Block{
        NewGenesisBlock(),
    }}
}

//添加区块
func (bc *BlockChain)AddBlock(data string){
    //简单校验
    if len(bc.blocks) <= 0 {
        os.Exit(1)
    }

    //根据上一区块,创建新的区块
    lastblock := bc.blocks[len(bc.blocks)-1]
    prevBlockHash := lastblock.Hash
    block := NewBlock(data, prevBlockHash)

    //添加到区块链当中
    bc.blocks = append(bc.blocks, block)
}

utils

package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
    "os"
)

func IntToByte(num int64)[]byte{
    var buffer  bytes.Buffer
    err := binary.Write(&buffer, binary.BigEndian, num)
    //if err != nil{
    //  fmt.Println("IntToByte err occur:",err)
    //  os.Exit(1)
    //}
    CheckErr(err)
    return buffer.Bytes()
}

func CheckErr(err error){
    if err != nil{
        fmt.Println("err occur:",err)
        os.Exit(1)
    }
}

main.go

package main

import "fmt"

func main(){
    bc := NewBlockChain()
    bc.AddBlock("班长转给老师一枚比特币")
    bc.AddBlock("班长又转给老师一枚比特币")

    for i, block := range bc.blocks{
        fmt.Println("====block num:", i)
        fmt.Printf("Data:%s\n", block.Data)
        fmt.Println("Version:",block.Version)

        fmt.Printf("PrevHash:%x\n",block.Version)
        fmt.Printf("Hash:%x\n",block.TimeStamp)
        fmt.Printf("TimeStamp:%d\n",block.TimeStamp)
        fmt.Printf("MerKel:%x\n",block.MerKelRoot)
        fmt.Printf("Nonce:%d\n",block.Nonce)

    }

}

最后,在gopath路径下,编译运行查看效果。

原文地址:http://blog.51cto.com/13914991/2308615

时间: 2024-10-07 22:12:41

创建区块链之v1的相关文章

SpringBoot区块链之以太坊区块高度扫描(简洁版)

继续昨天的demo往下写写:[SpringBoot区块链之以太坊开发(整合Web3j)](https://juejin.im/post/5d88e6c1518825094f69e887),将复杂的逻辑都去除了,留下最简单区块高度扫描部分代码,这样更好让开发者上手 首先自定义个区块高度处理线程类 ``` package com.xiaobin.ethdemo.component; import org.springframework.beans.factory.annotation.Autowir

用Python从零开始创建区块链

本文主要内容翻译自Learn Blockchains by Building One本文原始链接,转载请注明出处.作者认为最快的学习区块链的方式是自己创建一个,本文就跟随作者用Python来创建一个区块链. 对数字货币的崛起感到新奇的我们,并且想知道其背后的技术--区块链是怎样实现的. 但是完全搞懂区块链并非易事,我喜欢在实践中学习,通过写代码来学习技术会掌握得更牢固.通过构建一个区块链可以加深对区块链的理解. 准备工作 本文要求读者对Python有基本的理解,能读写基本的Python,并且需要

贵阳、杭州、成都争相“上链”抢先机,谁是未来的“区块链之都”?

这两天区块链成了两会热议的话题,从商界大佬到政府官员,纷纷发表自己对区块链的看法. 昨天,成都市政协委员梁刚就建议,应该将成都应打造为中国的区块链技术中心,助推新经济发展.虽然国家在政策层面尚未出台正式的区块链政策法规,但从当前的情况来看,区块链的发展,正从商业层面向政府层面推进.城市"上链"正成为一种共识. 一.各城市为什么都抢着"上链"? 各城市争相"上链",有区块链火爆的因素,不过更重要的是城市"上链"确实能为城市发展注

第三章 自己动手写区块链之交易

概览 非对称加密和签名 私钥和公钥 交易概览 交易outputs 交易inputs 交易数据结构 交易id 交易签名 未消费的交易outputs 未消费交易outputs清单更新 交易有效性验证 原始交易 测试体验 小结 概览 本章我们将引入加密货币中的交易机制.有了交易这个机制之后,我们的区块链将会从一个只有基本功能的区块链华丽转身成一个加密货币系统. 最终我们就能通过指定目标用户的地址,和对应的用户进行加密货币交易. 当然,交易之前你必须能证明你是该货币的持有者. 为了达到这个目标,我们还需

区块链之智能合约 solidity踩坑 --上篇

概述 最近在写合约时遇到一些坑,做一下总结: 介绍主要分一下三个方面: 对区块链的简单描述 结合业务场景,编写简单智能合约,时遇到的坑(上篇) assembly 的使用说明(下篇) 正文 进入正题之前,我稍微简单介绍一下什么是区块链,区块链干嘛用的(特点),智能合约是做什么的,为什么要写只能合约(一下是个人理解仅供参考) 什么是区块链 A blockchain is a globally shared, transactional database. 译文:区块链是一个全局共享的事物数据库:(就

区块链软件公司:沃尔玛的区块链之路

2018年是区块链应用爆发的元年,许许多多或有用或没用的区块链应用竞相上线,基础显得尤为重要,沃尔玛最近又添一项区块链专利,在区块链的道路上又迈出了一大步. 沃尔玛是一家美国的世界性连锁零售商企业,也是世界上雇员最多的企业,位于世界500强的榜首,旗下有8500家门店,分布于全球15个国家.就是这么一个公司,上一年在区块链领域做出了许多尝试. 首先,我们都知道在医疗领域,最重要的资源就是医疗数据了,患者医疗数据的存储安全问题一直是重中之重,可能医疗数据的质量问题会影响一个人的生命安全.在2016

深入学习区块链之前不要贸然挖矿

深入学习之前不要贸然挖矿 哈耶克在<货币的非国家化>中描述过现在数字货币的场景:应当允许多种货币共同竞争,不同的铸币者会竞相让自己的货币拥有最优良属性,他们的激励就是为了获得铸币收入.比特币做为一种等价物,抑或大宗商品,矿业耗损了大量的电力资源,硬件.软件工程师.人力物力的投入都是巨大的,为了维护底层区块链技术的稳定,矿工们做了大量的区块打包工作.了解比特币矿业? 是,在矿业发展的这几年,比特币挖矿带来的高额利润和回报是商人逐利的天性.但最初呢?许多创始人也经常讲,创业,莫要失掉本心.今天我就

区块链之初识区块链

大家下午好,这里是链客区块链技术问答社区,给大家讲一讲刚接触区块链的萌新需要了解什么. 首先得明白几个概念:区块链,比特币,中心化,去中心化,挖矿 区块链和比特币 区块链是啥呢?区块链和比特币有啥关系呢? 比特币是区块链,但区块链不是比特币.区块链是一种技术,比特币是其的一种体现形式,除了比特币,还有好多类似的币.区块链这种技术与普通技术的区别有啥区别呢?就是普通的技术会把一个文件存放在一台电脑上,高级点的技术会放在服务器上,而区块链会把一个文件存储在所有终端电脑上,每台电脑上都有这个文件,但是

从零开始创建自己的区块链应用(JAVA版)

阅读对象 本文阅读对象,主要是希望和即将从事区块链开发的项目架构师,开发工程师,项目设计或产品设计师.要求阅读者具备一定的"区块链"基础知识.概念和以及相关的技术知识. 如果你只需要对区块链应用做一个更深更直观的了解,通过本文的例子更清晰了解区块链是怎么回事,大概是怎么开发出来的,怎么使用,那么知道一些区块链相关知识即可. 如果你是一个想从事这方面工作的人,尤其是从事开发和架构的技术人员,那么需要的技术知识就相当的多了,无法一一列举,大概一个高级网络开发工程师和中级以上的架构师水平,是