安裝准備:go,git
- 通過PPAs安裝geth
1 $ sudo add-apt-repository -y ppa:ethereum/ethereum 2 $ sudo apt-get update 3 $ sudo apt-get install ethereum
- 創建自己的私有鏈
創建創世文件
創建一個genesis.json文件,官網配置文件如下:https://github.com/ethereum/go-ethereum,其中,chainId是私有鏈的id,注意不要和現有的主鏈(1)和測試鏈的id相同(2,3,42),例如:500,666等;alloc代表初始資產配置,在該區塊鏈產生時,就預先賦予這些賬戶一定數額的wei,可以將metamask中的地址寫入,分配以太幣,注意單位是wei;difficulty 定義了每次挖礦時,最終確定nonce 的難度;nonce預定一個隨機數,這是一個與PoW 機制有關的值;coinbase 每挖出一個區塊,都會獲得獎勵,該值指定默認情況下把獎勵給到哪個賬戶,實際上,我們每次挖礦開始之前,都會自己指定;gasLimit 規定該區塊鏈中,gas 的上限。
1 { 2 "config": { 3 "chainId": <arbitrary positive integer>, 4 "homesteadBlock": 0, 5 "eip150Block": 0, 6 "eip155Block": 0, 7 "eip158Block": 0, 8 "byzantiumBlock": 0, 9 "constantinopleBlock": 0, 10 "petersburgBlock": 0, 11 "istanbulBlock": 0, 12 "berlinBlock": 0 13 }, 14 "alloc": {}, 15 "coinbase": "0x0000000000000000000000000000000000000000", 16 "difficulty": "0x20000", 17 "extraData": "", 18 "gasLimit": "0x2fefd8", 19 "nonce": "0x0000000000000042", 20 "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", 21 "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", 22 "timestamp": "0x00" 23 }
初始化創建私有鏈
創建myChain文件夾,用來指定數據存儲的位置,使用以下命令初始化私有鏈。
1 mkdir myChain 2 # 指定數據存儲位置 3 geth --datadir myChain/ init genesis.json
私有鏈啟動
Networkid與配置文件中的id相同
1 geth --datadir mychain/ --networkid 666
info輸出重定向
上面的命令啟動私有鏈,時不時就會出現info消息,影響我們輸入geth命令,因此我們將info輸出重定向到一個log文件,使用使用下面命令啟動。可以新開一個命令行終端輸入以下命令查看日志:tail -f geth.log。
1 geth --datadir mychain/ --networkid 666 console 2>geth.log
創建完成
可以使用exit和ctrl-d退出。
啟動腳本創建
創建一個啟動rungeth.sh命令腳本,之后運行腳本,私有鏈就啟動了,其中指定了數據存儲位置,私有鏈網絡id,開放端口,rpc端口,rpc地址,rpc方法,允許HTTP通道解鎖賬戶,info重定向等命令,請大家根本自身的實際情況進行修改,腳本具體內容如下。(相關的參數的涉及可能在后面給出原因)
1 #!/bin/bash 2 geth --datadir . --networkid 15 --port 30303 --http --http.addr "0.0.0.0" --http.port 8545 --http.api 'db,net,eth,web3,personal' --allow-insecure-unlock --http.corsdomain '*' console 2>> geth.log
賦予rungeth.sh腳本權限
1 chmod 755 rungeth.sh
運行腳本
1 # 在rungeth.sh文件夾下執行該命令 2 ./rungeth.sh
啟動命令參數說明
使用最新版本geth客戶,當執行personal.unlockAccount()或在程序中調用personal_unlockAccount接口時,會出現:account unlock with HTTP access is forbidden異常。新版本geth,出於安全考慮,默認禁止了HTTP通道解鎖賬戶。在啟動命令中添加“--allow-insecure-unlock”參數進行打開操作。
- 安裝metamask
MetaMask是一款在谷歌瀏覽器Chrome上使用的插件類型的以太坊錢包,該錢包不需要下載,只需要在谷歌瀏覽器添加對應的擴展程序即可,非常輕量級,使用起來也非常方便。
Chrome的安裝
進入到Chrome的網上應用商店下載metamask
MetaMask使用
可以參考:https://zhuanlan.zhihu.com/p/112285438?from_voters_page=true
- Metamask連接自己的私有鏈(win10下的Ubuntu18.04虛擬機)
私有鏈啟動時命令參數包含rpc和rpcaddr
其中rpcaddr "0.0.0.0",指定任何一個ip地址都可以訪問,rpc默認端口是8545。
查看虛擬機IP地址
ifconfig查看虛擬機的ip地址,此處你的虛擬機要是橋接模式,不然不會有自己的ip。
metamask連接
在metamask上自定義rpc,網絡名稱可以隨意取,URL地址為http://虛擬機ip:8545,,鏈ID為私有鏈id看,保存即可以連上虛擬機上的私有鏈。
MetaMask/外部賬戶導入到Geth私鏈(可以在初始化私有鏈的配置文件中就加上metamask賬戶地址)
-
- 獲取MetaMask上賬戶的私鑰:點擊賬戶詳情,導出私鑰。
- 拿到私鑰以后,在虛擬機中創建一個文本文件例如fk.txt放進去
- 輸入geth account import 你的私鑰文件路徑
- 提示你輸入密碼,這個密碼是在geth控制台使用的密碼
- 發現生成的賬戶地址就是在MetaMask上的賬戶地址。
- 查看當前生成密鑰文件位置:geth account list
- 找到對應賬戶后面的存儲位置,把文件放到項目中的keystore文件夾中即可。(keystore文件夾的位置為geth啟動命令是指定的數據存儲位置參數,即datadir)
- 在geth控制台中輸入eth.accounts查看
- 導入完成
完成metamask賬戶地址的添加到私有鏈中,稍后進行轉賬,即可看到賬戶余額。
- 基本命令
下面的命令均在geth控制台中輸入,即輸入啟動私有鏈命令后。
1 # 創建一個新的賬戶,輸入兩遍密碼后,生成賬戶地址。以同樣的方式,可創建多個賬戶。 2 personal.newAccount() 3 # 查看賬戶 4 eth.accounts 5 # 查看賬戶余額 6 eth.getBalance(eth.accounts[0]) 7 # 啟動挖礦,其中 start 的參數表示挖礦使用的線程數。第一次啟動挖礦會先生成挖礦所需的 DAG 文件,這個過程有點慢,等進度達到 100% 后,就會開始挖礦,此時屏幕會被挖礦信息刷屏。 8 miner.start(1) 9 # 停止挖礦 10 miner.stop() 11 # 檢查挖礦是否已經停止,eth.mining 輸出為false時表示挖礦已經停止 12 eth.mining 13 # 當新區塊挖出后,挖礦即可結束。 14 miner.start(1);admin.sleepBlocks(1);miner.stop(); 15 # 挖到一個區塊會獎勵以太幣,挖礦所得的獎勵會進入礦工的賬戶,這個賬戶叫做 coinbase,默認情況下 coinbase 是本地賬戶中的第一個賬戶,可以通過 miner.setEtherbase() 將其他賬戶設置成 coinbase。 16 17 # 從賬戶 0 向賬戶 1 轉賬,先解鎖賬戶 0,才能發起交易,部署智能合約時,同樣需要先解鎖。未解鎖返回的報錯信息為:Error: authentication needed: password or unlock undefined。 18 personal.unlockAccount(eth.accounts[0]) 19 # 發送交易,賬戶 0 -> 賬戶 1: 20 amount = web3.toWei(5,'ether') 21 eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}) 22 # 此時如果沒有挖礦,用 txpool.status 命令可以看到本地交易池中有一個待確認的交易,可以使用 eth.getBlock("pending", true).transactions查看當前待確認交易。使用下面命令開始挖礦。 23 miner.start(1);admin.sleepBlocks(1);miner.stop(); 24 # 新區塊挖出后,挖礦結束,查看賬戶 1 的余額,已經收到了賬戶 0 的以太幣: 25 web3.fromWei(eth.getBalance(eth.accounts[1]),'ether') 26 # 查看當前區塊總數 27 eth.blockNumber 28 # 通過區塊號查看區塊 29 eth.getBlock(4) 30 # 通過交易 Hash 查看交易(Hash 值包含在上面交易返回值中) 31 eth.getTransaction("0x9f5e61f3d686f793e2df6378d1633d7a9d1df8ec8c597441e1355112d102a6ce")
- 參考文章
https://blog.csdn.net/weixin_43584346/article/details/114792707
https://zhuanlan.zhihu.com/p/112285438?from_voters_page=true
https://www.cnblogs.com/soowin/p/14328195.html
https://blog.csdn.net/wo541075754/article/details/98847308
https://blog.csdn.net/youlinhuanyan/article/details/99574782
https://blog.csdn.net/u014439239/article/details/79347389
https://blog.csdn.net/mingrizhixin/article/details/111407758
https://blog.csdn.net/weixin_43988498/article/details/108394012
https://www.jianshu.com/p/9fa31e4cdf4d
https://github.com/ethereum/go-ethereum