国产精品久久久久久久,亚洲中文字幕在线观看,中文字幕在线观看,鲁大师在线日韩免费  
您現(xiàn)在的位置:首頁(yè) ? 知識(shí)庫(kù) ? 軟件開(kāi)發(fā) 軟件開(kāi)發(fā)
年輕人的第一個(gè)區(qū)塊鏈
發(fā)布日期:2018-04-08

準(zhǔn)備工作:

  1. 安裝go開(kāi)發(fā)環(huán)境

  2. 用go搭建web服務(wù)

  3. go語(yǔ)言基礎(chǔ)

安裝go開(kāi)發(fā)環(huán)境

到https://golang.org/dl/這個(gè)地址下載對(duì)應(yīng)的安裝包,mac ,windows,linux都有(需要科學(xué)上網(wǎng))。以mac為例,下載成功后雙擊安裝下一步即可,很簡(jiǎn)單。安裝成功后運(yùn)行g(shù)o version查看版本(如果沒(méi)有的話,就重啟一下終端)

用go搭建web服務(wù)

在這里咱們用的是Gorilla/mux包。步驟:

  1. 創(chuàng)建NewRouter

  2. 設(shè)置端口號(hào)

  3. 設(shè)置http的參數(shù)字典

  4. 調(diào)用ListenAndServe方法,啟動(dòng)服務(wù)

go語(yǔ)言基礎(chǔ)

  1. 導(dǎo)包:多個(gè)包用小括號(hào)括起來(lái)

  1. import (

"sync"

"time"

)

  1. 使用點(diǎn)調(diào)用方法:

  1. time.Now()

  1. 聲明變量:

  1. var coin int 用空格隔開(kāi),類(lèi)型寫(xiě)到后面,變量名寫(xiě)中間,最后是個(gè)var

  2. coin := 10 也可以省略var,用:=來(lái)賦值,但是必須保證coin沒(méi)有聲明過(guò),否則會(huì)報(bào)錯(cuò)

  3. coin1,coin2 := 10,20 。 多變量聲明是這樣的

  1. 條件控制:

  1. if a<b {

return 10

}else{

return 20

}

  1. 循環(huán)控制:

  1. for a := 0; a < 10; a++ {

fmt.Printf("a: %d ", a)

}

  1. 函數(shù)定義,傳參:

  1. /* 函數(shù)返回兩個(gè)數(shù)的最大值 */

  2. func max(num1, num2 int) int {

}

  1. num1, num2 int表示兩個(gè)整形參數(shù),是可選的,也可以不填,

  2. 最后的int是返回值的類(lèi)型

  3. 調(diào)用函數(shù)通過(guò)這樣方式:n := max(a, b)

  • 結(jié)構(gòu)體定義,賦值,調(diào)用:

  1. 定義:type Article struct { title string id int}

  2. 賦值:var a1 Article

a1.title = "寫(xiě)代碼"

  1. 調(diào)用:fmt.Printf( "title : %s ", a1.title)

了解這些,今天的代碼就能看懂了,當(dāng)然go語(yǔ)言還有很多要學(xué)習(xí)的知識(shí)點(diǎn),可以到這里來(lái)http://www.runoob.com/go/go-tutorial.html學(xué)習(xí)

整理思路:

根據(jù)之前了解的區(qū)塊鏈原理和共識(shí)算法,我們整理一下需要實(shí)現(xiàn)哪些方法:

  1. 一個(gè)區(qū)塊需要包含哪些信息:

  1. Index :這個(gè)區(qū)塊在整個(gè)鏈中的索引

  2. Timestamp : 區(qū)塊生成時(shí)的時(shí)間戳

  3. Hash : 區(qū)塊通過(guò) SHA256 算法生成的哈希值

  4. PrevHash : 前一個(gè)區(qū)塊的 SHA256 哈希值

  5. content : 需要記錄的內(nèi)容

  1. 計(jì)算哈希值的函數(shù)

  2. 生成新區(qū)塊的函數(shù)

  3. 根據(jù)不可篡改性,我們還需要一個(gè)驗(yàn)證區(qū)塊是否被篡改的函數(shù)

  4. 啟動(dòng)web服務(wù)的函數(shù)

創(chuàng)建區(qū)塊結(jié)構(gòu)體:

type Block struct {

Index int

Timestamp string

Content string

Hash string

PrevHash string

}

計(jì)算哈希值:(把區(qū)塊結(jié)構(gòu)體中的信息都拼在一起,然后Hash算出來(lái))

func calculateHash(block Block) string {

record := strconv.Itoa(block.Index) + block.Timestamp + strconv.Itoa(block.Content) + block.PrevHash

h := sha256.New()

h.Write([]byte(record))

hashed := h.Sum(nil)

return hex.EncodeToString(hashed)

}

生成新區(qū)塊:(上一個(gè)區(qū)塊的索引加1,上一個(gè)區(qū)塊的Hash賦值給當(dāng)前區(qū)塊的PrevHash,當(dāng)前區(qū)塊的Hash由calculateHash函數(shù)生成)

func generateBlock(oldBlock Block, Content string) Block {

var newBlock Block

t := time.Now()

newBlock.Index = oldBlock.Index + 1

newBlock.Timestamp = t.String()

newBlock.Content = Content

newBlock.PrevHash = oldBlock.Hash

newBlock.Hash = calculateHash(newBlock)

return newBlock

}

驗(yàn)證區(qū)塊:(根據(jù)索引和Hash值判斷,老索引加1應(yīng)該等于新索引,新的PrevHash應(yīng)該等于老的Hash,最后還要重新計(jì)算一個(gè)新區(qū)塊的Hash,看是否和傳過(guò)來(lái)的一樣)

func isBlockValid(newBlock, oldBlock Block) bool {

if oldBlock.Index+1 != newBlock.Index {

return false

}

if oldBlock.Hash != newBlock.PrevHash {

return false

}

if calculateHash(newBlock) != newBlock.Hash {

return false

}

return true

}

啟動(dòng)web服務(wù):

//設(shè)置http需要的參數(shù),并開(kāi)啟服務(wù)

func run() error {

mux := makeMuxRouter()

httpAddr := os.Getenv("ADDR")

log.Println("Listening on ", os.Getenv("ADDR"))

s := &http.Server{

Addr: ":" + httpAddr,

Handler: mux,

ReadTimeout: 10 * time.Second,

WriteTimeout: 10 * time.Second,

MaxHeaderBytes: 1 << 20,

}

if err := s.ListenAndServe(); err != nil {

return err

}

return nil

}

//生成NewRouter對(duì)象

func makeMuxRouter() http.Handler {

muxRouter := mux.NewRouter()

muxRouter.HandleFunc("/", handleGetBlockchain).Methods("GET")

muxRouter.HandleFunc("/", handleWriteBlock).Methods("POST")

return muxRouter

}

好的,需要的函數(shù)都已經(jīng)列好,下面把它們組裝起來(lái)即可,然后放到一個(gè)main.go的文件中,啟動(dòng)終端,進(jìn)入到main.go文件夾并輸入go run main.go命令。

打開(kāi)http://localhost:8080/地址,會(huì)看到一個(gè)創(chuàng)世區(qū)塊,如果想添加一個(gè)新區(qū)塊則需要使用postman 傳一個(gè)content參數(shù)過(guò)去,如圖:

然后再刷新瀏覽器,會(huì)返回新的區(qū)塊信息,如圖:

好的,先到這里,下一次我們把共識(shí)算法加進(jìn)去。

總結(jié):

今天實(shí)現(xiàn)了生成新區(qū)塊、哈希計(jì)算、區(qū)塊校驗(yàn)這些基本功能。代碼在:https://github.com/sunqichao/createblockchain

  • 1.公司登記注冊(cè)于2003年1月27日,清遠(yuǎn)市桑達(dá)電子網(wǎng)絡(luò)媒體有限公司
    2.公司2006年起成為清遠(yuǎn)市政府定點(diǎn)協(xié)議供貨商,電子采購(gòu)供貨商
    3.公司2007年被清遠(yuǎn)市相關(guān)政府部門(mén)評(píng)為安防行業(yè)狀元
    4.公司2007年起成為長(zhǎng)城電腦清遠(yuǎn)如意服務(wù)站(SP368)
    5.公司2007年承建清遠(yuǎn)市橫河路口電子警察工程,開(kāi)創(chuàng)清遠(yuǎn)電子警察先河。
  • 6.公司2007年起成為IBM合作伙伴、公司2010年底成為金蝶軟件清遠(yuǎn)金牌代理(伙伴編號(hào):30030013)
    7.公司組團(tuán)隊(duì)參加南方都市報(bào)組織的創(chuàng)富評(píng)選,獲廣東80強(qiáng)。公司申請(qǐng)多項(xiàng)軟件著作權(quán)、專(zhuān)利權(quán)
    8.2016年起公司成為粵東西北地區(qū)為數(shù)不多的雙軟企業(yè),確立“讓軟件驅(qū)動(dòng)世界,讓智能改變生活!"企業(yè)理想
    9.2016-01-29更名為廣東互動(dòng)電子網(wǎng)絡(luò)媒體有限公司
    10.2021-01-13更名為廣東互動(dòng)電子有限公司
  • 投資合作咨詢熱線電話:0763-3391888 3323588
  • 做一個(gè)負(fù)責(zé)任的百年企業(yè)! 天行健,君子以自強(qiáng)不息;地勢(shì)坤,君子以厚德載物;
    為用戶創(chuàng)造價(jià)值! 讓軟件驅(qū)動(dòng)世界; 讓智能改變生活; 超越顧客期望,幫助顧客成功;
    對(duì)客戶負(fù)責(zé),對(duì)員工負(fù)責(zé),對(duì)企業(yè)命運(yùn)負(fù)責(zé)!幫助支持公司的客戶成功;幫助忠誠(chéng)于公司的員工成功!
  • 聯(lián)系電話:0763-3391888 3323588 3318977
    服務(wù)熱線:18023314222 QQ:529623964
  • 工作QQ:2501204690 商務(wù)QQ: 602045550
    投資及業(yè)務(wù)投訴QQ: 529623964
    微信:小米哥 微信號(hào):qysed3391888
    騰訊微博:桑達(dá)網(wǎng)絡(luò)-基石與起點(diǎn)
  • E-MAIL:222#www.nongkaibiao.com ok3391888#163.com (請(qǐng)用@替換#)
在線客服
  • 系統(tǒng)集成咨詢
    點(diǎn)擊這里給我發(fā)消息
  • 網(wǎng)站\微信\軟件咨詢
    點(diǎn)擊這里給我發(fā)消息
  • 售后服務(wù)
    點(diǎn)擊這里給我發(fā)消息
  • 投資合作
    點(diǎn)擊這里給我發(fā)消息