Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
在本机端口进行查询 由于是第一次运行该链 生成创世区块
  J# q+ `+ \6 [6 [( x& F/ J2 Z+ K5 q6 L4 e* s/ d
通过http实现RPC命令的调用  实现添加块
3 r4 s# M5 q; J2 n- W; c: h% H* [, `) m) R1 o
查询当前所有块的信息
' M  X8 [) m( t7 i  \3 V: g
& x, W1 q6 i+ P这里只做了两个命令 分别是get和write
+ K& f, X, U( p* \源代码如下
- N1 l+ U2 k5 t" P9 ?* p- \基础功能的实现
7 P) Q% m: I1 m6 ^( U
2 M% m1 ]/ Y( Q/ g/ Z. y9 bpackage core- N9 f9 [% c/ v0 [  `1 c$ F) J
import (3 i& e1 y5 l5 W2 K9 V0 E3 L9 }3 ~
        "crypto/sha256"
! O$ q2 v/ t* ]. l. {# T8 {+ j6 P        "encoding/hex"
) {) T4 u9 ^- R) |        "time"
6 y. ?0 S" k* [6 X# o)
7 O4 c4 y2 l! ~6 M! u# V//定义区块! A" u' ^7 J$ A/ @: G
type Block struct {1 }$ g3 s0 K. I
        Index         int64  //区块编号
; n9 e+ o: T8 d0 J5 a0 E   
  1.     Timestamp     int64  //区块时间戳
    " T4 S8 `" G& l% V, J* \4 a1 B
  2.         PrevBlockHash string //上一个区块的hash值  H0 \2 p9 H& Q4 D$ p  U3 _
  3.         Hash          string //当前区块哈希值
    % C: J4 R  L3 W8 [
  4.         Data string //区块数据
    1 U  G9 B, J+ P2 ]0 n4 c" X0 Z
  5. }
    ! v3 J! c( J7 r% v0 B& i* p( L
  6. //计算Hash
    , e: ^5 t- u4 h+ V. P) W
  7. func calculateHash(b *Block) string {+ z1 m. M  j. Q, y% \, }
  8.         blockData := string(b.Index) + string(b.Timestamp) + b.PrevBlockHash, D2 W% N: y: W0 H
  9.         hashInBytes := sha256.Sum256([]byte(blockData))
    * H. L8 m  a1 U8 _. e: ~
  10.         return hex.EncodeToString(hashInBytes[:])
    % P& o3 v, p2 G- ~8 J' p
  11. }
复制代码

  t4 K6 _2 h) i. o$ J; ~" h( V ( j- Z/ B* ]2 d* f# i
//生成新的区块9 a# |0 n+ V( t( Q$ _/ g
func GenerateNewBlock(preBlock *Block, data string) *Block {
0 {" n9 p8 [# v! Z1 }        newBlock := &Block{}
" B; J% ]2 ]+ p! s( p8 b" C        newBlock.Index = preBlock.Index + 1
: Z+ h9 Y6 Z6 J& s        newBlock.PrevBlockHash = preBlock.Hash
5 ?/ s1 {' L, m0 s        newBlock.Timestamp = time.Now().Unix()6 u/ i8 o- `$ K+ M  w7 ~  g
        newBlock.Hash = calculateHash(newBlock)% m- e1 T4 p+ c8 v, s& A+ e
        newBlock.Data = data5 c) [. Y4 j6 m
        return newBlock
, o/ ^: v* w% z/ P4 t}' {6 b$ g' x; ]4 t7 _/ p

7 B: _1 f5 |7 b0 L) w//生成创始区块. h6 e4 N! g! p! H/ o" k3 H
func GenerateGenesisBlock() *Block {
- ?4 O) C/ C$ A; w' n        preBlock := &Block{}  z8 K8 L  C9 |! @, O
        preBlock.Index = -1
# |% u5 d; V* M4 A+ u, z        preBlock.Hash = ""& B2 R, @, q6 J
        return GenerateNewBlock(preBlock, "Genesis Block")
4 f. r+ X5 |5 t* J6 v/ L, H}
" V7 N  h6 \+ X" O4 X$ V0 x+ x. i将基础功能实现的块进行链接 实现blockchain! F) B7 X* g$ |8 l
package core$ @, Z# ?" |& v3 g- t7 r

8 {1 M8 U/ x% G: `0 h2 dimport (9 f4 i: V( J& k1 r% r8 p, P: y
        "fmt"& o1 g. p* }" G8 [
        "log", U- b0 Z# W* @- q4 @% L
)5 w: z  T* J" c; Z* @
0 F5 ~6 v' T/ ?
//定义区块链
1 u0 V5 \+ [; \. jtype BlockChain struct {" B& v* C% W$ E6 ~; ?. ^8 p. K6 e
        Blocks []*Block
# L$ {0 l* T8 Q) ?5 d! Q}! D/ R' F) J1 P
( X( [+ D: ?1 W, Y1 U# e7 ~" `4 {
//创建一个区块链
% X( ~! i& u, ufunc NewBlockChain() *BlockChain {  v/ Y4 _* D1 I' y- v$ V
        genesisBlock := GenerateGenesisBlock()% X$ f  Z# K4 Z1 l$ q2 ~
        blockChain := &BlockChain{}$ B. w$ D# ?- K* g
        blockChain.AppendBlock(genesisBlock)
5 U' w/ V; a6 U; Y! u* k        return blockChain4 V1 W6 F! [3 w4 Z; O  i
}
7 S! _% F; g: A, [   s- k* @( Q0 q( \4 N0 e, h+ N6 p
//记录区块数据1 j( u, R5 z- h& c, V1 A
func (bc *BlockChain) SendData(data string) {+ s2 s2 G  w% {* K. S% t5 |
        preBlock := bc.Blocks[len(bc.Blocks)-1]
4 L; z8 ~) @8 J  Q# l2 p) \        newBlock := GenerateNewBlock(preBlock, data)- g" I. G  K% Y0 x2 d' }+ s
        bc.AppendBlock(newBlock)
/ K$ b) y( m# f; p( I' X: z$ }3 L}
8 }4 q6 k! q4 C3 A9 c# j" {( p 4 Y* I4 O/ ]7 H/ s  Y9 u) m! ~
//往区块链添加区块
. T& a+ [. Z- f1 T9 ?+ zfunc (bc *BlockChain) AppendBlock(newBlock *Block) {
7 y7 c* d1 q$ ]+ T        if len(bc.Blocks) == 0 {( ^% @4 k& g, K9 k# s# P1 D' D# O
                bc.Blocks = append(bc.Blocks, newBlock)
! R! q2 Y& }" S1 `2 F                return$ K3 t8 d% l3 ~; s% Y$ g
        }" ~0 O+ [/ x9 @$ U' _
        if isValid(newBlock, bc.Blocks[len(bc.Blocks)-1]) {( A: U( f& ^3 i7 q
                bc.Blocks = append(bc.Blocks, newBlock)& u1 M* Z' |, Y0 u7 N+ U
        } else {
# n( j$ M6 G  G5 t0 {' ^; w$ L# n- u6 n/ N                log.Fatal("invalid block")  l( x8 r% r- F& y7 O
        }( Q) ]) n) T/ K2 ~5 t
        return( j( b: ^8 H: G7 {
}
+ _# f( e/ x3 A7 e2 q
# ~: D& f8 U7 a# e$ l% I//输出区块链信息3 Y: p5 A+ C5 P# V+ U. k6 q3 @  q
func (bc *BlockChain) Print() {
- e3 |& r9 |2 J+ ^" B* ^        for _, block := range bc.Blocks {
; Q0 C8 b7 O! o# i5 c6 c2 ^0 {                fmt.Printf("Index : %d\n", block.Index)' _/ E7 m+ T( j
                fmt.Printf("Prev.Hash : %s\n", block.PrevBlockHash)
4 c9 Q+ t/ c  s. ^( f, a                fmt.Printf("Curr.Hash : %s\n", block.Hash)- [: b9 h" r, u2 w3 p4 D1 p* s
                fmt.Printf("Curr.Data : %s\n", block.Data): M: O! D# W4 p, a& ~: e$ e3 L. v
                fmt.Printf("Curr.Timestamp : %d\n", block.Timestamp)
/ P) h. M1 J& n3 v- f+ k                fmt.Println("==========================================")
- M) k3 Q% b) J0 \7 }  n' A  T        }
' w0 ?2 _) c- b}; i! E. F7 ~. k3 k' L4 L+ l
( g% k# M; l% T+ C
//验证区块
! d6 l* {* H  F/ t; v- g$ ?) mfunc isValid(newBlock *Block, oldBlock *Block) bool {- H( w: X" y/ C3 F, ]% U. X- r
        if newBlock.Index-1 != oldBlock.Index {
& Y6 `( T; _- K8 F                return false7 c. t4 `' E- b7 v0 ^3 V0 X
        }7 D/ M  t! u: L: j
        if newBlock.PrevBlockHash != oldBlock.Hash {
1 Q: O" W0 I5 L2 K5 D2 h0 R0 T  `% J                return false
; j  ^5 Z1 J4 X# x) s0 P        }. _# q. d* h$ b* j5 H; \
        if calculateHash(newBlock) != newBlock.Hash {
* n$ B" B3 r" q0 }0 M6 @                return false
% H3 @( t* l5 C3 x1 r0 V+ _        }
' g8 {, t. P5 U        return true
. m! q) S6 ?  k1 n}
+ V  X1 r/ ~% f9 F2 }5 \1 U实现RPC接口的交互
! D6 U# a1 a" L7 q, G
  1. package main
    0 b/ L6 n% K0 {( |

  2. 2 b3 B6 i: V! L& w/ E' w) p
  3. import (
    ' @! S$ {$ @5 J' @; N5 a
  4.         "encoding/json"9 Z" a- d1 d9 j; v8 I7 B* H
  5.         "BlockChain/core"
    2 `: G9 u, ?/ b4 r7 Z, |
  6.         "io"
    0 s( g: y2 S' ^3 b3 h
  7.         "net/http"( O% E* i' M  E$ u1 y+ C3 R
  8. )
    9 ]; d( L0 ?% l9 I
  9. 2 Q6 q/ {% L! H- d/ h( r
  10. var blockChain *core.BlockChain
    ( q) P% C; S- c" ?& p

  11. ' e- N* ^' s% L. s3 s: V+ i- T; J
  12. func run() {2 p7 x3 w$ l6 f+ {
  13.         http.HandleFunc("/block_chain/get", blockChainGetHandle)! ?; o0 }1 {9 y- t) F7 P" @# r4 h, P
  14.         http.HandleFunc("/block_chain/write", blockChainWriteHandle), Y* R" m1 G/ i3 u( I
  15.         http.ListenAndServe(":8332", nil)
    1 R' Q0 D9 p; d. l9 P. N
  16. }
      Z* E9 ~% W- j3 _- X

  17. 6 {: ~4 S/ p; @0 s3 C6 d
  18. func blockChainGetHandle(w http.ResponseWriter, r *http.Request) {/ G* L* ^' n, T+ \/ i! N, v
  19.         bytes, err := json.Marshal(blockChain)
    7 [0 ~' _. b0 {1 H5 n
  20.         if err != nil {
    4 h# M4 s% a: {( o" \
  21.                 http.Error(w, err.Error(), http.StatusInternalServerError)
    & I6 [8 _- N$ @; D) d
  22.                 return
    * p8 L  s9 F3 o0 @6 Q
  23.         }
    ) x6 w2 l, \3 _3 v
  24.         io.WriteString(w, string(bytes))
    9 z# Q3 c& i; v0 B1 G9 r8 @
  25. }5 e3 C- y( [3 b, @: A
  26. * S1 O$ d1 e) n) S
  27. func blockChainWriteHandle(w http.ResponseWriter, r *http.Request) {" C0 m- ]. ]# t/ g( A) P
  28.         blockData := r.URL.Query().Get("data")
    ' t! t7 ~5 Y% y
  29.         blockChain.SendData(blockData)
    ; b8 r  n3 _# A9 S: a. ~
  30.         blockChainGetHandle(w, r)0 h9 U6 j3 p5 M9 E$ m' b
  31. }
    % o# L) |2 x0 _9 i5 W8 @2 \

  32. 9 U# P/ K& y2 [7 Q: v# i' {- }1 W! G
  33. func main() {
    / N8 ?# l. [. u  [# P: ?& {, r/ h
  34.         blockChain = core.NewBlockChain()  @4 F4 q2 [! y6 U& N" J: O
  35.         run()
    6 @) E; o) i0 W) d& Z% Q
  36. }
复制代码

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

本版积分规则

成为第一个吐槽的人

朋友一起走 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16