在iOS上面写一个Blockchain

区块链是什么,到底可以解决什么问题?

简单来说区块链就是一个不需要第三方认证的加密账本交易系统。

举个例子:老王租了老李一个房子,他找中介签房屋合同。
老王拉来了中介小张作为第三方见证人,签署了一个简单合同:
来自 老王 给 老李 房屋出租 时间:某年某月
老王签名 :老王 老李签名:老李 小张签名: 小张

一式三份,人手一张,基于这份合同:
1,此时老王,老李,都无法否认该合同的存在。因为第三方小张这里有一份存根可以证明。
问题:
2,如果一个合同在老王这里没有存根,那么有一方肯定是伪造的。
3,第三方的信用在这个体系中扮演了重要角色,小张一定要是一个双方都可信的人才行。或者买卖双方老王,老李一起说这个交易没有发生过,小李这个就吃瘪了,中介费拿不到被老板炒鱿鱼。

于是老王和老李,决定找一个新的交易认证方式:
于是区块链的账本交易方式出现了,不需要第三方担保,交易信息不可以篡改,交易内容永远保存。

原理:
公钥加密算法,又称为不对称加密。指的是加密时需要用到一对密钥:公钥和私钥。用私钥加密的内容,可以用公钥很轻松的解开,但是想要加密出同样的内容,不知道私钥几乎是不可行。

过程如下:
双方各自持有一对密钥。
老王和老李互相告知对方自己的公钥。
老王给了老李一张房屋出租的合同。
老李把经过自己的私钥加密的收据发给老王。

现在这个收据就成了合同。用老李的公钥解密之后内容格式合法,就一定是老王签发的。

他们的交易记录链看起来像是这样:

From 老王
加密内容 发送给老李,时间,价值 1
From 老李
加密内容 发送给老王,时间,价值 2

由于老王和老李的公钥是公开的,任何人都可以用这段交易记录算出小王和小红现在的账户余额,不需要第三方证明了。

我们就从这个简单的交易来写一个swift的区块链的智能合约的代码。

一个区块账单(区块)的数据结构是什么样?

区块数据结构.png

简单逻辑:

交易内容 老王 ——>老李 + Private key = 签名信息
交易内容 + public key = 验证信息

交易内容 + nouce(随机数加密)+presh hash
最后一个区块的Hash + 新区块基本信息 + 交易记录信息 + 随机数
每个节点相互链接,记录用Hash = SHA-256

PreHash ——>Hash PreHash ——>Hash
每个账本都有PreHash和Hash,前一个块跟后一个块,hash相连,最后就形成了区块链。

交易内容:from,to,amout
账本(Block):index(第几个账本),previousHash(前一个hash),hash(后一个hash),nouce(噪音加密)

代码:

    //:打开xcode的Playground,swift
    //: Playground - noun: a place where people can play
   import Cocoa
//数据交易内容
            class Transaction : Codable {
                      var from :String
                        var to :String
                        var amount :Double

      init(from :String, to :String, amount :Double) {
          self.from = from
    self.to = to
    self.amount = amount
}
  }

//账本交易加密
        class Block {
                    var index :Int = 0
                      var previousHash :String = ""
                        var hash :String!
                          var nonce :Int

      private (set) var transactions :[Transaction] = [Transaction]()

var key :String {
    get {
        
        let transactionsData = try! JSONEncoder().encode(self.transactions)
        let transactionsJSONString = String(data: transactionsData, encoding: .utf8)
        
        return String(self.index) + self.previousHash + String(self.nonce) + transactionsJSONString!
    }
}

func addTransaction(transaction :Transaction) {
    self.transactions.append(transaction)
}

init() {
    self.nonce = 0
}
       }

  //账本区块连接成区块链
  class Blockchain { 
   private (set) var blocks :[Block] = [Block]()
   init(genesisBlock :Block) {
          addBlock(genesisBlock)
     }

func addBlock(_ block :Block) {
    
    if self.blocks.isEmpty {
        block.previousHash = "0000000000000000"
        block.hash = generateHash(for :block)
    }
    
    self.blocks.append(block)
}

func getNextBlock(transactions :[Transaction]) -> Block {
    
    let block = Block()
    transactions.forEach { transaction in
        block.addTransaction(transaction: transaction)
    }
    
    let previousBlock = getPreviousBlock()
    block.index = self.blocks.count
    block.previousHash = previousBlock.hash
    block.hash = generateHash(for: block)
    return block

}

private func getPreviousBlock() -> Block {
    return self.blocks[self.blocks.count - 1]
}

func generateHash(for block :Block) -> String {
    
    var hash = block.key.sha1Hash()
    
    while(!hash.hasPrefix("00")) {
        block.nonce += 1
        hash = block.key.sha1Hash()
        print(hash)
    }
    
    return hash
}  
    }

// String Extension
   extension String {
   func sha1Hash() -> String {    
    let task = Process()
    task.launchPath = "/usr/bin/shasum"
    task.arguments = []   
     let inputPipe = Pipe() 
    inputPipe.fileHandleForWriting.write(self.data(using: String.Encoding.utf8)!)     
    inputPipe.fileHandleForWriting.closeFile()
    let outputPipe = Pipe()
    task.standardOutput = outputPipe
    task.standardInput = inputPipe
     task.launch()
    
    let data = outputPipe.fileHandleForReading.readDataToEndOfFile()
    let hash = String(data: data, encoding: String.Encoding.utf8)!
    return hash.replacingOccurrences(of: "  -\n", with: "")
              }
      }

//验证

      let genesisBlock = Block()
      let blockchain = Blockchain(genesisBlock: genesisBlock)
      let transaction = Transaction(from: "Mary", to: "John", amount: 10)
      print("----------------------------------------------")
      let block = blockchain.getNextBlock(transactions: [transaction])
      blockchain.addBlock(block)
      print(blockchain.blocks.count)

将区块链架设部署swift vapor服务器

Target:用Swift写一个区块链交易并架设部署到swift vapor本地服务器
1,将区块链放上服务器,实施区块链Web API

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容