Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

在 iOS 中实现区块链

一夜雨十年灯潞
97 0 0
区块链(Blockchain)是比特币等流行的加密货币背后的技术。区块链的主要概念是去中心化,提供分布式账本。本文会为你展示如何在 iOS/macOS 中使用 Swift 语言创建最基本的区块链。
8 t) i% j: ?/ t) d注意:本文不涉及节点(nodes/peers)、验证和奖励等。% v; H* W. x  E/ |" ]
我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。1 C$ t% |0 N6 h$ L  l
实现区块类( s; @0 ~# g8 T% E% U! T
第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:. _8 \) X# q& `
class Block {
, H- Y$ K* ~% w/ p- r3 n; j    var index: Int = 0
- d2 D( s5 B( `6 \) ]) a8 Z    var dateCreated: String
! j) F- Z6 [7 L* a# ^/ T& q    var previousHash: String!0 r; k% @; N7 o" }% b2 ~! t
    var hash: String!
# ~* y8 m$ R( _, z) {; @* b! Z5 a    var nonce: Int
2 S6 T7 O6 P& n% P+ Z4 D    var data: String
7 j2 x3 u: ~7 p% p    * z( V. A& x/ p# |7 ?
    var key: String {
% u- @2 Y& e3 u; K& j% M        get {
3 l" p* @, n/ x9 L7 o( ^            return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)
, B" M) b8 w$ b6 [        }
6 a$ _5 P# z" T8 i    }
6 Q" z. F7 P/ v3 U' G   
$ ~5 r( P7 _4 ~, j( M0 V1 ^    init(data: String) {
1 o$ o1 _8 `8 W6 M& x  ~, n1 e7 X        self.dateCreated = Date().toString()
, c3 U8 X% t* H        self.nonce = 0
! ]* I  B) B2 W4 m" V, s1 {7 ]        self.data = data  t0 b, r1 q9 N5 y$ v
    }, g# X. |# R7 }! U
}& n* v- c- M/ \" t
区块类详解:
9 x& ]# m) i- Y+ i" P3 sindex——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数2 }' M- h. C8 }% j

3 v7 o4 ?4 F) s; j# p实现区块链类3 j0 F2 V* |, R2 w8 L& ~( k- p& ]
区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:
3 v% R) T( t/ \class Blockchain {/ j; c7 C0 ?- Y$ Z+ F% Q
    private (set) var blocks = [Block]()
! g7 L  Y, k6 J, ~' _3 d   
6 u" J) T- u/ b$ Z, f1 q    init(_ genesisBlock: Block) {- g" d/ D, B" B- m4 F
       addBlock(genesisBlock), y$ F2 z  w. o8 e
    }
1 _4 r. g& c; d# o; p   
# I+ u) x! u! Z/ W: ~! w    func addBlock(_ block: Block) {
7 M+ _# a& ~; V! T$ a* ]        if blocks.isEmpty {
/ y7 [5 x, g5 K+ A- n: b1 W0 {" w            // 添加创世区块6 l' q6 Z0 b5 o$ }( u
            // 第一个区块没有 previous hash( v  e* j1 `5 R' Y: s
            block.previousHash = "0"' L: Q) _' O; ^- T/ M
            block.hash = generateHash(for: block)8 t" C% e0 ~' Y4 X2 j: G/ @
        } else {
! [3 {  ~. L3 c. ^3 ?6 A+ P            let previousBlock = getPreviousBlock()
# ?. E4 f/ G/ G% e$ e: H3 g            block.previousHash = previousBlock.hash
* {+ W' ]$ \7 O5 m7 c0 }            block.index = blocks.count
1 y' O( D2 w% W$ P1 G( v            block.hash = generateHash(for: block)% ^- i9 `5 ~+ H. l
        }
, O4 [# C2 Y: n! W! P4 V        2 N, X0 l9 F7 L* x, A1 @
        blocks.append(block)
/ H+ ~9 ]# q1 |" ]6 ]; [        displayBlock(block)/ _8 _8 Q# ^" `5 v0 C  J
    }
7 D9 z. m" W, {& u; l5 s" R3 E. V   
% h1 j4 `4 Z7 Q2 h0 Y  V    private func getPreviousBlock() -> Block {
2 l* b  y2 O4 b9 B: w% V5 V        return blocks[blocks.count - 1]7 o, T, e7 J* w$ k
    }2 f0 M5 G3 a* O" n6 m  _
    / e$ Q: ^0 ~) ]6 g: ]9 J, a7 h! \
    private func displayBlock(_ block: Block) {; ?/ q: ]8 }1 D# V9 K/ a3 Z7 X; p
        print("------ 第 \(block.index) 个区块 --------")9 p' P* q& S  Y' Y5 J3 Z; s/ I% b
        print("创建日期:\(block.dateCreated)")- K6 T% G; g+ ]( F4 A4 R
                  print("数据:\(block.data)"), [( Z$ X, {! u) A' {; ]
        print("Nonce:\(block.nonce)"); \5 }+ F+ ], r/ v1 o6 G# e: b3 P
        print("前一个区块的哈希值:\(block.previousHash!)")1 w1 F; W8 i& l* ~
        print("哈希值:\(block.hash!)")
2 W3 ]6 X5 e$ N" q  O; n7 ?    }1 }* ~( H6 j* z* m1 j
    & ~$ h9 `5 Y4 J: ~; i/ `! K
    private func generateHash(for block: Block) -> String {% A; K9 B/ M4 r5 ~- R
        var hash = block.key.sha1Hash()
' `4 i8 w+ ^) w% N        while !hash.hasPrefix("00") {
1 G8 m; U. Q: g9 z            block.nonce += 1
+ ~3 [7 ?. V& I/ f/ }. S            hash = block.key.sha1Hash(); @$ ?! b& k0 m* x
        }) Q) P0 I6 l4 e- d9 U& e: r
        return hash
- X! N/ Y4 g. n    }
+ b9 W9 \3 C& @' k. y}  b' s  t& @4 [$ p
addBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。
  b: y  h1 X8 {1 E) ~8 U( qgenerateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。9 b/ w! ]$ M* Q% t
下面实际看看我们的区块链。' \: r% L5 Y3 ^# I  L$ {9 g
视频链接9 W# ]% R  U0 Q3 D5 N
从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。$ e2 u' P& r; e
原文 https://juejin.im/post/5a43ae5f51882538650977d1
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    7

  • 主题

    11