環(huán)境win10,*64?
所有操作都在D:\work\geth里進行
以太坊客戶端會在C:\Users\Administrator\AppData下生成ethash的文件夾用來存放運行時信息枷餐。etherum-wallet在C:\Users\Administrator\AppData\Roaming里生成臨時文件夾etherum wallet,保存信息赁遗,初始化錢包需要刪除
廢話不多說了添坊,趟過了很多坑,開始以太坊私有鏈搭建。
一.geth,mist 客戶端下載
? ? ?1.這里我給大家介紹下胁后,以太坊客戶端讯泣,以太坊客戶端主要分成兩類衅枫。一個是后臺命令行客戶端嫁艇,如:geth(go語言),parity(Rust語言),他們是一個與以太坊網絡交互的命令行客戶端。
其余的命令行客戶還有?ethereumjs-lib(javascript),pyethapp(python),ruby-ethereum(ruby) ....主要 geth 使用的比較普遍弦撩,這里我就使用geth作為命令行客戶端步咪。
? ? 2.mist 是屬于可視化錢包,這么說吧益楼,你在geth 客戶端中生成的用戶猾漫,以太坊幣數量可以通過mist 錢包可視化展示。當然mist 不只有這些簡單的功能感凤,最重要的是能部署智能合約悯周,發(fā)布,調用陪竿。其他還有很多輕錢包队橙,如 lightWallet,metamask...
? ?下面是geth和mist下載地址,這里我使用的是windows系統(tǒng)安裝萨惑。
https://pan.baidu.com/s/1SksXj4siKj2OgX2Dn4TF7A? ?密碼:4sm6
Geth : 版本:1.8.12 (當時最新版)
Mist :0.11.1
安裝完geth,可以打開命令行工具:
下載地址:
二.創(chuàng)建以太坊初始區(qū)塊文件?genesis.json
{
? "config": {
? ? "chainId": 101,
? ? "homesteadBlock": 0,
? ? "eip155Block": 0,
? ? "eip158Block": 0
? },
? "alloc": {},
? "coinbase": "0x0000000000000000000000000000000000000000",
? "difficulty": "0x400",
? "extraData": "",
? "gasLimit": "0xffffffff",
? "nonce": "0x0000000000000042",
? "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
? "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
? "timestamp": "0x00"
}
chainId : 以太坊區(qū)塊鏈網絡Id,ethereum主鏈是1仇矾,私有鏈只用不要與主鏈沖突即可庸蔼。此時設置的chainId可以和啟動時指定的networdid不一致,以啟動時的為主
alloc : 預留賬戶贮匕,一般留空姐仅,如下
??"alloc":{
???"0x0000000000000000000000000000000000000001":{"balance":"121312321"},
???"0x0000000000000000000000000000000000000002":{"balance":"121312321"},
??}
Coinbase: 礦工賬戶
Difficulty: 挖礦難度,0x400刻盐,這個是簡單掏膏。
extraData:相當于備注
gasLimit:最小消耗gas
nonce :?64位隨機數,用于挖礦敦锌,注意他和mixhash的設置需要滿足以太坊黃皮書中的要求
parentHash : 上一個區(qū)塊的Hash值馒疹,因為是創(chuàng)世塊,石頭里蹦出來的乙墙,沒有在它前面的颖变,所以是0
Timestamp : 時間戳
三.初始化區(qū)塊節(jié)點
geth --datadir data0 init genesis.json
data0 是當前文件夾存儲節(jié)點數據,位于D:\work\geth\下听想,可以自動創(chuàng)建
出現如下內容就成功了
Successfully wrote genesis state? ? ? ? database=lightchaindatahash=84e71d…97246e
初始化成功后腥刹,會在數據目錄{dataDir} (d:\work\geth\data0)中生成?geth?和?keystore?(存儲加密后的賬戶信息)兩個文件夾.
三、啟動私有鏈節(jié)點
geth --identity "TestNode1" --datadir "data0" --rpc --rpcapi "db,eth,net,web3" --rpcaddr "127.0.0.1" --rpcport "8486" --port "30304" --networkid "29382" console
選擇web3接口連接本地私鏈時汉买,需要在啟動私鏈時添加如下參數? --rpccorsdomain "*" 衔峰,不然鏈接不上。如下:
geth --identity "TestNode1" --datadir "data0" --rpc --rpcapi "db,eth,net,web3" --rpcaddr "127.0.0.1" --rpccorsdomain "*" --rpcport "8486" --port "30304" --networkid "29382" console
使用命令 geth -h 可以查看geth 相關的幫助文檔。這里我說幾個常用的屬性垫卤。
? --Identity : 節(jié)點身份標識威彰,起個名字
? --datadir : 指定節(jié)點存在位置,“data0”
? --rpc : 啟用http-rpc服務器
? --rpcapi : 基于http-rpc提供的api接口葫男。eth,net,web3,db...
? --rpcaddr : http-rpc服務器接口地址:默認“127.0.0.1”
? --rpcport : http-rpc 端口(多節(jié)點時抱冷,不要重復)
? --port : 節(jié)點端口號(多節(jié)點時,不要重復)
? --networkid : 網絡標識符 隨便指定一個id(確保多節(jié)點是統(tǒng)一網絡梢褐,保持一致)
? ? 下圖表示啟動成功旺遮,進入geth命令行客戶端:
注意:如果想將Ubuntu作為永久區(qū)塊鏈節(jié)點使用,當使用nohup命令時盈咳,Geth啟動參數console必須去掉耿眉,否則Geth會自動停止。
啟動完成之后進入控制臺鱼响,這是一個交互式的 JavaScript 執(zhí)行環(huán)境鸣剪,在這里面可以執(zhí)行 JavaScript 代碼,其中?>?是命令提示符丈积。在這個環(huán)境里也內置了一些用來操作以太坊的 JavaScript 對象筐骇,可以直接使用這些對象。這些對象主要包括:
eth:包含一些跟操作區(qū)塊鏈相關的方法江滨;
net:包含一些查看p2p網絡狀態(tài)的方法铛纬;
admin:包含一些與管理節(jié)點相關的方法;
miner:包含啟動&停止挖礦的一些方法唬滑;
personal:主要包含一些管理賬戶的方法告唆;
txpool:包含一些查看交易內存池的方法;
web3:包含了以上對象晶密,還包含一些單位換算的方法擒悬。
>eth.accounts
[]
>
創(chuàng)建賬戶1:
> personal.newAccount("123456")
"0x1078f82b17790664b3d931b91eb1f17ec109df09"
創(chuàng)建賬戶2:
> personal.newAccount("654321")
"0x1be3d41d02408d11e13eb5191520f3b2fa002dd1"
>
3、查看賬戶余額
> eth.getBalance(eth.accounts[0])
0
> eth.getBalance(eth.accounts[1])
0
>
查詢余額有多種方式稻艰,可以通過創(chuàng)建時的16進制碼懂牧,也可以通過賬戶下標查詢,下標默認從0開始尊勿。
啟動&停止挖礦
> miner.start(1)
其中 start 的參數表示挖礦使用的線程數归苍。第一次啟動挖礦會先生成挖礦所需的 DAG 文件,這個過程有點慢运怖,等進度達到 100% 后拼弃,就會開始挖礦,此時屏幕會被挖礦信息刷屏摇展。實際你看到的挖礦速度很快吻氧,這是因為我們已經在初始化創(chuàng)世區(qū)塊時配置為:"nonce": "0x400"。 “0x400”難度能讓你在私有測試網鏈上快速挖以太幣。
提示
挖礦時必然有礦工賬戶盯孙,而系統(tǒng)默認使用創(chuàng)建的第一個賬號鲁森。
停止挖礦
> miner.stop()
挖到一個區(qū)塊會獎勵n個以太幣,挖礦所得的獎勵會進入礦工的賬戶振惰,這個賬戶叫做 coinbase歌溉,默認情況下 coinbase 是本地賬戶中的第一個賬戶,可以通過 miner.setEtherbase() 將其他賬戶設置成 coinbase骑晶。只要是能產生區(qū)塊痛垛,就有獎勵,即使區(qū)塊中沒有任何有用信息桶蛔。
交易
假如0賬戶向1賬戶轉賬匙头,需要先把0賬戶鎖定,然后才能進行交易
> personal.unlockAccount(eth.accounts[0])
Unlock account0x6594cc2f72908c0fea54d5c9dd297ce68f735411
Passphrase:
true
>
轉賬 賬戶0 –> 賬戶1
> amount = web3.toWei(5,'ether')"
5000000000000000000"
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
INFO [01-18|17:56:14] Submitted transaction? ? ? ? ? ? ? ? ? ? fullhash=0x065c698cceaf996ab9ab06c6eddc8b035704defbcff0d65227d32c06a5b17637recipient=0x4BD9F7b3c365D35C50757AF4CC7Bdb1307A083C0"0x065c698cceaf996ab9ab06c6eddc8b035704defbcff0d65227d32c06a5b17637
>
此時如果沒有挖礦仔雷,用?txpool.status?命令可以看到本地交易池中有一個待確認的交易蹂析,可以使用?eth.getBlock("pending", true).transactions?查看當前待確認交易。
> txpool.status
{
? pending: 1,
? queued: 0
}
查交易和區(qū)塊
> eth.blockNumber
200
通過交易 Hash 查看交易(Hash 值包含在上面交易返回值中):
>eth.getTransaction("0x65a8278d571d7cf3f2ca36ce721900d61e9d6eadd1ed5f24f39b646c2b194427")
{
? blockHash: "0x0101b5f9e9c50ee45156f0631df18a97176aef5215bde40b3e167195d367ed80",
? blockNumber: 342,
? from: "0x16671cdabbc9b3f0f1b31380d972dcd9725f7d8a",
? gas: 90000,
? gasPrice: 18000000000,
? hash: "0x65a8278d571d7cf3f2ca36ce721900d61e9d6eadd1ed5f24f39b646c2b194427",
? input: "0x",
? nonce: 1,
? r: "0x52b7fce530ebd67527d4fe684cb3b5a4b96909154aeedcc5f371ab27e9e7f1ba",
? s: "0x141268e8fef639b79773f6ab7fb778b958be77bd05944f305dc4f1ec68f21962",
? to: "0x4bd9f7b3c365d35c50757af4cc7bdb1307a083c0",
? transactionIndex: 0,
? v: "0x823",
? value: 5000000000000000000
}
>
通過區(qū)塊號查看區(qū)塊:
> eth.getBlock(0)
{
? difficulty: 131072,
? extraData: "0x6d6f7475692d32",
? gasLimit: 4294967295,
? gasUsed: 0,
? hash: "0x5117726df3040cb5cbd6e8d59cdaacaaa1cd8df4a20072d0e8242e96ea5c893f",
? logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
? miner: "0x0000000000000000000000000000000000000000",
? mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
? nonce: "0x0000000000000042",
? number: 0,
? parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
? receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
? sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
? size: 515,
? stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
? timestamp: 0,
? totalDifficulty: 131072,
? transactions: [],
? transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
? uncles: []
}
>
連接遠程控制臺
geth attach http://127.0.0.1:8486
==================================================
過創(chuàng)始塊預分配賬戶余額
按照上面的步驟將第一節(jié)點啟動后碟婆,創(chuàng)建一個賬戶电抚,復制地址
編輯genesis.json,在alloc段竖共,增加如下內容:
? ? "alloc": {
? ? ? ? "0x81e71d34e8a9e4382c36fd90c3f234549106addd": { "balance": "20000000000000000000" }
? ? }
這里的地址就是剛才創(chuàng)建的地址喻频,后面的balance就是你想預分配的余額
然后將數據目錄下的geth目錄刪掉,重新創(chuàng)建創(chuàng)始塊(keystore目錄不要動)
rm -rf /data/testchain/geth
然后再重新執(zhí)行geth init創(chuàng)建創(chuàng)始塊的命令肘迎,然后再啟動geth,就可以在console中查看到賬戶被預分配的余額了