手机版
扫描查看手机站
首页 > 文章 > 加密世界 > 正文

GO创建区块链,怎么用GO实现一个简单的区块链?

时间:2025-03-12 20:11:43来源:525游

自互联网以来,锁链技术已被某些人称为最有影响力的发明。尽管公众将区块链与投机性加密货币同义解释,但区块链实际上在现代世界中具有不可思议的广泛应用。实际上,加密货币只是区块链领域的一小部分,生产中的许多解决方案都是由私人组织领导来实现的。

GO创建区块链,怎么用GO实现一个简单的区块链?

随着区块链技术的迅速发展,技术领域的专业人员越来越需要了解区块链的基础知识及其技术影响力。

毕竟,实现自己的区块链实际上并不像听起来那样复杂。本文中,我们将使用2021年最流行的编程语言之一GoLang实现基本的区块链。那么,让我们开始吧!

了解区块链

区块链是名称符合其含义的少数技术之一。我们可以将区块链视为通过哈希相互连接的信息块,哈希是从输入数据生成的加密的固定输出。由于每个块都通过哈希相互引用,因此如果不大幅度更改链的其余部分,就不可能更改链的任何部分。

区块链中的每个块都可以包含几乎任何内容的数据。一个基本框架将包括每个块的过去交易的所有记录。比特币以类似的方式工作,这就是为什么您可以一直跟踪比特币交易直至Satoshi首次进行加密货币交易的原因。

下面我们有三个区块来创建区块链。第一块是创世块。由于之前没有任何内容,因此前一个哈希字段为空。我们仍然使用时间戳记属性和初始事务作为哈希算法的输入。该算法将吐出一大串数字和字母,这些数字和字母代表了创世纪块的哈希值。

 

转到块2,我们将创世块的哈希值用作块2先前哈希值。这个动作将创世块与第2块联系起来!接下来,我们将时间戳,交易列表和先前的哈希值作为我们的哈希算法的输入。该算法将为我们提供一个新的哈希值来表示块2。

我们将继续重复该过程任意多次,除了区块的有效性以及存储区块链的能力(比特币的区块链约为330 GB)之外,没有任何其他限制。

在Go中创建一个简单的区块链

创建我们的区块链的第一步是定义什么是区块。Go使我们的生活更轻松地创建自定义类型,我们可以Block使用以下代码来定义类型。在这里,该Block结构具有四个字段以匹配我们上面的图。

type Block struct { timestamp time.Time transactions []string prevHash []byte Hash []byte}

下一步是创建构造函数的Go版本,以创建新的块。该函数的输入将使用一个字符串数组来表示事务,以及一个字节数组来表示先前制作的块所对应的先前的哈希值。下一个要研究的NewHash()功能是我们下一步将实现的功能。

func NewBlock(transactions []string, prevHash []byte) *Block { currentTime := time.Now() return &Block { timestamp: currentTime, transactions: transactions, prevHash: prevHash, Hash: NewHash(currentTime, transactions, prevHash), }}

该NewHash()函数将时间,事务列表和以前的哈希作为我们的输入参数,同时返回一个字节数组来表示新生成的哈希值。在此功能中,我们基本上只是将所有输入都混入一个称为的单个字节数组中input。我们这样做是使用append()功能的附加time参数,prevHash通过转换time为string用...,以追加作为后缀time片的prevHash切片。

然后,我们遍历transactions并将每个个体附加transaction到input数据blob。有趣的语法string(rune(transaction))...只是Go中将其中的每个元素转换transactions为可以附加到的切片的一种方法input。它正在输入垃圾内容,因此,如果您真的想要,请深入研究。

func NewHash(time time.Time, transactions []string, prevHash []byte) []byte { input := append(prevHash, time.String()...) for transaction := range transactions { input = append(input, string(rune(transaction))...) } hash := sha256.Sum256(input) return hash[:]}

最后,我们使用crypto包转到电话sha256.Sum256()与input作为它的参数。这将为我们的所有数据输入提供新的哈希表示。我们返回时hash[:]使用的[:]语法将hash在返回时切成适当的长度。

这实际上是我们开始链接我们的区块链所需的全部。当然,我们希望在程序中看到某种输出,以便在打印时可以使用一些辅助方法:

func printBlockInformation(block *Block) { fmt.Printf("\ttime: %s\n", block.timestamp.String()) fmt.Printf("\tprevHash: %x\n", block.prevHash) fmt.Printf("\tHash: %x\n", block.Hash) printTransactions(block)}func printTransactions(block *Block) { fmt.Println("\tTransactions:") for i, transaction := range block.transactions { fmt.Printf("\t\t%v: %q\n", i, transaction) }}

现在剩下的就是创建新的事务,块和哈希。我们可以通过我们的主要方法来做到这一点。我们定义了一个字符串数组来记录我们的区块链中的交易。另请注意,我们如何传递一个空字节数组NewBlock()来生成名为的第一个块genesisBlock。

func main() { genesisTransactions := []string{"Izzy sent Will 50 bitcoin", "Will sent Izzy 30 bitcoin"} genesisBlock := NewBlock(genesisTransactions, []byte{}) fmt.Println("--- First Block ---") printBlockInformation(genesisBlock) block2Transactions := []string{"John sent Izzy 30 bitcoin"} block2 := NewBlock(block2Transactions, genesisBlock.Hash) fmt.Println("--- Second Block ---") printBlockInformation(block2) block3Transactions := []string{"Will sent Izzy 45 bitcoin", "Izzy sent Will 10 bitcoin"} block3 := NewBlock(block3Transactions, block2.Hash) fmt.Println("--- Third Block ---") printBlockInformation(block3)}

为了创建新的区块,我们将前一个区块的哈希值NewBlock()与对应的交易历史记录一起传递。如果您想在一个地方查看整个程序,则为:

package mainimport ( "crypto/sha256" "fmt" "time")type Block struct { timestamp time.Time transactions []string prevHash []byte Hash []byte}func main() { genesisTransactions := []string{"Izzy sent Will 50 bitcoin", "Will sent Izzy 30 bitcoin"} genesisBlock := NewBlock(genesisTransactions, []byte{}) fmt.Println("--- First Block ---") printBlockInformation(genesisBlock) block2Transactions := []string{"John sent Izzy 30 bitcoin"} block2 := NewBlock(block2Transactions, genesisBlock.Hash) fmt.Println("--- Second Block ---") printBlockInformation(block2) block3Transactions := []string{"Will sent Izzy 45 bitcoin", "Izzy sent Will 10 bitcoin"} block3 := NewBlock(block3Transactions, block2.Hash) fmt.Println("--- Third Block ---") printBlockInformation(block3)}func NewBlock(transactions []string, prevHash []byte) *Block { currentTime := time.Now() return &Block { timestamp: currentTime, transactions: transactions, prevHash: prevHash, Hash: NewHash(currentTime, transactions, prevHash), }}func NewHash(time time.Time, transactions []string, prevHash []byte) []byte { input := append(prevHash, time.String()...) for transaction := range transactions { input = append(input, string(rune(transaction))...) } hash := sha256.Sum256(input) return hash[:]}func printBlockInformation(block *Block) { fmt.Printf("\ttime: %s\n", block.timestamp.String()) fmt.Printf("\tprevHash: %x\n", block.prevHash) fmt.Printf("\tHash: %x\n", block.Hash) printTransactions(block)}func printTransactions(block *Block) { fmt.Println("\tTransactions:") for i, transaction := range block.transactions { fmt.Printf("\t\t%v: %q\n", i, transaction) }}

如果要运行此程序,将得到以下输出:

$ go run example.go --- First Block --- time: 2021-04-05 15:12:18.813294 -0600 MDT m=+0.000074939 prevHash:  Hash: 43ec51c50d2b9565f221155a29d8b72307247b08eaf6731cca Transactions: 0: "Izzy sent Will 50 bitcoin" 1: "Will sent Izzy 30 bitcoin"--- Second Block --- time: 2021-04-05 15:12:18.813477 -0600 MDT m=+0.000257244 prevHash: 43ec51c50d2b9565f221155a29d8b72307247b08eaf6731cca Hash: fcce5323a35cb67b45fe75866582db00fd32baeb92aac448c7 Transactions: 0: "John sent Izzy 30 bitcoin"--- Third Block --- time: 2021-04-05 15:12:18.813488 -0600 MDT m=+0.000269168 prevHash: fcce5323a35cb67b45fe75866582db00fd32baeb92aac448c7 Hash: fc1d3eee286970d85812b47c3a5bf016ae8c1de4f86b8ace972ffa Transactions: 0: "Will sent Izzy 45 bitcoin" 1: "Izzy sent Will 10 bitcoin"

过程可能会很粗糙,但这是创建自己的区块链的基础!

以上就是GO创建区块链,怎么用GO实现一个简单的区块链?的详细内容,更多关于GO创建区块链的资料请关其它相关文章!


钱包安全知识:钱包助记词忘记备份/备份丢失怎么办? 欧意交易所app官网钱包里的数字资产充值教程 玩比特币合约能暴富吗是真的吗?币圈靠比特币期货合约发财的人 囤币是什么意思?为什么炒币不如囤币? 创造与魔法什么样的坐骑速度快(创造与魔法什么坐骑速度快排名) BNX哪里买?BNX币上架交易所盘点 和平精英手册一周多少积分(和平精英手册一周有多少积分) 第五人格前锋怎么撞人 前锋撞人玩法技巧(第五人格前锋撞救还是扛刀救) 王者荣耀专精装备在哪买2022(王者荣耀专精装备上线) 哪个思维导图软件好用(哪个思维导图软件好用?终于找到它了) 欧易合约怎么对冲交易?欧易合约对冲交易操作教程 创造与魔法怎么打晕宠物(创造与魔法怎么快速打晕动物) 有什么能自动挂机的手机游戏(可以自动挂机的游戏) 比特派钱包知识库:火币生态链HECO中MDEX使用教程 csgo淬火661为啥这么贵(csgoak淬火661是什么意思) Poloniex交易所怎么下载安装?Poloniex交易所APP下载方法分享 哪个回合制网游不烧钱(哪个回合制游戏不坑钱) 王者荣耀典藏皮肤多久出一个(王者荣耀典藏皮肤多久出一个2020) 我的世界蛋糕怎么吃不了(我的世界蛋糕可以打下来吗) 创造与魔法可可豆有什么用(创造与魔法可可豆饼) 外汇看盘软件哪个好用?电脑端外汇看盘软件排行榜 和平精英举报后多久才能收到结果(和平精英举报以后,多久能恢复正常) 宝可梦阿尔宙斯起源形态怎么变(阿尔宙斯的进化) 梦幻西游手游69和115怎么选(梦幻西游手游69 115) 迷你世界:萌眼星上只有5种生物(迷你世界萌眼星的生物) 诛仙手游孤剑曦月强不强(新诛仙手游孤剑曦月怎么获得) Ledger钱包初始化图文教程 英雄联盟蔚和谁是情侣(lol蔚) 区块链ANY币在哪买?ANY币上线交易所大盘点 抹茶交易所怎么买猪猪币PIG币?MXC抹茶交易所买猪猪币教程 王者荣耀精彩时刻怎么保存到手机(王者精彩时刻怎么保存本地) 蜀门手游炼狱关卡攻略(蜀门手游炼魔阵攻略) 第五人格中雕刻家的技能强度如何(第五人格雕刻家有哪些皮肤) 创造与魔法精烹大乱炖怎么做(创造与魔法精炼炉怎么做?) 真良心手游推荐(0氪手游不花钱的手游 推荐) 问道手游法宝技能怎么弄(问道手游法宝技能详解) 免费挖币赚钱的App的收益如何?2025最新挖矿app十大排名 全球链游排行榜前八 2022年全球链游排行榜一览 和平精英兰博基尼抽奖技巧是什么(和平精英兰博基尼车皮) 冰原守卫者60层塔怎么打(冰原守卫者怎么升级快) BAX是什么币种?BAX币前景和未来价值分析 哈利波特三强争霸赛比赛场地之一在哪(哈利波特在三强争霸赛中是如何一步一步胜出的呢) 哪些是好玩不花钱的手游(好玩儿不花钱的手游) 第五人格 佛系会封号吗(第五人格佛系违规游戏吗) 如何选择数字货币交易平台? 冰原守卫者冰龙蛋怎么获得(冰原守卫者手游攻略) 创造与魔法飞龙王鸟吃多少饲料(创造与魔法飞龙吃多少包稳) 问道手游敏水变身卡哪个好(问道敏水吃什么变身卡) 有没有手游自带折扣充值(手游游戏充值折扣) 求职必看!靠谱网站有哪些(比较好的求职网站) 放置游戏天花板(放置类游戏排行榜top10) 电脑基础教程之重装系统篇(电脑重装系统小白教程3分钟) DOTC去中心化交易平台使用教程:授权DAPP EOS币还能回到100元吗?EOS柚子币2025最近利好消息分享 dragonex龙网交易所怎么样?属于哪个国家 cf周年币怎么获得(cf周年庆cdk怎么获得) BINVET交易所究竟怎么样?币威交易所正规吗? 梦幻西游2无底洞怎么加点(梦幻西游无底洞怎么加点秒的多) BitWell交易所怎么样?BitWell交易所安全靠谱吗? 泰拉瑞亚火炬神事件怎么触发(terraria火炬神) 我的世界节肢杀手有什么用(我的世界节肢杀手最高等级) 和平精英守护天使什么意思(和平精英守护天使必须是好友吗) 宝可梦阿尔宙斯柔韧的尾巴任务怎么做(阿尔宙斯弱点) 以太坊Gas是什么意思?一文读懂以太坊Gas费用 原神古岩龙蜥旁边的密室怎么破解(古岩龙蜥右边的密室) 英雄联盟手游龙的传人能白嫖吗(英雄联盟龙的传人值多少) 我的世界神奇宝贝怎么提升亲密度(我的世界神奇宝贝怎样提升亲密度) 王者荣耀什么阵容适合玩西施 西施克制的英雄 数字资产钱包有哪几种?如何正确选择数字资产钱包? USDT充值多久到账?泰达币充值到账时间介绍 TP钱包基础知识:使用TP钱包参与Matic主网 剑与远征sp英雄怎么获得(剑与远征sp英雄进阶表格图) 虎符交易所怎么样?虎符交易所与火币网对比哪家好? 08年买1万元比特币现在值多少钱?08年比特币多少钱一枚价值分析 我的世界物品栏大小怎么调(我的世界物品栏大小怎么调出来) 宝可梦传说阿尔宙斯飞天螳螂头目在哪(宝可梦 飞天螳螂) 火币网币币如何转法币?usdt兑换提现人民币教程 魔兽世界wlk死寒披风怎么获得(死寒之拥) 在OKEX欧易买币有哪些费用?OKEX欧易网交易手续费怎么算? okex挖矿花钱吗?okex挖矿提现额度 第五人格园丁日记3怎么过(第五人格园丁日记第三关) 1万个比特币能套现吗?比特币怎么交易提现 AAVE是什么币种?AAVE币前景和价值分析 比特币对冲交易能赚钱吗?比特币期货交易对冲方法盈利思路 BIKI交易所怎么提现?BIKI交易所提现人民币教程 Cf鼠标回报率开还是不开呀(cf鼠标回报率用开吗) 伦敦硬分叉是什么意思?科普以太坊伦敦硬分叉 三国志幻想大陆主界面人物怎么换(三国志幻想大陆形象怎么换成皮肤) 王者荣耀猴子最强出装是什么(王者猴子的最强出装) 消逝的光芒2兵营电站保险柜密码是多少(消逝的光芒2仓库在哪) okex交易账户和资金账户有什么区别?okex交易账户与资金账户区别对比 gete.io/芝麻开门交易所怎么样?gate.io交易平台优势 千年盛世手游:经典永不过时(经典武侠手游推荐) dnf护石三个位置是随便放吗(dnf护石放的位置) 和平精英空间功能封禁怎么办(为什么和平精英空间违规) 什么游戏可以靠卖资源赚钱(靠卖资源赚钱的手游) 创造与魔法熔炉怎么弄(创造与魔法熔炉怎么做?) 苹果手机怎么清理内存垃圾清理?八招教你清理出10G垃圾 火必官网APP怎么下载?火必网下载链接一览(最新版) Coinlist怎么样?Coinlist打新中签流程介绍

热门文章

推荐专题

更多>>

游戏推荐

更多>>