Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
在本机端口进行查询 由于是第一次运行该链 生成创世区块
4 t2 O3 W4 O% i) j2 t
. w/ }' Q4 d1 T: ^# B  n通过http实现RPC命令的调用  实现添加块
3 C5 f' F0 H; M2 R5 L0 B2 d
) F/ E7 m  C2 h: x查询当前所有块的信息
! N9 B9 `- A# N2 n
6 W& i% I7 F% a8 a' x: l9 p1 C这里只做了两个命令 分别是get和write
$ v; W/ O3 N4 l源代码如下2 l4 r/ D6 |, ]3 d1 ?9 i
基础功能的实现
. T: ?/ d& ~' i2 I  o; _
  o1 v! I2 g( Y% q8 X2 mpackage core
* w' l# Z2 Q! eimport (. z5 i0 s7 J& F) X  r, x+ i
        "crypto/sha256"
9 K. o) f& C- Z0 b% f        "encoding/hex"5 H' H8 l, e  W6 }% v
        "time"2 v% M8 u/ |& E# e7 o0 ~7 o3 k
)
  }% B6 t8 G2 a, P4 f0 J. x//定义区块
8 m# R- Y/ p; ztype Block struct {0 I7 a% ^+ I. O1 J
        Index         int64  //区块编号
2 A. U4 [1 L; r3 ]! ]. _   
  1.     Timestamp     int64  //区块时间戳
    6 I9 J9 l4 ?$ S( N% u$ R  l
  2.         PrevBlockHash string //上一个区块的hash值
    + t7 U: J# _( x, A% O
  3.         Hash          string //当前区块哈希值. g1 V8 o: ^$ H+ \
  4.         Data string //区块数据
    9 [. i" q8 M; `/ O' a
  5. }/ k! L, {# F& o" t
  6. //计算Hash: |) q* d" h$ |$ `+ A$ L0 _  h  `
  7. func calculateHash(b *Block) string {
    ( r$ Q  b2 i0 U# z) z! @0 a( `
  8.         blockData := string(b.Index) + string(b.Timestamp) + b.PrevBlockHash& j. d" b' \4 F( c5 L5 M% N
  9.         hashInBytes := sha256.Sum256([]byte(blockData))
    0 V+ s5 O! Q, D2 \; X8 v. a
  10.         return hex.EncodeToString(hashInBytes[:])
    " ?' P9 M3 Q8 [* M
  11. }
复制代码

( A% n; f* c$ r. E / T; r) t/ n3 J% q4 f$ {$ w# z
//生成新的区块
: j! U0 G- ~0 D  B& i7 _func GenerateNewBlock(preBlock *Block, data string) *Block {4 ]1 \; e9 Y9 l' b& u$ g
        newBlock := &Block{}
% P4 X# g4 @4 k' A2 k7 M3 u# |4 Q        newBlock.Index = preBlock.Index + 1
  O; ]; b: V0 i' J9 L! ]        newBlock.PrevBlockHash = preBlock.Hash
( f/ q" s2 Y; Z! w        newBlock.Timestamp = time.Now().Unix()
9 i5 @( M/ B+ J        newBlock.Hash = calculateHash(newBlock)" A7 E) `: D3 I5 r0 N! v8 U
        newBlock.Data = data
/ B/ n& m( _* D        return newBlock3 e; T2 Z9 {. v7 Z* u& l8 }
}
6 I. F( H/ a; N& V- C  O6 e2 u
2 }; o$ x+ |9 v. U$ _//生成创始区块9 B9 q8 H" _1 F( n5 A
func GenerateGenesisBlock() *Block {- z, a2 A! n- r3 J2 R. V# X  x
        preBlock := &Block{}5 u  w8 U8 ^, L
        preBlock.Index = -1% T! v3 ^8 [: l; y& u
        preBlock.Hash = ""$ q  \( I+ S# L7 O& }
        return GenerateNewBlock(preBlock, "Genesis Block")
  V/ U+ F) m, e}
3 b* b/ K* |3 L( m- Z将基础功能实现的块进行链接 实现blockchain, L6 ^3 p* M9 U* V" w0 l# s
package core
- T1 W0 J- R- F/ S
4 A2 ]' z6 U6 e6 k0 T# rimport (/ Y/ J' _- `) L
        "fmt"2 ^1 B6 }2 \9 C% X/ y) s& P
        "log"0 t' R3 N9 a& K( v# Z
)
0 a( A% O1 c5 h) \ , O7 i' S- ~3 Z! m
//定义区块链  t3 t- u, n/ s# p6 L% t7 Y
type BlockChain struct {
9 h; }7 ^, R5 }* ]$ s        Blocks []*Block: I, c; e/ N( H8 i/ `* T2 T/ R# W
}
& R; _" s  P, z7 L; \8 |3 t4 m/ b: I
0 [0 X6 F' y3 H//创建一个区块链2 x: L% A6 |& z: |- d5 f
func NewBlockChain() *BlockChain {( o4 Z: ^2 Y6 ]+ `3 h7 i
        genesisBlock := GenerateGenesisBlock()) F7 [  O$ P0 X* y' [
        blockChain := &BlockChain{}: v6 t& x6 C# \) `, c0 ^
        blockChain.AppendBlock(genesisBlock)
( D6 d* d7 r& I; O6 @        return blockChain
8 F7 l* v+ V9 u5 N, D1 ^}
8 e3 |% G5 h+ }+ d2 C8 }9 L
  `2 m7 K+ r* B0 w//记录区块数据$ q- {; p8 y/ K
func (bc *BlockChain) SendData(data string) {
2 Y# s" }4 B8 b6 L4 r1 e$ B  Q        preBlock := bc.Blocks[len(bc.Blocks)-1]
8 c6 m% @* s8 |/ J+ ?9 p' `2 V        newBlock := GenerateNewBlock(preBlock, data)2 A: |8 J+ g2 C% x3 ]$ F$ |
        bc.AppendBlock(newBlock)
& c1 p4 H! W% _0 i}& Y7 s' W- m9 y  s" `1 }

3 j, J$ }% e! s. z7 g' F//往区块链添加区块$ I. u; {* G9 }* e
func (bc *BlockChain) AppendBlock(newBlock *Block) {2 Z. ]( B4 K/ ]
        if len(bc.Blocks) == 0 {
! W* m/ I. o3 x9 r' \4 U, @# p                bc.Blocks = append(bc.Blocks, newBlock)6 k+ O2 z/ y. T, g. N: C
                return+ N6 _. s5 y. U3 J
        }
' n3 u$ M$ c/ g# c7 a        if isValid(newBlock, bc.Blocks[len(bc.Blocks)-1]) {5 i" x6 s8 |& g% T% E
                bc.Blocks = append(bc.Blocks, newBlock)
7 x  o. l) B3 f1 |! g. A/ q( {        } else {
: p/ Z/ V9 q1 D+ ], ~                log.Fatal("invalid block")
, f2 P( t  N- n" R- \        }! t0 e' c+ T; b  s) O9 Y6 P
        return
" i% I+ F6 c9 M' v}( m' q0 W8 |. y4 n
0 Z" ~/ n. Z2 m" d9 c) f
//输出区块链信息
- Y! @+ A4 [1 P0 efunc (bc *BlockChain) Print() {
' G  s( ~( @/ v) i( Y( r7 b% _0 V        for _, block := range bc.Blocks {4 I$ {* |/ E& x" A
                fmt.Printf("Index : %d\n", block.Index)6 f; @0 L2 p' C8 u1 X3 j2 X$ U
                fmt.Printf("Prev.Hash : %s\n", block.PrevBlockHash)9 H7 X4 y! p/ n  O& i" R0 _
                fmt.Printf("Curr.Hash : %s\n", block.Hash); J  \' X2 A4 L0 C, A) r, b
                fmt.Printf("Curr.Data : %s\n", block.Data)
* K. U6 T8 j8 A# d1 r: q! t) {                fmt.Printf("Curr.Timestamp : %d\n", block.Timestamp)
( L0 |$ t" G4 W4 P9 U                fmt.Println("==========================================")) y8 C" y3 O' I
        }  i, J5 t: G' W6 M" @
}
. Q- [+ I+ U0 i& ?( Q$ Z ( @9 `$ E3 h) n' ^! P! S
//验证区块! |* _( c3 v4 {2 T
func isValid(newBlock *Block, oldBlock *Block) bool {  R5 K& [: m# C! Y7 U$ v4 U6 c
        if newBlock.Index-1 != oldBlock.Index {
0 p4 K7 e2 ?( V& `9 M                return false
- ~( S* Q/ a0 \. p4 b$ V9 I        }
. A0 l. @) T/ p; F% g( \6 g2 T7 {        if newBlock.PrevBlockHash != oldBlock.Hash {
. K5 h& B7 J, ]7 }7 _( U                return false
" F. G. C) _# T        }: k* L) i+ h* N) N, F- @5 G5 f
        if calculateHash(newBlock) != newBlock.Hash {
3 l% A, X$ r1 h- u7 I                return false, F+ g: U5 w: p! d% m/ H; H
        }
7 d0 S+ g* c( K3 ]        return true
  T% p" g0 A0 Q}
( I# e  `% d' E( C' S3 b, n实现RPC接口的交互
, D* [: H+ N: f6 N2 D0 k# F3 ?
  1. package main$ C1 m# n! E8 j+ c3 W
  2. ! L$ X! J: P, I
  3. import (
    7 @& g  Q+ P( h
  4.         "encoding/json"
    2 J& `! B' d7 }4 ^: ~" ^+ ]4 Q: p
  5.         "BlockChain/core"
    9 Q. M7 z$ a1 u, _) U
  6.         "io"9 I, c2 z' P9 t
  7.         "net/http"
    & \; x3 f3 q7 C7 Z+ [! Z
  8. )
    / k! s" `" M9 B& W0 J
  9. 9 b9 _- P) t) ~5 m+ l+ N
  10. var blockChain *core.BlockChain
    5 n* C9 n1 I% S0 v0 K" n6 J7 {

  11. ! {2 H$ j; D  q0 q
  12. func run() {) {9 }) T5 \9 E, R( x6 ~2 c8 W
  13.         http.HandleFunc("/block_chain/get", blockChainGetHandle)
    ) {6 X3 P9 U  n5 \9 ^# x
  14.         http.HandleFunc("/block_chain/write", blockChainWriteHandle)
    ! f5 t# P. u0 V: ~( g
  15.         http.ListenAndServe(":8332", nil)
    ( R* i& E/ P* H9 j9 w3 _6 _$ x! y
  16. }
    4 o+ r5 h2 a$ D  t* I, H
  17. ! U, g1 z6 g) g
  18. func blockChainGetHandle(w http.ResponseWriter, r *http.Request) {
    : x% s- K1 D  U- ^; W5 n3 Q6 r
  19.         bytes, err := json.Marshal(blockChain)
    * N: |9 e, w/ z, g
  20.         if err != nil {, B! \5 Y- c; |
  21.                 http.Error(w, err.Error(), http.StatusInternalServerError)0 `# q" |" Q! P! \) z/ t& y& C  f) t
  22.                 return6 c. V( R! i2 n  E) s
  23.         }5 R) i$ j+ t' l3 w* N
  24.         io.WriteString(w, string(bytes))
    5 n9 |* K  y% B5 U8 w5 n3 `" S
  25. }2 e4 n* j& X9 _( p
  26. ( T( R( y5 M2 S
  27. func blockChainWriteHandle(w http.ResponseWriter, r *http.Request) {+ Z  h4 H8 }9 O2 P  l
  28.         blockData := r.URL.Query().Get("data")6 t: ?5 P0 B, I2 r! H+ q
  29.         blockChain.SendData(blockData)8 k( [5 }0 r% |' O4 h5 K7 `+ x4 t4 q
  30.         blockChainGetHandle(w, r)
    $ V0 e6 B# r1 X2 J
  31. }
    * }2 N5 Y% z& d; c, p( v' d9 E# F

  32. 3 @! i+ V- {# }& s) f
  33. func main() {4 k2 d0 y5 L2 N1 ^
  34.         blockChain = core.NewBlockChain()
    " z$ S. W" _! F0 K0 j- |7 `5 Y- }
  35.         run()  @( G2 c$ K2 G4 j' N9 W- n6 [6 \+ b
  36. }
复制代码
5 q5 `" Q8 ^# s) j. R
通过两部分代码实现简易区块链的RPC调用
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

朋友一起走 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16