Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

在 iOS 中实现区块链

一夜雨十年灯潞
124 0 0
区块链(Blockchain)是比特币等流行的加密货币背后的技术。区块链的主要概念是去中心化,提供分布式账本。本文会为你展示如何在 iOS/macOS 中使用 Swift 语言创建最基本的区块链。) e4 `/ L0 e* s. [* F) M
注意:本文不涉及节点(nodes/peers)、验证和奖励等。
9 w' x% l- W% A! E我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。
; z8 B: I$ l+ J) L: `0 r0 E  ]实现区块类
. K5 C5 ~" _' k# P0 m第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:  [* f& A6 F/ d/ j0 O3 ]3 m
class Block {
; D# o/ c& U5 P& z* j! i' k+ {    var index: Int = 0
! \* a2 ?2 w0 N  E. `    var dateCreated: String
' m9 p+ @# H; d! P3 n    var previousHash: String!
4 }; p4 c8 `, W& ^    var hash: String!( m) ?- X' h' Q$ d8 k
    var nonce: Int
: h7 B: |5 ?. f1 r8 M, w    var data: String+ ~0 I% q' J9 t/ K1 m6 I, U
   
6 f. p) h: @; W0 v& \, f, V    var key: String {, A/ F; B7 E; Z" k' S& ^7 H) C
        get {
7 r. _1 |6 Y- I; z8 J6 |& J            return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)
( c; F8 ^: G; }% N6 a8 n        }3 }! {$ k& k4 l, k' @* ^
    }
' |; s$ f: T( V; f( `! x; `    . g; E' `/ e: Q: R6 e) u  B+ G" ^
    init(data: String) {- t, d, v; @/ N3 {/ w  M! D2 G
        self.dateCreated = Date().toString()
7 f  G1 K. v- @/ z6 r        self.nonce = 06 M4 }2 j. {7 f; Y7 r
        self.data = data
0 t* ~; V! P- |8 u5 s/ I2 V    }
# X! W2 D4 d* X3 h}* p6 D/ x; m, q1 \
区块类详解:6 q+ u( Z2 R% `) `" E
index——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数+ [. c8 u+ \- p, ^" M
9 V& ]) f1 X& Q3 s
实现区块链类* r4 k+ s' M( D. q
区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:$ C  H( ]- I1 `* Y( D% I
class Blockchain {
# Q$ K6 J  L, Z/ y% B, j    private (set) var blocks = [Block]()
2 x( ]7 y9 I4 U/ {) T   
9 H. U, t8 O  f7 z3 c3 q    init(_ genesisBlock: Block) {+ b7 b# O8 l, }, ^, \
       addBlock(genesisBlock)0 m0 |) h* q- N$ `' m
    }  R) B- l! w$ w( w; X
    7 U+ u7 i& |8 r4 j
    func addBlock(_ block: Block) {
0 W( B" I9 W, B# o; X, ]! ]  h        if blocks.isEmpty {5 \" P% y" r+ G  B- T' ^: D) P
            // 添加创世区块) t6 c* ~9 O. C* m. b# z0 a
            // 第一个区块没有 previous hash
; {) i7 Y1 {5 \( G            block.previousHash = "0"$ M) ^# F7 q, P' I1 P+ e
            block.hash = generateHash(for: block)
  y( x' P7 ?# v7 j8 |) z* F        } else {
7 x3 l3 v$ s5 J+ _6 V            let previousBlock = getPreviousBlock()
; v* J3 D/ h5 z+ X" @  }0 {            block.previousHash = previousBlock.hash
1 ^* m" u0 n, d& s# K$ n4 ?1 W6 x            block.index = blocks.count
7 O+ L5 i2 t9 h+ E  M) R            block.hash = generateHash(for: block)& O0 ~. N% s% k
        }
  M5 u9 Z; ^( ~3 m5 W% z! W. G        
+ P) c2 i0 J5 V& l1 P+ r        blocks.append(block)! S9 c2 L& ^/ m4 N
        displayBlock(block)
" j+ u' a: G2 V  P    }
+ ?! K$ W7 J5 X* p    0 n. O3 c5 v4 j5 f- G& B
    private func getPreviousBlock() -> Block {9 @5 n% F" ^$ U) N) s1 r
        return blocks[blocks.count - 1], G! S: t' v' h% H. B& s1 C
    }
8 B! G9 z; A* [( ]; f   
# d" y8 M& f7 x. A5 Z' I    private func displayBlock(_ block: Block) {
) f8 M& [( z4 Z5 h        print("------ 第 \(block.index) 个区块 --------")) `/ B: S  A' f3 [
        print("创建日期:\(block.dateCreated)")4 Q9 B% L: @* f
                  print("数据:\(block.data)")& g, [/ M5 N/ r, G" x( O: U
        print("Nonce:\(block.nonce)")# |% Q+ }6 c( i/ M
        print("前一个区块的哈希值:\(block.previousHash!)")
: {) h0 ~  M7 a. y. A        print("哈希值:\(block.hash!)")
0 [# t  k1 J$ h, e    }
' H1 g( v% `; w4 m- v! N' d    ( c' `0 c: l# U
    private func generateHash(for block: Block) -> String {
, j0 _7 p5 d. {- B. \        var hash = block.key.sha1Hash()8 D  {' Q9 L6 M" z* W3 L3 n' T
        while !hash.hasPrefix("00") {
+ e1 }$ o# {* ~7 v6 ~8 V2 o+ F* L            block.nonce += 1
& e% e/ W+ d5 f; K5 u2 |            hash = block.key.sha1Hash()
( _& `; P7 r4 p5 J2 n8 `$ g        }
5 c9 J, E' N1 I9 _! ~- ^& q        return hash
1 O9 E1 u7 K4 O  U6 i    }  l: i! e& v. n! M2 w* _5 b; c
}
+ V8 P% R, m7 h: p# W6 uaddBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。7 _3 a! o5 `. d) O9 p" g
generateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。
6 T' C& q0 E& i! [# v% O下面实际看看我们的区块链。1 E" y0 M  T' A1 m4 A
视频链接0 i' p5 R2 t9 z  P) g  E
从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。
/ l- `/ ~/ a! x0 i9 s1 F原文 https://juejin.im/post/5a43ae5f51882538650977d1
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

一夜雨十年灯潞 初中生
  • 粉丝

    0

  • 关注

    7

  • 主题

    11