1. 程式人生 > >以太坊筆記 如何搭建私有連聯盟鏈

以太坊筆記 如何搭建私有連聯盟鏈

轉載自:https://mshk.top/2017/11/go-ethereum-1-7-2/

目錄

1、什麼是Ethereum(以太坊)

  以太坊(Ethereum)並不是一個機構,而是一款能夠在區塊鏈上實現智慧合約、開源的底層系統,以太坊從誕生到2017年5月,短短3年半時間,全球已有200多個以太坊應用誕生。以太坊是一個平臺和一種程式語言,使開發人員能夠建立和釋出下一代分散式應用。 以太坊可以用來程式設計,分散,擔保和交易任何事物:投票,域名,金融交易所,眾籌,公司管理, 合同和大部分的協議,智慧財產權,還有得益於硬體整合的智慧資產。

  以太坊的白皮書:https://github.com/ethereum/wiki/wiki/White-Paper

1.2、以太坊的幾個基本概念:

  以太坊簡單來說就是區塊鏈與智慧合約的結合,是基於solidity語言實現的。在以太坊中,智慧合約也有一個帳戶地址。

  • EVM

  以太坊虛擬機器(EVM)是以太坊中智慧合約的執行環境。它不僅被沙箱封裝起來,事實上它被完全隔離,執行在EVM內部的程式碼不能接觸到網路、檔案系統或者其它程序。甚至智慧合約之間也只有有限的呼叫。

  • Accounts

  以太坊中有兩類賬戶,它們共用同一個地址空間。外部賬戶,該類賬戶被公鑰-私鑰對控制。合約賬戶,該類賬戶被儲存在賬戶中的程式碼控制。 外部賬戶的地址是由公鑰決定的,合約賬戶的地址是在建立合約時確定的。

  每個賬戶都有一個以太幣餘額(單位是“Wei”),該賬戶餘額可以通過向它傳送帶有以太幣的交易來改變。

  • Transactions

  每一筆交易都是一條資訊,可以通過交易,將餘額從一個帳戶發至另一個帳戶。

  • Gas

  每一筆交易需要支付一定的gasgas price是由建立者設定的,呼叫合約的傳送賬戶需要交易費用 = gas price * gas amount。

1.3、以太坊周邊的常用工具

2、什麼是 Go-Ethereum?

  Go-Ethereum是由以太坊基金會提供的官方客戶端軟體。它是用Go程式語言編寫的,簡稱Geth。其中以下幾個元件是值得了解的:

  • Geth 客戶端

  當你開始這個客戶程式,它連線到其他客戶端(也稱為節點)的網路下載同步區塊。它將不斷地與其他節點進行通訊來保持它的副本是最新的。它還具有挖掘區塊並將交易新增到塊鏈的能力,驗證並執行區塊中的交易。它還可以充當伺服器,您可以通過RPC來訪問暴露的API介面。

mshk.top

  • Geth 終端

  這是一個命令列工具,可以讓您連線到正在執行的節點,並執行各種操作,如建立和管理帳戶,查詢區塊鏈,簽署並將交易提交給區塊鏈等等。更多介紹 點選這裡

3、Go-Ethereum的開源地址在哪裡?

  https://github.com/ethereum/go-ethereum

4、如何安裝Go-Ethereum 1.7.2

  本文中使用的方法是通過Git下載原始碼,本地編譯Go-Ethereum 1.7.2

git clone https://github.com/ethereum/go-ethereum.git
cd  go-ethereum
git checkout v1.7.2
make geth
make all

  檢視安裝好的geth版本號

➜ /Users/lion >geth version
Geth
Version: 1.7.2-stable
Git Commit: 1db4ecdc0b9e828ff65777fb466fc7c1d04e0de9
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.9.1
Operating System: darwin
GOPATH=/Users/lion/my_project/_golang
GOROOT=/usr/local/Cellar/go/1.9.1/libexec

5、開始建立以太坊私有鏈

5.1、初始化一個創世區塊

  初始化創世區塊時,要先建立一個genesis.json檔案,內容如下:

  genesis.json:

{
  "config": {
        "chainId": 10,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x20000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00",
  "alloc"      : {},
}
引數名稱 引數描述
mixhash 與nonce配合用於挖礦,由上一個區塊的一部分生成的hash。注意他和nonce的設定需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件。
nonce nonce就是一個64位隨機數,用於挖礦,注意他和mixhash的設定需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件。
difficulty 設定當前區塊的難度,如果難度過大,cpu挖礦就很難,這裡設定較小難度
alloc 用來預置賬號以及賬號的以太幣數量,因為私有鏈挖礦比較容易,所以我們不需要預置有幣的賬號,需要的時候自己建立即可以。
coinbase 礦工的賬號,隨便填
timestamp 設定創世塊的時間戳
parentHash 上一個區塊的hash值,因為是創世塊,所以這個值是0
extraData 附加資訊,隨便填,可以填你的個性資訊
gasLimit 該值設定對GAS的消耗總量限制,用來限制區塊能包含的交易資訊總和,因為我們是私有鏈,所以填最大。

  接下來,我們使用geth init ./genesis.json --datadir "./chain"命令,來進行創世區塊的初始化,當前區塊鏈網路資料存放的位置會儲存在chain目錄中:

➜ /Users/lion/my_project/_eth/test >geth init ./genesis.json --datadir "./chain"
WARN [10-22|14:49:09] No etherbase set and no accounts found as default
INFO [10-22|14:49:09] Allocated cache and file handles         database=/Users/lion/my_project/_eth/test/chain/geth/chaindata cache=16 handles=16
INFO [10-22|14:49:09] Writing custom genesis block
INFO [10-22|14:49:09] Successfully wrote genesis state         database=chaindata                                             hash=5e1fc7…d790e0
INFO [10-22|14:49:09] Allocated cache and file handles         database=/Users/lion/my_project/_eth/test/chain/geth/lightchaindata cache=16 handles=16
INFO [10-22|14:49:09] Writing custom genesis block
INFO [10-22|14:49:09] Successfully wrote genesis state         database=lightchaindata                                             hash=5e1fc7…d790e0

5.2、啟用私有鏈

  使用以下命令,啟用私有鏈:

geth \
  --datadir "./chain" \
  --nodiscover \
  console 2>>eth_output.log

  
  啟動後的效果如下:

➜ /Users/lion/my_project/_eth/test >geth \
  --datadir "./chain" \
  --nodiscover \
  console 2>>eth_output.log
Welcome to the Geth JavaScript console!

instance: Geth/v1.6.7-stable-ab5646c5/darwin-amd64/go1.9.1
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

>
引數名稱 引數描述
datadir 設定當前區塊鏈網路資料存放的位置
console 啟動命令列模式,可以在Geth中執行命令
nodiscover 私有鏈地址,不會被網上看到

  在當前目錄執行tail -f eth_output.log,可以看到輸出日誌。

➜ /Users/lion/my_project/_eth/test >tail -f eth_output.log
INFO [10-22|14:50:04] Bloom-bin upgrade completed              elapsed=149.285µs
INFO [10-22|14:50:04] Initialising Ethereum protocol           versions="[63 62]" network=1
INFO [10-22|14:50:04] Database conversion successful
INFO [10-22|14:50:04] Loaded most recent local header          number=0 hash=5e1fc7…d790e0 td=131072
INFO [10-22|14:50:04] Loaded most recent local full block      number=0 hash=5e1fc7…d790e0 td=131072
INFO [10-22|14:50:04] Loaded most recent local fast block      number=0 hash=5e1fc7…d790e0 td=131072
INFO [10-22|14:50:04] Starting P2P networking
INFO [10-22|14:50:04] RLPx listener up                         self="enode://bcc414219b7423f56da261857508771c229a5ee370e2d5bee7a9d1a3886ae9c20[email protected][::]:30303?discport=0"
INFO [10-22|14:50:04] IPC endpoint opened: /Users/lion/my_project/_eth/test/chain/geth.ipc
INFO [10-22|14:50:05] Mapped network port                      proto=tcp extport=30303 intport=30303 interface=NAT-PMP(10.0.0.1)

後面章節中的命令,都是在啟動私有鏈後的Geth javascript console中操作

5.2.1、帳戶的新增和檢視

  檢視帳戶,可以看到當前帳戶是空的

> web3.eth.accounts
[]

  
  建立帳戶的方式有兩種,第一種建立帳戶時直接初始化密碼

> web3.personal.newAccount("123456")
"0xbe323cc4fde114269a9513a27d3e985f82b9e25d"

其中返回的0xbe323cc4fde114269a9513a27d3e985f82b9e25d是帳戶,123456是帳戶的密碼

  
  第二種方法是先建立賬戶,然後輸入密碼

> web3.personal.newAccount()
Passphrase:
Repeat passphrase:
"0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70"

  
  這時我們再檢視帳戶,能夠看到剛才建立的兩個帳戶已經存在了

> web3.eth.accounts
["0xbe323cc4fde114269a9513a27d3e985f82b9e25d", "0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70"]

5.2.2、開始挖礦和停止挖礦

  挖礦執行以下命令:

> miner.start(1)

  
  執行以後,通過剛才檢視日誌的方法tail -f eth_output.log,能夠看到類似下面的日誌,說明挖礦已經在進行.

INFO [10-22|15:01:32] Commit new mining work                   number=70 txs=0 uncles=0 elapsed=2.000s
INFO [10-22|15:01:34] Successfully sealed new block            number=70 hash=a0cfd2…f99c06
INFO [10-22|15:01:34]  block reached canonical chain          number=65 hash=3f6d16…586aba
INFO [10-22|15:01:34]  mined potential block                  number=70 hash=a0cfd2…f99c06
INFO [10-22|15:01:34] Commit new mining work                   number=71 txs=0 uncles=0 elapsed=163.977µs
INFO [10-22|15:01:34] Successfully sealed new block            number=71 hash=f84b8a…7468e1
INFO [10-22|15:01:34]  block reached canonical chain          number=66 hash=6ca3b9…e959e8
INFO [10-22|15:01:34]  mined potential block                  number=71 hash=f84b8a…7468e1

挖礦會預設儲存到建立的第一個帳戶0xbe323cc4fde114269a9513a27d3e985f82b9e25d中。
block number=66,說明我們已經建立了66個區塊
在以太坊官方的網路上,平均每15秒產生一個區塊

  停止挖礦執行以下命令:

> miner.stop()

停止挖礦後,以太幣則不會產生,同樣智慧合約、轉帳等操作也不會起作用。

5.2.3、檢視帳戶餘額

  檢視帳戶餘額的方法如下:

> web3.eth.getBalance("0xbe323cc4fde114269a9513a27d3e985f82b9e25d")
1.245e+21
> web3.eth.getBalance("0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70")
0

  
  每次記一長串的地址很麻煩,我們可以通過設定變數來acc0表示帳戶10xbe323cc4fde114269a9513a27d3e985f82b9e25d,acc1表示帳戶20x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70.

> acc0 = web3.eth.accounts[0]
"0xbe323cc4fde114269a9513a27d3e985f82b9e25d"
> acc1 = web3.eth.accounts[1]
"0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70"
> web3.eth.getBalance(acc0)
1.245e+21
> web3.eth.getBalance(acc1)
0

## 使用這個方法可以檢視格式化的以太幣
> web3.fromWei(web3.eth.getBalance(acc0))
1245

以太幣最小的單位是wei(18個0)

  
  因為geth javascript console是基於javascript的,所以也可以建立js函式,檢視所有帳戶餘額

> function checkAllBalances() {
     var totalBal = 0;
     for (var acctNum in eth.accounts) {
         var acct = eth.accounts[acctNum];
         var acctBal = web3.fromWei(eth.getBalance(acct), "ether");
         totalBal += parseFloat(acctBal);
         console.log("  eth.accounts[" + acctNum + "]: \t" + acct + " \tbalance: " + acctBal + " ether");
     }
     console.log("  Total balance: " + totalBal + " ether");
 };
> checkAllBalances()
  eth.accounts[0]:  0xbe323cc4fde114269a9513a27d3e985f82b9e25d  balance: 1245 ether
  eth.accounts[1]:  0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70  balance: 0 ether
  Total balance: 1245 ether

如果命令較多,可以儲存到一個腳本里,使用命令載入指令碼:loadScript('/path/script/here.js')

5.2.4、轉帳操作

  從帳戶0xbe323cc4fde114269a9513a27d3e985f82b9e25d轉3個以太幣到0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70,如果不指定單位ether,預設轉的是wei。

> web3.eth.sendTransaction({from:acc0,to:acc1,value:web3.toWei(3,"ether")})
Error: authentication needed: password or unlock
    at web3.js:3104:20
    at web3.js:6191:15
    at web3.js:5004:36
    at <anonymous>:1:1

當直接執行此方法時會丟擲異常,顯示帳號被鎖

  
  解鎖轉帳帳戶

> web3.personal.unlockAccount(acc0,"123456")
true

  
  解鎖完成之後,即可執行轉賬操作。

> web3.eth.sendTransaction({from:acc0,to:acc1,value:web3.toWei(3,"ether")})
"0x472f26a00d244b91fea9ff05d9cd5ff5259d8618301bb14af4499827eb159056"

相關推薦

如何搭建私有聯盟

如何啟動geth節點對大家來說已經不是什麼難事,今天博主就帶大家學習一下如何搭建兩個節點的聯盟鏈。 私有鏈的建立 在之前的文章中我們已經講到過私有鏈的建立,本篇文章我們會有道私有鏈建立的知識,就重新溫故一下。建立私有鏈首先需要指定創始塊的配置,也就是ge

筆記 如何搭建私有聯盟

轉載自:https://mshk.top/2017/11/go-ethereum-1-7-2/ 目錄 1、什麼是Ethereum(以太坊)   以太坊(Ethereum)並不是一個機構,而是一款能夠在區塊鏈上實現智慧合約、開源的底層系統,以太坊從誕生到2017年5

區塊入門三部曲(二) (最全最詳細 )Geth搭建私有

1.     Geth的搭建私有鏈搭建私有鏈首先需要配置一個創業區塊。下圖是創世區塊genesis.jsonConfig:config必不可少,否則建立不成功。ChildId不能為0。Alloc:用來預置賬號以及賬號的以太幣數量,因為私有鏈挖礦比較容易,所以我們不需要預置有幣

geth搭建自己得私(window)

2、 在Geth的安裝目錄下放置初始化創世塊檔案genesis.json,檔案內容如下: { //64位隨機數,用於挖礦,注意他和mixhash 的設定需要滿足以太坊黃皮書的要求 //直接用這個也可以 "nonce":"0x00000000

多節點私有搭建

以太坊多節點私有鏈的搭建 參考連結:http://www.360bchain.com/article/157.html 資料同步可能會出現的問題:https://blog.csdn.net/wo541075754/article/details/79247282/ 1、啟動節點 啟動節點

POA搭建聯盟——geth命令手記

創世塊使用:puppeth建立 參考:https://blog.csdn.net/code_segment/article/details/78160660   密碼:123 node: 128809dd3d9fe616381ce21b868191ce90091c7e

搭建基於ethereum環境的私有

安裝geth在之前的部落格有提到,所以本篇預設已經安裝成功 geth -h //能成功顯示輸出幫助,則表示已經成功安裝 12 一、創世塊 現在通過配置創世塊來建立私有鏈。同一個網路中,創世塊必須是一樣的,否則無法聯通。 建立一個private的根目錄,新建創世塊

搭建自己的私有

  首先介紹一下什麼是公有鏈和私有鏈 公有鏈:世界上任何一個人都可以參與的區塊鏈。使用者可以檢視,可以傳送交易,也可以參與保持資料一致性的運算等。 私有鏈:完全的私有鏈是指寫許可權是由一個人或一個單個組織控制的鏈。私有鏈的讀許可權是可以公開的或者是有限度的在一定範圍公

教程-搭建挖礦

安裝客戶端 安裝Gth,即Go語言實現的以太坊客戶端 (go-ethereum)。 brew tap ethereum/ethereum brew install ethereum 配置初始狀態 新建ethdev目錄 mkdir ethdev cd ethdev

區塊0環境搭建-unbtun16.04 搭建remix

1. 首先需要安裝npm 2. 將 npm 映象源設定成淘寶映象源:cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org 3. 輸入命令 cnpm -v 檢視是否正常 4. 輸入命令 c

多節點私有的配置與安裝

./geth -targetgaslimit 4294967295 -rpc -rpcaddr "127.0.0.1" -rpcport "8101" -port "30303" -rpcapi "eth,web3,personal" -networkid 123 -identity 123 -nodisco

區塊0環境搭建-unbtun16.04 安裝node.js npm

先安裝,nvm,即是Node Version Manager(Node版本管理器) curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash  或者使用  wge

2.0協議核心Beacon詳解

以太坊2.0並不是一個新主意,早在2014年,Vitalik就提到了以太坊2.0的概念,他說: “我們要麼解決可擴充套件性和共識問題,要麼就死於嘗試,” 好吧,我們還活得不錯,而他幾周前釋出的最新觀點是: “對於以太坊2.0來說,理論上已沒有明顯未解決的問題。” 現在正是實現這

如何分叉並變成自己的私

帥初寫於 2016年2月11日 隨著大家對區塊鏈技術的深入瞭解,越來越多的企業和個人開發者認識到ethereum區塊鏈平臺的價值,由於ethereum平臺開發語言是圖靈完備的,也給區塊鏈相關應用的開發帶來了更多的可拓展性,特別是基於ethereum的智慧合約平臺,可以讓

(ETH)同步公資料

前後端分離的啟動 這種方式既可以隨時和geth互動,又不影響geth在後臺執行,在伺服器上非常有必要。先用nohup在後臺程序中跑geth > nohup geth --syncmode full --datadir /data1/eth-sync/online -

821億市值面臨波動 3天后升級關係重大|AToken區塊研究

按照計劃,以太坊(Ethereum)區塊鏈網路將於區塊高度7,080,000時進行名為“君士坦丁堡”的技術升級,而截止北京時間1月14日10:07,以太坊的區塊高度已來到7,062,342高度,因此,距離萬眾期待的升級啟用以太坊的時間已經越來越近了! 去年有資深的以太坊愛好者計算過以太坊

區塊入門(2):搭建私有(private network of ethereum),以及挖礦的操作..

percent symbol 令行 sans miners margin ima ear 建立 在做一些測試工作的時候, 為了方便控制以及更快的進入真正的測試工作,可能需要搭建一個私有的以太坊網絡. 而以太坊節點之間能夠互相鏈接需要滿足1)相同的協議版本2)相同的netwo

使用 Go-Ethereum 1.7.2搭建私有

lean nic 腳本 ica welcome accounts oot db4 upgrade 1、什麽是Ethereum(以太坊)   以太坊(Ethereum)並不是一個機構,而是一款能夠在區塊鏈上實現智能合約、開源的底層系統,以太坊從誕生到2017年5月,短短3年

docker 搭建私有搭建

min self odi auto ora ucc lib color 技術 最近區塊鏈,火得不行,身邊也有朋友準備玩這個,說是搭了一個星期,沒有把環境搭建起來,叫我幫忙看看環境怎麽搭建 於是我找到了官方的地址 https://github.com/ethereum

區塊,使用 Go-Ethereum 搭建私有

區塊鏈 私有鏈 以太坊 go語言 1、什麽是Ethereum(以太坊)  以太坊(Ethereum)並不是一個機構,而是一款能夠在區塊鏈上實現智能合約、開源的底層系統,以太坊從誕生到2017年5月,短短3年半時間,全球已有200多個以太坊應用誕生。以太坊是一個平臺和一種編程語言,使開發人員能夠