GO創(chuàng)建區(qū)塊鏈,怎么用GO實(shí)現(xiàn)一個(gè)簡單的區(qū)塊鏈?
自互聯(lián)網(wǎng)以來,鎖鏈技術(shù)已被某些人稱為最有影響力的發(fā)明。盡管公眾將區(qū)塊鏈與投機(jī)性加密貨幣同義解釋,但區(qū)塊鏈實(shí)際上在現(xiàn)代世界中具有不可思議的廣泛應(yīng)用。實(shí)際上,加密貨幣只是區(qū)塊鏈領(lǐng)域的一小部分,生產(chǎn)中的許多解決方案都是由私人組織領(lǐng)導(dǎo)來實(shí)現(xiàn)的。
隨著區(qū)塊鏈技術(shù)的迅速發(fā)展,技術(shù)領(lǐng)域的專業(yè)人員越來越需要了解區(qū)塊鏈的基礎(chǔ)知識(shí)及其技術(shù)影響力。
畢竟,實(shí)現(xiàn)自己的區(qū)塊鏈實(shí)際上并不像聽起來那樣復(fù)雜。本文中,我們將使用2021年最流行的編程語言之一GoLang實(shí)現(xiàn)基本的區(qū)塊鏈。那么,讓我們開始吧!
了解區(qū)塊鏈
區(qū)塊鏈?zhǔn)敲Q符合其含義的少數(shù)技術(shù)之一。我們可以將區(qū)塊鏈視為通過哈希相互連接的信息塊,哈希是從輸入數(shù)據(jù)生成的加密的固定輸出。由于每個(gè)塊都通過哈希相互引用,因此如果不大幅度更改鏈的其余部分,就不可能更改鏈的任何部分。
區(qū)塊鏈中的每個(gè)塊都可以包含幾乎任何內(nèi)容的數(shù)據(jù)。一個(gè)基本框架將包括每個(gè)塊的過去交易的所有記錄。比特幣以類似的方式工作,這就是為什么您可以一直跟蹤比特幣交易直至Satoshi首次進(jìn)行加密貨幣交易的原因。
下面我們有三個(gè)區(qū)塊來創(chuàng)建區(qū)塊鏈。第一塊是創(chuàng)世塊。由于之前沒有任何內(nèi)容,因此前一個(gè)哈希字段為空。我們?nèi)匀皇褂脮r(shí)間戳記屬性和初始事務(wù)作為哈希算法的輸入。該算法將吐出一大串?dāng)?shù)字和字母,這些數(shù)字和字母代表了創(chuàng)世紀(jì)塊的哈希值。
轉(zhuǎn)到塊2,我們將創(chuàng)世塊的哈希值用作塊2先前哈希值。這個(gè)動(dòng)作將創(chuàng)世塊與第2塊聯(lián)系起來!接下來,我們將時(shí)間戳,交易列表和先前的哈希值作為我們的哈希算法的輸入。該算法將為我們提供一個(gè)新的哈希值來表示塊2。
我們將繼續(xù)重復(fù)該過程任意多次,除了區(qū)塊的有效性以及存儲(chǔ)區(qū)塊鏈的能力(比特幣的區(qū)塊鏈約為330 GB)之外,沒有任何其他限制。
在Go中創(chuàng)建一個(gè)簡單的區(qū)塊鏈
創(chuàng)建我們的區(qū)塊鏈的第一步是定義什么是區(qū)塊。Go使我們的生活更輕松地創(chuàng)建自定義類型,我們可以Block使用以下代碼來定義類型。在這里,該Block結(jié)構(gòu)具有四個(gè)字段以匹配我們上面的圖。
type Block struct { timestamp time.Time transactions []string prevHash []byte Hash []byte}
下一步是創(chuàng)建構(gòu)造函數(shù)的Go版本,以創(chuàng)建新的塊。該函數(shù)的輸入將使用一個(gè)字符串?dāng)?shù)組來表示事務(wù),以及一個(gè)字節(jié)數(shù)組來表示先前制作的塊所對(duì)應(yīng)的先前的哈希值。下一個(gè)要研究的NewHash()功能是我們下一步將實(shí)現(xiàn)的功能。
func NewBlock(transactions []string, prevHash []byte) *Block { currentTime := time.Now() return &Block { timestamp: currentTime, transactions: transactions, prevHash: prevHash, Hash: NewHash(currentTime, transactions, prevHash), }}
該NewHash()函數(shù)將時(shí)間,事務(wù)列表和以前的哈希作為我們的輸入?yún)?shù),同時(shí)返回一個(gè)字節(jié)數(shù)組來表示新生成的哈希值。在此功能中,我們基本上只是將所有輸入都混入一個(gè)稱為的單個(gè)字節(jié)數(shù)組中input。我們這樣做是使用append()功能的附加time參數(shù),prevHash通過轉(zhuǎn)換time為string用...,以追加作為后綴time片的prevHash切片。
然后,我們遍歷transactions并將每個(gè)個(gè)體附加transaction到input數(shù)據(jù)blob。有趣的語法string(rune(transaction))...只是Go中將其中的每個(gè)元素轉(zhuǎn)換transactions為可以附加到的切片的一種方法input。它正在輸入垃圾內(nèi)容,因此,如果您真的想要,請(qǐng)深入研究。
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包轉(zhuǎn)到電話sha256.Sum256()與input作為它的參數(shù)。這將為我們的所有數(shù)據(jù)輸入提供新的哈希表示。我們返回時(shí)hash[:]使用的[:]語法將hash在返回時(shí)切成適當(dāng)?shù)拈L度。
這實(shí)際上是我們開始鏈接我們的區(qū)塊鏈所需的全部。當(dāng)然,我們希望在程序中看到某種輸出,以便在打印時(shí)可以使用一些輔助方法:
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) }}
現(xiàn)在剩下的就是創(chuàng)建新的事務(wù),塊和哈希。我們可以通過我們的主要方法來做到這一點(diǎn)。我們定義了一個(gè)字符串?dāng)?shù)組來記錄我們的區(qū)塊鏈中的交易。另請(qǐng)注意,我們?nèi)绾蝹鬟f一個(gè)空字節(jié)數(shù)組NewBlock()來生成名為的第一個(gè)塊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)}
為了創(chuàng)建新的區(qū)塊,我們將前一個(gè)區(qū)塊的哈希值NewBlock()與對(duì)應(yīng)的交易歷史記錄一起傳遞。如果您想在一個(gè)地方查看整個(gè)程序,則為:
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) }}
如果要運(yùn)行此程序,將得到以下輸出:
$ 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"
過程可能會(huì)很粗糙,但這是創(chuàng)建自己的區(qū)塊鏈的基礎(chǔ)!
以上就是GO創(chuàng)建區(qū)塊鏈,怎么用GO實(shí)現(xiàn)一個(gè)簡單的區(qū)塊鏈?的詳細(xì)內(nèi)容,更多關(guān)于GO創(chuàng)建區(qū)塊鏈的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
你可能感興趣的文章
-
Mynt是什么?如何在Monad測試網(wǎng)上挖礦Mynt?
Mynt是一個(gè)去中心化的穩(wěn)定幣協(xié)議,允許用戶通過存入ETH或MON(Monad 的原生代幣)作為抵押品,鑄造與美元掛鉤的穩(wěn)定幣USDm,通過與 Mynt 進(jìn)行測試網(wǎng)互動(dòng),用戶可能有機(jī)會(huì)獲…
2025-06-06 -
如何在加密貨幣交易中應(yīng)用Black-Litterman模型?
Black-Litterman模型由Fischer Black和Robert Litterman于1991年在高盛開發(fā),Black-Litterman模型是加密貨幣交易和投資的強(qiáng)大工具,為最優(yōu)投資組合配置提供了穩(wěn)健的框架,那…
2025-06-06 -
加密貨幣交易中的諧波形態(tài):八種常用的諧波形態(tài)指南
諧波形態(tài)是依靠斐波那契比率來預(yù)示價(jià)格趨勢潛在反轉(zhuǎn)的高級(jí)圖表形態(tài),諧波形態(tài)精確且數(shù)學(xué)定義明確,使其成為重視市場預(yù)測結(jié)構(gòu)化方法的交易者的最愛,在本指南中,我們將探討諧…
2025-06-06 -
區(qū)塊鏈的多層結(jié)構(gòu)都有那些?L1 與 L2 有什么區(qū)別?新手完整指南
區(qū)塊鏈的多層結(jié)構(gòu)都有那些?區(qū)塊鏈層:完整指南區(qū)塊鏈被稱為革命性的,但其潛力的本質(zhì)在于其多層架構(gòu),這些層決定了信息在分布式網(wǎng)絡(luò)中的傳遞、驗(yàn)證、記錄和訪問方式,從硬件…
2025-06-06 -
什么是空投挖礦?如何在2025年進(jìn)行空投挖礦?
空投挖礦是指積極尋求并參與由各種加密貨幣初創(chuàng)公司或項(xiàng)目的創(chuàng)始人和創(chuàng)始人組織的空投活動(dòng),很多新手投資者還不了解什么是空投挖礦?如何在2025年進(jìn)行空投挖礦?下文將為大…
2025-06-06 -
什么是時(shí)空證明PoSt?有什么優(yōu)勢?有哪些值得關(guān)注的項(xiàng)目?
Proof-of-Space-Time(PoST)是什么?Proof-of-Space-Time(PoST)有什么優(yōu)勢?時(shí)空證明PoSt有哪些值得關(guān)注的項(xiàng)目?下面腳本之家小編給大家詳細(xì)介紹下時(shí)空證明PoSt是什么吧…
2025-06-06 -
Solana是什么?它如何運(yùn)作?與其他鏈有何不同?
Solana 是一個(gè)高性能公鏈,以其速度快、費(fèi)用低和可擴(kuò)展性而聞名,它于 2020 年上線,支持智能合約、去中心化應(yīng)用 (dApp) 和數(shù)字資產(chǎn)——與以太坊類似,但速度更快、成本更低…
2025-06-05 -
SUI上排名前五的空投項(xiàng)目有哪些?SUI 上5大最佳空投項(xiàng)目
Sui近期在DEX日交易量上超越了Base,表明盡管發(fā)生了短暫震動(dòng)網(wǎng)絡(luò)的安全事件,但用戶參與度依然強(qiáng)勁,即使在受到協(xié)議層漏洞影響后,生態(tài)系統(tǒng)仍展現(xiàn)出非凡的韌性——用戶并未…
2025-06-05 -
InfoFi與注意力經(jīng)濟(jì)平臺(tái)Kaito是什么?Kaito新手使用教學(xué)
KAITO是AI驅(qū)動(dòng)的Web3一站式資訊平臺(tái),KAITO是Kaito生態(tài)關(guān)鍵代幣,生態(tài)主要交易媒介、能質(zhì)押、能參與項(xiàng)目Launchpad、能分配獎(jiǎng)勵(lì),就像是注意力版本的$BNB代幣之于BNB生態(tài),下…
2025-06-05 -
什么是InfoFi?有哪些InfoFi項(xiàng)目值得關(guān)注?如何利用InfoFi賺錢
一個(gè)新的金融前沿正在形成——信息、注意力和數(shù)字信號(hào)成為寶貴的資產(chǎn),在本文中,我們探討了什么是InfoFi,有哪些InfoFi項(xiàng)目值得關(guān)注以及個(gè)人在這個(gè)新的信息驅(qū)動(dòng)型經(jīng)濟(jì)中如…
2025-06-05