連載篇提前看
系列文章一:區塊鏈踩坑之基礎掃盲及搭建以太坊網絡私有鏈(單節點)
系列文章二:區塊鏈踩坑之搭建以太坊網絡私有鏈(多節點)及創建多重簽名錢包
系列文章三:區塊鏈踩坑之智能合約代幣編寫及使用介紹
前言
區塊鏈近幾年如火如荼,呈愈來愈望的趨勢。相信不少小伙伴已經踩過坑,也有很多小伙伴還只是聽過概念,並未實際接觸到,更別談開發和運用。我們在這里還是先來普及下區塊鏈的基礎概念(已經知曉概念和原理的可直接跳到環境篇):
區塊鏈是什么?
區塊鏈是一種新型去中心化協議,能安全地存儲比特幣交易或其它數據,信息不可偽造和篡改,可以自動執行智能合約,無需任何中心化機構的審核。交易既可以是比特幣這樣的數字貨幣,也可以是債權、股權、版權等數字資產,區塊鏈技術解決了拜占庭將軍問題,大大降低了現實經濟的信任成本與會計成本,重新定義了互聯網時代的產權制度。
那更具體和詳細一點的描述可以參考下面這段話:
區塊鏈(Blockchain)是由節點參與的分布式數據庫系統,它的特點是不可更改,不可偽造,也可以將其理解為賬簿系統(ledger)。它是比特幣的一個重要概念,完整比特幣區塊鏈的副本,記錄了其代幣(token)的每一筆交易。通過這些信息,我們可以找到每一個地址,在歷史上任何一點所擁有的價值。
區塊鏈是由一串使用密碼學方法產生的數據塊組成的,每一個區塊都包含了上一個區塊的哈希值(hash),從創始區塊(genesis block)開始連接到當前區塊,形成塊鏈。每一個區塊都確保按照時間順序在上一個區塊之后產生,否則前一個區塊的哈希值是未知的。這些特征使得比特幣的雙花(double-spending)非常困難。區塊鏈是比特幣的核心創新。
區塊鏈概念的出現,首先是在中本聰的比特幣白皮書中提到的,但是以工作量證明鏈(proof-of-work chain)的形式而存在,以下是中本聰對區塊鏈概念的描述:
時間戳服務器通過對以區塊(block)形式存在的一組數據,實施隨機散列而加上時間戳,並將該隨機散列進行廣播,就像在新聞或世界性新聞組網絡(Usenet)的發帖一樣 。顯然,該時間戳能夠證實特定數據必然於某特定時間是的確存在的,因為只有在該時刻存在了才能獲取相應的隨機散列值。每個時間戳應當將前一個時間戳納入其隨機散列值中,每一個隨后的時間戳都對之前的一個時間戳進行增強(reinforcing),這樣就形成了一條鏈(Chain)。
節點始終都將最長的鏈視為正確鏈,並持續工作和延長它。如果有兩個節點同時廣播不同版本的新區塊,那么其他節點在接收到該區塊的時間上,將存在先后差別。當此情形,他們將在率先收到的區塊基礎上進行工作,但也會保留另外一條鏈,以防后者變成最長鏈。該僵局(tie)的打破,要等到下一個工作量證明被發現,而其中的一條鏈被證實為是較長的一條,那么在另一條分支鏈上工作的節點將轉換陣營,開始在較長的鏈上工作。
比特幣錢包的功能依賴於與區塊鏈的確認,一次有效檢驗稱為一次確認。通常一次交易要獲得數個確認才能進行。輕量級(SPV )比特幣錢包, 其客戶端在本地只需保存與用戶可支配交易相關的數據,而不會存儲完整的區塊鏈。
區塊鏈技術是眾多加密數字貨幣的核心,包括比特幣、以太坊、萊特幣、狗狗幣等。維護區塊鏈的方式,有工作量證明(proof-of-work)、權益證明(proof-of-stake)等。
區塊鏈的優勢
區塊鏈體系結構的核心優勢包括:
1.任何節點都可以創建交易,在經過一段時間的確認之后,就可以合理地確認該交易是否為有效,區塊鏈可有效地防止雙花問題的發生。
2.對於試圖重寫或者修改交易記錄而言,它的成本是非常高的。
3.區塊鏈實現了兩種記錄:交易(transactions)以及區塊(blocks)。交易是被存儲在區塊鏈上的實際數據,而區塊則是記錄確認某些交易是在何時,以及以何種順序成為區塊鏈數據庫的一部分。交易是由參與者在正常過程中使用系統所創建的(在加密數字貨幣的例子中,一筆交易是由bob將代幣發送給alice所創建的),而區塊則是由我們稱之為礦工(miners)的單位負責創建。
區塊鏈工作原理
這里有個問題就是:我們談的區塊鏈,那什么是區塊呢?
數據通過稱之為區塊(block)的文件,永久記錄在數字貨幣網絡上。它們好比是一個股票交易賬本。新的區塊會被添加到記錄(區塊鏈)的末端,而且一旦書寫就很難修改或移除。
區塊的結構是什么樣的呢?
區塊頭是什么?
區塊頭由三組區塊元數據組成。首先是一組引用父區塊哈希值的數據,這組元數據用於將該區塊與區塊鏈中前一區塊相連接。第二組元數據,即難度、時間戳和nonce,與挖礦競爭相關 。第三組元數據是merkle樹根(一種用來有效地總結區塊中所有交易的數據結構)。
區塊頭結構是什么?
創始區塊是什么?
比特幣區塊鏈的第一個區塊,創建於2009年,我們稱之為創世區塊。它是比特幣區塊鏈里所有區塊的共同祖先,這意味着你從任一區塊,循鏈向后回溯,最終都將到達創世區塊。
每一個節點都“知道”創世區塊的哈希值、結構、被創建的時間和里面的一個交易。因此,每個節點都把該區塊作為區塊鏈的首區塊,從而構建了一個安全的、可信的區塊鏈的根。
在chainparams.cpp里可以看到創世區塊被編入到比特幣核心客戶端里。
創世區塊的哈希值為:
0000000000 19d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
在命令行使用比特幣核心客戶端:
$ bitcoindgetblock 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f{ "hash":"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", "confirmations":308321, "size":285, "height":0, "version":1, "merkleroot":"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "tx":["4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"], "time":1231006505, "nonce":2083236893, "bits":"1d00ffff", "difficulty":1.00000000, "nextblockhash":"00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048"}
創世區塊包含一個隱藏的信息。在其Coinbase交易的輸入中包含這樣一句話“The Times 03/Jan/2009 Chancellor on brink of second bailout forbanks.”這句話是泰晤士報當天的頭版文章標題,引用這句話,既是對該區塊產生時間的說明,也可視為半開玩笑地提醒人們 , 一個獨立的貨幣制度的重要性,同時告訴人們隨着比特幣的發展,一場前所未有的世界性貨幣革命將要發生。該消息是由比特幣的創立者中本聰嵌入創世區塊中。
區塊鏈分叉是什么?
誠實礦工只創建最長有效鏈上的最新區塊。“長度”(Length)指區塊鏈的累計計算難度,而不是是區塊數目。當包括在鏈中的所有區塊以及交易都有效,且是從創世區塊開始的鏈,才是被我們承認的有效區塊鏈。
對於區塊鏈中的任意一個區塊,到達創世塊的路徑只有一條。然而,從創世塊開始,會有分叉的情況出現。當創建兩個區塊的時間差只有幾秒時,經常會創建出一個分叉區塊。當發生這種情況時,節點就會在他們最先接收到的那個區塊上創建區塊。無論哪一個區塊包含在下一個區塊中,它都會成為主鏈的一部分,因為這條鏈更長。
短鏈(無效鏈)中的區塊沒有什么作用。當比特幣客戶端切換至另外一條更長的區塊鏈時,短鏈中的所有有效交易區塊都重新添加到序列交易池中,且會包含在下一個區塊中。短鏈中的區塊獎勵不會呈現在最長的區塊鏈中,因此實際上他們是有損失的,這就是為什么需要網絡強制的100個區塊的成熟時間來讓產生存在。
在短鏈中的區塊,我們通常稱之為“孤兒塊”(orphans)。這是因為,在長鏈中這個生成交易並沒有父系區塊,因為這些生成交易在交易PRC列表中顯示為孤兒。一些礦池誤解這些信息,聲稱他們的區塊是”孤兒“。事實上,這些區塊都有父系區塊,而且甚至可能有子系。
區塊鏈衍生的幾個概念
公鏈(public blockchain)
公鏈,是指全世界任何人都可讀取、發送交易且能獲得有效確認的共識區塊鏈。公鏈的安全由工作量證明機制(pow)或權益證明機制(pos)等方式負責維護。它們是以經濟獎勵與加密數字驗證相結合的方式而存在的,並遵循着一般原則:每個人從中可獲得的經濟獎勵,與對共識過程作出的貢獻成正比。這些區塊鏈通常被認為是“完全去中心化”的。
共同體區塊鏈:(Consortium blockchains)
共同體區塊鏈,是指其共識過程受到預選節點控制的區塊鏈;例如,有15個金融機構組成一個共同體,每個機構都運行着一個節點,而且為了使每個區塊生效需要獲得其中10個機構的確認。區塊鏈或許允許每個人都可讀取,或者只受限於參與者,或走混合型的路線,例如區塊的根哈希及其API(應用程序接口)對外公開,API可允許外界用來作有限次數的查詢和獲取區塊鏈狀態的信息。這些區塊鏈可視為“部分去中心化”。
私鏈(private blockchain),又稱無代幣區塊鏈(Token-less blockchain)
完全私有的區塊鏈 , 是指其寫入權限僅在一個組織手里的區塊鏈。讀取權限或者對外開放,或者被任意程度地進行了限制。相關的應用囊括數據庫管理、審計、甚至一個公司,但在很多的情形下,公共的可讀性並非是必須的。
公鏈和私鏈的特點
共同體區塊鏈結合了公鏈的“低信任”和私鏈的“單一高度信任” , 提供了一種混合的模式,而私鏈可以更精確地描述為帶有一定程度數字加密功能,可管理(permissioned)的傳統中心化系統。
環境篇
①下載以太坊錢包Mist或者ETHWallet
https://github.com/ethereum/mist/releases/tag/0.8.1
我這里提供下我用的兩個版本地址:
Mist 鏈接:https://pan.baidu.com/s/1BVJV9-nJRE4q4QnupNihOw 密碼:dt9j
EthWallet 鏈接:https://pan.baidu.com/s/1Q-tWMI5cC3uPphoQEN1Plw 密碼:nhsu
Geth 鏈接:https://pan.baidu.com/s/1j31K0WJm9PDKy-5Cs4E5Og 密碼:5zq1
② 這里我們以Mist為例 ,下載后解壓Mist,直接運行,此時會在C盤生成一個Mist的Geth目錄 同步區塊過程很慢,可以測試環境可直接跳過
C:\Users\Administrator\AppData\Roaming\Mist\binaries\Geth\unpacked
我們先將生成的目錄添加進系統Path環境變量中 方便我們后續操作。
添加Path后,我們打開命令窗口 執行:geth -h 查看geth版本和其他命令信息 如下圖:
此時我們需要注意的是 在C盤目錄下 還生成了一個 以太坊目錄:C:\Users\Administrator\AppData\Roaming\Ethereum
這個路徑下面存放的是 賬戶秘鑰信息,區塊文件等信息。
geth account new 創建新賬戶命令
秘鑰一般存放在:C:\Users\Administrator\AppData\Roaming\Ethereum\keystore 如下圖所示:
搭建以太坊私有鏈
編寫創始區塊CustomGenesis.json 文件內容如下:
{ "nonce": "0x0000000000000042", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x00", "gasLimit": "0x8000000", "difficulty": "0x400", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333", "alloc": { }, "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 } }
關注幾個重點項:
difficulty”: “0x40000”,//難度,該值越大,出塊越慢。
extraData”: “Genesis Block”,//附加信息,隨意填寫
gasLimit”: “0xffffffff”//每個塊所能容載的gas上限
①創建目錄:E:\Mychains\dev 將創始區塊文件放入該目錄下
執行cmd
geth --identity "mydev" --rpc --rpcport "8086" --rpccorsdomain "*" --datadir "E:\Mychains\dev" --port "8545" --nodiscover --rpcapi "db,eth,net,web3" --networkid 99 init "E:\Mychains\dev\CustomGenesis.json"
其中端口 也可以省略 用默認的 省略寫法如下:
geth --identity "mydev" --rpc --rpccorsdomain "*" --datadir "E:\Mychains\dev" --rpcapi "db,eth,net,web3" --networkid 99 init "E:\Mychains\dev\CustomGenesis.json"
執行后:
到這一步 表示私有鏈已經創建成功。那我們如果使用這個私有鏈呢?繼續往下看
執行cmd:
geth --identity "mydev" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir "E:\Mychains\dev" --port "8545" --nodiscover --rpcapi "db,eth,net,web3" --networkid 99 console
如果是簡寫 可以直接寫成:
geth --datadir "E:\Mychains\dev"
執行后:
到這一步 表示本地私有鏈已經啟動成功,我們可以運行Mist客戶端看一下(此時右上角有PRIVAT-NET標示,說明此時鏈接的是本地私有網絡)
運行后主界面如下:
如果是用ETHWallet 錢包客戶端打開的,顯示界面如下:
剩下的私有鏈新建賬戶 和公網主賬戶一致,在這里就不贅述了。
另外,有幾個地方需要注意,我們啟動了本地私有鏈后 可以通過 geth查看下 當前運行的區塊路徑
首先新開一個cmd命令窗口 輸入:
geth attach ipc:\\.\pipe\geth.ipc
上圖表示連接成功,然后我們看下 當前主用戶的網絡信息
輸入:admin.nodeInfo 如下圖:
如果大家留心觀察會發現,這里的節點信息 和我們的創始區塊文件是一模一樣的。
然后我們看下連接的是哪個區塊文件 輸入 admin.datadir 如下圖:
這個文件就是剛才我們開始創建的那個文件目錄。
然后我們新建一個賬戶輸入密碼然后點擊ok
正常創建的賬戶余額都是為0,然后秘鑰存放位置也已經講過了,會彈框提示備份好你的秘鑰 可以直接跳過
然后我們進行挖礦操作,給自己的賬戶增加一些以太幣
挖礦開始命令:
miner.start()
挖礦停止命令:
miner.stop()
效果如下,上面的Account2 是我新建的第二個賬戶,默認挖礦都是新增到主賬戶中。
賬戶之間轉賬
自己測試可以新建另一個賬戶Account2(名稱默認),然后點擊Account2
操作存入以太幣:
然后到頁面下方操作發送按鈕:
此處彈框輸入密碼確認此筆交易,可以點擊下方Cancel取消該筆交易,我們輸入密碼后點擊Send Tansaction 如下:
確認中(確認過程需要網絡中的礦工進行挖礦操作,該比交易才能正常進行)
我們這里可以清楚的看到該筆交易的發出者和接受者地址以及手續費等信息。
交易成功后 可以看到賬戶情況
至此,你已經基本了解怎么樣在本地搭建以太坊網絡私有鏈(單節點)、挖礦以及賬戶之間轉賬等基本操作。
后面文章我會繼續補充關於 構建以太坊網絡多節點私有鏈、創建多重簽名錢包 以及智能合約 發行代幣等內容。
未完待續。。。。