構(gòu)建第一個(gè) Swift 區(qū)塊鏈應(yīng)用
區(qū)塊鏈作為一項(xiàng)革命性的技術(shù),開(kāi)始受到越來(lái)越多追捧。為什么呢?因?yàn)閰^(qū)塊鏈?zhǔn)窃S多加密數(shù)字貨幣的底層技術(shù),比如:比特幣(BTC),以太坊(ETH)以及萊特幣(LTC)。區(qū)塊鏈具體是如何工作的?本篇教程會(huì)涵蓋所有區(qū)塊鏈相關(guān)的知識(shí),還會(huì)教你如何構(gòu)建 Swift 區(qū)塊鏈。下面讓我們開(kāi)始吧!
區(qū)塊鏈的工作原理
顧名思義,區(qū)塊鏈?zhǔn)且粭l由不同區(qū)塊連接組成的鏈。每一個(gè)塊包含三個(gè)信息:數(shù)據(jù)、哈希(hash)、以及前置區(qū)塊的哈希。
- 數(shù)據(jù) – 由于應(yīng)用場(chǎng)景不同,存儲(chǔ)在區(qū)塊中的數(shù)據(jù)由區(qū)塊鏈的類型決定。例如,在比特幣區(qū)塊鏈中,存儲(chǔ)的數(shù)據(jù)是交易信息:轉(zhuǎn)賬金額和交易雙方的信息。
- 哈希 – 你可以將哈??醋鰯?shù)字指紋,用來(lái)唯一標(biāo)識(shí)一個(gè)區(qū)塊及其數(shù)據(jù)。哈希的重要之處在于它是一個(gè)獨(dú)特的字母數(shù)字代碼,通常是 64 個(gè)字符。當(dāng)一個(gè)區(qū)塊被創(chuàng)建時(shí),哈希也隨之創(chuàng)建。當(dāng)一個(gè)區(qū)塊被修改,哈希也隨之修改。因此,當(dāng)你想要查看在區(qū)塊上所做的任何變更時(shí),哈希就顯得非常重要。
- 前置區(qū)塊的哈希 – 通過(guò)存儲(chǔ)前置區(qū)塊的哈希,你可以還原每個(gè)區(qū)塊連接成區(qū)塊鏈的過(guò)程!這使得區(qū)塊鏈安全性特別高。
我們來(lái)看下這張圖片:

區(qū)塊鏈
你可以看到,每一個(gè)區(qū)塊包含數(shù)據(jù)(圖片中沒(méi)有指明)、哈希以及前置區(qū)塊的哈希。例如,黃色區(qū)塊包含自身的哈希:H7s6,以及紅色區(qū)塊的哈希:8SD9。這樣它們就構(gòu)成了一條相互連接的鏈?,F(xiàn)在,假如有一個(gè)黑客準(zhǔn)備惡意篡改紅色的區(qū)塊。請(qǐng)記住,每當(dāng)塊以任何方式被篡改時(shí),該區(qū)塊的哈希都會(huì)改變!當(dāng)下一個(gè)區(qū)塊檢查并發(fā)現(xiàn)前置哈希不一致時(shí),黑客將無(wú)法訪問(wèn)它,因?yàn)樗c前置區(qū)塊的聯(lián)系被切斷了(譯者注:即如果黑客想要要篡改一個(gè)區(qū)塊的話,就需要把這個(gè)區(qū)塊后面的所有區(qū)塊都要改掉,而這個(gè)工作量是很難實(shí)現(xiàn)的)。
這使得區(qū)塊鏈特別安全,幾乎不可能回滾或者篡改任何數(shù)據(jù)。雖然哈希為保密和隱私提供了巨大的保障,但是還有兩個(gè)更加安全妥當(dāng)?shù)拇胧┳寘^(qū)塊鏈更加安全:工作量證明(Proof-of-Work)以及智能合約(Smart Contracts)。本文我不會(huì)深入講解,你可以在這里了解更多相關(guān)知識(shí)。
區(qū)塊鏈最后一個(gè)保證自身安全性的方式是基于其定位。和大多數(shù)存儲(chǔ)在服務(wù)器和數(shù)據(jù)庫(kù)的數(shù)據(jù)不同,區(qū)塊鏈?zhǔn)褂玫氖屈c(diǎn)對(duì)點(diǎn)(P2P)網(wǎng)絡(luò)。P2P 是一種允許任何人加入的網(wǎng)絡(luò),并且該網(wǎng)絡(luò)上的數(shù)據(jù)會(huì)分發(fā)給每一個(gè)接收者。
每當(dāng)有人加入這個(gè)網(wǎng)絡(luò),他們就會(huì)獲得一份區(qū)塊鏈的完整拷貝。每當(dāng)有人新建一個(gè)區(qū)塊,就會(huì)廣播給全網(wǎng)。在將該塊添加到鏈之前,節(jié)點(diǎn)會(huì)通過(guò)幾個(gè)復(fù)雜的程序確定該塊是否被篡改。這樣,所有人、所有地方都可以使用這個(gè)信息。如果你是 HBO 美劇硅谷 的粉絲,對(duì)此應(yīng)該不會(huì)感到陌生。在該劇中,主演(Richard)使用一種相似的技術(shù)創(chuàng)造了新型互聯(lián)網(wǎng)(譯者注:有趣的是劇中還發(fā)行了區(qū)塊鏈數(shù)字貨幣 PiedPaperCoin,感興趣的童鞋可以刷一下這部劇)。
因?yàn)槊總€(gè)人都有區(qū)塊鏈或者節(jié)點(diǎn)的一份拷貝,他們可以達(dá)成一種共識(shí)并決定哪部分區(qū)塊是有效的。因此,如果你想要攻擊某個(gè)區(qū)塊,你必須同時(shí)攻擊網(wǎng)絡(luò)上 50% 以上的區(qū)塊(譯者:51% 攻擊),使得你的區(qū)塊可以追上并替換原區(qū)塊鏈。所以區(qū)塊鏈或許是過(guò)去十年所創(chuàng)造的最安全的技術(shù)之一。
關(guān)于示例程序
現(xiàn)在你已經(jīng)對(duì)區(qū)塊鏈的原理有了初步的認(rèn)識(shí),那么我們就開(kāi)始寫(xiě)示例程序吧!你可以在這里下載原始項(xiàng)目。
如你所見(jiàn),我們有兩個(gè)比特幣錢(qián)包。第一個(gè)賬戶 1065 有 500 BTC,而第二個(gè)賬戶 0217 沒(méi)有 BTC。我們通過(guò) send 按鈕可以發(fā)送比特幣到另外的賬戶。為了賺取 BTC,我們可以點(diǎn)擊 Mine 按鈕,可以獲得 50 BTC 的獎(jiǎng)勵(lì)。我們主要工作是查看控制臺(tái)輸出,觀察兩個(gè)賬戶間的交易過(guò)程。

這里寫(xiě)圖片描述
在左側(cè)導(dǎo)航欄可以看到兩個(gè)很重要的類:Block 和 Blockchain。目前這兩個(gè)類都是空實(shí)現(xiàn),我會(huì)帶著你們?cè)谶@兩個(gè)類中寫(xiě)入相關(guān)邏輯。下面讓我們開(kāi)始吧!

這里寫(xiě)圖片描述
在 Swift 中定義區(qū)塊
首先打開(kāi) Block.swift 并添加定義區(qū)塊的代碼。在此之前,我們需要定義區(qū)塊是什么。前面我們?cè)x過(guò),區(qū)塊是由三部分組成:哈希、實(shí)際記錄的數(shù)據(jù)以及前置區(qū)塊的哈希。當(dāng)我們想要構(gòu)建我們的區(qū)塊鏈時(shí),我們必須知道該區(qū)塊是第一個(gè)還是第二個(gè)。我們可以很容易地在 Swift 的類中做如下定義:
- var hash: String!
- var data: String!
- var previousHash: String!
- var index: Int!
現(xiàn)在需要添加最重要的代碼。我曾提過(guò)區(qū)塊在被修改的情況下,哈希也會(huì)隨之變化,這是區(qū)塊鏈如此安全的特性之一。因此我們需要?jiǎng)?chuàng)建一個(gè)函數(shù)去生成哈希,該哈希由隨機(jī)字母和數(shù)字組成。這個(gè)函數(shù)只需要幾行代碼:
- func generateHash() -> String {
- return NSUUID().uuidString.replacingOccurrences(of: "-", with: "")
- }
NSUUID 是一個(gè)代表通用唯一值的對(duì)象,并且可以橋接成 UUID。它可以快速地生成 32 個(gè)字符串。本函數(shù)生成一個(gè) UUID,刪除其中的連接符,然后返回一個(gè) String,最后將結(jié)果作為區(qū)塊的哈希。Block.swift 現(xiàn)在就像下面:

這里寫(xiě)圖片描述
現(xiàn)在我們已經(jīng)定義好了 Block 類,下面來(lái)定義 Blockchain 類,首先切換到 Blockchain.swift 。
在 Swift 中定義區(qū)塊鏈
和之前一樣,首先分析區(qū)塊鏈的基本原理。用非?;A(chǔ)的術(shù)語(yǔ)來(lái)說(shuō),區(qū)塊鏈只是由一連串的區(qū)塊連接而成,也可以說(shuō)是一個(gè)由多個(gè)條目組成的列表。這是不是聽(tīng)起來(lái)很熟悉呢?其實(shí)這就是數(shù)組的定義!而且這個(gè)數(shù)組是由區(qū)塊組成的!接下來(lái)添加以下代碼:
- var chain = [Block]()
快速提示: 這個(gè)方法可以應(yīng)用于計(jì)算機(jī)科學(xué)世界里的任何事物。如果你遇到大難題,可以嘗試把它分解成若干個(gè)小問(wèn)題,以此來(lái)建立起解決問(wèn)題的方法,正如我們解決在 Swift 中如何添加區(qū)塊和區(qū)塊鏈的問(wèn)題。
你會(huì)注意到數(shù)組里面是我們前面定義的 Block 類,這就是區(qū)塊鏈所需要的所有變量。為了完成功能,我們還需要在類中添加兩個(gè)函數(shù)。請(qǐng)嘗試著根據(jù)我之前教過(guò)的方法解答這個(gè)問(wèn)題。
區(qū)塊鏈中的兩個(gè)主要函數(shù)是什么?
我希望你能認(rèn)真思考并回答這個(gè)問(wèn)題!實(shí)際上,區(qū)塊鏈的兩個(gè)主要功能是創(chuàng)建創(chuàng)世區(qū)塊(最初的始?jí)K),以及在其結(jié)尾添加新的區(qū)塊。當(dāng)然現(xiàn)在我不打算實(shí)現(xiàn)分叉區(qū)塊鏈和添加智能合約的功能,但你必須了解這兩個(gè)是基本功能!將以下代碼添加到 Blockchain.swift:
- func createGenesisBlock(data:String) {
- let genesisBlock = Block()
- genesisBlock.hash = genesisBlock.generateHash()
- genesisBlock.data = data
- genesisBlock.previousHash = "0000"
- genesisBlock.index = 0
- chain.append(genesisBlock)
- }
- func createBlock(data:String) {
- let newBlock = Block()
- newBlock.hash = newBlock.generateHash()
- newBlock.data = data
- newBlock.previousHash = chain[chain.count-1].hash
- newBlock.index = chain.count
- chain.append(newBlock)
- }
1、我們添加的第一個(gè)函數(shù)的作用是創(chuàng)建創(chuàng)世區(qū)塊。為此,我們創(chuàng)建了一個(gè)以區(qū)塊數(shù)據(jù)為入?yún)⒌暮瘮?shù)。然后定義了一個(gè)類型為 Block 的變量 genesisBlock,它擁有此前在 Block.swift 中定義的所有變量和函數(shù)。我們將 generateHash() 賦值給哈希,將輸入的 data 參數(shù)賦值給數(shù)據(jù)。由于這是第一個(gè)區(qū)塊,我們將前置區(qū)塊的哈希設(shè)為 0000,這樣我們就可以知道這是起始區(qū)塊。最后我們將 index 設(shè)為 0,并將這個(gè)區(qū)塊加入到區(qū)塊鏈中。
2、我們創(chuàng)建的第二個(gè)函數(shù)適用于 genesisBlock 之后的所有區(qū)塊,并且能創(chuàng)建剩余的區(qū)塊。你會(huì)注意到它與第一個(gè)函數(shù)非常相似。唯一的區(qū)別是,我們將 previousHash 的值設(shè)置為前一個(gè)區(qū)塊的哈希值,并將 index 設(shè)置為它在區(qū)塊鏈中的位置。就這樣,區(qū)塊鏈已經(jīng)定義好了!你的代碼應(yīng)該看起來(lái)跟下圖一樣!

這里寫(xiě)圖片描述
錢(qián)包后端
現(xiàn)在切換到 ViewController.swift,我們會(huì)發(fā)現(xiàn)所有的 outlet 都已經(jīng)連接好了。我們只需要處理交易,并將其輸出到控制臺(tái)。
然而在此之前,我們需要稍微研究一下比特幣的區(qū)塊鏈。比特幣是由一個(gè)總賬戶產(chǎn)生的,我們將這個(gè)賬號(hào)的編號(hào)稱為 0000。當(dāng)你挖到一個(gè) BTC,意味著你解決了數(shù)學(xué)問(wèn)題,因此會(huì)發(fā)行一定數(shù)量的比特幣作為獎(jiǎng)勵(lì)。這提供了一個(gè)發(fā)幣的高明方法,并且可以激勵(lì)更多人去挖礦。在我們的應(yīng)用,讓我們把挖礦獎(jiǎng)勵(lì)設(shè)為 100 BTC。首先,在視圖控制器中添加所需的變量:
- let firstAccount = 1065
- let secondAccount = 0217
- let bitcoinChain = Blockchain()
- let reward = 100
- var accounts: [String: Int] = ["0000": 10000000]
- let invalidAlert = UIAlertController(title: "Invalid Transaction", message: "Please check the details of your transaction as we were unable to process this.", preferredStyle: .alert)
首先定義號(hào)碼為 1065 和 0217 的兩個(gè)賬號(hào)。然后添加一個(gè)名為 bitcoinChain 的變量作為我們的區(qū)塊鏈,并將 reward 設(shè)為 100。我們需要一個(gè)主帳戶作為所有比特幣的來(lái)源:即創(chuàng)世帳戶 0000。里面有 1000 萬(wàn)個(gè)比特幣。你可以把這個(gè)賬戶想象成一個(gè)銀行,所有因獎(jiǎng)勵(lì)產(chǎn)生的 100 個(gè)比特幣都經(jīng)此發(fā)放到合法賬戶中。我們還定義了一個(gè)提醒彈窗,每當(dāng)交易無(wú)法完成時(shí)就會(huì)彈出。
現(xiàn)在,讓我們來(lái)編寫(xiě)幾個(gè)運(yùn)行時(shí)需要的通用函數(shù)。你能猜出是什么函數(shù)嗎?
- 第一個(gè)函數(shù)是用來(lái)處理交易的。我們需要確保交易雙方的賬戶,能夠接收或扣除正確的金額,并將這些信息記錄到我們的區(qū)塊鏈中。
- 下一個(gè)函數(shù)是在控制臺(tái)中打印整個(gè)記錄 —— 它將顯示每個(gè)區(qū)塊及其中的數(shù)據(jù)。
- 最后一個(gè)是用于驗(yàn)證區(qū)塊鏈?zhǔn)欠裼行У暮瘮?shù),通過(guò)校驗(yàn)下一個(gè)區(qū)塊的 previousHash 和上一個(gè)區(qū)塊 hash 是否匹配。由于我們不會(huì)演示任何黑客方法,因此在我們的示例程序中,區(qū)塊鏈?zhǔn)怯肋h(yuǎn)有效的。
交易函數(shù)
下面是一個(gè)通用的交易函數(shù),請(qǐng)?jiān)谖覀兌x的變量下方輸入以下代碼:
- func transaction(from: String, to: String, amount: Int, type: String) {
- // 1
- if accounts[from] == nil {
- self.present(invalidAlert, animated: true, completion: nil)
- return
- } else if accounts[from]!-amount < 0 {
- self.present(invalidAlert, animated: true, completion: nil)
- return
- } else {
- accounts.updateValue(accounts[from]!-amount, forKey: from)
- }
- // 2
- if accounts[to] == nil {
- accounts.updateValue(amount, forKey: to)
- } else {
- accounts.updateValue(accounts[to]!+amount, forKey: to)
- }
- // 3
- if type == "genesis" {
- bitcoinChain.createGenesisBlock(data: "From: \(from); To: \(to); Amount: \(amount)BTC")
- } else if type == "normal" {
- bitcoinChain.createBlock(data: "From: \(from); To: \(to); Amount: \(amount)BTC")
- }
- }
代碼量看起來(lái)好像很大,但主要是定義了每個(gè)交易需要遵循的一些規(guī)則。一開(kāi)始是函數(shù)的四個(gè)參數(shù):
to,from,amount,type。前三個(gè)參數(shù)不需要再解釋了,而 Type 主要用于定義交易的類型??偣灿袃蓚€(gè)類型:正常類型(normal) 和創(chuàng)世類型(genesis)。正常類型的交易會(huì)發(fā)生在賬戶 1065 和 2017 之間,而創(chuàng)世類型將會(huì)涉及到賬戶 0000。
- 第一個(gè) if-else 條件語(yǔ)句處理轉(zhuǎn)出賬戶的信息。如果賬戶不存在或者余額不足,將會(huì)提示交易不合法并返回。
- 第二個(gè) if-else 條件語(yǔ)句處理轉(zhuǎn)入賬戶的信息。如果賬戶不存在,則創(chuàng)建新賬戶并轉(zhuǎn)入相應(yīng)的比特幣。反之,則向該賬戶轉(zhuǎn)入正確數(shù)量的比特幣。
- 最后一個(gè) if-else 條件語(yǔ)句處理交易類型。如果類型是創(chuàng)世類型,則添加一個(gè)創(chuàng)世區(qū)塊,否則創(chuàng)建一個(gè)新的區(qū)塊存儲(chǔ)數(shù)據(jù)。
打印函數(shù)
為了確保交易正確執(zhí)行,在每個(gè)交易結(jié)束后,我們希望拿到所有交易的清單。以下是我們?cè)诮灰缀瘮?shù)下方的代碼,用來(lái)打印相關(guān)信息:
- func chainState() {
- for i in 0...bitcoinChain.chain.count-1 {
- print("\tBlock: \(bitcoinChain.chain[i].index!)\n\tHash: \(bitcoinChain.chain[i].hash!)\n\tPreviousHash: \(bitcoinChain.chain[i].previousHash!)\n\tData: \(bitcoinChain.chain[i].data!)")
- }
- redLabel.text = "Balance: \(accounts[String(describing: firstAccount)]!) BTC"
- blueLabel.text = "Balance: \(accounts[String(describing: secondAccount)]!) BTC"
- print(accounts)
- print(chainValidity())
- }
這是一個(gè)簡(jiǎn)單的循環(huán)語(yǔ)句,遍歷 bitcoinChain 中的所有區(qū)塊,并打印區(qū)塊號(hào)碼,哈希,前置哈希,以及存儲(chǔ)的數(shù)據(jù)。同時(shí)我們更新了界面中的標(biāo)簽(label),這樣就可以顯示賬戶中正確的 BTC 數(shù)量。最后,打印所有的賬戶(應(yīng)該是 3 個(gè)),并校驗(yàn)區(qū)塊鏈的有效性。
現(xiàn)在你應(yīng)該會(huì)在函數(shù)的最后一行發(fā)現(xiàn)一個(gè)錯(cuò)誤。這是由于我們還沒(méi)有實(shí)現(xiàn) chainValidity() 函數(shù),讓我們馬上開(kāi)始吧。
有效性函數(shù)
判斷一個(gè)鏈?zhǔn)欠裼行У臉?biāo)準(zhǔn)是:前置區(qū)塊的哈希與當(dāng)前區(qū)塊所表示的是否匹配。我們可以再次用循環(huán)語(yǔ)句來(lái)遍歷所有的區(qū)塊:
- func chainValidity() -> String {
- var isChainValid = true
- for i in 1...bitcoinChain.chain.count-1 {
- if bitcoinChain.chain[i].previousHash != bitcoinChain.chain[i-1].hash {
- isChainValid = false
- }
- }
- return "Chain is valid: \(isChainValid)\n"
- }
和之前一樣,我們遍歷了 bitcoinChain 中的所有區(qū)塊,并檢查了前置區(qū)塊的 hash 是否與當(dāng)前區(qū)塊的 previousHash 一致。
就醬!我們已經(jīng)將定義了所有需要的函數(shù)!你的 ViewController.swift 應(yīng)該如下圖一樣:

這里寫(xiě)圖片描述
收尾工作就是連接按鈕和函數(shù)啦。讓我們馬上開(kāi)始最后的部分吧!
讓一切關(guān)聯(lián)起來(lái)
當(dāng)我們的應(yīng)用第一次啟動(dòng)時(shí),需要?jiǎng)?chuàng)世賬戶 0000 發(fā)送 50 BTC 到我們的第一個(gè)賬戶。再?gòu)牡谝粋€(gè)賬戶轉(zhuǎn)賬 10 BTC 到第二個(gè)賬戶,這只需要寥寥三行代碼。最后 viewDidLoad 中的代碼如下:
- override func viewDidLoad() {
- super.viewDidLoad()
- transaction(from: "0000", to: "\(firstAccount)", amount: 50, type: "genesis")
- transaction(from: "\(firstAccount)", to: "\(secondAccount)", amount: 10, type: "normal")
- chainState()
- self.invalidAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
- }
我們使用已定義好的函數(shù)轉(zhuǎn)賬,并調(diào)用 chainState() 函數(shù)。最后,我們還在 invalidAlert 中添加了一個(gè)標(biāo)題為 OK 的 UIAlertAction。
現(xiàn)在讓我們來(lái)實(shí)現(xiàn)剩下的四個(gè)函數(shù):ReMeNe()、BrimeMeNe()、ReSdEnter()和BuLeScript()。
挖礦函數(shù)
挖礦函數(shù)特別簡(jiǎn)單,只需要三行代碼。添加以下代碼:
- @IBAction func redMine(_ sender: Any) {
- transaction(from: "0000", to: "\(firstAccount)", amount: 100, type: "normal")
- print("New block mined by: \(firstAccount)")
- chainState()
- }
- @IBAction func blueMine(_ sender: Any) {
- transaction(from: "0000", to: "\(secondAccount)", amount: 100, type: "normal")
- print("New block mined by: \(secondAccount)")
- chainState()
- }
在第一個(gè)挖礦函數(shù)中,我們使用交易函數(shù)從創(chuàng)世賬戶發(fā)送了 100 BTC 到第一個(gè)賬戶。我們打印了挖礦的區(qū)塊,然后打印了區(qū)塊鏈的狀態(tài)。同樣地,在 blueMine 函數(shù)中,我們轉(zhuǎn)給了第二個(gè)賬戶 100 BTC。
發(fā)送函數(shù)
發(fā)送函數(shù)和挖礦函數(shù)略微相似:
- @IBAction func redSend(_ sender: Any) {
- if redAmount.text == "" {
- present(invalidAlert, animated: true, completion: nil)
- } else {
- transaction(from: "\(firstAccount)", to: "\(secondAccount)", amount: Int(redAmount.text!)!, type: "normal")
- print("\(redAmount.text!) BTC sent from \(firstAccount) to \(secondAccount)")
- chainState()
- redAmount.text = ""
- }
- }
- @IBAction func blueSend(_ sender: Any) {
- if blueAmount.text == "" {
- present(invalidAlert, animated: true, completion: nil)
- } else {
- transaction(from: "\(secondAccount)", to: "\(firstAccount)", amount: Int(blueAmount.text!)!, type: "normal")
- print("\(blueAmount.text!) BTC sent from \(secondAccount) to \(firstAccount)")
- chainState()
- blueAmount.text = ""
- }
- }
首先,我們檢查 redAmount 或者 blueAmount 的文本值是否為空。如果為空,則彈出無(wú)效交易的提示框。如果不為空,則繼續(xù)下一步。我們使用交易函數(shù)從第一個(gè)賬戶轉(zhuǎn)賬到第二個(gè)賬戶(或者反向轉(zhuǎn)賬),金額為輸入的數(shù)量。我們打印轉(zhuǎn)賬金額,并調(diào)用 chainState() 方法。最后,清空文本框。
就醬,工作完成!請(qǐng)檢查你的代碼是否和圖中一致:

這里寫(xiě)圖片描述
現(xiàn)在運(yùn)行應(yīng)用并測(cè)試一下。從前端看,這就像一個(gè)正常的交易應(yīng)用,但是運(yùn)行在屏幕背后的可是區(qū)塊鏈啊!請(qǐng)嘗試使用應(yīng)用將 BTC 從一個(gè)帳戶轉(zhuǎn)移到另一個(gè)帳戶,隨意測(cè)試,盡情把玩吧!
結(jié)論
在這個(gè)教程中,你已經(jīng)學(xué)會(huì)了如何使用 Swift 創(chuàng)建區(qū)塊鏈,并且創(chuàng)建了你自己的比特幣交易系統(tǒng)。請(qǐng)注意,真正加密貨幣的后端,和我們上面的實(shí)現(xiàn)完全不一樣,因?yàn)樗枰弥悄芎霞s實(shí)現(xiàn)分布式,而本例僅用于學(xué)習(xí)。
在這個(gè)示例中,我們將區(qū)塊鏈技術(shù)應(yīng)用于加密貨幣,然而你能想到區(qū)塊鏈的其他應(yīng)用場(chǎng)景嗎?請(qǐng)留言分享給大家!希望你能學(xué)到更多新東西!
為了參考,你可以從 GitHub 下載完整的示例。