基于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访问可以通过**\.\pipe\geth.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot 添加server.servlet.context-path

Springboot 2.0变革后的配置区别 1、springboot 2.0之前,配置为 server.context-path 2、springboot 2.0之后,配置为 server.servlet.context-path

vs2015 支持Android arm neon Introducing Visual Studio’s Emulator for Android

visual studio 2015支持Android开发了。 Microsoft released Visual Studio 2015 Preview this week and with it you now have options for Android development. When choosing one of those Android development options, Visual Studio will also install the brand new Vi…

基于linux环境采用update-alternatives 方式进行python版本切换

采用update-alternatives 切换版本 update-alternatives是Debian提供的一个工具,通过链接的方式,但是其切换的过程非常方便。首先看一下update-alternatives的帮助信息: $ update-alternatives --help 用法:update-alternatives …

FFmpeg示例程序合集-批量编译脚本

此前做了一系列有关FFmpeg的示例程序,组成了《 最简单的FFmpeg示例程序合集》,其中包含了如下项目:simplest ffmpeg player: 最简单的基于FFmpeg的视频播放器simplest ffmpeg audio player: 最简单的基于FFmpeg的音频…

基于Ubuntu环境使用docker搭建对于中文识别的chineseocr_lite项目

光学字符识别(OCR) 光学字符识别(OCR)目前已经有了很广泛的应用,很多开源项目都会嵌入OCR 来扩展原有的能力,例如身份证识别、出入停车场的车牌识别、拍照翻译等等本文介绍的开源的中文 OCR 项目&#xff…

Ubuntu环境使用conda安装轻量级中文ocr开源项目chineseocr_lite,最简单的方式

问题 接使用docker的方式来创建项目所报的错误选中文件之后,界面不停的绕圈,显示不了对于图片的识别结果,并且监控界面上出现错误提示如下ImportError: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory&a…

基于Ubuntu使用docker的方式来搭建基于Yolo3+crnn的Chineseocr识别

Docker Docker简单易用,具体的安装和配置可以看我的或者其他人的博客 安装完之后,输入以下命令安装chineseocr并且开启服务 docker pull zergmk2/chineseocr docker run -d -p 8080:8080 zergmk2/chineseocr 在浏览器输入http://127.0.0.1:8080/ocr网…

c/c++ 内存使用指南 和实践指导

如果你完全理解如下内容, 请联系我:szu030606163.com, 讨论更深层次合作 。 1. 大内高手—内存模型 单线程模型 多线程模型 2. 大内高手—栈/堆 backtrace的实现 alloca的实现 可变参数的实现。 malloc/free系列函数简介 new…

mininet 应用实践

教学目的与学时建议 能够运用 mininet 可视化工具创建计算机网络拓扑结构能够运用 mininet 交互界面创建拓扑结构能够运用 python 脚本构建计算机网络拓扑结构建议:2 学时 实验环境 下载并安装虚拟机 VMware workstation;下载虚拟机镜像( S…

使用百度大脑,导入aip以及相应的库文件报错问题

参考文章 github链接地址 具体操作 pip install githttps://github.com/Baidu-AIP/python-sdk.gitmasterfrom aip import 对应服务即可

一个通用的makefile写法,自动推导文件的依赖关系

温习之用。 假设有两个头文件目录 header1,header2;两个cpp文件目录,src1,src2,一个lib目录 写一个完整的makefile步骤如下: 1 定义可执行文件的名称 TARGET MyPro 2 指定此编译工程所要使用的头文件所在的目录 INC -I. -Iheader1 -Iheader2 3 指…

实现基于darknet框架实现CTPN版本自然场景文字检测 与CNN+CTCOCR文字识别的ChineseOCR搭建

Github地址 Github源码地址 支持系统:mac/ubuntu python3.6 实现功能 文字检测; 文字识别; 支持GPU/CPU,CPU优化(opencv dnn) docker镜像服务(CPU优化版本) 下载镜像 链接:https://pan.baidu…

50个c/c++源代码网站

C/C是最主要的编程语言。这里列出了50名优秀网站和网页清单,这些网站提供c/c源代码。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C源代码的网站。这不是一个完整的清单,您有建议可以联系我,我将欢迎您的建议&#xff…

在服务器上搭建基于yolo3 与crnn 实现中文自然场景文字检测及识别,GPU版本

Github地址 参考地址作者大人,十分热心,对于我的问题,提供了大量的帮助,使我少走了很多的弯路,在此表示由衷的感谢 注意事项 使用nvidia-smi命令查看cuda的版本,必须是10.1或者10.0,10.2是万万…

python TypeError can only concatenate tuple not str to tuple

原因分析 这个错误出现是因为执行元组之间的合并例子 tuple1 ("str",1,["a","b","c"],4) tuple2 ("hello",) print(tuple1[0]) print (tuple1[1:3]) print (tuple1[1:]) print (tuple2 * 2) print (tuple1tuple2) 注意事…

23种设计模式 -比喻

1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory (下载源码就到源码网:…

python 版本2和3 在/取模方面的的差异

注意事项 python2 使用 /python3 使用 // 例子 二分法取数值 def binary_search(search_list,target):left 0right len(search_list) - 1while left < right:mid (left right) // 2if search_list[mid] < target:left mid 1continueif search_list[mid] target:r…

vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess

三个SDK函数: WinExec&#xff0c;ShellExecute &#xff0c;CreateProcess可以实现调用其他程序的要求&#xff0c;其中以WinExec最为简单&#xff0c;ShellExecute比WinExec灵活一些&#xff0c;CreateProcess最为复杂。WinExec 两个参数&#xff0c;前一个指定路径&#xf…

算法入门篇 一 时间复杂度

时间复杂度 要求&#xff1a;只要高阶项&#xff0c;不要低阶项常数操作&#xff1a;操作花费的时间和数据量无关&#xff0c;比如数组寻址&#xff0c;直接利用偏移量找到对应元素的位置&#xff1b;非常数操作&#xff1a;比如list(链表)&#xff1b;查找元素需要遍历链表&a…

遍历文件夹下所有文件和文件夹

1 void find(char * lpPath){char szFind[MAX_PATH];WIN32_FIND_DATA FindFileData;strcpy(szFind,lpPath);strcat(szFind,"*.*");HANDLEhFind::FindFirstFile(szFind,&FindFileData);if(INVALID_HANDLE_VALUE hFind)  return;while(TRUE){if(FindFileData.dw…