社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  区块链

在 iOS 中实现区块链

Cocoa开发者社区 • 7 年前 • 899 次点击  



本文参考



区块链(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”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。


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


视频链接


Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。


作者:张嘉夫_Joseph

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



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/YBPKkeT9QY
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/6572
 
899 次点击