基于Mac环境搭建以太坊私有区块链进行挖矿模拟 - Go语言中文社区

基于Mac环境搭建以太坊私有区块链进行挖矿模拟


第一步:相关软件的安装

  • go-ethereum客户端安装
  • Go-ethereum客户端通常被称为Geth,它是个命令行界面,执行在Go上实现的完整以太坊节点。Geth得益于Go语言的多平台特性,支持在多个平台上使用(比如Windows、Linux、Mac)。Geth是以太坊协议的具体落地实现,通过Geth,你可以实现以太坊的各种功能,如账户的新建编辑删除,开启挖矿,ether币的转移,智能合约的部署和执行等等。

Geth可以使用下面三种JSON RPC协议进行连接:

  • 内部进程通信(IPC):内部通讯,通常用于一台电脑内。
  • 远程程序调用(RCP):跨计算机的通讯。通常使用TCP和HTTP协议。
  • WS(Web sockets):使用sockets连接Geth。

chain ID含义:

  • chain ID:1 主网公链
  • chain ID:2 Morden网络(仅对部分人开放)
  • chain ID:3 Ropsten网络
  • chain ID:4 Rinkeby网络
  • chain ID 大于4的是私有网络
  • 使用Geth --testnet连接到Ropsten网络,Geth --rinkeby连接到Rinkeby网络。

安装:

brew tap ethereum/ethereum
brew install ethereum
  • 也可以使用源码安装的方式
  • 以太坊github地址
  • 首先从github上下载以太坊的go-ethereum压缩包,zip,或者单纯使用命令行代码,代码如下
git clone https://github.com/ethereum/go-ethereum.git
  •  如果是zip格式的需要解压再执行命令,如果使用命令行,直接执行命令
cd go-ethereum
make geth

如果有问题 

  • cd到以太坊到目录里面后,make geth出现错误,vi env.sh 查看文件属性,按下esc,同时按shift和:,输入冒号之后,输入set ff,显示文件的编码格式,如果是dos,则是支持windows的,不支持linux
  • 需要将其改为支持linux的系统格式,输入set ff=unix,保存退出
  • 再次运行,make geth

默认安装地址

/usr/local/Cellar/ethereum/版本

我的显示界面

  • 检查是否安装成功,输入如下的命令
geth --help
  •  出现如下的界面,即为安装成功

  • 使用命令查看 版本号以及相关信息
geth version

 

第二步:搭建私有链

  • 以太坊支持自定义创世区块,要运行私有链,我们就需要定义自己的创世区块,创世区块信息写在一个json格式的配置文件中。首先将下面的内容保存到一个json文件中,一般以genesis.json进行命名。
  • 前提操作命令如下
mkdir myeth
cd myeth
vi genesis.json
  • json文件内容如下:直接复制即可。
{
  "config": {
        "chainId": 666999, 
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x20000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}
  • 对于上面参数的解释

  • 注意事项,我参考好多文章都缺失eip150Block:0这一句,这会出现错误。
  • 报错情况为Failed to wirte genesis block:unsupported ordering

网络初始化

  • 输入geth init命令、genesis.json文件、存储区块数据和keystore的文件夹,进行初始化。
geth init "/Users/chy/Desktop/myeth/genesis.json" --datadir "/Users/chy/Desktop/myeth/chaindata"
  • 创世区块已经产生了,Geth节点可以启动了。Geth启动时默认使用IPC协议,为了确保Geth节点可以通过PRC协议访问,命令中需要带上RPC参数 
  • 命令操作如下

 搭建节点运行的环境

geth --datadir "/Users/chy/Desktop/myeth/chaindata" --rpc --rpcapi "eth,web3,miner,admin,personal,net" --rpccorsdomain "*" --nodiscover --networkid 666999 –allow-insecure-unlock
  • 对于命令的讲解
  • –datadir:指定区块链数据的存储位置;这个需要大家根据实际的情况进行调整,进行自己路径的替换
  • –rpc:表示开启 HTTP-RPC 服务;
  • –rpcapi “eth,web3,miner,admin,personal,net” :这个命令指示了允许通过RPC访问的命令。默认情况下,Geth允许web3。
  • –nodiscover:关闭节点发现机制,防止加入有同样初始配置的陌生节点;
  • –identity:指定节点 ID,方便在一大群节点中识别出自己的节点;
  • –rpcport:指定 HTTP-RPC 服务监听端口号(默认为 8545);
  • –rpcaddr:指定IP地址;
  • –port:指定和其他节点连接所用的端口号(默认为 30303);
  • –maxpeers 0 如果你不想有人连上你的测试链,就用maxpeers 0。或者,你可以调整参数,当你确切的知道有几个节点要连接上来的时候。
  • 使用不使用命令–allow-insecure-unlock在解锁的时候就会报错Error: account unlock with HTTP access is forbidden,原来是出于安全考虑,默认禁止了HTTP通道解锁账户,相关问题参考
  • 执行完上面的命令又发现报错Fatal: Error starting protocol stack: datadir already used by another process这个问题是因为,需要强制关闭正在运行的geth进程。 命令如下:54148为geth进程的ID号
  • 再次加上参数–allow-insecure-unlock,重新启动私有链。现在执行解锁账户命令即可成功了。

  • geth相关命令

geth --datadir "/Users/chy/Desktop/myeth/chaindata" --rpc --rpcapi "eth,web3,miner,admin,personal,net" --rpccorsdomain "*" --nodiscover --networkid 666999 --allow-insecure-unlock
ps aux | grep "geth"
kill -9 54148
  • enode的信息是节点在网络上的身份标志。如果其他节点准备加入这个网络中,就需要提供自己的enode值。RPC访问可以通过http://127.0.0.1:8545或http://localhost:8545,IPC访问可以通过**.pipegeth.ipc**命令。命令是以服务的形式持续运行的,需要再打开一个命令行窗口但是原先的窗口不可以关闭。输入命令如下:

geth attach rpc:http://localhost:8545
  • 也可以在启动的时候,加入console,启动一个端口(简单的例子)
  • 或者是第二次启动时候,输入如下命令
  • 注意,这里 . 代表当前的文件夹,也就是上文指定的"/Users/chy/Desktop/myeth/chaindata",否则相关命令无法操作,虽然不报错,但是得不到预期的结果。
geth --datadir . --networkid 666999 console
  • 可以将输出的Info信息重定向到 output.log 文件里面,2是指Linux里面的shell,output.log会存储到当前的文件夹
geth --datadir . --networkid 666999 console 2>output.log
  • 使用命令,如下所示,时时跟踪输出日志的变化 
tail -f output.log
  • 注意:如果gath的版本较低,那么重新启动区块链的时候,数据丢失 
  • 出现如下页面,进入控制页面。使用IPC协议连接到节点上,这样即可执行其他命令。

交互式执行环境

  • 这是一个交互式的 JavaScript 执行环境,在这里面可以执行 JavaScript 代码,其中 > 是命令提示符。在这个环境里也内置了一些用来操作以太坊的 JavaScript 对象,可以直接使用这些对象。这些对象主要包括:
  • eth:包含一些跟操作区块链相关的方法;
  • net:包含一些查看p2p网络状态的方法;
  • admin:包含一些与管理节点相关的方法;
  • miner:包含启动和停止挖矿的一些方法;
  • personal:主要包含一些管理账户的方法;
  • txpool:包含一些查看交易内存池的方法;
  • web3:包含了以上对象,还包含一些单位换算的方法。

常用命令:

  • personal.newAccount():创建账户;
  • personal.unlockAccount():解锁账户;
  • eth.accounts:枚举系统中的账户;
  • eth.getBalance():查看账户余额,返回值的单位是 Wei(Wei 是以太坊中最小货币面额单位,类似比特币中的聪,1 ether = 10^18 Wei);
  • eth.blockNumber:列出区块总数;
  • eth.getTransaction():获取交易;
  • eth.getBlock():获取区块;
  • miner.start():开始挖矿;
  • miner.stop():停止挖矿;
  • web3.fromWei():Wei 换算成以太币;
  • web3.toWei():以太币换算成 Wei;
  • txpool.status:交易池中的状态;
  • admin.addPeer():连接到其他节点;

第三步:设置账户

  • 连接到Geth节点后,接下来需要设置coinbase或etherbase账户。创建账户可以使用personal对象的newAccout方法,并设置密码(密码不可见)。命令如下。
personal.newAccount()
  • 如果需要更改原有的coinbase账户地址,可以通过address.miner对象的setEtherBase函数进行操作。这个操作将使用新的账户替换原有的coinbase账户。命令如下
miner.setEtherbase("0x19b4029dad20824db6dc201437f9cac2a7e1fc5c")
  • 执行查询命令,可看到设置的地址已经生效了。此时挖矿可以启动了。由于只有一个矿工,将获得全部的挖矿奖励,coinbase账户的以太币会逐步增加。
eth.coinbase
  • 同样方法再创建一个账户
  • 查看当前的用户
eth.accounts
  • 代码执行如下

第四步:开始挖矿

  • start中的参数代表了用于挖矿的线程数量。命令如下
miner.start(8)
  • 这时切换到之前创建私有链的命令行窗口中,可以看到挖矿过程的输出结果。这里是指我们当时创建的第一个窗口。

  • 如果是第一次挖矿,需要生成DAG相关文件,这个需要花费一定的时间。第二次以后就不需要了。

  • 因为我是第二次挖矿,所以没有上面文件。

  • 当使用输入日志的方式时,可以输入命令tail -f geth.log 来跟踪挖矿进度
  • 查看正在挖矿的账户0已经获得的以太币和未挖矿的账户1的以太币余额。查看钱包的余额命令如下,将0改为1即可查看第二个账户的余额。
eth.getBalance(eth.accounts[0])
  • 执行情况如下:


 

  • 挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做coinbase,默认情况下coinbase是本地账户中的第一个账户。

  • getBalance()返回值的单位是wei,wei是以太币的最小单位,1个以太币=10的18次方个wei。要查看有多少个以太币,可以用web3.fromWei()将返回值换算成以太币

  • 停止挖矿,命令如下

miner.stop()
  • 整体操作布局,左边动态监视用户的输入,右边窗口为以太坊 Javascript Console。页面布局如下

第五步:进行交易

  • 我们要从账户0到账户1转账,需要先解锁账户才能转账,否则会报错。
  • 解锁命令如下
personal.unlockAccount(eth.accounts[0])
  • 发起交易,由账户0转账200以太币到账户1,命令如下
personal.unlockAccount(eth.accounts[0])
amount = web3.toWei(200,'ether')
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
  • 此时交易已经提交到区块链,返回了交易的hash,但还未被处理,本地交易池中有一个待确认的交易,可以使用 eth.getBlock(“pending”, true).transactions 查看当前待确认交易。
eth.getBlock("pending", true).transactions
  • 要使交易被处理,必须要挖矿。这里我们启动挖矿,然后等待挖到一个区块之后就停止挖矿。命令如下:

miner.start(1);admin.sleepBlocks(1);miner.stop();
web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
  • 此时,交易已经生效,账户1应该已经收到了200个以太币了。

参考文档

给自己的小提示

  • account[0]的密码是123456
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/CHYabc123456hh/article/details/105588927
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-18 04:10:58
  • 阅读 ( 2640 )
  • 分类:区块链

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢