Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
在本机端口进行查询 由于是第一次运行该链 生成创世区块: z( d! v' t0 W4 z! r0 @6 [

: Z1 c& K; m5 E! D, d; Z2 g通过http实现RPC命令的调用  实现添加块
: _) S% Q# X9 p% ~" Z) |% W( T. I
5 l! }" a$ v" h1 g4 K查询当前所有块的信息* B6 d% V: \( E3 i  y
: X: a0 Y# l* F# {( `
这里只做了两个命令 分别是get和write
9 q, t! x4 ^* z/ a6 X: V源代码如下
6 E: b( I2 d: C5 l基础功能的实现* q' z/ X( T" x* w- ?% H
4 v. u& N0 Z: a0 L  _" @
package core
% N2 u0 W$ {0 e, j9 o8 dimport (/ ]1 |9 y% S1 c# f# E1 U
        "crypto/sha256"
$ I! t/ x7 U0 f+ ]% J; v: |        "encoding/hex"
4 K$ f0 o3 r3 W        "time"
# {/ ?( u# R7 }% H)
1 r# Y5 U9 [2 y//定义区块
( r' b$ k3 ?0 ~, Q; ~type Block struct {. s/ N6 s0 c; y# r$ a8 M( v# w
        Index         int64  //区块编号' j  n* `+ L- n0 i
   
  1.     Timestamp     int64  //区块时间戳  R: j& B: P9 h9 s! M7 l8 i& c: \
  2.         PrevBlockHash string //上一个区块的hash值
    " P( h* @+ s/ o+ q
  3.         Hash          string //当前区块哈希值
    & W7 b+ b6 {7 B$ p! X
  4.         Data string //区块数据
    : t; J% c+ E; }: M& J
  5. }
    ) V1 A. q* b0 d
  6. //计算Hash) S' c  M& F* _2 h
  7. func calculateHash(b *Block) string {6 p2 ]5 \2 A2 O- {. {! H; d/ C
  8.         blockData := string(b.Index) + string(b.Timestamp) + b.PrevBlockHash
    + z3 G$ y9 p* t6 J) p
  9.         hashInBytes := sha256.Sum256([]byte(blockData)); _5 ^0 @0 x+ H- A- g7 e+ y' Y0 q1 J! h
  10.         return hex.EncodeToString(hashInBytes[:]). G0 _: r0 d2 U3 h: c7 X, k! m8 U
  11. }
复制代码
4 C% E. N3 ~3 r! |1 a  G/ Q9 V

- d; O! C( Q$ W+ a8 S+ g//生成新的区块* W, j4 E8 ~4 X& j) Z
func GenerateNewBlock(preBlock *Block, data string) *Block {
8 F: }# [+ ?9 t- U        newBlock := &Block{}
4 X3 {. W) j) S! L; Y' h) e3 b        newBlock.Index = preBlock.Index + 1
* X# P' ]2 {6 V/ S2 ^# R        newBlock.PrevBlockHash = preBlock.Hash: L" k! _8 `( b& h
        newBlock.Timestamp = time.Now().Unix()% |' z$ u8 w; [% @4 U
        newBlock.Hash = calculateHash(newBlock)
6 r5 Z! Z6 |& Y  ]2 K3 F! S        newBlock.Data = data2 Q4 _6 H% m, i. B, \
        return newBlock% ~" q( q8 F: z
}* u6 t9 b1 c6 t" I! N

3 x9 [: c) t  E6 ^$ w//生成创始区块0 N# j7 y! R1 e, w
func GenerateGenesisBlock() *Block {3 Y, V( |* Q5 u$ K9 O) M
        preBlock := &Block{}
. ^( E" t4 N: q0 q) b: I# J2 M; P        preBlock.Index = -1
% O/ X" m1 s7 _6 M        preBlock.Hash = ""
- t3 G( v5 c4 }3 Q8 l        return GenerateNewBlock(preBlock, "Genesis Block")
5 K5 J' i  f2 c}
  M& t' d! P% e1 o9 `4 X. i- g将基础功能实现的块进行链接 实现blockchain
+ c' Z6 K- f. T4 H; G+ W, p7 u8 npackage core: T# m9 j& n& @+ G) u- |7 T" O
- `+ w* l' B7 L, ~2 {+ R
import (6 G# ?& g& G# C" n4 c7 R
        "fmt"
7 k. J2 h! ^9 d, |        "log"$ [+ w4 v7 B9 e0 @4 C9 c
)$ A1 \0 |0 t4 R# i% p, t
8 g9 J6 Z9 u: d1 Z2 ]
//定义区块链
. I, o& @8 H8 D. w& Y5 ftype BlockChain struct {
: c* c* L2 N5 Z. H        Blocks []*Block
5 ]  B4 P: [1 M% j/ ?2 g* |, C}
( b4 ~/ N8 S* K% ?4 z2 E9 u9 M: U 9 P5 w) G( q1 X* H2 o2 L& Q
//创建一个区块链6 V! Y% A; D9 e1 D1 y
func NewBlockChain() *BlockChain {
" U+ _& \% V4 O- l2 d+ S( Z        genesisBlock := GenerateGenesisBlock()
/ v, k. {! w3 Q4 J        blockChain := &BlockChain{}2 X5 Z( e4 ?! ?
        blockChain.AppendBlock(genesisBlock)
$ F) I* G. @3 ]: f: L" i& f        return blockChain
4 ]* A' h; }5 w; M' \4 Y}+ G$ S/ Y2 Z* `2 E( H
6 K$ }6 Z6 J& g; B) c
//记录区块数据7 {. t, a  z- W! ]2 g
func (bc *BlockChain) SendData(data string) {1 h# X1 u6 r2 }( k3 j& r
        preBlock := bc.Blocks[len(bc.Blocks)-1]. d- U! W6 Y" L! W: L5 X4 o
        newBlock := GenerateNewBlock(preBlock, data)
( ^7 Y; {% Z, O: R3 {( f! `        bc.AppendBlock(newBlock)- j" y9 M9 G* m4 g
}
. N/ X# N9 a# Q; t) \9 b
6 q8 S, Q' _! ~, E: V- ~! b' y//往区块链添加区块
! X1 D0 p8 b( G' m! b% Wfunc (bc *BlockChain) AppendBlock(newBlock *Block) {- l( _) x. q, }8 b+ ^4 P" Z
        if len(bc.Blocks) == 0 {: X( Y! A5 X# @% |
                bc.Blocks = append(bc.Blocks, newBlock)9 k$ g5 W! ]( w
                return: N- [' R$ U/ M# k! Q
        }
( Z' p8 i9 m8 J        if isValid(newBlock, bc.Blocks[len(bc.Blocks)-1]) {
8 q  G* x2 D8 Z, o                bc.Blocks = append(bc.Blocks, newBlock)6 ~* E' X; @9 K0 Q% q: ?
        } else {
6 ?% ?  }* ^& ^0 X: j                log.Fatal("invalid block"); s! A8 R2 Z  `4 h8 b+ K9 A1 D$ N% b+ z
        }- q1 H5 ^5 q8 w% a: o; P
        return
' x3 o/ Q9 I- _$ ~) h* c% R}- o! H$ Z, Y9 P1 M- D( {8 ]
2 g: v/ X- ]% a1 M' S
//输出区块链信息
: |- r& R$ X: R) E) [- S4 Afunc (bc *BlockChain) Print() {# O& R. `, e1 w# p( z! p
        for _, block := range bc.Blocks {
7 ^' S/ I( W) ?5 S# \( i5 z. _/ ?                fmt.Printf("Index : %d\n", block.Index)0 K3 E, g: a) `+ x
                fmt.Printf("Prev.Hash : %s\n", block.PrevBlockHash). @! A) L) C4 E$ S
                fmt.Printf("Curr.Hash : %s\n", block.Hash)
4 m* F4 J+ I/ N- f2 X5 |% S                fmt.Printf("Curr.Data : %s\n", block.Data)! @( ]2 Y2 a0 p
                fmt.Printf("Curr.Timestamp : %d\n", block.Timestamp)
. B' z# v7 o! f- h8 Y4 m* \                fmt.Println("==========================================")6 z4 ^- c  e7 M: m; y
        }) h/ [* @- y5 e! i
}2 G& ]% H+ M# g: {* a4 g) a/ G3 c
2 v* R2 C# J/ a
//验证区块& H& ~# C7 _4 u7 u4 [* v
func isValid(newBlock *Block, oldBlock *Block) bool {
1 x8 i% x% C4 E! i        if newBlock.Index-1 != oldBlock.Index {7 s9 q7 [$ |6 F$ ]/ p6 V2 N
                return false) k6 Q) k) ^% m$ c
        }6 I. }0 c, h9 s# D1 j/ V3 L
        if newBlock.PrevBlockHash != oldBlock.Hash {
' u0 g9 {/ O* h. X- Y7 M2 d' Y0 K                return false& w9 C) T0 R9 s/ z' l, P+ ~
        }) L2 n- Z% b4 Y% \$ n8 h
        if calculateHash(newBlock) != newBlock.Hash {2 W9 b' X8 @( w5 V2 m
                return false& I: {! o- K; ?% K3 r7 M
        }7 ~2 ?6 y& _9 l3 D
        return true
6 t# b6 m' h5 T}/ J+ o3 q1 A' u4 N% S7 a/ Z
实现RPC接口的交互
3 D8 |: O; [3 w, A, O
  1. package main! X/ N/ z7 \. F' W. `5 w6 d+ ~0 x

  2.   F4 |+ s/ V/ l' P; B
  3. import (9 j* r- k+ v) E. X( u
  4.         "encoding/json"
    2 k/ _8 j' P3 T, h$ z4 s9 n3 V
  5.         "BlockChain/core"  }9 L  c* Y5 @
  6.         "io"
    ! @1 Q0 r, F. X* N, z
  7.         "net/http"8 J) n/ g* u4 ^& E8 R9 B" D# }5 A% F
  8. )
    ( N4 l# p2 B* b* s
  9. 7 V% ?( l. E8 F2 N7 l) }; Q' ~( I
  10. var blockChain *core.BlockChain
    1 y2 C- p8 U8 V+ a* o$ m
  11. 7 ]  c' n( I, L
  12. func run() {
    & t, M$ ?, w" ?; a5 h$ D
  13.         http.HandleFunc("/block_chain/get", blockChainGetHandle)
    ( P+ y- R0 l& h/ @! ?0 Q. h7 }* W4 |
  14.         http.HandleFunc("/block_chain/write", blockChainWriteHandle). I" K- C; R7 q3 c6 d1 G
  15.         http.ListenAndServe(":8332", nil)
    ; y! M: V( I( H( _$ U5 Q
  16. }; j% R2 \2 g* v* @" f' v# C3 }
  17. 7 l  ~2 w  L1 |" ]% f; Q1 R0 D
  18. func blockChainGetHandle(w http.ResponseWriter, r *http.Request) {
    ; C- [5 N2 G. E7 v. y
  19.         bytes, err := json.Marshal(blockChain)
    / O9 l" C+ t2 ^. n5 d
  20.         if err != nil {% N! v; f8 S+ L3 Y1 n# h& H; ~
  21.                 http.Error(w, err.Error(), http.StatusInternalServerError)( E7 s0 J& i# P0 [" @; F" t
  22.                 return% q+ M' N# m" f
  23.         }
    6 \- b  j$ m7 }
  24.         io.WriteString(w, string(bytes))4 N/ p' n. g' n4 B1 O( F6 s
  25. }9 H4 a) e/ S2 i3 J' x4 I/ l( M. ]9 H

  26. $ M* e' M2 c8 l7 i
  27. func blockChainWriteHandle(w http.ResponseWriter, r *http.Request) {, m8 ^: N2 o% u( o* I0 ?, a/ D
  28.         blockData := r.URL.Query().Get("data"). v$ A( X$ g& p% Y% Z
  29.         blockChain.SendData(blockData)2 h% n) |4 ^0 r* {
  30.         blockChainGetHandle(w, r): D+ A6 ]3 v. n9 o* m' `" R1 E
  31. }& ~9 Q: d" w) m5 N, ]7 `1 w
  32. % B6 ~/ I( `4 i4 Y; r1 R% d6 b
  33. func main() {$ m) m  f' i% ^7 |/ N$ w
  34.         blockChain = core.NewBlockChain()
    & |) L" O0 g. d! |
  35.         run()
    ! P/ ^- x" K7 T( A$ w
  36. }
复制代码
- q- E+ W/ U; N
通过两部分代码实现简易区块链的RPC调用
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

朋友一起走 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16