关键时刻,第一时间送达!



    区块链(Blockchain)是比特币等流行的加密货币背后的技术。区块链的主要概念是去中心化,提供分布式账本。本文会为你展示如何在 iOS/macOS 中使用 Swift 语言创建最基本的区块链。


    注意:本文不涉及节点(nodes/peers)、验证和奖励等。


    我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。


    实现区块类


    第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:


    class Block {

        var index: Int = 0

        var dateCreated: String

        var previousHash: String!

        var hash: String!

        var nonce: Int

        var data: String

         

        var key: String {

            get {

                return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)

            }

        }

         

        init(data: String) {

            self.dateCreated = Date().toString()

            self.nonce = 0

            self.data = data

        }

    }


    区块类详解:


    • index——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!

    • dateCreated——区块创建的日期

    • previousHash——前一个区块的哈希值

    • hash——当前区块的哈希值

    • nonce——递增的数字,对生成哈希值很关键

    • data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等

    • key——计算属性,提供给产生哈希值的函数


    实现区块链类


    区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:


    class Blockchain {

        private (set) var blocks = [Block]()

         

        init(_ genesisBlock: Block) {

           addBlock(genesisBlock)

        }

         

        func addBlock(_ block: Block) {

            if blocks.isEmpty {

                // 添加创世区块

                // 第一个区块没有 previous hash

                block.previousHash = "0"

                block.hash = generateHash(for: block)

            } else {

                let previousBlock = getPreviousBlock()

                block.previousHash = previousBlock.hash

                block.index = blocks.count

                block.hash = generateHash(for: block)

            }

             

            blocks.append(block)

            displayBlock(block)

        }

         

        private func getPreviousBlock() -> Block {

            return blocks[blocks.count - 1]

        }

         

        private func displayBlock(_ block: Block) {

            print("------ 第 (block.index) 个区块 --------")

            print("创建日期:(block.dateCreated)")

      print("数据:(block.data)")

            print("Nonce:(block.nonce)")

            print("前一个区块的哈希值:(block.previousHash!)")

            print("哈希值:(block.hash!)")

        }

         

        private func generateHash(for block: Block) -> String {

            var hash = block.key.sha1Hash()

            while !hash.hasPrefix("00") {

                block.nonce += 1

                hash = block.key.sha1Hash()

            }

            return hash

        }

    }


    addBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。


    generateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”(https://en.wikipedia.org/wiki/Proof-of-work_system)。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。


    下面实际看看我们的区块链。


    视频链接

    https://weibo.com/tv/v/FBDs01plm?fid=1034:aa96fc2a8d7fcc8a1c2349347f32b996



    从https://gist.github.com/josephchang10/7255e6d5fff311b476baab605145d151 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。





    • 作者:张嘉夫_Joseph

    • 链接:https://juejin.im/post/5a43ae5f51882538650977d1

    • iOS开发整理发布,转载请联系作者授权

    【点击成为Android大神】

    Logo

    北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

    更多推荐