登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

iOS如何实现区域链 [复制链接]

2019-6-1 22:38
2899926939 阅读:94 评论:1 赞:0
Tag:  

更多精彩尽在原文地址

iOS开发之家

iOS开发之家

区块链(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)。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。

如果你依然在编程的世界里迷茫,不知道自己的未来规划,小编给大家推荐一个iOS高级交流群:458839238 里面可以与大神一起交流并走出迷茫。小白可进群免费领取学习资料,看看前辈们是如何在编程的世界里傲然前行!
群内提供数据结构与算法、底层进阶、swift、逆向、整合面试题等免费资料
附上一份收集的各大厂面试题(附答案) ! 群文件直接获取
各大厂面试题

iOS开发之家

推荐文章

【重磅来袭】史上最全iOS面试题及答案

分享到:
我来说两句
facelist
您需要登录后才可以评论 登录 | 立即注册
所有评论(1)
上官天悦 2019-6-2 18:36
你好 我需要ios/MJB 能做加我Q50811239  要求简单 价钱可观
回复
关闭

每日头条

通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 广东互联网违法和不良信息举报中心|中国互联网举报中心|Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

返回顶部