网上关于如何搭建私链的文章很多,但是看来看去都是一样的,千篇一律,想找点不一样,新鲜的知识很难,本文总结归纳那些文章的内容,从使用私链的角度出发写了一篇比较全面的博客,内容包含以下几点:
- windows单节点
- windows多节点
- linux创建节点并,windows远程使用linux节点
- linux节点和Windows节点建立连接(网络原因,提供思路)
1.windows单节点
安装geth
下载地址:https://geth.ethereum.org/downloads/,下载之后是个 .exe文件,然后安装就好了,安装之后把geth的安装目录加入到系统环境变量的path里。验证是否安装成功,打开cmd窗口,输入 geth version 如果出来下面的内容,表示安装好了。(如果不加任何任何参数直接运行 geth
,会自动连接到以太坊公网,此时会开始同步区块)
初始化创世区块
新建个空文件夹,比如
然后在里面创建个first.json文件,文件名随意自己定吧,里面的内容如下:
代码语言:javascript复制{
"config": {
"chainId": 10,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
然后打开cmd窗口,跳转到当前目录下执行命令:
代码语言:javascript复制geth --datadir .nodedata0 init first.json
上面的命令的主体是 geth init,表示初始化区块链,命令可以带有选项和参数,其中–datadir选项后面跟一个目录名,这里为nodedata0,表示指定数据存放目录为 nodedata0, first.json是init命令的参数,就是刚才创建的json文件
出现Successfully表示初始化成功了(把这行命令保存为一个.cmd命令备用),这时候你会发现,你的目录下面自动生成了一个nodedata0的文件夹,目录如下:
其中geth/chaindata中存放的是区块数据,keystore中存放的是账户数据。
启动节点
执行命令:
代码语言:javascript复制geth --rpc --nodiscover --datadir "./nodedata0" --port 30303 --rpcapi "db,eth,net,web3" --rpccorsdomain "*" --networkid 1001 --ipcdisable console 2>>geth.log
参数说明
代码语言:javascript复制--nodiscover 关闭p2p网络的自动发现,需要手动添加节点,这样有利于我们隐藏私有网络
--rpc 启用ipc服务,默认端口号8545
--datadir 区块链数据存储目录
--port 网络监听端口,默认30303
--rpcapi 表示可以通过ipc调用的对象
--rpccorsdomain 指定可以访问APi的domain地址,设置为“*”则任何地址都可以访问,这样做不安全
--networkid 网络标识,私有链取一个大于4的随意的值
console 打开一个可交互的javascript环境
2>>geth.log 把geth中的log信息导入geth.log,也可以不加这个,把信息直接输出在console里,这样直观
更多参数:https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options
http://www.yaozihao.cn/2017/07/07/geth命令选项介绍/
出现javascript console说明节点启动成功了,geth.log文件也生成了
把这启动命令也保存start0.cmd命令,以后再启动这个节点直接双击这个cmd就行了
节点相关基本操作
- 查看账户
这时候是没有账户的
- 创建账户
personal.newAccount()
Passphrase是输入密码,下面的repeat passphrase是重复密码,创建的账户地址是:
0x8b2bd44cec6caedcc0664f965d895a17db326e0a
这是我们会看到nodedata0文件夹下面的keystore下面会多出个文件,就是保存账户信息
再查看账户列表,发现有账户了
如果你记不清楚personal有哪些方法,可以执行personal命令查看一下,其它的eth,miner也一样
- 启动挖矿
miner.start()
看到null,不要慌,因为你的日志信息都保存到了geth.log文件里了,下面这小图标代表啥自己领会哈
挖了半天,到底挖了几个区块了?赚了多少以太币了?看下面的查询余额和查看区块数
另外说明一点,节点挖矿的以太币会自动存入到eth.coinbase账户里,默认是eth.accounts里的第一个,你也可以自己指定coinbase
- 停止挖矿
miner.stop()
- 查看账户余额
eth.getBalance
eth.accounts[0]得到的是账户地址而已,你可能被这么大的数值吓一跳,怎么这么多以太币?一个以太币等于10的18次方个wei,这里的数值是wei的个数,显示以太币的个数,可以用下面的命令,405个以太币,如果是真的,简直不要太爽,以太坊创始人V神以前肯定也在家里这么偷偷的挖了不少
- 查看区块数
eth.blockNumber
81个区块,一个区块奖励5个以太币
- 指定coinbase账户
先创建第二个账户,然后把第二个账户指定为coinbase,修改之前和修改之后已经改变
- 转账
先创建第三个没有币的账户,从账户1转5个比特币到账户3里,有的同学会问,不是有个账户2吗,你怎么不用呢?因为转账发起了交易,然而发起交易仅仅是发起交易,交易要被确认需要打包进区块里,挖矿就是做这个的,挖矿本身的收益会存进coinbase账户里,而现在coinbase账户是账户2,所以不考虑账户2
再查看coinbase账户2的余额,不仅挖矿奖励,连交易费都收了哦
- 退出
exit
验证私链
写了这么多,一顿操作猛如虎,这个私链到底能不能用?
我们用remix验证一样,连接这个私链
账户和余额信息会显示出来,如果你的工具找不到你的私链,请确认启动节点的参数中,有没有设置 –rpccorsdomain “*”
单节点就写到这里,下面是多节点的内容
2.windows多节点
我们在上面已经创建了一个节点了,下面我们直接创建第二个节点,然后连接两个节点,第二个节点的创建要满足下面条件
- 创世区块的信息得一样
就是要用一样的.json配置文件初始化,因为区块链的本质就是所有节点记录的账本都是一样的,所以第一个区块的数据也得一致
- rpcport 和 port参数必须和第一个不同
节点1 启动的命令没有这个参数rpcport,默认的值是8545,我们就用9545吧,port用30306
初始化创世区块
代码语言:javascript复制geth --datadir .nodedata1 init first.json
自动创建了存放节点数据的文件夹nodedata1
启动节点
代码语言:javascript复制geth --rpc --rpcport 9545 --nodiscover --datadir "./nodedata1" --port 30306 --rpcapi "db,eth,net,web3" --rpccorsdomain "*" --networkid 1001 --ipcdisable console
nodiscover,ipcdisable,这两个参数很关键,windows没有ipcdisable参数,第二个节点启动会报错的。nodiscover让节点2不会被节点1自动扫描到。
节点1和节点2建立连接
我们用节点2主动添加节点1,两个节点只要一方主动建立连接就可以了,另一方会自动获得这个连接关系的,效果一样的
先查看节点1的enode信息,作为节点2 admin.addPeer()方法的参数
节点1的console:
节点2的console:
再看节点1的console:
再用remix连接一下我们的节点2吧
windows多个节点的私链就是这样了
3.linux创建节点并和windows节点建立连接
下载文件并上传服务器解压:https://geth.ethereum.org/downloads/
注意你的linux是多少位的就下载多少位的二进制文件,我的是32位的,我就下载32位的
然后把geth复制到/usr/bin目录下面,我们就可以使用geth命令了,geth help,出现下的界面,表示成功。
网上其它的文章都是先安装go语言,再下载geth源码编译安装,最终的效果都是一样的。
然后执行初始化区块的命令:
代码语言:javascript复制geth --datadir nodedata2 init first.json
命令跟在windows差不多,自动生成的nodedata2文件夹也是一样的
启动节点,步骤跟在windous一样
代码语言:javascript复制geth --rpc --rpcport 8545 --rpcaddr 65.49.132.28 --nodiscover --datadir "/root/privatechain/nodedata2" --port 30303 --rpcapi "db,eth,net,web3" --rpccorsdomain "*" --networkid 1001 --ipcdisable console
命令多了一个:
–rpcaddr 65.49.132.28
这个ip是linux服务器的地址,如果我们在windows本地想要访问服务器的私链,这个参数得加上
已经启动,我们可以在命令行窗口执行一些geth的命令
windows电脑上的remix访问一下linux的私链:
一个账户,地址也是一样的,it is working。
额外操作:把启动命令保存为linux可运行文件,方便以后启动:
linux的私链运行成功了,接下来我们让window的节点和linux的节点连接起来(因为网络原因没实现,只有思路)
windows上已经有两个节点了,现在我们的linux要访问这两个节点,所以这两个节点的启动命令得加上–rpcaddr这个参数,但是这部分实现不了了,因为自己电脑连接的是路由器,直接用公网ip 端口号访问不到自己的电脑,要在路由器上做端口映射才能让服务器访问到自己的电脑,我没有路由器的登录权限,所以做不了了(有个什么软件,可以帮自己的电脑生成一个外网ip,有兴趣的朋友可以百度一下,然后继续走下去)
1.端口映射方法:http://service.tp-link.com.cn/detail_article_2441.html
2.节点建立连接方法应该跟windous连接点相连方法是一样的,关键是节点启动的时候加上–rpcaddr参数
3.祝好运!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184606.html原文链接:https://javaforall.cn