在iOS上面寫一個Blockchain

區(qū)塊鏈?zhǔn)鞘裁辞笤ィ降卓梢越鉀Q什么問題?

簡單來說區(qū)塊鏈就是一個不需要第三方認(rèn)證的加密賬本交易系統(tǒng)膨更。

舉個例子:老王租了老李一個房子汗盘,他找中介簽房屋合同。
老王拉來了中介小張作為第三方見證人询一,簽署了一個簡單合同:
來自 老王 給 老李 房屋出租 時間:某年某月
老王簽名 :老王 老李簽名:老李 小張簽名: 小張

一式三份隐孽,人手一張癌椿,基于這份合同:
1,此時老王菱阵,老李踢俄,都無法否認(rèn)該合同的存在。因為第三方小張這里有一份存根可以證明晴及。
問題:
2都办,如果一個合同在老王這里沒有存根,那么有一方肯定是偽造的虑稼。
3琳钉,第三方的信用在這個體系中扮演了重要角色,小張一定要是一個雙方都可信的人才行蛛倦「枥粒或者買賣雙方老王,老李一起說這個交易沒有發(fā)生過溯壶,小李這個就吃癟了及皂,中介費拿不到被老板炒魷魚。

于是老王和老李且改,決定找一個新的交易認(rèn)證方式:
于是區(qū)塊鏈的賬本交易方式出現(xiàn)了验烧,不需要第三方擔(dān)保,交易信息不可以篡改又跛,交易內(nèi)容永遠(yuǎn)保存碍拆。

原理:
公鑰加密算法,又稱為不對稱加密慨蓝。指的是加密時需要用到一對密鑰:公鑰和私鑰倔监。用私鑰加密的內(nèi)容,可以用公鑰很輕松的解開菌仁,但是想要加密出同樣的內(nèi)容浩习,不知道私鑰幾乎是不可行。

過程如下:
雙方各自持有一對密鑰济丘。
老王和老李互相告知對方自己的公鑰谱秽。
老王給了老李一張房屋出租的合同。
老李把經(jīng)過自己的私鑰加密的收據(jù)發(fā)給老王摹迷。

現(xiàn)在這個收據(jù)就成了合同疟赊。用老李的公鑰解密之后內(nèi)容格式合法,就一定是老王簽發(fā)的峡碉。

他們的交易記錄鏈看起來像是這樣:

From 老王
加密內(nèi)容 發(fā)送給老李近哟,時間,價值 1
From 老李
加密內(nèi)容 發(fā)送給老王鲫寄,時間吉执,價值 2

由于老王和老李的公鑰是公開的疯淫,任何人都可以用這段交易記錄算出小王和小紅現(xiàn)在的賬戶余額,不需要第三方證明了戳玫。

我們就從這個簡單的交易來寫一個swift的區(qū)塊鏈的智能合約的代碼熙掺。

一個區(qū)塊賬單(區(qū)塊)的數(shù)據(jù)結(jié)構(gòu)是什么樣?

區(qū)塊數(shù)據(jù)結(jié)構(gòu).png

簡單邏輯:

交易內(nèi)容 老王 ——>老李 + Private key = 簽名信息
交易內(nèi)容 + public key = 驗證信息

交易內(nèi)容 + nouce(隨機數(shù)加密)+presh hash
最后一個區(qū)塊的Hash + 新區(qū)塊基本信息 + 交易記錄信息 + 隨機數(shù)
每個節(jié)點相互鏈接咕宿,記錄用Hash = SHA-256

PreHash ——>Hash PreHash ——>Hash
每個賬本都有PreHash和Hash币绩,前一個塊跟后一個塊,hash相連府阀,最后就形成了區(qū)塊鏈缆镣。

交易內(nèi)容:from,to试浙,amout
賬本(Block):index(第幾個賬本)董瞻,previousHash(前一個hash),hash(后一個hash)川队,nouce(噪音加密)

代碼:

    //:打開xcode的Playground,swift
    //: Playground - noun: a place where people can play
   import Cocoa
//數(shù)據(jù)交易內(nèi)容
            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
}
       }

  //賬本區(qū)塊連接成區(qū)塊鏈
  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)

將區(qū)塊鏈架設(shè)部署swift vapor服務(wù)器

Target:用Swift寫一個區(qū)塊鏈交易并架設(shè)部署到swift vapor本地服務(wù)器
1,將區(qū)塊鏈放上服務(wù)器,實施區(qū)塊鏈Web API

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末睬澡,一起剝皮案震驚了整個濱河市固额,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌煞聪,老刑警劉巖斗躏,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昔脯,居然都是意外死亡啄糙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門云稚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隧饼,“玉大人,你說我怎么就攤上這事静陈⊙嘌悖” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵鲸拥,是天一觀的道長拐格。 經(jīng)常有香客問我,道長刑赶,這世上最難降的妖魔是什么捏浊? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮撞叨,結(jié)果婚禮上金踪,老公的妹妹穿的比我還像新娘浊洞。我一直安慰自己,他們只是感情好热康,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布沛申。 她就那樣靜靜地躺著,像睡著了一般姐军。 火紅的嫁衣襯著肌膚如雪铁材。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天奕锌,我揣著相機與錄音著觉,去河邊找鬼。 笑死惊暴,一個胖子當(dāng)著我的面吹牛饼丘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辽话,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼肄鸽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了油啤?” 一聲冷哼從身側(cè)響起典徘,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎益咬,沒想到半個月后逮诲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡幽告,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年梅鹦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冗锁。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡齐唆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冻河,到底是詐尸還是另有隱情蝶念,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布芋绸,位于F島的核電站媒殉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏摔敛。R本人自食惡果不足惜廷蓉,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桃犬,春花似錦刹悴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至形用,卻和暖如春就轧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背田度。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工妒御, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镇饺。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓乎莉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奸笤。 傳聞我的和親對象是個殘疾皇子惋啃,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容