Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

在 iOS 中实现区块链

一夜雨十年灯潞
65 0 0
区块链(Blockchain)是比特币等流行的加密货币背后的技术。区块链的主要概念是去中心化,提供分布式账本。本文会为你展示如何在 iOS/macOS 中使用 Swift 语言创建最基本的区块链。
' t: K1 o% z; z8 V$ H  f% a注意:本文不涉及节点(nodes/peers)、验证和奖励等。5 q, t  @9 K$ t0 z1 B; P
我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。  L9 g) Z1 M8 ]
实现区块类) I- f' W+ y( j! B% `' T* H
第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:
* v9 h' Y& r, T- f8 wclass Block {4 D9 C% _4 i, A5 Q) P3 }% v
    var index: Int = 0
5 m4 s2 L: C4 X* L& L    var dateCreated: String
8 N& N) V3 E! `, C: A2 H4 \    var previousHash: String!
# i1 B* A. e' h# j2 }) y0 s    var hash: String!$ b3 v. `( M; q
    var nonce: Int$ M$ k5 L+ R4 ^  a& A
    var data: String- l" M5 i2 |+ U
   
" n1 |* l& k/ J    var key: String {2 F: D) w) t+ V6 `
        get {
4 E) P2 A& R+ I4 d' B- R  u. x            return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)
3 G* P7 e( z$ `. N, l! p+ b        }
. k, J+ D3 [8 _$ }& [6 Z9 l    }
3 T4 a9 }9 k2 j    % A/ F  u1 ?$ x* K0 f. c0 u" A9 I
    init(data: String) {2 t' R6 ^( {( \0 k
        self.dateCreated = Date().toString()
2 W5 h4 Q; ^' d! i6 [        self.nonce = 0
" h4 {0 I+ }8 |0 d- t  s- Q        self.data = data# ^. g+ G0 e2 A+ p: P* M
    }
' x* S3 E) T/ p4 ]( C1 R}' g# v# g6 @0 ~! J
区块类详解:
8 r$ s$ r7 {  s/ u1 r4 zindex——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数
& i6 v1 i0 `$ v+ {/ R4 z$ r
* a$ x4 ]3 F4 `4 X7 c+ V' l4 |
实现区块链类
4 P# Q2 n2 q0 G0 t区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:+ m( w* N, f0 \
class Blockchain {0 z; @( H# j0 G, T. ^* ^+ K
    private (set) var blocks = [Block]()
& D2 ~2 a+ w, y: ]* l3 O/ q    & k5 m1 g& Y5 [0 o1 V- v. S
    init(_ genesisBlock: Block) {
# K1 ^: U1 S. M+ y- n       addBlock(genesisBlock)
5 v2 B' Y, F8 ~) z* K    }9 \' x$ v, c8 K7 s: h7 P0 M
    . \# \2 u+ M. w2 x
    func addBlock(_ block: Block) {( b+ g2 Q5 T: P( ~
        if blocks.isEmpty {
  m. Q2 g7 K/ O, ^- y            // 添加创世区块
. V- b8 U. m) i. U% u. V4 b: i# f3 u            // 第一个区块没有 previous hash- h7 {$ S4 Q' c; n$ |  y) G
            block.previousHash = "0"# g/ }) h5 u- o
            block.hash = generateHash(for: block)& P2 H1 B3 t' k! B
        } else {- K' p* |7 k' ?6 e  l
            let previousBlock = getPreviousBlock()
  Z* ?9 O! i/ _; `            block.previousHash = previousBlock.hash
# V4 E3 q9 k0 U# R* R% w2 C            block.index = blocks.count
$ A: @- T! ^2 S' |            block.hash = generateHash(for: block)
0 z) R* h; V; a# O" B        }
) A" t; k) q, Y        8 A* @6 y5 ?1 e  o% _
        blocks.append(block)
+ r  O' r6 T- M: n, Y" U        displayBlock(block)6 F' }+ S! C# a4 |
    }
/ v$ E& s9 K2 l$ @, G    2 ]2 ~& Z7 _/ k- L/ K/ [1 k
    private func getPreviousBlock() -> Block {
% K( P' P/ B$ j; Z, F( z        return blocks[blocks.count - 1]# S, n$ y1 G2 F) `0 Z8 {4 ]
    }/ v9 o5 U# J) k" Z8 o! [9 K5 P, ]
    ! W. ^8 d+ ?$ K: }+ Y% g' X
    private func displayBlock(_ block: Block) {
6 V* T2 ?7 E0 H+ ~        print("------ 第 \(block.index) 个区块 --------")
* q" Z. m+ s7 z+ P- C9 b# K9 n+ q        print("创建日期:\(block.dateCreated)"); _6 Z: s$ A! z/ T1 _1 v
                  print("数据:\(block.data)")$ Z- j" v% w) C: o
        print("Nonce:\(block.nonce)"), `  m1 D+ `, X% S: ~( k5 k2 S
        print("前一个区块的哈希值:\(block.previousHash!)")9 L; Q0 X2 d4 {$ n$ L. k! Z
        print("哈希值:\(block.hash!)")& ?' J; ]+ ~" I2 b+ B7 L) s
    }
: ~8 W* j8 O# q- i! L( R! g% n5 Z   
* u  H) d: ^9 P9 e    private func generateHash(for block: Block) -> String {
: ?& D& |# R: e' g) Z        var hash = block.key.sha1Hash(). t/ P4 ?* w: p# p1 h* @. v
        while !hash.hasPrefix("00") {
( U% U) n! h. A$ }7 f7 {            block.nonce += 13 K  W6 _9 T+ k; K3 Y4 D
            hash = block.key.sha1Hash()6 z& H2 F  b, _+ y
        }" j- d3 y. K! f+ i; ?5 H
        return hash
5 c4 ?5 }1 }3 w: U- n- T    }
/ H8 _0 L& k6 G1 D5 i/ \; \' I, F% K' |}
$ }% |" H) E/ F) p% H8 W' m6 paddBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。
8 r, _) V- i9 ^7 GgenerateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。# E5 ?) y+ E# T, j3 Y$ ^, Y7 Y
下面实际看看我们的区块链。/ k; ^! s% \0 F4 m
视频链接, W- w$ R( n5 B
从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。4 z' e+ R) R; B- O) f8 k
原文 https://juejin.im/post/5a43ae5f51882538650977d1
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    7

  • 主题

    11