建议和反馈

请填写你的反馈内容

在Go中构建区块链 第1部分:基本原型

2020-01-27 ·176次阅读 ·读完需要5分钟

区块链是21世纪最具革命性的技术之一,它仍在日趋成熟,并且其潜力尚未完全实现。从本质上讲,区块链只是记录的分布式数据库。但是,使它与众不同的是它不是私有数据库,而是一个公共数据库,即使用它的每个人都拥有该数据库的全部或部分副本。并且只有在数据库的其他管理员同意的情况下,才能添加新记录。而且,正是区块链使加密货币和智能合约成为可能。

在本系列文章中,我们将基于简单的区块链实现构建简化的加密货币。

让我们从“区块链”的“区块”部分开始。在区块链中,是存储有价值信息的块。例如,比特币块存储交易,这是任何加密货币的本质。除此之外,一个块还包含一些技术信息,例如其版本,当前时间戳和上一个块的哈希。
在本文中,我们不会像区块链或比特币规范中所描述的那样实现该块,相反,我们将使用它的简化版本,其中仅包含重要信息。看起来是这样的:

type Block struct {
	Timestamp     int64
	Data          []byte
	PrevBlockHash []byte
	Hash          []byte}

Timestamp是当前时间戳(创建块时),Data是包含在块中的实际有价值的信息,PrevBlockHash存储前一个块Hash的哈希,并且是该块的哈希。在Bitcoint规范TimestampPrevBlockHash,和Hash块头形成一个单独的数据结构,而事务(Data在我们的示例中)是一个单独的数据结构。因此,为了简单起见,我们在这里混合它们。

那么我们如何计算哈希值呢?哈希的计算方式是区块链非常重要的功能,而正是这一功能使区块链变得安全。事实是,计算散列是一项计算困难的操作,即使在快速的计算机上也要花费一些时间(这就是为什么人们购买功能强大的GPU来开采比特币的原因)。这是一种有意的体系结构设计,这使得添加新块变得困难,从而阻止了在添加新块后对其进行修改。我们将在以后的文章中讨论并实现此机制。

现在,我们将仅获取块字段,将它们连接起来,并在连接的组合上计算SHA-256哈希。让我们在SetHash方法中这样做

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[:]}

接下来,遵循Golang约定,我们将实现一个函数,该函数将简化块的创建:

func NewBlock(data string, prevBlockHash []byte) *Block {
	block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}}
	block.SetHash()
	return block}

就是这样!

区块链

现在让我们实现一个区块链。本质上,区块链只是具有特定结构的数据库:它是有序的反向链接列表。这意味着块按插入顺序存储,并且每个块都链接到前一个块。这种结构允许快速获取链中的最新块,并(通过其哈希)有效地获取一个块。

在Golang中,可以通过使用数组和映射来实现此结构:该数组将保留有序的哈希值(数组在Go中是有序的),而地图将保留hash → block对(映射是无序的)。但是对于我们的区块链原型,我们将只使用数组,因为我们现在不需要按其哈希获取块。

type Blockchain struct {
	blocks []*Block}

这是我们的第一个区块链!我从来没有想过会那么容易

评论(0)问答(0)
请先登录或注册

请先登陆或注册

相关推荐

使用Golang生成加密货币私钥和公共地址

生成比特币和流行的Altcoins的密钥和地址信息的过程几乎相同。实际上,差异是由通常与网络相关联的私钥和公钥前缀信息定义的。我们将了解如何使用Go编程语言为各种加密货币硬币及其地址生成和导入私钥。获......
区块链网 · 2020-01-27
80阅读 · 0赞赏 · 0问答

开发区块链Android应用的7个基本技巧

在过去的几年中,区块链技术已经改变了我们开发和配置与互联网和移动应用程序相关的所有事物的方式,事实证明,它是近来最具突破性的技术之一,结果,数字业务一直密切关注区块链及其应用。适当配置区块链后,它可以......
区块链论坛 · 2020-01-21
647阅读 · 0赞赏 · 0问答

Ubuntu安装Golang编程语言

在本教程中,我们在Ubuntu Linux上安装了Google Go编程语言。然后,我们使用GOPATH环境变量配置Go Workspace环境。Golang,也称为Go,是Google开发的一种开源......
波bobo · 2020-01-20
657阅读 · 0赞赏 · 0问答

GOPROXY手册

1.环境手动教程,默认系统是linux,程序是proxy;所有操作都需要root特权;如果您使用的是Windows,请使用Windows版本的proxy.exe。2.使用配置文件下一个教程将通过命令行......
江南烟雨 · 2020-01-20
618阅读 · 0赞赏 · 0问答

如何构建一个基于actor的简单区块链

在本文中,我将展示构建简单区块链原型的开发过程,让我们从对区块链的一些介绍开始。之后,我们可以定义将要实现的简化模型。区块链快速入门有很多很好的文章解释了区块链的工作原理,因此我将做一个高层次的介绍,......
区块链网 · 2020-01-19
539阅读 · 0赞赏 · 0问答

3124

LK币

28

粉丝

84

笔记

感谢"区块链论坛"

这篇精彩的笔记,目前已经帮助

  • 0
  • 0
  • 1
  • 7
  • 6
喜欢0
链客社群 加入

微博进入

商务合作>

广告投放>

公司名称:北京链客行科技有限公司

联系方式:010-67707199

ICP备案号:京ICP备18032136号

Copyright:链客区块链技术问答社区 版权所有

感谢您的提问,问题被社区永久收入以便新人查看。一定要记得采纳最佳答案哦!加油!

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!