极速搭建以太坊geth私有链

长街暗渡 2月前   阅读数 73 0

1、安装go

下载地址:
	https://golang.org/dl/
解压:
	tar -zxvf xxx.tar.gz
配置环境变量:
	vim /etc/profile
文件最后添加一行:
	export PATH=$PATH:/usr/local/go/bin          
让环境变量生效:
	source /etc/profile         
查看go环境信息:
	go env

2、安装gcc编译器

	yum -y install gcc gcc-c++ kernel-devel

3、安装geth

下载地址(github下载太慢,gitee码云每天同步一次,下载更快):
	https://gitee.com/mirrors/go-ethereum#operating-a-private-network
安装zip解压工具:
	yum install -y unzip
解压geth:
	unzip xxx.zip

4、编译geth

修改go代理,否则会被墙:
	go env -w GOPROXY=https://goproxy.cn
编译:
	make geth     
配置环境变量:
	vim /etc/profile
文件最后添加一行:                                                 
	export PATH=$PATH:/usr/local/go-ethereum/build/bin      
让环境变量生效:
	source /etc/profile 
查看geth版本:
	geth version   

5、编辑genesis.json创世区块头部

创建一个目录:
	mkdir privatechain
新建genesis.json文件:
	cd privatechain
	vi genesis.json
添加以下内容:
{                                                                                                           
  "config": {                                                                                               
        "chainId": 10,                                                                                      
        "homesteadBlock": 0,                                                                                
        "eip150Block": 0,                                                                                   
        "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",                 
        "eip155Block": 0,                                                                                   
        "eip158Block": 0                                                                                    
    },                                                                                                      
  "coinbase"   : "0x0000000000000000000000000000000000000000",                                              
  "difficulty" : "0x00050",                                                                                 
  "extraData"  : "",                                                                                        
  "gasLimit"   : "0xffffffff",                                                                              
  "nonce"      : "0x0000000000000042",                                                                      
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",                      
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",                      
  "timestamp"  : "0x00",                                                                                    
  "alloc"      : {}                                                                                         
}     
降低挖矿难度,官方的为0x20000:
	"difficulty" : "0x00050"
报错:
	eip150Block not enabled, but eip155Block enabled at 0
解决,添加缺了的eip150Block配置:
	"eip150Block": 0,                                                                                   
	"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000"

6、启动私链节点

初始化创世区块:
	geth --datadir chaindata init genesis.json
启动节点:
	geth --datadir chaindata \
	--port 30303 \
	--networkid 1108 \
	--identity "node1" \
	--rpc \
	--rpcport 9545 \
	--rpccorsdomain "*" \
	--allow-insecure-unlock \
	console
成功后可进入命令行交互环境,有信息如下:
	Welcome to the Geth JavaScript console!
交互:
	> eth.accounts     (枚举系统中的账户)	                                                                                         					 
	[]	(目前系统中的账户为空)

7、创建两个外部账户A0、A1

创建外部账户:
	> personal.newAccount()
设置密码,确认密码后,就会生成私钥并保存在keystore目录中了。
创建两个外部账户后,再次查看系统中的账户,可以看到系统中已经存在两个账户地址了:
	> eth.accounts                                                                                              
	["0x910d79ab518252254842f0f223186945e4891f13", "0x2a9792be1f205975992de8dd4e2b18dfc5cb367a"]
根据账户地址查看余额,都为0:
	> eth.getBalance(eth.accounts[0])                                                                           
	0
	> eth.getBalance("0x2a9792be1f205975992de8dd4e2b18dfc5cb367a")                                              
	0

8、挖矿,默认挖矿奖励给本地的第一个账户A0

开始挖矿:
	miner.start()
一分钟后停止挖矿:
	miner.stop()
查询余额,可以看到通过刚才的挖矿工作,获得了55以太币:
	> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')                                                     
	55

9、A0发起交易,转账给A1

发起交易,报错,需要先通过刚才设置的密码解锁账户
	> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(5,'ether')})                                    
WARN [07-09|11:41:36.700] Served eth_sendTransaction               reqid=32 t=3.380321ms  err="authentication needed: password or unlock"
Error: authentication needed: password or unlock
        at web3.js:6347:37(47)
        at web3.js:5081:62(37)
        at <eval>:1:20(16)
解锁:
	> personal.unlockAccount(eth.accounts[0])
再次发起交易:
	> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(5,'ether')})
可以查看交易池的情况,可以看到有一笔交易在等待打包:
	> txpool.status                                                                                             
	{
	  pending: 1,
	  queued: 0
	}
此时查看A1的余额,依然为0,因为还没挖矿打包成功,再次进行挖矿:
	> miner.start()
然后再次查看A1的余额,增加为5,交易成功:
	> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')                                                     
	5

10、连接第二个节点

1、步骤同上1~5,在第2台机器上搭建geth环境。
2、使用一致的genesis.json,初始化创世区块:
	geth --datadir chaindata init genesis.json
3、启动节点2:
	geth --datadir chaindata \
	--port 30304 \
	--networkid 1108 \
	--identity "node2" \
	--rpc \
	--rpcport 9545 \
	--rpccorsdomain "*" \
	--allow-insecure-unlock \
	console
4、查看节点2的encode url:
	> admin.nodeInfo.enode                                                                                      
	"enode://97de4e1b6d5bfce802c5c43500f086724d4311ef873299ebc8125d381679143c646ed82e7c3b779a4587bbc635c35379e986d7930eb1f3819d6e9ea6fa3388f3@127.0.0.1:30304?discport=0"
5、使用节点1连接节点2,注意ip改成节点2的ip,而不是127.0.0.1:
	> admin.addPeer("enode://97de4e1b6d5bfce802c5c43500f086724d4311ef873299ebc8125d381679143c646ed82e7c3b779a4587bbc635c35379e986d7930eb1f3819d6e9ea6fa3388f3@192.168.78.103:30304?discport=0")
6、查看是否连接成功,观察到两个节点的ip互相发现了,说明连接已经成功:
	> admin.peers
	localAddress: "192.168.78.102:39310",
    remoteAddress: "192.168.78.103:30304",
7、查看区块是否正在同步,返回false则表示没在同步,返回以下信息则表示正在同步
	> eth.syncing                                                                                               
	{
	  currentBlock: 0,
	  highestBlock: 6,
	  knownStates: 1,
	  pulledStates: 1,
	  startingBlock: 0
	}
8、节点2同步成功,区块高度与节点1一致:
	> eth.blockNumber                                                                                           
	6

PS:遇到同步失败,只重新初始化一个节点依然无法同步;最后两个节点都重新初始化,再次进行addPeer就成功同步了。

11、使用MetaMash连接私链,进行交易

启动节点时需要指明--rpcaddr 192.168.78.102
并且希望后台运行,启动的完整命令如下:
	nohup geth --datadir chaindata --port 30303 --networkid 1108 --identity "node1" --rpc --rpcaddr 192.168.78.102 --rpcport 9545 --allow-insecure-unlock --rpccorsdomain "*"  > out.log &
不想看到不停的日志输出,可以使用以下命令进入console:
	geth attach ./chaindata/geth.ipc
添加网络,配置如下:

在这里插入图片描述

顺利连接,就可以和私链的账户互相发起交易了:

在这里插入图片描述


注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: