在开发以太坊时,很多时候需要搭建一条以太坊私有链,这篇来自作者熊丽兵的文章,手把手教你10分钟内如何在Mac上进行搭建。

作者 | 熊丽兵

整理 | 科科

阅读本文前,你应该对以太坊语言有所了解,如果你还不了解,建议你先看以太坊是什么。

go-ethereum客户端安装

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

brew tap ethereum/ethereum
brew install ethereum

检查是否安装成功

geth --help

如果输出一些帮助提示命令,则说明安装成功。

其他平台可参考Geth 安装

搭建私有链

以太坊支持自定义创世区块,要运行私有链,我们就需要定义自己的创世区块,创世区块信息写在一个json格式的配置文件中。首先将下面的内容保存到一个json文件中,例如genesis.json。

json文件内容如下:

{
 "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"
}

左滑可查看未显示代码部分(下同)

初始化:写入创世区块

准备好创世区块json配置文件后,需要初始化区块链,将上面的创世区块信息写入到区块链中。首先要新建一个目录data0用来存放区块链数据(其实,这个目录data0就相当于一个根节点。当我们基于genesis.json生成根节点后,其他人就可以来连接此根节点,从而能进行交易)。data0目录结构如图所示:

接下来进入privatechain目录中,执行初始化命令:

cd privatechain
geth --datadir data0 init genesis.json

上面的命令的主体是 geth init,表示初始化区块链,命令可以带有选项和参数,其中–datadir选项后面跟一个目录名,这里为 data0,表示指定数据存放目录为 data0, genesis.json是init命令的参数。

运行上面的命令,会读取genesis.json文件,根据其中的内容,将创世区块写入到区块链中。如果看到log信息中含有Successfully wrote genesis state字样,说明初始化成功。

初始化成功后的目录如下:

其中geth/chaindata中存放的是区块数据,keystore中存放的是账户数据。

启动私有链节点

初始化完成后,就有了一条自己的私有链,之后就可以启动自己的私有链节点并做一些操作,在终端中输入以下命令即可启动节点:

geth --datadir data0 --networkid 1108 console

上面命令的主体是geth console,表示启动节点并进入交互式控制台,–datadir选项指定使用data0作为数据目录,–networkid选项后面跟一个数字,这里是1108,表示指定这个私有链的网络id为1108。网络id在连接到其他节点的时候会用到,以太坊公网的网络id是1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络id(上面命令可能会运行失败,我直接重启mac,再进入到privateChain目录中,简单粗暴)。

运行上面的命令后,就启动了区块链节点并进入了Javascript Console:

这是一个交互式的Javascript执行环境,在这里面可以执行Javascript代码,其中>是命令提示符。在这个环境里也内置了一些用来操作以太坊的Javascript对象,可以直接使用这些对象。这些对象主要包括:

eth:包含一些跟操作区块链相关的方法
net:包含以下查看p2p网络状态的方法
admin:包含一些与管理节点相关的方法
miner:包含启动&停止挖矿的一些方法
personal:主要包含一些管理账户的方法
txpool:包含一些查看交易内存池的方法
web3:包含了以上对象,还包含一些单位换算的方法

玩转Javascript Console

进入以太坊Javascript Console后,就可以使用里面的内置对象做一些操作,这些内置对象提供的功能很丰富,比如查看区块和交易、创建账户、挖矿、发送交易、部署智能合约等。接下来介绍几个常用功能,下面的操作中,前面带>的表示在Javascript Console中执行的命令。

创建账户

前面只是搭建了私有链,并没有自己的账户,可以在js console中输入eth.accounts来验证:

> eth.accounts
[]

此时没有账户,接下来使用personal对象来创建一个账户:

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

Passphrase其实就是密码的意思,输入两次密码后,就创建了一个账户。再次执行命令:

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

这时候再去看账户,就有两个了。

> eth.accounts
["0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f", "0x46b24d04105551498587e3c6ce2c3341d5988938"]

账户默认会保存在数据目录的keystore文件夹中。查看目录结构,发现data0/keystore中多了两个文件,这两个文件就对应刚才创建的两个账户,这是json格式的文本文件,可以打开查看,里面存的是私钥经过密码加密后的信息。

json文件中信息格式如下:

{
 "address": "4a3b0216e1644c1bbabda527a6da7fc5d178b58f",
 "crypto": {
   "cipher": "aes-128-ctr",
   "ciphertext": "238d6d48126b762c8f13e84622b1bbb7713f7244c2f24555c99b76396fae8355",
   "cipherparams": {
     "iv": "d0f5a3d3e6c1eeec77bf631bc938725d"
   },
   "kdf": "scrypt",
   "kdfparams": {
     "dklen": 32,
     "n": 262144,
     "p": 1,
     "r": 8,
     "salt": "70dc72c4eb63bea50f7637d9ff85bb53f6ca8ace17f4245feae9c0bc9abaad82"
   },
   "mac": "bd7fc0c937c39f1cbbf1ca654c33b53d7f9c644c6dacfeefe1641d2f3decea04"
 },
 "id": "57803d82-0cd4-4a78-9c29-9f9252fdcf60",
 "version": 3
}

查看账户余额

eth对象提供了查看账户余额的方法:

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

目前两个账户的以太币余额都是0,要使账户有余额,可以从其他账户转账过来,或者通过挖矿来获得以太币奖励。

启动&停止挖矿

通过miner.start()来启动挖矿:

> miner.start(10)

其中start的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。

如果想停止挖矿,并且进度已经达到100%之后,可以在js console中输入

miner.stop():

注意:输入的字符会被挖矿刷屏信息冲掉,没有关系,只要输入完整的miner.stop()之后回车,即可停止挖矿。

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

> eth.coinbase
"0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f"

现在的coinbase是账户0,要想使挖矿奖励进入其他账户,通过miner.setEtherbase()将其他账户设置成coinbase即可:

> miner.setEtherbase(eth.accounts[1])
true
> eth.coinbase
"0x46b24d04105551498587e3c6ce2c3341d5988938"

挖到区块以后,账户0里面应该就有余额了:

> eth.getBalance(eth.accounts[0])
2.31e+21

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

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

发送交易

截止目前,账户一的余额还是0:

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

可以通过发送一笔交易,从账户0转移10个以太币到账户1:

> amount = web3.toWei(10,'ether')
"10000000000000000000"
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
Error: authentication needed: password or unlock
   at web3.js:3143:20
   at web3.js:6347:15
   at web3.js:5081:36
   at <anonymous>:1:1

这里报错了,原因是账户每隔一段时间就会被锁住,要发送交易,必须先解锁账户,由于我们要从账户0发送交易,所以要解锁账户0:

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

输入创建账户时设置的密码,就可以成功解锁账户。然后再发送交易:

> amount = web3.toWei(10,'ether')
"10000000000000000000"
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
INFO [03-07|11:13:11] Submitted transaction                    fullhash=0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6 recipient=0x46B24d04105551498587e3C6CE2c3341d5988938
"0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6"

我们去查看账户1中的余额:

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

发现还没转过去,此时交易已经提交到区块链,但还未被处理,这可以通过查看txpool来验证:

> txpool.status
{
 pending: 1,
 queued: 0
}

其中有一条pending的交易,pending表示已提交但还未被处理的交易。

要使交易被处理,必须要挖矿。这里我们启动挖矿,然后等待挖到一个区块之后就停止挖矿:

> miner.start(1);admin.sleepBlocks(1);miner.stop();

当miner.stop()返回true后,txpool中pending的交易数量应该为0了,说明交易已经被处理了,而账户1应该收到币了:

> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
10

查看交易和区块

eth对象封装了查看交易和区块信息的方法。

查看当前区块总数:

> eth.blockNumber
463

通过区块号查看区块:

> eth.getBlock(66)
{
 difficulty: 135266,
 extraData: "0xd783010802846765746886676f312e31308664617277696e",
 gasLimit: 3350537,
 gasUsed: 0,
 hash: "0x265dfcc0649bf6240812256b2b9b4e3ae48d51fd8e43e25329ac111556eacdc8",
 logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
 miner: "0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f",
 mixHash: "0xaf755722f62cac9b483d3437dbc795f2d3a02e28ec03d39d8ecbb6012906263c",
 nonce: "0x3cd80f6ec5c2f3e9",
 number: 66,
 parentHash: "0x099776a52223b892d13266bb3aec3cc04c455dc797185f0b3300d39f9fc0a8ec",
 receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
 sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
 size: 535,
 stateRoot: "0x0c9feec5a201c8c98618331aecbfd2d4d93da1c6064abd0c41ae649fc08d8d06",
 timestamp: 1520391527,
 totalDifficulty: 8919666,
 transactions: [],
 transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
 uncles: []
}

通过交易hash查看交易:

> eth.getTransaction("0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6")
{
 blockHash: "0x1cb368a27cc23c786ff5cdf7cd4351d48f4c8e8aea2e084a5e9d7c480449c79a",
 blockNumber: 463,
 from: "0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f",
 gas: 90000,
 gasPrice: 18000000000,
 hash: "0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6",
 input: "0x",
 nonce: 0,
 r: "0x31d22686e0d408a16497becf6d47fbfdffe6692d91727e5b7ed3d73ede9e66ea",
 s: "0x7ff7c14a20991e2dfdb813c2237b08a5611c8c8cb3c2dcb03a55ed282ce4d9c3",
 to: "0x46b24d04105551498587e3c6ce2c3341d5988938",
 transactionIndex: 0,
 v: "0x38",
 value: 10000000000000000000
}

看完你也来试试吧!

作者简介:

熊丽兵, 牛娃软件 CTO ,深入浅出区块链learnblockchain.cn博主,区块链大本营特邀专栏作者。擅长Java/Python/JavaScript语言,曾就职于创新工场(点心团队),猎豹移动,参与开发移动应用,如安卓优化大师,清理大师等。昵称Tiny熊, ,区块链大本营特邀专栏作者, 对底层公链,区块链技术落地有深入研究。

本文原始链接:

https://learnblockchain.cn/2018/03/18/create_private_blockchain/#more

最新热文:

  • 去了昨天的以太坊大会,惊喜发现我还有大把的机会!

  • PeckShield CEO 蒋旭宪:智能合约安全问题不可怕,预防和响应机制才是关键

  • 柏链道捷孟岩:区块链应用,最重要的是经济系统设计

  • Vitalik Buterin:Casper 权益证明与分片技术最新进展

  • 以太坊核心开发者Karl Floersch:像黑客帝国那样学习加密经济学!

  • CSDN蒋涛:中国的以太坊开发者热情很高,但只是刚刚入场

扫码加入区块链大本营读者群,群满加微信 17600222208 入群

了解更多区块链技术及应用内容

敬请关注:

【手把手】如何在10分钟内搭建一个以太坊私有链?相关推荐

  1. bootstrap设计登录页面_前端小白如何在10分钟内打造一个爆款Web响应式登录界面?...

    对于前端小白(例如:专注后端代码N年的攻城狮),自己编写一个漂亮的Web登录页面似乎在设计上有些捉襟见肘,不懂UI设计,颜色搭配极度的混乱(主色,辅助色,配色,色彩渐变,动画效果等等,看起来一堆乱七八 ...

  2. 以太坊区块链同步_以太坊69:如何在10分钟内建立完全同步的区块链节点

    以太坊区块链同步 by Lukas Lukac 卢卡斯·卢卡奇(Lukas Lukac) Ethereu M 69:如何在10分钟内建立完全同步的区块链节点 (Ethereum 69: how to ...

  3. 开发平台之美:10分钟内实现一个销售订单功能的增删改查

    IT技术发展了这么多年,早就应该抛弃那些copy&paste的工作了,毫无成就,毫无趣味,毫无好感.这直接催生了一大批快速开发平台的崛起,下面的视频讲述的就是通过一个开发平台如何在10分钟内实 ...

  4. 在Ubuntu下成功搭建以太坊私有链挖矿并转账

    前言 最近老师布置了一个任务,让我学习区块链的知识.刚开始乖乖的拿一本书看概念,有时候看书真的很无聊,我都睡过去好几回了.前几天老师说,你要是感觉看概念太无聊,就先尝试着搭一个以太坊私有链试一试.哇, ...

  5. github创建静态页面_如何在10分钟内使用GitHub Pages创建免费的静态站点

    github创建静态页面 Static sites have become all the rage, and with good reason – they are blazingly fast a ...

  6. es6 ... 添加属性_如何在10分钟内免费将HTTPS添加到您的网站,以及为什么您现在不止需要这样做......

    es6 ... 添加属性 by Ayo Isaiah 通过Ayo Isaiah 如何在10分钟内免费将HTTPS添加到您的网站,以及为什么现在比以往更需要这样做 (How to add HTTPS t ...

  7. javascript创建类_如何在10分钟内使用JavaScript创建费用管理器

    javascript创建类 by Per Harald Borgen 通过Per Harald Borgen 如何在10分钟内使用JavaScript创建费用管理器 (How to create an ...

  8. 机器人坐标系建立_如何在30分钟内建立一个简单的搜索机器人

    机器人坐标系建立 by Quinn Langille 奎因·兰吉尔(Quinn Langille) 如何在30分钟内建立一个简单的搜索机器人 (How to Build A Simple Search ...

  9. 如何在10分钟内开始使用MongoDB

    by Navindu Jayatilake 通过纳文杜·贾亚提莱克 如何在10分钟内开始使用MongoDB (How to get started with MongoDB in 10 minutes ...

最新文章

  1. 21.5. 流量控制
  2. Window环境下配置MySQL 5.6的主从复制、备份恢复
  3. 在jsp页面实现保存登录用户名和密码
  4. 本地启动 SAP Commerce Cloud(Hybris) 产生的五个 Java 进程
  5. SDO_GEOMETRY Object Type
  6. 【POJ - 1703】Find them, Catch them(带权并查集之--种类并查集 权为与父节点关系)
  7. PLECS软件学习使用(一)简单的RLC电路搭建
  8. [HTTP] HTTP消息
  9. word文档被锁定无法编辑的解决方法
  10. Python编程基础03:变量与数据类型
  11. linux换源_Win10子系统(linux)安装及迁移
  12. 计算机科学导论_[计算机科学导论]第一章:计算机学什么
  13. 生成0到9之间的随机整数
  14. 绝地求生测试服画面优化软件,绝地求生大逃杀优化方法 画面优化工具使用教程_3DM单机...
  15. 【论文笔记】Rich feature hierarchies for accurate object detection and semantic segmentation
  16. Qt入门(六)——抽奖系统的实现
  17. 蓄水池采样算法的python实现_蓄水池采样算法-Reservoir Sampling
  18. 探索人群客单价差异的显著性,使用SPSS就能轻松做到
  19. Unity赛车码表原理
  20. WOS搜索输出文件的格式整理

热门文章

  1. tx2 安装 numba
  2. C语言做每点击鼠标一下变量加一,用C语言写一个鼠标连点器!再也不要担心红包抢不过了~...
  3. psutil的使用,获取CPU情况
  4. 马尔可夫奖励过程(MRP)
  5. 唱吧免费导出歌曲mp3和MV
  6. materials about miR-501 Alters Susceptibility to HCC
  7. ICCV2019 全部论文分类汇总(含目标检测 / 图像分割等,1008 更新中)
  8. 华北电力大学微型计算机,华北电力大学学报(自然科学版)
  9. javaEE飞机航班信息查询网站系统
  10. Unity之使用Photon PUN开发多人游戏教程