当前位置:主页 > 区块链 > 区块链技术 > GO创建区块链

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

2021-04-19 16:18:13 | 来源:比特范 | 作者:佚名
这篇文章主要介绍了GO创建区块链,怎么用GO实现一个简单的区块链?本文中,我们将使用2021年最流行的编程语言之一GoLang实现基本的区块链。下面跟随小编一起来参考下内容吧!

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

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创建区块链的资料请关注脚本之家其它相关文章!

免责声明:本文只为提供市场讯息,所有内容及观点仅供参考,不构成投资建议,不代表本站观点和立场。投资者应自行决策与交易,对投资者交易形成的直接或间接损失,作者及本站将不承担任何责任。!
Tag:GO   区块链   Golang  

你可能感兴趣的文章

更多

热门币种

  • 币名
    最新价格
    24H涨幅
  • bitcoin BTC 比特币

    BTC

    比特币

    $ 77959.98¥ 532388.7
    -1.17%
  • ethereum ETH 以太坊

    ETH

    以太坊

    $ 2320.63¥ 15847.58
    -3.03%
  • tether USDT 泰达币

    USDT

    泰达币

    $ 1.0003¥ 6.831
    +0.03%
  • ripple XRP 瑞波币

    XRP

    瑞波币

    $ 1.4291¥ 9.7593
    -1.39%
  • binance-coin BNB 币安币

    BNB

    币安币

    $ 637.3¥ 4352.12
    -1.19%
  • usdc USDC USD Coin

    USDC

    USD Coin

    $ 0.9995¥ 6.8255
    +0%
  • solana SOL Solana

    SOL

    Solana

    $ 85.5386¥ 584.14
    -2.51%
  • tron TRX 波场

    TRX

    波场

    $ 0.3291¥ 2.2474
    +0.15%
  • dogecoin DOGE 狗狗币

    DOGE

    狗狗币

    $ 0.096801¥ 0.661
    -0.65%
  • hyperliquid HYPE Hyperliquid

    HYPE

    Hyperliquid

    $ 41.3656¥ 282.48
    +0.84%

币圈快讯

  • 美元指数DXY拉升近20点现货黄金下挫近30美元

    2026-04-24 01:13
    据Gate行情数据显示,美元指数DXY在15分钟内拉升近20点,最新报98.82;美油和布油短线走高1.8美元,现货黄金则下挫近30美元。
  • 伊朗媒体:伊方针对美方及其盟友潜在军事行动制定反击方案

    2026-04-24 00:48
    4月24日,据伊朗法尔斯通讯社23日报道,鉴于外交解决受挫及对美方谈判诚意的“彻底不信任”,伊朗方面已根据“对等回应”和“进攻性威慑”原则,对美方及其盟友“可能的”军事行动制定反击方案。该报道中列出伊朗回应方案的部分内容。若伊朗发电厂遭打击,将使用导弹和无人机打击以色列及地区内美国其他盟友的发电厂;若伊朗油气基础设施遭袭,将对以色列和美国其他盟友关键油气设施实施打击,使其油气日产当量每天减少2500万桶,持续一年。(新华社)
  • BTC全网合约持仓量24h减少5.74%

    2026-04-24 00:41
    据Coinglass数据显示,BTC全网合约持仓量在过去24小时减少5.74%,当前总持仓量为600.8亿美元。其中Binance持仓量为102.6亿美元,OKX持仓量为36.15亿美元,Bybit持仓量为47.95亿美元,Gate持仓量为51.81亿美元。
  • 过去24小时全网爆仓2.15亿美元多单爆仓1.44亿美元空单爆仓7154.86万美元

    2026-04-24 00:30
    据Coinglass数据,过去24小时全网爆仓2.15亿美元,多单爆仓1.44亿美元,空单爆仓7,154.86万美元。其中比特币多单爆仓3,445.65万美元,比特币空单爆仓2,255.95万美元,以太坊多单爆仓4,876.44万美元,以太坊空单爆仓915.9万美元。 此外,最近24小时,全球共有99,025人被爆仓,最大单笔爆仓单发生在Binance-BTCUSDT价值184.5万美元。
  • 白俄罗斯拟推加密银行支持26种加密资产、11类业务操作

    2026-04-24 00:22
    白俄罗斯国家银行副行长AlexanderEgorov表示,该国正推进“加密银行”框架建设,计划支持约26种加密资产及11类核心业务。根据相关法令,加密银行可使用包括比特币、以太坊、Toncoin、Solana在内的主流加密货币及稳定币。在业务范围方面,涵盖加密存款、加密贷款、质押、质押挖矿(staking)、资产转账、自主发行代币、交易兑换及托管等共11项操作。
  • 查看更多