Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

在 iOS 中实现区块链

一夜雨十年灯潞
184 0 0
区块链(Blockchain)是比特币等流行的加密货币背后的技术。区块链的主要概念是去中心化,提供分布式账本。本文会为你展示如何在 iOS/macOS 中使用 Swift 语言创建最基本的区块链。2 h* ^. \2 l  z" Q
注意:本文不涉及节点(nodes/peers)、验证和奖励等。
4 j2 s5 n" J  ?5 d, U+ r我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。
, |  D8 z3 s1 M3 w) f, Q$ g" M  F实现区块类# V1 \2 m3 s: v+ r6 T0 w6 y
第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:4 E* u1 M9 m8 N7 ?" I& Z1 Q8 X7 ?; l# B
class Block {
% q7 Q  H  p3 ?4 T) Z% K8 p0 ]    var index: Int = 0% G* ~9 d2 x% U/ s- O4 M  z6 ]
    var dateCreated: String6 D! ^/ C3 C& x) z. N* Y1 R
    var previousHash: String!! J/ Z( n4 P* z
    var hash: String!5 {% k& K' ]( Z# p9 O. t+ h7 k
    var nonce: Int+ E  [/ S9 A) n9 v" o& ]
    var data: String- J0 I: a' v( S& E" L* @
   
  ^8 {6 U8 @7 l9 q& C% D    var key: String {6 P# b9 Y4 w, u9 t5 \) c
        get {
( S& ?* E$ Y* c7 O$ C: z: b5 X6 x            return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)
* g- T, t; e, m+ d        }
  S" g( J' i4 M8 D% H    }" S, X$ T7 d: [, x5 a
   
* V0 L$ M" f/ [' n. l4 |( L# _    init(data: String) {
7 Z+ m" y0 |. ]2 e# T        self.dateCreated = Date().toString()
  q) N- F$ ~: J        self.nonce = 0, k* s* i2 P5 b( t
        self.data = data
5 i' [8 e3 p8 Q0 Q5 z    }/ M+ }5 E9 w: |: P' j5 A; A
}
# C/ j) w: y5 i. L5 y; b5 N区块类详解:" L1 g* e+ z$ J  b
index——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数7 J3 z/ ^( v. I* F' [
2 v$ [: ?6 f' ~% e4 _
实现区块链类1 D/ p) N& P4 E/ ]
区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:5 i" e  p- T3 n; {
class Blockchain {
; `. a2 k; n( |7 _% J% n+ v    private (set) var blocks = [Block]()0 V! J' O/ M: [2 S5 c+ Z
   
8 i' L. w/ Y* C  `6 z1 w    init(_ genesisBlock: Block) {& V' ]) H" S" a
       addBlock(genesisBlock)3 E% D, q5 f1 C7 f
    }
( G1 h9 z7 w- h7 L4 N- U& s% J* |    " F1 {$ u) e7 h! V- C: X- p3 N/ y
    func addBlock(_ block: Block) {2 f% J5 D7 @5 `7 r8 U( P
        if blocks.isEmpty {
% q$ U$ ?8 z) _- P/ K# |2 U            // 添加创世区块
; ^4 y% d. k) \! L: W9 u! ~            // 第一个区块没有 previous hash
. e, I- O4 Z1 q: B( O            block.previousHash = "0"" H7 U+ h  n  Q( G" y
            block.hash = generateHash(for: block)
9 D/ L7 M+ Q% ~. m- Y, o        } else {& S$ s- `; O( ^& i. z
            let previousBlock = getPreviousBlock()
5 q! t/ }; i# f( a9 `$ ^# Q' }9 t            block.previousHash = previousBlock.hash/ t5 V' W7 l* }) y1 q$ t+ e
            block.index = blocks.count
" J$ m6 D, k' _  I+ }% o+ F            block.hash = generateHash(for: block)
* ?0 V) L( ]$ X& E6 Z" w        }9 h6 C7 |+ c4 P- s; C$ J: z
        4 ^2 x) ~) }! R. O7 M: v$ |' K" y
        blocks.append(block)9 r/ X0 w, p: J) A# u9 \) _0 ~
        displayBlock(block)# p. I  X. p7 e( C; H# c
    }" j6 x) f% \/ q. K/ G- v- D5 S% s9 e7 M1 ~
    1 F$ @1 \  {1 n0 _8 J
    private func getPreviousBlock() -> Block {7 t$ ^, B$ c* v. A
        return blocks[blocks.count - 1]; S6 [6 I: Y7 S1 G8 _
    }1 g) x# K! b+ c& @' H5 n
    1 p" a- b, A8 @. g
    private func displayBlock(_ block: Block) {& p7 y% P4 v+ F  A& D
        print("------ 第 \(block.index) 个区块 --------")
( R* A: i& a6 A( b! Z* ~        print("创建日期:\(block.dateCreated)")7 F3 n4 p; I$ f6 k
                  print("数据:\(block.data)")
; }8 z* i% H7 k! u        print("Nonce:\(block.nonce)")
! s& |; l4 W( ]8 n" _6 ]        print("前一个区块的哈希值:\(block.previousHash!)")
/ l0 l; I! g' }. K* X        print("哈希值:\(block.hash!)")
( k- I' g; R4 W; U" ?    }
1 a& M& x4 }, }' T, a+ p" j    " d: ]2 ^3 M, p1 |* _
    private func generateHash(for block: Block) -> String {
( M) X, v' L- A  O3 b        var hash = block.key.sha1Hash()9 U1 @9 W3 y5 a$ x7 T8 p, K
        while !hash.hasPrefix("00") {
. Y) z1 ^5 ?9 @8 s9 l% R            block.nonce += 1
0 L% _" @2 K+ }6 v3 H8 Q            hash = block.key.sha1Hash()& f" r/ `+ u0 k9 Y2 X
        }
. y' w% t) M+ ~3 ]        return hash* K) u. |$ o) {; L/ K: q* `" t
    }
- w- u. c3 u, z. B0 q0 r# `- _}
! X: T. ~; T% e* L, c4 h2 |addBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。
4 n& p* W1 N1 e: B% AgenerateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。
9 ?& {& K) c/ C( Y/ b下面实际看看我们的区块链。
! b& _$ F  D9 c- C8 [4 r2 ^视频链接
3 e$ I  k5 Z' e& l8 E* J! G/ J从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。
9 n0 j" \$ j+ i9 a9 w原文 https://juejin.im/post/5a43ae5f51882538650977d1
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    7

  • 主题

    11