国产免费观看青青草原网站_久久精品视频色悠悠_影音先锋激情5566_日本一區二區三區免費高清在線_麻豆精品一区综合av_丰满的大屁股一区二区_男女啪啪免费网站_草莓视频app在线观看下载_午夜寂寞少妇AA片_混乱的生物课月老师后续视频

 
您現(xiàn)在的位置:首頁 ? 知識庫 ? 軟件開發(fā) 軟件開發(fā)
年輕人的第一個區(qū)塊鏈
發(fā)布日期:2018-04-08

準備工作:

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

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

  3. go語言基礎(chǔ)

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

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

用go搭建web服務(wù)

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

  1. 創(chuàng)建NewRouter

  2. 設(shè)置端口號

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

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

go語言基礎(chǔ)

  1. 導(dǎo)包:多個包用小括號括起來

  1. import (

"sync"

"time"

)

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

  1. time.Now()

  1. 聲明變量:

  1. var coin int 用空格隔開,類型寫到后面,變量名寫中間,最后是個var

  2. coin := 10 也可以省略var,用:=來賦值,但是必須保證coin沒有聲明過,否則會報錯

  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ù)返回兩個數(shù)的最大值 */

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

}

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

  2. 最后的int是返回值的類型

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

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

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

  2. 賦值:var a1 Article

a1.title = "寫代碼"

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

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

整理思路:

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

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

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

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

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

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

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

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

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

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

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

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

type Block struct {

Index int

Timestamp string

Content string

Hash string

PrevHash string

}

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

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ū)塊:(上一個區(qū)塊的索引加1,上一個區(qū)塊的Hash賦值給當前區(qū)塊的PrevHash,當前區(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

}

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

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

}

啟動web服務(wù):

//設(shè)置http需要的參數(shù),并開啟服務(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對象

func makeMuxRouter() http.Handler {

muxRouter := mux.NewRouter()

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

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

return muxRouter

}

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

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

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

好的,先到這里,下一次我們把共識算法加進去。

總結(jié):

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

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