成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用Go實現區塊鏈

區塊鏈
自互聯網以來,鎖鏈技術已被某些人稱為最有影響力的發明。盡管公眾將區塊鏈與投機性加密貨幣同義解釋,但區塊鏈實際上在現代世界中具有不可思議的廣泛應用。

[[392202]]

本文轉載自微信公眾號「區塊鏈研究實驗室」,作者鏈三豐。轉載本文請聯系區塊鏈研究實驗室公眾號。

自互聯網以來,鎖鏈技術已被某些人稱為最有影響力的發明。盡管公眾將區塊鏈與投機性加密貨幣同義解釋,但區塊鏈實際上在現代世界中具有不可思議的廣泛應用。實際上,加密貨幣只是區塊鏈領域的一小部分,生產中的許多解決方案都是由私人組織領導來實現的。

隨著區塊鏈技術的迅速發展,技術領域的專業人員越來越需要了解區塊鏈的基礎知識及其技術影響力。

畢竟,實現自己的區塊鏈實際上并不像聽起來那樣復雜。本文中,我們將使用2021年最流行的編程語言之一GoLang實現基本的區塊鏈。那么,讓我們開始吧!

了解區塊鏈

區塊鏈是名稱符合其含義的少數技術之一。我們可以將區塊鏈視為通過哈希相互連接的信息塊,哈希是從輸入數據生成的加密的固定輸出。由于每個塊都通過哈希相互引用,因此如果不大幅度更改鏈的其余部分,就不可能更改鏈的任何部分。

區塊鏈中的每個塊都可以包含幾乎任何內容的數據。一個基本框架將包括每個塊的過去交易的所有記錄。比特幣以類似的方式工作,這就是為什么您可以一直跟蹤比特幣交易直至Satoshi首次進行加密貨幣交易的原因。

下面我們有三個區塊來創建區塊鏈。第一塊是創世塊。由于之前沒有任何內容,因此前一個哈希字段為空。我們仍然使用時間戳記屬性和初始事務作為哈希算法的輸入。該算法將吐出一大串數字和字母,這些數字和字母代表了創世紀塊的哈希值。

轉到塊2,我們將創世塊的哈希值用作塊2先前哈希值。這個動作將創世塊與第2塊聯系起來!接下來,我們將時間戳,交易列表和先前的哈希值作為我們的哈希算法的輸入。該算法將為我們提供一個新的哈希值來表示塊2。

我們將繼續重復該過程任意多次,除了區塊的有效性以及存儲區塊鏈的能力(比特幣的區塊鏈約為330 GB)之外,沒有任何其他限制。

在Go中創建一個簡單的區塊鏈

創建我們的區塊鏈的第一步是定義什么是區塊。Go使我們的生活更輕松地創建自定義類型,我們可以Block使用以下代碼來定義類型。在這里,該Block結構具有四個字段以匹配我們上面的圖。

  1. type Block struct { 
  2.   timestamp  time.Time 
  3.   transactions  []string 
  4.   prevHash  []byte 
  5.   Hash    []byte 

下一步是創建構造函數的Go版本,以創建新的塊。該函數的輸入將使用一個字符串數組來表示事務,以及一個字節數組來表示先前制作的塊所對應的先前的哈希值。下一個要研究的NewHash()功能是我們下一步將實現的功能。

  1. func NewBlock(transactions []string, prevHash []byte) *Block { 
  2.   currentTime := time.Now() 
  3.   return &Block { 
  4.     timestamp: currentTime, 
  5.     transactions: transactions, 
  6.     prevHash: prevHash, 
  7.     Hash: NewHash(currentTime, transactions, prevHash), 
  8.   } 

該NewHash()函數將時間,事務列表和以前的哈希作為我們的輸入參數,同時返回一個字節數組來表示新生成的哈希值。在此功能中,我們基本上只是將所有輸入都混入一個稱為的單個字節數組中input。我們這樣做是使用append()功能的附加time參數,prevHash通過轉換time為string用...,以追加作為后綴time片的prevHash切片。

然后,我們遍歷transactions并將每個個體附加transaction到input數據blob。有趣的語法string(rune(transaction))...只是Go中將其中的每個元素轉換transactions為可以附加到的切片的一種方法input。它正在輸入垃圾內容,因此,如果您真的想要,請深入研究。

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

最后,我們使用crypto包轉到電話sha256.Sum256()與input作為它的參數。這將為我們的所有數據輸入提供新的哈希表示。我們返回時hash[:]使用的[:]語法將hash在返回時切成適當的長度。

這實際上是我們開始鏈接我們的區塊鏈所需的全部。當然,我們希望在程序中看到某種輸出,以便在打印時可以使用一些輔助方法:

  1. func printBlockInformation(block *Block) { 
  2.   fmt.Printf("\ttime: %s\n", block.timestamp.String()) 
  3.   fmt.Printf("\tprevHash: %x\n", block.prevHash) 
  4.   fmt.Printf("\tHash: %x\n", block.Hash) 
  5.   printTransactions(block) 
  6.  
  7. func printTransactions(block *Block) { 
  8.   fmt.Println("\tTransactions:"
  9.   for i, transaction := range block.transactions { 
  10.     fmt.Printf("\t\t%v: %q\n", i, transaction
  11.   } 

現在剩下的就是創建新的事務,塊和哈希。我們可以通過我們的主要方法來做到這一點。我們定義了一個字符串數組來記錄我們的區塊鏈中的交易。另請注意,我們如何傳遞一個空字節數組NewBlock()來生成名為的第一個塊genesisBlock。

  1. func main() { 
  2.   genesisTransactions := []string{"Izzy sent Will 50 bitcoin""Will sent Izzy 30 bitcoin"
  3.   genesisBlock := NewBlock(genesisTransactions, []byte{}) 
  4.   fmt.Println("--- First Block ---"
  5.   printBlockInformation(genesisBlock) 
  6.  
  7.   block2Transactions := []string{"John sent Izzy 30 bitcoin"
  8.   block2 := NewBlock(block2Transactions, genesisBlock.Hash) 
  9.   fmt.Println("--- Second Block ---"
  10.   printBlockInformation(block2) 
  11.  
  12.   block3Transactions := []string{"Will sent Izzy 45 bitcoin""Izzy sent Will 10 bitcoin"
  13.   block3 := NewBlock(block3Transactions, block2.Hash) 
  14.   fmt.Println("--- Third Block ---"
  15.   printBlockInformation(block3) 

為了創建新的區塊,我們將前一個區塊的哈希值NewBlock()與對應的交易歷史記錄一起傳遞。如果您想在一個地方查看整個程序,則為:

  1. package main 
  2.  
  3. import ( 
  4.   "crypto/sha256" 
  5.   "fmt" 
  6.   "time" 
  7.  
  8. type Block struct { 
  9.   timestamp    time.Time 
  10.   transactions  []string 
  11.   prevHash    []byte 
  12.   Hash      []byte 
  13.  
  14. func main() { 
  15.   genesisTransactions := []string{"Izzy sent Will 50 bitcoin""Will sent Izzy 30 bitcoin"
  16.   genesisBlock := NewBlock(genesisTransactions, []byte{}) 
  17.   fmt.Println("--- First Block ---"
  18.   printBlockInformation(genesisBlock) 
  19.  
  20.   block2Transactions := []string{"John sent Izzy 30 bitcoin"
  21.   block2 := NewBlock(block2Transactions, genesisBlock.Hash) 
  22.   fmt.Println("--- Second Block ---"
  23.   printBlockInformation(block2) 
  24.  
  25.   block3Transactions := []string{"Will sent Izzy 45 bitcoin""Izzy sent Will 10 bitcoin"
  26.   block3 := NewBlock(block3Transactions, block2.Hash) 
  27.   fmt.Println("--- Third Block ---"
  28.   printBlockInformation(block3) 
  29.  
  30. func NewBlock(transactions []string, prevHash []byte) *Block { 
  31.   currentTime := time.Now() 
  32.   return &Block { 
  33.     timestamp: currentTime, 
  34.     transactions: transactions, 
  35.     prevHash: prevHash, 
  36.     Hash: NewHash(currentTime, transactions, prevHash), 
  37.   } 
  38.  
  39. func NewHash(time time.Time, transactions []string, prevHash []byte) []byte { 
  40.   input := append(prevHash, time.String()...) 
  41.   for transaction := range transactions { 
  42.     input = append(input, string(rune(transaction))...) 
  43.   } 
  44.   hash := sha256.Sum256(input) 
  45.   return hash[:] 
  46.  
  47. func printBlockInformation(block *Block) { 
  48.   fmt.Printf("\ttime: %s\n", block.timestamp.String()) 
  49.   fmt.Printf("\tprevHash: %x\n", block.prevHash) 
  50.   fmt.Printf("\tHash: %x\n", block.Hash) 
  51.   printTransactions(block) 
  52.  
  53. func printTransactions(block *Block) { 
  54.   fmt.Println("\tTransactions:"
  55.   for i, transaction := range block.transactions { 
  56.     fmt.Printf("\t\t%v: %q\n", i, transaction
  57.   } 

如果要運行此程序,將得到以下輸出:

  1. $ go run example.go  
  2. --- First Block --- 
  3.         time: 2021-04-05 15:12:18.813294 -0600 MDT m=+0.000074939 
  4.         prevHash:  
  5.         Hash: 43ec51c50d2b9565f221155a29d8b72307247b08eaf6731cca 
  6.         Transactions: 
  7.                 0: "Izzy sent Will 50 bitcoin" 
  8.                 1: "Will sent Izzy 30 bitcoin" 
  9. --- Second Block --- 
  10.         time: 2021-04-05 15:12:18.813477 -0600 MDT m=+0.000257244 
  11.         prevHash: 43ec51c50d2b9565f221155a29d8b72307247b08eaf6731cca 
  12.         Hash: fcce5323a35cb67b45fe75866582db00fd32baeb92aac448c7 
  13.         Transactions: 
  14.                 0: "John sent Izzy 30 bitcoin" 
  15. --- Third Block --- 
  16.         time: 2021-04-05 15:12:18.813488 -0600 MDT m=+0.000269168 
  17.         prevHash: fcce5323a35cb67b45fe75866582db00fd32baeb92aac448c7 
  18.         Hash: fc1d3eee286970d85812b47c3a5bf016ae8c1de4f86b8ace972ffa 
  19.         Transactions: 
  20.                 0: "Will sent Izzy 45 bitcoin" 
  21.                 1: "Izzy sent Will 10 bitcoin" 

過程可能會很粗糙,但這是創建自己的區塊鏈的基礎!

責任編輯:武曉燕 來源: 區塊鏈研究實驗室
相關推薦

2021-04-16 20:43:18

Go區塊鏈編程

2022-07-18 23:49:19

區塊鏈民主數據

2022-01-10 10:56:37

區塊鏈技術比特幣

2019-04-03 10:50:09

Javascript區塊鏈技術

2020-09-04 08:33:17

區塊鏈病例電子病例

2021-09-23 22:40:10

區塊鏈比特幣技術

2021-04-08 18:39:57

JavaScriptExpress區塊鏈

2018-03-27 09:52:30

區塊鏈數字貨幣比特幣

2023-06-13 11:49:35

2021-12-13 14:05:27

區塊鏈金融技術

2021-05-10 15:09:47

區塊鏈互聯網金融

2021-02-20 22:35:17

區塊鏈比特幣記賬

2021-09-02 00:25:46

區塊鏈互聯網技術

2018-06-14 10:32:25

2019-01-24 15:50:06

區塊鏈數字貨幣比特幣

2020-12-22 14:33:25

區塊鏈行業發展物聯網

2022-03-09 15:22:41

區塊鏈比特幣數字技術

2022-10-11 09:05:58

IPFS區塊鏈存儲

2018-05-06 16:17:01

2020-08-18 10:58:05

區塊鏈比特幣區塊鏈戰略
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 56pao在线 | 99热精品在线| 本道综合精品 | 久久精品国产久精国产 | 五月激情婷婷六月 | 九九天堂网 | 精品无码久久久久国产 | 日本视频免费观看 | 五月激情婷婷在线 | 国产精品美女 | 久久精品国产v日韩v亚洲 | 男女精品久久 | 91麻豆精品国产91久久久久久久久 | 青青艹在线视频 | 欧洲精品在线观看 | 国产免费观看一区 | 狠狠入ady亚洲精品经典电影 | av看片网| 亚洲综合久久精品 | 精品国产鲁一鲁一区二区张丽 | 国产一级电影在线观看 | 羞羞视频在线观看免费观看 | 在线不卡一区 | 欧美一区二区三区视频 | 欧美一级免费片 | 欧美视频在线看 | av激情影院| 亚洲综合在线一区 | 亚洲一区久久 | 天堂中文资源在线 | 亚洲精品中文字幕在线观看 | 免费黄色片在线观看 | 九九久久国产 | 亚洲 精品 综合 精品 自拍 | 一级做a爰片性色毛片 | 国产一区二区视频在线观看 | 男女视频免费 | 欧美在线视频不卡 | 日韩欧美手机在线 | 视频一区二区在线观看 | 毛色毛片免费看 |