Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

在 iOS 中实现区块链

一夜雨十年灯潞
95 0 0
区块链(Blockchain)是比特币等流行的加密货币背后的技术。区块链的主要概念是去中心化,提供分布式账本。本文会为你展示如何在 iOS/macOS 中使用 Swift 语言创建最基本的区块链。: p2 m& J! r  q4 ]0 x
注意:本文不涉及节点(nodes/peers)、验证和奖励等。
6 N+ Y: [, f  c% T; C我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。4 ^/ t7 q% F( n, ~) {2 c; O3 `
实现区块类
: F& M, g& f! E+ p第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:2 r# V1 p' E% z1 I* i& h
class Block {
) T; a' m0 }4 A2 H/ `    var index: Int = 0! S6 P! @% [7 ?; ?' `# W5 Z
    var dateCreated: String
& E3 x$ [1 F- v9 d* ^: T2 x7 \    var previousHash: String!+ G3 S8 ^; C! y# ?9 H  T$ x
    var hash: String!
+ Q7 h: p+ ?8 K3 d    var nonce: Int. Z" {  |7 [( ^, p
    var data: String  Z8 ?5 M; F( _+ \# Q
   
; [- P4 p: E+ U7 Z" k6 ?; B    var key: String {: ^9 m' K6 `1 f- f) T) Y
        get {
& Q- `0 b9 ^  K( X$ r$ a            return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)" e  I% C" w( S, Y, ^% i
        }# ?( u8 w/ L2 q' f
    }
% L$ [9 t/ W8 p0 H$ K# _* d   
/ ?6 e/ V2 c5 N( w9 p$ e& x& C    init(data: String) {. m* a( Y! h( t
        self.dateCreated = Date().toString()
* E/ @0 k; s: F) o* R        self.nonce = 0
) N4 }- l! j/ {  }1 \% t        self.data = data
7 t, C  i0 x# A, y, c    }
/ _, v# w& t7 ^$ _; c}
  ^9 k" e5 B. H区块类详解:$ Q1 G9 P9 h, |9 G1 _9 u/ `
index——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数- A- \6 ]" P0 d! w8 Q2 G* `

' v: F: [7 K0 B: ^* T实现区块链类; o+ S" U* V' h/ p4 q
区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:
* r# l' B4 h' T7 e$ M3 vclass Blockchain {1 h7 m  D4 M8 p! B6 p
    private (set) var blocks = [Block]()- c! H! N: N( f: P2 i' S+ B( Y' B
    / o: a8 Y' S( ]( j. A
    init(_ genesisBlock: Block) {
+ n- m9 |8 x6 V  F9 U" S5 V; P8 ?       addBlock(genesisBlock)+ |3 i5 O5 J8 W/ ^0 }$ q
    }
6 e6 \$ [4 q1 W# T4 T    / L3 r4 B# F6 y! o3 }" |( W
    func addBlock(_ block: Block) {3 ^% K% ^8 ?2 K1 D2 u+ |1 ^
        if blocks.isEmpty {
5 Z7 }8 e, O: T/ W, o9 k, r            // 添加创世区块. w, A8 |- h# A9 G  }' n
            // 第一个区块没有 previous hash
; {# o; v6 a7 u            block.previousHash = "0"
9 W0 D# H/ M: N0 N+ d& p7 W, V            block.hash = generateHash(for: block)' \# v+ L+ i8 w5 h
        } else {' b, _( X# `0 U( q
            let previousBlock = getPreviousBlock()
* v8 N/ x7 [! ~. M5 J. I/ M            block.previousHash = previousBlock.hash) F/ S1 r8 h1 O' P4 j- _9 i
            block.index = blocks.count
+ V+ i) n! ]' j# R0 q            block.hash = generateHash(for: block)
* c: A% O$ _% A7 e        }
4 O; b# J7 y: \- ^" q* V) L+ `        
  ^& G6 \# |9 k        blocks.append(block)
6 m& Q8 H) y, @1 K        displayBlock(block)
1 i, \9 p$ ]8 v! U' B1 Y    }2 M4 m! l) j9 m5 w* R8 v
   
7 v% }, r+ E% _  O: G) G( g    private func getPreviousBlock() -> Block {
* [* ^* i# X7 j+ r        return blocks[blocks.count - 1]
9 p& x, n0 p/ S2 e0 Q% [    }
: m& Z  `6 F0 g6 ~6 O    8 @/ k: d( K5 D3 Z0 d! t
    private func displayBlock(_ block: Block) {" T( m/ j; q5 a0 ~1 A) M* }; h
        print("------ 第 \(block.index) 个区块 --------")
4 H$ d& K+ y, v! N        print("创建日期:\(block.dateCreated)")4 n" L1 S0 x: h. x# ~+ b  X# p1 b
                  print("数据:\(block.data)")
6 H3 K1 k' ~' ~8 G5 a# z! C        print("Nonce:\(block.nonce)")& P% o: L* d! U+ X/ R" r& {+ [$ v
        print("前一个区块的哈希值:\(block.previousHash!)")
6 T, V0 B0 s- ~$ S! T8 ], y# P$ k        print("哈希值:\(block.hash!)")
( Z4 e5 Q0 S. [' T5 c2 j    }
/ {$ q, N) }# A- B    0 b- U1 H4 i6 Q! k
    private func generateHash(for block: Block) -> String {
. }/ h/ Y5 A" R0 G        var hash = block.key.sha1Hash()% S" n4 H% X% D" }
        while !hash.hasPrefix("00") {; Z" U7 M! a/ v4 L9 C
            block.nonce += 1
! J! [1 j# |# d" _$ S1 V. |            hash = block.key.sha1Hash()
7 x+ j+ q9 C' e3 j        }/ S7 w! q$ r' A, Z5 n1 _
        return hash
4 C& H& ]0 K( b# W3 a) W    }) m4 c1 S. V: h
}
0 A1 v/ |  [/ c) V) E1 PaddBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。; {+ b1 k! {$ B& C5 x  y, O
generateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。
1 E( d5 A) o2 N% X; S7 G下面实际看看我们的区块链。
9 O2 ^/ @' ~) k* R视频链接
! n+ a0 n! ?7 f- }从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。
) ]2 b% E& t3 T" v2 R原文 https://juejin.im/post/5a43ae5f51882538650977d1
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    7

  • 主题

    11