區塊鏈開發需要什么技術(如何成為一名區塊鏈開發者(一))
導讀:隨著區塊鏈成為國家戰略,央行也推出數字貨幣,業界對區塊鏈行業從業人員的需求越來越大;另外最近比特幣價格又創新高,去中心化金融 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 creation
constructor
{
this.chain = [this.createGenesisBlock()];
}
createGenesisBlock
{
return new Block(0, "01/01/2017", "Genesis block", "0");
}
//section 2 adding new blocks
getLatestBlock
{
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 chain
isChainValid
{
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/
本文由高可用架構翻譯,技術原創及架構實踐文章,歡迎通過公眾號菜單「聯系我們」進行投稿。
高可用架構
改變互聯網的構建方式