最简单快捷搭建私链步骤笔记
以太坊框架搭建网上已经有很多,我不在啰嗦,我主要说下我搭建过程中踩过的坑及全程解析。1.安装docker,最好的虚拟机封装容器,没有之一。2.下载以太镜像docker pull ethereum/client-go:alltools-latest注意下载alltools版本 否则你同步主网以太了。3.docker images 查看镜像 docker run -it client-...
以太坊框架搭建网上已经有很多,我不在啰嗦,我主要说下我搭建过程中踩过的坑及全程解析。
1.安装docker,最好的虚拟机封装容器,没有之一。
2.下载以太镜像 docker pull ethereum/client-go:alltools-latest 注意下载alltools版本 否则你同步主网以太了。
3.docker images 查看镜像
docker run -itd -p 8545:8545 -p 30303:30303 -v /home/mychain:/mychain ethereum/client-go:alltools-latest 后台运行镜像容器被和映射本地端口到容器并挂载主机目录到容器目录,注意要绝对路径。
docker ps 查看正在运行的容器 docker stop <nameid> 停止 和 开启容器 docker start <nameid>
4.docker exec -it <nameid> /bin/sh 进入容器 nameid为正在运行的容器ID
3.新建文件夹 /mychain/data0 不启动geth控制台的情况下即可创建新账户 geth --datadir data0 account new
5.拷贝新建创世区块文件 genesis.json 也可其他名 创世区块加入前面新建的账号输入alloc里就是预挖矿了。注意chainid设置大一点,这个相当于网络身份证,不能相同。还有每个geth version 版本 创世区块格式有一定区别,创建创世区块 geth --datadir data0 init genesis.json
最新版本1.9的创世区块格式如下:
{
"config": {
"chainId":11555,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"ethash": {}
},
"nonce": "0x0",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x00002",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"0x06bbc9f61c5a13d9eef514f957db5cc3bde74dab": {
"balance": "0xad78ebc5ac6200000"
},
"0xeb4c530dedb493ff5483b85b086f320041838087": {
"balance": "0xad78ebc5ac6200000"
}
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
初始化命令 | 作用 |
---|---|
mixhash | 与nonce配合用于挖矿,由上一个区块的一部分生成的hash。 |
nonce | nonce就是一个64位随机数,用于挖矿。 |
difficulty |
设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度 正常1分钟产出4个区块的难度值大约在区间 [0x4ccca0 ~ 0x4cccc8] |
alloc | 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。 |
coinbase | 矿工的账号,随便填 |
timestamp | 设置创世块的时间戳 |
parentHash | 上一个区块的hash值,因为是创世块,所以这个值是0 |
extraData | 附加信息,随便填,可以填你的个性信息 |
gasLimit | 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。 |
6.如果创建创世区块失败,说明这个目录刚才创建过了,清空data0/geth/chaindata/下文件 rm -rf * 因为刚才建账号启动过了,删除区块内容,不删keystore账号就ok. 或者运行命令:geth --datadir data0 removedb.
7.启动节点 geth --datadir data0 --networkid 11555 --nodiscover console 最好networkid和创世区块chainid同号
8.开启RPC服务
admin.startRPC("0.0.0.0", 8545, "*", "eth,net,web3,admin,personal")
geth --syncmode=full --identity "TestNode0" --rpc --rpcaddr "0.0.0.0" --rpcport "8545" --rpccorsdomain "*" --rpcvhosts "*" --port "30303" --nodiscover --rpcapi "db,eth,net,web3,miner,net,personal,net,txpool,admin,debug" --networkid 1900 --datadir "./testchain" --nat "any" --mine --minerthreads "1" --allow-insecure-unlock
如果不加console参数连接节点进入命令:geth attach http://localhost:8545
在Windows下转账时,需要先解锁账户。新版本的Geth出于安全考虑,默认禁止了HTTP通道解锁账户,要解决此问题,可在启动参数中增加 --allow-insecure-unlock
这样我们就可以用钱包(例如:metamask)连接私链了,也可以在启动节点的时候,命令添加相关参数直接打开服务
初始化命令 | 作用 |
---|---|
identity | 区块链的标示,随便填写,用于标示目前网络的名字 |
init | 指定创世块文件的位置,并创建初始块 |
datadir | 设置当前区块链网络数据存放的位置 |
rpc |
启动rpc通信,可以进行智能合约的部署和调试 --rpcaddr 外连开放host 默认localhost 或本机IP 无限制0.0.0.0 |
rpcport |
HTTP-RPC服务器监听端口(default: 8545) --port为 节点互连端口不能相同 |
rpcapi | 设置允许连接的rpc的客户端,默认只有eth,net,web3 |
networkid | 设置当前区块链的网络ID,用于区分不同的网络,是一个数字 |
console |
启动命令行模式,可以在Geth中执行命令 --nodiscover 不被其他链发现参数 |
rpccorsdomain |
指定一个可以接收请求来源的以逗号间隔的域名列表(浏览器访问的话,要强制指定该选项) --rpcvhosts "*" 指定允许域名访问RPC. |
9.挖矿,每一笔交易都要有挖矿,所以miner.start(5) 至少一个节点必须运行。 5代表线程
第一次启动挖矿会先生成挖矿所需的DAG文件.(存放在用户目录下ethash文件夹并隐藏.Ethash是PoW系统,它需要一个大约1GB的数据集,它就是DAG。这通常需要30分钟生成,所以我们倾向于在硬盘中存储它。希望将DAG存储在硬盘中的客户端应符合下面的规范,以便与其他客户端共享缓存:存储位置,DAG应该存储在一个1GB的转储文件中,存储在一个文件中:
Mac / Linux中 $(HOME)/.ethash/full-R<REVISION>-<SEEDHASH>
windows: $(HOME)/Appdata/Local/Ethash/full-R<REVISION>-<SEEDHASH>
其中:<REVISION>是一个十进制整数;<SEEDHASH> 是16个小写十六进制数字,指定了纪元的种子散列的前8个字节.这个目录中可能有多个这样的DAG文件,取决于用户是否及时删除了那些过时的)这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。然后停止挖矿,miner.stop(),退出重新启动节点,在运行miner.start(5).这里如果更改了创世区块的难度,如果不删除ethash文件夹,还是按原来的难度挖矿,需要删除ethash文件夹才可重新生成DAG文件并调整你设置的难度,一定要先停止geth。
10.部署多个节点,先启动一个节点,注意私有链的节点networkid必须一致,admin.nodeInfo.enode:获取节点实例的encode url
GETH 控制台命令参考:https://www.jianshu.com/p/9fa31e4cdf4d
11.同样方法部署初始化第二个节点:创世区块一定要一样,–datadir, –identity –rpcport –port 这些参数每个节点要配置不同的参数。
geth --datadir data1 init genesis.json
geth --datadir data1 --networkid 11555 --rpcport 8546 --port 33305 --nodiscover console
添加第一个节点信息 admin.addPeer(encodeUrlOfFirst instance)
addPeer()的参数就是节点二的enode信息,注意要把enode中的[::]替换成节点二的IP地址。连接成功后,节点二就会开始同步节点一的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块,向任意一个节点发送交易,另一个节点也会收到该笔交易。
通过admin.peers可以查看连接到的其他节点信息,通过net.peerCount可以查看已连接到的节点数量。
连接过程中有几点需要注意:
(1)两节点要加入同一条私链,即这两个节点初始化的创世区块必须要一模一样。启动节点的时候要使用同样的networkid。也注意节点间是互通的。包括防火墙之类的问题要注意,如果端口被封肯定是无法连接上的。如果租用云服务器,要查看安全组里面相应的端口(rpc端口例如8545,节点互连端口例如30303)是否已经开放。
(2)A节点在添加B节点的enode字符串时需要手动将enode字符串中的ip地址设为B节点的IP地址。
(3)加入同一个私链之后,区块信息会完全同步,所有交易也是知道的。但是不同节点创建的账户,是互相看不到的。不过,他们的余额可以查到,转账交易也没有任何问题。
注意坑:如果非正常关闭 geth 进程,比如机器强制重启或掉电的时候,数据将会返回到上次正常退出的区块高度,后面区块将会丢失,这个目前还没有特别好的解决办法,如果有其他节点,重新同步区块即可,如果只有一个节点,后面区块将彻底丢失,所以每天定时正常退出一次再重新进入一次可以保存最新区块,还有 多布置几个节点,这样如果一个节点非法关闭,可以通过同步其他节点数据 完成同步,如果有其他节点,无法同步时可以通过下面的命令移除区块链数据并从新同步数据,这里注意下启动参数要保持一致性。 geth removedb --datadir data0 .
更多推荐
所有评论(0)