要求:
在Ubuntu平台搭建以太坊私有链,并进行挖矿
1、安装go语言环境
(1)下载Linux下go的安装包
wget https://studygolang.com/dl/golang/go1.10.3.linux-amd64.tar.gz
(2)下载完后,进入到下载目录,将其解压到 /usr/local 文件夹下
sudo tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz
在HOME下创建文件夹go
(3)配置环境变量
使用sudo vi ~/.bashrc命令编辑bashrc文件。
将以下命令放入到bashrc文件中
export G0ROOT=/usr/1ocal/go export GOBIN=$GOROOT/bin export GOPATH=$HOME/go export PATH=$PATH:$GOBIN
使得环境变量生效
此时go语言环境已经安装完成,输入go version查看安装成功
安装geth环境
依次输入以下代码
sudo apt-get update sudo apt-get install software-properties-common sudo add-apt-repository -y ppa:ethereum/ethereum sudo add-apt-repository -y ppa:ethereum/ethereum-dev sudo apt-get update sudo apt-get install ethereum
输入geth -h检查以下版本,说明geth客户端安装成功!
2、安装以太坊客户端Ethereum
(1)新建一个文件夹,例如mydata,用来保存私有链的数据。创建一个初始化的创世块文件genesis.json
然后将如下的配置信息写入到创世块文件genesis.json中
{ "nonce": "0x0000000000000042", "difficulty": "0x40000", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0xffffffff", "alloc": { "3282791d6fd713f1e94f4bfd565eaa78b3a0599d": { "balance": "1337000000000000000000" }, "17961d633bcf20a7b029a7d94b7df4da2ec5427f": { "balance": "229427000000000000000" } }, "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 } }
保存退出
(2)初始化创世区块,并指定数据存放路径
这里我用的老师给的创世区块发现是错误的。
这里我将创世区块换成以下内容:
{
"config": {
"chainId": 666,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"ethash": {}
},
"nonce": "0x0",
"timestamp": "0x5ddf8f3e",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x00002",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": { },
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
编辑genesis.json保存并退出
现在正式开始初始化创世区块,并指定数据存放路径,这里放在我们刚刚建的文件夹mydata下
(3)启动私有链节点,并将日志输入到mychain.log
geth --networkid 3 --datadir mydata --identity "mychain" --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpcapi "admin,debug,eth,miner,net,personal,shh,txpool,web3" --port 30303 --rpccorsdomain "*" --nodiscover console 2>>mychain.log
以太坊私有链环境已经搭好,接下在进行简单测试。
首先这里说一下,其实我这是第二次挖矿了,第一次开始挖矿都会返回null,其实是因为节点版本问题。 所以接下来我重新启动私有链节点,在启动geth命令行的时候需要添加这两个参数:
geth --datadir "./ethdev" --nodiscover console 2>>get.log --dev --dev. period 1 #添加--dev 参数,启动的时候便产生了一个账户,并且已经挖矿有余额。
4、测试
(1)创建新账户
创建新用户之前查看当前账户
这里是因为我们添加-dev参数后就会自动添加一个账户,并且这个账户是有挖矿余额的。
接下来开始创建我们需要挖矿的账户
personal.newAccount("xixi1") #这里的xixi1是账户的密码
创建成功将返回账户的地址
(2)查找已创建的账户
> eth.accounts
> personal.listAccounts #两者都可以查询到已经创建的账户
(3)查询账户余额
eth.getBalance("账户地址")
这里查找我创建的第一个账户的余额,引号内输入密码为xixi1对应的账户地址0xc0fac76bfe99f3e68cdd630bd02e180560b6c7ba。
可以看到显示的是0,是因为我们还没有开始挖矿,所以没有余额。
#这里我将第一个用户设置成user1,第二个用户设置成user2,以便于后面好操作,不然老是去输入用户的地址很麻烦。
接下来直接可查询user1和user2账户余额
(4)开始挖矿
在挖矿前,先设置挖矿奖励地址(如果不设置的话默认奖励地址为第一个用户)
miner.setEtherbase(eth.accounts[0]) #这里的0是指的第一个账户,那么第二个账户就是1
可以看到显示true,说明第二个账户存在。
再查询一下奖励的地址
eth.coinbase
可以看到正是我们第二个账户。
设置成功后,我们就开始挖矿,调大虚拟机内存,我这里设置的是4g。
其实在这之前我每次开始挖矿都会返回null,其实是因为节点版本问题。在启动geth命令行的时候需要添加这两个参数。
在dev环境下验证发现,当执行miner.start()时,返回null。但其实miner已经执行,只不过它在等待你发送交易之后才会生成新的区块。也就是说执行了miner.start(),它一直在等待,这是发送一笔交易,再查看区块高度发现已经增加一块。
虽然miner.start 还是返回null,但是 eth.blockNumber 却增长了,因此说明可以挖矿了。
(5)转移以太币
目的:将0.01以太币从 user1 转移到user2 转移数量为0.01以太币
amount = web3.toWei(0.01) #首先需要设置转移的以太币数量amount
eth.sendTransaction({from:user1,to:user2,value:amount}) #将0.01以太币从 user1 转移到user2 转移数量为0.01以太币
现在查询user2的余额,发现不是0了!
注意:如果这里查询到user2还是没有余额,就说明没有进行挖矿操作,以致于交易未成功。需要miner.start()开始挖矿,再查询下区块高度即可。挖矿之后就会有余额啦。
再次转移,可以看到user2余额发生变化