成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用 Go 構(gòu)建一個(gè)區(qū)塊鏈 ---- Part 1: 基本原型

ZoomQuiet / 3408人閱讀

摘要:在區(qū)塊鏈中,存儲(chǔ)有效信息的是區(qū)塊。存儲(chǔ)的是前一個(gè)塊的哈希。正是由于這個(gè)特性,才使得區(qū)塊鏈?zhǔn)前踩?。這樣的結(jié)構(gòu),能夠讓我們快速地獲取鏈上的最新塊,并且高效地通過哈希來檢索一個(gè)塊。

翻譯的系列文章我已經(jīng)放到了 GitHub 上:blockchain-tutorial,后續(xù)如有更新都會(huì)在 GitHub 上,可能就不在這里同步了。如果想直接運(yùn)行代碼,也可以 clone GitHub 上的教程倉(cāng)庫,進(jìn)入 src 目錄執(zhí)行 make 即可。


引言

區(qū)塊鏈?zhǔn)?21 世紀(jì)最具革命性的技術(shù)之一,它仍然處于不斷成長(zhǎng)的階段,而且還有很多潛力尚未顯現(xiàn)出來。 本質(zhì)上,區(qū)塊鏈只是一個(gè)分布式數(shù)據(jù)庫而已。 不過,使它獨(dú)一無二的是,區(qū)塊鏈?zhǔn)且粋€(gè)公開的數(shù)據(jù)庫,而不是一個(gè)私人數(shù)據(jù)庫,也就是說,每個(gè)使用它的人都有一個(gè)完整或部分的副本。 只有經(jīng)過其他數(shù)據(jù)庫管理員的同意,才能向數(shù)據(jù)庫中添加新的記錄。 此外,也正是由于區(qū)塊鏈,才使得加密貨幣和智能合約成為現(xiàn)實(shí)。

在本系列文章中,我們將實(shí)現(xiàn)一個(gè)簡(jiǎn)化版的區(qū)塊鏈,基于它來構(gòu)建簡(jiǎn)化版的加密貨幣。

區(qū)塊

讓我們從 “區(qū)塊鏈” 中的 “區(qū)塊” 談起。在區(qū)塊鏈中,存儲(chǔ)有效信息的是區(qū)塊。比如,比特幣區(qū)塊存儲(chǔ)的有效信息,就是比特幣交易,交易信息也是所有加密貨幣的本質(zhì)。除此以外,區(qū)塊還包含了一些技術(shù)信息,比如版本,當(dāng)前時(shí)間戳和前一個(gè)區(qū)塊的哈希。

在本文中,我們并不會(huì)實(shí)現(xiàn)一個(gè)像比特幣技術(shù)規(guī)范所描述的區(qū)塊鏈,而是實(shí)現(xiàn)一個(gè)簡(jiǎn)化版的區(qū)塊鏈,它僅包含了一些關(guān)鍵信息。看起來就像是這樣:

type Block struct {
    Timestamp     int64
    Data          []byte
    PrevBlockHash []byte
    Hash          []byte
}

Timestamp 是當(dāng)前時(shí)間戳,也就是區(qū)塊創(chuàng)建的時(shí)間。

Data 是區(qū)塊存儲(chǔ)的實(shí)際有效的信息。

PrevBlockHash 存儲(chǔ)的是前一個(gè)塊的哈希。

Hash 是當(dāng)前塊的哈希。

在比特幣技術(shù)規(guī)范中,Timestamp, PrevBlockHash, Hash 是區(qū)塊頭(block header),區(qū)塊頭是一個(gè)多帶帶的數(shù)據(jù)結(jié)構(gòu)。而交易,也就是這里的 Data, 是另一個(gè)多帶帶的數(shù)據(jù)結(jié)構(gòu)。為了簡(jiǎn)便起見,我把這兩個(gè)混合在了一起。

那么,我們要如何計(jì)算哈希呢?如何計(jì)算哈希,是區(qū)塊鏈一個(gè)非常重要的部分。正是由于這個(gè)特性,才使得區(qū)塊鏈?zhǔn)前踩摹S?jì)算一個(gè)哈希,是在計(jì)算上非常困難的一個(gè)操作。即使在高速電腦上,也要花費(fèi)不少時(shí)間 (這就是為什么人們會(huì)購(gòu)買 GPU 來挖比特幣) 。這是一個(gè)有意為之的架構(gòu)設(shè)計(jì),它故意使得加入新的區(qū)塊十分困難,因此可以保證區(qū)塊一旦被加入以后,就很難再進(jìn)行修改。在本系列未來幾篇文章中,我們將會(huì)討論和實(shí)現(xiàn)這個(gè)機(jī)制。

目前,我們僅取了 Block 結(jié)構(gòu)的一些字段(Timestamp, Data 和 PrevBlockHash),并將它們相互連接起來,然后在連接后的結(jié)果上計(jì)算一個(gè) SHA-256 的哈希. 讓我們?cè)?SetHash 方法中完成這個(gè)任務(wù):

func (b *Block) SetHash() {
    timestamp := []byte(strconv.FormatInt(b.Timestamp, 10))
    headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{})
    hash := sha256.Sum256(headers)

    b.Hash = hash[:]
}

接下來,按照 Golang 的慣例,我們會(huì)實(shí)現(xiàn)一個(gè)用于簡(jiǎn)化創(chuàng)建一個(gè)區(qū)塊的函數(shù):

func NewBlock(data string, prevBlockHash []byte) *Block {
    block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}}
    block.SetHash()
    return block
}

這就是區(qū)塊部分的全部?jī)?nèi)容了!

區(qū)塊鏈

下面讓我們來實(shí)現(xiàn)一個(gè)區(qū)塊鏈。本質(zhì)上,區(qū)塊鏈僅僅是一個(gè)有著特定結(jié)構(gòu)的數(shù)據(jù)庫,是一個(gè)有序,后向連接的列表。這也就是說,區(qū)塊按照插入的順序進(jìn)行存儲(chǔ),每個(gè)塊都被連接到前一個(gè)塊。這樣的結(jié)構(gòu),能夠讓我們快速地獲取鏈上的最新塊,并且高效地通過哈希來檢索一個(gè)塊。

在 Golang 中,可以通過一個(gè) array 和 map 來實(shí)現(xiàn)這個(gè)結(jié)構(gòu):array 存儲(chǔ)有序的哈希(Golang 中 array 是有序的),map 存儲(chǔ) hask -> block 對(duì)(Golang 中, map 是無序的)。 但是在基本的原型階段,我們只用到了 array,因?yàn)楝F(xiàn)在還不需要通過哈希來獲取塊。

type Blockchain struct {
    blocks []*Block
}

這就是我們的第一個(gè)區(qū)塊鏈!我從來沒有想過它會(huì)是這么容易。

現(xiàn)在,讓我們能夠給它添加一個(gè)塊:

func (bc *Blockchain) AddBlock(data string) {
    prevBlock := bc.blocks[len(bc.blocks)-1]
    newBlock := NewBlock(data, prevBlock.Hash)
    bc.blocks = append(bc.blocks, newBlock)
}

完成!不過,真的就這樣了嗎?

為了加入一個(gè)新的塊,我們必須要有一個(gè)已有的塊,但是,現(xiàn)在我們的鏈?zhǔn)强盏模粋€(gè)塊都沒有!所以,在任何一個(gè)區(qū)塊鏈中,都必須至少有一個(gè)塊。這樣的塊,也就是鏈中的第一個(gè)塊,通常叫做創(chuàng)世塊(genesis block). 讓我們實(shí)現(xiàn)一個(gè)方法來創(chuàng)建一個(gè)創(chuàng)世塊:

func NewGenesisBlock() *Block {
    return NewBlock("Genesis Block", []byte{})
}

現(xiàn)在,我們可以實(shí)現(xiàn)一個(gè)函數(shù)來創(chuàng)建有創(chuàng)世塊的區(qū)塊鏈:

func NewBlockchain() *Blockchain {
    return &Blockchain{[]*Block{NewGenesisBlock()}}
}

來檢查一個(gè)我們的區(qū)塊鏈?zhǔn)欠袢缙诠ぷ鳎?/p>

func main() {
    bc := NewBlockchain()

    bc.AddBlock("Send 1 BTC to Ivan")
    bc.AddBlock("Send 2 more BTC to Ivan")

    for _, block := range bc.blocks {
        fmt.Printf("Prev. hash: %x
", block.PrevBlockHash)
        fmt.Printf("Data: %s
", block.Data)
        fmt.Printf("Hash: %x
", block.Hash)
        fmt.Println()
    }
}

輸出:

Prev. hash:
Data: Genesis Block
Hash: aff955a50dc6cd2abfe81b8849eab15f99ed1dc333d38487024223b5fe0f1168

Prev. hash: aff955a50dc6cd2abfe81b8849eab15f99ed1dc333d38487024223b5fe0f1168
Data: Send 1 BTC to Ivan
Hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1

Prev. hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1
Data: Send 2 more BTC to Ivan
Hash: 561237522bb7fcfbccbc6fe0e98bbbde7427ffe01c6fb223f7562288ca2295d1

總結(jié)

我們創(chuàng)建了一個(gè)非常簡(jiǎn)單的區(qū)塊鏈原型:它僅僅是一個(gè)數(shù)組構(gòu)成的一系列區(qū)塊,每個(gè)塊都與前一個(gè)塊相關(guān)聯(lián)。真實(shí)的區(qū)塊鏈要比這復(fù)雜得多。在我們的區(qū)塊鏈中,加入新的塊非常簡(jiǎn)單,而且很快,但是在真實(shí)的區(qū)塊鏈中,加入新的塊需要很多工作:你必須要經(jīng)過十分繁重的計(jì)算(這個(gè)機(jī)制叫做工作量證明),來獲得添加一個(gè)新塊的權(quán)力。并且,區(qū)塊鏈?zhǔn)且粋€(gè)沒有單一決策者的分布式數(shù)據(jù)庫。因此,一個(gè)新的塊必須要被網(wǎng)絡(luò)的其他參與者確認(rèn)和同意(這個(gè)機(jī)制叫做共識(shí)(consensus))。還有一點(diǎn),我們的區(qū)塊鏈還沒有任何的交易!

在接下來的文章的我們將會(huì)一一覆蓋這些特性。


本文涉及的源代碼:part_1

區(qū)塊哈希算法:https://en.bitcoin.it/wiki/Bl...

原文:

Building Blockchain in Go. Part 1: Basic Prototype

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/23945.html

相關(guān)文章

  • Go 構(gòu)建一個(gè)區(qū)塊 -- Part 7: 網(wǎng)絡(luò)

    摘要:盡管我們不會(huì)實(shí)現(xiàn)一個(gè)真實(shí)的網(wǎng)絡(luò),但是我們會(huì)實(shí)現(xiàn)一個(gè)真是,也是比特幣最常見最重要的用戶場(chǎng)景。不過,這并不是處于禮貌用于找到一個(gè)更長(zhǎng)的區(qū)塊鏈。意為給我看一下你有什么區(qū)塊在比特幣中,這會(huì)更加復(fù)雜。 翻譯的系列文章我已經(jīng)放到了 GitHub 上:blockchain-tutorial,后續(xù)如有更新都會(huì)在 GitHub 上,可能就不在這里同步了。如果想直接運(yùn)行代碼,也可以 clone GitHu...

    lingdududu 評(píng)論0 收藏0
  • Go 構(gòu)建一個(gè)區(qū)塊 -- Part 6: 交易(2)

    摘要:到目前為止,我們幾乎已經(jīng)實(shí)現(xiàn)了一個(gè)區(qū)塊鏈數(shù)據(jù)庫的所有元素。使用根據(jù)在區(qū)塊鏈中找到一筆交易。是一個(gè)比特幣輕節(jié)點(diǎn),它不需要下載整個(gè)區(qū)塊鏈,也不需要驗(yàn)證區(qū)塊和交易。到目前為止,我們只是將一個(gè)塊里面的每筆交易哈希連接了起來,將在上面應(yīng)用了算法。 翻譯的系列文章我已經(jīng)放到了 GitHub 上:blockchain-tutorial,后續(xù)如有更新都會(huì)在 GitHub 上,可能就不在這里同步了。如果...

    spacewander 評(píng)論0 收藏0
  • Go 構(gòu)建一個(gè)區(qū)塊 -- Part 2: 工作量證明

    摘要:哈希函數(shù)被廣泛用于檢測(cè)數(shù)據(jù)的一致性。在區(qū)塊鏈中,哈希被用于保證一個(gè)塊的一致性。比特幣使用,一個(gè)最初用來防止垃圾郵件的工作量證明算法。下面是與前面例子哈希的形式化比較第一個(gè)哈?;谟?jì)算比目標(biāo)要大,因此它并不是一個(gè)有效的工作量證明。 翻譯的系列文章我已經(jīng)放到了 GitHub 上:blockchain-tutorial,后續(xù)如有更新都會(huì)在 GitHub 上,可能就不在這里同步了。如果想直接運(yùn)...

    suxier 評(píng)論0 收藏0
  • Go 構(gòu)建一個(gè)區(qū)塊 -- Part 3: 持久化和命令行接口

    摘要:引言到目前為止,我們已經(jīng)構(gòu)建了一個(gè)有工作量證明機(jī)制的區(qū)塊鏈。在今天的內(nèi)容中,我們會(huì)將區(qū)塊鏈持久化到一個(gè)數(shù)據(jù)庫中,然后會(huì)提供一個(gè)簡(jiǎn)單的命令行接口,用來完成一些與區(qū)塊鏈的交互操作。這同樣也意味著,一個(gè)也就是區(qū)塊鏈的一種標(biāo)識(shí)符。 翻譯的系列文章我已經(jīng)放到了 GitHub 上:blockchain-tutorial,后續(xù)如有更新都會(huì)在 GitHub 上,可能就不在這里同步了。如果想直接運(yùn)行代碼...

    felix0913 評(píng)論0 收藏0
  • Go 構(gòu)建一個(gè)區(qū)塊 -- Part 4: 交易(1

    摘要:引言交易是比特幣的核心所在,而區(qū)塊鏈的唯一目的,也正是為了能夠安全可靠地存儲(chǔ)交易。比特幣使用了一個(gè)更加復(fù)雜的技術(shù)它將一個(gè)塊里面包含的所有交易表示為一個(gè),然后在工作量證明系統(tǒng)中使用樹的根哈希。 翻譯的系列文章我已經(jīng)放到了 GitHub 上:blockchain-tutorial,后續(xù)如有更新都會(huì)在 GitHub 上,可能就不在這里同步了。如果想直接運(yùn)行代碼,也可以 clone GitHu...

    graf 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<