Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
在本机端口进行查询 由于是第一次运行该链 生成创世区块( H: z# G4 q. h1 j4 {1 s7 c8 \# _

; o9 r! y$ a/ X' ]7 t$ A通过http实现RPC命令的调用  实现添加块
9 G6 O2 M/ P3 i  ^- X" f# e% z( M  n- a, P: ?* L
查询当前所有块的信息0 u1 u0 G- Y$ a/ \& q9 J
- P: ^+ V/ P* r$ m8 @6 j" H2 u3 i
这里只做了两个命令 分别是get和write
+ ^2 d1 a, M8 U- p& [2 ~0 Z! h源代码如下
* C& J( {. {; _! X: C8 J基础功能的实现, I& N& v6 [/ _% m
0 Q$ q; V8 ~9 L% J  }, o, c
package core7 {. `$ d3 k% C) p
import (* J# ]( J7 p$ u5 B$ B4 w! }1 r+ H
        "crypto/sha256"& f9 a0 [" I) j( y; M
        "encoding/hex"
; F. u7 N1 n8 ]# a1 U        "time". S% m* L. b" g/ q6 }5 C
)
: o3 `" W' V! ~' k9 O7 Z//定义区块
8 Q- w2 u3 D: ^7 a% k' i7 a$ N9 T" ^type Block struct {! J9 Y* r5 T( f3 \$ N
        Index         int64  //区块编号
& b- A8 Q& k$ o# C   
  1.     Timestamp     int64  //区块时间戳
      {1 ?" r5 Z- u0 |, H0 `
  2.         PrevBlockHash string //上一个区块的hash值
    * _) f0 @: _- ^8 H9 v# n7 ~. A( K
  3.         Hash          string //当前区块哈希值  `; K7 s1 t. i- b
  4.         Data string //区块数据
    6 {! ^$ @6 H( Q$ x' |4 r
  5. }2 g% B* h! b4 }' S% @
  6. //计算Hash
    6 H+ t: @5 b5 ]8 d% E4 Z3 E
  7. func calculateHash(b *Block) string {4 b1 R- `. G+ f! o
  8.         blockData := string(b.Index) + string(b.Timestamp) + b.PrevBlockHash
    0 ]* Y4 d" C9 P4 c+ G7 U  ?8 j/ K
  9.         hashInBytes := sha256.Sum256([]byte(blockData))
    1 W9 A, @7 X- {+ ~0 ^3 @6 K, w
  10.         return hex.EncodeToString(hashInBytes[:])
    * C/ P& y; Q; q! |& b
  11. }
复制代码
5 G& q' X$ v$ ]  O' C

. C$ }. \/ s' _9 o# `* x//生成新的区块* T4 F! g! r9 E. u+ Z/ E7 Z
func GenerateNewBlock(preBlock *Block, data string) *Block {* g3 r3 M: i- {0 B
        newBlock := &Block{}2 G! z! s$ e  H* V7 s' X1 T
        newBlock.Index = preBlock.Index + 1
0 Z7 s$ F, W6 q% k$ g5 a% ]        newBlock.PrevBlockHash = preBlock.Hash! r/ c5 d$ \$ X' c+ y- `
        newBlock.Timestamp = time.Now().Unix()  ~' A, M$ T8 I! G" i
        newBlock.Hash = calculateHash(newBlock)3 q5 q  Z7 z  f: j
        newBlock.Data = data
1 `6 ^% y0 F( F5 q& l, ]        return newBlock6 }3 L5 E1 Y6 ^9 T% n
}* y) @' c. p1 X# U

. O: \% K. f5 q6 K' f//生成创始区块  {  v1 u) c" z
func GenerateGenesisBlock() *Block {; R1 Z0 J/ g$ |1 Z
        preBlock := &Block{}
, X2 R$ S$ {! P; ^8 E/ N        preBlock.Index = -1
( N; Y0 I# ]% `- d0 `* u        preBlock.Hash = ""& D" M; D8 c% j+ b, K
        return GenerateNewBlock(preBlock, "Genesis Block")
$ F0 m+ {$ t+ h  q}- m" \2 K) A$ A+ L5 J
将基础功能实现的块进行链接 实现blockchain. e' d. o$ U; K# Y# b  r
package core
1 s# x! U# C; r, ]: k) N9 B2 \/ K
6 f5 t: ?$ o2 `5 ]- L# G% wimport (
9 b, k3 a  C. }        "fmt"6 P% v0 }" {9 e, ]6 n* E
        "log") o+ z& z: X6 h' M; r: u2 _+ U
)
1 V) e: ?' @- q1 |& Y+ O
; g9 P5 T' ?' X! T+ w- k//定义区块链
$ P3 x9 u$ R/ s  D! Q( b+ ttype BlockChain struct {
/ o. C# Z- @+ {' u8 E3 b  H8 p8 |        Blocks []*Block
* c+ I( K" I. `  f" ?}
& G% G) Z# Q) {- u; O
! R; M4 ]+ s" {//创建一个区块链
; e, Q( n- o( m4 d$ sfunc NewBlockChain() *BlockChain {9 @& t. W( o$ s5 `- b
        genesisBlock := GenerateGenesisBlock()) h5 \" H5 c' B" {( a6 K
        blockChain := &BlockChain{}
/ \1 N. e! B3 [- ?        blockChain.AppendBlock(genesisBlock)
: v9 f& \: j$ c  i        return blockChain+ J* f# A5 n' d& J( T. T4 d0 m" J
}
, z( }  m" N7 [5 q5 \ : F+ |, ~( ^# p
//记录区块数据/ `3 ^; e' Q1 C, `& ?
func (bc *BlockChain) SendData(data string) {3 ~: x. w. {. A8 V1 `$ W
        preBlock := bc.Blocks[len(bc.Blocks)-1]
8 O0 |3 z! F, g! H+ t7 C        newBlock := GenerateNewBlock(preBlock, data)9 d9 B9 K) T$ `) z( i2 Y
        bc.AppendBlock(newBlock)
: o, \% n% c- K  W3 P- B}$ a, S, e2 L$ P0 A5 D

  T0 h  P. L$ ?# F$ _$ `( H//往区块链添加区块
$ ^5 {4 n1 i8 p  S8 ^1 t, }+ }func (bc *BlockChain) AppendBlock(newBlock *Block) {
8 p5 \9 a+ P# H        if len(bc.Blocks) == 0 {" H7 q# x9 v9 \3 z
                bc.Blocks = append(bc.Blocks, newBlock)
% _9 M* r: O: ?1 y. I                return. Q- q- k! e$ ^8 Z0 [* f% @, x' N
        }- U5 Q5 o7 b; T* I, y7 M/ p1 x
        if isValid(newBlock, bc.Blocks[len(bc.Blocks)-1]) {
! M2 F- u% X8 y" Q& [                bc.Blocks = append(bc.Blocks, newBlock), u6 ], j6 _8 b, a+ e% `
        } else {- H8 X2 H; X2 M% O
                log.Fatal("invalid block")" l$ W* O8 }* P0 B1 r
        }3 Z( ]9 ]6 ]0 Y) H
        return: A, c2 K  }# }: U1 R, q2 h: t6 ]
}
. \' Y3 s+ j1 H# e: ]! p
- H) \9 i  q) h//输出区块链信息4 w6 B6 G1 {2 G# y
func (bc *BlockChain) Print() {
5 F. `4 z  s+ k& u( X) U2 j6 R        for _, block := range bc.Blocks {' S* H: i3 z+ k' ^* `
                fmt.Printf("Index : %d\n", block.Index)
$ |, \. r/ p1 R% l# C9 i5 f( q                fmt.Printf("Prev.Hash : %s\n", block.PrevBlockHash)
$ F0 G8 |* P& E9 V! N/ y                fmt.Printf("Curr.Hash : %s\n", block.Hash)& f$ D% h& A  h6 W. s
                fmt.Printf("Curr.Data : %s\n", block.Data)! k3 E2 {5 a) f! @6 K- L. ]6 j6 s
                fmt.Printf("Curr.Timestamp : %d\n", block.Timestamp); V% {" U+ G* @1 g& m, Z
                fmt.Println("==========================================")
) Z. u9 H1 c- z, q& p1 h1 j        }
* [1 e- s. p/ L& U2 R; L9 C}" D8 c$ [% m1 X' z

; l, N, d; L8 S; X/ Y//验证区块8 u$ o* F0 |4 O7 B3 t5 h0 S
func isValid(newBlock *Block, oldBlock *Block) bool {# N3 c) i" J. ~7 K  P
        if newBlock.Index-1 != oldBlock.Index {
* v% k1 c& ~7 Q$ _& l                return false6 U2 U. {6 z5 S( X7 m
        }
' s5 z: Z1 B: e/ Z' i1 B6 g# d" J        if newBlock.PrevBlockHash != oldBlock.Hash {, D; U8 j: Z' c( [& o* s6 X
                return false
. n: e8 S7 Z3 Z6 R  G. K4 A        }$ ~, p3 I9 R  t/ d2 B
        if calculateHash(newBlock) != newBlock.Hash {
/ |' ^2 n/ P! E  s1 S0 f. z                return false
+ x5 R2 T! e: u( x        }( i2 |8 _* A& x; r0 @% M* h
        return true8 \* `: w2 d, Z/ w  ?! M- ]' Z
}
  `% Z6 e8 U' i# G2 X5 H实现RPC接口的交互4 \/ ~5 y# b' j* b: X
  1. package main
    7 c5 x- h' J" C3 p% B+ D) M

  2. % V& i0 s& c9 J2 m
  3. import (( P$ y. t. Z* b+ o
  4.         "encoding/json"
    * _- m: N. Q! s4 M& c" \$ x# S3 G
  5.         "BlockChain/core"
    9 [) `. W3 ]% }! `6 k) A5 W: [+ V
  6.         "io"
    + H6 t' o: ]: l; r' b8 P" ^4 d9 j$ ~) M$ ^
  7.         "net/http"6 I9 q6 A) d* f# j: K- E% q1 t
  8. )" m; S9 s5 K: ]7 e* Z' @
  9. 0 O/ v  m( {( N) y) i1 f; I( t  y
  10. var blockChain *core.BlockChain
    & _2 W5 u- s* S7 R/ `  O# X1 F

  11. 8 C5 i" o$ ]* M, X
  12. func run() {7 P3 \! J% G4 Z9 J/ ]
  13.         http.HandleFunc("/block_chain/get", blockChainGetHandle)5 l$ ~8 f1 u  Y" `0 C
  14.         http.HandleFunc("/block_chain/write", blockChainWriteHandle)
    ( y  Z. S' ]. \% C, K. ^3 M! A
  15.         http.ListenAndServe(":8332", nil)
    5 M; ^% V7 T& S1 V$ s) e
  16. }9 X( [" [/ [) `( g
  17. 9 ?* L5 r! Q. K# g3 P8 Q5 U# u
  18. func blockChainGetHandle(w http.ResponseWriter, r *http.Request) {; g- @" K- Z5 ^: V* y
  19.         bytes, err := json.Marshal(blockChain)
    4 R$ m) D( K: F+ v' ]0 Q* h
  20.         if err != nil {! {, V; R& k5 B: G  }  g
  21.                 http.Error(w, err.Error(), http.StatusInternalServerError)( P# u( K1 Y! R2 P
  22.                 return9 n0 P% q4 y- ~3 `5 y7 M. L
  23.         }
    2 u! Z; U- S+ L1 @. q0 j1 q
  24.         io.WriteString(w, string(bytes)), l, Z' U, P. v* C+ f
  25. }; a2 Y% L, W) q1 a$ k

  26. " V% O" E- f+ }4 T7 ~3 c/ L
  27. func blockChainWriteHandle(w http.ResponseWriter, r *http.Request) {/ d8 j1 Y- P( N. d' K0 P
  28.         blockData := r.URL.Query().Get("data")
    ) g- ^) [) A1 o& N' [4 X1 g: P
  29.         blockChain.SendData(blockData)
    - T: I3 }  k! }6 j2 V
  30.         blockChainGetHandle(w, r)/ S0 N1 n7 h# i+ R* w- O5 G
  31. }) f' ]: ]4 D; O! n4 t1 a( ]2 C7 c
  32. * \* S* y/ F# e+ p0 b' u
  33. func main() {7 D% t6 @/ x; R5 ^
  34.         blockChain = core.NewBlockChain()6 i& @& q! I2 L/ K
  35.         run()
    ; [3 x( ^2 n* ?
  36. }
复制代码
5 h% Z% _. D0 F" O
通过两部分代码实现简易区块链的RPC调用
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

朋友一起走 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16