Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
在本机端口进行查询 由于是第一次运行该链 生成创世区块. [9 C8 V7 {9 E! r

, V% m$ l% p* J3 g7 U  A通过http实现RPC命令的调用  实现添加块
" U- m7 w, g; v& Z$ N( \+ q4 z0 i
! b) @2 A- @5 F+ d+ d; d查询当前所有块的信息
2 H5 i) H, [+ `4 z) q
" T$ A: S* D! Q( |1 n% ~/ D这里只做了两个命令 分别是get和write1 ^. n9 p& c( q" H3 H9 ]6 Z6 D6 L; c
源代码如下4 |1 l8 T1 e. f4 K' k. m
基础功能的实现+ W& n% ?+ o' q& o

! E7 x, R2 |  I1 Lpackage core1 y4 C' c# Z3 T& ^" J
import (  S1 F/ O4 w* |) O6 z
        "crypto/sha256"
; R, X; }( ~/ v2 o: X9 M        "encoding/hex"! d1 R. [$ o" m) y5 l' Y
        "time"0 q$ e) e9 X5 u" h) Z& T& z# c
)! A" D1 k# F  f0 L0 X
//定义区块6 n0 D- p7 J/ U6 }" s% ?
type Block struct {" E. F" O5 L& b4 t, |
        Index         int64  //区块编号2 M& i. `4 a! |4 W7 Z/ H+ S
   
  1.     Timestamp     int64  //区块时间戳
    6 G/ ]9 H: Y6 l9 T% p& Y% G. e
  2.         PrevBlockHash string //上一个区块的hash值8 ~7 X1 @8 ]  r! c( u2 X2 p: b
  3.         Hash          string //当前区块哈希值( Z2 K, u0 d8 O* }( N) }
  4.         Data string //区块数据
    / @2 }0 x$ R9 c: @" D+ c' {
  5. }3 u8 w+ ]5 ]. O3 _6 \
  6. //计算Hash
    ; g5 K1 u: {5 w0 f' t% O! @
  7. func calculateHash(b *Block) string {
    % m& I+ X3 e2 _! n3 ], }1 N+ D
  8.         blockData := string(b.Index) + string(b.Timestamp) + b.PrevBlockHash/ O0 A1 X* S$ B  l! H* e! T- Q0 I8 g
  9.         hashInBytes := sha256.Sum256([]byte(blockData))
    6 Q& |; ~2 `7 b" w7 x
  10.         return hex.EncodeToString(hashInBytes[:])- G. j( j6 i) ~# Q3 d+ ]; E
  11. }
复制代码

1 x$ w( R# F; v# e8 }# N6 o' q
( a) x' e6 z% l+ c% x//生成新的区块
+ U- ~" b5 R& Z* Y, @: J( S- \func GenerateNewBlock(preBlock *Block, data string) *Block {7 g( Y3 b5 M" ]4 `& f
        newBlock := &Block{}
1 ~* f! N% I; K2 d7 W) L5 X        newBlock.Index = preBlock.Index + 1
( ~! j; [" q! g# x6 J( d5 Z4 a; O6 x2 L        newBlock.PrevBlockHash = preBlock.Hash& \' f+ \- B6 i$ t- k1 H! _
        newBlock.Timestamp = time.Now().Unix()
4 e1 v5 U! H4 D0 k        newBlock.Hash = calculateHash(newBlock)
4 k  \3 `" V6 }. N6 |3 E& V        newBlock.Data = data
2 B2 b/ k' k- N) x0 W1 E( L        return newBlock
0 a. N% {9 p9 i# c% J% R  n}& a4 J. x; F. w7 F5 @( k& z
$ ]& l# [  t: {! W2 H8 O( `' N
//生成创始区块. @+ k2 \* t7 J3 _6 v) R4 a
func GenerateGenesisBlock() *Block {
& R0 Y  ]0 v2 I3 p5 |7 y        preBlock := &Block{}
- \5 N; S/ x/ \0 m$ ]2 n        preBlock.Index = -1
# }& f1 N: w1 i2 u( Y' s2 K, c9 M        preBlock.Hash = ""
- o8 A4 R; c/ p; ~; q6 w        return GenerateNewBlock(preBlock, "Genesis Block")
2 v% N- H% C4 ^$ V; j2 M. E4 @2 E}: q; L+ L4 j. X$ S3 W7 S! L
将基础功能实现的块进行链接 实现blockchain
) c( G. e- F  y4 _9 |3 ipackage core$ g- M5 J5 @. e  |5 d

& H! c6 |$ ]& K/ W/ gimport (
- {- P% {1 t' s* e* p3 f! j2 a        "fmt", p3 F# g) X2 o+ @& x
        "log"
3 v' z& R: P3 a0 l2 E: ~3 U)
. n9 Q# M4 e$ O, _! L# `
: x& y0 W! M6 c$ }7 \1 ]//定义区块链
+ Q& j1 w: e8 r; H9 B* mtype BlockChain struct {
* r2 X; O3 I( x4 I9 }7 N        Blocks []*Block5 F1 {8 u1 V4 [3 k+ Z% U
}; K( i0 O/ N# v3 c7 G4 P
* ?2 l" ?2 q5 g  v$ a- @
//创建一个区块链" x2 h! l! i5 J. f+ J  N4 z
func NewBlockChain() *BlockChain {# L; z+ Z8 T2 b: I& M' {
        genesisBlock := GenerateGenesisBlock()/ S/ M+ {- g+ g( p
        blockChain := &BlockChain{}- B# l! U* K2 R' _3 e
        blockChain.AppendBlock(genesisBlock)
. a& a: E1 E+ K- T, g4 g  [        return blockChain
1 B. M5 K; r$ x1 o* Y5 K}; L- p  A% [# e- G8 o4 L

8 M& ]: U% Q- o% Y- @6 f* e5 M//记录区块数据
- n! u" m2 t& f0 @8 xfunc (bc *BlockChain) SendData(data string) {
; \( |. X4 F1 H, O. P7 Q        preBlock := bc.Blocks[len(bc.Blocks)-1]
. X1 j+ k/ q1 F; l. S, ]3 y8 K        newBlock := GenerateNewBlock(preBlock, data)! D& B, P8 Y( H9 h+ Q
        bc.AppendBlock(newBlock)
0 \- t% }2 U& |}# `" x' u" f! P1 p" v( e9 X
- I& P7 ?1 {6 _( E; E3 K
//往区块链添加区块
4 Z* x) @6 A6 g2 Q) o+ Dfunc (bc *BlockChain) AppendBlock(newBlock *Block) {; P# h0 `! V! J0 I) _  s
        if len(bc.Blocks) == 0 {
+ j4 H/ B) L  @: G) e                bc.Blocks = append(bc.Blocks, newBlock)
  |  b& Q7 i. Q: W4 R                return
7 z3 t  k$ A1 f! @  n: Z        }
4 m9 k8 f- _' o. z5 a        if isValid(newBlock, bc.Blocks[len(bc.Blocks)-1]) {7 r: B' F/ M' g0 Z& ~
                bc.Blocks = append(bc.Blocks, newBlock)6 p4 J4 ^( Q% t( H; k8 e# N
        } else {
4 K+ x% F8 t: R9 d                log.Fatal("invalid block")
* j4 c7 I; |4 u- K0 P" |        }
# c% Z9 y. R. c3 J        return) I- p9 Q3 V$ J+ i9 Y' G, @
}2 a" a  \9 F+ a- G0 d2 |7 @

7 r3 r! y  v; g' ]/ d* K: t- M//输出区块链信息# a! d( \- T$ ^: H  g7 \( T% X
func (bc *BlockChain) Print() {" N8 \1 B7 Z! D
        for _, block := range bc.Blocks {
4 N, z( m! A7 z8 x( J9 R                fmt.Printf("Index : %d\n", block.Index)# J6 M$ s, A9 f. q0 n9 d
                fmt.Printf("Prev.Hash : %s\n", block.PrevBlockHash)3 b6 g) q1 l3 R
                fmt.Printf("Curr.Hash : %s\n", block.Hash)! z/ i3 n  S1 P. Y+ C8 v  n: _) L
                fmt.Printf("Curr.Data : %s\n", block.Data)3 B4 g, V' z- ^. Z5 @+ C
                fmt.Printf("Curr.Timestamp : %d\n", block.Timestamp)+ K7 y' Y# {# N) G6 V3 G' f
                fmt.Println("=========================================="); w6 g, v9 ?$ b/ w
        }
3 F* j1 l" R, [+ X}
8 G6 ~7 m  J+ e4 |+ Q 4 u$ T- D' _" _! G/ x% V6 }
//验证区块
: M" P* _7 Y7 a; x6 N6 t9 z* F3 vfunc isValid(newBlock *Block, oldBlock *Block) bool {
  m: X. A% v. s6 ^% }        if newBlock.Index-1 != oldBlock.Index {
' s+ I! L8 `' K. }                return false
5 O# f2 r( v& f8 D: a! Z8 S' g' r+ Y        }
% u0 Q( n. n9 D8 K; O$ X# X        if newBlock.PrevBlockHash != oldBlock.Hash {! _* l+ B9 h3 W" e* O
                return false$ q) d( f4 K; O: j6 ?
        }/ Z+ a3 o7 I/ k* H% \; t5 o
        if calculateHash(newBlock) != newBlock.Hash {
% R% R  L! S) G                return false! i' c. h7 l. [0 a+ {- O
        }
9 F1 R! ^; ]" \$ q( x        return true
) F2 ]  y$ [  v2 {( n- Z- z* }}
$ W9 [; `. e5 J; v; e实现RPC接口的交互
, n) a5 p; \& [6 }/ E, K$ A
  1. package main7 C5 m- u, w' Q4 [
  2. 0 q+ m. r# f. p
  3. import (
    3 L( C: U: B4 \! g7 X1 y4 d) n
  4.         "encoding/json"
    ! z0 z% d8 G; I' W- i
  5.         "BlockChain/core"* p& p. Y0 L( r& m" b
  6.         "io", ~) e- W, x; l7 Q
  7.         "net/http"
    ; L4 x. G- t& t% n% b5 |
  8. )2 N! G- [! Y5 ?
  9. # t. P, H2 m+ h+ Y3 e
  10. var blockChain *core.BlockChain
    ! u6 j% L9 v1 A2 j! u

  11. ; `& ]1 C- J2 j# k0 K& F$ d( o
  12. func run() {
    " Z# k3 V2 x9 N2 {
  13.         http.HandleFunc("/block_chain/get", blockChainGetHandle)4 h& c- N* I4 y. \
  14.         http.HandleFunc("/block_chain/write", blockChainWriteHandle)
    6 S# f- n* T  c& X
  15.         http.ListenAndServe(":8332", nil)4 _" M+ `" b! S4 I
  16. }: q& `0 i! y0 N8 c  A

  17. " |+ i: A* I# y- E7 i0 k! g6 k3 y& B
  18. func blockChainGetHandle(w http.ResponseWriter, r *http.Request) {$ w" A6 R- _4 o
  19.         bytes, err := json.Marshal(blockChain)& p8 P3 f% m  [& g! d
  20.         if err != nil {7 I* R* d* u4 z3 j
  21.                 http.Error(w, err.Error(), http.StatusInternalServerError)" o- _0 s: c) f
  22.                 return5 p2 M( H* a3 d5 V0 }3 |' A
  23.         }* w0 `, u9 ]9 ~
  24.         io.WriteString(w, string(bytes))
    & n% I2 [, Q2 K1 r5 C. j# W) B
  25. }5 E) L, D, @. m- ?+ _6 |, K$ ?
  26. / Z+ a' u/ {; g5 w' t
  27. func blockChainWriteHandle(w http.ResponseWriter, r *http.Request) {
    3 S' o. x2 N/ @$ F$ S- d
  28.         blockData := r.URL.Query().Get("data")& Q' P1 o9 H: F# d- I& q* k
  29.         blockChain.SendData(blockData), l, V" ]- S0 D. L1 y
  30.         blockChainGetHandle(w, r)0 C# i3 ], s7 d% R" S
  31. }
    2 |9 l% j) w& `* T/ S  s' K" X5 b

  32. * J6 Y! x. S0 [7 j# G8 U- u
  33. func main() {7 m( f* E* G- m5 l$ ~5 \7 H
  34.         blockChain = core.NewBlockChain()- {6 h% N( X; |: a+ C4 E
  35.         run()
    ! S# Y! n3 w% G* N
  36. }
复制代码

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

本版积分规则

成为第一个吐槽的人

朋友一起走 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16