區(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)是什么樣?
簡單邏輯:
交易內(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