关键词:
基本原理这里就不写了,只写一个简单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怎么工作,但是有一个致命的缺点,我们的服务都是中心化的... 查看详情
用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语言程序一般由关键字、包、常量、变量、运算符、符号、类型和函数... 查看详情