Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

在 iOS 中实现区块链

一夜雨十年灯潞
88 0 0
区块链(Blockchain)是比特币等流行的加密货币背后的技术。区块链的主要概念是去中心化,提供分布式账本。本文会为你展示如何在 iOS/macOS 中使用 Swift 语言创建最基本的区块链。1 s# r& s7 ?) M+ M+ F2 i
注意:本文不涉及节点(nodes/peers)、验证和奖励等。4 n3 r! w0 ]! A$ g/ w
我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。  T% O9 k+ C, S% j* C* S4 x4 u) G
实现区块类
: X/ n8 P* \" ^5 F. R6 _- d- g第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:
% Y, g3 A: C5 h7 ^! |class Block {
# m6 e# m7 R& J) R3 }2 v3 }    var index: Int = 0- l; [1 z9 P4 `% R! x: \) w4 i- c
    var dateCreated: String) e; R. i7 H( b4 N2 c6 L
    var previousHash: String!# J* K: i7 y6 @: b1 B
    var hash: String!4 N/ x4 C! c0 d* J- h) o) p4 p
    var nonce: Int
7 i: C& i4 k( K/ j8 I4 \! {& J    var data: String; U( [+ D, h7 p% O3 g: _
    - {! O# |9 ~, C2 k% u$ e0 a
    var key: String {
) z' V4 w7 h, W1 ?" G! Y/ ^        get {. g6 }: @$ ~6 e- S
            return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)$ S+ L- `7 b6 {
        }9 u/ g9 k$ Y1 }% [8 C# S# |! T
    }
( f! ^& C# t1 t+ v  N: ]    1 {% U3 C% X+ x
    init(data: String) {
3 p6 M4 g2 V  N" K$ z        self.dateCreated = Date().toString()
5 l( e9 g- j' P9 r5 Z8 L+ E7 v) Y* Q- |4 d        self.nonce = 01 I2 i( O! K5 M+ o% g8 [
        self.data = data
. @8 y( w, ], G" F; [, u    }' F! J  |) k" j. X$ R. J8 L
}
  V6 l4 N4 E! t% S0 q区块类详解:* D1 W6 u* V% J6 N  f
index——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数
1 z* j6 |" q7 Q

( Z. s" K' m  l8 h1 K6 ?/ J实现区块链类
- t2 ?/ {* i" V5 _5 d( j3 v7 l$ n/ p区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:: R: L' m7 |5 O( m2 H; o
class Blockchain {
1 }" V0 Y& h; |! N# ]! e9 M    private (set) var blocks = [Block](): U5 w4 u" G' [% w+ }& n
   
$ {3 u9 K. l0 A    init(_ genesisBlock: Block) {- ^2 q/ G2 j0 ~
       addBlock(genesisBlock)
' I: \1 A6 H  o. l    }
% H7 m) @9 w, ?7 N  r    * R' p' I% c# [4 H( [
    func addBlock(_ block: Block) {
% {/ R! K: i. i3 l1 e3 x4 J        if blocks.isEmpty {
0 u9 H7 b% _7 L; c7 l5 X; W" p$ M# ?            // 添加创世区块
# _( i" h0 N. b& o. m- F6 f/ ~2 `, J; {            // 第一个区块没有 previous hash
: }: I0 Q! P: ^  e4 j4 M            block.previousHash = "0"
1 d7 p# o2 s6 Z0 }            block.hash = generateHash(for: block)
3 |' B# m0 a4 Z7 b        } else {7 V7 N6 J/ F7 C7 [' F0 Y
            let previousBlock = getPreviousBlock()
" H) I$ ]3 T0 X0 Q2 x4 B/ [' d            block.previousHash = previousBlock.hash. u) x/ ?9 o# a' c7 N1 N* A; D
            block.index = blocks.count
- ~& `& ~3 B0 C! \: Z5 C3 I            block.hash = generateHash(for: block)
) [  w/ M6 @: R8 Z3 I" k        }0 d; P3 Z% J8 x4 S
        
- B+ u; O7 p4 b) E( Z( }% u        blocks.append(block)2 i% z7 g9 ?1 C' t' A' O' O
        displayBlock(block)
. o$ S" H  P" H' [# ^% w    }( p+ m/ @8 H2 r& W' ?. v
   
. l* ^9 n7 Q2 J; t, @    private func getPreviousBlock() -> Block {
" ?% w5 _  z# v% k        return blocks[blocks.count - 1]
& L/ ?: J8 Q3 j$ M& j- X: N    }# q' c& a9 i- f' [0 w9 G: e
   
6 D; F1 ~% H. e/ y& n    private func displayBlock(_ block: Block) {
1 d( e7 s, R* i% Z  ~% N9 `6 B        print("------ 第 \(block.index) 个区块 --------")
& Y/ n( U7 I0 M* W7 T        print("创建日期:\(block.dateCreated)")& B, ~( ]# V" V# ?
                  print("数据:\(block.data)")
* d2 f( {5 Y/ `0 w$ I        print("Nonce:\(block.nonce)")
/ ~: d* {2 c/ A' q' i  Q        print("前一个区块的哈希值:\(block.previousHash!)")1 ?4 s5 t5 [( N$ N  U4 q: b  i9 k
        print("哈希值:\(block.hash!)")+ s2 r- \2 h  }5 g% X% N& r  |% E
    }$ i+ [! E2 Q$ Y
   
6 v3 x3 d; P3 M    private func generateHash(for block: Block) -> String {. S$ [1 B0 {9 a0 n% v$ A
        var hash = block.key.sha1Hash()( ?% o6 f7 ~- a5 L) j  {3 X8 i
        while !hash.hasPrefix("00") {
& r1 V. R$ b! k3 d5 X            block.nonce += 1  \& q5 q* a- F
            hash = block.key.sha1Hash()& e5 B$ a+ \; a1 i' L
        }
% |; I% V7 p$ u+ Z        return hash3 A. n5 h$ z, w1 s
    }" i( Q. [) h/ W. S8 L4 R
}: r7 H+ N9 H7 d8 T( G* y
addBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。+ _2 `% O5 A! u- M! o* t$ y$ y
generateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。: V, [; F- j* [% V4 c4 v
下面实际看看我们的区块链。
( L" D3 B1 l, o1 ^  f  t1 B视频链接
, ~6 b8 L% b; u9 K$ w5 j从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。
1 i0 }  j' B8 V% G; m0 i原文 https://juejin.im/post/5a43ae5f51882538650977d1
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    7

  • 主题

    11