有沒有想過如何創建自己的區塊鍊網絡?
雖然像以太坊和比特幣這樣的網絡是大型公共網絡,但可以使用以太坊客戶端為自己的目的建立一個新的私有區塊鍊網絡(在這種情況下,私有並不意味著受保護或安全,而是保留或隔離)。
在本教程中,您將學習如何使用以下方法開始創建自己的區塊鍊網絡 格思,以太坊的Go語言實現。
安裝Geth
有幾種安裝Geth 的方法:
- 使用包管理器
- 下載獨立的預構建捆綁包
- 在docker 容器中運行它
- 自己建造
您的選擇將取決於您的計算機、操作系統和先驗知識。查看 官方文檔 學習如何安裝Geth。
檢查是否安裝了Geth
您可以通過檢查其版本來檢查您是否安裝了Geth 客戶端。
在終端中,運行此命令。如果它運行並返回您正在使用的版本的詳細信息,則Geth 已成功安裝:
geth version
格思幫助
Geth 自帶一個有用的 help
命令,您可以像這樣運行:
geth --help
運行Geth
默認情況下,Geth 運行一個主網節點,它將開始為以太坊主網下載整個數據庫。
如果您的目標是使用Geth 創建自己的區塊鏈,請不要運行 geth
不指定參數。
共識算法
以太坊主網使用工作量證明(PoW) ethash
以保護區塊鏈。可以使用相同的共識算法創建私有區塊鏈。
Geth 還支持“集團”權威證明(PoA) 共識算法作為私有網絡的替代方案,其中新區塊只能由授權的“簽名者”創建。授權簽名者的初始列表在創世塊中配置。集團共識協議在 EIP-225.
在本教程中,我們使用PoW 共識算法來演示礦工流程。
區塊鍊網絡文件夾
讓我們在文件夾中創建區塊鍊網絡 C:ETHLocalNode
. 以下示例適用於Windows 操作系統。
在命令提示符下,運行以下命令:
cd C:ETH mkdir LocalNode cd LocalNode
使用Geth 創建本地節點
安裝Geth 客戶端后,下一步是創建本地節點。
網絡中所有參與的計算機都必須完成此步驟才能創建您的區塊鍊網絡。
創世紀文件
每個區塊鏈都從創世區塊開始。這是一個特殊的genesis.json 文件,專為創建您的區塊鍊網絡而定制。
在您選擇的文本編輯器中,創建一個名為genesis.json 的文件。
複製並粘貼此配置:
{ "config": { "chainId": 9183, "homesteadBlock": 0, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0 }, "difficulty": "0x1", "gasLimit": "8000000", "alloc": {} }
了解參數
當您創建自己的區塊鍊網絡時,有一些與參數相關的註釋對您了解很重要。
鏈ID
在我們的區塊鍊網絡中 chainID
將與網絡ID 相同,這是一個隔離以太坊點對點網絡的整數。
只有當兩個對等點使用相同的創世塊並且 chainID
. 為了創建私有區塊鍊網絡,您必須使用一個尚未使用的數字。您可以在以下位置找到由社區運行的以太坊網絡註冊表 https://chainid.network.
主網絡的ID 為“1”。如果您提供與主網絡或其他已知網絡不同的自定義網絡ID,您的節點將不會連接到其他節點,而是會加入私有區塊鍊網絡。
注意: chainId
對於該區塊鍊網絡中的所有參與者,創世文件中的內容必須相同。在我們的網絡中, chainId
是9183。
您可以在 文檔.
困難
注意如何 difficulty
設置得非常低,只有1。
氣體限制
這是初始塊氣體限制(gasLimit
)。它會影響單個塊內可以發生多少EVM 計算。
初始化你的區塊鏈
轉到您在終端中創建genesis.json 文件的文件夾,然後 運行這個命令來初始化一個新的區塊鏈:
geth init --datadir data genesis.json
區塊鏈的數據庫將位於文件夾中 data
:
運行Geth
下面的命令將啟動客戶端節點:
geth --datadir ".data" --networkid 9183 --identity "Node1"
您應該會看到與此類似的輸出:
如果您收到錯誤消息“快照擴展註冊失敗”,則錯誤出現在另一端,現在您獨自在網絡中- 該對等方將被丟棄。您的節點運行良好,您無需擔心。
IPC 路徑
稍後將使用IPC 路徑連接到您的節點,因此請記下它。
在本例中,IPC 路徑為:
\.pipegeth.ipc
Geth JavaScript 控制台
Geth有一個 JavaScript 控制台 可以在Geth 節點中用於向其發送命令。以下是如何使用 geth attach
命令連接到已經在運行的Geth 本地節點並在其中運行一些命令。
使用IPC 附加Geth
打開第二個終端窗口。
執行節點時可以獲得IPC路徑(上一步收到了)。
運行此命令:
geth attach ipc:\.pipegeth.ipc
這是結果:
警告
此過程僅適用於在您的機器上或您有權訪問的網絡上運行的節點。 geth attach
使您可以完全控制遠程實例,因此不要指望其他人可以讓您訪問他們的機器。
創建帳戶
每個節點必須至少有一個帳戶,特別是如果要接收礦工獎勵。在附加的Geth 終端內,運行以下命令:
personal.newAccount("yourpassword")
“yourpassword”文本是用於加密您的私鑰的密碼。如果您忘記了它,您將無法再使用您的帳戶。
在Node1 上創建的帳戶是 0xe3badc04240a4fa99e758e030024560bde46ea11
.
創建第二個節點
我們本教程的目標是創建一個網絡,在同一台計算機內運行兩個連接到不同端口的Geth 節點。
讓我們創建第二個節點Node2。
以下是我們將在Node2 中使用的信息:
- 數據目錄:data2
- 監聽端口:30305
- ipc路徑:geth2
- 身份:Node2
現在讓我們在文件夾中創建第二個節點 C:ETHLocalNode2
.
請務必記住,此示例使用的是Windows 操作系統——如果您使用的是其他操作系統,則需要相應地進行調整。
在命令提示符下,運行:
cd C:ETH mkdir LocalNode2 cd LocalNode2
最後的路徑是 C:ETHLocalNode2
.
Geth初始化節點2
將genesis.json 文件從LocalNode1 複製到LocalNode2。
運行以下命令來初始化Node2:
geth init --datadir data2 genesis.json
區塊鏈的數據庫將位於文件夾中 data2
.
geth attach
為Node2 使用IPC
我們已經定義Node2 將具有 geth2
工業PC。
IPC路徑也可以在節點執行時獲取。就像對Node1 所做的那樣,在IPC 路徑中檢查它。
打開第二個終端窗口並運行以下命令:
geth attach ipc:\.pipegeth2.ipc
為Node2 創建一個帳戶
Node2 也必須至少有一個帳戶。在附加的Geth 終端內,運行以下命令:
personal.newAccount("yourpassword")
“yourpassword”文本是用於加密您的私鑰的密碼,如果您忘記了,您將無法再使用您的帳戶。
Node2上的賬戶是 0x4d11a54211f8a5a83ea2275aa0065f3eef4f623c
.
為了創建您的區塊鍊網絡,您需要了解 enode
您的節點之一,以便您的節點可以相互通信。
來自Node2 的Enode
在終端運行 geth attach
,連接到Node2 並運行此命令以發現 enode
:
admin.nodeInfo.enode
這是 enode
對於節點2:
"enode://b9b9200ee68b324f0b4486cd9719f876763a3b9c8c9fe9cfe20a13221055472b664af3f31bdf1c85f8895c9e54b47680d818d4a3ff66a6ec735f90afa5d7756f@89.20.185.250:30305"
我們的目標是在同一台計算機上設置運行Geth 節點的區塊鍊網絡,所以讓我們將IP 更新為我們的本地IP:
127.0.0.1
更新IP後, enode
對於node2 應該是:
"enode://b9b9200ee68b324f0b4486cd9719f876763a3b9c8c9fe9cfe20a13221055472b664af3f31bdf1c85f8895c9e54b47680d818d4a3ff66a6ec735f90afa5d7756f@127.0.0.1:30305"
使用不同的計算機
雖然在本教程中,我們通過不同的端口在同一台計算機內創建一個運行兩個Geth 節點的網絡,但如果您想使用不同的計算機創建區塊鍊網絡,您需要知道每台計算機的IP。
設置對等網絡取決於您的要求。如果您通過Internet 連接節點,則需要確保您的bootnode 和所有其他節點都分配了公共IP 地址,並且TCP 和UDP 流量都可以通過防火牆。
連接節點
讓我們運行我們的區塊鍊網絡!
轉到終端運行 geth attach
在Node1 中並添加 enode
對於節點2。
更新 enode2
在命令中 admin.addPeer
.
admin.addPeer("enode")
像這樣:
admin.addPeer("enode://b9b9200ee68b324f0b4486cd9719f876763a3b9c8c9fe9cfe20a13221055472b664af3f31bdf1c85f8895c9e54b47680d818d4a3ff66a6ec735f90afa5d7756f@127.0.0.1:30305")
這是結果:
完畢!現在一個節點知道另一個節點存在。
驗證網絡
net.peerCount
此命令告訴您有多少節點連接到您的節點。
在任何連接Geth 的終端中,您可以運行:
net.peerCount
結果應該是 1
,因為我們有一個節點連接到另一個節點,如下所示:
節點1
節點2
admin.peers
此命令顯示連接到您的其他節點的詳細信息。在附加Geth 的終端中運行它:
admin.peers
可以看到Node2連接到Node1:
並且Node1 也連接到Node2:
賬戶
讓我們了解更多與帳戶相關的命令。
個人的
此命令列出節點中所有帳戶的詳細信息。
personal
這是Node1 的結果:
平衡
此命令檢索帳戶的餘額:
eth.getBalance(eth.accounts[0])
如果我們運行這個命令,我們會得到一個很大的結果,因為結果是以wei 為單位的。讓我們轉換為以太:
web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
特定賬戶餘額
讓我們使用這個地址檢查一個賬戶的餘額: 0x942b17d335321128225d23bd7e8451fe78ce9547
.
web3.fromWei(eth.getBalance("0x942b17d335321128225d23bd7e8451fe78ce9547"),"ether")
結果:
礦業
如果我們想在我們的區塊鏈上創建新塊,就需要挖掘它們,因為我們使用的是PoW 共識算法。
我們已經在網絡中配置了兩個節點,所以讓我們挖一些以太幣吧!請記住,這些代幣一文不值——它們只存在於我們的私有網絡中。
開始挖礦
在兩個節點的Geth 附加終端中,運行:
miner.start(1)
參數 1
是計算機中使用的線程數。在我們的例子中,我們沒有啟用並行挖掘線程。默認值為處理器內核總數。
您可以了解有關採礦的更多信息 這裡.
挖礦後餘額
在每個Geth 連接的節點中,幾分鐘後檢查餘額。
web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
看看下圖:Node2 比Node1 擁有更多的以太幣。
您在兩個節點上使用相同的計算能力進行挖礦,所以當第二個開始時,第一個將不再能夠通過挖礦獲得獎勵。
使用不同的計算機安裝網絡以避免此問題。
蓋斯出口
要退出任何geth 控制台,請運行:
exit
下一步
現在您已經創建了自己的PoW 區塊鍊網絡,您可以使用許多可能性:您可以將以太幣從一個節點轉移到另一個節點,發布智能合約,或與其他已發布的智能合約交互——儘管您的網絡的效用將是考慮到它是私人的,因此有些有限。
通過訪問了解有關Chainlink 的更多信息 鏈環 或閱讀文檔 docs.chain.link. 要討論集成, 聯繫專家。