基于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,一经查实,立即删除!

相关文章

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…

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…

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

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

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

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

算法入门篇 一 时间复杂度

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

算法入门篇二 认识O(NlogN)的排序

递归 例子引出 使用递归的方法求出数组中的最大值(利用的是栈)求中点的方法改进 mid (left right) / 2 //但是如果left和right的数很大,相加会造成内容溢出 改进为 mid left (right - left) / 2 //(right - left)得到整个的长度&…

算法入门篇三 详解桶排序和整理排序知识 堆的相关操作 补充 不完整

归并排序不使用递归 使用一个变量,使其按照1、2、4、8递增,控制左右两边1个元素、2个元素、4个元素等元素的合并 完全二叉树 完全二叉树 要不全是满的,要不叶子节点出现在最后一层,只要出现了叶子节点,后面的都是叶子…

2023年12月24日学习总结

今日to do list: 做kaggle上面的流量预测项目☠️ 学习时不刷手机🤡 okkkkkkkkkkkkkk 开始👍🍎 0、我在干什么? 我在预测一个名字叫做elborn基站的下行链路流量,用过去29天的数据预测未来10天的数据 1、…

Mac/Linux系统连接远端服务器以及相同IP地址的服务器账号密码重置,ssh失败问题

连接远端服务器 ssh 账号IP地址 输入完成之后会提示输入密码,密码输入正确后,就可以连接成功了 重置ssh密钥 如果连接的服务器除了IP地址没有改变,其余的账号、密码、系统等都变了的话,因为曾经连接过的历史数据会保存到本地&a…

Linux操作系统监视NVIDIA的GPU使用情况

对于GPU相关参数介绍 使用命令周期性查看GPU运行情况最常用的参数是 -n, 后面指定是每多少秒来执行一次命令。监视显存:设置为每 1s 显示一次显存的情况:使用命令ctrlz退出 watch -n 1 nvidia-smi 参数介绍 Fan:显示风扇转速&am…

算法入门篇四 桶排序

桶排序 计数排序(基于统计) 要求数据是有限的,和数据状况有关,比如对于200个人统计他们的年龄分布,这个时候需要申请200个桶,因此对于输入数据的规模有限制,如果输入规模是不定的,…

RTP概述

1.1. RTP是什么 RTP全名是Real-time Transport Protocol(实时传输协议)。它是IETF提出的一个标准,对应的RFC文档为RFC3550(RFC1889为其过期版本)。RFC3550不仅定义了RTP,而且定义了配套的相关协议RTCP&…

算法入门篇五 链表

牛客网 算法入门篇 判断一个链表是否为回文结构 给定一个单链表的头节点head,请判断这个链表是否为回文结构1->2->1,返回为True;1->2->3为False 思路: 1,遍历链表,将所有元素压入栈中,然后再…

实时流媒体编程基于Linux环境开发

一、流媒体简介 随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡。目前在网络上传输音频/视频(Audio/Video,简称A/V)等多媒体文件时,基本上只有…

算法入门篇六 二叉树

牛客网 算法入门篇 左程云老师 个人复习,如果侵全,设为私密 二叉树遍历(递归) 先序遍历(中,左,右) 中序遍历(左,中,右) 后序遍历&a…