文章目录

  • 1. 下载和安装Geth
    • 1.1 下载Geth二进制版本
    • 1.2 安装
  • 2. 搭建私有链
    • 2.1 准备私有链数据存放目录
    • 2.2 准备创世区块
    • 2.3 准备第一个私有链节点
    • 2.4 准备第二个私有链节点
  • 3. 启动一个节点的私有链
    • 3.1 启动节点0
    • 3.2 节点0上创建两个账号
    • 3.3 节点0矿工挖矿
    • 3.4 同节点两账户之间转账
  • 4. 启动两个节点的私有链
    • 4.1 启动节点1
    • 4.2 节点1上创建两个账号
    • 4.3 关联两个节点
    • 4.4 跨节点两账户之间转账

本文使用二级制版本Geth在同一台机器上搭建两个节点的以太坊私有链。操作系统环境 :

  • Windows 10

1. 下载和安装Geth

这里参考官方文档 Installation instructions for Windows

1.1 下载Geth二进制版本

  • 下载来源 官方下载地址
  • 使用当前稳定版本 Geth 版本 : Geth – Elasa (v1.9.6)
  • 具体下载地址
    • Windows AMD64

1.2 安装

  1. 直接运行下载得到的安装程序 geth-windows-amd64-1.9.6-bd059680.exe,按照提示一步一步完成安装;
  2. 打开一个命令行窗口,运行 geth version,看到类似如下输出表明安装成功;:
Geth
Version: 1.9.6-stable
Git Commit: bd05968077f27f7eb083404dd8448157996a8788
Git Commit Date: 20191003
Architecture: amd64
Protocol Versions: [63]
Network Id: 1
Go Version: go1.13
Operating System: windows
GOPATH=
GOROOT=C:\go

2. 搭建私有链

这一节我们会在同一台机器上一步一步搭建一个以太坊私有链,包含两个节点 :

  • 节点0: 使用缺省端口 30303

    • 包含两个账户用于测试
  • 节点1: 使用指定端口 30305
    • 包含两个账户用于测试

2.1 准备私有链数据存放目录

在一个磁盘空间宽裕的位置创建一个目录用于保存我们的私有链数据,这里我使用的目录是 D:\ethereum\privatechain(你可以根据自己的实际情况自己命名目录)。

注意 : 下文中我们简称该目录为privatechain

2.2 准备创世区块

进入目录privatechain,创建json文件genesis.json内容如下 :

{"config": {"chainId": 20191101,"homesteadBlock": 0,"eip155Block": 0,"eip158Block": 0},"alloc"      : {},"coinbase"   : "0x0000000000000000000000000000000000000000","difficulty" : "0x20000","extraData"  : "","gasLimit"   : "0x2fefd8","nonce"      : "0x0000000000000042","mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000","parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000","timestamp"  : "0x00"
}

注意这里的 chainId我指定为20191101

2.3 准备第一个私有链节点

  1. 在目录privatechain下创建目录data0用于保存第一个私有链节点的数据。
  2. 初始化第一个私有链节点。
cd privatechain
geth --datadir data0 init genesis.json

控制台输出如下 :

D:\ethereum\privatechain>geth --datadir data0 init genesis.json
INFO [11-01|10:19:21.875] Maximum peer count                       ETH=50 LES=0 total=50
INFO [11-01|10:19:21.938] Allocated cache and file handles         database=D:\\ethereum\\privatechain\\data0\\geth\\chaindata cache=16.00MiB handles=16
INFO [11-01|10:19:22.009] Writing custom genesis block
INFO [11-01|10:19:22.012] Persisted trie from memory database      nodes=0 size=0.00B time=0s gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [11-01|10:19:22.019] Successfully wrote genesis state         database=chaindata hash=5e1fc7…d790e0
INFO [11-01|10:19:22.024] Allocated cache and file handles         database=D:\\ethereum\\privatechain\\data0\\geth\\lightchaindata cache=16.00MiB handles=16
INFO [11-01|10:19:22.101] Writing custom genesis block
INFO [11-01|10:19:22.106] Persisted trie from memory database      nodes=0 size=0.00B time=0s gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [11-01|10:19:22.118] Successfully wrote genesis state         database=lightchaindata hash=5e1fc7…d790e0

看到控制台输出中的Successfully wrote genesis state表明节点0初始化成功。

现在观察data0目录结构,会发现它已经不再是空目录了,现在它的结构看起来如下所示 :

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

2.4 准备第二个私有链节点

  1. 在目录privatechain下创建目录data1用于保存第一个私有链节点的数据。
  2. 初始化第一个私有链节点。
cd privatechain
geth --datadir data1 init genesis.json

这里需要注意的是节点1和节点0数据的初始化使用了同一个创世区块,其目的是这样它们才能组成同一个私有链。

控制台输出如下 :

INFO [11-01|10:24:38.928] Maximum peer count                       ETH=50 LES=0 total=50
INFO [11-01|10:24:38.993] Allocated cache and file handles         database=D:\\ethereum\\privatechain\\data1\\geth\\chaindata cache=16.00MiB handles=16
INFO [11-01|10:24:39.084] Writing custom genesis block
INFO [11-01|10:24:39.088] Persisted trie from memory database      nodes=0 size=0.00B time=0s gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [11-01|10:24:39.101] Successfully wrote genesis state         database=chaindata hash=5e1fc7…d790e0
INFO [11-01|10:24:39.111] Allocated cache and file handles         database=D:\\ethereum\\privatechain\\data1\\geth\\lightchaindata cache=16.00MiB handles=16
INFO [11-01|10:24:39.194] Writing custom genesis block
INFO [11-01|10:24:39.204] Persisted trie from memory database      nodes=0 size=0.00B time=0s gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [11-01|10:24:39.242] Successfully wrote genesis state         database=lightchaindata hash=5e1fc7…d790e0

同样,看到控制台输出中的Successfully wrote genesis state表明节点1初始化成功。
现在data0目录和data1目录都不再是空目录了,现在其结构如下 :

├─data0
│  ├─geth
│  │  ├─chaindata
│  │  │      000001.log
│  │  │      CURRENT
│  │  │      LOCK
│  │  │      LOG
│  │  │      MANIFEST-000000
│  │  │
│  │  └─lightchaindata
│  │          000001.log
│  │          CURRENT
│  │          LOCK
│  │          LOG
│  │          MANIFEST-000000
│  │
│  └─keystore
└─data1├─geth│  ├─chaindata│  │      000001.log│  │      CURRENT│  │      LOCK│  │      LOG│  │      MANIFEST-000000│  ││  └─lightchaindata│          000001.log│          CURRENT│          LOCK│          LOG│          MANIFEST-000000│└─keystore

现在同一台机器上的两个私有链节点的目录和数据我们已经初始化完成了,现在可以启动私有链了。不过接下来我们要做一些观察和验证,所以两个节点一个一个启动并顺带完成我们的任务 :

  1. 在同一个私有链节点上的两个账户之间转账
  2. 在两个位于不同的私有链节点上账户之间转账

3. 启动一个节点的私有链

本节我们将仅仅启动包含一个节点的私有链,创建两个账户,并在它们之间做转账。

3.1 启动节点0

cd privatechain
geth --datadir data0 --networkid 20191101 console

注意以上参数中:

  • console表明要进入交互式控制台;
  • --datadir data0 表明要启动是节点0;
  • --networkid 20191101表明这个私有网络的网络id是20191101;
    (网络 id 在连接其他节点时会用到,以太坊公网网络 id 为 1,为了避免与公有链网络冲突,私有链节点启动时要指定自己的网络 id)

控制台输出如下:

INFO [11-01|10:35:37.351] Maximum peer count                       ETH=50 LES=0 total=50
INFO [11-01|10:35:37.417] Starting peer-to-peer node               instance=Geth/v1.9.6-stable-bd059680/windows-amd64/go1.13
INFO [11-01|10:35:37.421] Allocated trie memory caches             clean=256.00MiB dirty=256.00MiB
INFO [11-01|10:35:37.425] Allocated cache and file handles         database=D:\\ethereum\\privatechain\\data0\\geth\\chaindata cache=512.00MiB handles=8192
INFO [11-01|10:35:37.743] Opened ancient database                  database=D:\\ethereum\\privatechain\\data0\\geth\\chaindata\\ancient
INFO [11-01|10:35:37.768] Initialised chain configuration          config="{ChainID: 20191101 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: 0 EIP158: 0 Byzantium: <nil> Constantinople: <nil> Petersburg: <nil> Istanbul: <nil> Engine: unknown}"
INFO [11-01|10:35:37.814] Disk storage enabled for ethash caches   dir=D:\\ethereum\\privatechain\\data0\\geth\\ethash count=3
INFO [11-01|10:35:37.839] Disk storage enabled for ethash DAGs     dir=C:\\Users\\andy_\\AppData\\Local\\Ethash count=2
INFO [11-01|10:35:37.862] Initialising Ethereum protocol           versions=[63] network=20191101 dbversion=<nil>
WARN [11-01|10:35:37.873] Upgrade blockchain database version      from=<nil> to=7
INFO [11-01|10:35:37.955] Loaded most recent local header          number=0 hash=5e1fc7…d790e0 td=131072 age=50y6mo3w
INFO [11-01|10:35:37.961] Loaded most recent local full block      number=0 hash=5e1fc7…d790e0 td=131072 age=50y6mo3w
INFO [11-01|10:35:37.967] Loaded most recent local fast block      number=0 hash=5e1fc7…d790e0 td=131072 age=50y6mo3w
INFO [11-01|10:35:37.973] Regenerated local transaction journal    transactions=0 accounts=0
INFO [11-01|10:35:38.016] Allocated fast sync bloom                size=512.00MiB
INFO [11-01|10:35:38.021] Initialized fast sync bloom              items=0 errorrate=0.000 elapsed=0s
INFO [11-01|10:35:38.078] New local node record                    seq=1 id=5f41aa2d19202b7a ip=127.0.0.1 udp=30303 tcp=30303
INFO [11-01|10:35:38.085] Started P2P networking                   self=enode://c05ffa7d768dce4c2b4e3c19ca297b3e567b1f52df2e70e84ba1ffe7dd9673345a88027f266a1277bcc7f30286436dd4f02476246b07cf166040e67b64f8a2ac@127.0.0.1:30303
INFO [11-01|10:35:38.087] IPC endpoint opened                      url=\\\\.\\pipe\\geth.ipc
WARN [11-01|10:35:38.178] Served eth_coinbase                      reqid=3 t=0s err="etherbase must be explicitly specified"
Welcome to the Geth JavaScript console!instance: Geth/v1.9.6-stable-bd059680/windows-amd64/go1.13
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: D:\ethereum\privatechain\data0modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0>

这里我们看到了字样Welcome to the Geth JavaScript console!,这说明节点0启动成功了。此时你可以认为一个以太坊私有链网络也已经启动了,只不过它只包含了一个节点,也就是我们所准备的节点0。

现在我们通过控制台在节点0上做一些观察和验证操作。

Geth JavaScript console控制台提供了如下几种管理对象 :
eth:区块链相关操作
net:查看 P2P 网络状态
admin:管理节点
miner:启动 & 停止挖矿
personal:管理账户
txpool:查看交易内存池
web3:单位换算等

3.2 节点0上创建两个账号

  1. 首先,我们新建的私有链上应该是没有账户的;
    通过如下命令可以验证 :

    > eth.accounts
    []
    
  2. 接下来,我们创建第一个账户;

    > personal.newAccount()
    

    控制台交互输出如下 :

    Password:
    Repeat password:
    INFO [11-01|10:50:25.858] Your new key was generated               address=0x0C5Ae7c2520b1208d579bCF8b2bF624EdD7a025c
    WARN [11-01|10:50:25.862] Please backup your key file!             path=D:\\ethereum\\privatechain\\data0\\keystore\\UTC--2019-11-01T02-50-24.454154200Z--0c5ae7c2520b1208d579bcf8b2bf624edd7a025c
    WARN [11-01|10:50:25.870] Please remember your password!
    "0x0c5ae7c2520b1208d579bcf8b2bf624edd7a025c"
    

    从上面的输出可见,我们创建的账号是 : 0x0c5ae7c2520b1208d579bcf8b2bf624edd7a025c,密钥文件保存在文件D:\\ethereum\\privatechain\\data0\\keystore\\UTC--2019-11-01T02-50-24.454154200Z--0c5ae7c2520b1208d579bcf8b2bf624edd7a025c

    为了方便起见,本文中所创建的以太坊私有链账户的密码统一使用password

    此时再通过eth.accounts查看账户列表,结果输出如下 :

    > eth.accounts
    ["0x0c5ae7c2520b1208d579bcf8b2bf624edd7a025c"]
    
  3. 接下来,我们创建第二个账户;
    这里创建第二个账户,使用的方法跟创建第一个账户是相同的,使用personal.newAccount(),这里不再重复。第二个账号创建完成之后,我们再看账户列表,输出如下 :

    > eth.accounts
    ["0x0c5ae7c2520b1208d579bcf8b2bf624edd7a025c", "0xfb66cc211031fe8ae48acfed7a199d8d9038d978"]
    

这里所创建的第二个账号是0xfb66cc211031fe8ae48acfed7a199d8d9038d978

  1. 接下来,我们查看两个账户的余额;

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

    查询账户余额使用的方法是eth.getBalance()

    很显然,因为是新账户,所以其余额都是 0。要使账户有余额,可以从其他账户转账过来,或者通过挖矿来获取奖励。我们目前是只有一个节点的新建私有链,所有账户都没有余额,所以要想账户中有余额,只能通过挖矿获取奖励。

3.3 节点0矿工挖矿

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

第一次启动挖矿会先生成挖矿所需的 DAG 文件,这个过程有点慢,等进度达到 100% 后,就会开始挖矿,此时控制台会不断输出挖矿信息。该命令控制台输出大致如下 :

> miner.start()
INFO [11-01|11:07:01.068] Updated mining threads                   threads=8
INFO [11-01|11:07:01.071] Transaction pool price threshold updated price=1000000000
INFO [11-01|11:07:01.074] Etherbase automatically configured       address=0x0C5Ae7c2520b1208d579bCF8b2bF624EdD7a025c
null
> INFO [11-01|11:07:01.093] Commit new mining work                   number=1 sealhash=a65bf2…04103e uncles=0 txs=0 gas=0 fees=0 elapsed=13.151ms
INFO [11-01|11:07:02.301] Generating DAG in progress               epoch=0 percentage=0 elapsed=656.222ms
INFO [11-01|11:07:03.041] Generating DAG in progress               epoch=0 percentage=1 elapsed=1.396s
// 这里为了便于阅读,删除了部分 DAG 生成过程的输出 ...
INFO [11-01|11:08:11.552] Generating DAG in progress               epoch=0 percentage=99 elapsed=1m9.906s
INFO [11-01|11:08:11.559] Generated ethash verification cache      epoch=0 elapsed=1m9.913s
INFO [11-01|11:08:27.440] Successfully sealed new block            number=1 sealhash=a65bf2…04103e hash=d2cf12…d3024c elapsed=1m26.359s
INFO [11-01|11:08:27.463] 												

搭建以太坊私有链-单机2节点相关推荐

  1. 区块链开发之搭建以太坊私有链

    (一)区块链开发之搭建以太坊私有链 本文链接:https://blog.csdn.net/rwdxll/article/details/82929417 1.安装ethereum/Go client( ...

  2. 如何搭建以太坊私有链

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 如何搭建以太坊私有链1 今天讲一下如何搭建以太坊私有连,当然了在你阅读这篇文章的时候,最好是有一定基础,比如知道什么是以 ...

  3. 搭建以太坊私有链(PoA)--CentOS7.6 on 阿里云ECS、macOS Catalina on Mac、Ubuntu20.04 on Raspberry Pi 4B

    使用Geth搭建以太坊PoA私有链 搭建以太坊私有链(PoA) 1 阿里云ECS上的操作步骤 1.1 准备环境 1.2 安装Geth及Tools 1.3 创建以太坊私有链的数据文件夹 1.4 用pup ...

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

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

  5. 区块链,使用 Go-Ethereum 搭建以太坊私有链

    1.什么是Ethereum(以太坊) 以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约.开源的底层系统,以太坊从诞生到2017年5月,短短3年半时间,全球已有200多个以太 ...

  6. docker 搭建以太坊私有链搭建

    最近区块链,火得不行,身边也有朋友准备玩这个,说是搭了一个星期,没有把环境搭建起来,叫我帮忙看看环境怎么搭建 于是我找到了官方的地址 https://github.com/ethereum/go-et ...

  7. 本地搭建以太坊私有节点网络

    背景介绍 以太坊开发必须需要节点,虽然已经拥有了测试网的节点,但是我们还是最好搭建一个我们自己的本地节点,对于底层开发就更需要节点了,所以我们最好还是搭建本地节点. 环境需求 VMWare软件 ubu ...

  8. 【手把手】如何在10分钟内搭建一个以太坊私有链?

    在开发以太坊时,很多时候需要搭建一条以太坊私有链,这篇来自作者熊丽兵的文章,手把手教你10分钟内如何在Mac上进行搭建. 作者 | 熊丽兵 整理 | 科科 阅读本文前,你应该对以太坊语言有所了解,如果 ...

  9. 以太坊 私有链搭建 Geth+Mist钱包

    近期在区块链的热潮推动下,我开始研究区块链技术,尤其是智能合约.可编程式的智能合约龙头老大非以太坊莫属了,其他的合约平台如 hyperledger,EOS 相对来说没以太坊成熟,以后陆续在研究.好了, ...

  10. 使用Helm在k8s集群上部署以太坊私有链

    一.概述 二.部署流程 三.问题记录 四.部署检查 五.参考 一.概述 使用k8s官方的包管理工具helm部署以太坊私有链并启动三类节点和一个前端服务: bootnode: used for Geth ...

最新文章

  1. hibernate删除记录_Hibernate记录:常见问题的提示和解决方案
  2. 【python】入门学习(五)
  3. c语言 返回函数是结构体指针变量,一个函数返回值为指向结构体的指针的问题...
  4. win8 必须重新启动计算机才能关闭用户账户控制,windows8中怎么关闭用户账户控制(UAC)仅针对单个用户...
  5. 入门机器学习(十九)--推荐系统(Recommender Systems)
  6. ActiveMQ持久订阅设置
  7. java treemap value排序_【TreeMap】对Map按key和value分别排序
  8. keil5函数 默认返回值_python实用技巧——获取部分返回值的4种方式
  9. python面试自我介绍_如何拿到半数面试公司Offer——我的Python求职之路
  10. 计算机专业知识综合应用题,2015年计算机综合考研及解析之综合应用题(一)...
  11. django+echarts数据可视化(NBA球队数据可视化02)!
  12. 小巷开店问题(答案揭晓)
  13. lightoj1234——调和级数+欧拉常数
  14. 检测本地连接并自动连接宽带连接.cmd
  15. 10月 区块链领域投融资事件
  16. 【重识云原生】第六章容器基础6.4.10.1节——StatefulSet概述
  17. c语言多变量传函,控制系统仿真-中国大学mooc-题库零氪
  18. Java WEB练习
  19. 五子棋-进阶版:C#窗体编写
  20. 2021年ECNU计科考研复试机试 C. 子序列 (尺取)

热门文章

  1. 读《如何找对另一半》后感以及论自己择偶标准
  2. oracle数据库的关于建表的sql语句练习
  3. 湖北文理学院毕业论文(设计)任务书
  4. linux多个网卡丢包,linux系统双网卡绑定及丢包问题
  5. 牛客多校10 Train Wreck (模拟,思维题,优先队列重载小于号的操作)
  6. sparkling-water的介绍与实践(command line)
  7. 使用微信公众号openid获取用户信息判断是否关注公众号
  8. Java图像识别技术:Test4J
  9. amd apu战略_添加内存如何显着提高AMD APU的游戏性能?
  10. js月份的计算公式_js判断某年某月有多少天(闰年计算方法)