基于Go语言构建区块链:part1

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([][]byte{b.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 := &Block{time.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{[]*Block{NewGenesisBlock()}}
}

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
 

原文地址:https://www.cnblogs.com/yxdz-hit/p/8516555.html

时间: 2024-10-07 23:44:08

基于Go语言构建区块链:part1的相关文章

基于Java语言构建区块链(一)—— 基本原型

引言 区块链技术是一项比人工智能更具革命性的技术,人工智能只是提高了人类的生产力,而区块链则将改变人类社会的生产关系,它将会颠覆我们人类社会现有的协作方式.了解和掌握区块链相关知识和技术,是我们每位开发人员必须要去做的事情,这样我们才能把握住这波时代趋势的红利. 本文将基于Java语言构建简化版的blockchain,来实现数字货币. 创建区块区块链是由包含交易信息的区块从后向前有序链接起来的数据结构.区块被从后向前有序地链接在这个链条里,每个区块都指向前一个区块.以比特币为例,每个区块主要包含

基于Java语言构建区块链(三)—— 持久化 & 命令行

引言上一篇 文章我们实现了区块链的工作量证明机制(Pow),尽可能地实现了挖矿.但是距离真正的区块链应用还有很多重要的特性没有实现.今天我们来实现区块链数据的存储机制,将每次生成的区块链数据保存下来.有一点需要注意,区块链本质上是一款分布式的数据库,我们这里不实现"分布式",只聚焦于数据存储部分. 给大家推荐一个java内部学习群:725633148,进群找管理免费领取学习资料和视频.没有错就是免费领取!大佬小白都欢迎,大家一起学习共同进步! 数据库选择 到目前为止,我们的实现机制中还

001/Go语言构建区块链(mooc)

1.区块链发展与现状 视频地址:https://www.imooc.com/video/17452 注意: 比特币与以太坊最大的区别在于: 以太坊引入了对图灵完美智能合约的支持,人们可以将任何业务逻辑以合约的形式写入区块链,在以太坊前,发行自己的数字货币,就需要搭建一个独立的区块链网络. 比较稳定,被拿来研究的区块链系统: [1].超级账本 本身不是一个完整的区块链系统,而是方便企业搭建自己的区块链框架.各个组件,如数据存储,共识算法等,都可以灵活替换与组装.对智能合约也有很好的支持. 因此常被

为什么要用golang语言进行区块链编程开发?

Go语言现在常常被用来做去中心化系统(decentralised system).其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地. 我们在决定做Karachain的时候,考量(benchmark)了C,C++, Java, 甚至NodeJs,我们也试着用一些算法来作为考量标准.而现在,我表示我们正在用Go来实现此目标,并且感觉不错. 啊,现在建造一个区块链,恰如当时建造一个操作系统! 我们在建造像区块链平台这样复杂的东西时,把注意力放在了那些核心问题上.经过差不

Go语言与区块链——阶段性学习建议

2019年Go语言与区块链 链接: https://pan.baidu.com/s/1rtstZKws3t9L8bcFZmUd3Q 提取码: gx1r 阶段一:区块链主流语言:Go语言开发实战 本阶段需要掌握Linux和Windows双系统开发环境,建立面向对象思维,能对问题进行抽象归类.掌握基础的并发理论. 主要内容包括有:Go语言介绍及开发环境搭.基础类型.运算符.流程控制.函数.工程管理.复合类型.面向对象编程.异常处理.文本文件处理.案例:开发实战. 阶段二:区块链后端技术体系:Go语言

为什么要使用智能合约来构建区块链应用程序?

为什么要使用智能合约来构建区块链应用程序? 人们需要了解为什么以及何时使用智能合约来开发区块链应用程序. 区块链技术最关键的特征之一就是它的去中心化性质.这意味着其信息由网络的所有各方共享.因此,它消除了中间人或中间机构来促进运营的需要.此功能特别有用,因为它可以避免黑客和欺诈活动的可能性.区块链技术提供了功能丰富.快速.廉价和高效的交易模式.因此,政府和银行部门中的大多数组织已开始采用这种一流的技术. 以下将探讨智能合约在市场上创建区块链应用的重要性和需求. 什么是智能合约? 智能合约是一种计

教你如何做好区块链钱包|构建“区块链Token闭环体系”形成钱包应用的整体生态

本文由区块链交易系统开发|v:ruiec1688 编辑,需商业使用/合作请与作者联系,作者个人主页http://yy.ruiec.com/ 如需转载请注明出处点开这篇文章的朋友,都是对区块链有基认知的朋友,那你们应该了解"货币"的属性中有两点十分重要:"流通属性"及"时间价值".因此大力发挥数字货币在钱包应用内的"流通性"及"增值性",是扩充Token使用场景的核心方向一张图带大家了解一下区块链钱包的应用生

Uber是如何基于Go语言构建高QPS服务的?

在2015年初,我们构建了一个只做一件事(也的确做的非常好)的微服务——查找地理围栏(geofence lookup).一年后,这项服务已经成为Uber数百个正在运行的服务中每秒查询次数(QPS)最高的服务.接下来,本文将谈论我们构建这项服务的原因以及我们是如何使用Go语言快速构建和扩展这项服务的. 背景 在Uber,一个地理围栏就表示地球表面上人为划分的一个地理区域.此外,邀爱尚,我们进一步在基于地理的配置中使用地理围栏的概念.地理围栏的概念在很多地方发挥了很重要的作用——向用户展示在某个位置

区块链项目实战视频课程(Java版)

区块链项目实战视频课程(Java版)网盘地址:https://pan.baidu.com/s/1EiONxCp7JBw6GJKhjK_zHQ 提取码:tzr1备用地址(腾讯微云):https://share.weiyun.com/5al0zSz 密码:3rgeye 本课程是基于java语言的区块链实战教程.目的是让更多的java编程者了解区块链,掌握区块链开发. 区块链是分布式数据存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式. 区块链(Blockchain)是比特币的一个重要概