用GO语言编写一个简单的区块链

本文介绍了使用Go语言实现一个简单区块链的过程,包括创建结构体、生成区块Hash、确认区块完整性、处理多个节点间的竞争以及设置HTTP路由。通过示例代码,展示了如何创建区块链、添加新块,并解释了区块链的工作原理和共识机制。
摘要由CSDN通过智能技术生成

区块链的大致概念。

按照个人理解来说,区块,就是保存一个一个数据的模块,然后区块链,是每个区块相连的链表那种,同时区块链实现之所以公平,是采用加密,且不可倒置等的机制,也就是,数据只要成功加载到区块链上,没有篡改、消除的可能性。

图中所示,就是区块链的实现机制,每个区块保存有上个区块的Hash值,同时生成自己的Hash给下个区块来保存。

区块的概念
具体的关于区块的知识,在Here有讲解,关于私链、公链,以及白皮书等,有兴趣可以看看。

接下来开始今天的主题。

首先今天的任务呢,就以下六个:

  • 创建自己的区块链
  • 了解哈希如何维护区块链的完整性
  • 查看如何添加新块
  • 查看多个节点生成块时如何解决决胜局
  • 在网络浏览器中查看您的区块链
  • 写新区块

首先需要下载代码中所需的第三方包
这个项目中所需要使用到的第三方包有三个:
go get github.com/davecgh/go-spew/spew
spew可以在控制台可视化structs和slices。
go get github.com/gorilla/mux
gorilla / mux是编写Web处理程序的流行软件包。
go get github.com/joho/godotenv
godotenv允许我们从.env保存在目录根目录中的文件中进行读取,因此无需对诸如HTTP端口之类的内容进行硬编码。

第一步我们在.env目录的根目录中创建一个文件,定义将为http请求提供服务的端口。只需向此文件添加一行:
PORT=8080

如果觉得细讲有点啰嗦,可直接跳到下面看完整代码!

创建好就是这样子:

接下来创建一个main.go文件。从现在开始,所有内容都将写入此文件,由于实现简单,暂无分模块处理,也是便于各位能看懂代码逻辑。

创建结构体
type Block struct {
   
	Index     int    //数据记录在区块中的位置
	Timestamp string //数据写入时间
	BPM       int   //插入区块的频率
	Hash      string //此条数据的SHA256标识符
	PrevHash  string //上一个区块的标识符
}

根据结构体创建接下来的Blockchain

var Blockchain []Block
接下来就是生成区块本身的Hash:
//用于生成区块的SHA256哈希值
func calculateHash(block Block) string {
   
	record := string(block.Index) + block.Timestamp + string(block.BPM) + block.PrevHash
	h := sha256.New()
	h.Write([]byte(record))
	hashed := h.Sum(nil)
	//返回生成的Hash
	return hex.EncodeToString(hashed)
}
然后就是完整的新的区块的生成
//新区块的生成
func generateBlock(oldBlock Block, BPM int) (Block, error) {
   
	var newBlock Block

	t := time.Now()

	newBlock.Index = oldBlock.Index + 1
	newBlock.Timestamp = t.String()
	newBlock.BPM = BPM
	newBlock.PrevHash = oldBlock.Hash
	newBlock.Hash = calculateHash(newBlock)

	return newBlock, nil
}
再然后就是确认区块是否被更改

我们检查Index以确保它们已按预期增加。同时检查PrevHash的确与Hash上一个块的相同。最后,我们要通过在当前块上calculateHash再次运行该函数来仔细检查当前块的哈希。

//验证区块是否被篡改
func isBlockValid(newBlock, oldBlock Block) bool {
   
	if oldBlock.Index+1 != newBlock.Index {
   
		return false
	}
	if oldBlock.Hash != newBlock.PrevHash {
   
		return false
	}
	if calculateHash(newBlock) != newBlock.Hash {
   
		return false
	}
	return true
}

抛出一个问题

如果我们的区块链生态系统的两个节点都向其链中添加了区块,而我们都收到了它们。选择的话,我们选择最长的链条。

两个节点可能只是具有不同的链长,因此自然而然地,较长的节点将是最新的,并具有最新的块。因此,要确保我们要接收的新链比当前的链更长。如果是这样的话,我们可以使用具有新块的新链覆盖我们的链。

如图:

那我们解决这个问题的话,只需要我们比较链条的长度即可完成此操作:

//两个区块竞争,长的链优先
func replaceChain(newBlocks []Block) {
   
	if len(newBlocks) > len(Blockchain) {
   
		Blockchain = newBlocks
	}
}


到了这里,基本关于区块的操作已经完成,接下来就是处理路由,然后就大功告成。

首先思考,设置路由,我们用最简单的方式实现,Get来获取区块的数据,Post来插入自己的新的区块。

首先是Get:

//查看区块数据
func handleGetBlockchain(w http.ResponseWriter, r *http.Request) {
   
	//以json格式写会区块的数据
	bytes, err := json.
  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
编写一个区块链,需要了解区块链的基本概念和原理,以及使用Golang编写分布式应用程序的基础知识。 以下是编写区块链的基本步骤: 1. 定义区块结构 定义区块的结构,包括区块头和区块体。区块头包含区块的元数据,如区块的哈希值、时间戳、难度等信息。区块体包含实际的交易数据。 2. 实现区块链 在代码中定义一个区块链结构体,包含一个区块数组和一些方法,如添加新块、验证区块等。 3. 实现工作量证明算法 区块链需要一个工作量证明算法来保证安全性。这可以通过实现PoW(Proof of Work)算法来完成,该算法需要在计算一个区块的哈希值时,找到一个符合条件的哈希值,这个过程需要不断地猜测随机数,直到找到符合条件的哈希值。 4. 实现节点通信 区块链一个分布式系统,节点之间需要进行通信。可以通过实现P2P(Peer-to-Peer)协议来实现节点之间的通信,这可以通过Go语言的网络库来完成。 5. 实现钱包 钱包是用于管理用户的加密货币的应用程序。可以使用Go语言的加密库来实现钱包功能,如生成公私钥对、签名交易等。 6. 测试和部署 编写完代码后,需要进行测试和部署。可以在本地网络上运行一个测试网络,或者将代码部署到公共区块链网络上。 以上是编写一个基本的区块链的基本步骤,当然,还有很多细节需要注意,如安全性、性能优化等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值