1. 程式人生 > >區塊鏈開發:以太坊網絡

區塊鏈開發:以太坊網絡

創建 bash net ner 系統 extra c99 分開 opera

區塊鏈開發:以太坊網絡

一、geth

Geth 又名Go Ethereum. 是以太坊協議的三種實現之一,由Go語言開發,完全開源的項目。Geth 可以被安裝在很多操作系統上,包括Windows、Linux、Mac的OSX、Android或者IOS系統

Geth官網:https://geth.ethereum.org/
Geth的Github地址:https://github.com/ethereum/go-ethereum

Ubuntu安裝geth客戶端:
官方教程:https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu

安裝方法一:

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

系統聯網執行後,即完成了安裝以太坊客戶端,其中包括geth,bootnode, evm, disasm, rlpdump,ethtest

此時如果輸入Geth命令,會出現啟動以太坊啟動的畫面

安裝方法二:

git clone https://github.com/ethereum/go-ethereum
sudo apt-get install -y build-essential golang
cd go-ethereum
make geth

greg@greg:~$ geth version
Geth
Version: 1.7.3-stable
Git Commit: 4bb3c89d44e372e6a9ab85a8be0c9345265c763a
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.9
Operating System: linux
GOPATH=/home/greg/go
GOROOT=/home/greg/local/go

二、以太坊查看網絡狀態

attach:Start an interactive JavaScript environment (connect to node) 啟動交互式JavaScript環境(連接到node)

打開geth --testnet
greg@greg:~/.ethereum$ geth attach ipc://${HOME}/.ethereum/testnet/geth.ipc
Welcome to the Geth JavaScript console!

instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9
 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


查看鏈接狀態
net.listening
net.peerCount
查看自己的夥伴的網絡信息
admin.peers
查看自己的網絡信息
admin.nodeInfo

打開.bashrc寫入
alias gat=‘geth attach ipc://${HOME}/.ethereum/testnet/geth.ipc‘

三、以太坊構建本地私有網絡

1.編輯創世區塊

greg@greg:~$ mkdir ethprivate
greg@greg:~$ cd ethprivate/
greg@greg:~/ethprivate$ vim genesis.json
greg@greg:~/ethprivate$ vim genesis.json
greg@greg:~/ethprivate$ cat genesis.json 
{
    "nonce": "0x0000000000000042",     
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x00",     
    "gasLimit": "0x8000000",     
    "difficulty": "0x400",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x3333333333333333333333333333333333333333",     
    "alloc": { }
}

genesis(創世)區塊是區塊鏈的起點,是它的第一塊區塊,0號區塊,唯一一個沒有前任的區塊。這個協議確保了沒有其他節點會和你的節點的區塊鏈版本一致,除非它們的創世區塊和你的一模一樣。通過這種方法,你就可以創建任意多的私有區塊鏈。

Mixhash
一個256位的哈希值,和nonce配合,一起用來證明在區塊鏈上已經做了足夠的計算量(工作證明)。這個nonce 和 mixhash 的組成,必須滿足一個在黃皮書中所描述的數學上的條件,黃皮書 4.3.4。
Nonce
一個64位的哈希值,和mixhash配合,一起用來證明在區塊鏈上已經做了足夠的計算量(工作證明)
Difficulty
定義挖礦的目標,可以用上一個區塊的難度值和時間戳計算出來,值越高,礦工越難挖到區塊
Alloc 預先填入一些錢包和余額
Coinbase
160位的錢包地址。在創世區塊中可以被定義成任何的地址,因為當每挖到一個區塊的時候,這個值會變成礦工的etherbase地址
Timestamp  一個unix的time()函數的輸出值,時間戳
extraData  32字節長度,可以為私有鏈留下一些信息,如你的姓名等,用以證明這個私有鏈是你創建的
gasLimit   當前鏈,一個區塊所能消耗的gas上限

私有鏈中會使用到的命令行參數
--nodiscover
添加這個參數,確保沒有人能發現你的節點。不然的話,可能有人無意中會鏈接到你的私有區塊鏈。
--maxpeers 0
使用maxpeers 0,如果你不希望其他人連接到您的測試鏈。當然,您也可以調整這個數,如果你知道有多少同伴會連接你的節點。
--rpc
在你的節點上激活RPC接口。這參數在geth中默認啟用。
--rpcapi "db,eth,net,web3"
這個命令描述哪些接口可以通過RPC來訪問,默認情況下,geth開啟的是web3接口。
--rpcport "8080"
將端口號設置成8000以上的任何一個你網絡中打開的端口。默認是8080。
--rpccorsdomain http://chriseth.github.io/browser-solidity/
設置可以連接到你的節點的url地址,以執行RPC客戶端的任務。最好不要使用通配符 * ,這樣將允許任何url都可以鏈接到你的RPC實例。
--datadir "/home/TestChain1"
私有鏈的數據目錄,確保與公共以太坊鏈的數據目錄區分開來。
--port "30303"
這是“網絡監聽的端口”,您可以用它手動的和你的同伴相連。
--identity "TestnetMainNode"
為你的節點設置一個ID。用於和你們的一系列同伴進行區分。

2.初始化創世區塊

greg@greg:~/ethprivate$ geth --datadir "./" init genesis.json
WARN [02-21|23:48:06] No etherbase set and no accounts found as default 
INFO [02-21|23:48:06] Allocated cache and file handles         database=/home/greg/ethprivate/geth/chaindata cache=16 handles=16
Fatal: Failed to write genesis block: genesis has no chain configuration
greg@greg:~/ethprivate$ ls
genesis.json  geth  keystore

此時當前目錄下面會新增出兩個文件夾geth和keystore

geth中保存的是區塊鏈的相關數據
keystore中保存的是該鏈條中的用戶信息

每次當你想要使用你自定義的私有鏈時,你都需要先使用geth來運行以上的命令來啟動它。

3.創建自己的私有鏈條

創建自己的私有鏈條,同時記錄日誌輸出到geth.log
greg@greg:~/ethprivate$ geth --datadir "./" --nodiscover console 2>>geth.log
Welcome to the Geth JavaScript console!

instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9
 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
在自己的私有鏈條上創建用戶
> eth.accounts
[]
> personal.newAccount("123456")
"0xe158bf2c29ca283c7bdc99880e36985d9f7d23f8"
> eth.accounts
["0xe158bf2c29ca283c7bdc99880e36985d9f7d23f8"]
> personal.newAccount("abcdef")
"0x8cd642b5f69a24fd3d05786dfe0eb3f44dc8bb33"
> eth.accounts
["0xe158bf2c29ca283c7bdc99880e36985d9f7d23f8", "0x8cd642b5f69a24fd3d05786dfe0eb3f44dc8bb33"]

輸入命令personal.newAccount("123456"), 該命令將創造一個新的用戶,該用戶的密碼是123456

再次輸入命令 eth.accounts, 我們會發現一個新的用戶被創建了出來,這就代表我們已經創建了一個賬戶,重復personal.newAccount()eth.accounts 我們可以創建若幹個賬戶出來

區塊鏈開發:以太坊網絡