[go]用go语言实现区块链工作原理(代码片段)

baylorqu baylorqu     2023-01-06     285

关键词:

基本原理这里就不写了,只写一个简单demo的实现

首先得有一个区块用来存储区块头和区块体

type Block struct 
    Version      int64
    PreBlockHash []byte
    Hash         []byte //区块体内是不存储HASH值的,这是网络中某个节点在计算时存储在息本地的,这里是为了方便实现最终的功能做的
    TimeStamp    int64
    TargetBits   int64 //难度值
    Nonce int64
    MerkelRoot []byte
    Data []byte //区块体信息

还得有一个方法用于实现区块体

func NewBlock(data string, prevBlockHash []byte) *Block 
    //initial block data
    block := &Block
        Version:1,
        PreBlockHash:prevBlockHash,
        //Hash:[]
        TimeStamp:time.Now().Unix(),
        TargetBits:10,
        Nonce:5,
        MerkelRoot:[]byte,
        Data:[]byte(data),
    
    block.SetHash() //get block hash
    return block

那区块体的hash值计算就得使用另外一个方法来实现

func (block *Block)SetHash()  
    tmp := [][]byte
        IntToByte(block.Version),
        block.PreBlockHash,
        IntToByte(block.TimeStamp),
        block.MerkelRoot,
        IntToByte(block.Nonce),
        block.Data,
    
    data := bytes.Join(tmp, []byte)//join接收两个参数,第一个二维数组,第二个这里设置为空的连接符
    hash := sha256.Sum256(data)
    block.Hash = hash[:]

区块有了,那么得一个能实现把区块连接起来的文件,blockchain.go

package main

import "os"

type BlockChain struct 
    blocks []*Block


func NewBlockChain() *BlockChain 
    return &BlockChain[]*BlockNewGensisBlock() //添加了创世块


func (bc *BlockChain)AddBlock(data string)  
    if len(bc.blocks) <= 0
        os.Exit(1)
    
    lastBlock := bc.blocks[len(bc.blocks)-1] //还没取呢,如果取要取前一个块的HASH值,即取当前链最后一个块的HASH值
    prevBlockHash := lastBlock.Hash
    block := NewBlock(data, prevBlockHash)//取前一个块的hash值
    bc.blocks = append(bc.blocks, block)

上面两个文件涉及到的工具写在另外一个文件

package main

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

func IntToByte(num int64) []byte 
    var buffer bytes.Buffer
    err := binary.Write(&buffer, binary.BigEndian, num)//将int类型的num使用binary的方法传递到buffer里去
    CheckError(err)
    return buffer.Bytes()


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


func NewGensisBlock() *Block  //创建创世块
    return NewBlock("Gensis Block!", []byte)

最后主函数的实现

package main

import "fmt"

func main()  
    bc := BlockChain
    bc.AddBlock("班长转给老师一枚BTC")
    bc.AddBlock("班长又转给老师一枚BTC")
    for i, block := range bc.blocks //完成区块的遍历
        fmt.Println("============= block num : ", i)
        fmt.Println("Version", block.Version)
        fmt.Printf("PreBlockHash: %x
", block.PreBlockHash)
        fmt.Printf("Hash: %x
", block.Hash)
        fmt.Printf("TimeStamp: %x
", block.TimeStamp)
        fmt.Printf("Nonce: %x
", block.Nonce)
        fmt.Printf("MerkelRoot: %x
", block.MerkelRoot)
        fmt.Printf("Data: %s
", block.Data)
    

 

用go语言撸一个简易版的区块链(代码片段)

用go撸一个简易版的区块链引言这个最初的版本时多年以前学习go的时候,自己撸的一个简易版本的区块链。不过麻雀虽小,五脏俱全。通过这个代码你了解区块链内部的大概运行机制时没有问题的。比特币底层区块链的... 查看详情

用go语言撸一个简易版的区块链(代码片段)

用go撸一个简易版的区块链引言这个最初的版本时多年以前学习go的时候,自己撸的一个简易版本的区块链。不过麻雀虽小,五脏俱全。通过这个代码你了解区块链内部的大概运行机制时没有问题的。比特币底层区块链的... 查看详情

用go构建一个区块链--part7:网络(代码片段)

...热,使得加密货币成为可能的,是网络(network)。如果实现的这样一个区块链仅仅运行在单一节点上,有什么用呢?如果只有一个用户,那么这些基于密码学的特性,又有什么用呢?正是由于网络,才使得整个机 查看详情

用go构建一个区块链--part6:交易(代码片段)

...力都放到了“数据库”部分。到目前为止,我们几乎已经实现了一个区块链数据库的所有元素。今天,我们将会分析之前跳过的一些机制。而在下一篇文章中,我们将会开始讨论区块链的分布式特性。之前的系列文章:基本原型... 查看详情

基于go语言构建区块链:part1(代码片段)

Golang语言和区块链理论学习完毕后,快速入门方法无疑是项目实战。本文将参考https://jeiwan.cc/tags/blockchain/教程,学习如何基于Go语言构建区块链。1、编程环境设置编程工具使用GoLand,前文已介绍软件安装经验。软件安装完成后... 查看详情

用go语言撸一个简易版的区块链(代码片段)

用go撸一个简易版的区块链引言这个最初的版本时多年以前学习go的时候,自己撸的一个简易版本的区块链。不过麻雀虽小,五脏俱全。通过这个代码你了解区块链内部的大概运行机制时没有问题的。比特币底层区块链的... 查看详情

go语言凭什么是区块链的首选语言(代码片段)

GO语言凭什么是区块链的首选语言区块链的火热也带动了GO语言开发者的突增,那凭什么GO语言会成为最主要的区块链构建语言之一。我认为这得益于GO语言的性能、抽象度、简单性和现代性。并且,当下最成功、最流行的... 查看详情

用go构建一个区块链--part2:工作量证明(代码片段)

翻译的系列文章我已经放到了GitHub上:blockchain-tutorial,后续如有更新都会在GitHub上,可能就不在这里同步了。如果想直接运行代码,也可以cloneGitHub上的教程仓库,进入src目录执行make即可。在前面一文中,... 查看详情

区块链技术go语言——变量篇(代码片段)

/**@Author:mrtao*@Date:2018-08-1110:56:38*@LastModifiedby:mrtao*@LastModifiedtime:2018-08-1211:04:04*/packagemainimport"fmt"funcmain() varaint a=20 fmt.Println("a=& 查看详情

区块链技术go语言——数组篇(代码片段)

/**@Author:mrtao*@Date:2018-08-1414:48:25*@LastModifiedby:mrtao*@LastModifiedtime:2018-08-1415:55:51*/packagemainimport"fmt"funcmain() //指针 varp*int a:=10 p=&a //p& 查看详情

200行go代码实现自己的区块链——区块生成与网络通信(代码片段)

英文原版:https://medium.com/@mycoralhealth/code-your-own-blockchain-in-less-than-200-lines-of-go-e296282bcffc  原创 2018-02-09 CoralHealth 高可用架构在第一篇文章[1]中,我们向大家展示了如何通过精炼的Go代码实现一个简单的 查看详情

区块链基础语言——go语言工程管理

一、工作区‍在《Go语言开发环境搭建》中已经讲述了GOPATH的设置。GOPATH就是自定义的工作区目录,该目录包含3个子目录:src目录存放源代码(比如以.go、.c、.h、.s结尾的源代码文件)pkg目录存放编译后生成的文件,即由goinsta... 查看详情

cpp区块链模拟示例序列化(代码片段)

...币中是使用的是谷歌出品、c++编写的 LevelDB数据库,go语言示例中使用的是BoltDB。我本来考虑使 查看详情

200行go代码实现自己的区块链——区块生成与网络通信(代码片段)

...一篇文章[1]中,我们向大家展示了如何通过精炼的Go代码实现一个简单的区块链。如何计算每个块的Hash值,如何验证块数据,如何让块链接起来等等,但是所有这些都是跑在一个节点上的。文章发布后,读者反响热烈,纷纷留言... 查看详情

使用go语言编写区块链p2p网络(译)(代码片段)

外文发表日期:2018-04-14外文链接:https://medium.com/coinmonks/code-a-simple-p2p-blockchain-in-go-46662601f417在之前的文章中,我们已经知道了怎么编写PoW也知道了IPFS怎么工作,但是有一个致命的缺点,我们的服务都是中心化的&#x... 查看详情

用go构建一个区块链--part3:持久化和命令行接口(代码片段)

...目前为止,我们已经构建了一个有工作量证明机制的区块链。有了工作量证明ÿ 查看详情

基于共识算法和区块链模拟实现超级账本(代码片段)

基于共识算法和区块链模拟实现超级账本实验语言:GO实验环境:GoLand2022.1;go1.13.4.widows-amd64.msi;curl-7.83.1实验中使用的开源包:http://github.com/davecgh/go-spew/spew;http://github.com/gorilla/mux;http://github.com/joho... 查看详情

区块链基础语言——go语言结构(代码片段)

...序我们第一个Go程序以最简单的Helloworld作为开始。所有Go语言程序文件的文件名都以“.go”结尾,该程序可以命名为:helloWorld.go。二、程序结构分析Go语言程序一般由关键字、包、常量、变量、运算符、符号、类型和函数... 查看详情