环境
ubuntu 16.04, 64位
安装环境的过程省略。
geth的全称是Go-ethereum,是一个以太坊客户端,用go语言编写,是目前最常用的客户端。
在home目录下新建一个geth目录(目录都可以自己定义)。然后进入该目录创建创世区块genesis.json文件,然后建一个chain目录,内容如下:
{
"config": {
"chainId": 10,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x4000",
"extraData" : "",
"gasLimit" : "0x8000000",
"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挖矿就很难,这里设置较小难度(还可以试试0x400)
alloc
用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。
coinbase
矿工的账号,随便填
timestamp
设置创世块的时间戳
parentHash
上一个区块的hash值,因为是创世块,所以这个值是0
extraData
附加信息,随便填,可以填你的个性信息
gasLimit
该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。
geth新版本(1.5以上)要求创世区块一定要有”config”{}项啊,不然会报错
初始化创世块,
pony@pony-virtual-machine:~/geth$ sudo geth init ./genesis.json --datadir "./chain"
WARN [12-27|09:45:23] No etherbase set and no accounts found as default
INFO [12-27|09:45:23] Allocated cache and file handles database=/home/pony/geth/geth/chaindata cache=16 handles=16
INFO [12-27|09:45:23] Writing custom genesis block
INFO [12-27|09:45:23] Successfully wrote genesis state database=chaindata hash=ecf271…5269d6
INFO [12-27|09:45:23] Allocated cache and file handles database=/home/pony/geth/geth/lightchaindata cache=16 handles=16
INFO [12-27|09:45:23] Writing custom genesis block
INFO [12-27|09:45:23] Successfully wrote genesis state database=lightchaindata hash=ecf271…5269d6
执行成功后,在chain目录下会新增出两个文件夹geth和keystore,geth中保存的是区块链的相关数据,keystore中保存的是该链条中的用户信息。
除了init命令,geth还支持一下命令:
命令:
account 管理账户
attach 启动交互式JavaScript环境(连接到节点)
bug 上报bug Issues
console 启动交互式JavaScript环境
copydb 从文件夹创建本地链
dump Dump(分析)一个特定的块存储
dumpconfig 显示配置值
export 导出区块链到文件
import 导入一个区块链文件
init 启动并初始化一个新的创世纪块
js 执行指定的JavaScript文件(多个)
license 显示许可信息
makecache 生成ethash验证缓存(用于测试)
makedag 生成ethash 挖矿DAG(用于测试)
monitor 监控和可视化节点指标
removedb 删除区块链和状态数据库
version 打印版本号
wallet 管理Ethereum预售钱包
help,h 显示一个命令或帮助一个命令列表
好,接着说正题,启动日志上提示我们没有默认账号,一会在新建。
启动控制台
pony@pony-virtual-machine:~/ethereum$ sudo geth --datadir "./chain" --networkid 15 --nodiscover --maxpeers 0 console
WARN [01-02|17:03:01] No etherbase set and no accounts found as default
INFO [01-02|17:03:01] Starting peer-to-peer node instance=Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9
INFO [01-02|17:03:01] Allocated cache and file handles database=/home/pony/ethereum/chain/geth/chaindata cache=128 handles=1024
WARN [01-02|17:03:01] Upgrading database to use lookup entries
INFO [01-02|17:03:01] Database deduplication successful deduped=0
INFO [01-02|17:03:01] Initialised chain configuration config="{ChainID: 10 Homestead: 0 DAO: DAOSupport: false EIP150: EIP155: 0 EIP158: 0 Byzantium: Engine: unknown}"
INFO [01-02|17:03:01] Disk storage enabled for ethash caches dir=/home/pony/ethereum/chain/geth/ethash count=3
INFO [01-02|17:03:01] Disk storage enabled for ethash DAGs dir=/home/pony/.ethash count=2
INFO [01-02|17:03:01] Initialising Ethereum protocol versions="[63 62]" network=15
INFO [01-02|17:03:01] Loaded most recent local header number=0 hash=4b7556…13cf12 td=16384
INFO [01-02|17:03:01] Loaded most recent local full block number=0 hash=4b7556…13cf12 td=16384
INFO [01-02|17:03:01] Loaded most recent local fast block number=0 hash=4b7556…13cf12 td=16384
INFO [01-02|17:03:01] Regenerated local transaction journal transactions=0 accounts=0
INFO [01-02|17:03:01] Starting P2P networking
INFO [01-02|17:03:03] UDP listener up self=enode://a8c6eeda2bd1327548e367f4f6a5cf1df3e91e4a341e9a543a74d69e28a4a2ea4c4d0708bdeb6bd2bcef228ec0e3aa3b5a926e2801db503193b1eca4032908a5@[::]:30303
INFO [01-02|17:03:03] RLPx listener up self=enode://a8c6eeda2bd1327548e367f4f6a5cf1df3e91e4a341e9a543a74d69e28a4a2ea4c4d0708bdeb6bd2bcef228ec0e3aa3b5a926e2801db503193b1eca4032908a5@[::]:30303
INFO [01-02|17:03:03] IPC endpoint opened: /home/pony/ethereum/chain/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
>
如果觉得日志显示比较乱,可以把日志重定向输出到文件中,命令改成如下即可:
sudo geth --datadir "./chain" --networkid 15 --nodiscover --maxpeers 0 console 2>>geth.log
启动后,会发现30303端口启动监听了。这里也可以用–port指定其它端口,因为后面mist连接私有链启动的时候用的也是30303,避免端口冲突。
另外,这个端口一定要记得,比方说你重启环境后,要确保
另外从启动信息可以看出,启动后会用到两个磁盘位置:
INFO [02-19|21:06:47] Disk storage enabled for ethash caches dir=/home/pony/ethereum/chain/geth/ethash count=3
INFO [02-19|21:06:47] Disk storage enabled for ethash DAGs dir=/home/pony/.ethash count=2
回头我们重新测试的时候就知道该删除那些目录了。(删除.ethash目录和chain目录下的所有文件)
试试几个命令:
创建一个账号,
> personal.newAccount()
Passphrase:
Repeat passphrase:
"0xdec60d1eaf07362e011d83a4fde88da1ed5eaf7d"
查看当前账号列表
> eth.accounts
["0xdec60d1eaf07362e011d83a4fde88da1ed5eaf7d"]
查询余额,发现是0,正常,因为还没有挖矿。
> eth.getBalance(eth.accounts[0])
0
挖矿,在公有链上,矿工打包平均需要15秒,在私有链上,我们需要自己来做这件事情:
> miner.start()
INFO [01-02|17:04:11] Updated mining threads threads=0
INFO [01-02|17:04:11] Transaction pool price threshold updated price=18000000000
null
> INFO [01-02|17:04:11] Starting mining operation
INFO [01-02|17:04:11] Commit new mining work number=1 txs=0 uncles=0 elapsed=207.311µs
INFO [01-02|17:04:15] Generating DAG in progress epoch=0 percentage=0 elapsed=3.441s
INFO [01-02|17:04:19] Generating DAG in progress epoch=0 percentage=1 elapsed=6.753s
INFO [01-02|17:04:22] Generating DAG in progress epoch=0 percentage=2 elapsed=10.141s
INFO [01-02|17:04:25] Generating DAG in progress epoch=0 percentage=3 elapsed=13.458s
INFO [01-02|17:04:29] Generating DAG in progress epoch=0 percentage=4 elapsed=16.849s
INFO [01-02|17:04:32] Generating DAG in progress epoch=0 percentage=5 elapsed=20.200s
这个percenage=100,也就是100%以后.,就差不多完成了,接下来提示:
INFO [01-02|17:10:03] Generated ethash verification cache epoch=0 elapsed=5m50.965s
INFO [01-02|17:10:10] Successfully sealed new block number=1 hash=6b8e7a…58bbf0
INFO [01-02|17:10:10] ? mined potential block number=1 hash=6b8e7a…58bbf0
INFO [01-02|17:10:10] Commit new mining work number=2 txs=0 uncles=0 elapsed=146.575µs
INFO [01-02|17:10:10] Successfully sealed new block number=2 hash=a04334…c62f5c
INFO [01-02|17:10:10] ? mined potential block number=2 hash=a04334…c62f5c
INFO [01-02|17:10:10] Commit new mining work number=3 txs=0 uncles=0 elapsed=108.343µs
有小锤子的标识。回车输入miner.stop()可以停止挖矿,挖矿挖到的ether币会默认保在第一个账户中,即eth.acccounts[0]中。,然后查询余额:
> eth.getBalance(eth.accounts[0])
95000000000000000000
OK,私有链创建成功。输入exit可以退出控制台。
强调几个注意点:
在挖矿的过程中我们也看到磁盘空间不断的增加,主要都在home目录下的.ethash目录下
挖矿是执行智能合约的基础。如果停止挖矿的话,不仅以太币会停止生成,所有智能合约的调用也会不起作用