博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
以太坊本地开发环境搭建
阅读量:5973 次
发布时间:2019-06-19

本文共 5699 字,大约阅读时间需要 18 分钟。

本文所搭建的环境是在 Mac 上的开发环境,其他操作系统上与此非常相似,依然有参考价值。

作为一枚区块链开发工程师,本地的开发环境是必不可少的。我们首先看看需要哪些工具:

这些工具的安装在官方文档上都有非常详细的讲解,这边就不多赘述了。

目录结构

下文中的文件均已该目录为当前路径。

先新建好如下初始目录,

.├── data└── genesis.json
  • genesis.json:初始化私有链的配置文件。
  • data:存放区块链数据的目录。

配置文件

以太坊支持自定义创世区块,要运行私有链那么就必须定义自己的创世区块。创世区块的信息就写在 genesis.json 中,内容如下:

{  "config": {    "chainId": 15,    "homesteadBlock": 0,    "eip155Block": 0,    "eip158Block": 0  },  "alloc": {},  "nonce": "0x0000000000000042",  "difficulty": "0x020000",  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",  "coinbase": "0x0000000000000000000000000000000000000000",  "timestamp": "0x00",  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",  "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",  "gasLimit": "0x4c4b40"}

大概解释下其中的几个参数:

  • alloc:用来预设置账号以及账号的 ether 数量。因为私有链挖矿比较容易,所以我们不需要预设置账号。比如,{"0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a":{"balance":"100000000000000000000000000000"}}
  • nonce:一个64位随机数,用于挖矿。
  • mixhash:和 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash。
  • difficulty:设置当前区块的难度,如果难度过大,cpu挖矿就很难,所以这边设置的很小,不要跟自己过不去嘛。
  • coinbase:默认挖矿的矿工账号。
  • timestamp:设置创世块的时间戳。
  • parentHash:上一个区块的hash值,因为是创世块,所以值是0。
  • extraData:附加信息,随便填。
  • gasLimit:设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和。因为我们是私有链,所以可以写的大一些,方便开发测试。

初始化

接下来我们就需要将创世区块的初始信息写入区块链中,使用 geth init 命令。

# geth --datadir "./data" --networkid 31415926 --rpc --rpccorsdomain "*" init ./genesis.json

大致会输出如下信息:

INFO [03-12|19:36:02] Allocated cache and file handlesINFO [03-12|19:36:02] Writing custom genesis blockINFO [03-12|19:36:02] Persisted trie from memory databaseINFO [03-12|19:36:02] Successfully wrote genesis state

此时的目录结构就变成如下:

.├── data│  ├── geth│  │  ├── chaindata│  │  │  ├── 000001.log│  │  │  ├── CURRENT│  │  │  ├── LOCK│  │  │  ├── LOG│  │  │  └── MANIFEST-000000│  │  └── lightchaindata│  │      ├── 000001.log│  │      ├── CURRENT│  │      ├── LOCK│  │      ├── LOG│  │      └── MANIFEST-000000│  └── keystore└── genesis.json

其中 keystore 目录用来保存账户信息,geth 目录用来保存区块信息。

启动

让我们接下来启动私有链吧!

# geth --datadir data --networkid 31415926 --rpc --rpccorsdomain "*" --nodiscover console

输出如下即表示成功进入 geth 的控制台:

Welcome to the Geth JavaScript console!instance: Geth/v1.8.2-stable/darwin-amd64/go1.10 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0>

创建账户

先别急着去挖矿,我们得先创建一个账户,不然挖出的 ether 塞哪里去呢!

ether 也就是我们说的以太币(ETH)。

先来看看是否已存在账户了,

> eth.accounts[]

那我们新建两个(用于后面账户间的转账演示),

> personal.newAccount()Passphrase:Repeat passphrase:"0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a"> personal.newAccount()Passphrase:Repeat passphrase:"0x29a079bdbc6d4d122178fbe01558e5df2d008523"

现在我们就有两个账户了,

> eth.accounts["0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a", "0x29a079bdbc6d4d122178fbe01558e5df2d008523"]

多说一句,我们此时去看看 keystore 目录,多出了两个文件,也就是我们刚才创建的两个账户密钥(丢了它,你就等于丢了币)

.├── UTC--2018-03-12T11-46-09.722094891Z--880004bb64282fb01a3a2500ddf1f4bb5ad4b64a└── UTC--2018-03-12T11-48-04.771328116Z--29a079bdbc6d4d122178fbe01558e5df2d008523

这时候让我们看看账户里有没有 ether,

> eth.getBalance(eth.accounts[0])0

挖矿

一开始大家的账户里都没有 ether,那么都需要通过挖矿来获取。使用 miner.start() 命令开启挖矿,默认挖出的 ether 是存到 eth.coinbase 账户中的,也就是第一个账户。

> eth.coinbaseINFO [03-12|19:55:13] Etherbase automatically configured       address=0x880004Bb64282fb01A3A2500DDF1F4bB5AD4b64A"0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a"

如果我们想要把挖到的矿存入其他账户,可以这样:

> miner.setEtherbase(eth.accounts[1])true

好了,我们开始挖吧~

> miner.start(1)> INFO [03-12|20:00:44] Commit new mining work                   number=1 txs=0 uncles=0 elapsed=513.188µsINFO [03-12|20:00:47] Generating DAG in progress               epoch=0 percentage=0 elapsed=1.668sINFO [03-12|20:00:49] Generating DAG in progress               epoch=0 percentage=1 elapsed=3.368s

等到 percentage 达到100就能挖出来了,请耐心等待~

INFO [03-12|20:04:15] Successfully sealed new block            number=4 hash=81db99…4db568INFO [03-12|20:04:15] ? mined potential block                  number=4 hash=81db99…4db568

出现小锤头的时候意味着你挖到了!

那么我们先暂停挖矿,

> miner.stop()true

然后看看账户余额,

> eth.getBalance(eth.accounts[0])85000000000000000000

不要被这个零的个数吓到,这里默认显示的以 wei 为单位的,而 1 ether = 10^18 wei,所以我们转换一下单位立马就清晰了,

> web3.fromWei(eth.getBalance(eth.accounts[0]), 'ether')85

嗯,其实我们目前就挖了 85 个 ether~

转账

既然手头有了钱,分点给好朋友吧!

记得在转账前把自己解锁,类比银行卡转账,你得先输入密码才能转账。

> personal.unlockAccount(eth.accounts[0])Unlock account 0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64aPassphrase:true

我决定转给好朋友 8 个 ether!

> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(8,'ether')})INFO [03-12|20:24:15] Submitted transaction                    fullhash=0x996a3037b75585415ece5b1dc28181833691760176b3f24066c93e7093a967e5 recipient=0x29a079BdbC6D4d122178FBe01558E5DF2D008523"0x996a3037b75585415ece5b1dc28181833691760176b3f24066c93e7093a967e5"

我们可以看到目前只是向区块链提交了这笔转账交易,谁来执行这笔交易呢?矿工

我们还是得开启挖矿模式,把这笔转账交易执行掉。然后我们再来看看好朋友的账户里面有多少 ether 了,

> eth.getBalance(eth.accounts[1])8000000000000000000

以太坊钱包

遥想当初第一次安装以太坊钱包的时候,为了下载以太坊主网络的全节点数据,整整下了5天,然后卡在最后几个区块死活动不了,最后弃疗。。。

这段磨人的经历想想都心塞,不过后来用了 Ethfans 的星火节点计划,导入了超级节点,peers 一下子增多,下载确实快多了。说回正题,这次我们需要让 Ethereum Wallet 连上我们的私有链,然后利用钱包的 UI 界面快速开发部署智能合约。

/Applications/Ethereum\ Wallet.app/Contents/MacOS/Ethereum\ Wallet --rpc "/path/to/data/geth.ipc"

注意这里的 --ipc 参数值是刚才项目里面 data 目录下的 geth.ipc,就是让钱包连接上本地的私有链。

异常情况

挖矿异常

如果出现 miner.start() 直接返回 null 的情况,请先查看是否还未创建过账户。

如果之前有搭建过本地私有链,那么请先将之前的 .ethash 目录删除,该目录在当前登录用户的家目录下。

总结

笔者一开始是选择最简单的开发流程去实践的:下载官方的 Ethereum Wallet 然后同步主网全节点,然后开发合约并部署。但是下载全节点的经历实在是不想回想,没日没夜同步了好几天还没同步全(离当前最新区块总是差那么几块同步不了,当然后来是解决了)。后来请教技术群友告知了我可以使用 Remix + MetaMask 这种轻量级开发流程,确实方便很多,调试开发用基于浏览器的 Remix IDE,部署合约用基于浏览器插件的 MetaMask。

但是有时候 Remix 加载很慢,而且这个解决方案没网络就不行了(大部分都有 WIFI 可以连,但是有的时候真的是没网络。。。)私有链挺好的解决了上述两个困扰我的问题,而且在搭建和使用私有链的过程,就是一次比较完整的区块链体验~

欢迎关注公众号:『比特扣』,与我一起探索区块链的世界。

转载地址:http://zydox.baihongyu.com/

你可能感兴趣的文章
8支团队正在努力构建下一代Ethereum
查看>>
Shell脚本常用命令
查看>>
教程 | pandas轻松入门 之 数据结构介绍 1
查看>>
一篇文章能够看懂基础源代码之JAVA篇
查看>>
什么是大数据技术架构
查看>>
【分享】如何救援記憶卡中誤刪的資料
查看>>
教你回收站里面的东西删除了怎么恢复的技巧
查看>>
4个方面彻底说清JS的深拷贝/浅拷贝
查看>>
北方计算机专修学院“展示自我 秀出风采” 网页创意设计大赛成功举办
查看>>
DNS解析相关实验:7台主机的恩怨情仇
查看>>
Goldengate双向复制配置
查看>>
Oracle官方内部MAA教程
查看>>
DNS相关配置
查看>>
Nginx-location配置
查看>>
code::block
查看>>
扫描线
查看>>
设计模式--模板方法(Template Method)
查看>>
引入CSS的方式有哪些?link和@import的有何区别应如何选择【转载】
查看>>
MariaDB 和 MySQL 性能测试比较
查看>>
软件工程的实践项目课程的自我目标
查看>>