关键词:
Golang语言和区块链理论学习完毕后,快速入门方法无疑是项目实战。本文将参考https://jeiwan.cc/tags/blockchain/教程,学习如何基于Go语言构建区块链。
1、编程环境设置
编程工具使用GoLand,前文已介绍软件安装经验。软件安装完成后,还需要设置工作路径“GOPATH”。在电脑上新建一个空白目录,然后点击点击Goland菜单按钮:“File”->“Settings”->"GO"->"GOPATH",添加自己的工作目录即可,还可以根据自己的喜好,设置不同的代码呈现颜色、字体、字号等。
2、简化的block实现
block结构如下所示:
type Block struct
Timestamp int64
Data []byte
PrevBlockHash []byte
Hash []byte
Timestamp表示Block被创建的时间戳,Data表示block中实际的价值信息,PrevBlockHash表示上一个Block的hash值,Hash表示该block本身的Hash值。
现在,我们首先SetHash方法,将Block中的字段信息组合后,生成该block的SHA-256 Hash值:
// SetHash calculates and sets block hash func (b *Block) SetHash() timestamp := []byte(strconv.FormatInt(b.Timestamp, 10)) headers := bytes.Join([][]byteb.PrevBlockHash, b.Data, timestamp, []byte) hash := sha256.Sum256(headers) b.Hash = hash[:]
接下来,实现NewBlock方法用于创建一个Block:
// NewBlock creates and returns Block func NewBlock(data string, prevBlockHash []byte) *Block block := &Blocktime.Now().Unix(), []byte(data), prevBlockHash, []byte block.SetHash() return block
OK,block实现完成啦!
3、简化的blockchain实现
本质上,blockchain仅仅是具备某种特殊结构的数据库:有序,反向链接链表。这意味着,block按照插入的顺序存放,同时每个block都保存指向上一个block的链接。这种结构保证可以快速获取最新插入的block同时获取它的hash值。
Go语言中,可以通过slice和map来实现该结构。slice(有序)用于保存有序的hash值,map(无序)用于保存hash->block对。对于我们的blockchain原型,目前不需要根据hash值来获取block,因此仅仅使用slice即可满足需求。blockchain结构如下:
type Blockchain struct blocks []*Block
接下来,我们实现AddBlock方法,用于将block添加到blockchain中:
// AddBlock saves provided data as a block in the blockchain func (bc *Blockchain) AddBlock(data string) prevBlock := bc.blocks[len(bc.blocks)-1] newBlock := NewBlock(data, prevBlock.Hash) bc.blocks = append(bc.blocks, newBlock)
新增一个block的前提是另一个block已经存在,但是一开始blockchain中并没有任何block。因此,在任何blockchain中都必须有一个特殊的block存在,称之为GenesisBlock。下面实现NewGenesisBlock方法用于创建GenesisBlock:
func NewGenesisBlock() *Block return NewBlock("Genesis Block", []byte)
接下来,实现NewBlockchain方法,该方法会创建一个包含Genesis Block的blockchain:
func NewBlockchain() *Blockchain return &Blockchain[]*BlockNewGenesisBlock()
4、测试Blockchain是否可以正常工作
func main() bc := NewBlockchain() bc.AddBlock("Send 1 BTC to Ivan") bc.AddBlock("Send 2 more BTC to Ivan") for _, block := range bc.blocks fmt.Printf("Prev. hash: %x\n", block.PrevBlockHash) fmt.Printf("Data: %s\n", block.Data) fmt.Printf("Hash: %x\n", block.Hash) fmt.Println()
若直接选择RUN ‘go build main.go‘,会出现如下报错:
# command-line-arguments .\main.go:8:8: undefined: NewBlockchain Compilation finished with exit code 2
这是因为“block.go”和“blockchain.go”没有同时编译。选择整个项目“Blockchain”,选择Run ‘go build Blockchain‘即可成功,结果如下:
Prev. hash: Data: Genesis Block Hash: aa6085b7b44bcc1d878c6a28a3d98a665f8e1522da8093defee6a61e06aeac67 Prev. hash: aa6085b7b44bcc1d878c6a28a3d98a665f8e1522da8093defee6a61e06aeac67 Data: Send 1 BTC to Ivan Hash: 835c7514ce8b54b83add05c41977bf5f50dfec7791e12e6912feb1d9c286f7b4 Prev. hash: 835c7514ce8b54b83add05c41977bf5f50dfec7791e12e6912feb1d9c286f7b4 Data: Send 2 more BTC to Ivan Hash: cfbd89e2384d7caabc7ff58ed0a27a5172a18fc381b0b87d990e989d55b98ecd
Process finished with exit code 0
用go构建一个区块链--part7:网络(代码片段)
...单一节点上,有什么用呢?如果只有一个用户,那么这些基于密码学的特性,又有什么用呢?正是由于网络,才使得整个机 查看详情
go语言凭什么是区块链的首选语言(代码片段)
GO语言凭什么是区块链的首选语言区块链的火热也带动了GO语言开发者的突增,那凭什么GO语言会成为最主要的区块链构建语言之一。我认为这得益于GO语言的性能、抽象度、简单性和现代性。并且,当下最成功、最流行的... 查看详情
用go构建一个区块链--part6:交易(代码片段)
引言在这个系列文章的一开始,我们就提到了,区块链是一个分布式数据库。不过在之前的文章中,我们选择性地跳过了“分布式”这个部分,而是将注意力都放到了“数据库”部分。到目前为止,我们几乎已经实现了一个区块... 查看详情
区块链技术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构建一个区块链--part7:网络(代码片段)
...0c;进入src目录执行make即可。引言到目前为止,我们所构建的原型已经具备了区块链所有的关键特性:匿名& 查看详情
区块链技术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& 查看详情
[go]用go语言实现区块链工作原理(代码片段)
基本原理这里就不写了,只写一个简单demo的实现首先得有一个区块用来存储区块头和区块体typeBlockstructVersionint64PreBlockHash[]byteHash[]byte//区块体内是不存储HASH值的,这是网络中某个节点在计算时存储在息本地的,这里是为了方便... 查看详情
用go语言撸一个简易版的区块链(代码片段)
用go撸一个简易版的区块链引言这个最初的版本时多年以前学习go的时候,自己撸的一个简易版本的区块链。不过麻雀虽小,五脏俱全。通过这个代码你了解区块链内部的大概运行机制时没有问题的。比特币底层区块链的... 查看详情
用go语言撸一个简易版的区块链(代码片段)
用go撸一个简易版的区块链引言这个最初的版本时多年以前学习go的时候,自己撸的一个简易版本的区块链。不过麻雀虽小,五脏俱全。通过这个代码你了解区块链内部的大概运行机制时没有问题的。比特币底层区块链的... 查看详情
基于共识算法和区块链模拟实现超级账本(代码片段)
基于共识算法和区块链模拟实现超级账本实验语言: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... 查看详情
只用200行go代码写一个自己的区块链!(代码片段)
...想了解这一切是如何工作的。这篇文章就是帮助你使用Go语言来实现一个简单的区块链,用不到200行代码来揭示区块链的原理!高可用架构也会持续推出更多区块链方面文章,欢迎点击上方蓝色『高可用架构』关注。“用不到200... 查看详情
基于java语言构建区块链——基本原型
...事情,这样我们才能把握住这波时代趋势的红利。本文将基于Java语言构建简化版的blockchain,来实现数字货币。创建区块区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。 查看详情
用go构建一个区块链--part3:持久化和命令行接口(代码片段)
...进入src目录执行make即可。引言到目前为止,我们已经构建了一个有工作量证明机制的区块链。有了工作量证明ÿ 查看详情
cpp区块链模拟示例序列化(代码片段)
...币中是使用的是谷歌出品、c++编写的 LevelDB数据库,go语言示例中使用的是BoltDB。我本来考虑使 查看详情
用go构建一个区块链--part2:工作量证明(代码片段)
翻译的系列文章我已经放到了GitHub上:blockchain-tutorial,后续如有更新都会在GitHub上,可能就不在这里同步了。如果想直接运行代码,也可以cloneGitHub上的教程仓库,进入src目录执行make即可。在前面一文中,... 查看详情
基于java语言构建区块链——工作量证明
引言在上一篇文章中,我们实现了区块链最基本的数据结构模型,添加区块以及和前一个区块连接在一起。但是,我们的实现方式非常简单,而真实的比特币区块链中,每一个区块的添加都是需要经过大量的计算才可以完成,这... 查看详情
基于指针数组实现简单的区块链day(代码片段)
基于指针数组实现简单的区块链day(1)一、比特币的基础知识1.1比特币1.2区块1.3区块链1.4记账1.5钱包1.6节点1.7挖矿1.8出块时间1.9出块奖励1.10比特币总量1.11区块容量1.12每秒成交量1.13单位二、其他基础知识2.1挖矿(工作量... 查看详情
基于java语言构建区块链——持久化&命令行
引言上一篇文章我们实现了区块链的工作量证明机制(Pow),尽可能地实现了挖矿。但是距离真正的区块链应用还有很多重要的特性没有实现。今天我们来实现区块链数据的存储机制,将每次生成的区块链数据保存下来。有一点... 查看详情