Go實(shí)現(xiàn)區(qū)塊鏈(一)---基本原型

1.區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)圖

圖1-1

2.簡易版區(qū)塊結(jié)構(gòu) Block

//區(qū)塊結(jié)構(gòu)
type Block struct {
        //GO語言首字母大寫外部可以訪問
    Hase          []byte //hase值
    Data          []byte //交易數(shù)據(jù)
    PrevBlockHash []byte //存儲(chǔ)前一個(gè)區(qū)塊的Hase值
    Timestamp     int64  //生成區(qū)塊的時(shí)間
}

3.區(qū)塊體的Hash值的生成方式

采用sha256對(duì)區(qū)塊體數(shù)據(jù)進(jìn)行二次加密,從而構(gòu)成區(qū)塊鏈上要得到下一個(gè)區(qū)塊的hash值媚狰,是要通過計(jì)算才能得出新的hash

Hash = sha256(Data+PrevBlockHash+Timestamp)
//生成區(qū)塊hase值
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[:]
}

4.構(gòu)造一個(gè)新的區(qū)塊體函數(shù)方法

每次生成新的區(qū)塊都要計(jì)算一下hash值十性。

//生成一個(gè)新的區(qū)塊方法
func NewBlock(data string, prevBlockHash []byte) *Block{
    block := &Block{Timestamp:time.Now().Unix(), Data:[]byte(data), PrevBlockHash:prevBlockHash, Hash:[]byte{}}
    block.SetHash()
    return block
}

5.區(qū)塊鏈Blockchian

區(qū)塊鏈?zhǔn)且环N==有序衷恭、反向鏈接鏈表==的數(shù)據(jù)結(jié)乙各,構(gòu)如圖1-1杖狼。這意味著塊按照插入順序存儲(chǔ)披蕉,并且每個(gè)塊都鏈接到前一個(gè)塊梆暖。該結(jié)構(gòu)允許快速獲取鏈中的最新塊伞访,并通過其哈希(有效)獲取塊。

在Golang中轰驳,這個(gè)結(jié)構(gòu)可以通過使用數(shù)組和地圖來實(shí)現(xiàn):數(shù)組可以保持有序散列(數(shù)組在Go中排序)厚掷,并且映射可以保持hash → block對(duì)(地圖無序)。但是對(duì)于我們的區(qū)塊鏈原型级解,我們只需要使用一個(gè)數(shù)組冒黑,因?yàn)槲覀儸F(xiàn)在不需要通過它們的哈希來獲取塊。

// 區(qū)塊鏈
type Blockchain struct {
    Blocks []*Block
}


// 保存區(qū)塊數(shù)據(jù)
func (bc *Blockchain) AddBlock(data string) {
    //獲取上一個(gè)區(qū)塊
    prevBlock := bc.Blocks[len(bc.Blocks)-1]
    //創(chuàng)建一個(gè)新的區(qū)塊
    newBlock := NewBlock(data, prevBlock.Hash)
    //新的區(qū)塊添加到數(shù)組中
    bc.Blocks = append(bc.Blocks, newBlock)
}

6.創(chuàng)世塊

我們知道區(qū)塊鏈中必須有一個(gè)創(chuàng)世塊勤哗,也就是我們數(shù)組中的第一個(gè)元素抡爹,下面分別在block和Blockchian將定義一個(gè)創(chuàng)世塊的方法。

//創(chuàng)世塊方法
func  NewGenesisBlock() *Block {
    return NewBlock("Genesis Block", []byte{})
}

// 創(chuàng)建創(chuàng)世塊
func NewBlockchain() *Blockchain {
    //go語言&表示獲取存儲(chǔ)的內(nèi)存地址
    return &Blockchain{[]*Block{NewGenesisBlock()}}
}

7.創(chuàng)建一個(gè)main演示區(qū)塊查看區(qū)塊信息

func main() {
    //創(chuàng)世塊
    bc :=block.NewBlockchain()
    //添加第2塊
    bc.AddBlock("Send 1 BTC to even")
    //添加第3塊
    bc.AddBlock("Send 2 more BTC to even")
        //迭代數(shù)組里面的數(shù)據(jù)
    for _, block := range bc.Blocks {
        fmt.Printf("Prev. hash: %x\n", block.PrevBlockHash)
        fmt.Printf("Data: %s\n", block.Data)
        fmt.Printf("Hash: %x\n", block.Hash)
        fmt.Println()
    }
}
輸出結(jié)果:
Prev. hash: 
Data: Genesis Block
Hash: 865d72643b2e266ec4ec47613090cb98d1944f8bd388907dc4376332f06f4e21

Prev. hash: 865d72643b2e266ec4ec47613090cb98d1944f8bd388907dc4376332f06f4e21
Data: Send 1 BTC to even
Hash: fe7f424421604eed708a1276ae75f70521ecf355bb9a3c4400a7cc0565016d02

Prev. hash: fe7f424421604eed708a1276ae75f70521ecf355bb9a3c4400a7cc0565016d02
Data: Send 2 more BTC to even
Hash: fcd625b2c35ff8cbe24fda49a43a6c8cd2723a4275631ecc813025f6f10fbc87


Process finished with exit code 0

資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芒划,一起剝皮案震驚了整個(gè)濱河市冬竟,隨后出現(xiàn)的幾起案子欧穴,更是在濱河造成了極大的恐慌,老刑警劉巖泵殴,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涮帘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡袋狞,警方通過查閱死者的電腦和手機(jī)焚辅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苟鸯,“玉大人,你說我怎么就攤上這事棚点≡绱Γ” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵瘫析,是天一觀的道長砌梆。 經(jīng)常有香客問我,道長贬循,這世上最難降的妖魔是什么咸包? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮杖虾,結(jié)果婚禮上烂瘫,老公的妹妹穿的比我還像新娘。我一直安慰自己奇适,他們只是感情好坟比,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嚷往,像睡著了一般葛账。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上皮仁,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天籍琳,我揣著相機(jī)與錄音,去河邊找鬼贷祈。 笑死趋急,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的付燥。 我是一名探鬼主播宣谈,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼键科!你這毒婦竟也來了闻丑?” 一聲冷哼從身側(cè)響起漩怎,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嗦嗡,沒想到半個(gè)月后勋锤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侥祭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年叁执,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矮冬。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谈宛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胎署,到底是詐尸還是另有隱情吆录,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布琼牧,位于F島的核電站恢筝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏巨坊。R本人自食惡果不足惜撬槽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望趾撵。 院中可真熱鬧侄柔,春花似錦、人聲如沸鼓寺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妈候。三九已至敢靡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苦银,已是汗流浹背啸胧。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幔虏,地道東北人纺念。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像想括,于是被迫代替她去往敵國和親陷谱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容