區塊鏈開發需要什么技術(如何成為一名區塊鏈開發者(一))
導讀:隨著區塊鏈成為國家戰略,央行也推出數字貨幣,業界對區塊鏈行業從業人員的需求越來越大;另外最近比特幣價格又創新高,去中心化金融 DeFi 應用也非常火熱,程序員業余也有開發了解區塊鏈的需求。高可用架構翻譯 blockgeeks 的系列文章,幫助大家更好學習及了解區塊鏈開發。
在本文中,我們將向你介紹如何成為一名區塊鏈開發工程師。正如你很快就會看到的那樣,區塊鏈開發與普通的互聯網開發并沒有本質不同。為了方便大家上手,我們編寫了這篇指南來幫助大家學習區塊鏈開發,并在每個小節給出了總結性的操作步驟。
早期比特幣的開發范圍比較有限,然而隨著以太坊的發布,區塊鏈開發的游戲規則發生了根本性的改變,以太坊是世界上第一個可編程的區塊鏈。全球的開發者終于有機會在區塊鏈之上構建自己的應用。這也是為什么學習區塊鏈開發成為一項如此熱門的技能的原因之一。
毋庸置疑,我們已經生活在“區塊鏈時代”,它對我們未來的影響非常大。那么,如何才能在這場區塊鏈革命中分得一杯羹呢?如果你想成為一名區塊鏈開發者,那么你需要按照一定的方法。
希望通過這篇指南,你能開始你的區塊鏈旅程。如果你想成為一名真正的區塊鏈開發者,我們需要為你設定一些期望。首先,這需要時間,你需要將你的時間和資源投入到你的學習中。其次,不要期望立馬就可以獲得成果,區塊鏈開發不能一蹴而就。
說了這么多,讓我們開始正題吧。
成為一名區塊鏈開發者 — 里程碑#1:了解基礎知識
區塊鏈開發工具
對于任何新的革命性的技術,比如區塊鏈,最大的障礙之一就是熟悉系統中不可或缺的各種概念。
如果你是一個區塊鏈初學者,你需要熟悉某些術語。
學習區塊鏈技術
區塊鏈:區塊鏈 (1) 是由一條多個區塊組成的鏈條,每一個區塊都存儲對應的數據,它沒有任何中心化監管,而是通過密碼學來保證安全和數據不可改變。
去中心化:區塊鏈被認為是去中心化的,因為沒有中心化機構監督。
共識機制:去中心化網絡就某些事項達成共識的機制 (2)。
礦工:利用計算能力挖掘新區塊的用戶。
建議你多了解一下這些在加密領域廣泛使用的術語。也可以瀏覽我們的綜合詞匯表 (3)。了解這些基本的術語非常重要,否則你會在進一步的學習中非常迷茫。
如果你對如何在區塊鏈之上創建一個金融科技應用感興趣,那么你一定要學習加密經濟學的來龍去脈。大多數開發人員通常精通“加密”部分,但可能對“經濟學”部分的知識一無所知。
鑒于此,不妨讀一讀經濟學方面的知識,對其有一個大致的了解。如果你想了解一般的加密經濟學,那么你可以在這里查看我們的文章 (4)。
如果你對密碼學特別感興趣,想知道數字簽名是如何工作,以及了解公鑰密碼學的含義,那么請閱讀這個 (5)。
之后,強烈建議你了解一下比特幣的工作原理,比特幣是區塊鏈技術中傳播最廣泛、最好、最優雅的應用之一。你甚至可以說它是區塊鏈技術所能達到的最優秀的例子,基于它所產生的影響。因此建議你閱讀中本聰的比特幣白皮書 (6)
(1) https://blockgeeks.com/guides/what-is-blockchain-technology/
(2) https://blockgeeks.com/guides/what-is-cryptoeconomics/
(3) https://blockgeeks.com/guides/blockchain-glossary-from-a-z/
(4) https://blockgeeks.com/guides/what-is-cryptoeconomics/
(5) https://blockgeeks.com/guides/cryptocurrencies-cryptography/
(6) https://bitcoin.org/bitcoin.pdf
現在,這完成了第一個里程碑。
讓我們來回顧一下你需要在這一步完成的行動計劃。
熟悉各種專業術語。
閱讀區塊鏈的更多技術方面的內容。
閱讀比特幣白皮書。
成為一名區塊鏈開發者 — 里程碑 #2:熟悉流程
看到很多新晉 "開發者 "完全沒有真實世界的一手經驗,這是令人驚訝的。如果一個系統你一次都沒有使用過,怎么可能對它進行創新和改進呢?
因此強烈建議你從今天開始熟悉這個系統。
去 Coinbase 或任何其他你熟悉的交易所購買一些幣。你不需要創建一個廣泛的投資組合,只需要購買一些幣來觀察整個流程是如何工作的。
這是非常直接的。既然你不打算購買大量的幣,那么只需使用一個基本的在線錢包。
這些錢包是所有錢包中最容易使用的。創建超級簡單,因為它基本上是在任何一個交易所服務上創建自己的賬戶。此外,你可以從世界上任何服務器或任何設備訪問這個錢包,只要它連接到網絡。說到這里,在線錢包有一個很大的問題。你的私鑰會被保存在另一臺服務器上。這基本上就像在銀盆上向黑客提供你的密鑰。不要使用在線錢包來存儲大量的資金。僅存放你需要的最低限度的測試交易用途的金額。
當你創建一個廣泛的加密貨幣投資組合時,你必須學會如何利用冷錢包來存儲你的資金。你可以在這里學習如何這樣做。后來,如果你開始了你的募資,那么你必須知道錢包,特別是多簽錢包如何工作。
這一部分也將結束,艱難的部分從下一個里程碑開始。
這一節的行動計劃包括:
了解交易所的工作原理
熟悉使用錢包。
成為一名區塊鏈開發者 — 里程碑3:開始編碼
作為一名區塊鏈開發者,我們將在后端面臨大量的挑戰。由于一些原因,創建和維護一個公鏈并不容易。
原因1:安全
正如 David Schwartz 所說,區塊鏈應該是堡壘。首先,代碼是公開的,所有人都可以看到。任何人都可以查看代碼,檢查錯誤和漏洞。然而,與其他開放的代碼資源不同,在區塊鏈代碼上尋找漏洞的缺點是巨大的。任何程序員都可以黑客入侵,并有可能獲得數百萬美元甚至數百萬美元的資金。由于這些合理的安全問題考慮,區塊鏈上的開發進展通常非常緩慢。
原因二:資源管理
跟上網絡的節奏很重要,不能滯后而跟不上所有的網絡請求。你需要應對遠程和本地查詢的訪問。
原因3:性能
區塊鏈必須始終以盡可能高的能力執行,但要做到這一點,所選擇的語言必須是非常通用的。問題是,區塊鏈中的某些任務是可以并行的,而有些任務是不能并行完成的。
數字簽名驗證就是可并行任務的一個好例子。簽名驗證所需要的就是密鑰、交易和簽名。只需三個數據,你就可以以并行化的方式進行驗證。
然而,并不是區塊鏈上所有的功能都應該這樣做。想想交易執行本身。多個交易不能并行執行,需要一次只做一個,以避免雙重支出等邏輯錯誤。有些語言擅長并行操作,而有些語言擅長非并行操作。
原因4:隔離
什么是確定性行為?
如果 A+B=C,那么無論在什么情況下,A+B 永遠等于 C,這就叫確定性行為。
哈希函數是確定性的,即 A 的哈希值永遠是 H(A)。
所以,在區塊鏈開發中,所有的交易操作都必須是確定性的。你不能有一個交易的行為是一種方式,然后第二天又是另一種方式。同樣,你不能讓智能合約在兩臺不同的機器上以兩種不同的方式工作。
唯一的解決方案是隔離。基本上,你將你的智能合約和交易與非確定性元素隔離。
有一些語言可以滿足大部分需求,如果你是一個區塊鏈開發者,那么你肯定需要掌握一些 C++ 和 JavaScript 的基本知識。
雖然 C++ 可能看起來有點過時,但事實是,它奇妙地滿足了我們上面所描述的所有功能。事實上,中本聰用 C++ 編寫了比特幣的源代碼。
它與 HTML 和 CSS 一起,是 WWW 內容制作的三大核心技術之一。Javascript 通常用于創建用戶交互的網頁。
那么,現在我們就來看看如何使用 Javascript 創建一個非常簡單的區塊鏈。
我們如何創建一個區塊?一個簡單的區塊由什么組成?在我們將要開發的簡單加密貨幣中(我們稱它為 "BlockGeeksCoin"),每個區塊包含以下信息:
索引:區塊的編號
時間戳:區塊的創建時間
數據:區塊內的數據
Previous Hash:上一個區塊的 hash 值。
Hash 值:當前塊的 Hash 值。
在我們繼續之前,你需要了解我們在程序中要用到的一些術語。
This: "this "關鍵字是在函數中被調用的,它使你能夠訪問調用該函數的特定對象的值。
構造函數。構造函數是一個特殊的函數,它可以幫助在一個類中創建和初始化一個對象。每個類只能有一個構造函數。
已經差不多了,讓我們開始創建我們的區塊。
創建新區塊代碼
const SHA256 = require("crypto-js/sha256");class Block{constructor(index, timestamp, data, previousHash = ''){this.index = index;this.previousHash = previousHash;this.timestamp = timestamp;this.data = data;this.hash = this.calculateHash;}calculateHash{return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data)).toString;}}
代碼分析
好了,這里就創建了一個區塊。在代碼的第一行,我們調用了 crypto-js 庫,因為 sha256 哈希函數在 JavaScript 中默認是不提供的。
接下來,我們在類里面調用了一個構造函數,來調用會有一定值的對象。吸引你眼球的可能是 calculateHash 函數。讓我們來看看它到底在做什么。
在一個區塊中,我們把所有的內容進行哈希處理,得到該特定區塊的哈希值。我們使用 JSON.stringify 函數將塊的數據變成一個字符串來進行散列。
好了,我們已經準備好了塊,可以開始了。現在讓我們把這些區塊連接在一起變成一個區塊鏈。
class Blockchain{//Section 1 Genesis block creationconstructor{this.chain = [this.createGenesisBlock()];}createGenesisBlock{return new Block(0, "01/01/2017", "Genesis block", "0");}//section 2 adding new blocksgetLatestBlock{return this.chain[this.chain.length - 1];}addBlock(newBlock) {newBlock.previousHash = this.getLatestBlock.hash;newBlock.hash = newBlock.calculateHash;this.chain.push(newBlock);}//section 3 validating the chainisChainValid{for (let i = 1; i < this.chain.length; i++){const currentBlock = this.chain[i];const previousBlock = this.chain[i - 1];if (currentBlock.hash !== currentBlock.calculateHash) {return false;}if (currentBlock.previousHash !== previousBlock.hash){return false;}}return true;}}
代碼分析
好了,上面的代碼中執行了很多操作,我們把它分成幾個部分。
第一部分:創世紀塊
什么是創世區塊?
創世區塊是區塊鏈的第一個區塊,之所以特殊,是因為每個區塊都指向之前的區塊,而創世區塊并不指向任何東西。所以,在創建新鏈的那一刻,創世區塊會立即被創建。
因此,你可以看到一個 createGenesisBlock 函數,在這個函數中,我們手動給出了塊的數據。
createGenesisBlock{return new Block(0, "01/01/2017", "Genesis block", "0");}
第二部分:添加區塊
首先,我們需要知道當前區塊鏈中最新一個區塊是什么。為此,我們使用 getLatestBlock 函數。
getLatestBlock{return this.chain[this.chain.length - 1];}Now that we have determined the latest block, let’s see how we are going to add new blocks.addBlock(newBlock) {newBlock.previousHash = this.getLatestBlock.hash;newBlock.hash = newBlock.calculateHash;this.chain.push(newBlock);}
那么,這里發生了什么?我們是如何添加區塊的?我們如何檢查給定的區塊是否有效?
還記得一個區塊的內容嗎?每個區塊有前一個區塊的哈希值,對嗎?
所以,我們在這里要做的很簡單。將新出塊的 previousHash 與最后一個區塊哈希值進行比較。
如果這兩個值相匹配,那么就意味著新的區塊是合法的,它被添加到區塊鏈中。
第三部分:驗證鏈
現在,我們需要檢查沒有人對我們的區塊鏈進行破壞,一切都很穩定。
我們使用 for 循環從區塊1到最后一個區塊。創世區塊是區塊 0。
for (let i = 1; i < this.chain.length; i++){const currentBlock = this.chain[i];const previousBlock = this.chain[i - 1];In this part of the code we are defining two terms, current block and previous block. And now we are simply going to find the hash of these two values.if (currentBlock.hash !== currentBlock.calculateHash) {return false;}if (currentBlock.previousHash !== previousBlock.hash){return false;}}return true;}
如果當前區塊的 previousHash 不等于前一個區塊的 Hash,那么這個函數將返回 False,否則將返回 True。
使用區塊鏈
現在,我們終于要使用區塊鏈來創建我們的 BlockGeeksCoin 了。
let BlockGeeksCoin = new Blockchain;BlockGeeksCoin.addBlock(new Block(1, "20/07/2017", { amount: 4 }));BlockGeeksCoin.addBlock(new Block(2, "20/07/2017", { amount: 8 }));
就是這樣!
那么這里發生了什么?
我們基于區塊鏈創建了一個新的加密貨幣,并將其命名為BlockGeeksCoin。通過調用這個新對象,我激活了構造函數,進而自動創建了創世區塊。
我們只需再給它添加兩個區塊,并給它們一些數據。
就是這么簡單。
這個里程碑就到此為止了。讓我們看看行動計劃。它非常簡單,但肯定也不容易。
在眾多的區塊鏈友好語言中選擇一種進行學習,比如 C++,Javascript,C#,Go 等。
英文全文:https://blockgeeks.com/guides/blockchain-developer/
本文由高可用架構翻譯,技術原創及架構實踐文章,歡迎通過公眾號菜單「聯系我們」進行投稿。
高可用架構
改變互聯網的構建方式
