【以太坊系列-001】基于以太坊的私有链环境搭建-以及搭建过程的问题记录

本文是基于virtalbox的ubuntu1804(ubuntu-18.04.1-server-amd64,不要使用live-server安装)的虚拟机环境,配置是1核2GB内存(建议内存越多越好)。

本文基于网上的文档,加上自己安装部署过程遇到的问题,进行了整理。

安装geth

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

# geth version
WARN [10-26|17:42:12.025] Sanitizing cache to Go's GC limits       provided=1024 updated=664
Geth
Version: 1.8.17-stable
Git Commit: 8bbe72075e4e16442c4e28d999edee12e294329e
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.10.1
Operating System: linux
GOPATH=
GOROOT=/usr/lib/go-1.10
# solc --version
solc, the solidity compiler commandline interface
Version: 0.4.25+commit.59dbf8f1.Linux.g++

第一部分 简单操作

Step 1: 建立目录和genesis.json

在命令行模式创建一个目录,例如geths ,这里geths目录命名任意。

命令:mkdir geths

然后在ubuntu目录下会出现一个geths文件夹。

继续进入到该文件夹目录下,创建一个文件,genesis.json, 文件名也可以任意。

genesis.json 文件内容:

(注意版本太早的复制进去,运行会出错,可以适当更改内容)

# mkdir -p /home/data
# cd /home/data
# cat genesis.json
{

  "nonce": "0x0000000000000042",
  "difficulty": "0x020000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "timestamp": "0x00",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
  "gasLimit": "0xffffffff",
  "config": {"chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0},
  "alloc": { }
}

如果上述的难道太大,导致无法生成区块,可以降低难度

"difficulty" : "0x400", 

Step 2: 执行命令,创建创世区块

切换回命令行,执行命令,制造创世区块

进入到geths 目录下,执行命令

# geth --datadir data init genesis.json

此时当前geths目录下面会新增出两个文件夹geth和keystore

geth中保存的是区块链的相关数据

keystore中保存的是该链条中的用户信息

Step 3:创建自己的私有链条

# geth --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover console >>geth.log

注意这里输出打印日志到log文件中

Step 4:在自己的私有链条上创建用户

输入命令eth.accounts, 我们会发现返回值为[],这是因为此时虽然以太坊的私有链已经被创造出来,但还没有任何账户。

输入命令personal.newAccount("test001"),该命令将创造一个新的用户,该用户的密码是xxx. 当然用户也可以将test001改为123,或者123456,或者任意密码

再次输入命令 eth.accounts, 我们会发现一个新的用户被创建了出来,这就代表我们已经创建了一个账户,重personal.newAccount() & eth.accounts 我们可以创建若干个账户出来

Step 5: 最重要的一步来了,开始挖矿

在命令行中执行命令 miner.start(), 开始在我们的区块链上进行挖矿

一直等到100%。这个以太坊私有链就会正式启动,并持续不断的生成出以太坊来。

注意点:

1. 挖矿挖到的ether币会默认保在第一个账户中,即eth.acccounts[0]中。

2. 挖矿是执行智能合约的基础。如果停止挖矿的话,不仅以太币会停止生成,所有智能合约的调用也会不起作用。

3. 如果真的要停止挖矿,可以执行命令miner.stop()来停止挖矿

4. 按上面的命令,应该是可以实现以太坊挖矿的。如果不行的话,有可能就是之前有存在的链,此时应该删除之前的数据。即删除~/.ethash文件夹和里面的文件即可。

5. 通常有人出现miner.start()返回null,,并且没有信息刷屏,就停留在null,, 原因回到step 3 你将输出结果打印到日志log,所以无法显示,exit 退出, 重新运行geth --datadir "./" --nodiscover console 即可。

Step6: 挖矿启动后,查看主账户的以太币数量

acc0 = eth.accounts[0]

eth.getBalance(acc0)

结果只要不为0,那就说明挖矿成功!

退出挖矿:miner.stop()

退出当前geth ,执行:exit

重新运行geth, 直接进入到step 3, 不需要执行前两步了。

第二部分 操作遇到的问题以及一些简单命令

1、一直无法产生区块

可以使用以下新的创世区块,来降低挖矿难度,然后全部重新初始化,最好新搞环境,以免数据残留

cat genesis.json
{ 
    "config": {
            "chainId": 22, 
            "homesteadBlock": 0, 
            "eip155Block": 0, 
            "eip158Block": 0 
    },
    "alloc" : {},
    "coinbase" : "0x0000000000000000000000000000000000000000", 
    "difficulty" : "0x400", 
    "extraData" : "", 
    "gasLimit" : "0x2fefd8", 
    "nonce" : "0x0000000000000038", 
    "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 
    "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 
    "timestamp" : "0x00" 
}

重新初始化创世块

# mkdir -p /home/data
# cd /home/data
# geth --datadir data init genesis.json

2、及时修改了难度也挖不到矿,换条geth启动命令

# 可以尝试使用以下命令进行挖矿
# --dev 表示自动创建一个账户并直接开始挖矿(当前没用),--dev.period 1表示不用等有交易了才挖,如果设成0的话没有交易挖矿就是null
# geth --identity "TestNode" --rpc --rpcport "8545" --datadir data --port "30303" --rpccorsdomain "*" --dev.period 1 --nodiscover

提示信息有个 /home/data/data/geth.ipc:
INFO [11-16|09:04:20.745] IPC endpoint opened                      url=/home/data/data/geth.ipc
INFO [11-16|09:04:20.880] HTTP endpoint opened                     url=http://127.0.0.1:8545    cors=* vhosts=localhost

使用geth attach 连接到geth客户端(--datadir /home/data/data)
# geth attach --datadir /home/data/data

3、常用操作

1)创建账户
personal.newAccount("lyh001")
personal.newAccount("lyh002") 
2) 获取余额
eth.getBalance(eth.accounts[0])
eth.getBalance(eth.accounts[1])
3) 数值转换
web3.fromWei(eth.getBalance(eth.coinbase), "ether")
web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")
4) 开始挖矿
miner.start(1)
5) 停止挖矿
miner.stop()
6) 只挖一个矿,就停止
miner.start(1);admin.sleepBlocks(1);miner.stop();

4、转账

1)解锁
personal.unlockAccount(eth.accounts[0], "lyh001", 300)
2)转账
eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, "ether")})
3)查看余额不变
web3.fromWei(eth.getBalance(eth.coinbase), "ether")
web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
4)查看未确认交易
此时如果没有挖矿,用 txpool.status 命令可以看到本地交易池中有一个待确认的交易,
可以使用 eth.getBlock("pending", true).transactions查看当前待确认交易。
eth.getBlock("pending", true).transactions
5)启动矿工:
miner.start(1)
6)直到
Mined stale block
7)查看变化
web3.fromWei(eth.getBalance(eth.coinbase), "ether")
web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
8)指定挖矿账户
挖到一个区块会奖励以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做 coinbase,
默认情况下 coinbase 是本地账户中的第一个账户,可以通过 miner.setEtherbase() 将其他账户设置成 coinbase。

5、查看区块信息

5.1) 查看当前区块总数:
> eth.blockNumber
4

5.2) 通过区块号查看区块

 > eth.getBlock(4)

【以太坊系列-001】基于以太坊的私有链环境搭建-以及搭建过程的问题记录_第1张图片

5.3)查看交易信息

> eth.getTransaction("0xe784696d88186ee6d6b2d89665a776d1467f16f813b68a267379ee823efcea48")

【以太坊系列-001】基于以太坊的私有链环境搭建-以及搭建过程的问题记录_第2张图片

5.4)部署合约出现 exceeds block gas limit undefined

这是由于创世块中gasLimit设置过小,可以重新设置gasLimit

"gasLimit" : "0xffffffff", 

https://www.jianshu.com/p/f030338a0c31

 

参考:

https://blog.csdn.net/xiabing082/article/details/77197607?utm_source=blogxgwz3

https://blog.csdn.net/qq_35753140/article/details/79463735

你可能感兴趣的:(区块链)