Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

在 iOS 中实现区块链

一夜雨十年灯潞
105 0 0
区块链(Blockchain)是比特币等流行的加密货币背后的技术。区块链的主要概念是去中心化,提供分布式账本。本文会为你展示如何在 iOS/macOS 中使用 Swift 语言创建最基本的区块链。; C7 @3 e! q9 M. {
注意:本文不涉及节点(nodes/peers)、验证和奖励等。5 j  q0 \2 J) H2 \
我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。
( A% |9 E# M! `0 Q% ?( W+ j实现区块类4 N* W- D2 C. M* u( P8 N8 s1 [
第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:0 a2 i7 s3 w# s$ g; @
class Block {
3 [4 ~4 ~! _3 }* g, }" P( m    var index: Int = 0
' x) X1 }  M" I# L7 G    var dateCreated: String* @4 L; b& S" i& V( Q
    var previousHash: String!
, Q/ R: h1 z. E; b3 K    var hash: String!
' A5 Y" X$ g( f& X" f    var nonce: Int1 E* t8 {1 g. Z
    var data: String
. `0 z  l5 Q# b2 w0 J) U  i, l/ p   
- z/ ?" g# @/ s    var key: String {
1 M) W: Y+ _5 |3 i        get {
/ a! b* D6 X, L            return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)! z8 S0 z9 X$ J3 f5 G
        }
) F$ u! D/ q4 v7 E4 A: \& f& X" H" n    }
/ `% B& G" R2 e2 ^* x. I    / b. u& a' Y# U) U0 U! J( N& \
    init(data: String) {4 ?6 [* Q5 `  m; d* j# I+ n
        self.dateCreated = Date().toString()) U6 x2 e0 N( H$ f- `: w
        self.nonce = 0
' i# E" \* E9 u        self.data = data
; U, m/ h, x+ d! j% V    }
5 s1 M* a- j1 o  _  K( B}
7 H3 E9 n6 P& A* P/ a3 N, x区块类详解:
9 j7 |5 i7 M" E. aindex——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数
$ t. ?& B) v* Z

, Z- x8 S2 F+ m实现区块链类7 ^+ `' N7 z$ U/ E9 Y, \+ j
区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:
  u* Z& }" }  K0 |) _5 oclass Blockchain {& |$ Y% z0 I) I2 |  R0 r( K
    private (set) var blocks = [Block]()
& e: ~8 y5 x! ^$ O% \" d+ i  M   
+ i, }# k7 @' i; x' G, h$ P    init(_ genesisBlock: Block) {
' R. Q. \; u" i: d1 K; s- u       addBlock(genesisBlock)0 |1 W! t8 x( L9 {: v" |0 p
    }3 q8 C- m; @" ~
   
) n  ^( v- j# t( _7 u    func addBlock(_ block: Block) {6 }/ j5 m" h0 M: X8 p1 Z
        if blocks.isEmpty {
" F2 f8 e9 m" S$ I9 ?            // 添加创世区块5 _9 I2 G6 Q3 C& t! T) q2 J
            // 第一个区块没有 previous hash
; }2 \( b3 C/ g  E            block.previousHash = "0"
) T# @1 ^7 H: z            block.hash = generateHash(for: block)
6 i' j' A. x6 [2 x* D        } else {$ q. k! c2 a7 p
            let previousBlock = getPreviousBlock()
1 e% N0 c) x+ e            block.previousHash = previousBlock.hash
0 c$ x( \% t  ]  c8 L/ r; O0 S            block.index = blocks.count( F5 Y( |# P3 ^: Z2 ^9 P* E
            block.hash = generateHash(for: block)6 Z( W0 B' C* b9 h3 u" v
        }
* ^8 G! x5 P5 g+ q- @+ e        0 a* ]% d+ s0 E" U( d
        blocks.append(block)
8 w8 V( a/ Y# j1 R        displayBlock(block)
+ q; ^- U" ~; ?) z    }% ], h6 I+ _  W3 [3 J& R# Q" Y
   
+ n; j! A2 C0 v0 S; w0 }2 W    private func getPreviousBlock() -> Block {3 y% D4 f- ]! E3 Z, M
        return blocks[blocks.count - 1]
7 t. ]2 y% g) T) m  ]/ E4 B    }
0 t; V: m  A( @+ z9 }5 F   
5 m' v( i: t2 q: Y! p    private func displayBlock(_ block: Block) {
+ H7 |0 E& a, I! Y- F4 [! k. b        print("------ 第 \(block.index) 个区块 --------")2 z3 N. P: q+ q
        print("创建日期:\(block.dateCreated)")
+ V7 E2 k. _- f                  print("数据:\(block.data)")
* O9 @9 F# e9 v, y+ O        print("Nonce:\(block.nonce)")
3 d# x7 \  W1 T9 f5 R        print("前一个区块的哈希值:\(block.previousHash!)")1 N8 r/ c) h  Y" j+ ]& M
        print("哈希值:\(block.hash!)")* V( ~6 c8 e5 k' R
    }5 I+ s7 @9 Q1 r6 W
   
5 U: U$ C2 q9 F/ u# b    private func generateHash(for block: Block) -> String {1 j/ ?3 W( q  |# [1 y/ W
        var hash = block.key.sha1Hash()" _! a7 ^' [+ x& b! k8 n; t6 V# r0 |
        while !hash.hasPrefix("00") {1 [/ u' G6 c  ^) ?- S
            block.nonce += 15 b) ]  j1 W! v  z
            hash = block.key.sha1Hash()+ n+ l/ \% u6 w+ t
        }; c' q$ r! D  T# c( z4 B
        return hash
2 B8 e9 R/ L: Z; a0 K2 b    }
3 A5 e5 e# b  s" L  A: V+ h) k}
+ C* Q2 n2 H( z# U; yaddBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。5 I' Y1 b% S7 y
generateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。
( Q$ k' j/ G1 K下面实际看看我们的区块链。
8 W& g1 K7 Y4 j, N. p0 H视频链接% _: B3 j$ s3 n& u0 d
从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。
. M" d, E7 E0 b4 Q; ]原文 https://juejin.im/post/5a43ae5f51882538650977d1
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    7

  • 主题

    11