Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

在 iOS 中实现区块链

一夜雨十年灯潞
94 0 0
区块链(Blockchain)是比特币等流行的加密货币背后的技术。区块链的主要概念是去中心化,提供分布式账本。本文会为你展示如何在 iOS/macOS 中使用 Swift 语言创建最基本的区块链。4 s, @; H0 b/ M& x' \2 T/ X: W
注意:本文不涉及节点(nodes/peers)、验证和奖励等。
& }: o6 z  }5 B/ m6 ]( S5 p( {9 n我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。! S! R1 ^0 l# L1 F1 f
实现区块类
3 y( h1 S. s  X) {0 B第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:: C$ b, r' h$ P1 V( n8 I% n4 q& m7 Z
class Block {
, M& }- l7 |0 R    var index: Int = 0
" V" `# ]0 h1 P) ^, G+ e    var dateCreated: String
% h- {7 V& F* V' f+ D* p    var previousHash: String!2 n2 k( ~( [3 `1 X
    var hash: String!
  ]+ k) U+ [, G    var nonce: Int
2 u0 ]# \! X( j' ]2 H& r/ w' d    var data: String
; z: r# V& M; @/ ?; x: c      y" f( X- U2 F
    var key: String {
! i3 V* t# c5 a0 L, p5 z        get {
  \% w0 S9 e, V6 h2 A3 [" {            return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)+ D; ?* A8 S% S' S
        }) `2 D/ ?' W6 I: F  F' ^2 x
    }
2 F) G- D. P% |& {- ~2 n5 _   
5 N. U9 b8 f, h) K    init(data: String) {& t- q9 Y8 g( _& _
        self.dateCreated = Date().toString()
- ~3 n) e- n8 H$ p1 m8 m        self.nonce = 0' t  Y+ D2 k% O/ c& r* Y  K
        self.data = data
7 [5 o2 _, J5 F, U  c# T: v    }  m2 }7 Z6 b% ~' t5 P
}0 V7 z) N' b4 _0 z
区块类详解:7 f, q# g: E: u' u" k1 U+ H
index——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数
; i- ]/ P$ x( ]0 p
/ G& T) C+ B' g% u$ r, p
实现区块链类
8 `4 t! ^' q0 i  Z  M区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:
3 z2 p1 ?1 G& O# \7 M$ jclass Blockchain {7 N! }. H' s5 d! p# H+ g/ `8 z
    private (set) var blocks = [Block]()
# m* M' b( G. L, i# ^   
/ U5 C" I. v* e8 X    init(_ genesisBlock: Block) {
" F# B: p' d  a& B5 @& v! @       addBlock(genesisBlock)$ c5 i& W9 A9 D5 p' F
    }- P+ i: d" {5 s; C
    7 d1 @: U' @/ n2 w/ A( P. E
    func addBlock(_ block: Block) {
  a+ V  u1 ~& V5 l4 y8 O        if blocks.isEmpty {
5 |  c( \1 ?: y            // 添加创世区块! B4 [! J2 E+ @
            // 第一个区块没有 previous hash! G6 a3 S4 x; g" g' a# E3 R
            block.previousHash = "0"8 D. N/ g; }+ D
            block.hash = generateHash(for: block); b" ~! {3 T' n. |1 O) L9 r
        } else {
" L- I, X+ D9 w: K7 J$ \2 _4 i            let previousBlock = getPreviousBlock()- b' a9 N8 D2 Z" g$ _" [
            block.previousHash = previousBlock.hash" N" r) x% v' `. {) i
            block.index = blocks.count
8 e1 X" ?2 _1 M% I6 u* |; }; }9 ]1 y            block.hash = generateHash(for: block)
* b5 R: _2 z- u! Y/ l& _, J        }' I, i$ w9 z! h- O1 z8 l
        8 s6 K/ O9 V+ M) t5 L" S( D4 Z
        blocks.append(block)9 ^: p( z2 B9 V3 j! l7 u
        displayBlock(block)
7 b) e, j9 {5 G! I, r! F5 y    }
$ T5 `. g& w2 [/ d* Y( @/ t! s    ; S; e) ?" c9 x4 H& q
    private func getPreviousBlock() -> Block {' U0 a. b! ^, P1 q  K4 t6 d3 ?3 ]
        return blocks[blocks.count - 1]
7 C/ L2 |/ C: c7 f( ~; i    }
0 x3 f. h+ g% B3 ~4 e6 E9 g3 x    2 a! G- d& k( \1 }" J" h
    private func displayBlock(_ block: Block) {, P/ P  F" U  h
        print("------ 第 \(block.index) 个区块 --------")
+ N9 }% ?* q; W* H/ F        print("创建日期:\(block.dateCreated)")+ e) E" C: M3 X) V+ O
                  print("数据:\(block.data)")# F9 v$ ^- B  W5 k  H$ ?: t3 Q
        print("Nonce:\(block.nonce)")
1 }# M8 u! L5 l8 Y        print("前一个区块的哈希值:\(block.previousHash!)")
3 q8 y6 b  Q  A" j8 D$ I2 B% \8 L        print("哈希值:\(block.hash!)")5 M' ]5 y, Y" |; `9 P6 I. z& K' g
    }: K: q1 N! h/ s+ v9 K* {
   
2 r+ \$ ]& V; i    private func generateHash(for block: Block) -> String {
2 \1 V9 W- F) }+ w/ S        var hash = block.key.sha1Hash()
  @; U/ e3 c5 m$ Q        while !hash.hasPrefix("00") {7 T7 i  U' t; z8 U# k- e: }
            block.nonce += 15 ~; j- ^# x+ S) m7 C. O0 J
            hash = block.key.sha1Hash()
* O  h" f3 ?  u8 q: d  E' s; O        }
. u: p7 Y- o6 ^' I* g        return hash
( K7 {2 L1 b8 a. S9 V    }; N3 L1 {' H/ }/ y. F# Q
}9 H6 t/ s/ ^& A
addBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。
6 s- I; {( m5 N# ^- n: O: h$ T# u: tgenerateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。
2 S9 n3 k7 @# l& C: y; p7 x* @7 [7 o下面实际看看我们的区块链。
: g9 n, A0 j/ f- d, v1 l视频链接
- S6 p1 v, T- U. c% a6 t9 s7 l- f从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。
2 n: `# F0 Y- u3 p1 X原文 https://juejin.im/post/5a43ae5f51882538650977d1
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    7

  • 主题

    11