區塊鏈和以太坊用於 JavaScript 和 React 開發

類別: IT

區塊鏈是一種構建分散式應用程式的技術。 我們習慣於將資料儲存在中央資料庫中。 為了容錯,我們可能會有分佈在不同地理位置的資料庫叢集。 但是這不會使傳統資料庫分散。 所有的資料庫都由一家公司控制。 區塊鏈使資料在政治上分散。 沒有一個單一的權力來控制所有的資料。 相反,一組分散式伺服器(也稱為節點)具有實際資料的副本。 即使一個節點出現故障,也沒有問題。 剩下的節點可以繼續處理事務。 這怎麼可能?

區塊鏈如何工作?

我將介紹區塊鏈的工作原理。 我的解釋與物理學家向你解釋量子理論非常相似。

區塊鏈上的任何交易都將廣播到整個網路。其中一個節點準備一個塊,交易發生在同一時間。該塊被髮送到整個網路時產生一個難題。難題是弄清楚交易在塊中出現的順序。單個計算機難以解決難題,需要反覆試驗或蠻力解決方案。網路中的一臺計算機都可以在短時間內找出難題。那塊被證實。網路中的兩臺計算機可能會同時解決這個難題(具有不同的順序)。在這種情況下,兩個塊都會被傳送到網路。

網路中的每個確認的塊被連結到網路中的前一個塊。有些時候,這些鏈可能會在個別節點發散。再次通過共識,隨著時間的推移,較長的連鎖勝出。因此,單個區塊鏈就會成為真相的來源。

由於這些複雜的計算,區塊鏈上的任何交易都需要一些時間來確認。如果交易被6個或12個後續塊確認,那麼它永遠是區塊鏈的一部分。雖然區塊鏈是一種技術,但是以不同的技術的平臺,實現方式也不盡相同。比特幣和以太坊是區塊鏈的兩個流行實現。在比特幣網路中,交易需要15分鐘才能確認。而以太坊協議有一個簡單的難題,所以一個交易只需要幾秒鐘來確認。

更多關於以太坊和Geth

以太坊協議近來頗受歡迎。它在2013年向全世界宣佈。它擁有一個良好的開發者生態系統。以太坊協議由許多程式實現。實施以太坊的流行程式之一就是Geth。它使用Go語言來實現。 如果你在你的系統上執行geth,它會下載整個公共區塊鏈。 但實踐中,我們喜歡建立自己的私人區塊鏈,只在我們的系統上執行。 從官方來源下載Geth。 安裝在Mac上的任何資料夾中。 並將該資料夾新增到$PATH變數中。

要建立一個私人區塊鏈,我們需要初始化一個創世區塊(第一個區塊)。

{    "coinbase"   : "0x0000000000000000000000000000000000000001",    "difficulty" : "0x20000",    "extraData"  : "",    "gasLimit"   : "0x8000000",    "nonce"      : "0x0000000000000042",    "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",    "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",    "timestamp"  : "0x00",    "alloc": {},    "config": {          "chainId": 15,          "homesteadBlock": 0,          "eip155Block": 0,          "eip158Block": 0      }  }



在 geneis.json 檔案中使用上述檔案內容。 另外建立另一個名為 chaindata 的資料夾,Geth 將儲存所有的塊。 並做一個 init (初始化)。

geth --datadir=./chaindata/ init ./genesis.json

初始化 Geth 之後,就可以建立你的個人專案了。

geth --datadir=./chaindata/ init ./genesis.json

現在,geth 只在你的電腦上執行。 但是,以太坊公共鏈通過 geth 會執行在很多電腦上。 你隨時可以自由地開始和停止。 如果 geth 啟動,它將從網路中的其他節點下載最新的鏈式資料。 這樣一來,區塊鏈就真正分散了,沒有一個節點控制網路。在 Geth 初始化之後,執行 Geth 開始你的私人區塊鏈。

區塊鏈術語

我將通過以太坊的交易和區塊來解釋區塊鏈中的術語。考慮如下一個交易

以太坊的交易。

上邊交易的屬性有很多細節。From和To是公共鏈的兩個賬戶。假設這兩個賬戶分別是Joe和Mike,在這個交易中Joe將7.53個以太幣或者3501.45美元轉改Mike。當建立任何區塊鏈賬戶的時候會生成一個公私鑰對。這裡不會說明加解密是怎樣工作的,但是在上層你會和別人分享你的公鑰,自己儲存自己的私鑰。私鑰必須安全儲存,如果私鑰丟失就無法登陸到你的區塊鏈賬戶,這一點很重要。交易中From和To屬性代表區塊鏈中兩個賬戶(Joe和Mike)的公鑰做雜湊的值。

交易本身也有一個雜湊值,並且該交易是塊的一部分(4642361)。上邊的交易記錄裡面有兩個確認說明在區塊鏈中這個塊下邊還有另外兩個塊。接著往下是屬性Amount,以及一些屬性和交易金額有關。每一次交易都需要計算和處理,所以每一次交易都要收費。當發起一次交易的時候會傳送兩個額外的引數燃料價格和燃料供給上限,燃料供給上限代表可提供的最大的計算,燃料價格代表每一次計算的價格,燃料價格和交易中燃料使用量的乘積就是交易費用。

你可能注意到燃料價格(每次計算的價格)用10GWei表示,Wei是一個以太幣面值單位。

以太幣面值。

一個以太幣值10^18個Wei,值10^9個GWei,交易金額是10GWei乘以21000等於210000GWei或者0.00021以太幣。

現在已經理解了交易屬性,我們看一下塊屬性,考慮一個如下:

以太鏈裡邊的塊

我不會講塊的每一個屬性,但是我會提到三個屬性:難度值、礦工和獎勵。當準備一個塊的時候難度值表示挖這個塊的難度。礦工就是一個為該塊解謎的以太節點,該礦工獲得該塊裡面所有交易費用。

挖礦行動

當開啟Geth的時候會開啟一個IPC終端,通過日誌的最後一行可以檢索該IPC終端。

INFO [11-29|13:12:06] IPC endpoint opened: /Users/vijayst/documents/react/vijay/blockchain/assignment_2/chaindata/geth.ipc

使用下面的命令開啟Geth JavaScript控制檯:

geth attach /Users/vijayst/documents/react/vijay/blockchain/assignment_2/chaindata/geth.ipc

在改JavaScript控制檯裡面可以通過執行JavaScript方法來開始或停止挖礦:

miner.start(1);

上邊的命令在一個執行緒裡面開啟了一個礦工。現在我們的節點已經參與到挖礦的過程中,挖礦就是確認交易。另外,挖礦也會產生以太幣(coinbase)並且把該以太幣新增到該節點的賬戶中。

我們通過錢包程式Mist建立主賬戶,Mist是一個基於電子Meteor應用。從官方源下載並安裝該程式並且將安裝路徑新增到$PATH變數裡面,安裝路徑通常是/Applications/Mist.app/Contents/MacOS。使用下面的命令啟動Mist:

mist --rpc /Users/vijayst/documents/react/vijay/blockchain/assignment_2/chaindata/geth.ipc




在Mist裡面建立一個賬戶會生成公私鑰對並且當你啟動挖礦的時候,你的賬戶裡面會產生以太幣。

Mist和主賬戶

我的賬戶裡面有1245個以太幣,這些是我的系統挖礦的獎勵。不錯,對吧?(這隻適用於你的私有網路)

在JavaScript控制檯裡面呼叫miner.stop()停止挖礦。

使用React應用與區塊鏈進行互動

我們開始準備寫React應用程式,它將與區塊鏈互動。 我們將繼續使用我們的私人網路。 使用create-react-app建立一個新的react應用程式。

create-react-app blockchaindemocd blockchaindemoyarn start

本地伺服器從埠3000開始。如果我們導航到http//localhost:3000,就可以看到我們的React應用程式。

接下來,我們要在私有區塊鏈上啟動以太坊節點。 我提到以太坊節點,因為我們不打算使用Geth來進行開發。 Geth是一個CPU佔用率很高的挖掘元件。 值得慶幸的是,以太坊的開發者已經構建了一個簡單的ethereum節點來測試testrpc。

yarn global add ethereumjs-testrpc

使用testrpc --secure啟動testrpc。 預設情況下,testrpc在沙箱環境中建立10個帳戶。 它在8545埠中作為http伺服器執行。

區塊鏈和以太坊用於 JavaScript 和 React 開發原文請看這裡