美文网首页
打造自己的eth私有链

打造自己的eth私有链

作者: 白昔月 | 来源:发表于2019-01-29 10:46 被阅读0次

前言

Metropolis阶段的eth让人看着揪心,具体的区块高度和分叉高度可以查询https://fork.codetract.io/这个网站。不过通过现在的情况来看,估计eth归零只是时间问题了。本着学习的态度,让我们来最后一次回顾一下eth这个技术吧。

由于eth主网的接入和合约部署还是很消耗rmb的,因此,我们要做的第一件事情就是搭建一个属于自己的私链。本文便是围绕着如何搭建并使用eth私链展开的。

安装与部署

环境

为了打造一个自己的私有链体系,我特地准备了阿里云的高效服务器(每个月大概1300多的租金的那种配置)。如果是要链接到eth主网,那么还需要ssd高效云盘才行(月租金还会更高)。本文只介绍最快速的eth私有链搭建,因此,一切从简。当然,如果是仅仅只是想试试以太坊,也可以在个人电脑上弄,步骤是一样的(本文说的步骤都说基于linux的,win或者mac会有一些小的出入,可以参考https://github.com/ethereum/go-ethereum/wiki提供的各个平台的安装步骤)。

我准备的操作系统是ubuntu,参考的文章是https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu。我没有选择基于编译的方式去安装,我是用的是PPA方案。(当然,以后如果要定制自己的独特服务或者功能,还是需要通过编译的方式进行安装的)

步骤

1.Installing from PPA

PPA = Personal Package Archives for Ubuntu

我们需要执行如下命令,执行命令的行数很长,我就不再此处贴截图了

sudo apt-get update
sudo apt-get upgrade
//以上两项会执行一段时间
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get install ethereum

经过了一小段时间之后,eth所需要的程序都安装完毕了。执行geth -help可以验证是否安装成功。并且,版本也是目前最新的。

执行geth -help命令后的文字内容

上面的图片展示了eth的基础用法、命令、参数等信息。此部分内容会在后边详细叙述。eth安装完成后,接下来就要部署私有链了。

2.准备创世纪区块

此步骤参考了https://github.com/ethereum/go-ethereum网站的相关文字。首先创建一个名为genesis.json的文件(genesis.json这个文件,是eth的作者仿效btc而起的,当然文件的名字您可以任意起,只要程序能找到这个文件就行)

genesis.json的文件内容,我们根据官网提供的文字进行填写,内容如下:

{
  "config": {
        "chainId": 0,
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x20000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}

简单说明一下这个配置文件的内容都是什么意思:

内容 说明
chainId 不同版本的eth的id,比较经典有,1代表主网,2代表普通测试网络,3代表Ropsten测试网络,4代表Rinkeby测试网络,42代表Kovan测试网络(其他的值代表哪些网络,可以参考https://ethereum.stackexchange.com/questions/17051/how-to-select-a-network-id-or-is-there-a-list-of-network-ids/17101#17101),chainId的值要与在geth命令中的--networkid参数保持一致
homesteadBlock Homestead 硬分叉区块高度,填写官网的默认值即可,后续硬分叉时才需要调整
eip155Block EIP 155 硬分叉高度,填写官网的默认值即可,后续硬分叉时才需要调整
eip158Block EIP 158 硬分叉高度,填写官网的默认值即可,后续硬分叉时才需要调整
alloc 预设账号以及账号的以太币数量,私有链挖矿比较容易可以不配置
coinbase 矿工账号
difficulty 难度值,越大越难
extraData 附加信息,以0x开头填写,可以不填,我也选择了不填
gasLimit gas 的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填的很大
nonce 64 位随机数,默认即可
mixhash 与 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash,默认即可。因为是第一个区块,因此,默认就是0了。
parentHash 上一个区块的 hash 值,默认即可。因为是第一个区块,因此,默认就是0了。

3.初始化创世纪区块

上边的步骤将准备工作都做完了,接下来是进行创世纪区块的初始化了(geth init

geth --datadir /privatePeer/bootOf init genesis.json         
//--datadir 指定数据存放的目录
初始化创世纪区块后的内容

4.启动私链节点

启动私链节点其实就是将控制台挂接过去。通过执行一条命令就可以做了,命令上的参数可以通过geth -h来查看。另外,我们需要让geth成为一个后台运行的服务,因此,还要加上nohup命令。

nohup geth 
--nodiscover 
--maxpeers 300 
--identity "yourEthName" 
--rpc --rpccorsdomain "*" --rpcport 8545
--datadir "/home/yourpeer/"
 --port "30303" 
--allow-insecure-unlock
--rpcapi "db,eth,net,web3"
--networkid 123456
--cache 512
--verbosity 4
&

我们来简单说明一下使用到的参数

参数 说明
nohup和& 指定geth启动为后台服务
nodiscover 关闭节点自动发现
maxpeers 最大节点连接数
identity 设置节点名称
rpc组 --rpc --rpccorsdomain "" --rpcport 8545,这是一组参数,rpc端口默认就是8545,访问域如果写的话代表是任何域名都可以访问,也可以指定特殊的域名访问。
datadir geth安装的目录,这个与初始化时候的路径一样即可
port geth节点的端口,默认也是30303
rpcapi 允许rpc接入的方式
networkid 网络id,该值与创世纪区块中的chainId一致即可,否则就会连到别人的服务上去了
cache 调整内存分配 最小16MB,默认128MB
verbosity 日志等级:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3)

nohup geth --nodiscover --maxpeers 300 --identity "privatepeer" --rpc --rpccorsdomain "*" --datadir /home/privatepeer/bootof --port "30303" --allow-insecure-unlock --rpcapi "db,eth,net,web3" --networkid 0 --cache 512 --verbosity 4 &

执行完该命令后,就会生成对应的文件一个是.ipc文件,用于之后挂载控制台的,一个.out文件,这个是默认的日志文件输出

执行启动节点的命令

5.控制台挂载到geth上

因为是后台运行geth,因此,可以通过ipc方式进入控制台

geth attach ipc:/yourPeerDoc/geth.ipc
控制台挂载

6.查看区块的内容

在没有开始挖矿之前,我们只能看到创世纪区块,执行命令eth.getBlock(0)

> eth.getBlock(0)
{
  difficulty: 131072,
  extraData: "0x",
  gasLimit: 3141592,
  gasUsed: 0,
  hash: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x0000000000000000000000000000000000000000",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000042",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 507,
  stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  timestamp: 0,
  totalDifficulty: 131072,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}

虽然创世纪区块是我们自己创建的,但是,通过geth初始化后,还是有些不一样,我们来解释一下这些参数

参数 说明
difficulty 挖矿难度,这里转化为 10 进制,等于”0x2000”,后面区块难度会随着区块高度升高而提高
extraData 当前区块附加信息,若创世区块该值为空,在第二个区块中会保存,创建该私有链时的 geth,go,及操作系统版本,保存信息为第一个挖到该区块的矿工信息,例如:0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
gasLimit 十进制的 gasLimit 值,会随之区块高度提高而提高
gasUsed gas 花费,在以太坊中交易和部署智能合约会消耗 gas,暂时可以理解为以太币
hash 当前区块hash值
logsBloom 保存当前区块日志
miner 挖到该区块的矿工地址,当前尚未分配矿工,因此,无挖矿矿工信息
mixHash 与 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash
nonce 工作量证明的随机数,因为是第一块,这个是由我们人工创建的
number 当前区块高度
parentHash 上一个区块 hash 值
receiptsRoot 块的收益树根结果
sha3Uncles 对叔区块进行 hash 运算的结果
size 区块大小,以字节为单位
stateRoot 块的状态树根结果
timestamp 时间戳
totalDifficulty 达到该区块的难度总数
transactions 以数组的形式保存交易的 tx 值
transactionsRoot 交易的默克尔树根
uncles 以数组表示数区块的哈希

总结

至此,我们就完成了一个相对标准的eth私链的搭建,此处还差了如何加入新节点等文字的说明,此部分内容我会后续更新。关于eth私链的使用,我会再另外一篇文章《使用自己的eth私有链》中进行详细讲解

附录:win下的节点创建

执行创建私链成功 进入控制台 创建账户
nohup geth --nodiscover --maxpeers 300 --identity "privatepeer" --rpc --rpccorsdomain "*" --rpcport 8545 --datadir /home/ubuntu/pp_data --allow-insecure-unlock --port "30303" --rpcapi "db,eth,net,web3" --networkid 8945121267 --cache 512 --verbosity 4 &

关于节点安全

关于端口

一般不应该把默认的8545作为rpc端口,我一般使用8991,ws使用8992

nohup geth --nodiscover --maxpeers 1024 --identity "han" --rpc --rpccorsdomain "" --datadir /home/ubuntu/gethnode --port 30303 --rpcaddr 0.0.0.0 --rpcport 8991 --ws --wsaddr 0.0.0.0 --wsport 8992 --wsorigins "" --allow-insecure-unlock --rpcapi "db,eth,net,web3" --networkid 1 --cache 4096 --verbosity 4 &

geth节点间连接并建立点对点网络的端口30303需要开放。

如果开发rpcport、wasport,不建议在此节点上进行账户管理

一般来说,生产环境应用节点,主要是查询数据、广播交易。账户管理,最好在去中心化钱包中去做。将签名后的交易通过sendRawTransaction 发送到我们搭建的节点上。

当这两个参数的值设为 0.0.0.0 时,将允许来自任何机器的 http 和 web socket 连接。
这个时候如果在自己搭的 geth 节点上创建或导入钱包,并执行 personal.unlockAccount 命令,别人就可以通过开放的 http或 web socket 连接执行 sendTransaction 调用将钱包中的以太币资产转出。

节点加固

SSH Tunnel,通过下面的命令将远程调用限制于本地连接,这里将 rpcaddr 和 wsaddr 参数的值都设为了 127.0.0.1

geth --datadir --cache 4096 data --rpc --rpcport 6666 --rpcaddr 127.0.0.1 --ws --wsaddr 127.0.0.1 --wsport 6667 --wsorigins "*"

其它机器要调用这个节点怎么办呢?可以通过 SSH Tunnel 建立该机器与节点机器间的可信连接。

Basic Auth
可以在节点服务器上搭建 nginx 服务器,配置相应的 basic auth,通过用户名密码来限制对 geth 节点 rpc 服务的调用。

full、fast、ligth

full:从开始到结束,获取区块的header,获取区块的body,从创始块开始校验每一个元素,需要下载所有区块数据信息。速度最慢,但是能获取到所有的历史数据。geth –syncmode full(默认是full)

fast:获取区块的header,获取区块的body,在同步到当前块之前不处理任何事务。下载的数据量较少。然后获得一个快照,此后,像full节点一样进行后面的同步操作。这种方法用得最多,目的在不要在意历史数据,将历史数据按照快照的方式,不逐一验证,沿着区块下载最近数据库中的交易,有可能丢失历史数据。此方法可能会对历史数据有部分丢失,但是不影响今后的使用。geth –syncmode fast

注意:默认情况下full模式,在以太坊源码中,如果本地当前块是number 0 (创始区块),不管指定的哪种模式都默认是 --fast模式,当geth第二次启动的时候,默认情况下full模式同步。
因此很多小伙伴在没有指定同步模式的时候,在同步区块的前期非常快,当再次重启机器或者断掉geth再启动发现更新区块速度非常慢,就是这个原因

handler.go 代码中 新建以太坊子协议管理器func NewProtocolManager()

  // Figure out whether to allow fast sync or not
    if mode == downloader.FastSync && blockchain.CurrentBlock().NumberU64() > 0 {
        log.Warn("Blockchain not empty, fast sync disabled")
        mode = downloader.FullSync
    }
    if mode == downloader.FastSync {
        manager.fastSync = uint32(1)
    }

主网节点

nohup geth --syncmode fast --maxpeers 1024 --rpc --rpccorsdomain "" --datadir /home/ubuntu/datageth --rpcaddr 0.0.0.0 --rpcport 8991 --ws --wsaddr 0.0.0.0 --wsport 8992 --wsorigins "" --allow-insecure-unlock --rpcapi "db,eth,net,web3" --networkid 1 --cache 4096 --verbosity 4 &

–identity:指定节点 ID;
–rpc:表示开启 HTTP-RPC 服务;
–rpcaddr:HTTP-RPC 服务ip地址;
–rpcport:指定 HTTP-RPC 服务监听端口号(默认为 8545);
–datadir:指定区块链数据的存储位置;
–port:指定和其他节点连接所用的端口号(默认为 30303,默认的话,可以不写)
–nodiscover:关闭节点发现机制,防止加入有同样初始配置的陌生节点。这个如果是配置主网的话,请不要打开。

重启干净后需要用geth removedb掉数据

新购买磁盘挂载

1.fdisk -l,查看是否存在未格式化的磁盘,其中vda表示的系统盘,vdb表示的其他磁盘
2.格式化其他磁盘,mkfs.ext3 /dev/vdb
3.创建磁盘挂载点,也就是创建一个新的目录,mkdir /data
4.磁盘挂载,mount /dev/vdb /data/
5.修改fstab,向其中添加分区信息,以便系统启动时自动挂载磁盘,echo '/dev/vdb /data ext3 defaults 0 0' >> /etc/fstab
6.reboot
7.df -h 查看磁盘是否已经挂载

相关文章

网友评论

      本文标题:打造自己的eth私有链

      本文链接:https://www.haomeiwen.com/subject/lgfhvftx.html