使用golang从零开始搭建基于UTXO模型的区块链(一、实现最简易的区块链)

这篇具有很好参考价值的文章主要介绍了使用golang从零开始搭建基于UTXO模型的区块链(一、实现最简易的区块链)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

真正理解区块链底层原理的方法就是写一个底层,UTXO模型区块链的开发难度还是比较简单的,等开发完后再去尝试一下基于account模型的。
什么是区块链以及UTXO模型和account模型等问题我就不在这里写了,网上的资料有很多,跟着写之前可以先去了解一下区块链的基础知识。

开发环境:goland+go1.20
该项目github地址:lighteningchain
mirror地址:lighteningchain(1)

创建项目

使用goland创建项目,取名为lighteningchain,并使用go mod init lighteningchain初始化项目使用golang从零开始搭建基于UTXO模型的区块链(一、实现最简易的区块链)

区块结构

每个区块应该包含头部(head)信息用于总结性的描述这个区块,然后在区块的数据存放区(body)中存放要保存的重要数据
首先定义区块结构体和区块链的结构体

type Block struct {
	Timestamp int64
	Hash      []byte //区块hash值就是其ID
	PrevHash  []byte
	Data      []byte
}

type BlockChain struct {
	Blocks []*Block
}

计算哈希

有了结构体后,区块的哈希计算也是必不可少的

func (b *Block) SetHash() {
	information := bytes.Join([][]byte{Int64ToByte(b.Timestamp), b.PrevHash, b.Data}, []byte{})
	hash := sha256.Sum256(information) //软件包sha256 实现 FIPS 180-4 中定义的 SHA224 和 SHA256 哈希算法。
	b.Hash = hash[:]
}

func Int64ToByte(num int64) []byte {
	var buf = make([]byte, 8)
	binary.BigEndian.PutUint64(buf, uint64(num))
	return buf
}

information变量是将区块的各项属性串联之后的字节串。bytes.Join可以将多个字节串连接,第二个参数是将字节串连接时的分隔符,这里设置为[]byte{}即为空。

创建区块和区块链

好了,区块链的准备工作完成,下面就要开始创建区块并将它们连在一起。
首先定义区块创建函数

func CreateBlock(prevhash []byte, data []byte) *Block {
	block := Block{time.Now().Unix(), []byte{}, prevhash, data}
	block.SetHash() //所有数据添加好后再计算hash
	return &block
}

可是每个区块都要链接上一个区块的hash,那第一个区块怎么办?这时就需要创世区块。

func GenesisBlock() *Block {
	genesisWords := "HelloWorld!"
	return CreateBlock([]byte{}, []byte(genesisWords))
}

把创建好的区块添加到区块链上

func (bc *BlockChain) AddBlock(data string) {
	newBlock := CreateBlock(bc.Blocks[len(bc.Blocks)-1].Hash, []byte(data))
	bc.Blocks = append(bc.Blocks, newBlock)
}

这下整个区块链就搭建好了,下面我们运行试试。对了,不要忘记初始化。

func CreateBlockChain() *BlockChain {
	myBlockchain := BlockChain{}
	myBlockchain.Blocks = append(myBlockchain.Blocks, GenesisBlock())
	return &myBlockchain
}

main函数编写运行测试区块链

接下来我们就可以运行区块链了,我们自己编写几个实例加进去然后输出看看:

func main() {
	blockchain := CreateBlockChain()
	time.Sleep(time.Second)
	blockchain.AddBlock("This is first Block after Genesis")
	time.Sleep(time.Second)
	blockchain.AddBlock("This is second!")
	time.Sleep(time.Second)
	blockchain.AddBlock("Awesome!")
	time.Sleep(time.Second)

	for num, block := range blockchain.Blocks {
		fmt.Printf("number:%d Timestamp: %d\n", num, block.Timestamp)
		fmt.Printf("number:%d hash: %x\n", num, block.Hash)
		fmt.Printf("number:%d Previous hash: %x\n", num, block.PrevHash)
		fmt.Printf("number:%d data: %s\n", num, block.Data)
	}
}

点击运行,输出如下:

number:0 Timestamp: 1677568251
number:0 hash: 5af650b22cc85f225c2c42850714be9466408025dfec7191436d7efa7a716433
number:0 Previous hash: 
number:0 data: HelloWorld!
number:1 Timestamp: 1677568252
number:1 hash: 3b2eafc41f8c0bd319fd2e7fd44ff2d15215ab931e6a599dc83b60f055653cb8
number:1 Previous hash: 5af650b22cc85f225c2c42850714be9466408025dfec7191436d7efa7a716433
number:1 data: This is first Block after Genesis
number:2 Timestamp: 1677568253
number:2 hash: 1be2cf3334f59a54a33e9c28957ecb836f17d731f6731bc7540066f99c2338c7
number:2 Previous hash: 3b2eafc41f8c0bd319fd2e7fd44ff2d15215ab931e6a599dc83b60f055653cb8
number:2 data: This is second!
number:3 Timestamp: 1677568254
number:3 hash: 460d954e05c98774b58426372f61997bed92ce7b4e2effb749b7bc2f0c19bdf3
number:3 Previous hash: 1be2cf3334f59a54a33e9c28957ecb836f17d731f6731bc7540066f99c2338c7
number:3 data: Awesome!

Process finished with the exit code 0

一切正常!

总结

本章搭建了一个最简易的区块链,主要是加深对于区块和区块链数据结构的认识。可以看出来,此项目目前并不符合高内聚低耦合思想,因此下一章将对此进行优化,并引入POW(工作量证明)共识机制。

参考资料

Go Blockchain Tutorial Part 1: Hello, Blockchain文章来源地址https://www.toymoban.com/news/detail-495339.html

到了这里,关于使用golang从零开始搭建基于UTXO模型的区块链(一、实现最简易的区块链)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于阿里云、七牛云、宝塔面板,从零开始用Halo搭建个人博客网站

    目录 目录 购买服务器 环境要求 硬件配置 CPU 内存 磁盘 网络 软件环境 JRE(Java Runtime Environment) MySQL(可选) Web 服务器(可选) Wget(可选) VIM(可选) 浏览器支持 名词解释 ~(符号) 运行包 工作目录 购买域名 服务器安装配置 远程连接 阿里云网页连接 Xshell程序连接 博

    2024年04月13日
    浏览(52)
  • 新书速览|从零开始大模型开发与微调:基于PyTorch与ChatGLM

    详细讲解大模型基本理论、算法、程序实现与应用实战,揭示大模型开发与微调技术 1 本书内容 大模型是深度学习自然语言处理皇冠上的一颗明珠,也是当前AI和NLP研究与产业中最重要的方向之一。本书使用 PyTorch 2.0作为学习大模型 的基本框架,以 ChatGLM为例 详细讲解大模型

    2024年01月17日
    浏览(68)
  • 【区块链 | 预言机】从零开始使用Chainlink预言机(2)- 智能合约中使用更安全的随机数-代码实战

    Chainlink最近推出一款革命性的产品,VRF—Verifiable Random Function可验证随机数,给智能合约带来了真正安全的随机数。本文我们就来介绍一下如何在智能合约中使用VRF吧。 我们先简要介绍一下Chainlink VFR的工作流程。 首先,智能合约应用,也就是我们的Dapp,需要先发起一个获取

    2024年02月02日
    浏览(49)
  • 从零开始搭建AI网站(6):如何使用响应式编程

    响应式编程(Reactive Programming)是一种编程范式,旨在处理异步数据流和事件流。它通过使用观察者模式和函数式编程的概念,将数据流和事件流抽象为可观察的序列,然后通过操作这些序列来实现各种功能。 在响应式编程中,数据流和事件流被视为连续的时间序列,可以通

    2024年02月10日
    浏览(39)
  • 【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B

    2023年2月25日消息,Meta 推出了一种针对研究社区的基于人工智能 (AI) 的新型大型语言模型,与微软、谷歌等一众受到 ChatGPT 刺激的公司一同加入人工智能竞赛。 Meta 的 LLaMA 是“大型语言模型 Meta AI” (Large Language Model Meta AI)的缩写,它可以在非商业许可下提供给政府、社区

    2024年02月13日
    浏览(48)
  • 【Flutter】macOS从零开始使用FVM搭建Flutter开发环境

    本文为个人记录macOS系统使用fvm从零开始搭建flutter开发环境到项目运行的过程,非教程性质,仅供参考,如有疑问或建议,欢迎大家在评论区留言 附上开发设备配置 以vscode为编码工具 下载地址:Download Visual Studio Code - Mac, Linux, Windows 下载后解压安装即可 Xcode 在 iOS 真机或者

    2024年02月09日
    浏览(48)
  • Windows 11 上从零开始基于 wsl-ubuntu 搭建 AI 学习环境及部署多种私有 ChatGPT

    今天(2023/6/2)刚刚换了 1 块 4TB 的硬盘,在 Windows 11 上从零开始,基于 Windows Subsystem for Linux 搭建一套 AI 学习环境。 其中包括,安装 Python、安装 Miniconda3、安装 CUDA Toolkit、安装 git lfs、配置 Hugging Face 的缓存路径、本地部署 ChatGLM-6B、本地部署 VisualGLM-6B等等内容。 安装 Ubuntu-

    2024年02月07日
    浏览(57)
  • 从零开始构建区块链:我的区块链开发之旅

    1.区块链技术的兴起和重要性 区块链技术,作为数字化时代的一项颠覆性创新,已经成为当今世界最令人瞩目的技术之一。自比特币的问世以来,区块链技术已经从仅仅支持加密货币发展成为一种具有广泛应用前景的分布式账本技术。其核心优势在于提供了一种安全、透明、

    2024年02月02日
    浏览(39)
  • 使用MASA Stack+.Net 从零开始搭建IoT平台 第五章 使用时序库存储上行数据

    @ 目录 前言 分析 实施步骤 时序库的安装 解决playload没有时间戳问题 代码编写 测试 总结 我们可以将设备上行数据存储到关系型数据库中,我们需要两张带有时间戳的表( 最新数据表 和 历史数据表 ), 历史数据表 存储所有设备上报的数据, 最新数据表 需要存储设备最新

    2024年02月11日
    浏览(40)
  • 【ChatGPT】从零开始构建基于ChatGPT的嵌入式(Embedding) 本地(Local) 智能客服问答机器人模型

      目录 方案流程 1. Embeddings 介绍 术语:微调 vs 嵌入

    2024年02月10日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包