简介
https://geth.ethereum.org/
ethereum的Go语言实现
安装
https://geth.ethereum.org/downloads/
git clone https://github.com/ethereum/go-ethereum sudo apt-get install -y build-essential golang cd go-ethereum make geth
Mac
brew tap ethereum/ethereum brew install ethereum
Arm embeded system
http://ethembedded.com/?page_id=171
使用
https://github.com/ethereum/go-ethereum/wiki/geth
如果是从source安装(或可加入环境变数)
~/go-ethereum/build/bin/geth
如果是从安装档可直接输入
geth help
可用命令
https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options
1.创建创世区块(genesis block)
custom_genesis.json
{ "config": { "chainId": 123, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "difficulty": "0x40", "gasLimit": "4712388", "alloc": { } }
然后输入
geth --datadir "./privatechain" --networkid 123 init custom_genesis.json
上面将会创建一个privatechain资料夹,里面存放我们private chain的资讯,genesis blcok会放在/privatechain资料夹/geth/chaindata/...ldb,而account会放在keystore里面
(如果是1.6之前版本要改为如下)
如果出现Fatal: invalid genesis file: json: cannot unmarshal hex string of odd length into Go struct field Genesis.extraData of type hexutil.Bytes 为版本>1.6 请参考上面
https://ethereum.stackexchange.com/questions/15283/getting-error-on-max-invalid-genesis-file-hex-string-has-odd-length
{ "nonce": "0x0000000000000042", "timestamp": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x0", "gasLimit": "0x8000000", "difficulty": "0x400", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333", "alloc": { } }
然后输入以下,之后开启Mist wallet就会进入private network
geth --datadir "./privatechain" init ./custom_genesis.json geth --ipcpath ~/Library/Ethereum/geth.ipc --datadir "./privatechain" --networkid 123
上面要写上--ipcpath原因是我们指定了datadir
以下为各os路径后面记得加geth.ipc
Mac
~/Library/Ethereum/
Linux
~/.ethereum/
Windows
~/AppData/Roaming/Ethereum
方法2
也可使用下面产生private network
geth init custom_genesis.json geth networkid=5
这样打开钱包也可进入private network
如果出现错误:Fatal: Failed to write genesis block: database already contains an incompatible genesis block
把路径下的chaindata资料夹删除即可~/Library/Ethereum/geth/chaindata
2.预先分配ether给account
先把刚才的节点启动
geth --ipcpath ~/Library/Ethereum/geth.ipc --datadir "./privatechain" --networkid 123
然后打开Mist钱包后先创建帐户,然后把帐户号码复制,之后贴到刚才genesis的alloc下面的一串hash,然后重新init 即可
"alloc": { "0x66A2e289b35147188876c2007f9a810Dd20e480d": { "balance": "1337000000000000000000"} }
geth --datadir "./privatechain" --networkid 123 init custom_genesis.json
每次init genesis chaindata资料夹下都会多一个ldb但他会去读取最新的
有时上面讯息有Success 但下面又有Fatal可以不用理会
之后再次启动
geth --ipcpath ~/Library/Ethereum/geth.ipc --datadir "./privatechain" --networkid 123
点选Mist图案打开钱包即可看到帐户余额增加
试着挖矿
打开另一个termianl输入以下,进入console
geth attach
或是可在刚才启动ethereum后面加上console字样,而geth attach预设只会找ipc不会找rpc
可在mist新增地址或是在console输入personal.newAccount("密码")
加入挖矿要放钱的地址web3.miner.setEtherbase('0xB4eb9148CD0Aa801215f0e62A354F55A7E1AA67A') // 上面为刚才新增的地址 // 也可以直接写如下 会去读取刚才创建的地址 web3.miner.setEtherbase(personal.listAccounts[0])开始挖矿(需稍等)
(目前新版1.6有可能卡在dag产生完后)
miner.start(1)停止
miner.stop()
3.加入其他节点
https://github.com/ethereum/go-ethereum/wiki/Setting-up-private-network-or-local-cluster
https://github.com/ethereum/go-ethereum/wiki/Connecting-to-the-network#connecting-to-the-network
1.用RPC,记得要使用--rpc
2.每个节点要使用同一个创世区块,才能找到彼此,我们先输入如下指令,分别创建两个节点的资料夹,并且用同一个genesis.json个别于两资料夹产生相同创世区块
先把刚privatechain资料夹删除,重新创建一个./privatechain/src 然后里面放入刚才的custom_genesis.json
sudo rm -rf ./privatechain ; mkdir ./privatechain ; mkdir ./privatechain/src ; mv ./custom_genesis.json ./privatechain/src/custom_genesis.json
geth --datadir "./privatechain/01" init ./privatechain/src/custom_genesis.json geth --datadir "./privatechain/02" init ./privatechain/src/custom_genesis.json
3.再来分别启动两个节点(networkid要相同,而--rpcport与--port要不同)
geth --ipcdisable --rpc --rpcport 8104 --datadir "./privatechain/01" --networkid 123 --rpcapi="db,eth,net,web3,personal" --nodiscover --port=30310 console geth --ipcdisable --rpc --rpcport 8103 --datadir "./privatechain/02" --networkid 123 --rpcapi="db,eth,net,web3,personal" --nodiscover --port=30308 console
4.之后于01节点的console输入
admin.nodeInfo
把enode部分复制
5.于02节点输入
admin.addPeer("贴上刚才复制的enode")
6.之后于两个节点分别输入admin.peers即可找到彼此
注意
- 我们没有设预设bootnode所以要手动加入
- 如果有三个节点ABC,A加入B之后,A再加入C
这时B仍然找不到C要B主动加入C才可- 一开始没有加入peers时会发现有时输入admin.peers会出现有时没有,原因是在连线到任何peers时他会试着去连接其他网路上的节点
- 节点互相找不到的原因通常为你没有输入init genesis.json,所以两个节点间的genesis.json不相同以及没有输入--nodiscover 所以他会加上网路上其他相同genesis和networkid的陌生人
- 重新启动某节点该节点的peer会断掉,要重新加入
7.测试RPC-JSON server
之后钱包连线会使用
我们可以先输入 curl http://localhost:8104 8104是该RPC的port,来看一下有沒有启动成功会出现下图
8.这时开启Mist要设定钱包要连线到哪个位置,所以这次我们不能直接点选图案开启,要使用命令列开启,并加上--rpc <PORT>
(你可能直接从图案开启应用程序,也看到他有开启时有显示private net,但其实他还是连到MainNet)
OSX
/Applications/Ethereum\ Wallet.app/Contents/MacOS/Ethereum\ Wallet --rpc http://localhost:8104Windows
start <加上程序路径> --rpc <IP+PORT>
# 1.6新增之puppeth CLI可用来产生genesis_block
1.记得先产生account
geth --datadir ./privatechain account new
2.直接在terminal输入`puppeth` 之后会出现如下图
然后造着步骤走即可,最后会产生一个创世.json
但要记得如果共识方法选的是Poa,之后其他节点要挖矿会产生
Block sealing failed err=unauthorized
记得要
clique.propose("账号", true)
clique指令只有POA才有
注意事项
1.注意:每次从terminal启动其他ethereum程序后开启钱包,如果你没有指定RPC 或IPC port,钱包都只会去读取最新开启的terminal的程序
2.如果进入到钱包,但是testnet与main都无法点选,表示你尝试进入到private network但是参数没有下成功
3.每个--参数都要和前面空一格,否则无效
4windows作业系统的terminal如果不好复制,可以使用git bash
5.节点互相找不到的原因通常为你没有输入init genesis.json,所以两个节点间的genesis.json不相同以及没有输入--nodiscover 所以他会加上网路上其他相同genesis和networkid的陌生人
6.32位元版本的geth无法挖矿,需下载64位元https://github.com/ethereum/go-ethereum/issues/14633
- 两节点加入后新加入节点不用挖矿就会自动同步,但如果有产生合约或是广播交易网路上的其中一个节点必须挖矿
使用DEV Chain
不用自己init genesis block 和指定datadir 以及自动帮你配好一些参数可直接启动私有链
geth --dev --rpc --rpcport 8104 --datadir ./Ethtest --rpccorsdomain="*" console
开放Remote 连线
https://ethereum.stackexchange.com/questions/3163/how-can-i-expose-geths-rpc-server-to-external-connections
设定Bootnode
因为homebrew的安装沒有bootnode executable 所以要build from source
以为步骤
git clone https://github.com/ethereum/go-ethereum.git make all cd ./build/bin ./bootnode -genkey bootnode.key
之后资料夹下会产一个bootnode.key档案
然后输入
./bootnode -nodekey bootnode.key
会产生如下
之后我们开启terminal输入以下启动节点
> 记得--nodiscover要拿掉然后--bootnodes后面填上刚才出现的enode:
并且把enode[::]换成ip地址
bootnode本身不算是节点只启动下面一个时在admin.peers还是空的
geth --ipcdisable --rpc --rpcport 8106 --datadir "./privatechain/01" --networkid 123 --rpcapi="db,eth,net,web3,personal" --bootnodes "enode://92d7f28e8ca3bd1e1fa43959bb1cf37b9d284a81d17bcaee9cf233a773f3da0ce60b2351c3b29b07eb78229e6a84731d36065506f6ad972ed3203c5d18bef313@[127.0.0.1]:30301" --port=30310 console geth --ipcdisable --rpc --rpcport 8107 --datadir "./privatechain/02" --networkid 123 --rpcapi="db,eth,net,web3,personal" --bootnodes "enode://92d7f28e8ca3bd1e1fa43959bb1cf37b9d284a81d17bcaee9cf233a773f3da0ce60b2351c3b29b07eb78229e6a84731d36065506f6ad972ed3203c5d18bef313@[127.0.0.1]:30301" --port=30311 console
之后在其中一个terminal输入`admin.peers`
即可看到如下
Geth版本升级
where geth
之后会显示geth安装路径
然后下载https://geth.ethereum.org/downloads/最新版本后在安装时覆盖原本路径即可。
本文链接地址:https://www.wwsww.cn/ytf/1754.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。