Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

在 iOS 中实现区块链

一夜雨十年灯潞
96 0 0
区块链(Blockchain)是比特币等流行的加密货币背后的技术。区块链的主要概念是去中心化,提供分布式账本。本文会为你展示如何在 iOS/macOS 中使用 Swift 语言创建最基本的区块链。# P+ n9 e# B% j1 C& m
注意:本文不涉及节点(nodes/peers)、验证和奖励等。4 K( l+ V# l4 T) B4 I; r1 @. r- _
我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。
6 Y6 ?' h8 k" A8 ]实现区块类2 }. Z- W* ?: ~; t
第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:
" w! ?9 i7 t7 W8 ?) v* Z# oclass Block {
* y' E/ k) G: T# }    var index: Int = 0
1 e% o* D  {5 `( n    var dateCreated: String
! V$ B7 @% {5 u% B, d    var previousHash: String!! O3 d2 w+ k" K3 H9 [% y
    var hash: String!; H0 `+ i1 H* u3 O. B- o; |) X
    var nonce: Int
- S6 Y6 j7 N' _- P( g    var data: String
7 p# e1 ?* q3 j: D5 l  G   
* g7 M1 [( {  u+ _8 D' h6 k9 {    var key: String {/ _2 J; I3 d- k' d8 R
        get {' p! t/ G& A7 K) y. h1 V
            return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)+ J/ {5 z! k. s( q+ H$ w: \
        }
9 q# ~) g2 [! G7 y( W9 G' l. n    }$ Y( _. `0 f% N+ T5 y
    ( {! A. R! U# k0 R
    init(data: String) {
7 x$ s  O; w5 E        self.dateCreated = Date().toString()/ [) K5 d3 ^' g9 D4 Z) ]. k- }
        self.nonce = 0
3 {1 i" u! w! z+ W0 }9 ?        self.data = data
# k( s; @% g* @6 `    }9 F: U' L$ _! g( R1 s! ?4 {
}
2 y2 }+ K3 C( @0 p3 S( k区块类详解:
; x' U: N0 ]& }index——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数
. b1 a+ e. ]  N2 @4 x
( ?" I0 l2 P! P0 G4 X( v4 R1 T4 c
实现区块链类
) d6 L& Q$ y" z# |# a区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:
5 @+ A( E. @3 c1 Z) _class Blockchain {
3 l- i  v% `2 {, j0 l2 z. h    private (set) var blocks = [Block]()
0 K. g# v; h( P& w, D    / A; x* n- ]1 @/ t* s5 Z" r$ L, k  S
    init(_ genesisBlock: Block) {% ^5 |5 w) l4 q/ l5 I
       addBlock(genesisBlock)
  O" F. B8 B; @) o: y7 j    }% q3 J" R/ \* S2 e
   
6 n) n0 g- f: h    func addBlock(_ block: Block) {
7 p3 k9 d+ Z8 Z! a" `' H        if blocks.isEmpty {% t; T1 l9 s. }* l, f" N
            // 添加创世区块
$ O9 l7 p1 Y$ T1 b& V$ \( ]4 r            // 第一个区块没有 previous hash
2 p1 t+ J, n0 r7 i4 O+ I! K            block.previousHash = "0"
" O; |% S6 p; j4 I# z6 {            block.hash = generateHash(for: block)
5 N$ W2 w: s  ?* V* X        } else {
( P- j8 I* F5 J5 f+ ]2 b            let previousBlock = getPreviousBlock()8 J) b% K5 S9 o, x& _
            block.previousHash = previousBlock.hash8 P& o& V2 p! V4 b/ A) B/ K
            block.index = blocks.count
  R' s0 U* v. a1 O. W4 v            block.hash = generateHash(for: block)8 W4 P5 `+ c/ c
        }( z  d8 c  X8 Q2 M+ i. n
        % u0 k9 j+ M& C
        blocks.append(block)
8 K# R" t$ F9 }( G        displayBlock(block)% ~7 Y7 b7 P4 `8 O8 B
    }
( R% P8 _9 C, G' x' F, D( m   
  F# t2 l3 w) W4 {" G    private func getPreviousBlock() -> Block {
, s* l9 G8 [( u  {; E2 w        return blocks[blocks.count - 1]
# B: J! y( v2 c7 d* G    }1 P) \  ^7 E& h: z: _+ Z/ d
    7 S( D7 W$ B+ F/ Q! K, y
    private func displayBlock(_ block: Block) {5 R) F% x5 o0 L& b0 [5 q  R7 a
        print("------ 第 \(block.index) 个区块 --------")
( k" Y+ u  t- |        print("创建日期:\(block.dateCreated)")
' E( A" H, i0 h; Q                  print("数据:\(block.data)")
  [9 F' B3 V; M4 K; L2 L3 k( z7 o0 d4 k        print("Nonce:\(block.nonce)")0 v* M( N9 m5 n7 r) A3 j: `8 s
        print("前一个区块的哈希值:\(block.previousHash!)")
& O$ i6 J: ?" G, v. u9 R# C        print("哈希值:\(block.hash!)")- h2 G% e4 g7 h0 B# c
    }' \1 h9 p; s8 n4 z( M2 L! `8 v7 V
    , ~) m+ |: ~( S, D
    private func generateHash(for block: Block) -> String {
. B/ m4 E7 o+ M        var hash = block.key.sha1Hash()
2 {& m" B! J' _, q6 i        while !hash.hasPrefix("00") {. B: S6 \8 @; a; C, `& e
            block.nonce += 13 [% S% k- ?/ P) ]
            hash = block.key.sha1Hash()
2 i4 \6 D  F$ n$ S" c1 Z( r        }
0 n" W. K# P1 e; B        return hash
2 K; j* A6 L9 g9 u+ l    }
3 K- u% t2 R" v3 Y& g}
1 g3 B6 S6 D/ d9 ^addBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。
2 T8 p+ I4 S2 MgenerateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。8 h% v7 c2 E/ ]' l: g5 y. N
下面实际看看我们的区块链。
8 h% B$ a  L% f- [视频链接
; |( F$ c4 y5 E: w( D7 F# b2 C从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。: v( T: K& q' L: }
原文 https://juejin.im/post/5a43ae5f51882538650977d1
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    7

  • 主题

    11