Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
在本机端口进行查询 由于是第一次运行该链 生成创世区块$ U8 d% w+ Z0 w& t- H2 f

. |1 L/ W6 U' F6 w* x通过http实现RPC命令的调用  实现添加块
/ j: N+ L  W# C* Q$ {8 @, R7 R0 \
" a, Z- e& e: i& r查询当前所有块的信息# G0 l( `+ S; t2 e1 P7 b
& W, V& S4 h* u! a- T- M
这里只做了两个命令 分别是get和write) g4 @1 N/ ]- s8 n6 u3 N" q! B; K
源代码如下
& I9 I4 P0 B) r; ]! c基础功能的实现
( H! B! B; ?, {
$ ~0 C" }- F! m& w# u6 ~- \6 K4 Jpackage core6 U, b$ K: ?( n- ]8 B. X3 R& @3 D* d
import (
( Y8 O3 r5 M4 e, A        "crypto/sha256"
! W6 W4 m  w6 c8 e* m- q& b  W1 u        "encoding/hex"
% F! m; [& p: v+ K9 o+ u        "time"
3 ~* \* \7 D$ V)
; F0 @0 ?9 u- V9 f; n//定义区块
$ U" m, C" y% ~$ dtype Block struct {
0 d( F) S7 c% w! X        Index         int64  //区块编号3 U  h$ S' v7 t+ u- g
   
  1.     Timestamp     int64  //区块时间戳6 Q6 v. A9 O) W6 {* L2 @0 v) o
  2.         PrevBlockHash string //上一个区块的hash值
    ) f+ n- @* c/ g, S
  3.         Hash          string //当前区块哈希值
    ' F& ]/ I4 ^6 N7 ~* j" u5 F
  4.         Data string //区块数据
    . t) J7 Y2 _1 U* ]- x
  5. }
    * v; y7 K! p4 I1 r; s1 d' ]  E2 m
  6. //计算Hash
    3 @( S: y- @. k
  7. func calculateHash(b *Block) string {- W+ l8 M% f3 m, ]3 Y  T6 i
  8.         blockData := string(b.Index) + string(b.Timestamp) + b.PrevBlockHash7 \3 S2 X( w5 ^1 y' v2 v
  9.         hashInBytes := sha256.Sum256([]byte(blockData))8 l5 N3 \5 ~% D. ?
  10.         return hex.EncodeToString(hashInBytes[:])
    ) l; J. b' l# h# O6 F5 o+ g
  11. }
复制代码

- s( X$ e5 h- e0 U& c 1 D, Z) p9 j$ W5 d
//生成新的区块: B) {1 x) f1 [5 y
func GenerateNewBlock(preBlock *Block, data string) *Block {
5 m$ j) j4 r" y# y& Y# v7 w* n6 I        newBlock := &Block{}
. K& t( W) V, ?4 ]        newBlock.Index = preBlock.Index + 15 s# z% K3 R5 n7 E
        newBlock.PrevBlockHash = preBlock.Hash
% W0 z; r/ n* ~* x" K, H. w        newBlock.Timestamp = time.Now().Unix()
! K# ]1 H! B( P0 r7 ]! k, C        newBlock.Hash = calculateHash(newBlock)
1 d3 S$ D. m1 h% C3 w  Z+ \        newBlock.Data = data3 G' J: j. A: F0 n" d: t2 H
        return newBlock' x! ~7 s: f* L+ v# ~$ R6 I
}1 f/ d: k' {% N4 v% I; m
7 J( _: l, ~. L6 k! i9 Z
//生成创始区块6 [0 g' q; s0 J1 x5 H/ r
func GenerateGenesisBlock() *Block {, f, C, m7 @3 c+ z! s
        preBlock := &Block{}- Z, d, M) |) \9 |2 Z
        preBlock.Index = -1+ [3 N" d9 ^1 c3 U( G7 C
        preBlock.Hash = ""
6 _9 ]6 E# r" X; |! s3 X( N        return GenerateNewBlock(preBlock, "Genesis Block")
) Z2 ]3 r$ M- ]) c}
; R! \! O7 Q# B& W, u8 W将基础功能实现的块进行链接 实现blockchain3 g0 S- x7 c/ e& p8 H
package core4 ?8 i0 J4 Z( g/ a/ c1 e7 U: S

, K: J& Q; ~/ u1 S/ }+ c% U( Simport (
* j6 T- u7 q8 ]' h3 U9 _, `        "fmt"
. {/ u2 ^0 j# V+ l- \: [        "log"
" L( j) Z, ?3 p# \$ y3 y' e8 D)" f! E+ `( ~  W0 m. ^1 `4 f

! m6 v* F/ g0 Z! O//定义区块链
/ h! ^4 t0 r' M* [) e. N5 vtype BlockChain struct {
3 e: L, N+ }4 v! M' e        Blocks []*Block
$ p/ ?) N3 Q% i7 D2 ]1 @! l2 ]}
3 T! L' h. I& |! @6 [ # C2 v" }0 C! c! q3 ~* W, g- U
//创建一个区块链
8 c: q' L* f6 k! o7 J6 h; lfunc NewBlockChain() *BlockChain {% d5 t2 K  N4 v8 q* B% v9 R. M; {
        genesisBlock := GenerateGenesisBlock()
$ [/ A9 U2 d0 j% R7 r& S        blockChain := &BlockChain{}
/ D; y; X8 W6 v0 X  U( Z4 J        blockChain.AppendBlock(genesisBlock)# ?( i7 F' d) r1 j) k6 D+ C" }2 c
        return blockChain# ?* W' h5 m# k- S! @/ J/ S
}
. k9 I9 J  w" k7 h( v6 |0 R
/ Y  J6 Y: K4 h" W+ M% C+ S# z) }//记录区块数据
7 \8 _  e% x4 cfunc (bc *BlockChain) SendData(data string) {
$ G3 B' K& b/ `7 F' b: Y; q        preBlock := bc.Blocks[len(bc.Blocks)-1]
$ o5 N3 a5 I  ]+ G1 ^* }        newBlock := GenerateNewBlock(preBlock, data)+ x& w5 Y% U9 [$ a; C$ ?2 w2 T
        bc.AppendBlock(newBlock)
3 @6 w6 P/ c1 E) Y) o}
7 c$ ?' m4 M% ]
* ~/ {! _" \1 ?+ ?" Z& z' {//往区块链添加区块0 F3 @6 r6 J; p" B
func (bc *BlockChain) AppendBlock(newBlock *Block) {
* b6 }  r+ `8 E; u4 {        if len(bc.Blocks) == 0 {
; |" `. z- d3 O* E, y3 m) d# D                bc.Blocks = append(bc.Blocks, newBlock)
9 x: W: h1 e! o2 X                return) h" Q; O' `, Q: u
        }4 m$ X0 ~0 H  H- j8 {! C
        if isValid(newBlock, bc.Blocks[len(bc.Blocks)-1]) {
( d. A1 {0 X# C$ i+ g                bc.Blocks = append(bc.Blocks, newBlock)/ i% q4 b0 W( M4 Z) \
        } else {/ B* y* k% `8 I
                log.Fatal("invalid block")( h4 D& |$ M; ~' o
        }
- _3 K' f  E3 Q- k        return; t. q+ d* m# v# q  c: D
}
- a& r* k9 E# x; E$ k
$ l6 F6 _' F; c+ M0 L) m5 Z* q//输出区块链信息- x5 K- Y' @# q) f) i' Y
func (bc *BlockChain) Print() {' X; o, b, U: @: @
        for _, block := range bc.Blocks {% |& G' e" O" a. z6 y- b) a
                fmt.Printf("Index : %d\n", block.Index)% Z, p8 y% H" y
                fmt.Printf("Prev.Hash : %s\n", block.PrevBlockHash)
2 H8 |4 u+ P6 n5 `8 C                fmt.Printf("Curr.Hash : %s\n", block.Hash)
2 y7 j2 c4 d. \5 G- _                fmt.Printf("Curr.Data : %s\n", block.Data)
) D- c% V+ M  [' n* _                fmt.Printf("Curr.Timestamp : %d\n", block.Timestamp); ~8 O" `9 h0 m! `
                fmt.Println("==========================================")
8 L8 q' ^9 \+ G, M1 _0 n- I        }
' O; P) R. I4 r- x  f) i}+ H- S' Z& u+ m
8 O7 Y: F& \- v/ h& q
//验证区块
5 V. M8 b* f: n' @9 C- o) q; Lfunc isValid(newBlock *Block, oldBlock *Block) bool {
" h9 H3 q3 }2 W  Y" U! n$ I        if newBlock.Index-1 != oldBlock.Index {
: G; e9 ?7 }' _1 Q1 c4 D' g                return false. x7 }" K6 d" I" J$ R( u# _- X' v8 i
        }& A, S# d  ?9 b) j4 X$ e
        if newBlock.PrevBlockHash != oldBlock.Hash {
! N  u# [, p- q6 }! J2 L                return false+ _$ r; |/ y- _9 c  r6 T
        }
9 p1 U3 C0 c0 i) j' T2 {        if calculateHash(newBlock) != newBlock.Hash {
  R' d; z1 Z% F; O) U) u8 U6 B                return false1 s  K' z6 T. _9 u6 `
        }) Z1 |3 L% |& |# q9 J1 W
        return true: O9 a" V) q8 p5 P
}# l4 w; F" L: Z$ y7 p
实现RPC接口的交互! D7 B4 V& e' t
  1. package main3 F, g$ W: D. B" c6 G  S6 g" s
  2. 4 p( M* V# \  ?- v
  3. import (
      _. L9 I: L9 e
  4.         "encoding/json"" l2 Q8 J, D8 z: {
  5.         "BlockChain/core"& w  ^' Z/ O. d) h
  6.         "io"
    % h; X0 n6 G6 q* Z
  7.         "net/http"
    # R$ U7 y6 B; z* r! {, ~; c/ k
  8. )
    ; T  l2 L2 g% L, T2 h

  9. - w, ~% ~7 ~' l2 ^3 @
  10. var blockChain *core.BlockChain$ u' J: a9 @. L( b( }

  11. ' U4 m2 Z3 U0 @
  12. func run() {
    1 |5 i/ U& U/ R
  13.         http.HandleFunc("/block_chain/get", blockChainGetHandle), D4 [8 i. _: o  g
  14.         http.HandleFunc("/block_chain/write", blockChainWriteHandle)
    5 @% R! S- K' I5 \4 l- a$ a# ]
  15.         http.ListenAndServe(":8332", nil)3 C( P/ x0 t: W; k( z: T
  16. }
    / j4 j! z' e- T  z4 W0 V

  17. 3 e  ]; p  N1 \2 m( @1 M
  18. func blockChainGetHandle(w http.ResponseWriter, r *http.Request) {
    - g' h* n" h' l; q* I8 I+ x
  19.         bytes, err := json.Marshal(blockChain)8 j! k2 T! f& Z* K! }
  20.         if err != nil {( n& j4 K" n# v1 F3 @5 Z, e
  21.                 http.Error(w, err.Error(), http.StatusInternalServerError)2 ^6 h% G; x" Y/ J; ^5 e
  22.                 return' Y  S$ h! q" F0 o
  23.         }
    ( s7 s, k+ q. @$ b; G4 z
  24.         io.WriteString(w, string(bytes))
    # g* z6 b8 a3 E% V) j& }8 l7 w4 a
  25. }
    - p5 O1 l3 W7 f* x/ s3 k' C

  26. ' b: `4 t& @* l* M4 p
  27. func blockChainWriteHandle(w http.ResponseWriter, r *http.Request) {
    / R3 `! k+ @! C# e: Q4 u' \) p
  28.         blockData := r.URL.Query().Get("data")
    1 ^6 ]6 J. M  M# @6 w
  29.         blockChain.SendData(blockData)
      l) H* Q5 B) W4 \3 {3 K' S
  30.         blockChainGetHandle(w, r)0 H' V' H% b; |- o
  31. }5 v1 L% J0 y+ t6 g

  32. . V& M" J$ I0 d0 n( s
  33. func main() {
    / O5 N8 i, r: Q0 n, M/ A$ v- |
  34.         blockChain = core.NewBlockChain()
    / a2 S+ H$ Q. K' P
  35.         run()% J$ i, ?! w; n- r( g1 |7 o
  36. }
复制代码

- _" W7 V! g  T9 f( H7 q" [$ J通过两部分代码实现简易区块链的RPC调用
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

朋友一起走 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16